From 1967621cc9498a4d775a8a9eaabbcb7a52be8316 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 25 Jan 2023 10:03:53 -0500 Subject: [PATCH 001/177] Reduce architecture detection in CMake. This follows up on https://boringssl-review.googlesource.com/c/boringssl/+/55626, to make the CMake build rely on the C preprocessor, rather than CMake. While not as disasterous as pre-@platforms Bazel, CMake's build-level platform selection is not ideal: - CMAKE_SYSTEM_PROCESSOR is very inconsistent. There are multiple names for the same architecture, and sometimes, e.g., building for 32-bit Windows will still report "AMD64". - On Apple platforms, there is a separate and technically multi-valued CMAKE_OSX_ARCHITECTURES. We map that to CMAKE_SYSTEM_PROCESSOR, but don't support the multi-value case. Instead, broadly detect whether we expect gas or nasm, and then pull in every matching file, relying on the C preprocessor to exclude files as needed. This also fixes a quirk in generate_build_files.py, where it needed to use the filename to detect the architecture of a perlasm script in CMake. This CL only applies to the standalone CMake build. The generated file lists do not change. I'm not sure yet whether this strategy will be appropriate for all those builds, so this starts with just the CMake one. This hits a pair of nuisances with the Apple linker. First, Apple has two ways to invoke the linker. The new way is libtool, the old way is ranlib. Warnings are different between the two. In both libtool and ranlib, for x86_64 but not aarch64, we get a warning about files with no symbols. This warning fires for us, but this change makes it much, much noisier. Oddly, this warning does not trigger when building for aarch64, just x86_64. I'm not sure whether this is because aarch64 hits new behavior or it happens that aarch64 object files always contain some dummy symbol. libtool has a -no_warning_for_no_symbols flag to silence this warning. Unfortunately, CMake uses ranlib and there is no way, from what I can tell, to pass this flag to ranlib. See https://gitlab.kitware.com/cmake/cmake/-/issues/23551#note_1306698 Since this seems to be a broader CMake limitation, and we were already living with some of these warnings, I've left this alone. But this CL does make macOS x86_64 CMake builds very noisy. I haven't used it here, but LLVM has a pile of CMake goo that switches CMake to using libtool and passes in that flag. Trialing it out reveals *different* issue, which I have worked around: When invoked as libtool, but not as ranlib, the Apple linker also warns when two object files have the same name. This appears to be a holdover from static libraries using ar, even though ld does not actually invoke ar. There appears to be no way to suppress this warning. Though we don't use libtool, we can probably assume most non-CMake builds will be using the modern spelling. So I've suffixed each perlasm file with the OS. This means, in generate_build_files.py, we no longer need a separate directory for each platform. For now, I've kept that alone, because some update scripts rely on that spelling to delete old files. Update-Note: If the CMake build fails to build somewhere for an assembly-related reasons, it's probably from this CL. Bug: 542 Change-Id: Ieb5e64997dc5a676dc30973a220d19015c8e6120 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56305 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- CMakeLists.txt | 83 +++++-------- cmake/perlasm.cmake | 62 ++++++++++ crypto/CMakeLists.txt | 180 ++++------------------------ crypto/fipsmodule/CMakeLists.txt | 197 +++++++++---------------------- util/generate_build_files.py | 63 ++++------ 5 files changed, 197 insertions(+), 388 deletions(-) create mode 100644 cmake/perlasm.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e5a64899e..4c39d12665 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ if(WIN32) endif() include(sources.cmake) +include(cmake/perlasm.cmake) enable_language(C) enable_language(CXX) @@ -404,66 +405,42 @@ function(go_executable dest package) endif() endfunction() -# CMake's iOS support uses Apple's multiple-architecture toolchain. It takes an -# architecture list from CMAKE_OSX_ARCHITECTURES, leaves CMAKE_SYSTEM_PROCESSOR -# alone, and expects all architecture-specific logic to be conditioned within -# the source files rather than the build. This does not work for our assembly -# files, so we fix CMAKE_SYSTEM_PROCESSOR and only support single-architecture -# builds. -if(NOT OPENSSL_NO_ASM AND CMAKE_OSX_ARCHITECTURES) - list(LENGTH CMAKE_OSX_ARCHITECTURES NUM_ARCHES) - if(NOT NUM_ARCHES EQUAL 1) - message(FATAL_ERROR "Universal binaries not supported.") +if(OPENSSL_NO_ASM) + add_definitions(-DOPENSSL_NO_ASM) +endif() + +if(FIPS_DELOCATE OR NOT OPENSSL_NO_ASM) + # On x86 and x86_64 Windows, we use the NASM output. + if(WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|x86_64|amd64|x86|i[3-6]86") + enable_language(ASM_NASM) + set(OPENSSL_NASM TRUE) + set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8") + else() + enable_language(ASM) + set(OPENSSL_ASM TRUE) + # CMake does not add -isysroot and -arch flags to assembly. + if(APPLE) + if(CMAKE_OSX_SYSROOT) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") + endif() + foreach(arch ${CMAKE_OSX_ARCHITECTURES}) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") + endforeach() + endif() + if(NOT WIN32) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") + endif() + # Clang's integerated assembler does not support debug symbols. + if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") + endif() endif() - list(GET CMAKE_OSX_ARCHITECTURES 0 CMAKE_SYSTEM_PROCESSOR) endif() if(OPENSSL_NO_SSE2_FOR_TESTING) add_definitions(-DOPENSSL_NO_SSE2_FOR_TESTING) endif() -if(OPENSSL_NO_ASM) - add_definitions(-DOPENSSL_NO_ASM) - set(ARCH "generic") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(ARCH "x86_64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") - set(ARCH "x86_64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") - # cmake reports AMD64 on Windows, but we might be building for 32-bit. - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH "x86_64") - else() - set(ARCH "x86") - endif() -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i386") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - set(ARCH "aarch64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - set(ARCH "aarch64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - set(ARCH "aarch64") -# Apple A12 Bionic chipset which is added in iPhone XS/XS Max/XR uses arm64e architecture. -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64e") - set(ARCH "aarch64") -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm*") - set(ARCH "arm") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips") - # Just to avoid the “unknown processor” error. - set(ARCH "generic") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") - set(ARCH "ppc64le") -elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") - set(ARCH "riscv64") -else() - message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR}) -endif() - if(USE_CUSTOM_LIBCXX) if(NOT CLANG) message(FATAL_ERROR "USE_CUSTOM_LIBCXX only supported with Clang") diff --git a/cmake/perlasm.cmake b/cmake/perlasm.cmake new file mode 100644 index 0000000000..b9530cfbc2 --- /dev/null +++ b/cmake/perlasm.cmake @@ -0,0 +1,62 @@ +macro(append_to_parent_scope var) + list(APPEND ${var} ${ARGN}) + set(${var} "${${var}}" PARENT_SCOPE) +endmacro() + +function(add_perlasm_target dest src) + get_filename_component(dir ${dest} DIRECTORY) + if(dir STREQUAL "") + set(dir ".") + endif() + + add_custom_command( + OUTPUT ${dest} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} + COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${ARGN} + ${dest} + DEPENDS + ${src} + ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/ppc-xlate.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86masm.pl + ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86nasm.pl + WORKING_DIRECTORY . + ) +endfunction() + +# perlasm generates perlasm output from a given file. arch specifies the +# architecture. dest specifies the basename of the output file. The list of +# generated files will be appended to ${var}_ASM and ${var}_NASM depending on +# the assembler used. +function(perlasm var arch dest src) + if(arch STREQUAL "aarch64") + add_perlasm_target("${dest}-apple.S" ${src} ios64) + add_perlasm_target("${dest}-linux.S" ${src} linux64) + add_perlasm_target("${dest}-win.S" ${src} win64) + append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S" "${dest}-win.S") + elseif(arch STREQUAL "arm") + add_perlasm_target("${dest}-apple.S" ${src} ios32) + add_perlasm_target("${dest}-linux.S" ${src} linux32) + append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S") + elseif(arch STREQUAL "ppc64le") + add_perlasm_target("${dest}-linux.S" ${src} linux64le) + append_to_parent_scope("${var}_ASM" "${dest}-linux.S") + elseif(arch STREQUAL "x86") + add_perlasm_target("${dest}-apple.S" ${src} macosx -fPIC -DOPENSSL_IA32_SSE2) + add_perlasm_target("${dest}-linux.S" ${src} elf -fPIC -DOPENSSL_IA32_SSE2) + add_perlasm_target("${dest}-win.asm" ${src} win32n -DOPENSSL_IA32_SSE2) + append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S") + append_to_parent_scope("${var}_NASM" "${dest}-win.asm") + elseif(arch STREQUAL "x86_64") + add_perlasm_target("${dest}-apple.S" ${src} macosx) + add_perlasm_target("${dest}-linux.S" ${src} elf) + add_perlasm_target("${dest}-win.asm" ${src} nasm) + append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S") + append_to_parent_scope("${var}_NASM" "${dest}-win.asm") + else() + message(FATAL_ERROR "Unknown perlasm architecture: $arch") + endif() +endfunction() diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 17174431b9..e1634a4faa 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -1,95 +1,5 @@ include_directories(../include) -if(NOT OPENSSL_NO_ASM) - if(UNIX) - if(ARCH STREQUAL "aarch64") - # The "armx" Perl scripts look for "64" in the style argument - # in order to decide whether to generate 32- or 64-bit asm. - if(APPLE) - set(PERLASM_STYLE ios64) - else() - set(PERLASM_STYLE linux64) - endif() - elseif(ARCH STREQUAL "arm") - if(APPLE) - set(PERLASM_STYLE ios32) - else() - set(PERLASM_STYLE linux32) - endif() - elseif(ARCH STREQUAL "ppc64le") - set(PERLASM_STYLE linux64le) - else() - if(ARCH STREQUAL "x86") - set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2") - endif() - if(APPLE) - set(PERLASM_STYLE macosx) - else() - set(PERLASM_STYLE elf) - endif() - endif() - set(ASM_EXT S) - enable_language(ASM) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") - - # Clang's integerated assembler does not support debug symbols. - if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") - endif() - - # CMake does not add -isysroot and -arch flags to assembly. - if(APPLE) - if(CMAKE_OSX_SYSROOT) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") - endif() - foreach(arch ${CMAKE_OSX_ARCHITECTURES}) - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") - endforeach() - endif() - else() - if(ARCH STREQUAL "aarch64") - set(PERLASM_STYLE win64) - set(ASM_EXT S) - enable_language(ASM) - else() - if(ARCH STREQUAL "x86_64") - set(PERLASM_STYLE nasm) - else() - set(PERLASM_STYLE win32n) - set(PERLASM_FLAGS "-DOPENSSL_IA32_SSE2") - endif() - set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8") - - # On Windows, we use the NASM output. - set(ASM_EXT asm) - enable_language(ASM_NASM) - endif() - endif() -endif() - -function(perlasm dest src) - get_filename_component(dir ${dest} DIRECTORY) - if(dir STREQUAL "") - set(dir ".") - endif() - - add_custom_command( - OUTPUT ${dest} - COMMAND ${CMAKE_COMMAND} -E make_directory ${dir} - COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${PERLASM_STYLE} ${PERLASM_FLAGS} ${ARGN} ${dest} - DEPENDS - ${src} - ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/ppc-xlate.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86masm.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86nasm.pl - WORKING_DIRECTORY . - ) -endfunction() - add_subdirectory(fipsmodule) add_subdirectory(test) @@ -104,67 +14,23 @@ if(FIPS_DELOCATE OR FIPS_SHARED) ) endif() -if(ARCH STREQUAL "arm") - set( - CRYPTO_ARCH_SOURCES - - chacha/chacha-armv4.${ASM_EXT} - curve25519/asm/x25519-asm-arm.S - poly1305/poly1305_arm_asm.S - test/trampoline-armv4.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "aarch64") - set( - CRYPTO_ARCH_SOURCES - - chacha/chacha-armv8.${ASM_EXT} - test/trampoline-armv8.${ASM_EXT} - cipher_extra/chacha20_poly1305_armv8.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "ppc64le") - set( - CRYPTO_ARCH_SOURCES - - test/trampoline-ppc.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "x86") - set( - CRYPTO_ARCH_SOURCES - - chacha/chacha-x86.${ASM_EXT} - test/trampoline-x86.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "x86_64") - set( - CRYPTO_ARCH_SOURCES - - chacha/chacha-x86_64.${ASM_EXT} - cipher_extra/aes128gcmsiv-x86_64.${ASM_EXT} - cipher_extra/chacha20_poly1305_x86_64.${ASM_EXT} - test/trampoline-x86_64.${ASM_EXT} - ) -endif() - -perlasm(chacha/chacha-armv4.${ASM_EXT} chacha/asm/chacha-armv4.pl) -perlasm(chacha/chacha-armv8.${ASM_EXT} chacha/asm/chacha-armv8.pl) -perlasm(chacha/chacha-x86.${ASM_EXT} chacha/asm/chacha-x86.pl) -perlasm(chacha/chacha-x86_64.${ASM_EXT} chacha/asm/chacha-x86_64.pl) -perlasm(cipher_extra/aes128gcmsiv-x86_64.${ASM_EXT} cipher_extra/asm/aes128gcmsiv-x86_64.pl) -perlasm(cipher_extra/chacha20_poly1305_x86_64.${ASM_EXT} cipher_extra/asm/chacha20_poly1305_x86_64.pl) -perlasm(cipher_extra/chacha20_poly1305_armv8.${ASM_EXT} cipher_extra/asm/chacha20_poly1305_armv8.pl) -perlasm(test/trampoline-armv4.${ASM_EXT} test/asm/trampoline-armv4.pl) -perlasm(test/trampoline-armv8.${ASM_EXT} test/asm/trampoline-armv8.pl) -perlasm(test/trampoline-ppc.${ASM_EXT} test/asm/trampoline-ppc.pl) -perlasm(test/trampoline-x86.${ASM_EXT} test/asm/trampoline-x86.pl) -perlasm(test/trampoline-x86_64.${ASM_EXT} test/asm/trampoline-x86_64.pl) +set( + CRYPTO_SOURCES_ASM + curve25519/asm/x25519-asm-arm.S + poly1305/poly1305_arm_asm.S +) +perlasm(CRYPTO_SOURCES aarch64 chacha/chacha-armv8 chacha/asm/chacha-armv8.pl) +perlasm(CRYPTO_SOURCES aarch64 cipher_extra/chacha20_poly1305_armv8 cipher_extra/asm/chacha20_poly1305_armv8.pl) +perlasm(CRYPTO_SOURCES aarch64 test/trampoline-armv8 test/asm/trampoline-armv8.pl) +perlasm(CRYPTO_SOURCES arm chacha/chacha-armv4 chacha/asm/chacha-armv4.pl) +perlasm(CRYPTO_SOURCES arm test/trampoline-armv4 test/asm/trampoline-armv4.pl) +perlasm(CRYPTO_SOURCES ppc64le test/trampoline-ppc test/asm/trampoline-ppc.pl) +perlasm(CRYPTO_SOURCES x86 chacha/chacha-x86 chacha/asm/chacha-x86.pl) +perlasm(CRYPTO_SOURCES x86 test/trampoline-x86 test/asm/trampoline-x86.pl) +perlasm(CRYPTO_SOURCES x86_64 chacha/chacha-x86_64 chacha/asm/chacha-x86_64.pl) +perlasm(CRYPTO_SOURCES x86_64 cipher_extra/aes128gcmsiv-x86_64 cipher_extra/asm/aes128gcmsiv-x86_64.pl) +perlasm(CRYPTO_SOURCES x86_64 cipher_extra/chacha20_poly1305_x86_64 cipher_extra/asm/chacha20_poly1305_x86_64.pl) +perlasm(CRYPTO_SOURCES x86_64 test/trampoline-x86_64 test/asm/trampoline-x86_64.pl) add_custom_command( OUTPUT err_data.c @@ -425,13 +291,17 @@ add_library( x509v3/v3_utl.c $ - - ${CRYPTO_ARCH_SOURCES} ${CRYPTO_FIPS_OBJECTS} ) +if(OPENSSL_ASM) + target_sources(crypto PRIVATE ${CRYPTO_SOURCES_ASM}) +endif() +if(OPENSSL_NASM) + target_sources(crypto PRIVATE ${CRYPTO_SOURCES_NASM}) +endif() target_include_directories(crypto INTERFACE - $ - $ + $ + $ ) install(TARGETS crypto EXPORT OpenSSLTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt index 52b094237a..82505b742c 100644 --- a/crypto/fipsmodule/CMakeLists.txt +++ b/crypto/fipsmodule/CMakeLists.txt @@ -1,147 +1,66 @@ include_directories(../../include) -if(ARCH STREQUAL "x86_64") - set( - BCM_ASM_SOURCES - - aesni-gcm-x86_64.${ASM_EXT} - aesni-x86_64.${ASM_EXT} - ghash-ssse3-x86_64.${ASM_EXT} - ghash-x86_64.${ASM_EXT} - md5-x86_64.${ASM_EXT} - p256-x86_64-asm.${ASM_EXT} - p256_beeu-x86_64-asm.${ASM_EXT} - rdrand-x86_64.${ASM_EXT} - rsaz-avx2.${ASM_EXT} - sha1-x86_64.${ASM_EXT} - sha256-x86_64.${ASM_EXT} - sha512-x86_64.${ASM_EXT} - vpaes-x86_64.${ASM_EXT} - x86_64-mont5.${ASM_EXT} - x86_64-mont.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "x86") - set( - BCM_ASM_SOURCES - - aesni-x86.${ASM_EXT} - bn-586.${ASM_EXT} - co-586.${ASM_EXT} - ghash-ssse3-x86.${ASM_EXT} - ghash-x86.${ASM_EXT} - md5-586.${ASM_EXT} - sha1-586.${ASM_EXT} - sha256-586.${ASM_EXT} - sha512-586.${ASM_EXT} - vpaes-x86.${ASM_EXT} - x86-mont.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "arm") - set( - BCM_ASM_SOURCES - - aesv8-armx.${ASM_EXT} - armv4-mont.${ASM_EXT} - bsaes-armv7.${ASM_EXT} - ghash-armv4.${ASM_EXT} - ghashv8-armx.${ASM_EXT} - sha1-armv4-large.${ASM_EXT} - sha256-armv4.${ASM_EXT} - sha512-armv4.${ASM_EXT} - vpaes-armv7.${ASM_EXT} - ) -endif() - -if(ARCH STREQUAL "aarch64") - set( - BCM_ASM_SOURCES - - aesv8-armx.${ASM_EXT} - aesv8-gcm-armv8.${ASM_EXT} - armv8-mont.${ASM_EXT} - ghash-neon-armv8.${ASM_EXT} - ghashv8-armx.${ASM_EXT} - p256-armv8-asm.${ASM_EXT} - p256_beeu-armv8-asm.${ASM_EXT} - sha1-armv8.${ASM_EXT} - sha256-armv8.${ASM_EXT} - sha512-armv8.${ASM_EXT} - vpaes-armv8.${ASM_EXT} - ) +perlasm(BCM_SOURCES aarch64 aesv8-armv8 aes/asm/aesv8-armx.pl) +perlasm(BCM_SOURCES aarch64 aesv8-gcm-armv8 modes/asm/aesv8-gcm-armv8.pl) +perlasm(BCM_SOURCES aarch64 armv8-mont bn/asm/armv8-mont.pl) +perlasm(BCM_SOURCES aarch64 ghash-neon-armv8 modes/asm/ghash-neon-armv8.pl) +perlasm(BCM_SOURCES aarch64 ghashv8-armv8 modes/asm/ghashv8-armx.pl) +perlasm(BCM_SOURCES aarch64 p256_beeu-armv8-asm ec/asm/p256_beeu-armv8-asm.pl) +perlasm(BCM_SOURCES aarch64 p256-armv8-asm ec/asm/p256-armv8-asm.pl) +perlasm(BCM_SOURCES aarch64 sha1-armv8 sha/asm/sha1-armv8.pl) +perlasm(BCM_SOURCES aarch64 sha256-armv8 sha/asm/sha512-armv8.pl) +perlasm(BCM_SOURCES aarch64 sha512-armv8 sha/asm/sha512-armv8.pl) +perlasm(BCM_SOURCES aarch64 vpaes-armv8 aes/asm/vpaes-armv8.pl) +perlasm(BCM_SOURCES arm aesv8-armv7 aes/asm/aesv8-armx.pl) +perlasm(BCM_SOURCES arm armv4-mont bn/asm/armv4-mont.pl) +perlasm(BCM_SOURCES arm bsaes-armv7 aes/asm/bsaes-armv7.pl) +perlasm(BCM_SOURCES arm ghash-armv4 modes/asm/ghash-armv4.pl) +perlasm(BCM_SOURCES arm ghashv8-armv7 modes/asm/ghashv8-armx.pl) +perlasm(BCM_SOURCES arm sha1-armv4-large sha/asm/sha1-armv4-large.pl) +perlasm(BCM_SOURCES arm sha256-armv4 sha/asm/sha256-armv4.pl) +perlasm(BCM_SOURCES arm sha512-armv4 sha/asm/sha512-armv4.pl) +perlasm(BCM_SOURCES arm vpaes-armv7 aes/asm/vpaes-armv7.pl) +perlasm(BCM_SOURCES ppc64le aesp8-ppc aes/asm/aesp8-ppc.pl) +perlasm(BCM_SOURCES ppc64le ghashp8-ppc modes/asm/ghashp8-ppc.pl) +perlasm(BCM_SOURCES x86 aesni-x86 aes/asm/aesni-x86.pl) +perlasm(BCM_SOURCES x86 bn-586 bn/asm/bn-586.pl) +perlasm(BCM_SOURCES x86 co-586 bn/asm/co-586.pl) +perlasm(BCM_SOURCES x86 ghash-ssse3-x86 modes/asm/ghash-ssse3-x86.pl) +perlasm(BCM_SOURCES x86 ghash-x86 modes/asm/ghash-x86.pl) +perlasm(BCM_SOURCES x86 md5-586 md5/asm/md5-586.pl) +perlasm(BCM_SOURCES x86 sha1-586 sha/asm/sha1-586.pl) +perlasm(BCM_SOURCES x86 sha256-586 sha/asm/sha256-586.pl) +perlasm(BCM_SOURCES x86 sha512-586 sha/asm/sha512-586.pl) +perlasm(BCM_SOURCES x86 vpaes-x86 aes/asm/vpaes-x86.pl) +perlasm(BCM_SOURCES x86 x86-mont bn/asm/x86-mont.pl) +perlasm(BCM_SOURCES x86_64 aesni-gcm-x86_64 modes/asm/aesni-gcm-x86_64.pl) +perlasm(BCM_SOURCES x86_64 aesni-x86_64 aes/asm/aesni-x86_64.pl) +perlasm(BCM_SOURCES x86_64 ghash-ssse3-x86_64 modes/asm/ghash-ssse3-x86_64.pl) +perlasm(BCM_SOURCES x86_64 ghash-x86_64 modes/asm/ghash-x86_64.pl) +perlasm(BCM_SOURCES x86_64 md5-x86_64 md5/asm/md5-x86_64.pl) +perlasm(BCM_SOURCES x86_64 p256_beeu-x86_64-asm ec/asm/p256_beeu-x86_64-asm.pl) +perlasm(BCM_SOURCES x86_64 p256-x86_64-asm ec/asm/p256-x86_64-asm.pl) +perlasm(BCM_SOURCES x86_64 rdrand-x86_64 rand/asm/rdrand-x86_64.pl) +perlasm(BCM_SOURCES x86_64 rsaz-avx2 bn/asm/rsaz-avx2.pl) +perlasm(BCM_SOURCES x86_64 sha1-x86_64 sha/asm/sha1-x86_64.pl) +perlasm(BCM_SOURCES x86_64 sha256-x86_64 sha/asm/sha512-x86_64.pl) +perlasm(BCM_SOURCES x86_64 sha512-x86_64 sha/asm/sha512-x86_64.pl) +perlasm(BCM_SOURCES x86_64 vpaes-x86_64 aes/asm/vpaes-x86_64.pl) +perlasm(BCM_SOURCES x86_64 x86_64-mont bn/asm/x86_64-mont.pl) +perlasm(BCM_SOURCES x86_64 x86_64-mont5 bn/asm/x86_64-mont5.pl) + +if(OPENSSL_ASM) + list(APPEND BCM_SOURCES_ASM_USED ${BCM_SOURCES_ASM}) endif() - -if(ARCH STREQUAL "ppc64le") - set( - BCM_ASM_SOURCES - - aesp8-ppc.${ASM_EXT} - ghashp8-ppc.${ASM_EXT} - ) +if(OPENSSL_NASM) + list(APPEND BCM_SOURCES_ASM_USED ${BCM_SOURCES_NASM}) endif() -perlasm(aesni-gcm-x86_64.${ASM_EXT} modes/asm/aesni-gcm-x86_64.pl) -perlasm(aesni-x86_64.${ASM_EXT} aes/asm/aesni-x86_64.pl) -perlasm(aesni-x86.${ASM_EXT} aes/asm/aesni-x86.pl) -perlasm(aesp8-ppc.${ASM_EXT} aes/asm/aesp8-ppc.pl) -perlasm(aesv8-armx.${ASM_EXT} aes/asm/aesv8-armx.pl) -perlasm(aesv8-gcm-armv8.${ASM_EXT} modes/asm/aesv8-gcm-armv8.pl) -perlasm(armv4-mont.${ASM_EXT} bn/asm/armv4-mont.pl) -perlasm(armv8-mont.${ASM_EXT} bn/asm/armv8-mont.pl) -perlasm(bn-586.${ASM_EXT} bn/asm/bn-586.pl) -perlasm(bsaes-armv7.${ASM_EXT} aes/asm/bsaes-armv7.pl) -perlasm(co-586.${ASM_EXT} bn/asm/co-586.pl) -perlasm(ghash-armv4.${ASM_EXT} modes/asm/ghash-armv4.pl) -perlasm(ghashp8-ppc.${ASM_EXT} modes/asm/ghashp8-ppc.pl) -perlasm(ghashv8-armx.${ASM_EXT} modes/asm/ghashv8-armx.pl) -perlasm(ghash-neon-armv8.${ASM_EXT} modes/asm/ghash-neon-armv8.pl) -perlasm(ghash-ssse3-x86_64.${ASM_EXT} modes/asm/ghash-ssse3-x86_64.pl) -perlasm(ghash-ssse3-x86.${ASM_EXT} modes/asm/ghash-ssse3-x86.pl) -perlasm(ghash-x86_64.${ASM_EXT} modes/asm/ghash-x86_64.pl) -perlasm(ghash-x86.${ASM_EXT} modes/asm/ghash-x86.pl) -perlasm(md5-586.${ASM_EXT} md5/asm/md5-586.pl) -perlasm(md5-x86_64.${ASM_EXT} md5/asm/md5-x86_64.pl) -perlasm(p256-x86_64-asm.${ASM_EXT} ec/asm/p256-x86_64-asm.pl) -perlasm(p256_beeu-x86_64-asm.${ASM_EXT} ec/asm/p256_beeu-x86_64-asm.pl) -perlasm(p256-armv8-asm.${ASM_EXT} ec/asm/p256-armv8-asm.pl) -perlasm(p256_beeu-armv8-asm.${ASM_EXT} ec/asm/p256_beeu-armv8-asm.pl) -perlasm(rdrand-x86_64.${ASM_EXT} rand/asm/rdrand-x86_64.pl) -perlasm(rsaz-avx2.${ASM_EXT} bn/asm/rsaz-avx2.pl) -perlasm(sha1-586.${ASM_EXT} sha/asm/sha1-586.pl) -perlasm(sha1-armv4-large.${ASM_EXT} sha/asm/sha1-armv4-large.pl) -perlasm(sha1-armv8.${ASM_EXT} sha/asm/sha1-armv8.pl) -perlasm(sha1-x86_64.${ASM_EXT} sha/asm/sha1-x86_64.pl) -perlasm(sha256-586.${ASM_EXT} sha/asm/sha256-586.pl) -perlasm(sha256-armv4.${ASM_EXT} sha/asm/sha256-armv4.pl) -perlasm(sha256-armv8.${ASM_EXT} sha/asm/sha512-armv8.pl) -perlasm(sha256-x86_64.${ASM_EXT} sha/asm/sha512-x86_64.pl) -perlasm(sha512-586.${ASM_EXT} sha/asm/sha512-586.pl) -perlasm(sha512-armv4.${ASM_EXT} sha/asm/sha512-armv4.pl) -perlasm(sha512-armv8.${ASM_EXT} sha/asm/sha512-armv8.pl) -perlasm(sha512-x86_64.${ASM_EXT} sha/asm/sha512-x86_64.pl) -perlasm(vpaes-armv7.${ASM_EXT} aes/asm/vpaes-armv7.pl) -perlasm(vpaes-armv8.${ASM_EXT} aes/asm/vpaes-armv8.pl) -perlasm(vpaes-x86_64.${ASM_EXT} aes/asm/vpaes-x86_64.pl) -perlasm(vpaes-x86.${ASM_EXT} aes/asm/vpaes-x86.pl) -perlasm(x86_64-mont5.${ASM_EXT} bn/asm/x86_64-mont5.pl) -perlasm(x86_64-mont.${ASM_EXT} bn/asm/x86_64-mont.pl) -perlasm(x86-mont.${ASM_EXT} bn/asm/x86-mont.pl) - if(FIPS_DELOCATE) if(FIPS_SHARED) error("Can't set both delocate and shared mode for FIPS build") endif() - if(OPENSSL_NO_ASM) - # If OPENSSL_NO_ASM was defined then ASM will not have been enabled, but in - # FIPS mode we have to have it because the module build requires going via - # textual assembly. - enable_language(ASM) - endif() - add_library( bcm_c_generated_asm @@ -170,11 +89,11 @@ if(FIPS_DELOCATE) -cc ${CMAKE_ASM_COMPILER} -cc-flags "${TARGET} $CMAKE_ASM_FLAGS" ${PROJECT_SOURCE_DIR}/include/openssl/arm_arch.h - ${BCM_ASM_SOURCES} + ${BCM_SOURCES_ASM_USED} DEPENDS bcm_c_generated_asm delocate - ${BCM_ASM_SOURCES} + ${BCM_SOURCES_ASM_USED} ${PROJECT_SOURCE_DIR}/include/openssl/arm_arch.h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) @@ -238,8 +157,7 @@ elseif(FIPS_SHARED) STATIC bcm.c - - ${BCM_ASM_SOURCES} + ${BCM_SOURCES_ASM_USED} ) add_dependencies(bcm_library global_target) @@ -260,8 +178,7 @@ else() bcm.c fips_shared_support.c - - ${BCM_ASM_SOURCES} + ${BCM_SOURCES_ASM_USED} ) add_dependencies(fipsmodule global_target) diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 5a19c920d5..4a93a7fc88 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -25,6 +25,9 @@ # OS_ARCH_COMBOS maps from OS and platform to the OpenSSL assembly "style" for # that platform and the extension used by asm files. +# +# TODO(https://crbug.com/boringssl/524): This probably should be a map, but some +# downstream scripts import this to find what folders to add/remove from git. OS_ARCH_COMBOS = [ ('apple', 'arm', 'ios32', [], 'S'), ('apple', 'aarch64', 'ios64', [], 'S'), @@ -164,6 +167,9 @@ def FilterBcmAsm(self, asm, want_bcm): Returns: A copy of |asm| with files filtered according to |want_bcm| """ + # TODO(https://crbug.com/boringssl/542): Rather than filtering by filename, + # use the variable listed in the CMake perlasm line, available in + # ExtractPerlAsmFromCMakeFile. return [(archinfo, filter(lambda p: ("/crypto/fipsmodule/" in p) == want_bcm, files)) for (archinfo, files) in asm] @@ -696,12 +702,12 @@ def ExtractPerlAsmFromCMakeFile(cmakefile): raise ValueError('Bad perlasm line in %s' % cmakefile) # Remove "perlasm(" from start and ")" from end params = line[8:-1].split() - if len(params) < 2: + if len(params) != 4: raise ValueError('Bad perlasm line in %s' % cmakefile) perlasms.append({ - 'extra_args': params[2:], - 'input': os.path.join(os.path.dirname(cmakefile), params[1]), - 'output': os.path.join(os.path.dirname(cmakefile), params[0]), + 'arch': params[1], + 'output': os.path.join(os.path.dirname(cmakefile), params[2]), + 'input': os.path.join(os.path.dirname(cmakefile), params[3]), }) return perlasms @@ -728,51 +734,28 @@ def PerlAsm(output_filename, input_filename, perlasm_style, extra_args): ['perl', input_filename, perlasm_style] + extra_args + [output_filename]) -def ArchForAsmFilename(filename): - """Returns the architectures that a given asm file should be compiled for - based on substrings in the filename.""" - - if 'x86_64' in filename or 'avx2' in filename: - return ['x86_64'] - elif ('x86' in filename and 'x86_64' not in filename) or '586' in filename: - return ['x86'] - elif 'armx' in filename: - return ['arm', 'aarch64'] - elif 'armv8' in filename: - return ['aarch64'] - elif 'arm' in filename: - return ['arm'] - elif 'ppc' in filename: - return ['ppc64le'] - else: - raise ValueError('Unknown arch for asm filename: ' + filename) - - def WriteAsmFiles(perlasms): """Generates asm files from perlasm directives for each supported OS x platform combination.""" asmfiles = {} - for osarch in OS_ARCH_COMBOS: - (osname, arch, perlasm_style, extra_args, asm_ext) = osarch - key = (osname, arch) - outDir = '%s-%s' % key - - for perlasm in perlasms: - filename = os.path.basename(perlasm['input']) + for perlasm in perlasms: + for (osname, arch, perlasm_style, extra_args, asm_ext) in OS_ARCH_COMBOS: + if arch != perlasm['arch']: + continue + # TODO(https://crbug.com/boringssl/524): Now that we incorporate osname in + # the output filename, the asm files can just go in a single directory. + # For now, we keep them in target-specific directories to avoid breaking + # downstream scripts. + key = (osname, arch) + outDir = '%s-%s' % key output = perlasm['output'] if not output.startswith('src'): raise ValueError('output missing src: %s' % output) output = os.path.join(outDir, output[4:]) - if output.endswith('-armx.${ASM_EXT}'): - output = output.replace('-armx', - '-armx64' if arch == 'aarch64' else '-armx32') - output = output.replace('${ASM_EXT}', asm_ext) - - if arch in ArchForAsmFilename(filename): - PerlAsm(output, perlasm['input'], perlasm_style, - perlasm['extra_args'] + extra_args) - asmfiles.setdefault(key, []).append(output) + output = '%s-%s.%s' % (output, osname, asm_ext) + PerlAsm(output, perlasm['input'], perlasm_style, extra_args) + asmfiles.setdefault(key, []).append(output) for (key, non_perl_asm_files) in NON_PERL_FILES.items(): asmfiles.setdefault(key, []).extend(non_perl_asm_files) From c371b8b3d3bbb8af29cab8a829339a9c51897edd Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 25 Jan 2023 17:14:35 -0500 Subject: [PATCH 002/177] Set C11 in all compilers. I'm not sure why I conditioned C11 on non-Clang MSVC. I think I meant to invert that condition to NOT MSVC OR CLANG. But given that it worked, just do it across the board. (Though we support VS2017, which doesn't support a C11 mode, so this is slightly curious. It may just be that pre-VS2019, this option is a no-op.) Change-Id: I271ffd2a913c1aa676fea7ec41f30c1896bb5955 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56325 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c39d12665..6085713fa0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,10 +125,8 @@ endif() set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) -if(MSVC AND NOT CLANG) - set(CMAKE_C_STANDARD 11) - set(CMAKE_C_STANDARD_REQUIRED ON) -endif() +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) # Note clang-cl is odd and sets both CLANG and MSVC. We base our configuration From 971b330faf96328618d3653667af65c9f753e0df Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 25 Jan 2023 15:59:39 -0500 Subject: [PATCH 003/177] Use the same Deleter across all bssl::UniquePtr. Template operator() instead of the type. This fixes converting subclasses with bssl::UniquePtr. std::unique_ptr can be converted to std::unique_ptr requires either D == E or for D to be implicitly convertable to E, along with other conditions. (Notably T* must be convertible to U*.) In the real std::unique_ptr, we rely on std::default_delete being convertable to std::default_delete if T* is convertible to U*. But rather than write all the SFINAE complexity, I think it suffices to move the template down a later. This simplifies SSLKeyShare::Create a little. Change-Id: I431610f3a69a72dd9def190d3554c89c2d3a4c32 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56385 Commit-Queue: Adam Langley Reviewed-by: Adam Langley Auto-Submit: David Benjamin --- include/openssl/base.h | 4 ++-- ssl/ssl_key_share.cc | 20 ++++++++------------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/include/openssl/base.h b/include/openssl/base.h index a2fb76bc16..690b801d4c 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h @@ -529,8 +529,8 @@ namespace internal { template struct DeleterImpl {}; -template struct Deleter { + template void operator()(T *ptr) { // Rather than specialize Deleter for each type, we specialize // DeleterImpl. This allows bssl::UniquePtr to be used while only @@ -614,7 +614,7 @@ class StackAllocatedMovable { // bssl::UniquePtr rsa(RSA_new()); // bssl::UniquePtr bio(BIO_new(BIO_s_mem())); template -using UniquePtr = std::unique_ptr>; +using UniquePtr = std::unique_ptr; #define BORINGSSL_MAKE_UP_REF(type, up_ref_func) \ inline UniquePtr UpRef(type *v) { \ diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index 33103ad0f8..7c3e7ef8d6 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -359,25 +359,21 @@ Span NamedGroups() { UniquePtr SSLKeyShare::Create(uint16_t group_id) { switch (group_id) { case SSL_CURVE_SECP224R1: - return UniquePtr( - New(NID_secp224r1, SSL_CURVE_SECP224R1)); + return MakeUnique(NID_secp224r1, SSL_CURVE_SECP224R1); case SSL_CURVE_SECP256R1: - return UniquePtr( - New(NID_X9_62_prime256v1, SSL_CURVE_SECP256R1)); + return MakeUnique(NID_X9_62_prime256v1, SSL_CURVE_SECP256R1); case SSL_CURVE_SECP384R1: - return UniquePtr( - New(NID_secp384r1, SSL_CURVE_SECP384R1)); + return MakeUnique(NID_secp384r1, SSL_CURVE_SECP384R1); case SSL_CURVE_SECP521R1: - return UniquePtr( - New(NID_secp521r1, SSL_CURVE_SECP521R1)); + return MakeUnique(NID_secp521r1, SSL_CURVE_SECP521R1); case SSL_CURVE_X25519: - return UniquePtr(New()); + return MakeUnique(); case SSL_CURVE_CECPQ2: - return UniquePtr(New()); + return MakeUnique(); case SSL_CURVE_X25519KYBER768: - return UniquePtr(New()); + return MakeUnique(); case SSL_CURVE_P256KYBER768: - return UniquePtr(New()); + return MakeUnique(); default: return nullptr; } From 76a83aa4ae643a622646525b92cb132b74f95f3a Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 18:18:27 -0500 Subject: [PATCH 004/177] Align ppc assembly setup with other architectures The ppc assembly opened directly to STDOUT while all the other ones open to OUT and then reassign *STDOUT. I don't know why this makes a difference, but only the latter works on Windows. Bug: 542 Change-Id: I5b21bcf11c356ea4f2b6bc124a4a300bbd13be43 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56386 Auto-Submit: David Benjamin Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/fipsmodule/aes/asm/aesp8-ppc.pl | 4 +++- crypto/fipsmodule/modes/asm/ghashp8-ppc.pl | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crypto/fipsmodule/aes/asm/aesp8-ppc.pl b/crypto/fipsmodule/aes/asm/aesp8-ppc.pl index 983cbbe6d3..061f6b7e2c 100644 --- a/crypto/fipsmodule/aes/asm/aesp8-ppc.pl +++ b/crypto/fipsmodule/aes/asm/aesp8-ppc.pl @@ -44,6 +44,7 @@ # POWER9[be] 3.99/0.78 0.79 0.97 $flavour = shift; +$output = shift; if ($flavour =~ /64/) { $SIZE_T =8; @@ -70,7 +71,8 @@ ( $xlate="${dir}../../../perlasm/ppc-xlate.pl" and -f $xlate) or die "can't locate ppc-xlate.pl"; -open STDOUT,"| $^X \"$xlate\" $flavour ".shift || die "can't call $xlate: $!"; +open OUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; +*STDOUT=*OUT; $FRAME=8*$SIZE_T; $prefix="aes_hw"; diff --git a/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl b/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl index e9ca11a88e..0d12a77ba8 100644 --- a/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl +++ b/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl @@ -60,7 +60,8 @@ ( $xlate="${dir}../../../perlasm/ppc-xlate.pl" and -f $xlate) or die "can't locate ppc-xlate.pl"; -open STDOUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; +open OUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; +*STDOUT=*OUT; my ($Xip,$Htbl,$inp,$len)=map("r$_",(3..6)); # argument block From 50a5caf506f12bd4ac4843358ce03dcc2c667aaf Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 28 Dec 2022 18:33:18 -0500 Subject: [PATCH 005/177] Add CBS_get_u64_decimal. ASN1_generate_v8 has a number of calls to strtoul. strtoul has two problems for that function. First, strtoul keeps reading until NUL, but all the functions in that file act on pointer/length pairs. It's fine because the underlying string is always NUL-terminated, but this is fragile. Second, strtoul is actually defined to parse "-1" as (unsigned long)(-1)! Rather than deal with this, extract the decimal string parser out of the OID parser as a CBS strotul equivalent. Change-Id: I1b7a1867d185e34e752be09f8c8103b82e364f35 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56165 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- crypto/bytestring/bytestring_test.cc | 50 ++++++++++++++++++++++++++++ crypto/bytestring/cbb.c | 31 +++++------------ crypto/bytestring/cbs.c | 24 +++++++++++++ include/openssl/bytestring.h | 7 ++++ 4 files changed, 89 insertions(+), 23 deletions(-) diff --git a/crypto/bytestring/bytestring_test.cc b/crypto/bytestring/bytestring_test.cc index e35b1bc7e4..ca22c41c39 100644 --- a/crypto/bytestring/bytestring_test.cc +++ b/crypto/bytestring/bytestring_test.cc @@ -1657,3 +1657,53 @@ TEST(CBSTest, BogusTime) { EXPECT_FALSE(CBS_parse_utc_time(&cbs, NULL, /*allow_timezone_offset=*/1)); } } + +TEST(CBSTest, GetU64Decimal) { + const struct { + uint64_t val; + const char *text; + } kTests[] = { + {0, "0"}, + {1, "1"}, + {123456, "123456"}, + // 2^64 - 1 + {UINT64_C(18446744073709551615), "18446744073709551615"}, + }; + for (const auto &t : kTests) { + SCOPED_TRACE(t.text); + CBS cbs; + CBS_init(&cbs, reinterpret_cast(t.text), strlen(t.text)); + uint64_t v; + ASSERT_TRUE(CBS_get_u64_decimal(&cbs, &v)); + EXPECT_EQ(v, t.val); + EXPECT_EQ(CBS_data(&cbs), + reinterpret_cast(t.text) + strlen(t.text)); + EXPECT_EQ(CBS_len(&cbs), 0u); + + std::string str(t.text); + str += "Z"; + CBS_init(&cbs, reinterpret_cast(str.data()), str.size()); + ASSERT_TRUE(CBS_get_u64_decimal(&cbs, &v)); + EXPECT_EQ(v, t.val); + EXPECT_EQ(CBS_data(&cbs), + reinterpret_cast(str.data()) + strlen(t.text)); + EXPECT_EQ(CBS_len(&cbs), 1u); + } + + static const char *kInvalidTests[] = { + "", + "nope", + "-1", + // 2^64 + "18446744073709551616", + // Overflows at multiplying by 10. + "18446744073709551620", + }; + for (const char *invalid : kInvalidTests) { + SCOPED_TRACE(invalid); + CBS cbs; + CBS_init(&cbs, reinterpret_cast(invalid), strlen(invalid)); + uint64_t v; + EXPECT_FALSE(CBS_get_u64_decimal(&cbs, &v)); + } +} diff --git a/crypto/bytestring/cbb.c b/crypto/bytestring/cbb.c index 86625fe423..1692b4ea61 100644 --- a/crypto/bytestring/cbb.c +++ b/crypto/bytestring/cbb.c @@ -560,30 +560,15 @@ int CBB_add_asn1_bool(CBB *cbb, int value) { // component and the dot, so |cbs| may be passed into the function again for the // next value. static int parse_dotted_decimal(CBS *cbs, uint64_t *out) { - *out = 0; - int seen_digit = 0; - for (;;) { - // Valid terminators for a component are the end of the string or a - // non-terminal dot. If the string ends with a dot, this is not a valid OID - // string. - uint8_t u; - if (!CBS_get_u8(cbs, &u) || - (u == '.' && CBS_len(cbs) > 0)) { - break; - } - if (u < '0' || u > '9' || - // Forbid stray leading zeros. - (seen_digit && *out == 0) || - // Check for overflow. - *out > UINT64_MAX / 10 || - *out * 10 > UINT64_MAX - (u - '0')) { - return 0; - } - *out = *out * 10 + (u - '0'); - seen_digit = 1; + if (!CBS_get_u64_decimal(cbs, out)) { + return 0; } - // The empty string is not a legal OID component. - return seen_digit; + + // The integer must have either ended at the end of the string, or a + // non-terminal dot, which should be consumed. If the string ends with a dot, + // this is not a valid OID string. + uint8_t dot; + return !CBS_get_u8(cbs, &dot) || (dot == '.' && CBS_len(cbs) > 0); } int CBB_add_asn1_oid_from_text(CBB *cbb, const char *text, size_t len) { diff --git a/crypto/bytestring/cbs.c b/crypto/bytestring/cbs.c index c28f08d843..efafbfb442 100644 --- a/crypto/bytestring/cbs.c +++ b/crypto/bytestring/cbs.c @@ -227,6 +227,30 @@ int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c) { return CBS_get_bytes(cbs, out, split - CBS_data(cbs)); } +int CBS_get_u64_decimal(CBS *cbs, uint64_t *out) { + uint64_t v = 0; + int seen_digit = 0; + while (CBS_len(cbs) != 0) { + uint8_t c = CBS_data(cbs)[0]; + if (!isdigit(c)) { + break; + } + CBS_skip(cbs, 1); + if (// Forbid stray leading zeros. + (v == 0 && seen_digit) || + // Check for overflow. + v > UINT64_MAX / 10 || // + v * 10 > UINT64_MAX - (c - '0')) { + return 0; + } + v = v * 10 + (c - '0'); + seen_digit = 1; + } + + *out = v; + return seen_digit; +} + // parse_base128_integer reads a big-endian base-128 integer from |cbs| and sets // |*out| to the result. This is the encoding used in DER for both high tag // number form and OID components. diff --git a/include/openssl/bytestring.h b/include/openssl/bytestring.h index 28297d4bd1..b6fdda83ea 100644 --- a/include/openssl/bytestring.h +++ b/include/openssl/bytestring.h @@ -160,6 +160,13 @@ OPENSSL_EXPORT int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out); // one. Otherwise, it returns zero and leaves |cbs| unmodified. OPENSSL_EXPORT int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c); +// CBS_get_u64_decimal reads a decimal integer from |cbs| and writes it to +// |*out|. It stops reading at the end of the string, or the first non-digit +// character. It returns one on success and zero on error. This function behaves +// analogously to |strtoul| except it does not accept empty inputs, leading +// zeros, or negative values. +OPENSSL_EXPORT int CBS_get_u64_decimal(CBS *cbs, uint64_t *out); + // Parsing ASN.1 // From cbccae538c6f03cdf7b9fa263fd1c37724d7a769 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 18:33:45 -0500 Subject: [PATCH 006/177] Remove ppc64le delocate and FIPS build. Change-Id: I81ae040c23ff07cac9156456ba7050dc35775608 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56387 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- util/fipstools/acvp/modulewrapper/main.cc | 2 - util/fipstools/delocate/delocate.go | 482 +------------ util/fipstools/delocate/delocate_test.go | 5 - .../testdata/ppc64le-GlobalEntry/in.s | 9 - .../testdata/ppc64le-GlobalEntry/out.s | 62 -- .../delocate/testdata/ppc64le-LoadToR0/in.s | 4 - .../delocate/testdata/ppc64le-LoadToR0/out.s | 72 -- .../delocate/testdata/ppc64le-Sample/in.s | 161 ----- .../delocate/testdata/ppc64le-Sample/out.s | 552 -------------- .../delocate/testdata/ppc64le-Sample2/in.s | 226 ------ .../delocate/testdata/ppc64le-Sample2/out.s | 677 ------------------ .../testdata/ppc64le-TOCWithOffset/in.s | 23 - .../testdata/ppc64le-TOCWithOffset/out.s | 178 ----- 13 files changed, 2 insertions(+), 2451 deletions(-) delete mode 100644 util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-Sample/in.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-Sample/out.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-Sample2/in.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-Sample2/out.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s delete mode 100644 util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s diff --git a/util/fipstools/acvp/modulewrapper/main.cc b/util/fipstools/acvp/modulewrapper/main.cc index a903361b7f..03aead55ea 100644 --- a/util/fipstools/acvp/modulewrapper/main.cc +++ b/util/fipstools/acvp/modulewrapper/main.cc @@ -33,8 +33,6 @@ int main(int argc, char **argv) { puts("ARM (32-bit)"); #elif defined(OPENSSL_AARCH64) puts("aarch64 (64-bit)"); -#elif defined(OPENSSL_PPC64LE) - puts("PPC64LE (64-bit)"); #else #error "FIPS build not supported on this architecture" #endif diff --git a/util/fipstools/delocate/delocate.go b/util/fipstools/delocate/delocate.go index 7f4b8f5f6a..c9daff9318 100644 --- a/util/fipstools/delocate/delocate.go +++ b/util/fipstools/delocate/delocate.go @@ -54,8 +54,7 @@ type stringWriter interface { type processorType int const ( - ppc64le processorType = iota + 1 - x86_64 + x86_64 processorType = iota + 1 aarch64 ) @@ -68,8 +67,6 @@ type delocation struct { // symbols is the set of symbols defined in the module. symbols map[string]struct{} - // localEntrySymbols is the set of symbols with .localentry directives. - localEntrySymbols map[string]struct{} // redirectors maps from out-call symbol name to the name of a // redirector function for that symbol. E.g. “memcpy” -> // “bcm_redirector_memcpy”. @@ -78,9 +75,6 @@ type delocation struct { // should be used to reference it. E.g. “P384_data_storage” -> // “P384_data_storage”. bssAccessorsNeeded map[string]string - // tocLoaders is a set of symbol names for which TOC helper functions - // are required. (ppc64le only.) - tocLoaders map[string]struct{} // gotExternalsNeeded is a set of symbol names for which we need // “delta” symbols: symbols that contain the offset from their location // to the memory in question. @@ -157,8 +151,6 @@ func (d *delocation) processInput(input inputFile) (err error) { switch d.processor { case x86_64: statement, err = d.processIntelInstruction(statement, node.up) - case ppc64le: - statement, err = d.processPPCInstruction(statement, node.up) case aarch64: statement, err = d.processAarch64Instruction(statement, node.up) default: @@ -255,7 +247,7 @@ func (d *delocation) processDirective(statement, directive *node32) (*node32, er d.writeNode(statement) break - case ".debug", ".note", ".toc": + case ".debug", ".note": d.writeNode(statement) break @@ -315,10 +307,6 @@ func (d *delocation) processLabelContainingDirective(statement, directive *node3 d.output.WriteString("\t" + name + "\t" + strings.Join(args, ", ") + "\n") } - if name == ".localentry" { - d.output.WriteString(localEntryName(args[0]) + ":\n") - } - return statement, nil } @@ -629,191 +617,6 @@ func (d *delocation) processAarch64Instruction(statement, instruction *node32) ( return statement, nil } -/* ppc64le - -[PABI]: “64-Bit ELF V2 ABI Specification. Power Architecture.” March 21st, - 2017 - -(Also useful is “Power ISA Version 2.07 B”. Note that version three of that -document is /not/ good as that's POWER9 specific.) - -ppc64le doesn't have IP-relative addressing and does a lot to work around this. -Rather than reference a PLT and GOT direction, it has a single structure called -the TOC (Table Of Contents). Within the TOC is the contents of .rodata, .data, -.got, .plt, .bss, etc sections [PABI;3.3]. - -A pointer to the TOC is maintained in r2 and the following pattern is used to -load the address of an element into a register: - - addis
, 2, foo@toc@ha - addi
,
, foo@toc@l - -The “addis” instruction shifts a signed constant left 16 bits and adds the -result to its second argument, saving the result in the first argument. The -“addi” instruction does the same, but without shifting. Thus the “@toc@ha" -suffix on a symbol means “the top 16 bits of the TOC offset” and “@toc@l” means -“the bottom 16 bits of the offset”. However, note that both values are signed, -thus offsets in the top half of a 64KB chunk will have an @ha value that's one -greater than expected and a negative @l value. - -The TOC is specific to a “module” (basically an executable or shared object). -This means that there's not a single TOC in a process and that r2 needs to -change as control moves between modules. Thus functions have two entry points: -the “global” entry point and the “local” entry point. Jumps from within the -same module can use the local entry while jumps from other modules must use the -global entry. The global entry establishes the correct value of r2 before -running the function and the local entry skips that code. - -The global entry point for a function is defined by its label. The local entry -is a power-of-two number of bytes from the global entry, set by the -“.localentry” directive. (ppc64le instructions are always 32 bits, so an offset -of 1 or 2 bytes is treated as an offset of zero.) - -In order to help the global entry code set r2 to point to the local TOC, r12 is -set to the address of the global entry point when called [PABI;2.2.1.1]. Thus -the global entry will typically use an addis+addi pair to add a known offset to -r12 and store it in r2. For example: - -foo: - addis 2, 12, .TOC. - foo@ha - addi 2, 2, .TOC. - foo@l - -(It's worth noting that the '@' operator binds very loosely, so the 3rd -arguments parse as (.TOC. - foo)@ha and (.TOC. - foo)@l.) - -When calling a function, the compiler doesn't know whether that function is in -the same module or not. Thus it doesn't know whether r12 needs to be set nor -whether r2 will be clobbered on return. Rather than always assume the worst, -the linker fixes stuff up once it knows that a call is going out of module: - -Firstly, calling, say, memcpy (which we assume to be in a different module) -won't actually jump directly to memcpy, or even a PLT resolution function. -It'll call a synthesised function that: - a) saves r2 in the caller's stack frame - b) loads the address of memcpy@PLT into r12 - c) jumps to r12. - -As this synthesised function loads memcpy@PLT, a call to memcpy from the -compiled code just references “memcpy” directly, not “memcpy@PLT”. - -Since it jumps directly to memcpy@PLT, it can't restore r2 on return. Thus -calls must be followed by a nop. If the call ends up going out-of-module, the -linker will rewrite that nop to load r2 from the stack. - -Speaking of the stack, the stack pointer is kept in r1 and there's a 288-byte -red-zone. The format of the stack frame is defined [PABI;2.2.2] and must be -followed as called functions will write into their parent's stack frame. For -example, the synthesised out-of-module trampolines will save r2 24 bytes into -the caller's frame and all non-leaf functions save the return address 16 bytes -into the caller's frame. - -A final point worth noting: some RISC ISAs have r0 wired to zero: all reads -result in zero and all writes are discarded. POWER does something a little like -that, but r0 is only special in certain argument positions for certain -instructions. You just have to read the manual to know which they are. - - -Delocation is easier than Intel because there's just TOC references, but it's -also harder because there's no IP-relative addressing. - -Jumps are IP-relative however, and have a 24-bit immediate value. So we can -jump to functions that set a register to the needed value. (r3 is the -return-value register and so that's what is generally used here.) */ - -// isPPC64LEAPair recognises an addis+addi pair that's adding the offset of -// source to relative and writing the result to target. -func (d *delocation) isPPC64LEAPair(statement *node32) (target, source, relative string, ok bool) { - instruction := skipWS(statement.up).up - assertNodeType(instruction, ruleInstructionName) - name1 := d.contents(instruction) - args1 := instructionArgs(instruction.next) - - statement = statement.next - instruction = skipWS(statement.up).up - assertNodeType(instruction, ruleInstructionName) - name2 := d.contents(instruction) - args2 := instructionArgs(instruction.next) - - if name1 != "addis" || - len(args1) != 3 || - name2 != "addi" || - len(args2) != 3 { - return "", "", "", false - } - - target = d.contents(args1[0]) - relative = d.contents(args1[1]) - source1 := d.contents(args1[2]) - source2 := d.contents(args2[2]) - - if !strings.HasSuffix(source1, "@ha") || - !strings.HasSuffix(source2, "@l") || - source1[:len(source1)-3] != source2[:len(source2)-2] || - d.contents(args2[0]) != target || - d.contents(args2[1]) != target { - return "", "", "", false - } - - source = source1[:len(source1)-3] - ok = true - return -} - -// establishTOC writes the global entry prelude for a function. The standard -// prelude involves relocations so this version moves the relocation outside -// the integrity-checked area. -func establishTOC(w stringWriter) { - w.WriteString("999:\n") - w.WriteString("\taddis 2, 12, .LBORINGSSL_external_toc-999b@ha\n") - w.WriteString("\taddi 2, 2, .LBORINGSSL_external_toc-999b@l\n") - w.WriteString("\tld 12, 0(2)\n") - w.WriteString("\tadd 2, 2, 12\n") -} - -// loadTOCFuncName returns the name of a synthesized function that sets r3 to -// the value of “symbol+offset”. -func loadTOCFuncName(symbol, offset string) string { - symbol = strings.Replace(symbol, ".", "_dot_", -1) - ret := ".Lbcm_loadtoc_" + symbol - if len(offset) != 0 { - offset = strings.Replace(offset, "+", "_plus_", -1) - offset = strings.Replace(offset, "-", "_minus_", -1) - ret += "_" + offset - } - return ret -} - -func (d *delocation) loadFromTOC(w stringWriter, symbol, offset, dest string) wrapperFunc { - d.tocLoaders[symbol+"\x00"+offset] = struct{}{} - - return func(k func()) { - w.WriteString("\taddi 1, 1, -288\n") // Clear the red zone. - w.WriteString("\tmflr " + dest + "\n") // Stash the link register. - w.WriteString("\tstd " + dest + ", -8(1)\n") - // The TOC loader will use r3, so stash it if necessary. - if dest != "3" { - w.WriteString("\tstd 3, -16(1)\n") - } - - // Because loadTOCFuncName returns a “.L” name, we don't need a - // nop after this call. - w.WriteString("\tbl " + loadTOCFuncName(symbol, offset) + "\n") - - // Cycle registers around. We need r3 -> destReg, -8(1) -> - // lr and, optionally, -16(1) -> r3. - w.WriteString("\tstd 3, -24(1)\n") - w.WriteString("\tld 3, -8(1)\n") - w.WriteString("\tmtlr 3\n") - w.WriteString("\tld " + dest + ", -24(1)\n") - if dest != "3" { - w.WriteString("\tld 3, -16(1)\n") - } - w.WriteString("\taddi 1, 1, 288\n") - - k() - } -} - func (d *delocation) gatherOffsets(symRef *node32, offsets string) (*node32, string) { for symRef != nil && symRef.pegRule == ruleOffset { offset := d.contents(symRef) @@ -868,215 +671,6 @@ func (d *delocation) parseMemRef(memRef *node32) (symbol, offset, section string return } -func (d *delocation) processPPCInstruction(statement, instruction *node32) (*node32, error) { - assertNodeType(instruction, ruleInstructionName) - instructionName := d.contents(instruction) - isBranch := instructionName[0] == 'b' - - argNodes := instructionArgs(instruction.next) - - var wrappers wrapperStack - var args []string - changed := false - -Args: - for i, arg := range argNodes { - fullArg := arg - isIndirect := false - - if arg.pegRule == ruleIndirectionIndicator { - arg = arg.next - isIndirect = true - } - - switch arg.pegRule { - case ruleRegisterOrConstant, ruleLocalLabelRef: - args = append(args, d.contents(fullArg)) - - case ruleTOCRefLow: - return nil, errors.New("Found low TOC reference outside preamble pattern") - - case ruleTOCRefHigh: - target, _, relative, ok := d.isPPC64LEAPair(statement) - if !ok { - return nil, errors.New("Found high TOC reference outside preamble pattern") - } - - if relative != "12" { - return nil, fmt.Errorf("preamble is relative to %q, not r12", relative) - } - - if target != "2" { - return nil, fmt.Errorf("preamble is setting %q, not r2", target) - } - - statement = statement.next - establishTOC(d.output) - instructionName = "" - changed = true - break Args - - case ruleMemoryRef: - symbol, offset, section, didChange, symbolIsLocal, memRef := d.parseMemRef(arg.up) - changed = didChange - - if len(symbol) > 0 { - if _, localEntrySymbol := d.localEntrySymbols[symbol]; localEntrySymbol && isBranch { - symbol = localEntryName(symbol) - changed = true - } else if _, knownSymbol := d.symbols[symbol]; knownSymbol { - symbol = localTargetName(symbol) - changed = true - } else if !symbolIsLocal && !isSynthesized(symbol) && len(section) == 0 { - changed = true - d.redirectors[symbol] = redirectorName(symbol) - symbol = redirectorName(symbol) - // TODO(davidben): This should sanity-check the next - // instruction is a nop and ideally remove it. - wrappers = append(wrappers, func(k func()) { - k() - // Like the linker's PLT stubs, redirector functions - // expect callers to restore r2. - d.output.WriteString("\tld 2, 24(1)\n") - }) - } - } - - switch section { - case "": - - case "tls": - // This section identifier just tells the - // assembler to use r13, the pointer to the - // thread-local data [PABI;3.7.3.3]. - - case "toc@ha": - // Delete toc@ha instructions. Per - // [PABI;3.6.3], the linker is allowed to erase - // toc@ha instructions. We take advantage of - // this by unconditionally erasing the toc@ha - // instructions and doing the full lookup when - // processing toc@l. - // - // Note that any offset here applies before @ha - // and @l. That is, 42+foo@toc@ha is - // #ha(42+foo-.TOC.), not 42+#ha(foo-.TOC.). Any - // corresponding toc@l references are required - // by the ABI to have the same offset. The - // offset will be incorporated in full when - // those are processed. - if instructionName != "addis" || len(argNodes) != 3 || i != 2 || args[1] != "2" { - return nil, errors.New("can't process toc@ha reference") - } - changed = true - instructionName = "" - break Args - - case "toc@l": - // Per [PAB;3.6.3], this instruction must take - // as input a register which was the output of - // a toc@ha computation and compute the actual - // address of some symbol. The toc@ha - // computation was elided, so we ignore that - // input register and compute the address - // directly. - changed = true - - // For all supported toc@l instructions, the - // destination register is the first argument. - destReg := args[0] - - wrappers = append(wrappers, d.loadFromTOC(d.output, symbol, offset, destReg)) - switch instructionName { - case "addi": - // The original instruction was: - // addi destReg, tocHaReg, offset+symbol@toc@l - instructionName = "" - - case "ld", "lhz", "lwz": - // The original instruction was: - // l?? destReg, offset+symbol@toc@l(tocHaReg) - // - // We transform that into the - // equivalent dereference of destReg: - // l?? destReg, 0(destReg) - origInstructionName := instructionName - instructionName = "" - - assertNodeType(memRef, ruleBaseIndexScale) - assertNodeType(memRef.up, ruleRegisterOrConstant) - if memRef.next != nil || memRef.up.next != nil { - return nil, errors.New("expected single register in BaseIndexScale for ld argument") - } - - baseReg := destReg - if baseReg == "0" { - // Register zero is special as the base register for a load. - // Avoid it by spilling and using r3 instead. - baseReg = "3" - wrappers = append(wrappers, func(k func()) { - d.output.WriteString("\taddi 1, 1, -288\n") // Clear the red zone. - d.output.WriteString("\tstd " + baseReg + ", -8(1)\n") - d.output.WriteString("\tmr " + baseReg + ", " + destReg + "\n") - k() - d.output.WriteString("\tld " + baseReg + ", -8(1)\n") - d.output.WriteString("\taddi 1, 1, 288\n") // Clear the red zone. - }) - } - - wrappers = append(wrappers, func(k func()) { - d.output.WriteString("\t" + origInstructionName + " " + destReg + ", 0(" + baseReg + ")\n") - }) - default: - return nil, fmt.Errorf("can't process TOC argument to %q", instructionName) - } - - default: - return nil, fmt.Errorf("Unknown section type %q", section) - } - - argStr := "" - if isIndirect { - argStr += "*" - } - argStr += symbol - if len(offset) > 0 { - argStr += offset - } - if len(section) > 0 { - argStr += "@" - argStr += section - } - - for ; memRef != nil; memRef = memRef.next { - argStr += d.contents(memRef) - } - - args = append(args, argStr) - - default: - panic(fmt.Sprintf("unknown instruction argument type %q", rul3s[arg.pegRule])) - } - } - - if changed { - d.writeCommentedNode(statement) - - var replacement string - if len(instructionName) > 0 { - replacement = "\t" + instructionName + "\t" + strings.Join(args, ", ") + "\n" - } - - wrappers.do(func() { - d.output.WriteString(replacement) - }) - } else { - d.writeNode(statement) - } - - return statement, nil -} - /* Intel */ type instructionType int @@ -1674,8 +1268,6 @@ func writeAarch64Function(w stringWriter, funcName string, writeContents func(st func transform(w stringWriter, inputs []inputFile) error { // symbols contains all defined symbols. symbols := make(map[string]struct{}) - // localEntrySymbols contains all symbols with a .localentry directive. - localEntrySymbols := make(map[string]struct{}) // fileNumbers is the set of IDs seen in .file directives. fileNumbers := make(map[int]struct{}) // maxObservedFileNumber contains the largest seen file number in a @@ -1698,25 +1290,6 @@ func transform(w stringWriter, inputs []inputFile) error { symbols[symbol] = struct{}{} }, ruleStatement, ruleLabel, ruleSymbolName) - forEachPath(input.ast.up, func(node *node32) { - node = node.up - assertNodeType(node, ruleLabelContainingDirectiveName) - directive := input.contents[node.begin:node.end] - if directive != ".localentry" { - return - } - // Extract the first argument. - node = skipWS(node.next) - assertNodeType(node, ruleSymbolArgs) - node = node.up - assertNodeType(node, ruleSymbolArg) - symbol := input.contents[node.begin:node.end] - if _, ok := localEntrySymbols[symbol]; ok { - panic(fmt.Sprintf("Duplicate .localentry directive found: %q in %q", symbol, input.path)) - } - localEntrySymbols[symbol] = struct{}{} - }, ruleStatement, ruleLabelContainingDirective) - forEachPath(input.ast.up, func(node *node32) { assertNodeType(node, ruleLocationDirective) directive := input.contents[node.begin:node.end] @@ -1765,13 +1338,11 @@ func transform(w stringWriter, inputs []inputFile) error { d := &delocation{ symbols: symbols, - localEntrySymbols: localEntrySymbols, processor: processor, commentIndicator: commentIndicator, output: w, redirectors: make(map[string]string), bssAccessorsNeeded: make(map[string]string), - tocLoaders: make(map[string]struct{}), gotExternalsNeeded: make(map[string]struct{}), gotOffsetsNeeded: make(map[string]struct{}), gotOffOffsetsNeeded: make(map[string]struct{}), @@ -1806,22 +1377,6 @@ func transform(w stringWriter, inputs []inputFile) error { for _, name := range redirectorNames { redirector := d.redirectors[name] switch d.processor { - case ppc64le: - w.WriteString(".section \".toc\", \"aw\"\n") - w.WriteString(".Lredirector_toc_" + name + ":\n") - w.WriteString(".quad " + name + "\n") - w.WriteString(".text\n") - w.WriteString(".type " + redirector + ", @function\n") - w.WriteString(redirector + ":\n") - // |name| will clobber r2, so save it. This is matched by a restore in - // redirector calls. - w.WriteString("\tstd 2, 24(1)\n") - // Load and call |name|'s global entry point. - w.WriteString("\taddis 12, 2, .Lredirector_toc_" + name + "@toc@ha\n") - w.WriteString("\tld 12, .Lredirector_toc_" + name + "@toc@l(12)\n") - w.WriteString("\tmtctr 12\n") - w.WriteString("\tbctr\n") - case aarch64: writeAarch64Function(w, redirector, func(w stringWriter) { w.WriteString("\tb " + name + "\n") @@ -1846,13 +1401,6 @@ func transform(w stringWriter, inputs []inputFile) error { target := d.bssAccessorsNeeded[name] switch d.processor { - case ppc64le: - w.WriteString(".type " + funcName + ", @function\n") - w.WriteString(funcName + ":\n") - w.WriteString("\taddis 3, 2, " + target + "@toc@ha\n") - w.WriteString("\taddi 3, 3, " + target + "@toc@l\n") - w.WriteString("\tblr\n") - case x86_64: w.WriteString(".type " + funcName + ", @function\n") w.WriteString(funcName + ":\n") @@ -1868,26 +1416,6 @@ func transform(w stringWriter, inputs []inputFile) error { } switch d.processor { - case ppc64le: - loadTOCNames := sortedSet(d.tocLoaders) - for _, symbolAndOffset := range loadTOCNames { - parts := strings.SplitN(symbolAndOffset, "\x00", 2) - symbol, offset := parts[0], parts[1] - - funcName := loadTOCFuncName(symbol, offset) - ref := symbol + offset - - w.WriteString(".type " + funcName[2:] + ", @function\n") - w.WriteString(funcName[2:] + ":\n") - w.WriteString(funcName + ":\n") - w.WriteString("\taddis 3, 2, " + ref + "@toc@ha\n") - w.WriteString("\taddi 3, 3, " + ref + "@toc@l\n") - w.WriteString("\tblr\n") - } - - w.WriteString(".LBORINGSSL_external_toc:\n") - w.WriteString(".quad .TOC.-.LBORINGSSL_external_toc\n") - case aarch64: externalNames := sortedSet(d.gotExternalsNeeded) for _, symbol := range externalNames { @@ -2201,10 +1729,6 @@ func localTargetName(name string) string { return ".L" + name + "_local_target" } -func localEntryName(name string) string { - return ".L" + name + "_local_entry" -} - func isSynthesized(symbol string) bool { return strings.HasSuffix(symbol, "_bss_get") || symbol == "OPENSSL_ia32cap_get" || @@ -2260,8 +1784,6 @@ func detectProcessor(input inputFile) processorType { switch instructionName { case "movq", "call", "leaq": return x86_64 - case "addis", "addi", "mflr": - return ppc64le case "str", "bl", "ldr", "st1": return aarch64 } diff --git a/util/fipstools/delocate/delocate_test.go b/util/fipstools/delocate/delocate_test.go index 082b3aa7f4..e3dff546e4 100644 --- a/util/fipstools/delocate/delocate_test.go +++ b/util/fipstools/delocate/delocate_test.go @@ -39,11 +39,6 @@ func (test *delocateTest) Path(file string) string { var delocateTests = []delocateTest{ {"generic-FileDirectives", []string{"in.s"}, "out.s"}, - {"ppc64le-GlobalEntry", []string{"in.s"}, "out.s"}, - {"ppc64le-LoadToR0", []string{"in.s"}, "out.s"}, - {"ppc64le-Sample2", []string{"in.s"}, "out.s"}, - {"ppc64le-Sample", []string{"in.s"}, "out.s"}, - {"ppc64le-TOCWithOffset", []string{"in.s"}, "out.s"}, {"x86_64-Basic", []string{"in.s"}, "out.s"}, {"x86_64-BSS", []string{"in.s"}, "out.s"}, {"x86_64-GOTRewrite", []string{"in.s"}, "out.s"}, diff --git a/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s b/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s deleted file mode 100644 index af1a182cf5..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s +++ /dev/null @@ -1,9 +0,0 @@ - .text -foo: -.LCF0: -0: - addis 2,12,.TOC.-.LCF0@ha - addi 2,2,.TOC.-.LCF0@l - .localentry foo,.-foo -.LVL0: - bl diff --git a/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s b/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s deleted file mode 100644 index d75e2c7f1d..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s +++ /dev/null @@ -1,62 +0,0 @@ -.text -.file 1 "inserted_by_delocate.c" -.loc 1 1 0 -BORINGSSL_bcm_text_start: - .text -.Lfoo_local_target: -foo: -.LCF0: - -0: - -999: - addis 2, 12, .LBORINGSSL_external_toc-999b@ha - addi 2, 2, .LBORINGSSL_external_toc-999b@l - ld 12, 0(2) - add 2, 2, 12 -# WAS addi 2,2,.TOC.-.LCF0@l - .localentry foo,.-foo -.Lfoo_local_entry: -.LVL0: - - bl -.text -.loc 1 2 0 -BORINGSSL_bcm_text_end: -.LBORINGSSL_external_toc: -.quad .TOC.-.LBORINGSSL_external_toc -.type BORINGSSL_bcm_text_hash, @object -.size BORINGSSL_bcm_text_hash, 32 -BORINGSSL_bcm_text_hash: -.byte 0xae -.byte 0x2c -.byte 0xea -.byte 0x2a -.byte 0xbd -.byte 0xa6 -.byte 0xf3 -.byte 0xec -.byte 0x97 -.byte 0x7f -.byte 0x9b -.byte 0xf6 -.byte 0x94 -.byte 0x9a -.byte 0xfc -.byte 0x83 -.byte 0x68 -.byte 0x27 -.byte 0xcb -.byte 0xa0 -.byte 0xa0 -.byte 0x9f -.byte 0x6b -.byte 0x6f -.byte 0xde -.byte 0x52 -.byte 0xcd -.byte 0xe2 -.byte 0xcd -.byte 0xff -.byte 0x31 -.byte 0x80 diff --git a/util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s b/util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s deleted file mode 100644 index 81766dc07e..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s +++ /dev/null @@ -1,4 +0,0 @@ - .text -foo: - addis 22,2,bar@toc@ha - ld 0,bar@toc@l(22) diff --git a/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s b/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s deleted file mode 100644 index dad7603ab0..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s +++ /dev/null @@ -1,72 +0,0 @@ -.text -.file 1 "inserted_by_delocate.c" -.loc 1 1 0 -BORINGSSL_bcm_text_start: - .text -.Lfoo_local_target: -foo: -# WAS addis 22,2,bar@toc@ha -# WAS ld 0,bar@toc@l(22) - addi 1, 1, -288 - mflr 0 - std 0, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc_bar - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 0, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - addi 1, 1, -288 - std 3, -8(1) - mr 3, 0 - ld 0, 0(3) - ld 3, -8(1) - addi 1, 1, 288 -.text -.loc 1 2 0 -BORINGSSL_bcm_text_end: -.type bcm_loadtoc_bar, @function -bcm_loadtoc_bar: -.Lbcm_loadtoc_bar: - addis 3, 2, bar@toc@ha - addi 3, 3, bar@toc@l - blr -.LBORINGSSL_external_toc: -.quad .TOC.-.LBORINGSSL_external_toc -.type BORINGSSL_bcm_text_hash, @object -.size BORINGSSL_bcm_text_hash, 32 -BORINGSSL_bcm_text_hash: -.byte 0xae -.byte 0x2c -.byte 0xea -.byte 0x2a -.byte 0xbd -.byte 0xa6 -.byte 0xf3 -.byte 0xec -.byte 0x97 -.byte 0x7f -.byte 0x9b -.byte 0xf6 -.byte 0x94 -.byte 0x9a -.byte 0xfc -.byte 0x83 -.byte 0x68 -.byte 0x27 -.byte 0xcb -.byte 0xa0 -.byte 0xa0 -.byte 0x9f -.byte 0x6b -.byte 0x6f -.byte 0xde -.byte 0x52 -.byte 0xcd -.byte 0xe2 -.byte 0xcd -.byte 0xff -.byte 0x31 -.byte 0x80 diff --git a/util/fipstools/delocate/testdata/ppc64le-Sample/in.s b/util/fipstools/delocate/testdata/ppc64le-Sample/in.s deleted file mode 100644 index 6e7422ab54..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-Sample/in.s +++ /dev/null @@ -1,161 +0,0 @@ - .file "foo.c" - .abiversion 2 - .section ".toc","aw" - .section ".text" - .section .rodata - .align 3 - .type kString, @object - .size kString, 12 -kString: - .string "hello world" - .globl kExportedString - .align 3 - .type kExportedString, @object - .size kExportedString, 26 -kExportedString: - .string "hello world, more visibly" - .align 2 - .type kGiantArray, @object - .size kGiantArray, 400000 -kGiantArray: - .long 1 - .long 0 - .zero 399992 - .lcomm bss,20,4 - .type bss, @object - .align 3 -.LC1: - .string "kString is %p\n" - .align 3 -.LC2: - .string "kExportedString is %p\n" - .align 3 -.LC4: - .string "function is %p\n" - .align 3 -.LC5: - .string "exported_function is %p\n" - .align 3 -.LC7: - .string "&kString[5] is %p\n" - .align 3 -.LC9: - .string "&kGiantArray[0x12345] is %p\n" - .section ".toc","aw" -.LC0: - .quad stderr -.LC3: - .quad kExportedString -.LC6: - .quad exported_function -.LC8: - .quad kString+5 -.LC10: - .quad kGiantArray+298260 - .section ".text" - .align 2 - .type function, @function -function: -0: addis 2,12,.TOC.-0b@ha - addi 2,2,.TOC.-0b@l - .localentry function,.-function - mflr 0 - std 0,16(1) - std 31,-8(1) - stdu 1,-112(1) - mr 31,1 - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC1@toc@ha - addi 4,4,.LC1@toc@l - addis 5,2,kString@toc@ha - addi 5,5,kString@toc@l - bl fprintf - nop - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC2@toc@ha - addi 4,4,.LC2@toc@l - addis 9,2,.LC3@toc@ha - ld 5,.LC3@toc@l(9) - bl fprintf - nop - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC4@toc@ha - addi 4,4,.LC4@toc@l - addis 5,2,function@toc@ha - addi 5,5,function@toc@l - bl fprintf - nop - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC5@toc@ha - addi 4,4,.LC5@toc@l - addis 9,2,.LC6@toc@ha - ld 5,.LC6@toc@l(9) - bl fprintf - nop - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC7@toc@ha - addi 4,4,.LC7@toc@l - addis 9,2,.LC8@toc@ha - ld 5,.LC8@toc@l(9) - bl fprintf - nop - addis 10,2,.LC0@toc@ha - ld 9,.LC0@toc@l(10) - ld 9,0(9) - mr 3,9 - addis 4,2,.LC9@toc@ha - addi 4,4,.LC9@toc@l - addis 9,2,.LC10@toc@ha - ld 5,.LC10@toc@l(9) - bl fprintf - nop - bl exported_function - nop - mr 3,9 - addi 1,31,112 - ld 0,16(1) - mtlr 0 - ld 31,-8(1) - blr - .long 0 - .byte 0,0,0,1,128,1,0,1 - .size function,.-function - .align 2 - .globl exported_function - .type exported_function, @function -exported_function: -0: addis 2,12,.TOC.-0b@ha - addi 2,2,.TOC.-0b@l - .localentry exported_function,.-exported_function - mflr 0 - std 0,16(1) - std 31,-8(1) - stdu 1,-48(1) - mr 31,1 - bl function - mr 3,9 - addi 1,31,48 - ld 0,16(1) - mtlr 0 - ld 31,-8(1) - blr - .long 0 - .byte 0,0,0,1,128,1,0,1 - .size exported_function,.-exported_function - .ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2" - .section .note.GNU-stack,"",@progbits diff --git a/util/fipstools/delocate/testdata/ppc64le-Sample/out.s b/util/fipstools/delocate/testdata/ppc64le-Sample/out.s deleted file mode 100644 index 798bcf5298..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-Sample/out.s +++ /dev/null @@ -1,552 +0,0 @@ -.text -.file 1 "inserted_by_delocate.c" -.loc 1 1 0 -BORINGSSL_bcm_text_start: - .file "foo.c" - .abiversion 2 - .section ".toc","aw" -# WAS .section ".text" -.text -# WAS .section .rodata -.text - .align 3 - .type kString, @object - .size kString, 12 -.LkString_local_target: -kString: - .string "hello world" - .globl kExportedString - .align 3 - .type kExportedString, @object - .size kExportedString, 26 -.LkExportedString_local_target: -kExportedString: - .string "hello world, more visibly" - .align 2 - .type kGiantArray, @object - .size kGiantArray, 400000 -.LkGiantArray_local_target: -kGiantArray: - .long 1 - .long 0 - .zero 399992 - .lcomm bss,20,4 - .type bss, @object - .align 3 -.LC1: - - .string "kString is %p\n" - .align 3 -.LC2: - - .string "kExportedString is %p\n" - .align 3 -.LC4: - - .string "function is %p\n" - .align 3 -.LC5: - - .string "exported_function is %p\n" - .align 3 -.LC7: - - .string "&kString[5] is %p\n" - .align 3 -.LC9: - - .string "&kGiantArray[0x12345] is %p\n" - .section ".toc","aw" -.LC0: - - .quad stderr -.LC3: - - .quad kExportedString -.LC6: - - .quad exported_function -.LC8: - - .quad kString+5 -.LC10: - - .quad kGiantArray+298260 -# WAS .section ".text" -.text - .align 2 - .type function, @function -.Lfunction_local_target: -function: -0: -999: - addis 2, 12, .LBORINGSSL_external_toc-999b@ha - addi 2, 2, .LBORINGSSL_external_toc-999b@l - ld 12, 0(2) - add 2, 2, 12 -# WAS addi 2,2,.TOC.-0b@l - .localentry function,.-function -.Lfunction_local_entry: - mflr 0 - std 0,16(1) - std 31,-8(1) - stdu 1,-112(1) - mr 31,1 -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC1@toc@ha -# WAS addi 4,4,.LC1@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC1 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 5,2,kString@toc@ha -# WAS addi 5,5,kString@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LkString_local_target - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC2@toc@ha -# WAS addi 4,4,.LC2@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC2 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 9,2,.LC3@toc@ha -# WAS ld 5,.LC3@toc@l(9) - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC3 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 5, 0(5) -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC4@toc@ha -# WAS addi 4,4,.LC4@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC4 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 5,2,function@toc@ha -# WAS addi 5,5,function@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfunction_local_target - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC5@toc@ha -# WAS addi 4,4,.LC5@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC5 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 9,2,.LC6@toc@ha -# WAS ld 5,.LC6@toc@l(9) - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC6 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 5, 0(5) -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC7@toc@ha -# WAS addi 4,4,.LC7@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC7 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 9,2,.LC8@toc@ha -# WAS ld 5,.LC8@toc@l(9) - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC8 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 5, 0(5) -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS addis 10,2,.LC0@toc@ha -# WAS ld 9,.LC0@toc@l(10) - addi 1, 1, -288 - mflr 9 - std 9, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 9, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 9, 0(9) - ld 9,0(9) - mr 3,9 -# WAS addis 4,2,.LC9@toc@ha -# WAS addi 4,4,.LC9@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC9 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 9,2,.LC10@toc@ha -# WAS ld 5,.LC10@toc@l(9) - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC10 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 5, 0(5) -# WAS bl fprintf - bl bcm_redirector_fprintf - ld 2, 24(1) - nop -# WAS bl exported_function - bl .Lexported_function_local_entry - nop - mr 3,9 - addi 1,31,112 - ld 0,16(1) - mtlr 0 - ld 31,-8(1) - blr - .long 0 - .byte 0,0,0,1,128,1,0,1 - .size function,.-function - .align 2 - .globl exported_function - .type exported_function, @function -.Lexported_function_local_target: -exported_function: -0: -999: - addis 2, 12, .LBORINGSSL_external_toc-999b@ha - addi 2, 2, .LBORINGSSL_external_toc-999b@l - ld 12, 0(2) - add 2, 2, 12 -# WAS addi 2,2,.TOC.-0b@l - .localentry exported_function,.-exported_function -.Lexported_function_local_entry: - mflr 0 - std 0,16(1) - std 31,-8(1) - stdu 1,-48(1) - mr 31,1 -# WAS bl function - bl .Lfunction_local_entry - mr 3,9 - addi 1,31,48 - ld 0,16(1) - mtlr 0 - ld 31,-8(1) - blr - .long 0 - .byte 0,0,0,1,128,1,0,1 - .size exported_function,.-exported_function - .ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2" - .section .note.GNU-stack,"",@progbits -.text -.loc 1 2 0 -BORINGSSL_bcm_text_end: -.section ".toc", "aw" -.Lredirector_toc_fprintf: -.quad fprintf -.text -.type bcm_redirector_fprintf, @function -bcm_redirector_fprintf: - std 2, 24(1) - addis 12, 2, .Lredirector_toc_fprintf@toc@ha - ld 12, .Lredirector_toc_fprintf@toc@l(12) - mtctr 12 - bctr -.type bss_bss_get, @function -bss_bss_get: - addis 3, 2, bss@toc@ha - addi 3, 3, bss@toc@l - blr -.type bcm_loadtoc__dot_LC0, @function -bcm_loadtoc__dot_LC0: -.Lbcm_loadtoc__dot_LC0: - addis 3, 2, .LC0@toc@ha - addi 3, 3, .LC0@toc@l - blr -.type bcm_loadtoc__dot_LC1, @function -bcm_loadtoc__dot_LC1: -.Lbcm_loadtoc__dot_LC1: - addis 3, 2, .LC1@toc@ha - addi 3, 3, .LC1@toc@l - blr -.type bcm_loadtoc__dot_LC10, @function -bcm_loadtoc__dot_LC10: -.Lbcm_loadtoc__dot_LC10: - addis 3, 2, .LC10@toc@ha - addi 3, 3, .LC10@toc@l - blr -.type bcm_loadtoc__dot_LC2, @function -bcm_loadtoc__dot_LC2: -.Lbcm_loadtoc__dot_LC2: - addis 3, 2, .LC2@toc@ha - addi 3, 3, .LC2@toc@l - blr -.type bcm_loadtoc__dot_LC3, @function -bcm_loadtoc__dot_LC3: -.Lbcm_loadtoc__dot_LC3: - addis 3, 2, .LC3@toc@ha - addi 3, 3, .LC3@toc@l - blr -.type bcm_loadtoc__dot_LC4, @function -bcm_loadtoc__dot_LC4: -.Lbcm_loadtoc__dot_LC4: - addis 3, 2, .LC4@toc@ha - addi 3, 3, .LC4@toc@l - blr -.type bcm_loadtoc__dot_LC5, @function -bcm_loadtoc__dot_LC5: -.Lbcm_loadtoc__dot_LC5: - addis 3, 2, .LC5@toc@ha - addi 3, 3, .LC5@toc@l - blr -.type bcm_loadtoc__dot_LC6, @function -bcm_loadtoc__dot_LC6: -.Lbcm_loadtoc__dot_LC6: - addis 3, 2, .LC6@toc@ha - addi 3, 3, .LC6@toc@l - blr -.type bcm_loadtoc__dot_LC7, @function -bcm_loadtoc__dot_LC7: -.Lbcm_loadtoc__dot_LC7: - addis 3, 2, .LC7@toc@ha - addi 3, 3, .LC7@toc@l - blr -.type bcm_loadtoc__dot_LC8, @function -bcm_loadtoc__dot_LC8: -.Lbcm_loadtoc__dot_LC8: - addis 3, 2, .LC8@toc@ha - addi 3, 3, .LC8@toc@l - blr -.type bcm_loadtoc__dot_LC9, @function -bcm_loadtoc__dot_LC9: -.Lbcm_loadtoc__dot_LC9: - addis 3, 2, .LC9@toc@ha - addi 3, 3, .LC9@toc@l - blr -.type bcm_loadtoc__dot_Lfunction_local_target, @function -bcm_loadtoc__dot_Lfunction_local_target: -.Lbcm_loadtoc__dot_Lfunction_local_target: - addis 3, 2, .Lfunction_local_target@toc@ha - addi 3, 3, .Lfunction_local_target@toc@l - blr -.type bcm_loadtoc__dot_LkString_local_target, @function -bcm_loadtoc__dot_LkString_local_target: -.Lbcm_loadtoc__dot_LkString_local_target: - addis 3, 2, .LkString_local_target@toc@ha - addi 3, 3, .LkString_local_target@toc@l - blr -.LBORINGSSL_external_toc: -.quad .TOC.-.LBORINGSSL_external_toc -.type BORINGSSL_bcm_text_hash, @object -.size BORINGSSL_bcm_text_hash, 32 -BORINGSSL_bcm_text_hash: -.byte 0xae -.byte 0x2c -.byte 0xea -.byte 0x2a -.byte 0xbd -.byte 0xa6 -.byte 0xf3 -.byte 0xec -.byte 0x97 -.byte 0x7f -.byte 0x9b -.byte 0xf6 -.byte 0x94 -.byte 0x9a -.byte 0xfc -.byte 0x83 -.byte 0x68 -.byte 0x27 -.byte 0xcb -.byte 0xa0 -.byte 0xa0 -.byte 0x9f -.byte 0x6b -.byte 0x6f -.byte 0xde -.byte 0x52 -.byte 0xcd -.byte 0xe2 -.byte 0xcd -.byte 0xff -.byte 0x31 -.byte 0x80 diff --git a/util/fipstools/delocate/testdata/ppc64le-Sample2/in.s b/util/fipstools/delocate/testdata/ppc64le-Sample2/in.s deleted file mode 100644 index eb856269bc..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-Sample2/in.s +++ /dev/null @@ -1,226 +0,0 @@ - .file "foo.c" - .abiversion 2 - .section ".toc","aw" - .section ".text" - .section ".toc","aw" -.LC0: - .quad stderr -.LC3: - .quad kExportedString -.LC6: - .quad exported_function - .section ".text" - .align 2 - .p2align 4,,15 - .globl exported_function - .type exported_function, @function -exported_function: -0: addis 2,12,.TOC.-0b@ha - addi 2,2,.TOC.-0b@l - .localentry exported_function,.-exported_function - mflr 0 - std 19,-104(1) - std 20,-96(1) - std 21,-88(1) - std 22,-80(1) - addis 21,2,.LC1@toc@ha - addis 22,2,.LC2@toc@ha - std 23,-72(1) - std 24,-64(1) - addis 23,2,.LC4@toc@ha - addis 24,2,function@toc@ha - std 25,-56(1) - std 26,-48(1) - addis 25,2,.LC5@toc@ha - addis 26,2,.LC7@toc@ha - std 27,-40(1) - std 28,-32(1) - addis 28,2,.LC8@toc@ha - addi 21,21,.LC1@toc@l - std 29,-24(1) - std 30,-16(1) - addis 29,2,.LANCHOR0@toc@ha - addi 22,22,.LC2@toc@l - std 31,-8(1) - std 0,16(1) - addi 29,29,.LANCHOR0@toc@l - addi 23,23,.LC4@toc@l - stdu 1,-208(1) - addis 31,2,.LC0@toc@ha # gpr load fusion, type long - ld 31,.LC0@toc@l(31) - addis 19,2,.LC3@toc@ha # gpr load fusion, type long - ld 19,.LC3@toc@l(19) - addis 30,29,0x5 - addi 24,24,function@toc@l - addis 20,2,.LC6@toc@ha # gpr load fusion, type long - ld 20,.LC6@toc@l(20) - addi 25,25,.LC5@toc@l - addi 26,26,.LC7@toc@l - addi 27,29,5 - addi 28,28,.LC8@toc@l - addi 30,30,-29404 - .p2align 4,,15 -.L2: - ld 3,0(31) - mr 5,21 - mr 6,29 - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - mr 5,22 - mr 6,19 - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - mr 5,23 - mr 6,24 - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - mr 5,25 - mr 6,20 - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - mr 5,26 - mr 6,27 - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - li 4,1 - mr 5,28 - mr 6,30 - bl __fprintf_chk - nop - b .L2 - .long 0 - .byte 0,0,0,1,128,13,0,0 - .size exported_function,.-exported_function - .section ".toc","aw" - .set .LC11,.LC0 - .set .LC12,.LC3 - .set .LC13,.LC6 - .section ".text" - .align 2 - .p2align 4,,15 - .type function, @function -function: -0: addis 2,12,.TOC.-0b@ha - addi 2,2,.TOC.-0b@l - .localentry function,.-function - mflr 0 - std 31,-8(1) - addis 31,2,.LC11@toc@ha # gpr load fusion, type long - ld 31,.LC11@toc@l(31) - addis 5,2,.LC1@toc@ha - std 30,-16(1) - addis 30,2,.LANCHOR0@toc@ha - addi 5,5,.LC1@toc@l - addi 30,30,.LANCHOR0@toc@l - li 4,1 - mr 6,30 - std 0,16(1) - stdu 1,-112(1) - ld 3,0(31) - bl __fprintf_chk - nop - addis 6,2,.LC12@toc@ha # gpr load fusion, type long - ld 6,.LC12@toc@l(6) - ld 3,0(31) - addis 5,2,.LC2@toc@ha - li 4,1 - addi 5,5,.LC2@toc@l - bl __fprintf_chk - nop - ld 3,0(31) - addis 5,2,.LC4@toc@ha - addis 6,2,function@toc@ha - addi 5,5,.LC4@toc@l - addi 6,6,function@toc@l - li 4,1 - bl __fprintf_chk - nop - addis 6,2,.LC13@toc@ha # gpr load fusion, type long - ld 6,.LC13@toc@l(6) - ld 3,0(31) - addis 5,2,.LC5@toc@ha - li 4,1 - addi 5,5,.LC5@toc@l - bl __fprintf_chk - nop - ld 3,0(31) - addis 5,2,.LC7@toc@ha - addi 6,30,5 - addi 5,5,.LC7@toc@l - li 4,1 - bl __fprintf_chk - nop - ld 3,0(31) - addis 6,30,0x5 - addis 5,2,.LC8@toc@ha - li 4,1 - addi 5,5,.LC8@toc@l - addi 6,6,-29404 - bl __fprintf_chk - nop - bl exported_function - nop - addi 1,1,112 - ld 0,16(1) - ld 30,-16(1) - ld 31,-8(1) - mtlr 0 - blr - .long 0 - .byte 0,0,0,1,128,2,0,0 - .size function,.-function - .globl kExportedString - .section .rodata - .align 4 - .set .LANCHOR0,. + 0 - .type kString, @object - .size kString, 12 -kString: - .string "hello world" - .zero 4 - .type kGiantArray, @object - .size kGiantArray, 400000 -kGiantArray: - .long 1 - .long 0 - .zero 399992 - .type kExportedString, @object - .size kExportedString, 26 -kExportedString: - .string "hello world, more visibly" - .section .rodata.str1.8,"aMS",@progbits,1 - .align 3 -.LC1: - .string "kString is %p\n" - .zero 1 -.LC2: - .string "kExportedString is %p\n" - .zero 1 -.LC4: - .string "function is %p\n" -.LC5: - .string "exported_function is %p\n" - .zero 7 -.LC7: - .string "&kString[5] is %p\n" - .zero 5 -.LC8: - .string "&kGiantArray[0x12345] is %p\n" - .section ".bss" - .align 2 - .type bss, @object - .size bss, 20 -bss: - .zero 20 - .ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2" - .section .note.GNU-stack,"",@progbits diff --git a/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s b/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s deleted file mode 100644 index 643974053c..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s +++ /dev/null @@ -1,677 +0,0 @@ -.text -.file 1 "inserted_by_delocate.c" -.loc 1 1 0 -BORINGSSL_bcm_text_start: - .file "foo.c" - .abiversion 2 - .section ".toc","aw" -# WAS .section ".text" -.text - .section ".toc","aw" -.LC0: - - .quad stderr -.LC3: - - .quad kExportedString -.LC6: - - .quad exported_function -# WAS .section ".text" -.text - .align 2 - .p2align 4,,15 - .globl exported_function - .type exported_function, @function -.Lexported_function_local_target: -exported_function: -0: -999: - addis 2, 12, .LBORINGSSL_external_toc-999b@ha - addi 2, 2, .LBORINGSSL_external_toc-999b@l - ld 12, 0(2) - add 2, 2, 12 -# WAS addi 2,2,.TOC.-0b@l - .localentry exported_function,.-exported_function -.Lexported_function_local_entry: - mflr 0 - std 19,-104(1) - std 20,-96(1) - std 21,-88(1) - std 22,-80(1) -# WAS addis 21,2,.LC1@toc@ha -# WAS addis 22,2,.LC2@toc@ha - std 23,-72(1) - std 24,-64(1) -# WAS addis 23,2,.LC4@toc@ha -# WAS addis 24,2,function@toc@ha - std 25,-56(1) - std 26,-48(1) -# WAS addis 25,2,.LC5@toc@ha -# WAS addis 26,2,.LC7@toc@ha - std 27,-40(1) - std 28,-32(1) -# WAS addis 28,2,.LC8@toc@ha -# WAS addi 21,21,.LC1@toc@l - addi 1, 1, -288 - mflr 21 - std 21, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC1 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 21, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - std 29,-24(1) - std 30,-16(1) -# WAS addis 29,2,.LANCHOR0@toc@ha -# WAS addi 22,22,.LC2@toc@l - addi 1, 1, -288 - mflr 22 - std 22, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC2 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 22, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - std 31,-8(1) - std 0,16(1) -# WAS addi 29,29,.LANCHOR0@toc@l - addi 1, 1, -288 - mflr 29 - std 29, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LANCHOR0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 29, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addi 23,23,.LC4@toc@l - addi 1, 1, -288 - mflr 23 - std 23, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC4 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 23, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - stdu 1,-208(1) -# WAS addis 31,2,.LC0@toc@ha # gpr load fusion, type long -# WAS ld 31,.LC0@toc@l(31) - addi 1, 1, -288 - mflr 31 - std 31, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 31, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 31, 0(31) -# WAS addis 19,2,.LC3@toc@ha # gpr load fusion, type long -# WAS ld 19,.LC3@toc@l(19) - addi 1, 1, -288 - mflr 19 - std 19, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC3 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 19, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 19, 0(19) - addis 30,29,0x5 -# WAS addi 24,24,function@toc@l - addi 1, 1, -288 - mflr 24 - std 24, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfunction_local_target - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 24, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addis 20,2,.LC6@toc@ha # gpr load fusion, type long -# WAS ld 20,.LC6@toc@l(20) - addi 1, 1, -288 - mflr 20 - std 20, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC6 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 20, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 20, 0(20) -# WAS addi 25,25,.LC5@toc@l - addi 1, 1, -288 - mflr 25 - std 25, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC5 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 25, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addi 26,26,.LC7@toc@l - addi 1, 1, -288 - mflr 26 - std 26, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC7 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 26, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - addi 27,29,5 -# WAS addi 28,28,.LC8@toc@l - addi 1, 1, -288 - mflr 28 - std 28, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC8 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 28, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - addi 30,30,-29404 - .p2align 4,,15 -.L2: - - ld 3,0(31) - mr 5,21 - mr 6,29 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - mr 5,22 - mr 6,19 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - mr 5,23 - mr 6,24 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - mr 5,25 - mr 6,20 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - mr 5,26 - mr 6,27 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - li 4,1 - mr 5,28 - mr 6,30 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - b .L2 - .long 0 - .byte 0,0,0,1,128,13,0,0 - .size exported_function,.-exported_function - .section ".toc","aw" - .set .LC11,.LC0 - .set .LC12,.LC3 - .set .LC13,.LC6 -# WAS .section ".text" -.text - .align 2 - .p2align 4,,15 - .type function, @function -.Lfunction_local_target: -function: -0: -999: - addis 2, 12, .LBORINGSSL_external_toc-999b@ha - addi 2, 2, .LBORINGSSL_external_toc-999b@l - ld 12, 0(2) - add 2, 2, 12 -# WAS addi 2,2,.TOC.-0b@l - .localentry function,.-function -.Lfunction_local_entry: - mflr 0 - std 31,-8(1) -# WAS addis 31,2,.LC11@toc@ha # gpr load fusion, type long -# WAS ld 31,.LC11@toc@l(31) - addi 1, 1, -288 - mflr 31 - std 31, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC11 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 31, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 31, 0(31) -# WAS addis 5,2,.LC1@toc@ha - std 30,-16(1) -# WAS addis 30,2,.LANCHOR0@toc@ha -# WAS addi 5,5,.LC1@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC1 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addi 30,30,.LANCHOR0@toc@l - addi 1, 1, -288 - mflr 30 - std 30, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LANCHOR0 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 30, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - li 4,1 - mr 6,30 - std 0,16(1) - stdu 1,-112(1) - ld 3,0(31) -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop -# WAS addis 6,2,.LC12@toc@ha # gpr load fusion, type long -# WAS ld 6,.LC12@toc@l(6) - addi 1, 1, -288 - mflr 6 - std 6, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC12 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 6, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 6, 0(6) - ld 3,0(31) -# WAS addis 5,2,.LC2@toc@ha - li 4,1 -# WAS addi 5,5,.LC2@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC2 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) -# WAS addis 5,2,.LC4@toc@ha -# WAS addis 6,2,function@toc@ha -# WAS addi 5,5,.LC4@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC4 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS addi 6,6,function@toc@l - addi 1, 1, -288 - mflr 6 - std 6, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfunction_local_target - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 6, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop -# WAS addis 6,2,.LC13@toc@ha # gpr load fusion, type long -# WAS ld 6,.LC13@toc@l(6) - addi 1, 1, -288 - mflr 6 - std 6, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC13 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 6, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 6, 0(6) - ld 3,0(31) -# WAS addis 5,2,.LC5@toc@ha - li 4,1 -# WAS addi 5,5,.LC5@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC5 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) -# WAS addis 5,2,.LC7@toc@ha - addi 6,30,5 -# WAS addi 5,5,.LC7@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC7 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - li 4,1 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop - ld 3,0(31) - addis 6,30,0x5 -# WAS addis 5,2,.LC8@toc@ha - li 4,1 -# WAS addi 5,5,.LC8@toc@l - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_LC8 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - addi 6,6,-29404 -# WAS bl __fprintf_chk - bl bcm_redirector___fprintf_chk - ld 2, 24(1) - nop -# WAS bl exported_function - bl .Lexported_function_local_entry - nop - addi 1,1,112 - ld 0,16(1) - ld 30,-16(1) - ld 31,-8(1) - mtlr 0 - blr - .long 0 - .byte 0,0,0,1,128,2,0,0 - .size function,.-function - .globl kExportedString -# WAS .section .rodata -.text - .align 4 - .set .LANCHOR0,. + 0 - .type kString, @object - .size kString, 12 -.LkString_local_target: -kString: - .string "hello world" - .zero 4 - .type kGiantArray, @object - .size kGiantArray, 400000 -.LkGiantArray_local_target: -kGiantArray: - .long 1 - .long 0 - .zero 399992 - .type kExportedString, @object - .size kExportedString, 26 -.LkExportedString_local_target: -kExportedString: - .string "hello world, more visibly" -# WAS .section .rodata.str1.8,"aMS",@progbits,1 -.text - .align 3 -.LC1: - - .string "kString is %p\n" - .zero 1 -.LC2: - - .string "kExportedString is %p\n" - .zero 1 -.LC4: - - .string "function is %p\n" -.LC5: - - .string "exported_function is %p\n" - .zero 7 -.LC7: - - .string "&kString[5] is %p\n" - .zero 5 -.LC8: - - .string "&kGiantArray[0x12345] is %p\n" - .section ".bss" - .align 2 - .type bss, @object - .size bss, 20 -bss: -.Lbss_local_target: - - .zero 20 - .ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2" - .section .note.GNU-stack,"",@progbits -.text -.loc 1 2 0 -BORINGSSL_bcm_text_end: -.section ".toc", "aw" -.Lredirector_toc___fprintf_chk: -.quad __fprintf_chk -.text -.type bcm_redirector___fprintf_chk, @function -bcm_redirector___fprintf_chk: - std 2, 24(1) - addis 12, 2, .Lredirector_toc___fprintf_chk@toc@ha - ld 12, .Lredirector_toc___fprintf_chk@toc@l(12) - mtctr 12 - bctr -.type bss_bss_get, @function -bss_bss_get: - addis 3, 2, .Lbss_local_target@toc@ha - addi 3, 3, .Lbss_local_target@toc@l - blr -.type bcm_loadtoc__dot_LANCHOR0, @function -bcm_loadtoc__dot_LANCHOR0: -.Lbcm_loadtoc__dot_LANCHOR0: - addis 3, 2, .LANCHOR0@toc@ha - addi 3, 3, .LANCHOR0@toc@l - blr -.type bcm_loadtoc__dot_LC0, @function -bcm_loadtoc__dot_LC0: -.Lbcm_loadtoc__dot_LC0: - addis 3, 2, .LC0@toc@ha - addi 3, 3, .LC0@toc@l - blr -.type bcm_loadtoc__dot_LC1, @function -bcm_loadtoc__dot_LC1: -.Lbcm_loadtoc__dot_LC1: - addis 3, 2, .LC1@toc@ha - addi 3, 3, .LC1@toc@l - blr -.type bcm_loadtoc__dot_LC11, @function -bcm_loadtoc__dot_LC11: -.Lbcm_loadtoc__dot_LC11: - addis 3, 2, .LC11@toc@ha - addi 3, 3, .LC11@toc@l - blr -.type bcm_loadtoc__dot_LC12, @function -bcm_loadtoc__dot_LC12: -.Lbcm_loadtoc__dot_LC12: - addis 3, 2, .LC12@toc@ha - addi 3, 3, .LC12@toc@l - blr -.type bcm_loadtoc__dot_LC13, @function -bcm_loadtoc__dot_LC13: -.Lbcm_loadtoc__dot_LC13: - addis 3, 2, .LC13@toc@ha - addi 3, 3, .LC13@toc@l - blr -.type bcm_loadtoc__dot_LC2, @function -bcm_loadtoc__dot_LC2: -.Lbcm_loadtoc__dot_LC2: - addis 3, 2, .LC2@toc@ha - addi 3, 3, .LC2@toc@l - blr -.type bcm_loadtoc__dot_LC3, @function -bcm_loadtoc__dot_LC3: -.Lbcm_loadtoc__dot_LC3: - addis 3, 2, .LC3@toc@ha - addi 3, 3, .LC3@toc@l - blr -.type bcm_loadtoc__dot_LC4, @function -bcm_loadtoc__dot_LC4: -.Lbcm_loadtoc__dot_LC4: - addis 3, 2, .LC4@toc@ha - addi 3, 3, .LC4@toc@l - blr -.type bcm_loadtoc__dot_LC5, @function -bcm_loadtoc__dot_LC5: -.Lbcm_loadtoc__dot_LC5: - addis 3, 2, .LC5@toc@ha - addi 3, 3, .LC5@toc@l - blr -.type bcm_loadtoc__dot_LC6, @function -bcm_loadtoc__dot_LC6: -.Lbcm_loadtoc__dot_LC6: - addis 3, 2, .LC6@toc@ha - addi 3, 3, .LC6@toc@l - blr -.type bcm_loadtoc__dot_LC7, @function -bcm_loadtoc__dot_LC7: -.Lbcm_loadtoc__dot_LC7: - addis 3, 2, .LC7@toc@ha - addi 3, 3, .LC7@toc@l - blr -.type bcm_loadtoc__dot_LC8, @function -bcm_loadtoc__dot_LC8: -.Lbcm_loadtoc__dot_LC8: - addis 3, 2, .LC8@toc@ha - addi 3, 3, .LC8@toc@l - blr -.type bcm_loadtoc__dot_Lfunction_local_target, @function -bcm_loadtoc__dot_Lfunction_local_target: -.Lbcm_loadtoc__dot_Lfunction_local_target: - addis 3, 2, .Lfunction_local_target@toc@ha - addi 3, 3, .Lfunction_local_target@toc@l - blr -.LBORINGSSL_external_toc: -.quad .TOC.-.LBORINGSSL_external_toc -.type BORINGSSL_bcm_text_hash, @object -.size BORINGSSL_bcm_text_hash, 32 -BORINGSSL_bcm_text_hash: -.byte 0xae -.byte 0x2c -.byte 0xea -.byte 0x2a -.byte 0xbd -.byte 0xa6 -.byte 0xf3 -.byte 0xec -.byte 0x97 -.byte 0x7f -.byte 0x9b -.byte 0xf6 -.byte 0x94 -.byte 0x9a -.byte 0xfc -.byte 0x83 -.byte 0x68 -.byte 0x27 -.byte 0xcb -.byte 0xa0 -.byte 0xa0 -.byte 0x9f -.byte 0x6b -.byte 0x6f -.byte 0xde -.byte 0x52 -.byte 0xcd -.byte 0xe2 -.byte 0xcd -.byte 0xff -.byte 0x31 -.byte 0x80 diff --git a/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s b/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s deleted file mode 100644 index 94ea211115..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s +++ /dev/null @@ -1,23 +0,0 @@ - .text -foo: - # TOC references may have offsets. - addis 3, 2, 5+foo@toc@ha - addi 3, 3, 10+foo@toc@l - - addis 3, 2, 15+foo@toc@ha - addi 3, 3, 20+foo@toc@l - - addis 4, 2, foo@toc@ha - addi 4, 4, foo@toc@l - - addis 5, 2, 5+foo@toc@ha - ld 5, 10+foo@toc@l(5) - - addis 4, 2, foo-10@toc@ha - addi 4, 4, foo-10@toc@l - - addis 4, 2, foo@toc@ha+25 - addi 4, 4, foo@toc@l+25 - - addis 4, 2, 1+foo-2@toc@ha+3 - addi 4, 4, 1+foo-2@toc@l+3 diff --git a/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s b/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s deleted file mode 100644 index fc55ef2073..0000000000 --- a/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s +++ /dev/null @@ -1,178 +0,0 @@ -.text -.file 1 "inserted_by_delocate.c" -.loc 1 1 0 -BORINGSSL_bcm_text_start: - .text -.Lfoo_local_target: -foo: - # TOC references may have offsets. -# WAS addis 3, 2, 5+foo@toc@ha -# WAS addi 3, 3, 10+foo@toc@l - addi 1, 1, -288 - mflr 3 - std 3, -8(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__plus_10 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 3, -24(1) - addi 1, 1, 288 - -# WAS addis 3, 2, 15+foo@toc@ha -# WAS addi 3, 3, 20+foo@toc@l - addi 1, 1, -288 - mflr 3 - std 3, -8(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__plus_20 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 3, -24(1) - addi 1, 1, 288 - -# WAS addis 4, 2, foo@toc@ha -# WAS addi 4, 4, foo@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - -# WAS addis 5, 2, 5+foo@toc@ha -# WAS ld 5, 10+foo@toc@l(5) - addi 1, 1, -288 - mflr 5 - std 5, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__plus_10 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 5, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - ld 5, 0(5) - -# WAS addis 4, 2, foo-10@toc@ha -# WAS addi 4, 4, foo-10@toc@l - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__minus_10 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - -# WAS addis 4, 2, foo@toc@ha+25 -# WAS addi 4, 4, foo@toc@l+25 - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__plus_25 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 - -# WAS addis 4, 2, 1+foo-2@toc@ha+3 -# WAS addi 4, 4, 1+foo-2@toc@l+3 - addi 1, 1, -288 - mflr 4 - std 4, -8(1) - std 3, -16(1) - bl .Lbcm_loadtoc__dot_Lfoo_local_target__plus_1_minus_2_plus_3 - std 3, -24(1) - ld 3, -8(1) - mtlr 3 - ld 4, -24(1) - ld 3, -16(1) - addi 1, 1, 288 -.text -.loc 1 2 0 -BORINGSSL_bcm_text_end: -.type bcm_loadtoc__dot_Lfoo_local_target, @function -bcm_loadtoc__dot_Lfoo_local_target: -.Lbcm_loadtoc__dot_Lfoo_local_target: - addis 3, 2, .Lfoo_local_target@toc@ha - addi 3, 3, .Lfoo_local_target@toc@l - blr -.type bcm_loadtoc__dot_Lfoo_local_target__plus_1_minus_2_plus_3, @function -bcm_loadtoc__dot_Lfoo_local_target__plus_1_minus_2_plus_3: -.Lbcm_loadtoc__dot_Lfoo_local_target__plus_1_minus_2_plus_3: - addis 3, 2, .Lfoo_local_target+1-2+3@toc@ha - addi 3, 3, .Lfoo_local_target+1-2+3@toc@l - blr -.type bcm_loadtoc__dot_Lfoo_local_target__plus_10, @function -bcm_loadtoc__dot_Lfoo_local_target__plus_10: -.Lbcm_loadtoc__dot_Lfoo_local_target__plus_10: - addis 3, 2, .Lfoo_local_target+10@toc@ha - addi 3, 3, .Lfoo_local_target+10@toc@l - blr -.type bcm_loadtoc__dot_Lfoo_local_target__plus_20, @function -bcm_loadtoc__dot_Lfoo_local_target__plus_20: -.Lbcm_loadtoc__dot_Lfoo_local_target__plus_20: - addis 3, 2, .Lfoo_local_target+20@toc@ha - addi 3, 3, .Lfoo_local_target+20@toc@l - blr -.type bcm_loadtoc__dot_Lfoo_local_target__plus_25, @function -bcm_loadtoc__dot_Lfoo_local_target__plus_25: -.Lbcm_loadtoc__dot_Lfoo_local_target__plus_25: - addis 3, 2, .Lfoo_local_target+25@toc@ha - addi 3, 3, .Lfoo_local_target+25@toc@l - blr -.type bcm_loadtoc__dot_Lfoo_local_target__minus_10, @function -bcm_loadtoc__dot_Lfoo_local_target__minus_10: -.Lbcm_loadtoc__dot_Lfoo_local_target__minus_10: - addis 3, 2, .Lfoo_local_target-10@toc@ha - addi 3, 3, .Lfoo_local_target-10@toc@l - blr -.LBORINGSSL_external_toc: -.quad .TOC.-.LBORINGSSL_external_toc -.type BORINGSSL_bcm_text_hash, @object -.size BORINGSSL_bcm_text_hash, 32 -BORINGSSL_bcm_text_hash: -.byte 0xae -.byte 0x2c -.byte 0xea -.byte 0x2a -.byte 0xbd -.byte 0xa6 -.byte 0xf3 -.byte 0xec -.byte 0x97 -.byte 0x7f -.byte 0x9b -.byte 0xf6 -.byte 0x94 -.byte 0x9a -.byte 0xfc -.byte 0x83 -.byte 0x68 -.byte 0x27 -.byte 0xcb -.byte 0xa0 -.byte 0xa0 -.byte 0x9f -.byte 0x6b -.byte 0x6f -.byte 0xde -.byte 0x52 -.byte 0xcd -.byte 0xe2 -.byte 0xcd -.byte 0xff -.byte 0x31 -.byte 0x80 From 5fdc03f74adfd3d270aa6f64b3f3050c19e52e49 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 18:55:32 -0500 Subject: [PATCH 007/177] Remove ppc64le assembly. We no longer have a need to support ppc64le, nor do we have any testing story for the assembly we previously had. Remove all ppc64le-specific assembly. This CL stops short of removing it from base.h. That'll be done in a follow-up CL, just to separate which removals are for the assembly and which removals remove all support. Update-Note: After this change, ppc64le builds drop assembly optimizations and will fallback to a generic C-based AES implementation. Change-Id: Ic8075638085761d66cebc276eb16c4770ce03920 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56388 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- cmake/perlasm.cmake | 4 - crypto/CMakeLists.txt | 2 - crypto/abi_self_test.cc | 286 -- crypto/cpu_ppc64le.c | 38 - crypto/crypto.c | 17 +- crypto/fipsmodule/CMakeLists.txt | 2 - crypto/fipsmodule/aes/asm/aesp8-ppc.pl | 3809 -------------------- crypto/fipsmodule/aes/internal.h | 6 - crypto/fipsmodule/bcm.c | 1 - crypto/fipsmodule/bn/bn.c | 17 - crypto/fipsmodule/cipher/e_aes.c | 2 - crypto/fipsmodule/modes/asm/ghashp8-ppc.pl | 671 ---- crypto/fipsmodule/modes/gcm.c | 7 - crypto/fipsmodule/modes/gcm_test.cc | 10 - crypto/fipsmodule/modes/internal.h | 7 - crypto/fipsmodule/rand/rand.c | 5 - crypto/fipsmodule/sha/internal.h | 15 +- crypto/fipsmodule/sha/sha1-altivec.c | 361 -- crypto/internal.h | 12 +- crypto/perlasm/ppc-xlate.pl | 320 -- crypto/test/abi_test.h | 85 +- crypto/test/asm/trampoline-ppc.pl | 262 -- util/BUILD.toplevel | 11 - util/fipstools/delocate/delocate.peg | 2 +- util/generate_build_files.py | 5 +- 25 files changed, 15 insertions(+), 5942 deletions(-) delete mode 100644 crypto/cpu_ppc64le.c delete mode 100644 crypto/fipsmodule/aes/asm/aesp8-ppc.pl delete mode 100644 crypto/fipsmodule/modes/asm/ghashp8-ppc.pl delete mode 100644 crypto/fipsmodule/sha/sha1-altivec.c delete mode 100644 crypto/perlasm/ppc-xlate.pl delete mode 100755 crypto/test/asm/trampoline-ppc.pl diff --git a/cmake/perlasm.cmake b/cmake/perlasm.cmake index b9530cfbc2..9828799007 100644 --- a/cmake/perlasm.cmake +++ b/cmake/perlasm.cmake @@ -17,7 +17,6 @@ function(add_perlasm_target dest src) DEPENDS ${src} ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl - ${PROJECT_SOURCE_DIR}/crypto/perlasm/ppc-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl @@ -41,9 +40,6 @@ function(perlasm var arch dest src) add_perlasm_target("${dest}-apple.S" ${src} ios32) add_perlasm_target("${dest}-linux.S" ${src} linux32) append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S") - elseif(arch STREQUAL "ppc64le") - add_perlasm_target("${dest}-linux.S" ${src} linux64le) - append_to_parent_scope("${var}_ASM" "${dest}-linux.S") elseif(arch STREQUAL "x86") add_perlasm_target("${dest}-apple.S" ${src} macosx -fPIC -DOPENSSL_IA32_SSE2) add_perlasm_target("${dest}-linux.S" ${src} elf -fPIC -DOPENSSL_IA32_SSE2) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index e1634a4faa..ec6d2ee295 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -24,7 +24,6 @@ perlasm(CRYPTO_SOURCES aarch64 cipher_extra/chacha20_poly1305_armv8 cipher_extra perlasm(CRYPTO_SOURCES aarch64 test/trampoline-armv8 test/asm/trampoline-armv8.pl) perlasm(CRYPTO_SOURCES arm chacha/chacha-armv4 chacha/asm/chacha-armv4.pl) perlasm(CRYPTO_SOURCES arm test/trampoline-armv4 test/asm/trampoline-armv4.pl) -perlasm(CRYPTO_SOURCES ppc64le test/trampoline-ppc test/asm/trampoline-ppc.pl) perlasm(CRYPTO_SOURCES x86 chacha/chacha-x86 chacha/asm/chacha-x86.pl) perlasm(CRYPTO_SOURCES x86 test/trampoline-x86 test/asm/trampoline-x86.pl) perlasm(CRYPTO_SOURCES x86_64 chacha/chacha-x86_64 chacha/asm/chacha-x86_64.pl) @@ -135,7 +134,6 @@ add_library( cpu_arm_linux.c cpu_arm.c cpu_intel.c - cpu_ppc64le.c crypto.c curve25519/curve25519.c curve25519/spake25519.c diff --git a/crypto/abi_self_test.cc b/crypto/abi_self_test.cc index 96814985e9..a42bd1de4b 100644 --- a/crypto/abi_self_test.cc +++ b/crypto/abi_self_test.cc @@ -521,289 +521,3 @@ TEST(ABITest, AArch64) { CHECK_ABI_NO_UNWIND(abi_test_clobber_v15_upper); } #endif // OPENSSL_AARCH64 && SUPPORTS_ABI_TEST - -#if defined(OPENSSL_PPC64LE) && defined(SUPPORTS_ABI_TEST) -extern "C" { -void abi_test_clobber_r0(void); -// r1 is the stack pointer. -void abi_test_clobber_r2(void); -void abi_test_clobber_r3(void); -void abi_test_clobber_r4(void); -void abi_test_clobber_r5(void); -void abi_test_clobber_r6(void); -void abi_test_clobber_r7(void); -void abi_test_clobber_r8(void); -void abi_test_clobber_r9(void); -void abi_test_clobber_r10(void); -void abi_test_clobber_r11(void); -void abi_test_clobber_r12(void); -// r13 is the thread pointer. -void abi_test_clobber_r14(void); -void abi_test_clobber_r15(void); -void abi_test_clobber_r16(void); -void abi_test_clobber_r17(void); -void abi_test_clobber_r18(void); -void abi_test_clobber_r19(void); -void abi_test_clobber_r20(void); -void abi_test_clobber_r21(void); -void abi_test_clobber_r22(void); -void abi_test_clobber_r23(void); -void abi_test_clobber_r24(void); -void abi_test_clobber_r25(void); -void abi_test_clobber_r26(void); -void abi_test_clobber_r27(void); -void abi_test_clobber_r28(void); -void abi_test_clobber_r29(void); -void abi_test_clobber_r30(void); -void abi_test_clobber_r31(void); - -void abi_test_clobber_f0(void); -void abi_test_clobber_f1(void); -void abi_test_clobber_f2(void); -void abi_test_clobber_f3(void); -void abi_test_clobber_f4(void); -void abi_test_clobber_f5(void); -void abi_test_clobber_f6(void); -void abi_test_clobber_f7(void); -void abi_test_clobber_f8(void); -void abi_test_clobber_f9(void); -void abi_test_clobber_f10(void); -void abi_test_clobber_f11(void); -void abi_test_clobber_f12(void); -void abi_test_clobber_f13(void); -void abi_test_clobber_f14(void); -void abi_test_clobber_f15(void); -void abi_test_clobber_f16(void); -void abi_test_clobber_f17(void); -void abi_test_clobber_f18(void); -void abi_test_clobber_f19(void); -void abi_test_clobber_f20(void); -void abi_test_clobber_f21(void); -void abi_test_clobber_f22(void); -void abi_test_clobber_f23(void); -void abi_test_clobber_f24(void); -void abi_test_clobber_f25(void); -void abi_test_clobber_f26(void); -void abi_test_clobber_f27(void); -void abi_test_clobber_f28(void); -void abi_test_clobber_f29(void); -void abi_test_clobber_f30(void); -void abi_test_clobber_f31(void); - -void abi_test_clobber_v0(void); -void abi_test_clobber_v1(void); -void abi_test_clobber_v2(void); -void abi_test_clobber_v3(void); -void abi_test_clobber_v4(void); -void abi_test_clobber_v5(void); -void abi_test_clobber_v6(void); -void abi_test_clobber_v7(void); -void abi_test_clobber_v8(void); -void abi_test_clobber_v9(void); -void abi_test_clobber_v10(void); -void abi_test_clobber_v11(void); -void abi_test_clobber_v12(void); -void abi_test_clobber_v13(void); -void abi_test_clobber_v14(void); -void abi_test_clobber_v15(void); -void abi_test_clobber_v16(void); -void abi_test_clobber_v17(void); -void abi_test_clobber_v18(void); -void abi_test_clobber_v19(void); -void abi_test_clobber_v20(void); -void abi_test_clobber_v21(void); -void abi_test_clobber_v22(void); -void abi_test_clobber_v23(void); -void abi_test_clobber_v24(void); -void abi_test_clobber_v25(void); -void abi_test_clobber_v26(void); -void abi_test_clobber_v27(void); -void abi_test_clobber_v28(void); -void abi_test_clobber_v29(void); -void abi_test_clobber_v30(void); -void abi_test_clobber_v31(void); - -void abi_test_clobber_cr0(void); -void abi_test_clobber_cr1(void); -void abi_test_clobber_cr2(void); -void abi_test_clobber_cr3(void); -void abi_test_clobber_cr4(void); -void abi_test_clobber_cr5(void); -void abi_test_clobber_cr6(void); -void abi_test_clobber_cr7(void); - -void abi_test_clobber_ctr(void); -void abi_test_clobber_lr(void); - -} // extern "C" - -TEST(ABITest, PPC64LE) { - // abi_test_trampoline hides unsaved registers from the caller, so we can - // safely call the abi_test_clobber_* functions below. - abi_test::internal::CallerState state; - RAND_bytes(reinterpret_cast(&state), sizeof(state)); - CHECK_ABI_NO_UNWIND(abi_test_trampoline, - reinterpret_cast(abi_test_clobber_r14), - &state, nullptr, 0, 0 /* no breakpoint */); - - CHECK_ABI_NO_UNWIND(abi_test_clobber_r0); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r2); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r3); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r4); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r5); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r6); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r7); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r8); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r9); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r10); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r11); - CHECK_ABI_NO_UNWIND(abi_test_clobber_r12); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r14), - "r14 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r15), - "r15 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r16), - "r16 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r17), - "r17 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r18), - "r18 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r19), - "r19 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r20), - "r20 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r21), - "r21 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r22), - "r22 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r23), - "r23 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r24), - "r24 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r25), - "r25 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r26), - "r26 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r27), - "r27 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r28), - "r28 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r29), - "r29 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r30), - "r30 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r31), - "r31 was not restored after return"); - - CHECK_ABI_NO_UNWIND(abi_test_clobber_f0); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f1); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f2); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f3); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f4); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f5); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f6); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f7); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f8); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f9); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f10); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f11); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f12); - CHECK_ABI_NO_UNWIND(abi_test_clobber_f13); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f14), - "f14 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f15), - "f15 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f16), - "f16 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f17), - "f17 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f18), - "f18 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f19), - "f19 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f20), - "f20 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f21), - "f21 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f22), - "f22 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f23), - "f23 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f24), - "f24 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f25), - "f25 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f26), - "f26 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f27), - "f27 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f28), - "f28 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f29), - "f29 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f30), - "f30 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f31), - "f31 was not restored after return"); - - CHECK_ABI_NO_UNWIND(abi_test_clobber_v0); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v1); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v2); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v3); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v4); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v5); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v6); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v7); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v8); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v9); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v10); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v11); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v12); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v13); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v14); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v15); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v16); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v17); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v18); - CHECK_ABI_NO_UNWIND(abi_test_clobber_v19); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v20), - "v20 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v21), - "v21 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v22), - "v22 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v23), - "v23 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v24), - "v24 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v25), - "v25 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v26), - "v26 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v27), - "v27 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v28), - "v28 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v29), - "v29 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v30), - "v30 was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v31), - "v31 was not restored after return"); - - CHECK_ABI_NO_UNWIND(abi_test_clobber_cr0); - CHECK_ABI_NO_UNWIND(abi_test_clobber_cr1); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr2), - "cr was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr3), - "cr was not restored after return"); - EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr4), - "cr was not restored after return"); - CHECK_ABI_NO_UNWIND(abi_test_clobber_cr5); - CHECK_ABI_NO_UNWIND(abi_test_clobber_cr6); - CHECK_ABI_NO_UNWIND(abi_test_clobber_cr7); - - CHECK_ABI_NO_UNWIND(abi_test_clobber_ctr); - CHECK_ABI_NO_UNWIND(abi_test_clobber_lr); -} -#endif // OPENSSL_PPC64LE && SUPPORTS_ABI_TEST diff --git a/crypto/cpu_ppc64le.c b/crypto/cpu_ppc64le.c deleted file mode 100644 index a802e37e9a..0000000000 --- a/crypto/cpu_ppc64le.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2016, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include - -#if defined(OPENSSL_PPC64LE) - -#include - -#include "internal.h" - - -#if !defined(PPC_FEATURE2_HAS_VCRYPTO) -// PPC_FEATURE2_HAS_VCRYPTO was taken from section 4.1.2.3 of the “OpenPOWER -// ABI for Linux Supplement”. -#define PPC_FEATURE2_HAS_VCRYPTO 0x02000000 -#endif - -void OPENSSL_cpuid_setup(void) { - OPENSSL_ppc64le_hwcap2 = getauxval(AT_HWCAP2); -} - -int CRYPTO_is_PPC64LE_vcrypto_capable(void) { - return (OPENSSL_ppc64le_hwcap2 & PPC_FEATURE2_HAS_VCRYPTO) != 0; -} - -#endif // OPENSSL_PPC64LE diff --git a/crypto/crypto.c b/crypto/crypto.c index 12cbb88842..beaae0f7e9 100644 --- a/crypto/crypto.c +++ b/crypto/crypto.c @@ -25,12 +25,10 @@ static_assert(sizeof(ossl_ssize_t) == sizeof(size_t), "ossl_ssize_t should be the same size as size_t"); #if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_STATIC_ARMCAP) && \ - (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \ - defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) || \ - defined(OPENSSL_PPC64LE)) -// x86, x86_64, the ARMs and ppc64le need to record the result of a -// cpuid/getauxval call for the asm to work correctly, unless compiled without -// asm code. + (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \ + defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) +// x86, x86_64, and the ARMs need to record the result of a cpuid/getauxval call +// for the asm to work correctly, unless compiled without asm code. #define NEED_CPUID #else @@ -41,8 +39,7 @@ static_assert(sizeof(ossl_ssize_t) == sizeof(size_t), #define BORINGSSL_NO_STATIC_INITIALIZER #endif -#endif // !NO_ASM && !STATIC_ARMCAP && - // (X86 || X86_64 || ARM || AARCH64 || PPC64LE) +#endif // !NO_ASM && !STATIC_ARMCAP && (X86 || X86_64 || ARM || AARCH64) // Our assembly does not use the GOT to reference symbols, which means @@ -81,10 +78,6 @@ HIDDEN uint8_t BORINGSSL_function_hit[7] = {0}; // This value must be explicitly initialized to zero. See similar comment above. HIDDEN uint32_t OPENSSL_ia32cap_P[4] = {0}; -#elif defined(OPENSSL_PPC64LE) - -HIDDEN unsigned long OPENSSL_ppc64le_hwcap2 = 0; - #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) #include diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt index 82505b742c..2bfadab440 100644 --- a/crypto/fipsmodule/CMakeLists.txt +++ b/crypto/fipsmodule/CMakeLists.txt @@ -20,8 +20,6 @@ perlasm(BCM_SOURCES arm sha1-armv4-large sha/asm/sha1-armv4-large.pl) perlasm(BCM_SOURCES arm sha256-armv4 sha/asm/sha256-armv4.pl) perlasm(BCM_SOURCES arm sha512-armv4 sha/asm/sha512-armv4.pl) perlasm(BCM_SOURCES arm vpaes-armv7 aes/asm/vpaes-armv7.pl) -perlasm(BCM_SOURCES ppc64le aesp8-ppc aes/asm/aesp8-ppc.pl) -perlasm(BCM_SOURCES ppc64le ghashp8-ppc modes/asm/ghashp8-ppc.pl) perlasm(BCM_SOURCES x86 aesni-x86 aes/asm/aesni-x86.pl) perlasm(BCM_SOURCES x86 bn-586 bn/asm/bn-586.pl) perlasm(BCM_SOURCES x86 co-586 bn/asm/co-586.pl) diff --git a/crypto/fipsmodule/aes/asm/aesp8-ppc.pl b/crypto/fipsmodule/aes/asm/aesp8-ppc.pl deleted file mode 100644 index 061f6b7e2c..0000000000 --- a/crypto/fipsmodule/aes/asm/aesp8-ppc.pl +++ /dev/null @@ -1,3809 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2018 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# This module implements support for AES instructions as per PowerISA -# specification version 2.07, first implemented by POWER8 processor. -# The module is endian-agnostic in sense that it supports both big- -# and little-endian cases. Data alignment in parallelizable modes is -# handled with VSX loads and stores, which implies MSR.VSX flag being -# set. It should also be noted that ISA specification doesn't prohibit -# alignment exceptions for these instructions on page boundaries. -# Initially alignment was handled in pure AltiVec/VMX way [when data -# is aligned programmatically, which in turn guarantees exception- -# free execution], but it turned to hamper performance when vcipher -# instructions are interleaved. It's reckoned that eventual -# misalignment penalties at page boundaries are in average lower -# than additional overhead in pure AltiVec approach. -# -# May 2016 -# -# Add XTS subroutine, 9x on little- and 12x improvement on big-endian -# systems were measured. -# -###################################################################### -# Current large-block performance in cycles per byte processed with -# 128-bit key (less is better). -# -# CBC en-/decrypt CTR XTS -# POWER8[le] 3.96/0.72 0.74 1.1 -# POWER8[be] 3.75/0.65 0.66 1.0 -# POWER9[le] 4.02/0.86 0.84 1.05 -# POWER9[be] 3.99/0.78 0.79 0.97 - -$flavour = shift; -$output = shift; - -if ($flavour =~ /64/) { - $SIZE_T =8; - $LRSAVE =2*$SIZE_T; - $STU ="stdu"; - $POP ="ld"; - $PUSH ="std"; - $UCMP ="cmpld"; - $SHL ="sldi"; -} elsif ($flavour =~ /32/) { - $SIZE_T =4; - $LRSAVE =$SIZE_T; - $STU ="stwu"; - $POP ="lwz"; - $PUSH ="stw"; - $UCMP ="cmplw"; - $SHL ="slwi"; -} else { die "nonsense $flavour"; } - -$LITTLE_ENDIAN = ($flavour=~/le$/) ? $SIZE_T : 0; - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/ppc-xlate.pl" and -f $xlate) or -die "can't locate ppc-xlate.pl"; - -open OUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; -*STDOUT=*OUT; - -$FRAME=8*$SIZE_T; -$prefix="aes_hw"; - -$sp="r1"; -$vrsave="r12"; - -######################################################################### -{{{ # Key setup procedures # -my ($inp,$bits,$out,$ptr,$cnt,$rounds)=map("r$_",(3..8)); -my ($zero,$in0,$in1,$key,$rcon,$mask,$tmp)=map("v$_",(0..6)); -my ($stage,$outperm,$outmask,$outhead,$outtail)=map("v$_",(7..11)); - -$code.=<<___; -.machine "any" - -.text - -.align 7 -Lrcon: -.long 0x01000000, 0x01000000, 0x01000000, 0x01000000 ?rev -.long 0x1b000000, 0x1b000000, 0x1b000000, 0x1b000000 ?rev -.long 0x0d0e0f0c, 0x0d0e0f0c, 0x0d0e0f0c, 0x0d0e0f0c ?rev -.long 0,0,0,0 ?asis -Lconsts: - mflr r0 - bcl 20,31,\$+4 - mflr $ptr #vvvvv "distance between . and rcon - addi $ptr,$ptr,-0x48 - mtlr r0 - blr - .long 0 - .byte 0,12,0x14,0,0,0,0,0 -.asciz "AES for PowerISA 2.07, CRYPTOGAMS by " - -.globl .${prefix}_set_encrypt_key -.align 5 -.${prefix}_set_encrypt_key: -Lset_encrypt_key: - mflr r11 - $PUSH r11,$LRSAVE($sp) - - li $ptr,-1 - ${UCMP}i $inp,0 - beq- Lenc_key_abort # if ($inp==0) return -1; - ${UCMP}i $out,0 - beq- Lenc_key_abort # if ($out==0) return -1; - li $ptr,-2 - cmpwi $bits,128 - blt- Lenc_key_abort - cmpwi $bits,256 - bgt- Lenc_key_abort - andi. r0,$bits,0x3f - bne- Lenc_key_abort - - lis r0,0xfff0 - mfspr $vrsave,256 - mtspr 256,r0 - - bl Lconsts - mtlr r11 - - neg r9,$inp - lvx $in0,0,$inp - addi $inp,$inp,15 # 15 is not typo - lvsr $key,0,r9 # borrow $key - li r8,0x20 - cmpwi $bits,192 - lvx $in1,0,$inp - le?vspltisb $mask,0x0f # borrow $mask - lvx $rcon,0,$ptr - le?vxor $key,$key,$mask # adjust for byte swap - lvx $mask,r8,$ptr - addi $ptr,$ptr,0x10 - vperm $in0,$in0,$in1,$key # align [and byte swap in LE] - li $cnt,8 - vxor $zero,$zero,$zero - mtctr $cnt - - ?lvsr $outperm,0,$out - vspltisb $outmask,-1 - lvx $outhead,0,$out - ?vperm $outmask,$zero,$outmask,$outperm - - blt Loop128 - addi $inp,$inp,8 - beq L192 - addi $inp,$inp,8 - b L256 - -.align 4 -Loop128: - vperm $key,$in0,$in0,$mask # rotate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vcipherlast $key,$key,$rcon - stvx $stage,0,$out - addi $out,$out,16 - - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vadduwm $rcon,$rcon,$rcon - vxor $in0,$in0,$key - bdnz Loop128 - - lvx $rcon,0,$ptr # last two round keys - - vperm $key,$in0,$in0,$mask # rotate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vcipherlast $key,$key,$rcon - stvx $stage,0,$out - addi $out,$out,16 - - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vadduwm $rcon,$rcon,$rcon - vxor $in0,$in0,$key - - vperm $key,$in0,$in0,$mask # rotate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vcipherlast $key,$key,$rcon - stvx $stage,0,$out - addi $out,$out,16 - - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vxor $in0,$in0,$key - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - stvx $stage,0,$out - - addi $inp,$out,15 # 15 is not typo - addi $out,$out,0x50 - - li $rounds,10 - b Ldone - -.align 4 -L192: - lvx $tmp,0,$inp - li $cnt,4 - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - stvx $stage,0,$out - addi $out,$out,16 - vperm $in1,$in1,$tmp,$key # align [and byte swap in LE] - vspltisb $key,8 # borrow $key - mtctr $cnt - vsububm $mask,$mask,$key # adjust the mask - -Loop192: - vperm $key,$in1,$in1,$mask # roate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vcipherlast $key,$key,$rcon - - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - - vsldoi $stage,$zero,$in1,8 - vspltw $tmp,$in0,3 - vxor $tmp,$tmp,$in1 - vsldoi $in1,$zero,$in1,12 # >>32 - vadduwm $rcon,$rcon,$rcon - vxor $in1,$in1,$tmp - vxor $in0,$in0,$key - vxor $in1,$in1,$key - vsldoi $stage,$stage,$in0,8 - - vperm $key,$in1,$in1,$mask # rotate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vperm $outtail,$stage,$stage,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vcipherlast $key,$key,$rcon - stvx $stage,0,$out - addi $out,$out,16 - - vsldoi $stage,$in0,$in1,8 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vperm $outtail,$stage,$stage,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - stvx $stage,0,$out - addi $out,$out,16 - - vspltw $tmp,$in0,3 - vxor $tmp,$tmp,$in1 - vsldoi $in1,$zero,$in1,12 # >>32 - vadduwm $rcon,$rcon,$rcon - vxor $in1,$in1,$tmp - vxor $in0,$in0,$key - vxor $in1,$in1,$key - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - stvx $stage,0,$out - addi $inp,$out,15 # 15 is not typo - addi $out,$out,16 - bdnz Loop192 - - li $rounds,12 - addi $out,$out,0x20 - b Ldone - -.align 4 -L256: - lvx $tmp,0,$inp - li $cnt,7 - li $rounds,14 - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - stvx $stage,0,$out - addi $out,$out,16 - vperm $in1,$in1,$tmp,$key # align [and byte swap in LE] - mtctr $cnt - -Loop256: - vperm $key,$in1,$in1,$mask # rotate-n-splat - vsldoi $tmp,$zero,$in0,12 # >>32 - vperm $outtail,$in1,$in1,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - vcipherlast $key,$key,$rcon - stvx $stage,0,$out - addi $out,$out,16 - - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in0,$in0,$tmp - vadduwm $rcon,$rcon,$rcon - vxor $in0,$in0,$key - vperm $outtail,$in0,$in0,$outperm # rotate - vsel $stage,$outhead,$outtail,$outmask - vmr $outhead,$outtail - stvx $stage,0,$out - addi $inp,$out,15 # 15 is not typo - addi $out,$out,16 - bdz Ldone - - vspltw $key,$in0,3 # just splat - vsldoi $tmp,$zero,$in1,12 # >>32 - vsbox $key,$key - - vxor $in1,$in1,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in1,$in1,$tmp - vsldoi $tmp,$zero,$tmp,12 # >>32 - vxor $in1,$in1,$tmp - - vxor $in1,$in1,$key - b Loop256 - -.align 4 -Ldone: - lvx $in1,0,$inp # redundant in aligned case - vsel $in1,$outhead,$in1,$outmask - stvx $in1,0,$inp - li $ptr,0 - mtspr 256,$vrsave - stw $rounds,0($out) - -Lenc_key_abort: - mr r3,$ptr - blr - .long 0 - .byte 0,12,0x14,1,0,0,3,0 - .long 0 -.size .${prefix}_set_encrypt_key,.-.${prefix}_set_encrypt_key - -.globl .${prefix}_set_decrypt_key -.align 5 -.${prefix}_set_decrypt_key: - $STU $sp,-$FRAME($sp) - mflr r10 - $PUSH r10,`$FRAME+$LRSAVE`($sp) - bl Lset_encrypt_key - mtlr r10 - - cmpwi r3,0 - bne- Ldec_key_abort - - slwi $cnt,$rounds,4 - subi $inp,$out,240 # first round key - srwi $rounds,$rounds,1 - add $out,$inp,$cnt # last round key - mtctr $rounds - -Ldeckey: - lwz r0, 0($inp) - lwz r6, 4($inp) - lwz r7, 8($inp) - lwz r8, 12($inp) - addi $inp,$inp,16 - lwz r9, 0($out) - lwz r10,4($out) - lwz r11,8($out) - lwz r12,12($out) - stw r0, 0($out) - stw r6, 4($out) - stw r7, 8($out) - stw r8, 12($out) - subi $out,$out,16 - stw r9, -16($inp) - stw r10,-12($inp) - stw r11,-8($inp) - stw r12,-4($inp) - bdnz Ldeckey - - xor r3,r3,r3 # return value -Ldec_key_abort: - addi $sp,$sp,$FRAME - blr - .long 0 - .byte 0,12,4,1,0x80,0,3,0 - .long 0 -.size .${prefix}_set_decrypt_key,.-.${prefix}_set_decrypt_key -___ -}}} -######################################################################### -{{{ # Single block en- and decrypt procedures # -sub gen_block () { -my $dir = shift; -my $n = $dir eq "de" ? "n" : ""; -my ($inp,$out,$key,$rounds,$idx)=map("r$_",(3..7)); - -$code.=<<___; -.globl .${prefix}_${dir}crypt -.align 5 -.${prefix}_${dir}crypt: - lwz $rounds,240($key) - lis r0,0xfc00 - mfspr $vrsave,256 - li $idx,15 # 15 is not typo - mtspr 256,r0 - - lvx v0,0,$inp - neg r11,$out - lvx v1,$idx,$inp - lvsl v2,0,$inp # inpperm - le?vspltisb v4,0x0f - ?lvsl v3,0,r11 # outperm - le?vxor v2,v2,v4 - li $idx,16 - vperm v0,v0,v1,v2 # align [and byte swap in LE] - lvx v1,0,$key - ?lvsl v5,0,$key # keyperm - srwi $rounds,$rounds,1 - lvx v2,$idx,$key - addi $idx,$idx,16 - subi $rounds,$rounds,1 - ?vperm v1,v1,v2,v5 # align round key - - vxor v0,v0,v1 - lvx v1,$idx,$key - addi $idx,$idx,16 - mtctr $rounds - -Loop_${dir}c: - ?vperm v2,v2,v1,v5 - v${n}cipher v0,v0,v2 - lvx v2,$idx,$key - addi $idx,$idx,16 - ?vperm v1,v1,v2,v5 - v${n}cipher v0,v0,v1 - lvx v1,$idx,$key - addi $idx,$idx,16 - bdnz Loop_${dir}c - - ?vperm v2,v2,v1,v5 - v${n}cipher v0,v0,v2 - lvx v2,$idx,$key - ?vperm v1,v1,v2,v5 - v${n}cipherlast v0,v0,v1 - - vspltisb v2,-1 - vxor v1,v1,v1 - li $idx,15 # 15 is not typo - ?vperm v2,v1,v2,v3 # outmask - le?vxor v3,v3,v4 - lvx v1,0,$out # outhead - vperm v0,v0,v0,v3 # rotate [and byte swap in LE] - vsel v1,v1,v0,v2 - lvx v4,$idx,$out - stvx v1,0,$out - vsel v0,v0,v4,v2 - stvx v0,$idx,$out - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,3,0 - .long 0 -.size .${prefix}_${dir}crypt,.-.${prefix}_${dir}crypt -___ -} -&gen_block("en"); -&gen_block("de"); -}}} -######################################################################### -{{{ # CBC en- and decrypt procedures # -my ($inp,$out,$len,$key,$ivp,$enc,$rounds,$idx)=map("r$_",(3..10)); -my ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3)); -my ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm)= - map("v$_",(4..10)); -$code.=<<___; -.globl .${prefix}_cbc_encrypt -.align 5 -.${prefix}_cbc_encrypt: - ${UCMP}i $len,16 - bltlr- - - cmpwi $enc,0 # test direction - lis r0,0xffe0 - mfspr $vrsave,256 - mtspr 256,r0 - - li $idx,15 - vxor $rndkey0,$rndkey0,$rndkey0 - le?vspltisb $tmp,0x0f - - lvx $ivec,0,$ivp # load [unaligned] iv - lvsl $inpperm,0,$ivp - lvx $inptail,$idx,$ivp - le?vxor $inpperm,$inpperm,$tmp - vperm $ivec,$ivec,$inptail,$inpperm - - neg r11,$inp - ?lvsl $keyperm,0,$key # prepare for unaligned key - lwz $rounds,240($key) - - lvsr $inpperm,0,r11 # prepare for unaligned load - lvx $inptail,0,$inp - addi $inp,$inp,15 # 15 is not typo - le?vxor $inpperm,$inpperm,$tmp - - ?lvsr $outperm,0,$out # prepare for unaligned store - vspltisb $outmask,-1 - lvx $outhead,0,$out - ?vperm $outmask,$rndkey0,$outmask,$outperm - le?vxor $outperm,$outperm,$tmp - - srwi $rounds,$rounds,1 - li $idx,16 - subi $rounds,$rounds,1 - beq Lcbc_dec - -Lcbc_enc: - vmr $inout,$inptail - lvx $inptail,0,$inp - addi $inp,$inp,16 - mtctr $rounds - subi $len,$len,16 # len-=16 - - lvx $rndkey0,0,$key - vperm $inout,$inout,$inptail,$inpperm - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - vxor $inout,$inout,$ivec - -Loop_cbc_enc: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - bdnz Loop_cbc_enc - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - li $idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipherlast $ivec,$inout,$rndkey0 - ${UCMP}i $len,16 - - vperm $tmp,$ivec,$ivec,$outperm - vsel $inout,$outhead,$tmp,$outmask - vmr $outhead,$tmp - stvx $inout,0,$out - addi $out,$out,16 - bge Lcbc_enc - - b Lcbc_done - -.align 4 -Lcbc_dec: - ${UCMP}i $len,128 - bge _aesp8_cbc_decrypt8x - vmr $tmp,$inptail - lvx $inptail,0,$inp - addi $inp,$inp,16 - mtctr $rounds - subi $len,$len,16 # len-=16 - - lvx $rndkey0,0,$key - vperm $tmp,$tmp,$inptail,$inpperm - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$tmp,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - -Loop_cbc_dec: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vncipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - bdnz Loop_cbc_dec - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - li $idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vncipherlast $inout,$inout,$rndkey0 - ${UCMP}i $len,16 - - vxor $inout,$inout,$ivec - vmr $ivec,$tmp - vperm $tmp,$inout,$inout,$outperm - vsel $inout,$outhead,$tmp,$outmask - vmr $outhead,$tmp - stvx $inout,0,$out - addi $out,$out,16 - bge Lcbc_dec - -Lcbc_done: - addi $out,$out,-1 - lvx $inout,0,$out # redundant in aligned case - vsel $inout,$outhead,$inout,$outmask - stvx $inout,0,$out - - neg $enc,$ivp # write [unaligned] iv - li $idx,15 # 15 is not typo - vxor $rndkey0,$rndkey0,$rndkey0 - vspltisb $outmask,-1 - le?vspltisb $tmp,0x0f - ?lvsl $outperm,0,$enc - ?vperm $outmask,$rndkey0,$outmask,$outperm - le?vxor $outperm,$outperm,$tmp - lvx $outhead,0,$ivp - vperm $ivec,$ivec,$ivec,$outperm - vsel $inout,$outhead,$ivec,$outmask - lvx $inptail,$idx,$ivp - stvx $inout,0,$ivp - vsel $inout,$ivec,$inptail,$outmask - stvx $inout,$idx,$ivp - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,6,0 - .long 0 -___ -######################################################################### -{{ # Optimized CBC decrypt procedure # -my $key_="r11"; -my ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,8,26..31)); - $x00=0 if ($flavour =~ /osx/); -my ($in0, $in1, $in2, $in3, $in4, $in5, $in6, $in7 )=map("v$_",(0..3,10..13)); -my ($out0,$out1,$out2,$out3,$out4,$out5,$out6,$out7)=map("v$_",(14..21)); -my $rndkey0="v23"; # v24-v25 rotating buffer for first found keys - # v26-v31 last 6 round keys -my ($tmp,$keyperm)=($in3,$in4); # aliases with "caller", redundant assignment - -$code.=<<___; -.align 5 -_aesp8_cbc_decrypt8x: - $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) - li r10,`$FRAME+8*16+15` - li r11,`$FRAME+8*16+31` - stvx v20,r10,$sp # ABI says so - addi r10,r10,32 - stvx v21,r11,$sp - addi r11,r11,32 - stvx v22,r10,$sp - addi r10,r10,32 - stvx v23,r11,$sp - addi r11,r11,32 - stvx v24,r10,$sp - addi r10,r10,32 - stvx v25,r11,$sp - addi r11,r11,32 - stvx v26,r10,$sp - addi r10,r10,32 - stvx v27,r11,$sp - addi r11,r11,32 - stvx v28,r10,$sp - addi r10,r10,32 - stvx v29,r11,$sp - addi r11,r11,32 - stvx v30,r10,$sp - stvx v31,r11,$sp - li r0,-1 - stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave - li $x10,0x10 - $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) - li $x20,0x20 - $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) - li $x30,0x30 - $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) - li $x40,0x40 - $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) - li $x50,0x50 - $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) - li $x60,0x60 - $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) - li $x70,0x70 - mtspr 256,r0 - - subi $rounds,$rounds,3 # -4 in total - subi $len,$len,128 # bias - - lvx $rndkey0,$x00,$key # load key schedule - lvx v30,$x10,$key - addi $key,$key,0x20 - lvx v31,$x00,$key - ?vperm $rndkey0,$rndkey0,v30,$keyperm - addi $key_,$sp,`$FRAME+15` - mtctr $rounds - -Load_cbc_dec_key: - ?vperm v24,v30,v31,$keyperm - lvx v30,$x10,$key - addi $key,$key,0x20 - stvx v24,$x00,$key_ # off-load round[1] - ?vperm v25,v31,v30,$keyperm - lvx v31,$x00,$key - stvx v25,$x10,$key_ # off-load round[2] - addi $key_,$key_,0x20 - bdnz Load_cbc_dec_key - - lvx v26,$x10,$key - ?vperm v24,v30,v31,$keyperm - lvx v27,$x20,$key - stvx v24,$x00,$key_ # off-load round[3] - ?vperm v25,v31,v26,$keyperm - lvx v28,$x30,$key - stvx v25,$x10,$key_ # off-load round[4] - addi $key_,$sp,`$FRAME+15` # rewind $key_ - ?vperm v26,v26,v27,$keyperm - lvx v29,$x40,$key - ?vperm v27,v27,v28,$keyperm - lvx v30,$x50,$key - ?vperm v28,v28,v29,$keyperm - lvx v31,$x60,$key - ?vperm v29,v29,v30,$keyperm - lvx $out0,$x70,$key # borrow $out0 - ?vperm v30,v30,v31,$keyperm - lvx v24,$x00,$key_ # pre-load round[1] - ?vperm v31,v31,$out0,$keyperm - lvx v25,$x10,$key_ # pre-load round[2] - - #lvx $inptail,0,$inp # "caller" already did this - #addi $inp,$inp,15 # 15 is not typo - subi $inp,$inp,15 # undo "caller" - - le?li $idx,8 - lvx_u $in0,$x00,$inp # load first 8 "words" - le?lvsl $inpperm,0,$idx - le?vspltisb $tmp,0x0f - lvx_u $in1,$x10,$inp - le?vxor $inpperm,$inpperm,$tmp # transform for lvx_u/stvx_u - lvx_u $in2,$x20,$inp - le?vperm $in0,$in0,$in0,$inpperm - lvx_u $in3,$x30,$inp - le?vperm $in1,$in1,$in1,$inpperm - lvx_u $in4,$x40,$inp - le?vperm $in2,$in2,$in2,$inpperm - vxor $out0,$in0,$rndkey0 - lvx_u $in5,$x50,$inp - le?vperm $in3,$in3,$in3,$inpperm - vxor $out1,$in1,$rndkey0 - lvx_u $in6,$x60,$inp - le?vperm $in4,$in4,$in4,$inpperm - vxor $out2,$in2,$rndkey0 - lvx_u $in7,$x70,$inp - addi $inp,$inp,0x80 - le?vperm $in5,$in5,$in5,$inpperm - vxor $out3,$in3,$rndkey0 - le?vperm $in6,$in6,$in6,$inpperm - vxor $out4,$in4,$rndkey0 - le?vperm $in7,$in7,$in7,$inpperm - vxor $out5,$in5,$rndkey0 - vxor $out6,$in6,$rndkey0 - vxor $out7,$in7,$rndkey0 - - mtctr $rounds - b Loop_cbc_dec8x -.align 5 -Loop_cbc_dec8x: - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - vncipher $out6,$out6,v24 - vncipher $out7,$out7,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - vncipher $out6,$out6,v25 - vncipher $out7,$out7,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_cbc_dec8x - - subic $len,$len,128 # $len-=128 - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - vncipher $out6,$out6,v24 - vncipher $out7,$out7,v24 - - subfe. r0,r0,r0 # borrow?-1:0 - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - vncipher $out6,$out6,v25 - vncipher $out7,$out7,v25 - - and r0,r0,$len - vncipher $out0,$out0,v26 - vncipher $out1,$out1,v26 - vncipher $out2,$out2,v26 - vncipher $out3,$out3,v26 - vncipher $out4,$out4,v26 - vncipher $out5,$out5,v26 - vncipher $out6,$out6,v26 - vncipher $out7,$out7,v26 - - add $inp,$inp,r0 # $inp is adjusted in such - # way that at exit from the - # loop inX-in7 are loaded - # with last "words" - vncipher $out0,$out0,v27 - vncipher $out1,$out1,v27 - vncipher $out2,$out2,v27 - vncipher $out3,$out3,v27 - vncipher $out4,$out4,v27 - vncipher $out5,$out5,v27 - vncipher $out6,$out6,v27 - vncipher $out7,$out7,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vncipher $out0,$out0,v28 - vncipher $out1,$out1,v28 - vncipher $out2,$out2,v28 - vncipher $out3,$out3,v28 - vncipher $out4,$out4,v28 - vncipher $out5,$out5,v28 - vncipher $out6,$out6,v28 - vncipher $out7,$out7,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - - vncipher $out0,$out0,v29 - vncipher $out1,$out1,v29 - vncipher $out2,$out2,v29 - vncipher $out3,$out3,v29 - vncipher $out4,$out4,v29 - vncipher $out5,$out5,v29 - vncipher $out6,$out6,v29 - vncipher $out7,$out7,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - - vncipher $out0,$out0,v30 - vxor $ivec,$ivec,v31 # xor with last round key - vncipher $out1,$out1,v30 - vxor $in0,$in0,v31 - vncipher $out2,$out2,v30 - vxor $in1,$in1,v31 - vncipher $out3,$out3,v30 - vxor $in2,$in2,v31 - vncipher $out4,$out4,v30 - vxor $in3,$in3,v31 - vncipher $out5,$out5,v30 - vxor $in4,$in4,v31 - vncipher $out6,$out6,v30 - vxor $in5,$in5,v31 - vncipher $out7,$out7,v30 - vxor $in6,$in6,v31 - - vncipherlast $out0,$out0,$ivec - vncipherlast $out1,$out1,$in0 - lvx_u $in0,$x00,$inp # load next input block - vncipherlast $out2,$out2,$in1 - lvx_u $in1,$x10,$inp - vncipherlast $out3,$out3,$in2 - le?vperm $in0,$in0,$in0,$inpperm - lvx_u $in2,$x20,$inp - vncipherlast $out4,$out4,$in3 - le?vperm $in1,$in1,$in1,$inpperm - lvx_u $in3,$x30,$inp - vncipherlast $out5,$out5,$in4 - le?vperm $in2,$in2,$in2,$inpperm - lvx_u $in4,$x40,$inp - vncipherlast $out6,$out6,$in5 - le?vperm $in3,$in3,$in3,$inpperm - lvx_u $in5,$x50,$inp - vncipherlast $out7,$out7,$in6 - le?vperm $in4,$in4,$in4,$inpperm - lvx_u $in6,$x60,$inp - vmr $ivec,$in7 - le?vperm $in5,$in5,$in5,$inpperm - lvx_u $in7,$x70,$inp - addi $inp,$inp,0x80 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $in6,$in6,$in6,$inpperm - vxor $out0,$in0,$rndkey0 - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $in7,$in7,$in7,$inpperm - vxor $out1,$in1,$rndkey0 - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - vxor $out2,$in2,$rndkey0 - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x30,$out - vxor $out3,$in3,$rndkey0 - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x40,$out - vxor $out4,$in4,$rndkey0 - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x50,$out - vxor $out5,$in5,$rndkey0 - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x60,$out - vxor $out6,$in6,$rndkey0 - stvx_u $out7,$x70,$out - addi $out,$out,0x80 - vxor $out7,$in7,$rndkey0 - - mtctr $rounds - beq Loop_cbc_dec8x # did $len-=128 borrow? - - addic. $len,$len,128 - beq Lcbc_dec8x_done - nop - nop - -Loop_cbc_dec8x_tail: # up to 7 "words" tail... - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - vncipher $out6,$out6,v24 - vncipher $out7,$out7,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - vncipher $out6,$out6,v25 - vncipher $out7,$out7,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_cbc_dec8x_tail - - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - vncipher $out6,$out6,v24 - vncipher $out7,$out7,v24 - - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - vncipher $out6,$out6,v25 - vncipher $out7,$out7,v25 - - vncipher $out1,$out1,v26 - vncipher $out2,$out2,v26 - vncipher $out3,$out3,v26 - vncipher $out4,$out4,v26 - vncipher $out5,$out5,v26 - vncipher $out6,$out6,v26 - vncipher $out7,$out7,v26 - - vncipher $out1,$out1,v27 - vncipher $out2,$out2,v27 - vncipher $out3,$out3,v27 - vncipher $out4,$out4,v27 - vncipher $out5,$out5,v27 - vncipher $out6,$out6,v27 - vncipher $out7,$out7,v27 - - vncipher $out1,$out1,v28 - vncipher $out2,$out2,v28 - vncipher $out3,$out3,v28 - vncipher $out4,$out4,v28 - vncipher $out5,$out5,v28 - vncipher $out6,$out6,v28 - vncipher $out7,$out7,v28 - - vncipher $out1,$out1,v29 - vncipher $out2,$out2,v29 - vncipher $out3,$out3,v29 - vncipher $out4,$out4,v29 - vncipher $out5,$out5,v29 - vncipher $out6,$out6,v29 - vncipher $out7,$out7,v29 - - vncipher $out1,$out1,v30 - vxor $ivec,$ivec,v31 # last round key - vncipher $out2,$out2,v30 - vxor $in1,$in1,v31 - vncipher $out3,$out3,v30 - vxor $in2,$in2,v31 - vncipher $out4,$out4,v30 - vxor $in3,$in3,v31 - vncipher $out5,$out5,v30 - vxor $in4,$in4,v31 - vncipher $out6,$out6,v30 - vxor $in5,$in5,v31 - vncipher $out7,$out7,v30 - vxor $in6,$in6,v31 - - cmplwi $len,32 # switch($len) - blt Lcbc_dec8x_one - nop - beq Lcbc_dec8x_two - cmplwi $len,64 - blt Lcbc_dec8x_three - nop - beq Lcbc_dec8x_four - cmplwi $len,96 - blt Lcbc_dec8x_five - nop - beq Lcbc_dec8x_six - -Lcbc_dec8x_seven: - vncipherlast $out1,$out1,$ivec - vncipherlast $out2,$out2,$in1 - vncipherlast $out3,$out3,$in2 - vncipherlast $out4,$out4,$in3 - vncipherlast $out5,$out5,$in4 - vncipherlast $out6,$out6,$in5 - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out1,$out1,$out1,$inpperm - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x00,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x10,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x20,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x30,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x40,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x50,$out - stvx_u $out7,$x60,$out - addi $out,$out,0x70 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_six: - vncipherlast $out2,$out2,$ivec - vncipherlast $out3,$out3,$in2 - vncipherlast $out4,$out4,$in3 - vncipherlast $out5,$out5,$in4 - vncipherlast $out6,$out6,$in5 - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out2,$out2,$out2,$inpperm - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x00,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x10,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x20,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x30,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x40,$out - stvx_u $out7,$x50,$out - addi $out,$out,0x60 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_five: - vncipherlast $out3,$out3,$ivec - vncipherlast $out4,$out4,$in3 - vncipherlast $out5,$out5,$in4 - vncipherlast $out6,$out6,$in5 - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out3,$out3,$out3,$inpperm - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x00,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x10,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x20,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x30,$out - stvx_u $out7,$x40,$out - addi $out,$out,0x50 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_four: - vncipherlast $out4,$out4,$ivec - vncipherlast $out5,$out5,$in4 - vncipherlast $out6,$out6,$in5 - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out4,$out4,$out4,$inpperm - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x00,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x10,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x20,$out - stvx_u $out7,$x30,$out - addi $out,$out,0x40 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_three: - vncipherlast $out5,$out5,$ivec - vncipherlast $out6,$out6,$in5 - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out5,$out5,$out5,$inpperm - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x00,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x10,$out - stvx_u $out7,$x20,$out - addi $out,$out,0x30 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_two: - vncipherlast $out6,$out6,$ivec - vncipherlast $out7,$out7,$in6 - vmr $ivec,$in7 - - le?vperm $out6,$out6,$out6,$inpperm - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x00,$out - stvx_u $out7,$x10,$out - addi $out,$out,0x20 - b Lcbc_dec8x_done - -.align 5 -Lcbc_dec8x_one: - vncipherlast $out7,$out7,$ivec - vmr $ivec,$in7 - - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out7,0,$out - addi $out,$out,0x10 - -Lcbc_dec8x_done: - le?vperm $ivec,$ivec,$ivec,$inpperm - stvx_u $ivec,0,$ivp # write [unaligned] iv - - li r10,`$FRAME+15` - li r11,`$FRAME+31` - stvx $inpperm,r10,$sp # wipe copies of round keys - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - - mtspr 256,$vrsave - lvx v20,r10,$sp # ABI says so - addi r10,r10,32 - lvx v21,r11,$sp - addi r11,r11,32 - lvx v22,r10,$sp - addi r10,r10,32 - lvx v23,r11,$sp - addi r11,r11,32 - lvx v24,r10,$sp - addi r10,r10,32 - lvx v25,r11,$sp - addi r11,r11,32 - lvx v26,r10,$sp - addi r10,r10,32 - lvx v27,r11,$sp - addi r11,r11,32 - lvx v28,r10,$sp - addi r10,r10,32 - lvx v29,r11,$sp - addi r11,r11,32 - lvx v30,r10,$sp - lvx v31,r11,$sp - $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) - $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) - $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) - $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) - $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) - $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) - addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` - blr - .long 0 - .byte 0,12,0x04,0,0x80,6,6,0 - .long 0 -.size .${prefix}_cbc_encrypt,.-.${prefix}_cbc_encrypt -___ -}} }}} - -######################################################################### -{{{ # CTR procedure[s] # -my ($inp,$out,$len,$key,$ivp,$x10,$rounds,$idx)=map("r$_",(3..10)); -my ($rndkey0,$rndkey1,$inout,$tmp)= map("v$_",(0..3)); -my ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm,$one)= - map("v$_",(4..11)); -my $dat=$tmp; - -$code.=<<___; -.globl .${prefix}_ctr32_encrypt_blocks -.align 5 -.${prefix}_ctr32_encrypt_blocks: - ${UCMP}i $len,1 - bltlr- - - lis r0,0xfff0 - mfspr $vrsave,256 - mtspr 256,r0 - - li $idx,15 - vxor $rndkey0,$rndkey0,$rndkey0 - le?vspltisb $tmp,0x0f - - lvx $ivec,0,$ivp # load [unaligned] iv - lvsl $inpperm,0,$ivp - lvx $inptail,$idx,$ivp - vspltisb $one,1 - le?vxor $inpperm,$inpperm,$tmp - vperm $ivec,$ivec,$inptail,$inpperm - vsldoi $one,$rndkey0,$one,1 - - neg r11,$inp - ?lvsl $keyperm,0,$key # prepare for unaligned key - lwz $rounds,240($key) - - lvsr $inpperm,0,r11 # prepare for unaligned load - lvx $inptail,0,$inp - addi $inp,$inp,15 # 15 is not typo - le?vxor $inpperm,$inpperm,$tmp - - srwi $rounds,$rounds,1 - li $idx,16 - subi $rounds,$rounds,1 - - ${UCMP}i $len,8 - bge _aesp8_ctr32_encrypt8x - - ?lvsr $outperm,0,$out # prepare for unaligned store - vspltisb $outmask,-1 - lvx $outhead,0,$out - ?vperm $outmask,$rndkey0,$outmask,$outperm - le?vxor $outperm,$outperm,$tmp - - lvx $rndkey0,0,$key - mtctr $rounds - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$ivec,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - b Loop_ctr32_enc - -.align 5 -Loop_ctr32_enc: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - bdnz Loop_ctr32_enc - - vadduwm $ivec,$ivec,$one - vmr $dat,$inptail - lvx $inptail,0,$inp - addi $inp,$inp,16 - subic. $len,$len,1 # blocks-- - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key - vperm $dat,$dat,$inptail,$inpperm - li $idx,16 - ?vperm $rndkey1,$rndkey0,$rndkey1,$keyperm - lvx $rndkey0,0,$key - vxor $dat,$dat,$rndkey1 # last round key - vcipherlast $inout,$inout,$dat - - lvx $rndkey1,$idx,$key - addi $idx,$idx,16 - vperm $inout,$inout,$inout,$outperm - vsel $dat,$outhead,$inout,$outmask - mtctr $rounds - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vmr $outhead,$inout - vxor $inout,$ivec,$rndkey0 - lvx $rndkey0,$idx,$key - addi $idx,$idx,16 - stvx $dat,0,$out - addi $out,$out,16 - bne Loop_ctr32_enc - - addi $out,$out,-1 - lvx $inout,0,$out # redundant in aligned case - vsel $inout,$outhead,$inout,$outmask - stvx $inout,0,$out - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,6,0 - .long 0 -___ -######################################################################### -{{ # Optimized CTR procedure # -my $key_="r11"; -my ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,8,26..31)); - $x00=0 if ($flavour =~ /osx/); -my ($in0, $in1, $in2, $in3, $in4, $in5, $in6, $in7 )=map("v$_",(0..3,10,12..14)); -my ($out0,$out1,$out2,$out3,$out4,$out5,$out6,$out7)=map("v$_",(15..22)); -my $rndkey0="v23"; # v24-v25 rotating buffer for first found keys - # v26-v31 last 6 round keys -my ($tmp,$keyperm)=($in3,$in4); # aliases with "caller", redundant assignment -my ($two,$three,$four)=($outhead,$outperm,$outmask); - -$code.=<<___; -.align 5 -_aesp8_ctr32_encrypt8x: - $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) - li r10,`$FRAME+8*16+15` - li r11,`$FRAME+8*16+31` - stvx v20,r10,$sp # ABI says so - addi r10,r10,32 - stvx v21,r11,$sp - addi r11,r11,32 - stvx v22,r10,$sp - addi r10,r10,32 - stvx v23,r11,$sp - addi r11,r11,32 - stvx v24,r10,$sp - addi r10,r10,32 - stvx v25,r11,$sp - addi r11,r11,32 - stvx v26,r10,$sp - addi r10,r10,32 - stvx v27,r11,$sp - addi r11,r11,32 - stvx v28,r10,$sp - addi r10,r10,32 - stvx v29,r11,$sp - addi r11,r11,32 - stvx v30,r10,$sp - stvx v31,r11,$sp - li r0,-1 - stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave - li $x10,0x10 - $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) - li $x20,0x20 - $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) - li $x30,0x30 - $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) - li $x40,0x40 - $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) - li $x50,0x50 - $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) - li $x60,0x60 - $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) - li $x70,0x70 - mtspr 256,r0 - - subi $rounds,$rounds,3 # -4 in total - - lvx $rndkey0,$x00,$key # load key schedule - lvx v30,$x10,$key - addi $key,$key,0x20 - lvx v31,$x00,$key - ?vperm $rndkey0,$rndkey0,v30,$keyperm - addi $key_,$sp,`$FRAME+15` - mtctr $rounds - -Load_ctr32_enc_key: - ?vperm v24,v30,v31,$keyperm - lvx v30,$x10,$key - addi $key,$key,0x20 - stvx v24,$x00,$key_ # off-load round[1] - ?vperm v25,v31,v30,$keyperm - lvx v31,$x00,$key - stvx v25,$x10,$key_ # off-load round[2] - addi $key_,$key_,0x20 - bdnz Load_ctr32_enc_key - - lvx v26,$x10,$key - ?vperm v24,v30,v31,$keyperm - lvx v27,$x20,$key - stvx v24,$x00,$key_ # off-load round[3] - ?vperm v25,v31,v26,$keyperm - lvx v28,$x30,$key - stvx v25,$x10,$key_ # off-load round[4] - addi $key_,$sp,`$FRAME+15` # rewind $key_ - ?vperm v26,v26,v27,$keyperm - lvx v29,$x40,$key - ?vperm v27,v27,v28,$keyperm - lvx v30,$x50,$key - ?vperm v28,v28,v29,$keyperm - lvx v31,$x60,$key - ?vperm v29,v29,v30,$keyperm - lvx $out0,$x70,$key # borrow $out0 - ?vperm v30,v30,v31,$keyperm - lvx v24,$x00,$key_ # pre-load round[1] - ?vperm v31,v31,$out0,$keyperm - lvx v25,$x10,$key_ # pre-load round[2] - - vadduwm $two,$one,$one - subi $inp,$inp,15 # undo "caller" - $SHL $len,$len,4 - - vadduwm $out1,$ivec,$one # counter values ... - vadduwm $out2,$ivec,$two - vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0] - le?li $idx,8 - vadduwm $out3,$out1,$two - vxor $out1,$out1,$rndkey0 - le?lvsl $inpperm,0,$idx - vadduwm $out4,$out2,$two - vxor $out2,$out2,$rndkey0 - le?vspltisb $tmp,0x0f - vadduwm $out5,$out3,$two - vxor $out3,$out3,$rndkey0 - le?vxor $inpperm,$inpperm,$tmp # transform for lvx_u/stvx_u - vadduwm $out6,$out4,$two - vxor $out4,$out4,$rndkey0 - vadduwm $out7,$out5,$two - vxor $out5,$out5,$rndkey0 - vadduwm $ivec,$out6,$two # next counter value - vxor $out6,$out6,$rndkey0 - vxor $out7,$out7,$rndkey0 - - mtctr $rounds - b Loop_ctr32_enc8x -.align 5 -Loop_ctr32_enc8x: - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vcipher $out4,$out4,v24 - vcipher $out5,$out5,v24 - vcipher $out6,$out6,v24 - vcipher $out7,$out7,v24 -Loop_ctr32_enc8x_middle: - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vcipher $out4,$out4,v25 - vcipher $out5,$out5,v25 - vcipher $out6,$out6,v25 - vcipher $out7,$out7,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_ctr32_enc8x - - subic r11,$len,256 # $len-256, borrow $key_ - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vcipher $out4,$out4,v24 - vcipher $out5,$out5,v24 - vcipher $out6,$out6,v24 - vcipher $out7,$out7,v24 - - subfe r0,r0,r0 # borrow?-1:0 - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vcipher $out4,$out4,v25 - vcipher $out5,$out5,v25 - vcipher $out6,$out6,v25 - vcipher $out7,$out7,v25 - - and r0,r0,r11 - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vcipher $out0,$out0,v26 - vcipher $out1,$out1,v26 - vcipher $out2,$out2,v26 - vcipher $out3,$out3,v26 - vcipher $out4,$out4,v26 - vcipher $out5,$out5,v26 - vcipher $out6,$out6,v26 - vcipher $out7,$out7,v26 - lvx v24,$x00,$key_ # re-pre-load round[1] - - subic $len,$len,129 # $len-=129 - vcipher $out0,$out0,v27 - addi $len,$len,1 # $len-=128 really - vcipher $out1,$out1,v27 - vcipher $out2,$out2,v27 - vcipher $out3,$out3,v27 - vcipher $out4,$out4,v27 - vcipher $out5,$out5,v27 - vcipher $out6,$out6,v27 - vcipher $out7,$out7,v27 - lvx v25,$x10,$key_ # re-pre-load round[2] - - vcipher $out0,$out0,v28 - lvx_u $in0,$x00,$inp # load input - vcipher $out1,$out1,v28 - lvx_u $in1,$x10,$inp - vcipher $out2,$out2,v28 - lvx_u $in2,$x20,$inp - vcipher $out3,$out3,v28 - lvx_u $in3,$x30,$inp - vcipher $out4,$out4,v28 - lvx_u $in4,$x40,$inp - vcipher $out5,$out5,v28 - lvx_u $in5,$x50,$inp - vcipher $out6,$out6,v28 - lvx_u $in6,$x60,$inp - vcipher $out7,$out7,v28 - lvx_u $in7,$x70,$inp - addi $inp,$inp,0x80 - - vcipher $out0,$out0,v29 - le?vperm $in0,$in0,$in0,$inpperm - vcipher $out1,$out1,v29 - le?vperm $in1,$in1,$in1,$inpperm - vcipher $out2,$out2,v29 - le?vperm $in2,$in2,$in2,$inpperm - vcipher $out3,$out3,v29 - le?vperm $in3,$in3,$in3,$inpperm - vcipher $out4,$out4,v29 - le?vperm $in4,$in4,$in4,$inpperm - vcipher $out5,$out5,v29 - le?vperm $in5,$in5,$in5,$inpperm - vcipher $out6,$out6,v29 - le?vperm $in6,$in6,$in6,$inpperm - vcipher $out7,$out7,v29 - le?vperm $in7,$in7,$in7,$inpperm - - add $inp,$inp,r0 # $inp is adjusted in such - # way that at exit from the - # loop inX-in7 are loaded - # with last "words" - subfe. r0,r0,r0 # borrow?-1:0 - vcipher $out0,$out0,v30 - vxor $in0,$in0,v31 # xor with last round key - vcipher $out1,$out1,v30 - vxor $in1,$in1,v31 - vcipher $out2,$out2,v30 - vxor $in2,$in2,v31 - vcipher $out3,$out3,v30 - vxor $in3,$in3,v31 - vcipher $out4,$out4,v30 - vxor $in4,$in4,v31 - vcipher $out5,$out5,v30 - vxor $in5,$in5,v31 - vcipher $out6,$out6,v30 - vxor $in6,$in6,v31 - vcipher $out7,$out7,v30 - vxor $in7,$in7,v31 - - bne Lctr32_enc8x_break # did $len-129 borrow? - - vcipherlast $in0,$out0,$in0 - vcipherlast $in1,$out1,$in1 - vadduwm $out1,$ivec,$one # counter values ... - vcipherlast $in2,$out2,$in2 - vadduwm $out2,$ivec,$two - vxor $out0,$ivec,$rndkey0 # ... xored with rndkey[0] - vcipherlast $in3,$out3,$in3 - vadduwm $out3,$out1,$two - vxor $out1,$out1,$rndkey0 - vcipherlast $in4,$out4,$in4 - vadduwm $out4,$out2,$two - vxor $out2,$out2,$rndkey0 - vcipherlast $in5,$out5,$in5 - vadduwm $out5,$out3,$two - vxor $out3,$out3,$rndkey0 - vcipherlast $in6,$out6,$in6 - vadduwm $out6,$out4,$two - vxor $out4,$out4,$rndkey0 - vcipherlast $in7,$out7,$in7 - vadduwm $out7,$out5,$two - vxor $out5,$out5,$rndkey0 - le?vperm $in0,$in0,$in0,$inpperm - vadduwm $ivec,$out6,$two # next counter value - vxor $out6,$out6,$rndkey0 - le?vperm $in1,$in1,$in1,$inpperm - vxor $out7,$out7,$rndkey0 - mtctr $rounds - - vcipher $out0,$out0,v24 - stvx_u $in0,$x00,$out - le?vperm $in2,$in2,$in2,$inpperm - vcipher $out1,$out1,v24 - stvx_u $in1,$x10,$out - le?vperm $in3,$in3,$in3,$inpperm - vcipher $out2,$out2,v24 - stvx_u $in2,$x20,$out - le?vperm $in4,$in4,$in4,$inpperm - vcipher $out3,$out3,v24 - stvx_u $in3,$x30,$out - le?vperm $in5,$in5,$in5,$inpperm - vcipher $out4,$out4,v24 - stvx_u $in4,$x40,$out - le?vperm $in6,$in6,$in6,$inpperm - vcipher $out5,$out5,v24 - stvx_u $in5,$x50,$out - le?vperm $in7,$in7,$in7,$inpperm - vcipher $out6,$out6,v24 - stvx_u $in6,$x60,$out - vcipher $out7,$out7,v24 - stvx_u $in7,$x70,$out - addi $out,$out,0x80 - - b Loop_ctr32_enc8x_middle - -.align 5 -Lctr32_enc8x_break: - cmpwi $len,-0x60 - blt Lctr32_enc8x_one - nop - beq Lctr32_enc8x_two - cmpwi $len,-0x40 - blt Lctr32_enc8x_three - nop - beq Lctr32_enc8x_four - cmpwi $len,-0x20 - blt Lctr32_enc8x_five - nop - beq Lctr32_enc8x_six - cmpwi $len,0x00 - blt Lctr32_enc8x_seven - -Lctr32_enc8x_eight: - vcipherlast $out0,$out0,$in0 - vcipherlast $out1,$out1,$in1 - vcipherlast $out2,$out2,$in2 - vcipherlast $out3,$out3,$in3 - vcipherlast $out4,$out4,$in4 - vcipherlast $out5,$out5,$in5 - vcipherlast $out6,$out6,$in6 - vcipherlast $out7,$out7,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x30,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x40,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x50,$out - le?vperm $out7,$out7,$out7,$inpperm - stvx_u $out6,$x60,$out - stvx_u $out7,$x70,$out - addi $out,$out,0x80 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_seven: - vcipherlast $out0,$out0,$in1 - vcipherlast $out1,$out1,$in2 - vcipherlast $out2,$out2,$in3 - vcipherlast $out3,$out3,$in4 - vcipherlast $out4,$out4,$in5 - vcipherlast $out5,$out5,$in6 - vcipherlast $out6,$out6,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x30,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x40,$out - le?vperm $out6,$out6,$out6,$inpperm - stvx_u $out5,$x50,$out - stvx_u $out6,$x60,$out - addi $out,$out,0x70 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_six: - vcipherlast $out0,$out0,$in2 - vcipherlast $out1,$out1,$in3 - vcipherlast $out2,$out2,$in4 - vcipherlast $out3,$out3,$in5 - vcipherlast $out4,$out4,$in6 - vcipherlast $out5,$out5,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x30,$out - le?vperm $out5,$out5,$out5,$inpperm - stvx_u $out4,$x40,$out - stvx_u $out5,$x50,$out - addi $out,$out,0x60 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_five: - vcipherlast $out0,$out0,$in3 - vcipherlast $out1,$out1,$in4 - vcipherlast $out2,$out2,$in5 - vcipherlast $out3,$out3,$in6 - vcipherlast $out4,$out4,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - le?vperm $out4,$out4,$out4,$inpperm - stvx_u $out3,$x30,$out - stvx_u $out4,$x40,$out - addi $out,$out,0x50 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_four: - vcipherlast $out0,$out0,$in4 - vcipherlast $out1,$out1,$in5 - vcipherlast $out2,$out2,$in6 - vcipherlast $out3,$out3,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$inpperm - stvx_u $out2,$x20,$out - stvx_u $out3,$x30,$out - addi $out,$out,0x40 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_three: - vcipherlast $out0,$out0,$in5 - vcipherlast $out1,$out1,$in6 - vcipherlast $out2,$out2,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - le?vperm $out2,$out2,$out2,$inpperm - stvx_u $out1,$x10,$out - stvx_u $out2,$x20,$out - addi $out,$out,0x30 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_two: - vcipherlast $out0,$out0,$in6 - vcipherlast $out1,$out1,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - le?vperm $out1,$out1,$out1,$inpperm - stvx_u $out0,$x00,$out - stvx_u $out1,$x10,$out - addi $out,$out,0x20 - b Lctr32_enc8x_done - -.align 5 -Lctr32_enc8x_one: - vcipherlast $out0,$out0,$in7 - - le?vperm $out0,$out0,$out0,$inpperm - stvx_u $out0,0,$out - addi $out,$out,0x10 - -Lctr32_enc8x_done: - li r10,`$FRAME+15` - li r11,`$FRAME+31` - stvx $inpperm,r10,$sp # wipe copies of round keys - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - stvx $inpperm,r10,$sp - addi r10,r10,32 - stvx $inpperm,r11,$sp - addi r11,r11,32 - - mtspr 256,$vrsave - lvx v20,r10,$sp # ABI says so - addi r10,r10,32 - lvx v21,r11,$sp - addi r11,r11,32 - lvx v22,r10,$sp - addi r10,r10,32 - lvx v23,r11,$sp - addi r11,r11,32 - lvx v24,r10,$sp - addi r10,r10,32 - lvx v25,r11,$sp - addi r11,r11,32 - lvx v26,r10,$sp - addi r10,r10,32 - lvx v27,r11,$sp - addi r11,r11,32 - lvx v28,r10,$sp - addi r10,r10,32 - lvx v29,r11,$sp - addi r11,r11,32 - lvx v30,r10,$sp - lvx v31,r11,$sp - $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) - $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) - $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) - $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) - $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) - $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) - addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` - blr - .long 0 - .byte 0,12,0x04,0,0x80,6,6,0 - .long 0 -.size .${prefix}_ctr32_encrypt_blocks,.-.${prefix}_ctr32_encrypt_blocks -___ -}} }}} - -######################################################################### -{{{ # XTS procedures # -# int aes_p8_xts_[en|de]crypt(const char *inp, char *out, size_t len, # -# const AES_KEY *key1, const AES_KEY *key2, # -# [const] unsigned char iv[16]); # -# If $key2 is NULL, then a "tweak chaining" mode is engaged, in which # -# input tweak value is assumed to be encrypted already, and last tweak # -# value, one suitable for consecutive call on same chunk of data, is # -# written back to original buffer. In addition, in "tweak chaining" # -# mode only complete input blocks are processed. # - -my ($inp,$out,$len,$key1,$key2,$ivp,$rounds,$idx) = map("r$_",(3..10)); -my ($rndkey0,$rndkey1,$inout) = map("v$_",(0..2)); -my ($output,$inptail,$inpperm,$leperm,$keyperm) = map("v$_",(3..7)); -my ($tweak,$seven,$eighty7,$tmp,$tweak1) = map("v$_",(8..12)); -my $taillen = $key2; - - ($inp,$idx) = ($idx,$inp); # reassign - -$code.=<<___; -.globl .${prefix}_xts_encrypt -.align 5 -.${prefix}_xts_encrypt: - mr $inp,r3 # reassign - li r3,-1 - ${UCMP}i $len,16 - bltlr- - - lis r0,0xfff0 - mfspr r12,256 # save vrsave - li r11,0 - mtspr 256,r0 - - vspltisb $seven,0x07 # 0x070707..07 - le?lvsl $leperm,r11,r11 - le?vspltisb $tmp,0x0f - le?vxor $leperm,$leperm,$seven - - li $idx,15 - lvx $tweak,0,$ivp # load [unaligned] iv - lvsl $inpperm,0,$ivp - lvx $inptail,$idx,$ivp - le?vxor $inpperm,$inpperm,$tmp - vperm $tweak,$tweak,$inptail,$inpperm - - neg r11,$inp - lvsr $inpperm,0,r11 # prepare for unaligned load - lvx $inout,0,$inp - addi $inp,$inp,15 # 15 is not typo - le?vxor $inpperm,$inpperm,$tmp - - ${UCMP}i $key2,0 # key2==NULL? - beq Lxts_enc_no_key2 - - ?lvsl $keyperm,0,$key2 # prepare for unaligned key - lwz $rounds,240($key2) - srwi $rounds,$rounds,1 - subi $rounds,$rounds,1 - li $idx,16 - - lvx $rndkey0,0,$key2 - lvx $rndkey1,$idx,$key2 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $tweak,$tweak,$rndkey0 - lvx $rndkey0,$idx,$key2 - addi $idx,$idx,16 - mtctr $rounds - -Ltweak_xts_enc: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $tweak,$tweak,$rndkey1 - lvx $rndkey1,$idx,$key2 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipher $tweak,$tweak,$rndkey0 - lvx $rndkey0,$idx,$key2 - addi $idx,$idx,16 - bdnz Ltweak_xts_enc - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $tweak,$tweak,$rndkey1 - lvx $rndkey1,$idx,$key2 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipherlast $tweak,$tweak,$rndkey0 - - li $ivp,0 # don't chain the tweak - b Lxts_enc - -Lxts_enc_no_key2: - li $idx,-16 - and $len,$len,$idx # in "tweak chaining" - # mode only complete - # blocks are processed -Lxts_enc: - lvx $inptail,0,$inp - addi $inp,$inp,16 - - ?lvsl $keyperm,0,$key1 # prepare for unaligned key - lwz $rounds,240($key1) - srwi $rounds,$rounds,1 - subi $rounds,$rounds,1 - li $idx,16 - - vslb $eighty7,$seven,$seven # 0x808080..80 - vor $eighty7,$eighty7,$seven # 0x878787..87 - vspltisb $tmp,1 # 0x010101..01 - vsldoi $eighty7,$eighty7,$tmp,15 # 0x870101..01 - - ${UCMP}i $len,96 - bge _aesp8_xts_encrypt6x - - andi. $taillen,$len,15 - subic r0,$len,32 - subi $taillen,$taillen,16 - subfe r0,r0,r0 - and r0,r0,$taillen - add $inp,$inp,r0 - - lvx $rndkey0,0,$key1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - vperm $inout,$inout,$inptail,$inpperm - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$inout,$tweak - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - mtctr $rounds - b Loop_xts_enc - -.align 5 -Loop_xts_enc: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - bdnz Loop_xts_enc - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - li $idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $rndkey0,$rndkey0,$tweak - vcipherlast $output,$inout,$rndkey0 - - le?vperm $tmp,$output,$output,$leperm - be?nop - le?stvx_u $tmp,0,$out - be?stvx_u $output,0,$out - addi $out,$out,16 - - subic. $len,$len,16 - beq Lxts_enc_done - - vmr $inout,$inptail - lvx $inptail,0,$inp - addi $inp,$inp,16 - lvx $rndkey0,0,$key1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - - subic r0,$len,32 - subfe r0,r0,r0 - and r0,r0,$taillen - add $inp,$inp,r0 - - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $tweak,$tweak,$tmp - - vperm $inout,$inout,$inptail,$inpperm - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$inout,$tweak - vxor $output,$output,$rndkey0 # just in case $len<16 - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - - mtctr $rounds - ${UCMP}i $len,16 - bge Loop_xts_enc - - vxor $output,$output,$tweak - lvsr $inpperm,0,$len # $inpperm is no longer needed - vxor $inptail,$inptail,$inptail # $inptail is no longer needed - vspltisb $tmp,-1 - vperm $inptail,$inptail,$tmp,$inpperm - vsel $inout,$inout,$output,$inptail - - subi r11,$out,17 - subi $out,$out,16 - mtctr $len - li $len,16 -Loop_xts_enc_steal: - lbzu r0,1(r11) - stb r0,16(r11) - bdnz Loop_xts_enc_steal - - mtctr $rounds - b Loop_xts_enc # one more time... - -Lxts_enc_done: - ${UCMP}i $ivp,0 - beq Lxts_enc_ret - - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $tweak,$tweak,$tmp - - le?vperm $tweak,$tweak,$tweak,$leperm - stvx_u $tweak,0,$ivp - -Lxts_enc_ret: - mtspr 256,r12 # restore vrsave - li r3,0 - blr - .long 0 - .byte 0,12,0x04,0,0x80,6,6,0 - .long 0 -.size .${prefix}_xts_encrypt,.-.${prefix}_xts_encrypt - -.globl .${prefix}_xts_decrypt -.align 5 -.${prefix}_xts_decrypt: - mr $inp,r3 # reassign - li r3,-1 - ${UCMP}i $len,16 - bltlr- - - lis r0,0xfff8 - mfspr r12,256 # save vrsave - li r11,0 - mtspr 256,r0 - - andi. r0,$len,15 - neg r0,r0 - andi. r0,r0,16 - sub $len,$len,r0 - - vspltisb $seven,0x07 # 0x070707..07 - le?lvsl $leperm,r11,r11 - le?vspltisb $tmp,0x0f - le?vxor $leperm,$leperm,$seven - - li $idx,15 - lvx $tweak,0,$ivp # load [unaligned] iv - lvsl $inpperm,0,$ivp - lvx $inptail,$idx,$ivp - le?vxor $inpperm,$inpperm,$tmp - vperm $tweak,$tweak,$inptail,$inpperm - - neg r11,$inp - lvsr $inpperm,0,r11 # prepare for unaligned load - lvx $inout,0,$inp - addi $inp,$inp,15 # 15 is not typo - le?vxor $inpperm,$inpperm,$tmp - - ${UCMP}i $key2,0 # key2==NULL? - beq Lxts_dec_no_key2 - - ?lvsl $keyperm,0,$key2 # prepare for unaligned key - lwz $rounds,240($key2) - srwi $rounds,$rounds,1 - subi $rounds,$rounds,1 - li $idx,16 - - lvx $rndkey0,0,$key2 - lvx $rndkey1,$idx,$key2 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $tweak,$tweak,$rndkey0 - lvx $rndkey0,$idx,$key2 - addi $idx,$idx,16 - mtctr $rounds - -Ltweak_xts_dec: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $tweak,$tweak,$rndkey1 - lvx $rndkey1,$idx,$key2 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipher $tweak,$tweak,$rndkey0 - lvx $rndkey0,$idx,$key2 - addi $idx,$idx,16 - bdnz Ltweak_xts_dec - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vcipher $tweak,$tweak,$rndkey1 - lvx $rndkey1,$idx,$key2 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vcipherlast $tweak,$tweak,$rndkey0 - - li $ivp,0 # don't chain the tweak - b Lxts_dec - -Lxts_dec_no_key2: - neg $idx,$len - andi. $idx,$idx,15 - add $len,$len,$idx # in "tweak chaining" - # mode only complete - # blocks are processed -Lxts_dec: - lvx $inptail,0,$inp - addi $inp,$inp,16 - - ?lvsl $keyperm,0,$key1 # prepare for unaligned key - lwz $rounds,240($key1) - srwi $rounds,$rounds,1 - subi $rounds,$rounds,1 - li $idx,16 - - vslb $eighty7,$seven,$seven # 0x808080..80 - vor $eighty7,$eighty7,$seven # 0x878787..87 - vspltisb $tmp,1 # 0x010101..01 - vsldoi $eighty7,$eighty7,$tmp,15 # 0x870101..01 - - ${UCMP}i $len,96 - bge _aesp8_xts_decrypt6x - - lvx $rndkey0,0,$key1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - vperm $inout,$inout,$inptail,$inpperm - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$inout,$tweak - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - mtctr $rounds - - ${UCMP}i $len,16 - blt Ltail_xts_dec - be?b Loop_xts_dec - -.align 5 -Loop_xts_dec: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vncipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - bdnz Loop_xts_dec - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - li $idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $rndkey0,$rndkey0,$tweak - vncipherlast $output,$inout,$rndkey0 - - le?vperm $tmp,$output,$output,$leperm - be?nop - le?stvx_u $tmp,0,$out - be?stvx_u $output,0,$out - addi $out,$out,16 - - subic. $len,$len,16 - beq Lxts_dec_done - - vmr $inout,$inptail - lvx $inptail,0,$inp - addi $inp,$inp,16 - lvx $rndkey0,0,$key1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $tweak,$tweak,$tmp - - vperm $inout,$inout,$inptail,$inpperm - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $inout,$inout,$tweak - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - - mtctr $rounds - ${UCMP}i $len,16 - bge Loop_xts_dec - -Ltail_xts_dec: - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak1,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $tweak1,$tweak1,$tmp - - subi $inp,$inp,16 - add $inp,$inp,$len - - vxor $inout,$inout,$tweak # :-( - vxor $inout,$inout,$tweak1 # :-) - -Loop_xts_dec_short: - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vncipher $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - bdnz Loop_xts_dec_short - - ?vperm $rndkey1,$rndkey1,$rndkey0,$keyperm - vncipher $inout,$inout,$rndkey1 - lvx $rndkey1,$idx,$key1 - li $idx,16 - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - vxor $rndkey0,$rndkey0,$tweak1 - vncipherlast $output,$inout,$rndkey0 - - le?vperm $tmp,$output,$output,$leperm - be?nop - le?stvx_u $tmp,0,$out - be?stvx_u $output,0,$out - - vmr $inout,$inptail - lvx $inptail,0,$inp - #addi $inp,$inp,16 - lvx $rndkey0,0,$key1 - lvx $rndkey1,$idx,$key1 - addi $idx,$idx,16 - vperm $inout,$inout,$inptail,$inpperm - ?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm - - lvsr $inpperm,0,$len # $inpperm is no longer needed - vxor $inptail,$inptail,$inptail # $inptail is no longer needed - vspltisb $tmp,-1 - vperm $inptail,$inptail,$tmp,$inpperm - vsel $inout,$inout,$output,$inptail - - vxor $rndkey0,$rndkey0,$tweak - vxor $inout,$inout,$rndkey0 - lvx $rndkey0,$idx,$key1 - addi $idx,$idx,16 - - subi r11,$out,1 - mtctr $len - li $len,16 -Loop_xts_dec_steal: - lbzu r0,1(r11) - stb r0,16(r11) - bdnz Loop_xts_dec_steal - - mtctr $rounds - b Loop_xts_dec # one more time... - -Lxts_dec_done: - ${UCMP}i $ivp,0 - beq Lxts_dec_ret - - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $tweak,$tweak,$tmp - - le?vperm $tweak,$tweak,$tweak,$leperm - stvx_u $tweak,0,$ivp - -Lxts_dec_ret: - mtspr 256,r12 # restore vrsave - li r3,0 - blr - .long 0 - .byte 0,12,0x04,0,0x80,6,6,0 - .long 0 -.size .${prefix}_xts_decrypt,.-.${prefix}_xts_decrypt -___ -######################################################################### -{{ # Optimized XTS procedures # -my $key_=$key2; -my ($x00,$x10,$x20,$x30,$x40,$x50,$x60,$x70)=map("r$_",(0,3,26..31)); - $x00=0 if ($flavour =~ /osx/); -my ($in0, $in1, $in2, $in3, $in4, $in5 )=map("v$_",(0..5)); -my ($out0, $out1, $out2, $out3, $out4, $out5)=map("v$_",(7,12..16)); -my ($twk0, $twk1, $twk2, $twk3, $twk4, $twk5)=map("v$_",(17..22)); -my $rndkey0="v23"; # v24-v25 rotating buffer for first found keys - # v26-v31 last 6 round keys -my ($keyperm)=($out0); # aliases with "caller", redundant assignment -my $taillen=$x70; - -$code.=<<___; -.align 5 -_aesp8_xts_encrypt6x: - $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) - mflr r11 - li r7,`$FRAME+8*16+15` - li r3,`$FRAME+8*16+31` - $PUSH r11,`$FRAME+21*16+6*$SIZE_T+$LRSAVE`($sp) - stvx v20,r7,$sp # ABI says so - addi r7,r7,32 - stvx v21,r3,$sp - addi r3,r3,32 - stvx v22,r7,$sp - addi r7,r7,32 - stvx v23,r3,$sp - addi r3,r3,32 - stvx v24,r7,$sp - addi r7,r7,32 - stvx v25,r3,$sp - addi r3,r3,32 - stvx v26,r7,$sp - addi r7,r7,32 - stvx v27,r3,$sp - addi r3,r3,32 - stvx v28,r7,$sp - addi r7,r7,32 - stvx v29,r3,$sp - addi r3,r3,32 - stvx v30,r7,$sp - stvx v31,r3,$sp - li r0,-1 - stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave - li $x10,0x10 - $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) - li $x20,0x20 - $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) - li $x30,0x30 - $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) - li $x40,0x40 - $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) - li $x50,0x50 - $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) - li $x60,0x60 - $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) - li $x70,0x70 - mtspr 256,r0 - - subi $rounds,$rounds,3 # -4 in total - - lvx $rndkey0,$x00,$key1 # load key schedule - lvx v30,$x10,$key1 - addi $key1,$key1,0x20 - lvx v31,$x00,$key1 - ?vperm $rndkey0,$rndkey0,v30,$keyperm - addi $key_,$sp,`$FRAME+15` - mtctr $rounds - -Load_xts_enc_key: - ?vperm v24,v30,v31,$keyperm - lvx v30,$x10,$key1 - addi $key1,$key1,0x20 - stvx v24,$x00,$key_ # off-load round[1] - ?vperm v25,v31,v30,$keyperm - lvx v31,$x00,$key1 - stvx v25,$x10,$key_ # off-load round[2] - addi $key_,$key_,0x20 - bdnz Load_xts_enc_key - - lvx v26,$x10,$key1 - ?vperm v24,v30,v31,$keyperm - lvx v27,$x20,$key1 - stvx v24,$x00,$key_ # off-load round[3] - ?vperm v25,v31,v26,$keyperm - lvx v28,$x30,$key1 - stvx v25,$x10,$key_ # off-load round[4] - addi $key_,$sp,`$FRAME+15` # rewind $key_ - ?vperm v26,v26,v27,$keyperm - lvx v29,$x40,$key1 - ?vperm v27,v27,v28,$keyperm - lvx v30,$x50,$key1 - ?vperm v28,v28,v29,$keyperm - lvx v31,$x60,$key1 - ?vperm v29,v29,v30,$keyperm - lvx $twk5,$x70,$key1 # borrow $twk5 - ?vperm v30,v30,v31,$keyperm - lvx v24,$x00,$key_ # pre-load round[1] - ?vperm v31,v31,$twk5,$keyperm - lvx v25,$x10,$key_ # pre-load round[2] - - vperm $in0,$inout,$inptail,$inpperm - subi $inp,$inp,31 # undo "caller" - vxor $twk0,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $out0,$in0,$twk0 - vxor $tweak,$tweak,$tmp - - lvx_u $in1,$x10,$inp - vxor $twk1,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in1,$in1,$in1,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out1,$in1,$twk1 - vxor $tweak,$tweak,$tmp - - lvx_u $in2,$x20,$inp - andi. $taillen,$len,15 - vxor $twk2,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in2,$in2,$in2,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out2,$in2,$twk2 - vxor $tweak,$tweak,$tmp - - lvx_u $in3,$x30,$inp - sub $len,$len,$taillen - vxor $twk3,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in3,$in3,$in3,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out3,$in3,$twk3 - vxor $tweak,$tweak,$tmp - - lvx_u $in4,$x40,$inp - subi $len,$len,0x60 - vxor $twk4,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in4,$in4,$in4,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out4,$in4,$twk4 - vxor $tweak,$tweak,$tmp - - lvx_u $in5,$x50,$inp - addi $inp,$inp,0x60 - vxor $twk5,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in5,$in5,$in5,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out5,$in5,$twk5 - vxor $tweak,$tweak,$tmp - - vxor v31,v31,$rndkey0 - mtctr $rounds - b Loop_xts_enc6x - -.align 5 -Loop_xts_enc6x: - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vcipher $out4,$out4,v24 - vcipher $out5,$out5,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vcipher $out4,$out4,v25 - vcipher $out5,$out5,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_xts_enc6x - - subic $len,$len,96 # $len-=96 - vxor $in0,$twk0,v31 # xor with last round key - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk0,$tweak,$rndkey0 - vaddubm $tweak,$tweak,$tweak - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vsldoi $tmp,$tmp,$tmp,15 - vcipher $out4,$out4,v24 - vcipher $out5,$out5,v24 - - subfe. r0,r0,r0 # borrow?-1:0 - vand $tmp,$tmp,$eighty7 - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vxor $tweak,$tweak,$tmp - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vxor $in1,$twk1,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk1,$tweak,$rndkey0 - vcipher $out4,$out4,v25 - vcipher $out5,$out5,v25 - - and r0,r0,$len - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vcipher $out0,$out0,v26 - vcipher $out1,$out1,v26 - vand $tmp,$tmp,$eighty7 - vcipher $out2,$out2,v26 - vcipher $out3,$out3,v26 - vxor $tweak,$tweak,$tmp - vcipher $out4,$out4,v26 - vcipher $out5,$out5,v26 - - add $inp,$inp,r0 # $inp is adjusted in such - # way that at exit from the - # loop inX-in5 are loaded - # with last "words" - vxor $in2,$twk2,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk2,$tweak,$rndkey0 - vaddubm $tweak,$tweak,$tweak - vcipher $out0,$out0,v27 - vcipher $out1,$out1,v27 - vsldoi $tmp,$tmp,$tmp,15 - vcipher $out2,$out2,v27 - vcipher $out3,$out3,v27 - vand $tmp,$tmp,$eighty7 - vcipher $out4,$out4,v27 - vcipher $out5,$out5,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vxor $tweak,$tweak,$tmp - vcipher $out0,$out0,v28 - vcipher $out1,$out1,v28 - vxor $in3,$twk3,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk3,$tweak,$rndkey0 - vcipher $out2,$out2,v28 - vcipher $out3,$out3,v28 - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vcipher $out4,$out4,v28 - vcipher $out5,$out5,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - vand $tmp,$tmp,$eighty7 - - vcipher $out0,$out0,v29 - vcipher $out1,$out1,v29 - vxor $tweak,$tweak,$tmp - vcipher $out2,$out2,v29 - vcipher $out3,$out3,v29 - vxor $in4,$twk4,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk4,$tweak,$rndkey0 - vcipher $out4,$out4,v29 - vcipher $out5,$out5,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - - vcipher $out0,$out0,v30 - vcipher $out1,$out1,v30 - vand $tmp,$tmp,$eighty7 - vcipher $out2,$out2,v30 - vcipher $out3,$out3,v30 - vxor $tweak,$tweak,$tmp - vcipher $out4,$out4,v30 - vcipher $out5,$out5,v30 - vxor $in5,$twk5,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk5,$tweak,$rndkey0 - - vcipherlast $out0,$out0,$in0 - lvx_u $in0,$x00,$inp # load next input block - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vcipherlast $out1,$out1,$in1 - lvx_u $in1,$x10,$inp - vcipherlast $out2,$out2,$in2 - le?vperm $in0,$in0,$in0,$leperm - lvx_u $in2,$x20,$inp - vand $tmp,$tmp,$eighty7 - vcipherlast $out3,$out3,$in3 - le?vperm $in1,$in1,$in1,$leperm - lvx_u $in3,$x30,$inp - vcipherlast $out4,$out4,$in4 - le?vperm $in2,$in2,$in2,$leperm - lvx_u $in4,$x40,$inp - vxor $tweak,$tweak,$tmp - vcipherlast $tmp,$out5,$in5 # last block might be needed - # in stealing mode - le?vperm $in3,$in3,$in3,$leperm - lvx_u $in5,$x50,$inp - addi $inp,$inp,0x60 - le?vperm $in4,$in4,$in4,$leperm - le?vperm $in5,$in5,$in5,$leperm - - le?vperm $out0,$out0,$out0,$leperm - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk0 - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - vxor $out1,$in1,$twk1 - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - vxor $out2,$in2,$twk2 - le?vperm $out4,$out4,$out4,$leperm - stvx_u $out3,$x30,$out - vxor $out3,$in3,$twk3 - le?vperm $out5,$tmp,$tmp,$leperm - stvx_u $out4,$x40,$out - vxor $out4,$in4,$twk4 - le?stvx_u $out5,$x50,$out - be?stvx_u $tmp, $x50,$out - vxor $out5,$in5,$twk5 - addi $out,$out,0x60 - - mtctr $rounds - beq Loop_xts_enc6x # did $len-=96 borrow? - - addic. $len,$len,0x60 - beq Lxts_enc6x_zero - cmpwi $len,0x20 - blt Lxts_enc6x_one - nop - beq Lxts_enc6x_two - cmpwi $len,0x40 - blt Lxts_enc6x_three - nop - beq Lxts_enc6x_four - -Lxts_enc6x_five: - vxor $out0,$in1,$twk0 - vxor $out1,$in2,$twk1 - vxor $out2,$in3,$twk2 - vxor $out3,$in4,$twk3 - vxor $out4,$in5,$twk4 - - bl _aesp8_xts_enc5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk5 # unused tweak - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - vxor $tmp,$out4,$twk5 # last block prep for stealing - le?vperm $out4,$out4,$out4,$leperm - stvx_u $out3,$x30,$out - stvx_u $out4,$x40,$out - addi $out,$out,0x50 - bne Lxts_enc6x_steal - b Lxts_enc6x_done - -.align 4 -Lxts_enc6x_four: - vxor $out0,$in2,$twk0 - vxor $out1,$in3,$twk1 - vxor $out2,$in4,$twk2 - vxor $out3,$in5,$twk3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_enc5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk4 # unused tweak - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - vxor $tmp,$out3,$twk4 # last block prep for stealing - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - stvx_u $out3,$x30,$out - addi $out,$out,0x40 - bne Lxts_enc6x_steal - b Lxts_enc6x_done - -.align 4 -Lxts_enc6x_three: - vxor $out0,$in3,$twk0 - vxor $out1,$in4,$twk1 - vxor $out2,$in5,$twk2 - vxor $out3,$out3,$out3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_enc5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk3 # unused tweak - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $tmp,$out2,$twk3 # last block prep for stealing - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - stvx_u $out2,$x20,$out - addi $out,$out,0x30 - bne Lxts_enc6x_steal - b Lxts_enc6x_done - -.align 4 -Lxts_enc6x_two: - vxor $out0,$in4,$twk0 - vxor $out1,$in5,$twk1 - vxor $out2,$out2,$out2 - vxor $out3,$out3,$out3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_enc5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk2 # unused tweak - vxor $tmp,$out1,$twk2 # last block prep for stealing - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - stvx_u $out1,$x10,$out - addi $out,$out,0x20 - bne Lxts_enc6x_steal - b Lxts_enc6x_done - -.align 4 -Lxts_enc6x_one: - vxor $out0,$in5,$twk0 - nop -Loop_xts_enc1x: - vcipher $out0,$out0,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vcipher $out0,$out0,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_xts_enc1x - - add $inp,$inp,$taillen - cmpwi $taillen,0 - vcipher $out0,$out0,v24 - - subi $inp,$inp,16 - vcipher $out0,$out0,v25 - - lvsr $inpperm,0,$taillen - vcipher $out0,$out0,v26 - - lvx_u $in0,0,$inp - vcipher $out0,$out0,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vcipher $out0,$out0,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - - vcipher $out0,$out0,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vxor $twk0,$twk0,v31 - - le?vperm $in0,$in0,$in0,$leperm - vcipher $out0,$out0,v30 - - vperm $in0,$in0,$in0,$inpperm - vcipherlast $out0,$out0,$twk0 - - vmr $twk0,$twk1 # unused tweak - vxor $tmp,$out0,$twk1 # last block prep for stealing - le?vperm $out0,$out0,$out0,$leperm - stvx_u $out0,$x00,$out # store output - addi $out,$out,0x10 - bne Lxts_enc6x_steal - b Lxts_enc6x_done - -.align 4 -Lxts_enc6x_zero: - cmpwi $taillen,0 - beq Lxts_enc6x_done - - add $inp,$inp,$taillen - subi $inp,$inp,16 - lvx_u $in0,0,$inp - lvsr $inpperm,0,$taillen # $in5 is no more - le?vperm $in0,$in0,$in0,$leperm - vperm $in0,$in0,$in0,$inpperm - vxor $tmp,$tmp,$twk0 -Lxts_enc6x_steal: - vxor $in0,$in0,$twk0 - vxor $out0,$out0,$out0 - vspltisb $out1,-1 - vperm $out0,$out0,$out1,$inpperm - vsel $out0,$in0,$tmp,$out0 # $tmp is last block, remember? - - subi r30,$out,17 - subi $out,$out,16 - mtctr $taillen -Loop_xts_enc6x_steal: - lbzu r0,1(r30) - stb r0,16(r30) - bdnz Loop_xts_enc6x_steal - - li $taillen,0 - mtctr $rounds - b Loop_xts_enc1x # one more time... - -.align 4 -Lxts_enc6x_done: - ${UCMP}i $ivp,0 - beq Lxts_enc6x_ret - - vxor $tweak,$twk0,$rndkey0 - le?vperm $tweak,$tweak,$tweak,$leperm - stvx_u $tweak,0,$ivp - -Lxts_enc6x_ret: - mtlr r11 - li r10,`$FRAME+15` - li r11,`$FRAME+31` - stvx $seven,r10,$sp # wipe copies of round keys - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - - mtspr 256,$vrsave - lvx v20,r10,$sp # ABI says so - addi r10,r10,32 - lvx v21,r11,$sp - addi r11,r11,32 - lvx v22,r10,$sp - addi r10,r10,32 - lvx v23,r11,$sp - addi r11,r11,32 - lvx v24,r10,$sp - addi r10,r10,32 - lvx v25,r11,$sp - addi r11,r11,32 - lvx v26,r10,$sp - addi r10,r10,32 - lvx v27,r11,$sp - addi r11,r11,32 - lvx v28,r10,$sp - addi r10,r10,32 - lvx v29,r11,$sp - addi r11,r11,32 - lvx v30,r10,$sp - lvx v31,r11,$sp - $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) - $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) - $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) - $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) - $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) - $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) - addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` - blr - .long 0 - .byte 0,12,0x04,1,0x80,6,6,0 - .long 0 - -.align 5 -_aesp8_xts_enc5x: - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vcipher $out4,$out4,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vcipher $out4,$out4,v25 - lvx v25,$x10,$key_ # round[4] - bdnz _aesp8_xts_enc5x - - add $inp,$inp,$taillen - cmpwi $taillen,0 - vcipher $out0,$out0,v24 - vcipher $out1,$out1,v24 - vcipher $out2,$out2,v24 - vcipher $out3,$out3,v24 - vcipher $out4,$out4,v24 - - subi $inp,$inp,16 - vcipher $out0,$out0,v25 - vcipher $out1,$out1,v25 - vcipher $out2,$out2,v25 - vcipher $out3,$out3,v25 - vcipher $out4,$out4,v25 - vxor $twk0,$twk0,v31 - - vcipher $out0,$out0,v26 - lvsr $inpperm,0,$taillen # $in5 is no more - vcipher $out1,$out1,v26 - vcipher $out2,$out2,v26 - vcipher $out3,$out3,v26 - vcipher $out4,$out4,v26 - vxor $in1,$twk1,v31 - - vcipher $out0,$out0,v27 - lvx_u $in0,0,$inp - vcipher $out1,$out1,v27 - vcipher $out2,$out2,v27 - vcipher $out3,$out3,v27 - vcipher $out4,$out4,v27 - vxor $in2,$twk2,v31 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vcipher $out0,$out0,v28 - vcipher $out1,$out1,v28 - vcipher $out2,$out2,v28 - vcipher $out3,$out3,v28 - vcipher $out4,$out4,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - vxor $in3,$twk3,v31 - - vcipher $out0,$out0,v29 - le?vperm $in0,$in0,$in0,$leperm - vcipher $out1,$out1,v29 - vcipher $out2,$out2,v29 - vcipher $out3,$out3,v29 - vcipher $out4,$out4,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vxor $in4,$twk4,v31 - - vcipher $out0,$out0,v30 - vperm $in0,$in0,$in0,$inpperm - vcipher $out1,$out1,v30 - vcipher $out2,$out2,v30 - vcipher $out3,$out3,v30 - vcipher $out4,$out4,v30 - - vcipherlast $out0,$out0,$twk0 - vcipherlast $out1,$out1,$in1 - vcipherlast $out2,$out2,$in2 - vcipherlast $out3,$out3,$in3 - vcipherlast $out4,$out4,$in4 - blr - .long 0 - .byte 0,12,0x14,0,0,0,0,0 - -.align 5 -_aesp8_xts_decrypt6x: - $STU $sp,-`($FRAME+21*16+6*$SIZE_T)`($sp) - mflr r11 - li r7,`$FRAME+8*16+15` - li r3,`$FRAME+8*16+31` - $PUSH r11,`$FRAME+21*16+6*$SIZE_T+$LRSAVE`($sp) - stvx v20,r7,$sp # ABI says so - addi r7,r7,32 - stvx v21,r3,$sp - addi r3,r3,32 - stvx v22,r7,$sp - addi r7,r7,32 - stvx v23,r3,$sp - addi r3,r3,32 - stvx v24,r7,$sp - addi r7,r7,32 - stvx v25,r3,$sp - addi r3,r3,32 - stvx v26,r7,$sp - addi r7,r7,32 - stvx v27,r3,$sp - addi r3,r3,32 - stvx v28,r7,$sp - addi r7,r7,32 - stvx v29,r3,$sp - addi r3,r3,32 - stvx v30,r7,$sp - stvx v31,r3,$sp - li r0,-1 - stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave - li $x10,0x10 - $PUSH r26,`$FRAME+21*16+0*$SIZE_T`($sp) - li $x20,0x20 - $PUSH r27,`$FRAME+21*16+1*$SIZE_T`($sp) - li $x30,0x30 - $PUSH r28,`$FRAME+21*16+2*$SIZE_T`($sp) - li $x40,0x40 - $PUSH r29,`$FRAME+21*16+3*$SIZE_T`($sp) - li $x50,0x50 - $PUSH r30,`$FRAME+21*16+4*$SIZE_T`($sp) - li $x60,0x60 - $PUSH r31,`$FRAME+21*16+5*$SIZE_T`($sp) - li $x70,0x70 - mtspr 256,r0 - - subi $rounds,$rounds,3 # -4 in total - - lvx $rndkey0,$x00,$key1 # load key schedule - lvx v30,$x10,$key1 - addi $key1,$key1,0x20 - lvx v31,$x00,$key1 - ?vperm $rndkey0,$rndkey0,v30,$keyperm - addi $key_,$sp,`$FRAME+15` - mtctr $rounds - -Load_xts_dec_key: - ?vperm v24,v30,v31,$keyperm - lvx v30,$x10,$key1 - addi $key1,$key1,0x20 - stvx v24,$x00,$key_ # off-load round[1] - ?vperm v25,v31,v30,$keyperm - lvx v31,$x00,$key1 - stvx v25,$x10,$key_ # off-load round[2] - addi $key_,$key_,0x20 - bdnz Load_xts_dec_key - - lvx v26,$x10,$key1 - ?vperm v24,v30,v31,$keyperm - lvx v27,$x20,$key1 - stvx v24,$x00,$key_ # off-load round[3] - ?vperm v25,v31,v26,$keyperm - lvx v28,$x30,$key1 - stvx v25,$x10,$key_ # off-load round[4] - addi $key_,$sp,`$FRAME+15` # rewind $key_ - ?vperm v26,v26,v27,$keyperm - lvx v29,$x40,$key1 - ?vperm v27,v27,v28,$keyperm - lvx v30,$x50,$key1 - ?vperm v28,v28,v29,$keyperm - lvx v31,$x60,$key1 - ?vperm v29,v29,v30,$keyperm - lvx $twk5,$x70,$key1 # borrow $twk5 - ?vperm v30,v30,v31,$keyperm - lvx v24,$x00,$key_ # pre-load round[1] - ?vperm v31,v31,$twk5,$keyperm - lvx v25,$x10,$key_ # pre-load round[2] - - vperm $in0,$inout,$inptail,$inpperm - subi $inp,$inp,31 # undo "caller" - vxor $twk0,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vand $tmp,$tmp,$eighty7 - vxor $out0,$in0,$twk0 - vxor $tweak,$tweak,$tmp - - lvx_u $in1,$x10,$inp - vxor $twk1,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in1,$in1,$in1,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out1,$in1,$twk1 - vxor $tweak,$tweak,$tmp - - lvx_u $in2,$x20,$inp - andi. $taillen,$len,15 - vxor $twk2,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in2,$in2,$in2,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out2,$in2,$twk2 - vxor $tweak,$tweak,$tmp - - lvx_u $in3,$x30,$inp - sub $len,$len,$taillen - vxor $twk3,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in3,$in3,$in3,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out3,$in3,$twk3 - vxor $tweak,$tweak,$tmp - - lvx_u $in4,$x40,$inp - subi $len,$len,0x60 - vxor $twk4,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in4,$in4,$in4,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out4,$in4,$twk4 - vxor $tweak,$tweak,$tmp - - lvx_u $in5,$x50,$inp - addi $inp,$inp,0x60 - vxor $twk5,$tweak,$rndkey0 - vsrab $tmp,$tweak,$seven # next tweak value - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - le?vperm $in5,$in5,$in5,$leperm - vand $tmp,$tmp,$eighty7 - vxor $out5,$in5,$twk5 - vxor $tweak,$tweak,$tmp - - vxor v31,v31,$rndkey0 - mtctr $rounds - b Loop_xts_dec6x - -.align 5 -Loop_xts_dec6x: - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_xts_dec6x - - subic $len,$len,96 # $len-=96 - vxor $in0,$twk0,v31 # xor with last round key - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk0,$tweak,$rndkey0 - vaddubm $tweak,$tweak,$tweak - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vsldoi $tmp,$tmp,$tmp,15 - vncipher $out4,$out4,v24 - vncipher $out5,$out5,v24 - - subfe. r0,r0,r0 # borrow?-1:0 - vand $tmp,$tmp,$eighty7 - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vxor $tweak,$tweak,$tmp - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vxor $in1,$twk1,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk1,$tweak,$rndkey0 - vncipher $out4,$out4,v25 - vncipher $out5,$out5,v25 - - and r0,r0,$len - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vncipher $out0,$out0,v26 - vncipher $out1,$out1,v26 - vand $tmp,$tmp,$eighty7 - vncipher $out2,$out2,v26 - vncipher $out3,$out3,v26 - vxor $tweak,$tweak,$tmp - vncipher $out4,$out4,v26 - vncipher $out5,$out5,v26 - - add $inp,$inp,r0 # $inp is adjusted in such - # way that at exit from the - # loop inX-in5 are loaded - # with last "words" - vxor $in2,$twk2,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk2,$tweak,$rndkey0 - vaddubm $tweak,$tweak,$tweak - vncipher $out0,$out0,v27 - vncipher $out1,$out1,v27 - vsldoi $tmp,$tmp,$tmp,15 - vncipher $out2,$out2,v27 - vncipher $out3,$out3,v27 - vand $tmp,$tmp,$eighty7 - vncipher $out4,$out4,v27 - vncipher $out5,$out5,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vxor $tweak,$tweak,$tmp - vncipher $out0,$out0,v28 - vncipher $out1,$out1,v28 - vxor $in3,$twk3,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk3,$tweak,$rndkey0 - vncipher $out2,$out2,v28 - vncipher $out3,$out3,v28 - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vncipher $out4,$out4,v28 - vncipher $out5,$out5,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - vand $tmp,$tmp,$eighty7 - - vncipher $out0,$out0,v29 - vncipher $out1,$out1,v29 - vxor $tweak,$tweak,$tmp - vncipher $out2,$out2,v29 - vncipher $out3,$out3,v29 - vxor $in4,$twk4,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk4,$tweak,$rndkey0 - vncipher $out4,$out4,v29 - vncipher $out5,$out5,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - - vncipher $out0,$out0,v30 - vncipher $out1,$out1,v30 - vand $tmp,$tmp,$eighty7 - vncipher $out2,$out2,v30 - vncipher $out3,$out3,v30 - vxor $tweak,$tweak,$tmp - vncipher $out4,$out4,v30 - vncipher $out5,$out5,v30 - vxor $in5,$twk5,v31 - vsrab $tmp,$tweak,$seven # next tweak value - vxor $twk5,$tweak,$rndkey0 - - vncipherlast $out0,$out0,$in0 - lvx_u $in0,$x00,$inp # load next input block - vaddubm $tweak,$tweak,$tweak - vsldoi $tmp,$tmp,$tmp,15 - vncipherlast $out1,$out1,$in1 - lvx_u $in1,$x10,$inp - vncipherlast $out2,$out2,$in2 - le?vperm $in0,$in0,$in0,$leperm - lvx_u $in2,$x20,$inp - vand $tmp,$tmp,$eighty7 - vncipherlast $out3,$out3,$in3 - le?vperm $in1,$in1,$in1,$leperm - lvx_u $in3,$x30,$inp - vncipherlast $out4,$out4,$in4 - le?vperm $in2,$in2,$in2,$leperm - lvx_u $in4,$x40,$inp - vxor $tweak,$tweak,$tmp - vncipherlast $out5,$out5,$in5 - le?vperm $in3,$in3,$in3,$leperm - lvx_u $in5,$x50,$inp - addi $inp,$inp,0x60 - le?vperm $in4,$in4,$in4,$leperm - le?vperm $in5,$in5,$in5,$leperm - - le?vperm $out0,$out0,$out0,$leperm - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk0 - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - vxor $out1,$in1,$twk1 - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - vxor $out2,$in2,$twk2 - le?vperm $out4,$out4,$out4,$leperm - stvx_u $out3,$x30,$out - vxor $out3,$in3,$twk3 - le?vperm $out5,$out5,$out5,$leperm - stvx_u $out4,$x40,$out - vxor $out4,$in4,$twk4 - stvx_u $out5,$x50,$out - vxor $out5,$in5,$twk5 - addi $out,$out,0x60 - - mtctr $rounds - beq Loop_xts_dec6x # did $len-=96 borrow? - - addic. $len,$len,0x60 - beq Lxts_dec6x_zero - cmpwi $len,0x20 - blt Lxts_dec6x_one - nop - beq Lxts_dec6x_two - cmpwi $len,0x40 - blt Lxts_dec6x_three - nop - beq Lxts_dec6x_four - -Lxts_dec6x_five: - vxor $out0,$in1,$twk0 - vxor $out1,$in2,$twk1 - vxor $out2,$in3,$twk2 - vxor $out3,$in4,$twk3 - vxor $out4,$in5,$twk4 - - bl _aesp8_xts_dec5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk5 # unused tweak - vxor $twk1,$tweak,$rndkey0 - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk1 - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - le?vperm $out4,$out4,$out4,$leperm - stvx_u $out3,$x30,$out - stvx_u $out4,$x40,$out - addi $out,$out,0x50 - bne Lxts_dec6x_steal - b Lxts_dec6x_done - -.align 4 -Lxts_dec6x_four: - vxor $out0,$in2,$twk0 - vxor $out1,$in3,$twk1 - vxor $out2,$in4,$twk2 - vxor $out3,$in5,$twk3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_dec5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk4 # unused tweak - vmr $twk1,$twk5 - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk5 - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - le?vperm $out3,$out3,$out3,$leperm - stvx_u $out2,$x20,$out - stvx_u $out3,$x30,$out - addi $out,$out,0x40 - bne Lxts_dec6x_steal - b Lxts_dec6x_done - -.align 4 -Lxts_dec6x_three: - vxor $out0,$in3,$twk0 - vxor $out1,$in4,$twk1 - vxor $out2,$in5,$twk2 - vxor $out3,$out3,$out3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_dec5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk3 # unused tweak - vmr $twk1,$twk4 - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk4 - le?vperm $out2,$out2,$out2,$leperm - stvx_u $out1,$x10,$out - stvx_u $out2,$x20,$out - addi $out,$out,0x30 - bne Lxts_dec6x_steal - b Lxts_dec6x_done - -.align 4 -Lxts_dec6x_two: - vxor $out0,$in4,$twk0 - vxor $out1,$in5,$twk1 - vxor $out2,$out2,$out2 - vxor $out3,$out3,$out3 - vxor $out4,$out4,$out4 - - bl _aesp8_xts_dec5x - - le?vperm $out0,$out0,$out0,$leperm - vmr $twk0,$twk2 # unused tweak - vmr $twk1,$twk3 - le?vperm $out1,$out1,$out1,$leperm - stvx_u $out0,$x00,$out # store output - vxor $out0,$in0,$twk3 - stvx_u $out1,$x10,$out - addi $out,$out,0x20 - bne Lxts_dec6x_steal - b Lxts_dec6x_done - -.align 4 -Lxts_dec6x_one: - vxor $out0,$in5,$twk0 - nop -Loop_xts_dec1x: - vncipher $out0,$out0,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out0,$out0,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Loop_xts_dec1x - - subi r0,$taillen,1 - vncipher $out0,$out0,v24 - - andi. r0,r0,16 - cmpwi $taillen,0 - vncipher $out0,$out0,v25 - - sub $inp,$inp,r0 - vncipher $out0,$out0,v26 - - lvx_u $in0,0,$inp - vncipher $out0,$out0,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vncipher $out0,$out0,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - - vncipher $out0,$out0,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vxor $twk0,$twk0,v31 - - le?vperm $in0,$in0,$in0,$leperm - vncipher $out0,$out0,v30 - - mtctr $rounds - vncipherlast $out0,$out0,$twk0 - - vmr $twk0,$twk1 # unused tweak - vmr $twk1,$twk2 - le?vperm $out0,$out0,$out0,$leperm - stvx_u $out0,$x00,$out # store output - addi $out,$out,0x10 - vxor $out0,$in0,$twk2 - bne Lxts_dec6x_steal - b Lxts_dec6x_done - -.align 4 -Lxts_dec6x_zero: - cmpwi $taillen,0 - beq Lxts_dec6x_done - - lvx_u $in0,0,$inp - le?vperm $in0,$in0,$in0,$leperm - vxor $out0,$in0,$twk1 -Lxts_dec6x_steal: - vncipher $out0,$out0,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out0,$out0,v25 - lvx v25,$x10,$key_ # round[4] - bdnz Lxts_dec6x_steal - - add $inp,$inp,$taillen - vncipher $out0,$out0,v24 - - cmpwi $taillen,0 - vncipher $out0,$out0,v25 - - lvx_u $in0,0,$inp - vncipher $out0,$out0,v26 - - lvsr $inpperm,0,$taillen # $in5 is no more - vncipher $out0,$out0,v27 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vncipher $out0,$out0,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - - vncipher $out0,$out0,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vxor $twk1,$twk1,v31 - - le?vperm $in0,$in0,$in0,$leperm - vncipher $out0,$out0,v30 - - vperm $in0,$in0,$in0,$inpperm - vncipherlast $tmp,$out0,$twk1 - - le?vperm $out0,$tmp,$tmp,$leperm - le?stvx_u $out0,0,$out - be?stvx_u $tmp,0,$out - - vxor $out0,$out0,$out0 - vspltisb $out1,-1 - vperm $out0,$out0,$out1,$inpperm - vsel $out0,$in0,$tmp,$out0 - vxor $out0,$out0,$twk0 - - subi r30,$out,1 - mtctr $taillen -Loop_xts_dec6x_steal: - lbzu r0,1(r30) - stb r0,16(r30) - bdnz Loop_xts_dec6x_steal - - li $taillen,0 - mtctr $rounds - b Loop_xts_dec1x # one more time... - -.align 4 -Lxts_dec6x_done: - ${UCMP}i $ivp,0 - beq Lxts_dec6x_ret - - vxor $tweak,$twk0,$rndkey0 - le?vperm $tweak,$tweak,$tweak,$leperm - stvx_u $tweak,0,$ivp - -Lxts_dec6x_ret: - mtlr r11 - li r10,`$FRAME+15` - li r11,`$FRAME+31` - stvx $seven,r10,$sp # wipe copies of round keys - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - stvx $seven,r10,$sp - addi r10,r10,32 - stvx $seven,r11,$sp - addi r11,r11,32 - - mtspr 256,$vrsave - lvx v20,r10,$sp # ABI says so - addi r10,r10,32 - lvx v21,r11,$sp - addi r11,r11,32 - lvx v22,r10,$sp - addi r10,r10,32 - lvx v23,r11,$sp - addi r11,r11,32 - lvx v24,r10,$sp - addi r10,r10,32 - lvx v25,r11,$sp - addi r11,r11,32 - lvx v26,r10,$sp - addi r10,r10,32 - lvx v27,r11,$sp - addi r11,r11,32 - lvx v28,r10,$sp - addi r10,r10,32 - lvx v29,r11,$sp - addi r11,r11,32 - lvx v30,r10,$sp - lvx v31,r11,$sp - $POP r26,`$FRAME+21*16+0*$SIZE_T`($sp) - $POP r27,`$FRAME+21*16+1*$SIZE_T`($sp) - $POP r28,`$FRAME+21*16+2*$SIZE_T`($sp) - $POP r29,`$FRAME+21*16+3*$SIZE_T`($sp) - $POP r30,`$FRAME+21*16+4*$SIZE_T`($sp) - $POP r31,`$FRAME+21*16+5*$SIZE_T`($sp) - addi $sp,$sp,`$FRAME+21*16+6*$SIZE_T` - blr - .long 0 - .byte 0,12,0x04,1,0x80,6,6,0 - .long 0 - -.align 5 -_aesp8_xts_dec5x: - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - lvx v24,$x20,$key_ # round[3] - addi $key_,$key_,0x20 - - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - lvx v25,$x10,$key_ # round[4] - bdnz _aesp8_xts_dec5x - - subi r0,$taillen,1 - vncipher $out0,$out0,v24 - vncipher $out1,$out1,v24 - vncipher $out2,$out2,v24 - vncipher $out3,$out3,v24 - vncipher $out4,$out4,v24 - - andi. r0,r0,16 - cmpwi $taillen,0 - vncipher $out0,$out0,v25 - vncipher $out1,$out1,v25 - vncipher $out2,$out2,v25 - vncipher $out3,$out3,v25 - vncipher $out4,$out4,v25 - vxor $twk0,$twk0,v31 - - sub $inp,$inp,r0 - vncipher $out0,$out0,v26 - vncipher $out1,$out1,v26 - vncipher $out2,$out2,v26 - vncipher $out3,$out3,v26 - vncipher $out4,$out4,v26 - vxor $in1,$twk1,v31 - - vncipher $out0,$out0,v27 - lvx_u $in0,0,$inp - vncipher $out1,$out1,v27 - vncipher $out2,$out2,v27 - vncipher $out3,$out3,v27 - vncipher $out4,$out4,v27 - vxor $in2,$twk2,v31 - - addi $key_,$sp,`$FRAME+15` # rewind $key_ - vncipher $out0,$out0,v28 - vncipher $out1,$out1,v28 - vncipher $out2,$out2,v28 - vncipher $out3,$out3,v28 - vncipher $out4,$out4,v28 - lvx v24,$x00,$key_ # re-pre-load round[1] - vxor $in3,$twk3,v31 - - vncipher $out0,$out0,v29 - le?vperm $in0,$in0,$in0,$leperm - vncipher $out1,$out1,v29 - vncipher $out2,$out2,v29 - vncipher $out3,$out3,v29 - vncipher $out4,$out4,v29 - lvx v25,$x10,$key_ # re-pre-load round[2] - vxor $in4,$twk4,v31 - - vncipher $out0,$out0,v30 - vncipher $out1,$out1,v30 - vncipher $out2,$out2,v30 - vncipher $out3,$out3,v30 - vncipher $out4,$out4,v30 - - vncipherlast $out0,$out0,$twk0 - vncipherlast $out1,$out1,$in1 - vncipherlast $out2,$out2,$in2 - vncipherlast $out3,$out3,$in3 - vncipherlast $out4,$out4,$in4 - mtctr $rounds - blr - .long 0 - .byte 0,12,0x14,0,0,0,0,0 -___ -}} }}} - -my $consts=1; -foreach(split("\n",$code)) { - s/\`([^\`]*)\`/eval($1)/geo; - - # constants table endian-specific conversion - if ($consts && m/\.(long|byte)\s+(.+)\s+(\?[a-z]*)$/o) { - my $conv=$3; - my @bytes=(); - - # convert to endian-agnostic format - if ($1 eq "long") { - foreach (split(/,\s*/,$2)) { - my $l = /^0/?oct:int; - push @bytes,($l>>24)&0xff,($l>>16)&0xff,($l>>8)&0xff,$l&0xff; - } - } else { - @bytes = map(/^0/?oct:int,split(/,\s*/,$2)); - } - - # little-endian conversion - if ($flavour =~ /le$/o) { - SWITCH: for($conv) { - /\?inv/ && do { @bytes=map($_^0xf,@bytes); last; }; - /\?rev/ && do { @bytes=reverse(@bytes); last; }; - } - } - - #emit - print ".byte\t",join(',',map (sprintf("0x%02x",$_),@bytes)),"\n"; - next; - } - $consts=0 if (m/Lconsts:/o); # end of table - - # instructions prefixed with '?' are endian-specific and need - # to be adjusted accordingly... - if ($flavour =~ /le$/o) { # little-endian - s/le\?//o or - s/be\?/#be#/o or - s/\?lvsr/lvsl/o or - s/\?lvsl/lvsr/o or - s/\?(vperm\s+v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+)/$1$3$2$4/o or - s/\?(vsldoi\s+v[0-9]+,\s*)(v[0-9]+,)\s*(v[0-9]+,\s*)([0-9]+)/$1$3$2 16-$4/o or - s/\?(vspltw\s+v[0-9]+,\s*)(v[0-9]+,)\s*([0-9])/$1$2 3-$3/o; - } else { # big-endian - s/le\?/#le#/o or - s/be\?//o or - s/\?([a-z]+)/$1/o; - } - - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT: $!"; diff --git a/crypto/fipsmodule/aes/internal.h b/crypto/fipsmodule/aes/internal.h index 0685bc41de..98b2a14d82 100644 --- a/crypto/fipsmodule/aes/internal.h +++ b/crypto/fipsmodule/aes/internal.h @@ -59,12 +59,6 @@ OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_NEON_capable(); } OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_NEON_capable(); } #endif -#elif defined(OPENSSL_PPC64LE) -#define HWAES - -OPENSSL_INLINE int hwaes_capable(void) { - return CRYPTO_is_PPC64LE_vcrypto_capable(); -} #endif #endif // !NO_ASM diff --git a/crypto/fipsmodule/bcm.c b/crypto/fipsmodule/bcm.c index 17921347ea..e2e4d90f63 100644 --- a/crypto/fipsmodule/bcm.c +++ b/crypto/fipsmodule/bcm.c @@ -101,7 +101,6 @@ #include "self_check/fips.c" #include "self_check/self_check.c" #include "service_indicator/service_indicator.c" -#include "sha/sha1-altivec.c" #include "sha/sha1.c" #include "sha/sha256.c" #include "sha/sha512.c" diff --git a/crypto/fipsmodule/bn/bn.c b/crypto/fipsmodule/bn/bn.c index f3fbb7a680..93fae56940 100644 --- a/crypto/fipsmodule/bn/bn.c +++ b/crypto/fipsmodule/bn/bn.c @@ -386,23 +386,6 @@ int bn_expand(BIGNUM *bn, size_t bits) { } int bn_resize_words(BIGNUM *bn, size_t words) { -#if defined(OPENSSL_PPC64LE) - // This is a workaround for a miscompilation bug in Clang 7.0.1 on POWER. - // The unittests catch the miscompilation, if it occurs, and it manifests - // as a crash in |bn_fits_in_words|. - // - // The bug only triggers if building in FIPS mode and with -O3. Clang 8.0.1 - // has the same bug but this workaround is not effective there---I've not - // been able to find a workaround for 8.0.1. - // - // At the time of writing (2019-08-08), Clang git does *not* have this bug - // and does not need this workaroud. The current git version should go on to - // be Clang 10 thus, once we can depend on that, this can be removed. - if (value_barrier_w((size_t)bn->width == words)) { - return 1; - } -#endif - if ((size_t)bn->width <= words) { if (!bn_wexpand(bn, words)) { return 0; diff --git a/crypto/fipsmodule/cipher/e_aes.c b/crypto/fipsmodule/cipher/e_aes.c index e8e03fec6e..0db77b846b 100644 --- a/crypto/fipsmodule/cipher/e_aes.c +++ b/crypto/fipsmodule/cipher/e_aes.c @@ -1468,8 +1468,6 @@ int EVP_has_aes_hardware(void) { return hwaes_capable() && crypto_gcm_clmul_enabled(); #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) return hwaes_capable() && CRYPTO_is_ARMv8_PMULL_capable(); -#elif defined(OPENSSL_PPC64LE) - return CRYPTO_is_PPC64LE_vcrypto_capable(); #else return 0; #endif diff --git a/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl b/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl deleted file mode 100644 index 0d12a77ba8..0000000000 --- a/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl +++ /dev/null @@ -1,671 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# GHASH for for PowerISA v2.07. -# -# July 2014 -# -# Accurate performance measurements are problematic, because it's -# always virtualized setup with possibly throttled processor. -# Relative comparison is therefore more informative. This initial -# version is ~2.1x slower than hardware-assisted AES-128-CTR, ~12x -# faster than "4-bit" integer-only compiler-generated 64-bit code. -# "Initial version" means that there is room for futher improvement. - -# May 2016 -# -# 2x aggregated reduction improves performance by 50% (resulting -# performance on POWER8 is 1 cycle per processed byte), and 4x -# aggregated reduction - by 170% or 2.7x (resulting in 0.55 cpb). - -$flavour=shift; -$output =shift; - -if ($flavour =~ /64/) { - $SIZE_T=8; - $LRSAVE=2*$SIZE_T; - $STU="stdu"; - $POP="ld"; - $PUSH="std"; - $UCMP="cmpld"; - $SHRI="srdi"; -} elsif ($flavour =~ /32/) { - $SIZE_T=4; - $LRSAVE=$SIZE_T; - $STU="stwu"; - $POP="lwz"; - $PUSH="stw"; - $UCMP="cmplw"; - $SHRI="srwi"; -} else { die "nonsense $flavour"; } - -$sp="r1"; -$FRAME=6*$SIZE_T+13*16; # 13*16 is for v20-v31 offload - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/ppc-xlate.pl" and -f $xlate) or -die "can't locate ppc-xlate.pl"; - -open OUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; -*STDOUT=*OUT; - -my ($Xip,$Htbl,$inp,$len)=map("r$_",(3..6)); # argument block - -my ($Xl,$Xm,$Xh,$IN)=map("v$_",(0..3)); -my ($zero,$t0,$t1,$t2,$xC2,$H,$Hh,$Hl,$lemask)=map("v$_",(4..12)); -my ($Xl1,$Xm1,$Xh1,$IN1,$H2,$H2h,$H2l)=map("v$_",(13..19)); -my $vrsave="r12"; - -$code=<<___; -.machine "any" - -.text - -.globl .gcm_init_p8 -.align 5 -.gcm_init_p8: - li r0,-4096 - li r8,0x10 - mfspr $vrsave,256 - li r9,0x20 - mtspr 256,r0 - li r10,0x30 - lvx_u $H,0,r4 # load H - - vspltisb $xC2,-16 # 0xf0 - vspltisb $t0,1 # one - vaddubm $xC2,$xC2,$xC2 # 0xe0 - vxor $zero,$zero,$zero - vor $xC2,$xC2,$t0 # 0xe1 - vsldoi $xC2,$xC2,$zero,15 # 0xe1... - vsldoi $t1,$zero,$t0,1 # ...1 - vaddubm $xC2,$xC2,$xC2 # 0xc2... - vspltisb $t2,7 - vor $xC2,$xC2,$t1 # 0xc2....01 - vspltb $t1,$H,0 # most significant byte - vsl $H,$H,$t0 # H<<=1 - vsrab $t1,$t1,$t2 # broadcast carry bit - vand $t1,$t1,$xC2 - vxor $IN,$H,$t1 # twisted H - - vsldoi $H,$IN,$IN,8 # twist even more ... - vsldoi $xC2,$zero,$xC2,8 # 0xc2.0 - vsldoi $Hl,$zero,$H,8 # ... and split - vsldoi $Hh,$H,$zero,8 - - stvx_u $xC2,0,r3 # save pre-computed table - stvx_u $Hl,r8,r3 - li r8,0x40 - stvx_u $H, r9,r3 - li r9,0x50 - stvx_u $Hh,r10,r3 - li r10,0x60 - - vpmsumd $Xl,$IN,$Hl # H.lo·H.lo - vpmsumd $Xm,$IN,$H # H.hi·H.lo+H.lo·H.hi - vpmsumd $Xh,$IN,$Hh # H.hi·H.hi - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - vxor $t1,$t1,$Xh - vxor $IN1,$Xl,$t1 - - vsldoi $H2,$IN1,$IN1,8 - vsldoi $H2l,$zero,$H2,8 - vsldoi $H2h,$H2,$zero,8 - - stvx_u $H2l,r8,r3 # save H^2 - li r8,0x70 - stvx_u $H2,r9,r3 - li r9,0x80 - stvx_u $H2h,r10,r3 - li r10,0x90 -___ -{ -my ($t4,$t5,$t6) = ($Hl,$H,$Hh); -$code.=<<___; - vpmsumd $Xl,$IN,$H2l # H.lo·H^2.lo - vpmsumd $Xl1,$IN1,$H2l # H^2.lo·H^2.lo - vpmsumd $Xm,$IN,$H2 # H.hi·H^2.lo+H.lo·H^2.hi - vpmsumd $Xm1,$IN1,$H2 # H^2.hi·H^2.lo+H^2.lo·H^2.hi - vpmsumd $Xh,$IN,$H2h # H.hi·H^2.hi - vpmsumd $Xh1,$IN1,$H2h # H^2.hi·H^2.hi - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - vpmsumd $t6,$Xl1,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vsldoi $t4,$Xm1,$zero,8 - vsldoi $t5,$zero,$Xm1,8 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - vxor $Xl1,$Xl1,$t4 - vxor $Xh1,$Xh1,$t5 - - vsldoi $Xl,$Xl,$Xl,8 - vsldoi $Xl1,$Xl1,$Xl1,8 - vxor $Xl,$Xl,$t2 - vxor $Xl1,$Xl1,$t6 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vsldoi $t5,$Xl1,$Xl1,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - vpmsumd $Xl1,$Xl1,$xC2 - vxor $t1,$t1,$Xh - vxor $t5,$t5,$Xh1 - vxor $Xl,$Xl,$t1 - vxor $Xl1,$Xl1,$t5 - - vsldoi $H,$Xl,$Xl,8 - vsldoi $H2,$Xl1,$Xl1,8 - vsldoi $Hl,$zero,$H,8 - vsldoi $Hh,$H,$zero,8 - vsldoi $H2l,$zero,$H2,8 - vsldoi $H2h,$H2,$zero,8 - - stvx_u $Hl,r8,r3 # save H^3 - li r8,0xa0 - stvx_u $H,r9,r3 - li r9,0xb0 - stvx_u $Hh,r10,r3 - li r10,0xc0 - stvx_u $H2l,r8,r3 # save H^4 - stvx_u $H2,r9,r3 - stvx_u $H2h,r10,r3 - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,2,0 - .long 0 -.size .gcm_init_p8,.-.gcm_init_p8 -___ -} -$code.=<<___; -.globl .gcm_gmult_p8 -.align 5 -.gcm_gmult_p8: - lis r0,0xfff8 - li r8,0x10 - mfspr $vrsave,256 - li r9,0x20 - mtspr 256,r0 - li r10,0x30 - lvx_u $IN,0,$Xip # load Xi - - lvx_u $Hl,r8,$Htbl # load pre-computed table - le?lvsl $lemask,r0,r0 - lvx_u $H, r9,$Htbl - le?vspltisb $t0,0x07 - lvx_u $Hh,r10,$Htbl - le?vxor $lemask,$lemask,$t0 - lvx_u $xC2,0,$Htbl - le?vperm $IN,$IN,$IN,$lemask - vxor $zero,$zero,$zero - - vpmsumd $Xl,$IN,$Hl # H.lo·Xi.lo - vpmsumd $Xm,$IN,$H # H.hi·Xi.lo+H.lo·Xi.hi - vpmsumd $Xh,$IN,$Hh # H.hi·Xi.hi - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - vxor $t1,$t1,$Xh - vxor $Xl,$Xl,$t1 - - le?vperm $Xl,$Xl,$Xl,$lemask - stvx_u $Xl,0,$Xip # write out Xi - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,2,0 - .long 0 -.size .gcm_gmult_p8,.-.gcm_gmult_p8 - -.globl .gcm_ghash_p8 -.align 5 -.gcm_ghash_p8: - li r0,-4096 - li r8,0x10 - mfspr $vrsave,256 - li r9,0x20 - mtspr 256,r0 - li r10,0x30 - lvx_u $Xl,0,$Xip # load Xi - - lvx_u $Hl,r8,$Htbl # load pre-computed table - li r8,0x40 - le?lvsl $lemask,r0,r0 - lvx_u $H, r9,$Htbl - li r9,0x50 - le?vspltisb $t0,0x07 - lvx_u $Hh,r10,$Htbl - li r10,0x60 - le?vxor $lemask,$lemask,$t0 - lvx_u $xC2,0,$Htbl - le?vperm $Xl,$Xl,$Xl,$lemask - vxor $zero,$zero,$zero - - ${UCMP}i $len,64 - bge Lgcm_ghash_p8_4x - - lvx_u $IN,0,$inp - addi $inp,$inp,16 - subic. $len,$len,16 - le?vperm $IN,$IN,$IN,$lemask - vxor $IN,$IN,$Xl - beq Lshort - - lvx_u $H2l,r8,$Htbl # load H^2 - li r8,16 - lvx_u $H2, r9,$Htbl - add r9,$inp,$len # end of input - lvx_u $H2h,r10,$Htbl - be?b Loop_2x - -.align 5 -Loop_2x: - lvx_u $IN1,0,$inp - le?vperm $IN1,$IN1,$IN1,$lemask - - subic $len,$len,32 - vpmsumd $Xl,$IN,$H2l # H^2.lo·Xi.lo - vpmsumd $Xl1,$IN1,$Hl # H.lo·Xi+1.lo - subfe r0,r0,r0 # borrow?-1:0 - vpmsumd $Xm,$IN,$H2 # H^2.hi·Xi.lo+H^2.lo·Xi.hi - vpmsumd $Xm1,$IN1,$H # H.hi·Xi+1.lo+H.lo·Xi+1.hi - and r0,r0,$len - vpmsumd $Xh,$IN,$H2h # H^2.hi·Xi.hi - vpmsumd $Xh1,$IN1,$Hh # H.hi·Xi+1.hi - add $inp,$inp,r0 - - vxor $Xl,$Xl,$Xl1 - vxor $Xm,$Xm,$Xm1 - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xh,$Xh,$Xh1 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - lvx_u $IN,r8,$inp - addi $inp,$inp,32 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - le?vperm $IN,$IN,$IN,$lemask - vxor $t1,$t1,$Xh - vxor $IN,$IN,$t1 - vxor $IN,$IN,$Xl - $UCMP r9,$inp - bgt Loop_2x # done yet? - - cmplwi $len,0 - bne Leven - -Lshort: - vpmsumd $Xl,$IN,$Hl # H.lo·Xi.lo - vpmsumd $Xm,$IN,$H # H.hi·Xi.lo+H.lo·Xi.hi - vpmsumd $Xh,$IN,$Hh # H.hi·Xi.hi - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - vxor $t1,$t1,$Xh - -Leven: - vxor $Xl,$Xl,$t1 - le?vperm $Xl,$Xl,$Xl,$lemask - stvx_u $Xl,0,$Xip # write out Xi - - mtspr 256,$vrsave - blr - .long 0 - .byte 0,12,0x14,0,0,0,4,0 - .long 0 -___ -{ -my ($Xl3,$Xm2,$IN2,$H3l,$H3,$H3h, - $Xh3,$Xm3,$IN3,$H4l,$H4,$H4h) = map("v$_",(20..31)); -my $IN0=$IN; -my ($H21l,$H21h,$loperm,$hiperm) = ($Hl,$Hh,$H2l,$H2h); - -$code.=<<___; -.align 5 -.gcm_ghash_p8_4x: -Lgcm_ghash_p8_4x: - $STU $sp,-$FRAME($sp) - li r10,`15+6*$SIZE_T` - li r11,`31+6*$SIZE_T` - stvx v20,r10,$sp - addi r10,r10,32 - stvx v21,r11,$sp - addi r11,r11,32 - stvx v22,r10,$sp - addi r10,r10,32 - stvx v23,r11,$sp - addi r11,r11,32 - stvx v24,r10,$sp - addi r10,r10,32 - stvx v25,r11,$sp - addi r11,r11,32 - stvx v26,r10,$sp - addi r10,r10,32 - stvx v27,r11,$sp - addi r11,r11,32 - stvx v28,r10,$sp - addi r10,r10,32 - stvx v29,r11,$sp - addi r11,r11,32 - stvx v30,r10,$sp - li r10,0x60 - stvx v31,r11,$sp - li r0,-1 - stw $vrsave,`$FRAME-4`($sp) # save vrsave - mtspr 256,r0 # preserve all AltiVec registers - - lvsl $t0,0,r8 # 0x0001..0e0f - #lvx_u $H2l,r8,$Htbl # load H^2 - li r8,0x70 - lvx_u $H2, r9,$Htbl - li r9,0x80 - vspltisb $t1,8 # 0x0808..0808 - #lvx_u $H2h,r10,$Htbl - li r10,0x90 - lvx_u $H3l,r8,$Htbl # load H^3 - li r8,0xa0 - lvx_u $H3, r9,$Htbl - li r9,0xb0 - lvx_u $H3h,r10,$Htbl - li r10,0xc0 - lvx_u $H4l,r8,$Htbl # load H^4 - li r8,0x10 - lvx_u $H4, r9,$Htbl - li r9,0x20 - lvx_u $H4h,r10,$Htbl - li r10,0x30 - - vsldoi $t2,$zero,$t1,8 # 0x0000..0808 - vaddubm $hiperm,$t0,$t2 # 0x0001..1617 - vaddubm $loperm,$t1,$hiperm # 0x0809..1e1f - - $SHRI $len,$len,4 # this allows to use sign bit - # as carry - lvx_u $IN0,0,$inp # load input - lvx_u $IN1,r8,$inp - subic. $len,$len,8 - lvx_u $IN2,r9,$inp - lvx_u $IN3,r10,$inp - addi $inp,$inp,0x40 - le?vperm $IN0,$IN0,$IN0,$lemask - le?vperm $IN1,$IN1,$IN1,$lemask - le?vperm $IN2,$IN2,$IN2,$lemask - le?vperm $IN3,$IN3,$IN3,$lemask - - vxor $Xh,$IN0,$Xl - - vpmsumd $Xl1,$IN1,$H3l - vpmsumd $Xm1,$IN1,$H3 - vpmsumd $Xh1,$IN1,$H3h - - vperm $H21l,$H2,$H,$hiperm - vperm $t0,$IN2,$IN3,$loperm - vperm $H21h,$H2,$H,$loperm - vperm $t1,$IN2,$IN3,$hiperm - vpmsumd $Xm2,$IN2,$H2 # H^2.lo·Xi+2.hi+H^2.hi·Xi+2.lo - vpmsumd $Xl3,$t0,$H21l # H^2.lo·Xi+2.lo+H.lo·Xi+3.lo - vpmsumd $Xm3,$IN3,$H # H.hi·Xi+3.lo +H.lo·Xi+3.hi - vpmsumd $Xh3,$t1,$H21h # H^2.hi·Xi+2.hi+H.hi·Xi+3.hi - - vxor $Xm2,$Xm2,$Xm1 - vxor $Xl3,$Xl3,$Xl1 - vxor $Xm3,$Xm3,$Xm2 - vxor $Xh3,$Xh3,$Xh1 - - blt Ltail_4x - -Loop_4x: - lvx_u $IN0,0,$inp - lvx_u $IN1,r8,$inp - subic. $len,$len,4 - lvx_u $IN2,r9,$inp - lvx_u $IN3,r10,$inp - addi $inp,$inp,0x40 - le?vperm $IN1,$IN1,$IN1,$lemask - le?vperm $IN2,$IN2,$IN2,$lemask - le?vperm $IN3,$IN3,$IN3,$lemask - le?vperm $IN0,$IN0,$IN0,$lemask - - vpmsumd $Xl,$Xh,$H4l # H^4.lo·Xi.lo - vpmsumd $Xm,$Xh,$H4 # H^4.hi·Xi.lo+H^4.lo·Xi.hi - vpmsumd $Xh,$Xh,$H4h # H^4.hi·Xi.hi - vpmsumd $Xl1,$IN1,$H3l - vpmsumd $Xm1,$IN1,$H3 - vpmsumd $Xh1,$IN1,$H3h - - vxor $Xl,$Xl,$Xl3 - vxor $Xm,$Xm,$Xm3 - vxor $Xh,$Xh,$Xh3 - vperm $t0,$IN2,$IN3,$loperm - vperm $t1,$IN2,$IN3,$hiperm - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - vpmsumd $Xl3,$t0,$H21l # H.lo·Xi+3.lo +H^2.lo·Xi+2.lo - vpmsumd $Xh3,$t1,$H21h # H.hi·Xi+3.hi +H^2.hi·Xi+2.hi - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xm2,$IN2,$H2 # H^2.hi·Xi+2.lo+H^2.lo·Xi+2.hi - vpmsumd $Xm3,$IN3,$H # H.hi·Xi+3.lo +H.lo·Xi+3.hi - vpmsumd $Xl,$Xl,$xC2 - - vxor $Xl3,$Xl3,$Xl1 - vxor $Xh3,$Xh3,$Xh1 - vxor $Xh,$Xh,$IN0 - vxor $Xm2,$Xm2,$Xm1 - vxor $Xh,$Xh,$t1 - vxor $Xm3,$Xm3,$Xm2 - vxor $Xh,$Xh,$Xl - bge Loop_4x - -Ltail_4x: - vpmsumd $Xl,$Xh,$H4l # H^4.lo·Xi.lo - vpmsumd $Xm,$Xh,$H4 # H^4.hi·Xi.lo+H^4.lo·Xi.hi - vpmsumd $Xh,$Xh,$H4h # H^4.hi·Xi.hi - - vxor $Xl,$Xl,$Xl3 - vxor $Xm,$Xm,$Xm3 - - vpmsumd $t2,$Xl,$xC2 # 1st reduction phase - - vsldoi $t0,$Xm,$zero,8 - vsldoi $t1,$zero,$Xm,8 - vxor $Xh,$Xh,$Xh3 - vxor $Xl,$Xl,$t0 - vxor $Xh,$Xh,$t1 - - vsldoi $Xl,$Xl,$Xl,8 - vxor $Xl,$Xl,$t2 - - vsldoi $t1,$Xl,$Xl,8 # 2nd reduction phase - vpmsumd $Xl,$Xl,$xC2 - vxor $t1,$t1,$Xh - vxor $Xl,$Xl,$t1 - - addic. $len,$len,4 - beq Ldone_4x - - lvx_u $IN0,0,$inp - ${UCMP}i $len,2 - li $len,-4 - blt Lone - lvx_u $IN1,r8,$inp - beq Ltwo - -Lthree: - lvx_u $IN2,r9,$inp - le?vperm $IN0,$IN0,$IN0,$lemask - le?vperm $IN1,$IN1,$IN1,$lemask - le?vperm $IN2,$IN2,$IN2,$lemask - - vxor $Xh,$IN0,$Xl - vmr $H4l,$H3l - vmr $H4, $H3 - vmr $H4h,$H3h - - vperm $t0,$IN1,$IN2,$loperm - vperm $t1,$IN1,$IN2,$hiperm - vpmsumd $Xm2,$IN1,$H2 # H^2.lo·Xi+1.hi+H^2.hi·Xi+1.lo - vpmsumd $Xm3,$IN2,$H # H.hi·Xi+2.lo +H.lo·Xi+2.hi - vpmsumd $Xl3,$t0,$H21l # H^2.lo·Xi+1.lo+H.lo·Xi+2.lo - vpmsumd $Xh3,$t1,$H21h # H^2.hi·Xi+1.hi+H.hi·Xi+2.hi - - vxor $Xm3,$Xm3,$Xm2 - b Ltail_4x - -.align 4 -Ltwo: - le?vperm $IN0,$IN0,$IN0,$lemask - le?vperm $IN1,$IN1,$IN1,$lemask - - vxor $Xh,$IN0,$Xl - vperm $t0,$zero,$IN1,$loperm - vperm $t1,$zero,$IN1,$hiperm - - vsldoi $H4l,$zero,$H2,8 - vmr $H4, $H2 - vsldoi $H4h,$H2,$zero,8 - - vpmsumd $Xl3,$t0, $H21l # H.lo·Xi+1.lo - vpmsumd $Xm3,$IN1,$H # H.hi·Xi+1.lo+H.lo·Xi+2.hi - vpmsumd $Xh3,$t1, $H21h # H.hi·Xi+1.hi - - b Ltail_4x - -.align 4 -Lone: - le?vperm $IN0,$IN0,$IN0,$lemask - - vsldoi $H4l,$zero,$H,8 - vmr $H4, $H - vsldoi $H4h,$H,$zero,8 - - vxor $Xh,$IN0,$Xl - vxor $Xl3,$Xl3,$Xl3 - vxor $Xm3,$Xm3,$Xm3 - vxor $Xh3,$Xh3,$Xh3 - - b Ltail_4x - -Ldone_4x: - le?vperm $Xl,$Xl,$Xl,$lemask - stvx_u $Xl,0,$Xip # write out Xi - - li r10,`15+6*$SIZE_T` - li r11,`31+6*$SIZE_T` - mtspr 256,$vrsave - lvx v20,r10,$sp - addi r10,r10,32 - lvx v21,r11,$sp - addi r11,r11,32 - lvx v22,r10,$sp - addi r10,r10,32 - lvx v23,r11,$sp - addi r11,r11,32 - lvx v24,r10,$sp - addi r10,r10,32 - lvx v25,r11,$sp - addi r11,r11,32 - lvx v26,r10,$sp - addi r10,r10,32 - lvx v27,r11,$sp - addi r11,r11,32 - lvx v28,r10,$sp - addi r10,r10,32 - lvx v29,r11,$sp - addi r11,r11,32 - lvx v30,r10,$sp - lvx v31,r11,$sp - addi $sp,$sp,$FRAME - blr - .long 0 - .byte 0,12,0x04,0,0x80,0,4,0 - .long 0 -___ -} -$code.=<<___; -.size .gcm_ghash_p8,.-.gcm_ghash_p8 - -.asciz "GHASH for PowerISA 2.07, CRYPTOGAMS by " -.align 2 -___ - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - if ($flavour =~ /le$/o) { # little-endian - s/le\?//o or - s/be\?/#be#/o; - } else { - s/le\?/#le#/o or - s/be\?//o; - } - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT: $!"; # enforce flush diff --git a/crypto/fipsmodule/modes/gcm.c b/crypto/fipsmodule/modes/gcm.c index 11a0b203ef..f22fa9de94 100644 --- a/crypto/fipsmodule/modes/gcm.c +++ b/crypto/fipsmodule/modes/gcm.c @@ -230,13 +230,6 @@ void CRYPTO_ghash_init(gmult_func *out_mult, ghash_func *out_hash, *out_hash = gcm_ghash_neon; return; } -#elif defined(GHASH_ASM_PPC64LE) - if (CRYPTO_is_PPC64LE_vcrypto_capable()) { - gcm_init_p8(out_table, H); - *out_mult = gcm_gmult_p8; - *out_hash = gcm_ghash_p8; - return; - } #endif gcm_init_nohw(out_table, H); diff --git a/crypto/fipsmodule/modes/gcm_test.cc b/crypto/fipsmodule/modes/gcm_test.cc index 324d0e8c42..e7fcd5c227 100644 --- a/crypto/fipsmodule/modes/gcm_test.cc +++ b/crypto/fipsmodule/modes/gcm_test.cc @@ -222,15 +222,5 @@ TEST(GCMTest, ABI) { } } #endif - -#if defined(GHASH_ASM_PPC64LE) - if (CRYPTO_is_PPC64LE_vcrypto_capable()) { - CHECK_ABI(gcm_init_p8, Htable, kH); - CHECK_ABI(gcm_gmult_p8, X, Htable); - for (size_t blocks : kBlockCounts) { - CHECK_ABI(gcm_ghash_p8, X, Htable, buf, 16 * blocks); - } - } -#endif // GHASH_ASM_PPC64LE } #endif // SUPPORTS_ABI_TEST && !OPENSSL_NO_ASM diff --git a/crypto/fipsmodule/modes/internal.h b/crypto/fipsmodule/modes/internal.h index 8a0a75fa41..d77efcaac4 100644 --- a/crypto/fipsmodule/modes/internal.h +++ b/crypto/fipsmodule/modes/internal.h @@ -308,13 +308,6 @@ void aes_gcm_dec_kernel(const uint8_t *in, uint64_t in_bits, void *out, void *Xi, uint8_t *ivec, const AES_KEY *key); #endif -#elif defined(OPENSSL_PPC64LE) -#define GHASH_ASM_PPC64LE -#define GCM_FUNCREF -void gcm_init_p8(u128 Htable[16], const uint64_t Xi[2]); -void gcm_gmult_p8(uint64_t Xi[2], const u128 Htable[16]); -void gcm_ghash_p8(uint64_t Xi[2], const u128 Htable[16], const uint8_t *inp, - size_t len); #endif #endif // OPENSSL_NO_ASM diff --git a/crypto/fipsmodule/rand/rand.c b/crypto/fipsmodule/rand/rand.c index cb1ee7d514..41754c6fbc 100644 --- a/crypto/fipsmodule/rand/rand.c +++ b/crypto/fipsmodule/rand/rand.c @@ -416,11 +416,6 @@ void RAND_bytes_with_additional_data(uint8_t *out, size_t out_len, // Take a read lock around accesses to |state->drbg|. This is needed to // avoid returning bad entropy if we race with // |rand_thread_state_clear_all|. - // - // This lock must be taken after any calls to |CRYPTO_sysrand| to avoid a - // bug on ppc64le. glibc may implement pthread locks by wrapping user code - // in a hardware transaction, but, on some older versions of glibc and the - // kernel, syscalls made with |syscall| did not abort the transaction. CRYPTO_STATIC_MUTEX_lock_read(state_clear_all_lock_bss_get()); #endif if (!CTR_DRBG_reseed(&state->drbg, seed, reseed_additional_data, diff --git a/crypto/fipsmodule/sha/internal.h b/crypto/fipsmodule/sha/internal.h index cc90914956..605f1665b8 100644 --- a/crypto/fipsmodule/sha/internal.h +++ b/crypto/fipsmodule/sha/internal.h @@ -22,23 +22,14 @@ extern "C" { #endif -#if defined(OPENSSL_PPC64LE) || \ - (!defined(OPENSSL_NO_ASM) && \ - (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \ - defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))) -// POWER has an intrinsics-based implementation of SHA-1 and thus the functions -// normally defined in assembly are available even with |OPENSSL_NO_ASM| in -// this case. -#define SHA1_ASM -void sha1_block_data_order(uint32_t *state, const uint8_t *in, - size_t num_blocks); -#endif - #if !defined(OPENSSL_NO_ASM) && \ (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \ defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) +#define SHA1_ASM #define SHA256_ASM #define SHA512_ASM +void sha1_block_data_order(uint32_t *state, const uint8_t *in, + size_t num_blocks); void sha256_block_data_order(uint32_t *state, const uint8_t *in, size_t num_blocks); void sha512_block_data_order(uint64_t *state, const uint8_t *in, diff --git a/crypto/fipsmodule/sha/sha1-altivec.c b/crypto/fipsmodule/sha/sha1-altivec.c deleted file mode 100644 index 3152827a0c..0000000000 --- a/crypto/fipsmodule/sha/sha1-altivec.c +++ /dev/null @@ -1,361 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] */ - -// Altivec-optimized SHA1 in C. This is tested on ppc64le only. -// -// References: -// https://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1 -// http://arctic.org/~dean/crypto/sha1.html -// -// This code used the generic SHA-1 from OpenSSL as a basis and AltiVec -// optimisations were added on top. - -#include - -#if defined(OPENSSL_PPC64LE) - -#include - -void sha1_block_data_order(uint32_t *state, const uint8_t *data, size_t num); - -static uint32_t rotate(uint32_t a, int n) { return (a << n) | (a >> (32 - n)); } - -typedef vector unsigned int vec_uint32_t; -typedef vector unsigned char vec_uint8_t; - -// Vector constants -static const vec_uint8_t k_swap_endianness = {3, 2, 1, 0, 7, 6, 5, 4, - 11, 10, 9, 8, 15, 14, 13, 12}; - -// Shift amounts for byte and bit shifts and rotations -static const vec_uint8_t k_4_bytes = {32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32}; -static const vec_uint8_t k_12_bytes = {96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96}; - -#define K_00_19 0x5a827999UL -#define K_20_39 0x6ed9eba1UL -#define K_40_59 0x8f1bbcdcUL -#define K_60_79 0xca62c1d6UL - -// Vector versions of the above. -static const vec_uint32_t K_00_19_x_4 = {K_00_19, K_00_19, K_00_19, K_00_19}; -static const vec_uint32_t K_20_39_x_4 = {K_20_39, K_20_39, K_20_39, K_20_39}; -static const vec_uint32_t K_40_59_x_4 = {K_40_59, K_40_59, K_40_59, K_40_59}; -static const vec_uint32_t K_60_79_x_4 = {K_60_79, K_60_79, K_60_79, K_60_79}; - -// vector message scheduling: compute message schedule for round i..i+3 where i -// is divisible by 4. We return the schedule w[i..i+3] as a vector. In -// addition, we also precompute sum w[i..+3] and an additive constant K. This -// is done to offload some computation of f() in the integer execution units. -// -// Byte shifting code below may not be correct for big-endian systems. -static vec_uint32_t sched_00_15(vec_uint32_t *pre_added, const void *data, - vec_uint32_t k) { - const vector unsigned char unaligned_data = - vec_vsx_ld(0, (const unsigned char*) data); - const vec_uint32_t v = (vec_uint32_t) unaligned_data; - const vec_uint32_t w = vec_perm(v, v, k_swap_endianness); - vec_st(w + k, 0, pre_added); - return w; -} - -// Compute w[i..i+3] using these steps for i in [16, 20, 24, 28] -// -// w'[i ] = (w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]) <<< 1 -// w'[i+1] = (w[i-2] ^ w[i-7] ^ w[i-13] ^ w[i-15]) <<< 1 -// w'[i+2] = (w[i-1] ^ w[i-6] ^ w[i-12] ^ w[i-14]) <<< 1 -// w'[i+3] = ( 0 ^ w[i-5] ^ w[i-11] ^ w[i-13]) <<< 1 -// -// w[ i] = w'[ i] -// w[i+1] = w'[i+1] -// w[i+2] = w'[i+2] -// w[i+3] = w'[i+3] ^ (w'[i] <<< 1) -static vec_uint32_t sched_16_31(vec_uint32_t *pre_added, vec_uint32_t minus_4, - vec_uint32_t minus_8, vec_uint32_t minus_12, - vec_uint32_t minus_16, vec_uint32_t k) { - const vec_uint32_t minus_3 = vec_sro(minus_4, k_4_bytes); - const vec_uint32_t minus_14 = vec_sld((minus_12), (minus_16), 8); - const vec_uint32_t k_1_bit = vec_splat_u32(1); - const vec_uint32_t w_prime = - vec_rl(minus_3 ^ minus_8 ^ minus_14 ^ minus_16, k_1_bit); - const vec_uint32_t w = - w_prime ^ vec_rl(vec_slo(w_prime, k_12_bytes), k_1_bit); - vec_st(w + k, 0, pre_added); - return w; -} - -// Compute w[i..i+3] using this relation for i in [32, 36, 40 ... 76] -// w[i] = (w[i-6] ^ w[i-16] ^ w[i-28] ^ w[i-32]), 2) <<< 2 -static vec_uint32_t sched_32_79(vec_uint32_t *pre_added, vec_uint32_t minus_4, - vec_uint32_t minus_8, vec_uint32_t minus_16, - vec_uint32_t minus_28, vec_uint32_t minus_32, - vec_uint32_t k) { - const vec_uint32_t minus_6 = vec_sld(minus_4, minus_8, 8); - const vec_uint32_t k_2_bits = vec_splat_u32(2); - const vec_uint32_t w = - vec_rl(minus_6 ^ minus_16 ^ minus_28 ^ minus_32, k_2_bits); - vec_st(w + k, 0, pre_added); - return w; -} - -// As pointed out by Wei Dai , F() below can be simplified -// to the code in F_00_19. Wei attributes these optimisations to Peter -// Gutmann's SHS code, and he attributes it to Rich Schroeppel. #define -// F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) I've just become aware of another -// tweak to be made, again from Wei Dai, in F_40_59, (x&a)|(y&a) -> (x|y)&a -#define F_00_19(b, c, d) ((((c) ^ (d)) & (b)) ^ (d)) -#define F_20_39(b, c, d) ((b) ^ (c) ^ (d)) -#define F_40_59(b, c, d) (((b) & (c)) | (((b) | (c)) & (d))) -#define F_60_79(b, c, d) F_20_39(b, c, d) - -// We pre-added the K constants during message scheduling. -#define BODY_00_19(i, a, b, c, d, e, f) \ - do { \ - (f) = w[i] + (e) + rotate((a), 5) + F_00_19((b), (c), (d)); \ - (b) = rotate((b), 30); \ - } while (0) - -#define BODY_20_39(i, a, b, c, d, e, f) \ - do { \ - (f) = w[i] + (e) + rotate((a), 5) + F_20_39((b), (c), (d)); \ - (b) = rotate((b), 30); \ - } while (0) - -#define BODY_40_59(i, a, b, c, d, e, f) \ - do { \ - (f) = w[i] + (e) + rotate((a), 5) + F_40_59((b), (c), (d)); \ - (b) = rotate((b), 30); \ - } while (0) - -#define BODY_60_79(i, a, b, c, d, e, f) \ - do { \ - (f) = w[i] + (e) + rotate((a), 5) + F_60_79((b), (c), (d)); \ - (b) = rotate((b), 30); \ - } while (0) - -void sha1_block_data_order(uint32_t *state, const uint8_t *data, size_t num) { - uint32_t A, B, C, D, E, T; - - A = state[0]; - B = state[1]; - C = state[2]; - D = state[3]; - E = state[4]; - - for (;;) { - vec_uint32_t vw[20]; - const uint32_t *w = (const uint32_t *)&vw; - - vec_uint32_t k = K_00_19_x_4; - const vec_uint32_t w0 = sched_00_15(vw + 0, data + 0, k); - BODY_00_19(0, A, B, C, D, E, T); - BODY_00_19(1, T, A, B, C, D, E); - BODY_00_19(2, E, T, A, B, C, D); - BODY_00_19(3, D, E, T, A, B, C); - - const vec_uint32_t w4 = sched_00_15(vw + 1, data + 16, k); - BODY_00_19(4, C, D, E, T, A, B); - BODY_00_19(5, B, C, D, E, T, A); - BODY_00_19(6, A, B, C, D, E, T); - BODY_00_19(7, T, A, B, C, D, E); - - const vec_uint32_t w8 = sched_00_15(vw + 2, data + 32, k); - BODY_00_19(8, E, T, A, B, C, D); - BODY_00_19(9, D, E, T, A, B, C); - BODY_00_19(10, C, D, E, T, A, B); - BODY_00_19(11, B, C, D, E, T, A); - - const vec_uint32_t w12 = sched_00_15(vw + 3, data + 48, k); - BODY_00_19(12, A, B, C, D, E, T); - BODY_00_19(13, T, A, B, C, D, E); - BODY_00_19(14, E, T, A, B, C, D); - BODY_00_19(15, D, E, T, A, B, C); - - const vec_uint32_t w16 = sched_16_31(vw + 4, w12, w8, w4, w0, k); - BODY_00_19(16, C, D, E, T, A, B); - BODY_00_19(17, B, C, D, E, T, A); - BODY_00_19(18, A, B, C, D, E, T); - BODY_00_19(19, T, A, B, C, D, E); - - k = K_20_39_x_4; - const vec_uint32_t w20 = sched_16_31(vw + 5, w16, w12, w8, w4, k); - BODY_20_39(20, E, T, A, B, C, D); - BODY_20_39(21, D, E, T, A, B, C); - BODY_20_39(22, C, D, E, T, A, B); - BODY_20_39(23, B, C, D, E, T, A); - - const vec_uint32_t w24 = sched_16_31(vw + 6, w20, w16, w12, w8, k); - BODY_20_39(24, A, B, C, D, E, T); - BODY_20_39(25, T, A, B, C, D, E); - BODY_20_39(26, E, T, A, B, C, D); - BODY_20_39(27, D, E, T, A, B, C); - - const vec_uint32_t w28 = sched_16_31(vw + 7, w24, w20, w16, w12, k); - BODY_20_39(28, C, D, E, T, A, B); - BODY_20_39(29, B, C, D, E, T, A); - BODY_20_39(30, A, B, C, D, E, T); - BODY_20_39(31, T, A, B, C, D, E); - - const vec_uint32_t w32 = sched_32_79(vw + 8, w28, w24, w16, w4, w0, k); - BODY_20_39(32, E, T, A, B, C, D); - BODY_20_39(33, D, E, T, A, B, C); - BODY_20_39(34, C, D, E, T, A, B); - BODY_20_39(35, B, C, D, E, T, A); - - const vec_uint32_t w36 = sched_32_79(vw + 9, w32, w28, w20, w8, w4, k); - BODY_20_39(36, A, B, C, D, E, T); - BODY_20_39(37, T, A, B, C, D, E); - BODY_20_39(38, E, T, A, B, C, D); - BODY_20_39(39, D, E, T, A, B, C); - - k = K_40_59_x_4; - const vec_uint32_t w40 = sched_32_79(vw + 10, w36, w32, w24, w12, w8, k); - BODY_40_59(40, C, D, E, T, A, B); - BODY_40_59(41, B, C, D, E, T, A); - BODY_40_59(42, A, B, C, D, E, T); - BODY_40_59(43, T, A, B, C, D, E); - - const vec_uint32_t w44 = sched_32_79(vw + 11, w40, w36, w28, w16, w12, k); - BODY_40_59(44, E, T, A, B, C, D); - BODY_40_59(45, D, E, T, A, B, C); - BODY_40_59(46, C, D, E, T, A, B); - BODY_40_59(47, B, C, D, E, T, A); - - const vec_uint32_t w48 = sched_32_79(vw + 12, w44, w40, w32, w20, w16, k); - BODY_40_59(48, A, B, C, D, E, T); - BODY_40_59(49, T, A, B, C, D, E); - BODY_40_59(50, E, T, A, B, C, D); - BODY_40_59(51, D, E, T, A, B, C); - - const vec_uint32_t w52 = sched_32_79(vw + 13, w48, w44, w36, w24, w20, k); - BODY_40_59(52, C, D, E, T, A, B); - BODY_40_59(53, B, C, D, E, T, A); - BODY_40_59(54, A, B, C, D, E, T); - BODY_40_59(55, T, A, B, C, D, E); - - const vec_uint32_t w56 = sched_32_79(vw + 14, w52, w48, w40, w28, w24, k); - BODY_40_59(56, E, T, A, B, C, D); - BODY_40_59(57, D, E, T, A, B, C); - BODY_40_59(58, C, D, E, T, A, B); - BODY_40_59(59, B, C, D, E, T, A); - - k = K_60_79_x_4; - const vec_uint32_t w60 = sched_32_79(vw + 15, w56, w52, w44, w32, w28, k); - BODY_60_79(60, A, B, C, D, E, T); - BODY_60_79(61, T, A, B, C, D, E); - BODY_60_79(62, E, T, A, B, C, D); - BODY_60_79(63, D, E, T, A, B, C); - - const vec_uint32_t w64 = sched_32_79(vw + 16, w60, w56, w48, w36, w32, k); - BODY_60_79(64, C, D, E, T, A, B); - BODY_60_79(65, B, C, D, E, T, A); - BODY_60_79(66, A, B, C, D, E, T); - BODY_60_79(67, T, A, B, C, D, E); - - const vec_uint32_t w68 = sched_32_79(vw + 17, w64, w60, w52, w40, w36, k); - BODY_60_79(68, E, T, A, B, C, D); - BODY_60_79(69, D, E, T, A, B, C); - BODY_60_79(70, C, D, E, T, A, B); - BODY_60_79(71, B, C, D, E, T, A); - - const vec_uint32_t w72 = sched_32_79(vw + 18, w68, w64, w56, w44, w40, k); - BODY_60_79(72, A, B, C, D, E, T); - BODY_60_79(73, T, A, B, C, D, E); - BODY_60_79(74, E, T, A, B, C, D); - BODY_60_79(75, D, E, T, A, B, C); - - // We don't use the last value - (void)sched_32_79(vw + 19, w72, w68, w60, w48, w44, k); - BODY_60_79(76, C, D, E, T, A, B); - BODY_60_79(77, B, C, D, E, T, A); - BODY_60_79(78, A, B, C, D, E, T); - BODY_60_79(79, T, A, B, C, D, E); - - const uint32_t mask = 0xffffffffUL; - state[0] = (state[0] + E) & mask; - state[1] = (state[1] + T) & mask; - state[2] = (state[2] + A) & mask; - state[3] = (state[3] + B) & mask; - state[4] = (state[4] + C) & mask; - - data += 64; - if (--num == 0) { - break; - } - - A = state[0]; - B = state[1]; - C = state[2]; - D = state[3]; - E = state[4]; - } -} - -#endif // OPENSSL_PPC64LE - -#undef K_00_19 -#undef K_20_39 -#undef K_40_59 -#undef K_60_79 -#undef F_00_19 -#undef F_20_39 -#undef F_40_59 -#undef F_60_79 -#undef BODY_00_19 -#undef BODY_20_39 -#undef BODY_40_59 -#undef BODY_60_79 diff --git a/crypto/internal.h b/crypto/internal.h index 63e6a662f1..f9a243e670 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -166,7 +166,7 @@ extern "C" { #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || defined(OPENSSL_ARM) || \ - defined(OPENSSL_AARCH64) || defined(OPENSSL_PPC64LE) + defined(OPENSSL_AARCH64) // OPENSSL_cpuid_setup initializes the platform-specific feature cache. void OPENSSL_cpuid_setup(void); #endif @@ -1251,16 +1251,6 @@ OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) { #endif // OPENSSL_ARM || OPENSSL_AARCH64 -#if defined(OPENSSL_PPC64LE) - -// CRYPTO_is_PPC64LE_vcrypto_capable returns true iff the current CPU supports -// the Vector.AES category of instructions. -int CRYPTO_is_PPC64LE_vcrypto_capable(void); - -extern unsigned long OPENSSL_ppc64le_hwcap2; - -#endif // OPENSSL_PPC64LE - #if defined(BORINGSSL_DISPATCH_TEST) // Runtime CPU dispatch testing support diff --git a/crypto/perlasm/ppc-xlate.pl b/crypto/perlasm/ppc-xlate.pl deleted file mode 100644 index 1c51577ed8..0000000000 --- a/crypto/perlasm/ppc-xlate.pl +++ /dev/null @@ -1,320 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -my $flavour = shift; -my $output = shift; -open STDOUT,">$output" || die "can't open $output: $!"; - -my %GLOBALS; -my %TYPES; -my $dotinlocallabels=($flavour=~/linux/)?1:0; - -################################################################ -# directives which need special treatment on different platforms -################################################################ -my $type = sub { - my ($dir,$name,$type) = @_; - - $TYPES{$name} = $type; - if ($flavour =~ /linux/) { - $name =~ s|^\.||; - ".type $name,$type"; - } else { - ""; - } -}; -my $globl = sub { - my $junk = shift; - my $name = shift; - my $global = \$GLOBALS{$name}; - my $type = \$TYPES{$name}; - my $ret; - - $name =~ s|^\.||; - - SWITCH: for ($flavour) { - /aix/ && do { if (!$$type) { - $$type = "\@function"; - } - if ($$type =~ /function/) { - $name = ".$name"; - } - last; - }; - /osx/ && do { $name = "_$name"; - last; - }; - /linux.*(32|64le)/ - && do { $ret .= ".globl $name"; - if (!$$type) { - $ret .= "\n.type $name,\@function"; - $$type = "\@function"; - } - last; - }; - /linux.*64/ && do { $ret .= ".globl $name"; - if (!$$type) { - $ret .= "\n.type $name,\@function"; - $$type = "\@function"; - } - if ($$type =~ /function/) { - $ret .= "\n.section \".opd\",\"aw\""; - $ret .= "\n.align 3"; - $ret .= "\n$name:"; - $ret .= "\n.quad .$name,.TOC.\@tocbase,0"; - $ret .= "\n.previous"; - $name = ".$name"; - } - last; - }; - } - - $ret = ".globl $name" if (!$ret); - $$global = $name; - $ret; -}; -my $text = sub { - my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text"; - $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64le/); - $ret; -}; -my $machine = sub { - my $junk = shift; - my $arch = shift; - if ($flavour =~ /osx/) - { $arch =~ s/\"//g; - $arch = ($flavour=~/64/) ? "ppc970-64" : "ppc970" if ($arch eq "any"); - } - ".machine $arch"; -}; -my $size = sub { - if ($flavour =~ /linux/) - { shift; - my $name = shift; - my $real = $GLOBALS{$name} ? \$GLOBALS{$name} : \$name; - my $ret = ".size $$real,.-$$real"; - $name =~ s|^\.||; - if ($$real ne $name) { - $ret .= "\n.size $name,.-$$real"; - } - $ret; - } - else - { ""; } -}; -my $asciz = sub { - shift; - my $line = join(",",@_); - if ($line =~ /^"(.*)"$/) - { ".byte " . join(",",unpack("C*",$1),0) . "\n.align 2"; } - else - { ""; } -}; -my $quad = sub { - shift; - my @ret; - my ($hi,$lo); - for (@_) { - if (/^0x([0-9a-f]*?)([0-9a-f]{1,8})$/io) - { $hi=$1?"0x$1":"0"; $lo="0x$2"; } - elsif (/^([0-9]+)$/o) - { $hi=$1>>32; $lo=$1&0xffffffff; } # error-prone with 32-bit perl - else - { $hi=undef; $lo=$_; } - - if (defined($hi)) - { push(@ret,$flavour=~/le$/o?".long\t$lo,$hi":".long\t$hi,$lo"); } - else - { push(@ret,".quad $lo"); } - } - join("\n",@ret); -}; - -################################################################ -# simplified mnemonics not handled by at least one assembler -################################################################ -my $cmplw = sub { - my $f = shift; - my $cr = 0; $cr = shift if ($#_>1); - # Some out-of-date 32-bit GNU assembler just can't handle cmplw... - ($flavour =~ /linux.*32/) ? - " .long ".sprintf "0x%x",31<<26|$cr<<23|$_[0]<<16|$_[1]<<11|64 : - " cmplw ".join(',',$cr,@_); -}; -my $bdnz = sub { - my $f = shift; - my $bo = $f=~/[\+\-]/ ? 16+9 : 16; # optional "to be taken" hint - " bc $bo,0,".shift; -} if ($flavour!~/linux/); -my $bltlr = sub { - my $f = shift; - my $bo = $f=~/\-/ ? 12+2 : 12; # optional "not to be taken" hint - ($flavour =~ /linux/) ? # GNU as doesn't allow most recent hints - " .long ".sprintf "0x%x",19<<26|$bo<<21|16<<1 : - " bclr $bo,0"; -}; -my $bnelr = sub { - my $f = shift; - my $bo = $f=~/\-/ ? 4+2 : 4; # optional "not to be taken" hint - ($flavour =~ /linux/) ? # GNU as doesn't allow most recent hints - " .long ".sprintf "0x%x",19<<26|$bo<<21|2<<16|16<<1 : - " bclr $bo,2"; -}; -my $beqlr = sub { - my $f = shift; - my $bo = $f=~/-/ ? 12+2 : 12; # optional "not to be taken" hint - ($flavour =~ /linux/) ? # GNU as doesn't allow most recent hints - " .long ".sprintf "0x%X",19<<26|$bo<<21|2<<16|16<<1 : - " bclr $bo,2"; -}; -# GNU assembler can't handle extrdi rA,rS,16,48, or when sum of last two -# arguments is 64, with "operand out of range" error. -my $extrdi = sub { - my ($f,$ra,$rs,$n,$b) = @_; - $b = ($b+$n)&63; $n = 64-$n; - " rldicl $ra,$rs,$b,$n"; -}; -my $vmr = sub { - my ($f,$vx,$vy) = @_; - " vor $vx,$vy,$vy"; -}; - -# Some ABIs specify vrsave, special-purpose register #256, as reserved -# for system use. -my $no_vrsave = ($flavour =~ /aix|linux64le/); -my $mtspr = sub { - my ($f,$idx,$ra) = @_; - if ($idx == 256 && $no_vrsave) { - " or $ra,$ra,$ra"; - } else { - " mtspr $idx,$ra"; - } -}; -my $mfspr = sub { - my ($f,$rd,$idx) = @_; - if ($idx == 256 && $no_vrsave) { - " li $rd,-1"; - } else { - " mfspr $rd,$idx"; - } -}; - -# PowerISA 2.06 stuff -sub vsxmem_op { - my ($f, $vrt, $ra, $rb, $op) = @_; - " .long ".sprintf "0x%X",(31<<26)|($vrt<<21)|($ra<<16)|($rb<<11)|($op*2+1); -} -# made-up unaligned memory reference AltiVec/VMX instructions -my $lvx_u = sub { vsxmem_op(@_, 844); }; # lxvd2x -my $stvx_u = sub { vsxmem_op(@_, 972); }; # stxvd2x -my $lvdx_u = sub { vsxmem_op(@_, 588); }; # lxsdx -my $stvdx_u = sub { vsxmem_op(@_, 716); }; # stxsdx -my $lvx_4w = sub { vsxmem_op(@_, 780); }; # lxvw4x -my $stvx_4w = sub { vsxmem_op(@_, 908); }; # stxvw4x - -# PowerISA 2.07 stuff -sub vcrypto_op { - my ($f, $vrt, $vra, $vrb, $op) = @_; - " .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|$op; -} -my $vcipher = sub { vcrypto_op(@_, 1288); }; -my $vcipherlast = sub { vcrypto_op(@_, 1289); }; -my $vncipher = sub { vcrypto_op(@_, 1352); }; -my $vncipherlast= sub { vcrypto_op(@_, 1353); }; -my $vsbox = sub { vcrypto_op(@_, 0, 1480); }; -my $vshasigmad = sub { my ($st,$six)=splice(@_,-2); vcrypto_op(@_, $st<<4|$six, 1730); }; -my $vshasigmaw = sub { my ($st,$six)=splice(@_,-2); vcrypto_op(@_, $st<<4|$six, 1666); }; -my $vpmsumb = sub { vcrypto_op(@_, 1032); }; -my $vpmsumd = sub { vcrypto_op(@_, 1224); }; -my $vpmsubh = sub { vcrypto_op(@_, 1096); }; -my $vpmsumw = sub { vcrypto_op(@_, 1160); }; -my $vaddudm = sub { vcrypto_op(@_, 192); }; - -my $mtsle = sub { - my ($f, $arg) = @_; - " .long ".sprintf "0x%X",(31<<26)|($arg<<21)|(147*2); -}; - -# PowerISA 3.0 stuff -my $maddhdu = sub { - my ($f, $rt, $ra, $rb, $rc) = @_; - " .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|49; -}; -my $maddld = sub { - my ($f, $rt, $ra, $rb, $rc) = @_; - " .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|51; -}; - -my $darn = sub { - my ($f, $rt, $l) = @_; - " .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($l<<16)|(755<<1); -}; - -print <<___; -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if !defined(OPENSSL_NO_ASM) && defined(__powerpc64__) && defined(__ELF__) -___ - -while($line=<>) { - - $line =~ s|[#!;].*$||; # get rid of asm-style comments... - $line =~ s|/\*.*\*/||; # ... and C-style comments... - $line =~ s|^\s+||; # ... and skip white spaces in beginning... - $line =~ s|\s+$||; # ... and at the end - - { - $line =~ s|\.L(\w+)|L$1|g; # common denominator for Locallabel - $line =~ s|\bL(\w+)|\.L$1|g if ($dotinlocallabels); - } - - { - $line =~ s|(^[\.\w]+)\:\s*||; - my $label = $1; - if ($label) { - my $xlated = ($GLOBALS{$label} or $label); - print "$xlated:"; - if ($flavour =~ /linux.*64le/) { - if ($TYPES{$label} =~ /function/) { - printf "\n.localentry %s,0\n",$xlated; - } - } - } - } - - { - $line =~ s|^\s*(\.?)(\w+)([\.\+\-]?)\s*||; - my $c = $1; $c = "\t" if ($c eq ""); - my $mnemonic = $2; - my $f = $3; - my $opcode = eval("\$$mnemonic"); - $line =~ s/\b(c?[rf]|v|vs)([0-9]+)\b/$2/g if ($c ne "." and $flavour !~ /osx/); - if (ref($opcode) eq 'CODE') { $line = &$opcode($f,split(',',$line)); } - elsif ($mnemonic) { $line = $c.$mnemonic.$f."\t".$line; } - } - - print $line if ($line); - print "\n"; -} - -print <<___; -#endif // !OPENSSL_NO_ASM && __powerpc64__ && __ELF__ -#if defined(__ELF__) -// See https://www.airs.com/blog/archives/518. -.section .note.GNU-stack,"",\%progbits -#endif -___ - -close STDOUT or die "error closing STDOUT: $!"; diff --git a/crypto/test/abi_test.h b/crypto/test/abi_test.h index 1ba82b1209..24340c9065 100644 --- a/crypto/test/abi_test.h +++ b/crypto/test/abi_test.h @@ -179,78 +179,7 @@ struct alignas(16) Reg128 { CALLER_STATE_REGISTER(uint64_t, x28) \ CALLER_STATE_REGISTER(uint64_t, x29) -#elif defined(OPENSSL_PPC64LE) - -// CRReg only compares the CR2-CR4 bits of a CR register. -struct CRReg { - uint32_t masked() const { return value & 0x00fff000; } - bool operator==(CRReg r) const { return masked() == r.masked(); } - bool operator!=(CRReg r) const { return masked() != r.masked(); } - uint32_t value; -}; - -// References: -// ELFv2: http://openpowerfoundation.org/wp-content/uploads/resources/leabi/leabi-20170510.pdf -// -// Note vector and floating-point registers on POWER have two different names. -// Originally, there were 32 floating-point registers and 32 vector registers, -// labelled f0-f31 and v0-v31 respectively. Later, VSX (Vector Scalar Extension) -// unified them into 64 registers vs0-vs63. f0-f31 map to the lower halves of -// vs0-vs31. v0-v31 map to vs32-vs63. The ABI was defined in terms of pre-VSX -// names, so we use those names here. In particular, f14-f31 are -// callee-saved, but the upper halves of vs14-vs31 are not. -#define LOOP_CALLER_STATE_REGISTERS() \ - CALLER_STATE_REGISTER(Reg128, v20) \ - CALLER_STATE_REGISTER(Reg128, v21) \ - CALLER_STATE_REGISTER(Reg128, v22) \ - CALLER_STATE_REGISTER(Reg128, v23) \ - CALLER_STATE_REGISTER(Reg128, v24) \ - CALLER_STATE_REGISTER(Reg128, v25) \ - CALLER_STATE_REGISTER(Reg128, v26) \ - CALLER_STATE_REGISTER(Reg128, v27) \ - CALLER_STATE_REGISTER(Reg128, v28) \ - CALLER_STATE_REGISTER(Reg128, v29) \ - CALLER_STATE_REGISTER(Reg128, v30) \ - CALLER_STATE_REGISTER(Reg128, v31) \ - CALLER_STATE_REGISTER(uint64_t, r14) \ - CALLER_STATE_REGISTER(uint64_t, r15) \ - CALLER_STATE_REGISTER(uint64_t, r16) \ - CALLER_STATE_REGISTER(uint64_t, r17) \ - CALLER_STATE_REGISTER(uint64_t, r18) \ - CALLER_STATE_REGISTER(uint64_t, r19) \ - CALLER_STATE_REGISTER(uint64_t, r20) \ - CALLER_STATE_REGISTER(uint64_t, r21) \ - CALLER_STATE_REGISTER(uint64_t, r22) \ - CALLER_STATE_REGISTER(uint64_t, r23) \ - CALLER_STATE_REGISTER(uint64_t, r24) \ - CALLER_STATE_REGISTER(uint64_t, r25) \ - CALLER_STATE_REGISTER(uint64_t, r26) \ - CALLER_STATE_REGISTER(uint64_t, r27) \ - CALLER_STATE_REGISTER(uint64_t, r28) \ - CALLER_STATE_REGISTER(uint64_t, r29) \ - CALLER_STATE_REGISTER(uint64_t, r30) \ - CALLER_STATE_REGISTER(uint64_t, r31) \ - CALLER_STATE_REGISTER(uint64_t, f14) \ - CALLER_STATE_REGISTER(uint64_t, f15) \ - CALLER_STATE_REGISTER(uint64_t, f16) \ - CALLER_STATE_REGISTER(uint64_t, f17) \ - CALLER_STATE_REGISTER(uint64_t, f18) \ - CALLER_STATE_REGISTER(uint64_t, f19) \ - CALLER_STATE_REGISTER(uint64_t, f20) \ - CALLER_STATE_REGISTER(uint64_t, f21) \ - CALLER_STATE_REGISTER(uint64_t, f22) \ - CALLER_STATE_REGISTER(uint64_t, f23) \ - CALLER_STATE_REGISTER(uint64_t, f24) \ - CALLER_STATE_REGISTER(uint64_t, f25) \ - CALLER_STATE_REGISTER(uint64_t, f26) \ - CALLER_STATE_REGISTER(uint64_t, f27) \ - CALLER_STATE_REGISTER(uint64_t, f28) \ - CALLER_STATE_REGISTER(uint64_t, f29) \ - CALLER_STATE_REGISTER(uint64_t, f30) \ - CALLER_STATE_REGISTER(uint64_t, f31) \ - CALLER_STATE_REGISTER(CRReg, cr) - -#endif // X86_64 || X86 || ARM || AARCH64 || PPC64LE +#endif // X86_64 || X86 || ARM || AARCH64 // Enable ABI testing if all of the following are true. // @@ -302,12 +231,6 @@ inline crypto_word_t ToWord(T t) { // on 32-bit architectures for simplicity. static_assert(sizeof(T) == 4, "parameter types must be word-sized"); return (crypto_word_t)t; -#elif defined(OPENSSL_PPC64LE) - // ELFv2, section 2.2.2.3 says the parameter save area sign- or zero-extends - // parameters passed in memory. Section 2.2.3 is unclear on how to handle - // register parameters, but section 2.2.2.3 additionally says that the memory - // copy of a parameter is identical to the register one. - return (crypto_word_t)t; #elif defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64) // AAPCS64, section 5.4.2, clauses C.7 and C.14 says any remaining bits in // aarch are unspecified. iOS64 contradicts this and says the callee extends @@ -362,9 +285,9 @@ inline crypto_word_t ToWord(T t) { template inline crypto_word_t CheckImpl(Result *out, bool unwind, R (*func)(Args...), typename DeductionGuard::Type... args) { - // We only support up to 8 arguments, so all arguments on aarch64 and ppc64le - // are passed in registers. This is simpler and avoids the iOS discrepancy - // around packing small arguments on the stack. (See the iOS64 reference.) + // We only support up to 8 arguments, so all arguments on aarch64 are passed + // in registers. This is simpler and avoids the iOS discrepancy around packing + // small arguments on the stack. (See the iOS64 reference.) static_assert(sizeof...(args) <= 8, "too many arguments for abi_test_trampoline"); diff --git a/crypto/test/asm/trampoline-ppc.pl b/crypto/test/asm/trampoline-ppc.pl deleted file mode 100755 index b29c3612da..0000000000 --- a/crypto/test/asm/trampoline-ppc.pl +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/env perl -# Copyright (c) 2019, Google Inc. -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -# This file defines helper functions for crypto/test/abi_test.h on ppc64le. See -# that header for details on how to use this. -# -# For convenience, this file is linked into libcrypto, where consuming builds -# already support architecture-specific sources. The static linker should drop -# this code in non-test binaries. This includes a shared library build of -# libcrypto, provided --gc-sections or equivalent is used. -# -# References: -# -# ELFv2: http://openpowerfoundation.org/wp-content/uploads/resources/leabi/leabi-20170510.pdf - -use strict; - -my $flavour = shift; -my $output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; -my $dir = $1; -my $xlate; -( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or -die "can't locate ppc-xlate.pl"; - -open OUT, "| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT = *OUT; - -unless ($flavour =~ /linux.*64le/) { - die "This file only supports the ELFv2 ABI, used by ppc64le"; -} - -my $code = ""; - -sub load_or_store_regs { - # $op is "l" or "st". - my ($op, $base_reg, $base_offset) = @_; - # Vector registers. - foreach (20..31) { - my $offset = $base_offset + ($_ - 20) * 16; - # Vector registers only support indexed register addressing. - $code .= "\tli\tr11, $offset\n"; - $code .= "\t${op}vx\tv$_, r11, $base_reg\n"; - } - # Save general registers. - foreach (14..31) { - my $offset = $base_offset + 192 + ($_ - 14) * 8; - $code .= "\t${op}d\tr$_, $offset($base_reg)\n"; - } - # Save floating point registers. - foreach (14..31) { - my $offset = $base_offset + 336 + ($_ - 14) * 8; - $code .= "\t${op}fd\tf$_, $offset($base_reg)\n"; - } -} - -sub load_regs { - my ($base_reg, $base_offset) = @_; - load_or_store_regs("l", $base_reg, $base_offset); -} - -sub store_regs { - my ($base_reg, $base_offset) = @_; - load_or_store_regs("st", $base_reg, $base_offset); -} - -my ($func, $state, $argv, $argc) = ("r3", "r4", "r5", "r6"); -$code .= <<____; -.machine "any" -.text - -# abi_test_trampoline loads callee-saved registers from |state|, calls |func| -# with |argv|, then saves the callee-saved registers into |state|. It returns -# the result of |func|. The |unwind| argument is unused. -# uint64_t abi_test_trampoline(void (*func)(...), CallerState *state, -# const uint64_t *argv, size_t argc, -# uint64_t unwind); -.globl abi_test_trampoline -.align 5 -abi_test_trampoline: - # LR is saved into the caller's stack frame. - mflr r0 - std r0, 16(r1) - - # Allocate 66*8 = 528 bytes of stack frame. From the top of the stack - # to the bottom, the stack frame is: - # - # 0(r1) - Back chain pointer - # 8(r1) - CR save area - # 16(r1) - LR save area (for |func|) - # 24(r1) - TOC pointer save area - # 32(r1) - Saved copy of |state| - # 40(r1) - Padding - # 48(r1) - Vector register save area (v20-v31, 12 registers) - # 240(r1) - General register save area (r14-r31, 18 registers) - # 384(r1) - Floating point register save area (f14-f31, 18 registers) - # - # Note the layouts of the register save areas and CallerState match. - # - # In the ELFv2 ABI, the parameter save area is optional if the function - # is non-variadic and all parameters fit in registers. We only support - # such functions, so we omit it to test that |func| does not rely on it. - stdu r1, -528(r1) - - mfcr r0 - std r0, 8(r1) # Save CR - std r2, 24(r1) # Save TOC - std $state, 32(r1) # Save |state| -____ -# Save registers to the stack. -store_regs("r1", 48); -# Load registers from the caller. -load_regs($state, 0); -$code .= <<____; - # Load CR from |state|. - ld r0, 480($state) - mtcr r0 - - # Move parameters into temporary registers so they are not clobbered. - addi r11, $argv, -8 # Adjust for ldu below - mr r12, $func - - # Load parameters into registers. - cmpdi $argc, 0 - beq .Largs_done - mtctr $argc - ldu r3, 8(r11) - bdz .Largs_done - ldu r4, 8(r11) - bdz .Largs_done - ldu r5, 8(r11) - bdz .Largs_done - ldu r6, 8(r11) - bdz .Largs_done - ldu r7, 8(r11) - bdz .Largs_done - ldu r8, 8(r11) - bdz .Largs_done - ldu r9, 8(r11) - bdz .Largs_done - ldu r10, 8(r11) - -.Largs_done: - li r2, 0 # Clear TOC to test |func|'s global entry point - mtctr r12 - bctrl - ld r2, 24(r1) # Restore TOC - - ld $state, 32(r1) # Reload |state| -____ -# Output resulting registers to the caller. -store_regs($state, 0); -# Restore registers from the stack. -load_regs("r1", 48); -$code .= <<____; - mfcr r0 - std r0, 480($state) # Output CR to caller - ld r0, 8(r1) - mtcrf 0b00111000, r0 # Restore CR2-CR4 - addi r1, r1, 528 - ld r0, 16(r1) # Restore LR - mtlr r0 - blr -.size abi_test_trampoline,.-abi_test_trampoline -____ - -# abi_test_clobber_* clobbers the corresponding register. These are used to test -# the ABI-testing framework. -foreach (0..31) { - # r1 is the stack pointer. r13 is the thread pointer. - next if ($_ == 1 || $_ == 13); - $code .= <<____; -.globl abi_test_clobber_r$_ -.align 5 -abi_test_clobber_r$_: - li r$_, 0 - blr -.size abi_test_clobber_r$_,.-abi_test_clobber_r$_ -____ -} - -foreach (0..31) { - $code .= <<____; -.globl abi_test_clobber_f$_ -.align 4 -abi_test_clobber_f$_: - li r0, 0 - # Use the red zone. - std r0, -8(r1) - lfd f$_, -8(r1) - blr -.size abi_test_clobber_f$_,.-abi_test_clobber_f$_ -____ -} - -foreach (0..31) { - $code .= <<____; -.globl abi_test_clobber_v$_ -.align 4 -abi_test_clobber_v$_: - vxor v$_, v$_, v$_ - blr -.size abi_test_clobber_v$_,.-abi_test_clobber_v$_ -____ -} - -foreach (0..7) { - # PPC orders CR fields in big-endian, so the mask is reversed from what one - # would expect. - my $mask = 1 << (7 - $_); - $code .= <<____; -.globl abi_test_clobber_cr$_ -.align 4 -abi_test_clobber_cr$_: - # Flip the bits on cr$_ rather than setting to zero. With a four-bit - # register, zeroing it will do nothing 1 in 16 times. - mfcr r0 - not r0, r0 - mtcrf $mask, r0 - blr -.size abi_test_clobber_cr$_,.-abi_test_clobber_cr$_ -____ -} - -$code .= <<____; -.globl abi_test_clobber_ctr -.align 4 -abi_test_clobber_ctr: - li r0, 0 - mtctr r0 - blr -.size abi_test_clobber_ctr,.-abi_test_clobber_ctr - -.globl abi_test_clobber_lr -.align 4 -abi_test_clobber_lr: - mflr r0 - mtctr r0 - li r0, 0 - mtlr r0 - bctr -.size abi_test_clobber_lr,.-abi_test_clobber_lr - -____ - -print $code; -close STDOUT or die "error closing STDOUT: $!"; diff --git a/util/BUILD.toplevel b/util/BUILD.toplevel index e0d314825e..c3143894a8 100644 --- a/util/BUILD.toplevel +++ b/util/BUILD.toplevel @@ -24,7 +24,6 @@ load( "crypto_sources_apple_x86_64", "crypto_sources_linux_aarch64", "crypto_sources_linux_arm", - "crypto_sources_linux_ppc64le", "crypto_sources_linux_x86", "crypto_sources_linux_x86_64", "fips_fragments", @@ -65,14 +64,6 @@ exports_files(["LICENSE"]) ] ] -config_setting( - name = "linux_ppc64le", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:ppc", - ], -) - posix_copts = [ # Assembler option --noexecstack adds .note.GNU-stack to each object to # ensure that binaries can be built with non-executable stack. @@ -110,7 +101,6 @@ boringssl_copts = select({ # These selects must be kept in sync. crypto_sources_asm = select({ - ":linux_ppc64le": crypto_sources_linux_ppc64le, ":linux_armv7": crypto_sources_linux_arm, ":linux_arm64": crypto_sources_linux_aarch64, ":linux_x86_32": crypto_sources_linux_x86, @@ -138,7 +128,6 @@ crypto_sources_asm = select({ "//conditions:default": [], }) boringssl_copts += select({ - ":linux_ppc64le": [], ":linux_armv7": [], ":linux_arm64": [], ":linux_x86_32": [], diff --git a/util/fipstools/delocate/delocate.peg b/util/fipstools/delocate/delocate.peg index 0ffecea571..6ec5f7a7e8 100644 --- a/util/fipstools/delocate/delocate.peg +++ b/util/fipstools/delocate/delocate.peg @@ -12,7 +12,7 @@ # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -# This is a rough parser for x86-64 and ppc64le assembly designed to work with +# This is a rough parser for x86-64 and aarch64 assembly designed to work with # https://github.com/pointlander/peg. delocate.go has a go:generate line for # rebuilding delocate.peg.go from this file. diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 4a93a7fc88..c319a55295 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -35,7 +35,6 @@ ('apple', 'x86_64', 'macosx', [], 'S'), ('linux', 'arm', 'linux32', [], 'S'), ('linux', 'aarch64', 'linux64', [], 'S'), - ('linux', 'ppc64le', 'linux64le', [], 'S'), ('linux', 'x86', 'elf', ['-fPIC', '-DOPENSSL_IA32_SSE2'], 'S'), ('linux', 'x86_64', 'elf', [], 'S'), ('win', 'x86', 'win32n', ['-DOPENSSL_IA32_SSE2'], 'asm'), @@ -142,7 +141,7 @@ def PrintDefaults(self, blueprint, name, files, asm_outputs={}): if asm_outputs: blueprint.write(' target: {\n') for ((osname, arch), asm_files) in asm_outputs: - if osname != 'linux' or arch == 'ppc64le': + if osname != 'linux': continue if arch == 'aarch64': arch = 'arm64' @@ -480,8 +479,6 @@ def __init__(self): elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips") # Just to avoid the “unknown processor” error. set(ARCH "generic") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") - set(ARCH "ppc64le") else() message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR}) endif() From 68f4c720b636e5167bdab8a59ce07bf430f091c1 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 27 Jan 2023 09:10:22 -0500 Subject: [PATCH 008/177] Switch ERR_GET_* to inline functions Inline functions have type signatures, unlike macros. This seems to be compatible with existing callers and matches OpenSSL 3.0. Additionally, while Rust bindgen cannot deal with either inline functions or macros right now, it seems a future version will fix the former. Change-Id: I6966ff55910cf70e23117fe5f70a0bd286e26d56 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56405 Reviewed-by: Adam Langley Auto-Submit: David Benjamin Commit-Queue: David Benjamin Commit-Queue: Adam Langley --- include/openssl/err.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/include/openssl/err.h b/include/openssl/err.h index 28ba250707..7abeae2e3d 100644 --- a/include/openssl/err.h +++ b/include/openssl/err.h @@ -163,12 +163,16 @@ OPENSSL_EXPORT void ERR_free_strings(void); // ERR_GET_LIB returns the library code for the error. This is one of // the |ERR_LIB_*| values. -#define ERR_GET_LIB(packed_error) ((int)(((packed_error) >> 24) & 0xff)) +OPENSSL_INLINE int ERR_GET_LIB(uint32_t packed_error) { + return (int)((packed_error >> 24) & 0xff); +} // ERR_GET_REASON returns the reason code for the error. This is one of // library-specific |LIB_R_*| values where |LIB| is the library (see // |ERR_GET_LIB|). Note that reason codes are specific to the library. -#define ERR_GET_REASON(packed_error) ((int)((packed_error) & 0xfff)) +OPENSSL_INLINE int ERR_GET_REASON(uint32_t packed_error) { + return (int)(packed_error & 0xfff); +} // ERR_get_error gets the packed error code for the least recent error and // removes that error from the queue. If there are no errors in the queue then @@ -411,7 +415,10 @@ OPENSSL_EXPORT char *ERR_error_string(uint32_t packed_error, char *buf); #define ERR_ERROR_STRING_BUF_LEN 120 // ERR_GET_FUNC returns zero. BoringSSL errors do not report a function code. -#define ERR_GET_FUNC(packed_error) 0 +OPENSSL_INLINE int ERR_GET_FUNC(uint32_t packed_error) { + (void)packed_error; + return 0; +} // ERR_TXT_* are provided for compatibility with code that assumes that it's // using OpenSSL. From 7d2338d000eb1468a5bbf78e91854236e18fb9e4 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 18:59:12 -0500 Subject: [PATCH 009/177] Remove support for ppc64le. We no longer have a need to support ppc64le, nor do we have any testing story. Update-Note: BoringSSL no longer supports ppc64le. Change-Id: I016855e40e9a56f96d6d043fb4f970835eabe3b4 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56389 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/fipsmodule/rand/getrandom_fillin.h | 2 -- include/openssl/base.h | 3 --- 2 files changed, 5 deletions(-) diff --git a/crypto/fipsmodule/rand/getrandom_fillin.h b/crypto/fipsmodule/rand/getrandom_fillin.h index c0dea35be7..0f290e9637 100644 --- a/crypto/fipsmodule/rand/getrandom_fillin.h +++ b/crypto/fipsmodule/rand/getrandom_fillin.h @@ -30,8 +30,6 @@ #define EXPECTED_NR_getrandom 278 #elif defined(OPENSSL_ARM) #define EXPECTED_NR_getrandom 384 -#elif defined(OPENSSL_PPC64LE) -#define EXPECTED_NR_getrandom 359 #elif defined(OPENSSL_RISCV64) #define EXPECTED_NR_getrandom 278 #endif diff --git a/include/openssl/base.h b/include/openssl/base.h index 690b801d4c..190e250ff0 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h @@ -96,9 +96,6 @@ extern "C" { #elif defined(__ARMEL__) || defined(_M_ARM) #define OPENSSL_32_BIT #define OPENSSL_ARM -#elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN) -#define OPENSSL_64_BIT -#define OPENSSL_PPC64LE #elif defined(__MIPSEL__) && !defined(__LP64__) #define OPENSSL_32_BIT #define OPENSSL_MIPS From 80a243e07ef77156af66efa7d22ac35aba44c1b3 Mon Sep 17 00:00:00 2001 From: Steven Valdez Date: Thu, 26 Jan 2023 13:26:33 -0500 Subject: [PATCH 010/177] Remove old Trust Token redeem API. This removes TRUST_TOKEN_ISSUER_redeem and renames TRUST_TOKEN_ISSUER_redeem_raw to TRUST_TOKEN_ISSUER_redeem. Change-Id: Ifc07c73a6827ea21b5f2b0469d4bed4d9bf8fa84 Update-Note: Callers of TRUST_TOKEN_ISSUER_redeem_raw should remove the _raw. Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56365 Reviewed-by: David Benjamin Commit-Queue: Steven Valdez Auto-Submit: Steven Valdez --- crypto/trust_token/trust_token.c | 261 +------------------------ crypto/trust_token/trust_token_test.cc | 230 +--------------------- include/openssl/trust_token.h | 28 +-- tool/speed.cc | 41 +--- 4 files changed, 30 insertions(+), 530 deletions(-) diff --git a/crypto/trust_token/trust_token.c b/crypto/trust_token/trust_token.c index 2a0bacb2d5..51b40ad1ca 100644 --- a/crypto/trust_token/trust_token.c +++ b/crypto/trust_token/trust_token.c @@ -624,12 +624,12 @@ static int trust_token_issuer_redeem_impl( } -int TRUST_TOKEN_ISSUER_redeem_raw(const TRUST_TOKEN_ISSUER *ctx, - uint32_t *out_public, uint8_t *out_private, - TRUST_TOKEN **out_token, - uint8_t **out_client_data, - size_t *out_client_data_len, - const uint8_t *request, size_t request_len) { +int TRUST_TOKEN_ISSUER_redeem(const TRUST_TOKEN_ISSUER *ctx, + uint32_t *out_public, uint8_t *out_private, + TRUST_TOKEN **out_token, + uint8_t **out_client_data, + size_t *out_client_data_len, + const uint8_t *request, size_t request_len) { return trust_token_issuer_redeem_impl(ctx, out_public, out_private, out_token, out_client_data, out_client_data_len, request, request_len, 0, NULL, 0); @@ -645,49 +645,6 @@ int TRUST_TOKEN_ISSUER_redeem_over_message( request, request_len, 1, msg, msg_len); } -// https://tools.ietf.org/html/rfc7049#section-2.1 -static int add_cbor_int_with_type(CBB *cbb, uint8_t major_type, - uint64_t value) { - if (value <= 23) { - return CBB_add_u8(cbb, (uint8_t)value | major_type); - } - if (value <= 0xff) { - return CBB_add_u8(cbb, 0x18 | major_type) && - CBB_add_u8(cbb, (uint8_t)value); - } - if (value <= 0xffff) { - return CBB_add_u8(cbb, 0x19 | major_type) && - CBB_add_u16(cbb, (uint16_t)value); - } - if (value <= 0xffffffff) { - return CBB_add_u8(cbb, 0x1a | major_type) && - CBB_add_u32(cbb, (uint32_t)value); - } - return CBB_add_u8(cbb, 0x1b | major_type) && CBB_add_u64(cbb, value); -} - -// https://tools.ietf.org/html/rfc7049#section-2.1 -static int add_cbor_int(CBB *cbb, uint64_t value) { - return add_cbor_int_with_type(cbb, 0, value); -} - -// https://tools.ietf.org/html/rfc7049#section-2.1 -static int add_cbor_bytes(CBB *cbb, const uint8_t *data, size_t len) { - return add_cbor_int_with_type(cbb, 0x40, len) && - CBB_add_bytes(cbb, data, len); -} - -// https://tools.ietf.org/html/rfc7049#section-2.1 -static int add_cbor_text(CBB *cbb, const char *data, size_t len) { - return add_cbor_int_with_type(cbb, 0x60, len) && - CBB_add_bytes(cbb, (const uint8_t *)data, len); -} - -// https://tools.ietf.org/html/rfc7049#section-2.1 -static int add_cbor_map(CBB *cbb, uint8_t size) { - return add_cbor_int_with_type(cbb, 0xa0, size); -} - static uint8_t get_metadata_obfuscator(const uint8_t *key, size_t key_len, const uint8_t *client_data, size_t client_data_len) { @@ -700,212 +657,6 @@ static uint8_t get_metadata_obfuscator(const uint8_t *key, size_t key_len, return metadata_obfuscator[0] >> 7; } -int TRUST_TOKEN_ISSUER_redeem(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, - size_t *out_len, TRUST_TOKEN **out_token, - uint8_t **out_client_data, - size_t *out_client_data_len, - uint64_t *out_redemption_time, - const uint8_t *request, size_t request_len, - uint64_t lifetime) { - CBS request_cbs, token_cbs; - CBS_init(&request_cbs, request, request_len); - if (!CBS_get_u16_length_prefixed(&request_cbs, &token_cbs)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_ERROR); - return 0; - } - - uint32_t public_metadata = 0; - uint8_t private_metadata = 0; - - CBS token_copy = token_cbs; - - // Parse the token. If there is an error, treat it as an invalid token. - if (!CBS_get_u32(&token_cbs, &public_metadata)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_TOKEN); - return 0; - } - - const struct trust_token_issuer_key_st *key = - trust_token_issuer_get_key(ctx, public_metadata); - uint8_t nonce[TRUST_TOKEN_NONCE_SIZE]; - if (key == NULL || !ctx->method->read(&key->key, nonce, &private_metadata, - CBS_data(&token_cbs), - CBS_len(&token_cbs), 0, NULL, 0)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_TOKEN); - return 0; - } - - int ok = 0; - CBB response, srr; - uint8_t *srr_buf = NULL, *sig_buf = NULL, *client_data_buf = NULL; - size_t srr_len = 0, sig_len = 0, client_data_len = 0; - EVP_MD_CTX md_ctx; - EVP_MD_CTX_init(&md_ctx); - CBB_zero(&srr); - if (!CBB_init(&response, 0)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - goto err; - } - - CBS client_data; - uint64_t redemption_time = 0; - if (!CBS_get_u16_length_prefixed(&request_cbs, &client_data) || - (ctx->method->has_srr && !CBS_get_u64(&request_cbs, &redemption_time))) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_ERROR); - goto err; - } - - const uint8_t kTokenHashDSTLabel[] = "TrustTokenV0 TokenHash"; - uint8_t token_hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha_ctx; - SHA256_Init(&sha_ctx); - SHA256_Update(&sha_ctx, kTokenHashDSTLabel, sizeof(kTokenHashDSTLabel)); - SHA256_Update(&sha_ctx, CBS_data(&token_copy), CBS_len(&token_copy)); - SHA256_Final(token_hash, &sha_ctx); - - uint8_t metadata_obfuscator = get_metadata_obfuscator( - ctx->metadata_key, ctx->metadata_key_len, token_hash, sizeof(token_hash)); - - // The SRR is constructed as per the format described in - // https://docs.google.com/document/d/1TNnya6B8pyomDK2F1R9CL3dY10OAmqWlnCxsWyOBDVQ/edit#heading=h.7mkzvhpqb8l5 - - // The V2 protocol is intended to be used with - // |TRUST_TOKEN_ISSUER_redeem_raw|. However, we temporarily support it with - // |TRUST_TOKEN_ISSUER_redeem| to ease the transition for existing issuer - // callers. Those callers' consumers currently expect an expiry-timestamp - // field, so we fill in a placeholder value. - // - // TODO(svaldez): After the existing issues have migrated to - // |TRUST_TOKEN_ISSUER_redeem_raw| remove this logic. - uint64_t expiry_time = 0; - if (ctx->method->has_srr) { - expiry_time = redemption_time + lifetime; - } - - static const char kClientDataLabel[] = "client-data"; - static const char kExpiryTimestampLabel[] = "expiry-timestamp"; - static const char kMetadataLabel[] = "metadata"; - static const char kPrivateLabel[] = "private"; - static const char kPublicLabel[] = "public"; - static const char kTokenHashLabel[] = "token-hash"; - - // CBOR requires map keys to be sorted by length then sorted lexically. - // https://tools.ietf.org/html/rfc7049#section-3.9 - assert(strlen(kMetadataLabel) < strlen(kTokenHashLabel)); - assert(strlen(kTokenHashLabel) < strlen(kClientDataLabel)); - assert(strlen(kClientDataLabel) < strlen(kExpiryTimestampLabel)); - assert(strlen(kPublicLabel) < strlen(kPrivateLabel)); - - size_t map_entries = 4; - - if (!CBB_init(&srr, 0) || - !add_cbor_map(&srr, map_entries) || // SRR map - !add_cbor_text(&srr, kMetadataLabel, strlen(kMetadataLabel)) || - !add_cbor_map(&srr, 2) || // Metadata map - !add_cbor_text(&srr, kPublicLabel, strlen(kPublicLabel)) || - !add_cbor_int(&srr, public_metadata) || - !add_cbor_text(&srr, kPrivateLabel, strlen(kPrivateLabel)) || - !add_cbor_int(&srr, private_metadata ^ metadata_obfuscator) || - !add_cbor_text(&srr, kTokenHashLabel, strlen(kTokenHashLabel)) || - !add_cbor_bytes(&srr, token_hash, sizeof(token_hash)) || - !add_cbor_text(&srr, kClientDataLabel, strlen(kClientDataLabel)) || - !CBB_add_bytes(&srr, CBS_data(&client_data), CBS_len(&client_data)) || - !add_cbor_text(&srr, kExpiryTimestampLabel, - strlen(kExpiryTimestampLabel)) || - !add_cbor_int(&srr, expiry_time) || - !CBB_finish(&srr, &srr_buf, &srr_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - goto err; - } - - if (!EVP_DigestSignInit(&md_ctx, NULL, NULL, NULL, ctx->srr_key) || - !EVP_DigestSign(&md_ctx, NULL, &sig_len, srr_buf, srr_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_SRR_SIGNATURE_ERROR); - goto err; - } - - // Merge SRR and Signature into single string. - // TODO(svaldez): Expose API to construct this from the caller. - if (!ctx->method->has_srr) { - static const char kSRRHeader[] = "body=:"; - static const char kSRRSplit[] = ":, signature=:"; - static const char kSRREnd[] = ":"; - - size_t srr_b64_len, sig_b64_len; - if (!EVP_EncodedLength(&srr_b64_len, srr_len) || - !EVP_EncodedLength(&sig_b64_len, sig_len)) { - goto err; - } - - sig_buf = OPENSSL_malloc(sig_len); - uint8_t *srr_b64_buf = OPENSSL_malloc(srr_b64_len); - uint8_t *sig_b64_buf = OPENSSL_malloc(sig_b64_len); - if (!sig_buf || - !srr_b64_buf || - !sig_b64_buf || - !EVP_DigestSign(&md_ctx, sig_buf, &sig_len, srr_buf, srr_len) || - !CBB_add_bytes(&response, (const uint8_t *)kSRRHeader, - strlen(kSRRHeader)) || - !CBB_add_bytes(&response, srr_b64_buf, - EVP_EncodeBlock(srr_b64_buf, srr_buf, srr_len)) || - !CBB_add_bytes(&response, (const uint8_t *)kSRRSplit, - strlen(kSRRSplit)) || - !CBB_add_bytes(&response, sig_b64_buf, - EVP_EncodeBlock(sig_b64_buf, sig_buf, sig_len)) || - !CBB_add_bytes(&response, (const uint8_t *)kSRREnd, strlen(kSRREnd))) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - OPENSSL_free(srr_b64_buf); - OPENSSL_free(sig_b64_buf); - goto err; - } - - OPENSSL_free(srr_b64_buf); - OPENSSL_free(sig_b64_buf); - } else { - CBB child; - uint8_t *ptr; - if (!CBB_add_u16_length_prefixed(&response, &child) || - !CBB_add_bytes(&child, srr_buf, srr_len) || - !CBB_add_u16_length_prefixed(&response, &child) || - !CBB_reserve(&child, &ptr, sig_len) || - !EVP_DigestSign(&md_ctx, ptr, &sig_len, srr_buf, srr_len) || - !CBB_did_write(&child, sig_len) || - !CBB_flush(&response)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - goto err; - } - } - - if (!CBS_stow(&client_data, &client_data_buf, &client_data_len) || - !CBB_finish(&response, out, out_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - goto err; - } - - TRUST_TOKEN *token = TRUST_TOKEN_new(nonce, TRUST_TOKEN_NONCE_SIZE); - if (token == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); - goto err; - } - *out_token = token; - *out_client_data = client_data_buf; - *out_client_data_len = client_data_len; - *out_redemption_time = redemption_time; - - ok = 1; - -err: - CBB_cleanup(&response); - CBB_cleanup(&srr); - OPENSSL_free(srr_buf); - OPENSSL_free(sig_buf); - EVP_MD_CTX_cleanup(&md_ctx); - if (!ok) { - OPENSSL_free(client_data_buf); - } - return ok; -} - int TRUST_TOKEN_decode_private_metadata(const TRUST_TOKEN_METHOD *method, uint8_t *out_value, const uint8_t *key, size_t key_len, const uint8_t *nonce, diff --git a/crypto/trust_token/trust_token_test.cc b/crypto/trust_token/trust_token_test.cc index 8c1e79018f..6f952fb302 100644 --- a/crypto/trust_token/trust_token_test.cc +++ b/crypto/trust_token/trust_token_test.cc @@ -421,9 +421,9 @@ TEST_P(TrustTokenProtocolTest, InvalidToken) { issuer.get(), &public_value, &private_value, &rtoken, &client_data, &client_data_len, redeem_msg, msg_len, kMessage, sizeof(kMessage))); } else { - ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem_raw( - issuer.get(), &public_value, &private_value, &rtoken, - &client_data, &client_data_len, redeem_msg, msg_len)); + ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem( + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, msg_len)); } bssl::UniquePtr free_redeem_resp(redeem_resp); } @@ -553,82 +553,13 @@ TEST_P(TrustTokenProtocolTest, TruncatedRedemptionRequest) { issuer.get(), &public_value, &private_value, &rtoken, &client_data, &client_data_len, redeem_msg, msg_len, kMessage, sizeof(kMessage))); } else { - ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem_raw( - issuer.get(), &public_value, &private_value, &rtoken, - &client_data, &client_data_len, redeem_msg, msg_len)); + ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem( + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, msg_len)); } } } -TEST_P(TrustTokenProtocolTest, TruncatedRedemptionResponse) { - ASSERT_NO_FATAL_FAILURE(SetupContexts()); - - // Token issuances derived from messages aren't supported by the old-style - // redemption record response. - if (use_message()) { - return; - } - - uint8_t *issue_msg = NULL, *issue_resp = NULL; - size_t msg_len, resp_len; - if (use_message()) { - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance_over_message( - client.get(), &issue_msg, &msg_len, 10, kMessage, sizeof(kMessage))); - } else { - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); - } - bssl::UniquePtr free_issue_msg(issue_msg); - size_t tokens_issued; - ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue( - issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len, - /*public_metadata=*/KeyID(0), /*private_metadata=*/0, - /*max_issuance=*/10)); - bssl::UniquePtr free_msg(issue_resp); - size_t key_index; - bssl::UniquePtr tokens( - TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp, - resp_len)); - ASSERT_TRUE(tokens); - - for (TRUST_TOKEN *token : tokens.get()) { - const uint8_t kClientData[] = "\x70TEST CLIENT DATA"; - uint64_t kRedemptionTime = 0; - - uint8_t *redeem_msg = NULL, *redeem_resp = NULL; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption( - client.get(), &redeem_msg, &msg_len, token, kClientData, - sizeof(kClientData) - 1, kRedemptionTime)); - bssl::UniquePtr free_redeem_msg(redeem_msg); - TRUST_TOKEN *rtoken; - uint8_t *client_data; - size_t client_data_len; - uint64_t redemption_time; - ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem( - issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data, - &client_data_len, &redemption_time, redeem_msg, msg_len, 600)); - bssl::UniquePtr free_redeem_resp(redeem_resp); - bssl::UniquePtr free_client_data(client_data); - bssl::UniquePtr free_rtoken(rtoken); - - ASSERT_EQ(redemption_time, kRedemptionTime); - ASSERT_EQ(Bytes(kClientData, sizeof(kClientData) - 1), - Bytes(client_data, client_data_len)); - resp_len = 10; - - // If the protocol doesn't use SRRs, TRUST_TOKEN_CLIENT_finish_redemtpion - // leaves all SRR validation to the caller. - uint8_t *srr = NULL, *sig = NULL; - size_t srr_len, sig_len; - bool expect_failure = !method()->has_srr; - ASSERT_EQ(expect_failure, TRUST_TOKEN_CLIENT_finish_redemption( - client.get(), &srr, &srr_len, &sig, &sig_len, - redeem_resp, resp_len)); - bssl::UniquePtr free_srr(srr); - bssl::UniquePtr free_sig(sig); - } -} - TEST_P(TrustTokenProtocolTest, IssuedWithBadKeyID) { client.reset(TRUST_TOKEN_CLIENT_new(method(), client_max_batchsize)); ASSERT_TRUE(client); @@ -709,149 +640,6 @@ class TrustTokenMetadataTest TEST_P(TrustTokenMetadataTest, SetAndGetMetadata) { ASSERT_NO_FATAL_FAILURE(SetupContexts()); - // Token issuances derived from messages aren't supported by the old-style - // redemption record response. - if (use_message()) { - return; - } - - uint8_t *issue_msg = NULL, *issue_resp = NULL; - size_t msg_len, resp_len; - if (use_message()) { - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance_over_message( - client.get(), &issue_msg, &msg_len, 10, kMessage, sizeof(kMessage))); - } else { - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); - } - bssl::UniquePtr free_issue_msg(issue_msg); - size_t tokens_issued; - bool result = TRUST_TOKEN_ISSUER_issue( - issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len, - public_metadata(), private_metadata(), /*max_issuance=*/1); - if (!method()->has_private_metadata && private_metadata()) { - ASSERT_FALSE(result); - return; - } - ASSERT_TRUE(result); - bssl::UniquePtr free_msg(issue_resp); - size_t key_index; - bssl::UniquePtr tokens( - TRUST_TOKEN_CLIENT_finish_issuance(client.get(), &key_index, issue_resp, - resp_len)); - ASSERT_TRUE(tokens); - - for (TRUST_TOKEN *token : tokens.get()) { - const uint8_t kClientData[] = "\x70TEST CLIENT DATA"; - uint64_t kRedemptionTime = (method()->has_srr ? 13374242 : 0); - - const uint8_t kExpectedSRRV1[] = - "\xa4\x68\x6d\x65\x74\x61\x64\x61\x74\x61\xa2\x66\x70\x75\x62\x6c\x69" - "\x63\x00\x67\x70\x72\x69\x76\x61\x74\x65\x00\x6a\x74\x6f\x6b\x65\x6e" - "\x2d\x68\x61\x73\x68\x58\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6b\x63\x6c\x69\x65\x6e\x74\x2d\x64\x61\x74\x61" - "\x70\x54\x45\x53\x54\x20\x43\x4c\x49\x45\x4e\x54\x20\x44\x41\x54\x41" - "\x70\x65\x78\x70\x69\x72\x79\x2d\x74\x69\x6d\x65\x73\x74\x61\x6d\x70" - "\x1a\x00\xcc\x15\x7a"; - - const uint8_t kExpectedSRRV2[] = - "\xa4\x68\x6d\x65\x74\x61\x64\x61\x74\x61\xa2\x66\x70\x75\x62\x6c\x69" - "\x63\x00\x67\x70\x72\x69\x76\x61\x74\x65\x00\x6a\x74\x6f\x6b\x65\x6e" - "\x2d\x68\x61\x73\x68\x58\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x6b\x63\x6c\x69\x65\x6e\x74\x2d\x64\x61\x74\x61" - "\x70\x54\x45\x53\x54\x20\x43\x4c\x49\x45\x4e\x54\x20\x44\x41\x54\x41" - "\x70\x65\x78\x70\x69\x72\x79\x2d\x74\x69\x6d\x65\x73\x74\x61\x6d\x70" - "\x00"; - - const uint8_t *expected_srr = kExpectedSRRV1; - size_t expected_srr_len = sizeof(kExpectedSRRV1) - 1; - if (!method()->has_srr) { - expected_srr = kExpectedSRRV2; - expected_srr_len = sizeof(kExpectedSRRV2) - 1; - } - - uint8_t *redeem_msg = NULL, *redeem_resp = NULL; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption( - client.get(), &redeem_msg, &msg_len, token, kClientData, - sizeof(kClientData) - 1, kRedemptionTime)); - bssl::UniquePtr free_redeem_msg(redeem_msg); - TRUST_TOKEN *rtoken; - uint8_t *client_data; - size_t client_data_len; - uint64_t redemption_time; - ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem( - issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data, - &client_data_len, &redemption_time, redeem_msg, msg_len, 600)); - bssl::UniquePtr free_redeem_resp(redeem_resp); - bssl::UniquePtr free_client_data(client_data); - bssl::UniquePtr free_rtoken(rtoken); - - ASSERT_EQ(redemption_time, kRedemptionTime); - ASSERT_EQ(Bytes(kClientData, sizeof(kClientData) - 1), - Bytes(client_data, client_data_len)); - - uint8_t *srr = NULL, *sig = NULL; - size_t srr_len, sig_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_finish_redemption( - client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp, resp_len)); - bssl::UniquePtr free_srr(srr); - bssl::UniquePtr free_sig(sig); - - if (!method()->has_srr) { - size_t b64_len; - ASSERT_TRUE(EVP_EncodedLength(&b64_len, expected_srr_len)); - b64_len -= 1; - const char kSRRHeader[] = "body=:"; - ASSERT_LT(sizeof(kSRRHeader) - 1 + b64_len, srr_len); - - ASSERT_EQ(Bytes(kSRRHeader, sizeof(kSRRHeader) - 1), - Bytes(srr, sizeof(kSRRHeader) - 1)); - uint8_t *decoded_srr = - (uint8_t *)OPENSSL_malloc(expected_srr_len + 2); - ASSERT_TRUE(decoded_srr); - ASSERT_LE( - int(expected_srr_len), - EVP_DecodeBlock(decoded_srr, srr + sizeof(kSRRHeader) - 1, b64_len)); - srr = decoded_srr; - srr_len = expected_srr_len; - free_srr.reset(srr); - } - - const uint8_t kTokenHashDSTLabel[] = "TrustTokenV0 TokenHash"; - uint8_t token_hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha_ctx; - SHA256_Init(&sha_ctx); - SHA256_Update(&sha_ctx, kTokenHashDSTLabel, sizeof(kTokenHashDSTLabel)); - SHA256_Update(&sha_ctx, token->data, token->len); - SHA256_Final(token_hash, &sha_ctx); - - // Check the token hash is in the SRR. - ASSERT_EQ(Bytes(token_hash), Bytes(srr + 41, sizeof(token_hash))); - - uint8_t decode_private_metadata; - ASSERT_TRUE(TRUST_TOKEN_decode_private_metadata( - method(), &decode_private_metadata, metadata_key, - sizeof(metadata_key), token_hash, sizeof(token_hash), srr[27])); - ASSERT_EQ(srr[18], public_metadata()); - ASSERT_EQ(decode_private_metadata, private_metadata()); - - // Clear out the metadata bits. - srr[18] = 0; - srr[27] = 0; - - // Clear out the token hash. - OPENSSL_memset(srr + 41, 0, sizeof(token_hash)); - - ASSERT_EQ(Bytes(expected_srr, expected_srr_len), - Bytes(srr, srr_len)); - } -} - -TEST_P(TrustTokenMetadataTest, RawSetAndGetMetadata) { - ASSERT_NO_FATAL_FAILURE(SetupContexts()); - uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; if (use_message()) { @@ -898,9 +686,9 @@ TEST_P(TrustTokenMetadataTest, RawSetAndGetMetadata) { issuer.get(), &public_value, &private_value, &rtoken, &client_data, &client_data_len, redeem_msg, msg_len, kMessage, sizeof(kMessage))); } else { - ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem_raw( - issuer.get(), &public_value, &private_value, &rtoken, - &client_data, &client_data_len, redeem_msg, msg_len)); + ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem( + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, msg_len)); } bssl::UniquePtr free_client_data(client_data); bssl::UniquePtr free_rtoken(rtoken); diff --git a/include/openssl/trust_token.h b/include/openssl/trust_token.h index aef4e500b6..03ce4b820c 100644 --- a/include/openssl/trust_token.h +++ b/include/openssl/trust_token.h @@ -248,28 +248,6 @@ OPENSSL_EXPORT int TRUST_TOKEN_ISSUER_issue( uint32_t public_metadata, uint8_t private_metadata, size_t max_issuance); // TRUST_TOKEN_ISSUER_redeem ingests a |request| for token redemption and -// verifies the token. If the token is valid, a RR is produced with a lifetime -// of |lifetime| (in seconds), signing over the requested data from the request -// and the value of the token, storing the result into a newly-allocated buffer -// and setting |*out| to that buffer and |*out_len| to its length. The extracted -// |TRUST_TOKEN| is stored into a newly-allocated buffer and stored in -// |*out_token|. The extracted client data is stored into a newly-allocated -// buffer and stored in |*out_client_data|. In TrustTokenV1, the extracted -// redemption time is stored in |*out_redemption_time|. The caller takes -// ownership of each output buffer and must call |OPENSSL_free| when done. It -// returns one on success or zero on error. -// -// The caller must keep track of all values of |*out_token| seen globally before -// returning the SRR to the client. If the value has been reused, the caller -// must discard the SRR and report an error to the caller. Returning an SRR with -// replayed values allows an attacker to double-spend tokens. -OPENSSL_EXPORT int TRUST_TOKEN_ISSUER_redeem( - const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, size_t *out_len, - TRUST_TOKEN **out_token, uint8_t **out_client_data, - size_t *out_client_data_len, uint64_t *out_redemption_time, - const uint8_t *request, size_t request_len, uint64_t lifetime); - -// TRUST_TOKEN_ISSUER_redeem_raw ingests a |request| for token redemption and // verifies the token. The public metadata is stored in |*out_public|. The // private metadata (if any) is stored in |*out_private|. The extracted // |TRUST_TOKEN| is stored into a newly-allocated buffer and stored in @@ -282,11 +260,15 @@ OPENSSL_EXPORT int TRUST_TOKEN_ISSUER_redeem( // returning a response to the client. If the value has been reused, the caller // must report an error to the client. Returning a response with replayed values // allows an attacker to double-spend tokens. -OPENSSL_EXPORT int TRUST_TOKEN_ISSUER_redeem_raw( +OPENSSL_EXPORT int TRUST_TOKEN_ISSUER_redeem( const TRUST_TOKEN_ISSUER *ctx, uint32_t *out_public, uint8_t *out_private, TRUST_TOKEN **out_token, uint8_t **out_client_data, size_t *out_client_data_len, const uint8_t *request, size_t request_len); +// TRUST_TOKEN_ISSUER_redeem_raw is a legacy alias for +// |TRUST_TOKEN_ISSUER_redeem|. +#define TRUST_TOKEN_ISSUER_redeem_raw TRUST_TOKEN_ISSUER_redeem + // TRUST_TOKEN_ISSUER_redeem_over_message ingests a |request| for token // redemption and a message and verifies the token and that it is derived from // the provided |msg|. The public metadata is stored in diff --git a/tool/speed.cc b/tool/speed.cc index d600c287df..767e03877b 100644 --- a/tool/speed.cc +++ b/tool/speed.cc @@ -1239,17 +1239,14 @@ static bool SpeedTrustToken(std::string name, const TRUST_TOKEN_METHOD *method, bssl::UniquePtr free_redeem_msg(redeem_msg); if (!TimeFunction(&results, [&]() -> bool { - uint8_t *redeem_resp = NULL; - size_t redeem_resp_len; - TRUST_TOKEN *rtoken = NULL; + uint32_t public_value; + uint8_t private_value; + TRUST_TOKEN *rtoken; uint8_t *client_data = NULL; size_t client_data_len; - uint64_t redemption_time; int ok = TRUST_TOKEN_ISSUER_redeem( - issuer.get(), &redeem_resp, &redeem_resp_len, &rtoken, &client_data, - &client_data_len, &redemption_time, redeem_msg, redeem_msg_len, - /*lifetime=*/600); - OPENSSL_free(redeem_resp); + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, redeem_msg_len); OPENSSL_free(client_data); TRUST_TOKEN_free(rtoken); return ok; @@ -1259,38 +1256,20 @@ static bool SpeedTrustToken(std::string name, const TRUST_TOKEN_METHOD *method, } results.Print(name + " redeem"); - uint8_t *redeem_resp = NULL; - size_t redeem_resp_len; - TRUST_TOKEN *rtoken = NULL; + uint32_t public_value; + uint8_t private_value; + TRUST_TOKEN *rtoken; uint8_t *client_data = NULL; size_t client_data_len; - uint64_t redemption_time; - if (!TRUST_TOKEN_ISSUER_redeem(issuer.get(), &redeem_resp, &redeem_resp_len, + if (!TRUST_TOKEN_ISSUER_redeem(issuer.get(), &public_value, &private_value, &rtoken, &client_data, &client_data_len, - &redemption_time, redeem_msg, redeem_msg_len, - /*lifetime=*/600)) { + redeem_msg, redeem_msg_len)) { fprintf(stderr, "TRUST_TOKEN_ISSUER_redeem failed.\n"); return false; } - bssl::UniquePtr free_redeem_resp(redeem_resp); bssl::UniquePtr free_client_data(client_data); bssl::UniquePtr free_rtoken(rtoken); - if (!TimeFunction(&results, [&]() -> bool { - uint8_t *srr = NULL, *sig = NULL; - size_t srr_len, sig_len; - int ok = TRUST_TOKEN_CLIENT_finish_redemption( - client.get(), &srr, &srr_len, &sig, &sig_len, redeem_resp, - redeem_resp_len); - OPENSSL_free(srr); - OPENSSL_free(sig); - return ok; - })) { - fprintf(stderr, "TRUST_TOKEN_CLIENT_finish_redemption failed.\n"); - return false; - } - results.Print(name + " finish_redemption"); - return true; } From 3a5c4ff4d555e1b8b8c9efc85cb2e694e4d499bd Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 4 Jan 2023 18:19:51 -0800 Subject: [PATCH 011/177] Add tests for X509_NAME_hash and X509_NAME_hash_old. These values figure into X509_LOOKUP_hash_dir's on-disk format, so they must remain stable. Record a couple of values to ensure this remains the case. Change-Id: I63afa970f8564e0836d78d00375eb5cd6d383bea Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56485 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- crypto/x509/x509_test.cc | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 93dccdab80..ebd8262d95 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -2547,6 +2547,67 @@ TEST(X509Test, X509NameSet) { EXPECT_EQ(X509_NAME_ENTRY_set(X509_NAME_get_entry(name.get(), 2)), 2); } +// Tests that |X509_NAME_hash| and |X509_NAME_hash_old|'s values never change. +// These functions figure into |X509_LOOKUP_hash_dir|'s on-disk format, so they +// must remain stable. In particular, if we ever remove name canonicalization, +// we'll need to preserve it for |X509_NAME_hash|. +TEST(X509Test, NameHash) { + struct { + std::vector name_der; + unsigned long hash; + unsigned long hash_old; + } kTests[] = { + // SEQUENCE { + // SET { + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "Test Name" } + // } + // } + // } + {{0x30, 0x14, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x09, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x65}, + 0xc90fba01, + 0x8c0d4fea}, + + // This name canonicalizes to the same value, with OpenSSL's algorithm, as + // the above input, so |hash| matches. |hash_old| doesn't use + // canonicalization and does not match. + // + // SEQUENCE { + // SET { + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // BMPString { + // u"\x09\n\x0b\x0c\x0d tEST\x09\n\x0b\x0c\x0d " + // u"\x09\n\x0b\x0c\x0d nAME\x09\n\x0b\x0c\x0d " + // } + // } + // } + // } + {{0x30, 0x4b, 0x31, 0x49, 0x30, 0x47, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x1e, 0x40, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, + 0x0d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x45, 0x00, 0x53, 0x00, 0x54, + 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, + 0x20, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, + 0x00, 0x20, 0x00, 0x6e, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x45, 0x00, + 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x20}, + 0xc90fba01, + 0xbe2dd8c8}, + }; + for (const auto &t : kTests) { + SCOPED_TRACE(Bytes(t.name_der)); + const uint8_t *der = t.name_der.data(); + bssl::UniquePtr name( + d2i_X509_NAME(nullptr, &der, t.name_der.size())); + ASSERT_TRUE(name); + EXPECT_EQ(t.hash, X509_NAME_hash(name.get())); + EXPECT_EQ(t.hash_old, X509_NAME_hash_old(name.get())); + } +} + TEST(X509Test, NoBasicConstraintsCertSign) { bssl::UniquePtr root(CertFromPEM(kSANTypesRoot)); bssl::UniquePtr intermediate( From 42b7b35f761383d6232ea5c055170488975a02fb Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 27 Jan 2023 21:02:34 -0500 Subject: [PATCH 012/177] Introduce a locale-independent version of isspace The real isspace may give locale-dependent results, so use our own. This also lets us simplify some of the silliness asn1_string_canon needs to go through to never pass high bytes into isspace and islower. (I'm otherwise leaving that function alone because I plan to, later, convert the whole thing to CBS/CBB.) Change-Id: Idd349095f3e98bf908bb628ea1089ba05c2c6797 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56486 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/conf/conf.c | 4 ++-- crypto/mem.c | 5 +++++ crypto/test/file_test.cc | 5 +++-- crypto/x509/x_name.c | 17 +++++------------ crypto/x509v3/v3_conf.c | 4 ++-- crypto/x509v3/v3_utl.c | 4 ++-- include/openssl/mem.h | 7 ++++++- 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/crypto/conf/conf.c b/crypto/conf/conf.c index f03649884d..8874896112 100644 --- a/crypto/conf/conf.c +++ b/crypto/conf/conf.c @@ -780,7 +780,7 @@ int CONF_parse_list(const char *list, char sep, int remove_whitespace, lstart = list; for (;;) { if (remove_whitespace) { - while (*lstart && isspace((unsigned char)*lstart)) { + while (*lstart && OPENSSL_isspace((unsigned char)*lstart)) { lstart++; } } @@ -794,7 +794,7 @@ int CONF_parse_list(const char *list, char sep, int remove_whitespace, tmpend = lstart + strlen(lstart) - 1; } if (remove_whitespace) { - while (isspace((unsigned char)*tmpend)) { + while (OPENSSL_isspace((unsigned char)*tmpend)) { tmpend--; } } diff --git a/crypto/mem.c b/crypto/mem.c index af2031846f..e9d3d728f1 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -315,6 +315,11 @@ int OPENSSL_tolower(int c) { return c; } +int OPENSSL_isspace(int c) { + return c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r' || + c == ' '; +} + int OPENSSL_strcasecmp(const char *a, const char *b) { for (size_t i = 0;; i++) { const int aa = OPENSSL_tolower(a[i]); diff --git a/crypto/test/file_test.cc b/crypto/test/file_test.cc index e1ab2aa7c8..d7ef95115e 100644 --- a/crypto/test/file_test.cc +++ b/crypto/test/file_test.cc @@ -27,6 +27,7 @@ #include #include +#include #include "../internal.h" #include "./test_util.h" @@ -57,11 +58,11 @@ static const char *FindDelimiter(const char *str) { // leading and trailing whitespace removed. static std::string StripSpace(const char *str, size_t len) { // Remove leading space. - while (len > 0 && isspace(*str)) { + while (len > 0 && OPENSSL_isspace(*str)) { str++; len--; } - while (len > 0 && isspace(str[len - 1])) { + while (len > 0 && OPENSSL_isspace(str[len - 1])) { len--; } return std::string(str, len); diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c index a17d9d73f6..3e7cb94dae 100644 --- a/crypto/x509/x_name.c +++ b/crypto/x509/x_name.c @@ -443,12 +443,10 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) { len = out->length; - // Convert string in place to canonical form. Ultimately we may need to - // handle a wider range of characters but for now ignore anything with - // MSB set and rely on the isspace() and tolower() functions. + // Convert string in place to canonical form. // Ignore leading spaces - while ((len > 0) && !(*from & 0x80) && isspace(*from)) { + while ((len > 0) && OPENSSL_isspace(*from)) { from++; len--; } @@ -456,7 +454,7 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) { to = from + len; // Ignore trailing spaces - while ((len > 0) && !(to[-1] & 0x80) && isspace(to[-1])) { + while ((len > 0) && OPENSSL_isspace(to[-1])) { to--; len--; } @@ -465,13 +463,8 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) { i = 0; while (i < len) { - // If MSB set just copy across - if (*from & 0x80) { - *to++ = *from++; - i++; - } // Collapse multiple spaces - else if (isspace(*from)) { + if (OPENSSL_isspace(*from)) { // Copy one space across *to++ = ' '; // Ignore subsequent spaces. Note: don't need to check len here @@ -480,7 +473,7 @@ static int asn1_string_canon(ASN1_STRING *out, ASN1_STRING *in) { do { from++; i++; - } while (!(*from & 0x80) && isspace(*from)); + } while (OPENSSL_isspace(*from)); } else { *to++ = OPENSSL_tolower(*from); from++; diff --git a/crypto/x509v3/v3_conf.c b/crypto/x509v3/v3_conf.c index 3261302cfa..480bb3b799 100644 --- a/crypto/x509v3/v3_conf.c +++ b/crypto/x509v3/v3_conf.c @@ -258,7 +258,7 @@ static int v3_check_critical(const char **value) { return 0; } p += 9; - while (isspace((unsigned char)*p)) { + while (OPENSSL_isspace((unsigned char)*p)) { p++; } *value = p; @@ -279,7 +279,7 @@ static int v3_check_generic(const char **value) { return 0; } - while (isspace((unsigned char)*p)) { + while (OPENSSL_isspace((unsigned char)*p)) { p++; } *value = p; diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index f6fdc4bc17..bb5db40064 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -432,14 +432,14 @@ static char *strip_spaces(char *name) { char *p, *q; // Skip over leading spaces p = name; - while (*p && isspace((unsigned char)*p)) { + while (*p && OPENSSL_isspace((unsigned char)*p)) { p++; } if (!*p) { return NULL; } q = p + strlen(p) - 1; - while ((q != p) && isspace((unsigned char)*q)) { + while ((q != p) && OPENSSL_isspace((unsigned char)*q)) { q--; } if (p != q) { diff --git a/include/openssl/mem.h b/include/openssl/mem.h index f07698db29..6216040636 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -110,9 +110,14 @@ OPENSSL_EXPORT char *OPENSSL_strdup(const char *s); // OPENSSL_strnlen has the same behaviour as strnlen(3). OPENSSL_EXPORT size_t OPENSSL_strnlen(const char *s, size_t len); -// OPENSSL_tolower is a locale-independent version of tolower(3). +// OPENSSL_tolower is a locale-independent version of tolower(3). It only +// lowercases ASCII values. Other values are returned as-is. OPENSSL_EXPORT int OPENSSL_tolower(int c); +// OPENSSL_isspace is a locale-independent version of isspace(3). It only +// recognizes '\t', '\n', '\v', '\f', '\r', and ' '. +OPENSSL_EXPORT int OPENSSL_isspace(int c); + // OPENSSL_strcasecmp is a locale-independent version of strcasecmp(3). OPENSSL_EXPORT int OPENSSL_strcasecmp(const char *a, const char *b); From f81f16cddd6a09dade8a4b99e472ab9863deb986 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 28 Jan 2023 10:20:18 -0500 Subject: [PATCH 013/177] Introduce constants for ASN1_BOOLEAN Between the type being sometimes a tri-state and capturing the underlying DER/BER representation, this type is a bit confusing. Add constants for these. I've left a case in ASN1_TBOOLEAN unconverted because it's actually wrong. It will be fixed in a subsequent CL. Change-Id: I75d846af14f6b4cd5278c3833b979e89c92c4203 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56487 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/a_bool.c | 10 +++++----- crypto/asn1/tasn_enc.c | 2 +- crypto/asn1/tasn_typ.c | 5 +++-- crypto/x509/x509_v3.c | 4 +++- crypto/x509v3/internal.h | 2 +- crypto/x509v3/v3_utl.c | 6 +++--- include/openssl/asn1.h | 17 +++++++++++++++-- 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/crypto/asn1/a_bool.c b/crypto/asn1/a_bool.c index 2a4448cc4f..8dc84d4c46 100644 --- a/crypto/asn1/a_bool.c +++ b/crypto/asn1/a_bool.c @@ -78,7 +78,7 @@ int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp) { } ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL); - *p = a ? 0xff : 0x00; + *p = a ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; // If a new buffer was allocated, just return it back. // If not, return the incremented buffer pointer. @@ -94,22 +94,22 @@ ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *a, const unsigned char **pp, inf = ASN1_get_object(&p, &len, &tag, &xclass, length); if (inf & 0x80) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER); - return -1; + return ASN1_BOOLEAN_NONE; } if (inf & V_ASN1_CONSTRUCTED) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); - return -1; + return ASN1_BOOLEAN_NONE; } if (tag != V_ASN1_BOOLEAN || xclass != V_ASN1_UNIVERSAL) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_A_BOOLEAN); - return -1; + return ASN1_BOOLEAN_NONE; } if (len != 1) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH); - return -1; + return ASN1_BOOLEAN_NONE; } ASN1_BOOLEAN ret = (ASN1_BOOLEAN) * (p++); if (a != NULL) { diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index 5b9a8d40e5..afac17d678 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -631,7 +631,7 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, case V_ASN1_BOOLEAN: tbool = (ASN1_BOOLEAN *)pval; - if (*tbool == -1) { + if (*tbool == ASN1_BOOLEAN_NONE) { *out_omit = 1; return 0; } diff --git a/crypto/asn1/tasn_typ.c b/crypto/asn1/tasn_typ.c index abfac934d6..a9409e2f72 100644 --- a/crypto/asn1/tasn_typ.c +++ b/crypto/asn1/tasn_typ.c @@ -107,9 +107,10 @@ IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, DIRECTORYSTRING, DIRECTORYSTRING) // Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE -IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, -1) +// TODO(davidben): ASN1_TBOOLEAN should be ASN1_BOOLEAN_TRUE, or 0xff. +IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_NONE) IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, 1) -IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, 0) +IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_FALSE) ASN1_ITEM_TEMPLATE(ASN1_SEQUENCE_ANY) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, ASN1_SEQUENCE_ANY, ASN1_ANY) diff --git a/crypto/x509/x509_v3.c b/crypto/x509/x509_v3.c index 4b88ea7076..9153dce194 100644 --- a/crypto/x509/x509_v3.c +++ b/crypto/x509/x509_v3.c @@ -250,7 +250,9 @@ int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit) { if (ex == NULL) { return 0; } - ex->critical = (crit) ? 0xFF : -1; + // The critical field is DEFAULT FALSE, so non-critical extensions should omit + // the value. + ex->critical = crit ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_NONE; return 1; } diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h index 0632f2394d..51e15e41ba 100644 --- a/crypto/x509v3/internal.h +++ b/crypto/x509v3/internal.h @@ -134,7 +134,7 @@ int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value, int X509V3_NAME_from_section(X509_NAME *nm, const STACK_OF(CONF_VALUE) *dn_sk, int chtype); -int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *asn1_bool); int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); const STACK_OF(CONF_VALUE) *X509V3_get_section(const X509V3_CTX *ctx, const char *section); diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index bb5db40064..eec7d08184 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -300,19 +300,19 @@ int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, return ret; } -int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool) { +int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *asn1_bool) { char *btmp; if (!(btmp = value->value)) { goto err; } if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true") || !strcmp(btmp, "Y") || !strcmp(btmp, "y") || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) { - *asn1_bool = 0xff; + *asn1_bool = ASN1_BOOLEAN_TRUE; return 1; } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false") || !strcmp(btmp, "N") || !strcmp(btmp, "n") || !strcmp(btmp, "NO") || !strcmp(btmp, "no")) { - *asn1_bool = 0; + *asn1_bool = ASN1_BOOLEAN_FALSE; return 1; } err: diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index b402c1db2a..7866deb247 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -447,10 +447,22 @@ OPENSSL_EXPORT ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, // integer type. FALSE is zero, TRUE is 0xff, and an omitted OPTIONAL BOOLEAN is // -1. +// ASN1_BOOLEAN_FALSE is FALSE as an |ASN1_BOOLEAN|. +#define ASN1_BOOLEAN_FALSE 0 + +// ASN1_BOOLEAN_TRUE is TRUE as an |ASN1_BOOLEAN|. Some code incorrectly uses +// 1, so prefer |b != ASN1_BOOLEAN_FALSE| over |b == ASN1_BOOLEAN_TRUE|. +#define ASN1_BOOLEAN_TRUE 0xff + +// ASN1_BOOLEAN_NONE, in contexts where the |ASN1_BOOLEAN| represents an +// OPTIONAL BOOLEAN, is an omitted value. Using this value in other contexts is +// undefined and may be misinterpreted as TRUE. +#define ASN1_BOOLEAN_NONE (-1) + // d2i_ASN1_BOOLEAN parses a DER-encoded ASN.1 BOOLEAN from up to |len| bytes at // |*inp|. On success, it advances |*inp| by the number of bytes read and // returns the result. If |out| is non-NULL, it additionally writes the result -// to |*out|. On error, it returns -1. +// to |*out|. On error, it returns |ASN1_BOOLEAN_NONE|. // // This function does not reject trailing data in the input. This allows the // caller to parse a sequence of concatenated structures. Callers parsing only @@ -472,7 +484,8 @@ OPENSSL_EXPORT int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **outp); // The following |ASN1_ITEM|s have ASN.1 type BOOLEAN and C type |ASN1_BOOLEAN|. // |ASN1_TBOOLEAN| and |ASN1_FBOOLEAN| must be marked OPTIONAL. When omitted, -// they are parsed as TRUE and FALSE, respectively, rather than -1. +// they are parsed as TRUE and FALSE, respectively, rather than +// |ASN1_BOOLEAN_NONE|. DECLARE_ASN1_ITEM(ASN1_BOOLEAN) DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) From 915eb691d3a4c64025acc841d389848db80a5444 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 28 Jan 2023 10:32:23 -0500 Subject: [PATCH 014/177] Add some tests for optional and default ASN1_BOOLEAN. ASN1_BOOLEAN has these ASN1_FBOOLEAN and ASN1_TBOOLEAN variants that behave slightly strangely. Add some tests to ensure we don't break them in the rewrite. In doing so, fix a bug: ASN1_BOOLEAN canonically represents TRUE as 0xff, to match DER. But ASN1_TBOOLEAN is initialized with it->size, which is 1, not 0xff. Fix it to be 0xff. (This shouldn't actually matter because the encoder is lax and ASN1_TBOOLEAN doesn't encode TRUE anyway.) Bug: 548 Change-Id: I4e7fdc2a3bc87603eaf04a7668359006a1480c2e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56187 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/asn1_test.cc | 74 ++++++++++++++++++++++++++++++++++++++++ crypto/asn1/tasn_typ.c | 3 +- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 268280f2b7..99d7d3092c 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -2526,4 +2526,78 @@ TEST(ASN1Test, MissingRequiredField) { } } +struct BOOLEANS { + ASN1_BOOLEAN required; + ASN1_BOOLEAN optional; + ASN1_BOOLEAN default_true; + ASN1_BOOLEAN default_false; +}; + +DECLARE_ASN1_FUNCTIONS(BOOLEANS) +ASN1_SEQUENCE(BOOLEANS) = { + ASN1_SIMPLE(BOOLEANS, required, ASN1_BOOLEAN), + ASN1_IMP_OPT(BOOLEANS, optional, ASN1_BOOLEAN, 1), + // Although not actually optional, |ASN1_TBOOLEAN| and |ASN1_FBOOLEAN| need + // to be marked optional in the template. + ASN1_IMP_OPT(BOOLEANS, default_true, ASN1_TBOOLEAN, 2), + ASN1_IMP_OPT(BOOLEANS, default_false, ASN1_FBOOLEAN, 3), +} ASN1_SEQUENCE_END(BOOLEANS) +IMPLEMENT_ASN1_FUNCTIONS(BOOLEANS) + +TEST(ASN1Test, OptionalAndDefaultBooleans) { + std::unique_ptr obj(nullptr, + BOOLEANS_free); + + // A default-constructed object should use, respectively, omitted, omitted, + // TRUE, FALSE. + // + // TODO(davidben): Is the first one a bug? It seems more consistent for a + // required BOOLEAN default to FALSE. |FOO_new| typically default-initializes + // fields valid states. (Though there are exceptions. CHOICE, ANY, and OBJECT + // IDENTIFIER are default-initialized to something invalid.) + obj.reset(BOOLEANS_new()); + ASSERT_TRUE(obj); + EXPECT_EQ(obj->required, ASN1_BOOLEAN_NONE); + EXPECT_EQ(obj->optional, ASN1_BOOLEAN_NONE); + EXPECT_EQ(obj->default_true, ASN1_BOOLEAN_TRUE); + EXPECT_EQ(obj->default_false, ASN1_BOOLEAN_FALSE); + + // Trying to serialize this should fail, because |obj->required| is omitted. + EXPECT_EQ(-1, i2d_BOOLEANS(obj.get(), nullptr)); + + // Otherwise, this object is serializable. Most fields are omitted, due to + // them being optional or defaulted. + static const uint8_t kFieldsOmitted[] = {0x30, 0x03, 0x01, 0x01, 0x00}; + obj->required = 0; + TestSerialize(obj.get(), i2d_BOOLEANS, kFieldsOmitted); + + const uint8_t *der = kFieldsOmitted; + obj.reset(d2i_BOOLEANS(nullptr, &der, sizeof(kFieldsOmitted))); + ASSERT_TRUE(obj); + EXPECT_EQ(obj->required, ASN1_BOOLEAN_FALSE); + EXPECT_EQ(obj->optional, ASN1_BOOLEAN_NONE); + EXPECT_EQ(obj->default_true, ASN1_BOOLEAN_TRUE); + EXPECT_EQ(obj->default_false, ASN1_BOOLEAN_FALSE); + + // Include the optinonal fields instead. + static const uint8_t kFieldsIncluded[] = {0x30, 0x0c, 0x01, 0x01, 0xff, + 0x81, 0x01, 0x00, 0x82, 0x01, + 0x00, 0x83, 0x01, 0xff}; + obj->required = ASN1_BOOLEAN_TRUE; + obj->optional = ASN1_BOOLEAN_FALSE; + obj->default_true = ASN1_BOOLEAN_FALSE; + obj->default_false = ASN1_BOOLEAN_TRUE; + TestSerialize(obj.get(), i2d_BOOLEANS, kFieldsIncluded); + + der = kFieldsIncluded; + obj.reset(d2i_BOOLEANS(nullptr, &der, sizeof(kFieldsIncluded))); + ASSERT_TRUE(obj); + EXPECT_EQ(obj->required, ASN1_BOOLEAN_TRUE); + EXPECT_EQ(obj->optional, ASN1_BOOLEAN_FALSE); + EXPECT_EQ(obj->default_true, ASN1_BOOLEAN_FALSE); + EXPECT_EQ(obj->default_false, ASN1_BOOLEAN_TRUE); + + // TODO(https://crbug.com/boringssl/354): Reject explicit DEFAULTs. +} + #endif // !WINDOWS || !SHARED_LIBRARY diff --git a/crypto/asn1/tasn_typ.c b/crypto/asn1/tasn_typ.c index a9409e2f72..ebeda542e6 100644 --- a/crypto/asn1/tasn_typ.c +++ b/crypto/asn1/tasn_typ.c @@ -107,9 +107,8 @@ IMPLEMENT_ASN1_FUNCTIONS_const_fname(ASN1_STRING, DIRECTORYSTRING, DIRECTORYSTRING) // Three separate BOOLEAN type: normal, DEFAULT TRUE and DEFAULT FALSE -// TODO(davidben): ASN1_TBOOLEAN should be ASN1_BOOLEAN_TRUE, or 0xff. IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_NONE) -IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, 1) +IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_TRUE) IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_FALSE) ASN1_ITEM_TEMPLATE(ASN1_SEQUENCE_ANY) = From 112e1a71e16b17284ff318ac05e0120f01eb624e Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 30 Dec 2022 12:01:10 -0500 Subject: [PATCH 015/177] Rewrite ASN1_generate_v3. This improves the error-handling and uses CBB instead. It also resolves a pile of -Wshorten-64-to-32 warnings. It also removes some of the calls to ASN_put_object within the library. The parsing uses NUL-terminated strings a bit because several of the functions called at the end actually rely on the string being NUL-terminated. Rather than pipe through (ptr, len) versions through everything, I just used const char * or CBS based on whether the string could be assumed to have a trailing NUL. As part of this, I've made it reject [UNIVERSAL 0], matching all our parsers. Rejecting that value means, since we don't have a nice Option in C, we can use zero in all the recursive calls to mean "no implicit tag". This does tighten the forms allowed for UTCTime a bit. I've disabled allow_timezone_offset, while crypto/asn1 broadly still allows it. The reasoning is this is code for constructing new certificates, not consuming existing ones. If anything is calling this (hopefully not!) to accidentally generate an invalid UTCTime, it should be fixed. Update-Note: This code is reachable from the deprecated, string-based X.509 extensions API. I've added tests for this, so it should behave generally compatibly, but if anything changes for a caller using these APIs, this CL is the likely cause. (NB: No one should be using these APIs. They're fundamentally prone to string injection vulnerabilities.) Bug: 516 Change-Id: I87f95e01ffbd22c4487d82c89ac098d095126cc1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56166 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509/asn1_gen.c | 974 +++++++++++++++------------------------ crypto/x509/x509_test.cc | 14 +- crypto/x509v3/internal.h | 6 +- crypto/x509v3/v3_utl.c | 36 +- 4 files changed, 406 insertions(+), 624 deletions(-) diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c index 5550f6177c..6dcf1292ec 100644 --- a/crypto/x509/asn1_gen.c +++ b/crypto/x509/asn1_gen.c @@ -56,11 +56,14 @@ #include +#include +#include +#include #include #include +#include #include -#include #include #include @@ -69,725 +72,480 @@ #include "../x509v3/internal.h" #include "internal.h" + // Although this file is in crypto/x509 for layering purposes, it emits // errors from the ASN.1 module for OpenSSL compatibility. -#define ASN1_GEN_FLAG 0x10000 -#define ASN1_GEN_FLAG_IMP (ASN1_GEN_FLAG | 1) -#define ASN1_GEN_FLAG_EXP (ASN1_GEN_FLAG | 2) -#define ASN1_GEN_FLAG_TAG (ASN1_GEN_FLAG | 3) -#define ASN1_GEN_FLAG_BITWRAP (ASN1_GEN_FLAG | 4) -#define ASN1_GEN_FLAG_OCTWRAP (ASN1_GEN_FLAG | 5) -#define ASN1_GEN_FLAG_SEQWRAP (ASN1_GEN_FLAG | 6) -#define ASN1_GEN_FLAG_SETWRAP (ASN1_GEN_FLAG | 7) -#define ASN1_GEN_FLAG_FORMAT (ASN1_GEN_FLAG | 8) - -#define ASN1_GEN_STR(str, val) \ - { str, sizeof(str) - 1, val } - -#define ASN1_FLAG_EXP_MAX 20 -// Maximum number of nested sequences -#define ASN1_GEN_SEQ_MAX_DEPTH 50 - -// Input formats +// ASN1_GEN_MAX_DEPTH is the maximum number of nested TLVs allowed. +#define ASN1_GEN_MAX_DEPTH 50 -// ASCII: default +// ASN1_GEN_FORMAT_* are the values for the format modifiers. #define ASN1_GEN_FORMAT_ASCII 1 -// UTF8 #define ASN1_GEN_FORMAT_UTF8 2 -// Hex #define ASN1_GEN_FORMAT_HEX 3 -// List of bits #define ASN1_GEN_FORMAT_BITLIST 4 -struct tag_name_st { - const char *strnam; - size_t len; - int tag; -}; - -typedef struct { - int exp_tag; - int exp_class; - int exp_constructed; - int exp_pad; - long exp_len; -} tag_exp_type; - -typedef struct { - int imp_tag; - int imp_class; - int utype; - int format; - const char *str; - tag_exp_type exp_list[ASN1_FLAG_EXP_MAX]; - int exp_count; -} tag_exp_arg; - -static ASN1_TYPE *generate_v3(const char *str, const X509V3_CTX *cnf, - int depth); +// generate_v3 converts |str| into an ASN.1 structure and writes the result to +// |cbb|. It returns one on success and zero on error. |depth| bounds recursion, +// and |format| specifies the current format modifier. +// +// If |tag| is non-zero, the structure is implicitly tagged with |tag|. |tag| +// must not have the constructed bit set. +static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, + CBS_ASN1_TAG tag, int format, int depth); + static int bitstr_cb(const char *elem, size_t len, void *bitstr); -static int asn1_cb(const char *elem, size_t len, void *bitstr); -static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, - int exp_constructed, int exp_pad, int imp_ok); -static int parse_tagging(const char *vstart, size_t vlen, int *ptag, - int *pclass); -static ASN1_TYPE *asn1_multi(int utype, const char *section, - const X509V3_CTX *cnf, int depth); -static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype); -static int asn1_str2tag(const char *tagstr, size_t len); ASN1_TYPE *ASN1_generate_v3(const char *str, const X509V3_CTX *cnf) { - return generate_v3(str, cnf, 0); -} - -static ASN1_TYPE *generate_v3(const char *str, const X509V3_CTX *cnf, - int depth) { - ASN1_TYPE *ret; - tag_exp_arg asn1_tags; - tag_exp_type *etmp; - - int i, len; - - unsigned char *orig_der = NULL, *new_der = NULL; - const unsigned char *cpy_start; - unsigned char *p; - const unsigned char *cp; - int cpy_len; - long hdr_len = 0; - int hdr_constructed = 0, hdr_tag, hdr_class; - int r; - - asn1_tags.imp_tag = -1; - asn1_tags.imp_class = -1; - asn1_tags.format = ASN1_GEN_FORMAT_ASCII; - asn1_tags.exp_count = 0; - if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG); + CBB cbb; + if (!CBB_init(&cbb, 0) || // + !generate_v3(&cbb, str, cnf, /*tag=*/0, ASN1_GEN_FORMAT_ASCII, + /*depth=*/0)) { + CBB_cleanup(&cbb); return NULL; } - if ((asn1_tags.utype == V_ASN1_SEQUENCE) || (asn1_tags.utype == V_ASN1_SET)) { - if (!cnf) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); - return NULL; - } - if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING); - return NULL; - } - ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth); - } else { - ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype); - } - - if (!ret) { - return NULL; - } - - // If no tagging return base type - if ((asn1_tags.imp_tag == -1) && (asn1_tags.exp_count == 0)) { - return ret; - } - - // Generate the encoding - cpy_len = i2d_ASN1_TYPE(ret, &orig_der); - ASN1_TYPE_free(ret); - ret = NULL; - // Set point to start copying for modified encoding - cpy_start = orig_der; - - // Do we need IMPLICIT tagging? - if (asn1_tags.imp_tag != -1) { - // If IMPLICIT we will replace the underlying tag - // Skip existing tag+len - r = ASN1_get_object(&cpy_start, &hdr_len, &hdr_tag, &hdr_class, cpy_len); - if (r & 0x80) { - goto err; - } - // Update copy length - cpy_len -= cpy_start - orig_der; - // For IMPLICIT tagging the length should match the original length - // and constructed flag should be consistent. - hdr_constructed = r & V_ASN1_CONSTRUCTED; - // Work out new length with IMPLICIT tag: ignore constructed because - // it will mess up if indefinite length - len = ASN1_object_size(0, hdr_len, asn1_tags.imp_tag); - } else { - len = cpy_len; - } - - // Work out length in any EXPLICIT, starting from end - - for (i = 0, etmp = asn1_tags.exp_list + asn1_tags.exp_count - 1; - i < asn1_tags.exp_count; i++, etmp--) { - // Content length: number of content octets + any padding - len += etmp->exp_pad; - etmp->exp_len = len; - // Total object length: length including new header - len = ASN1_object_size(0, len, etmp->exp_tag); - } - - // Allocate buffer for new encoding - - new_der = OPENSSL_malloc(len); - if (!new_der) { - goto err; - } - - // Generate tagged encoding - - p = new_der; - - // Output explicit tags first - - for (i = 0, etmp = asn1_tags.exp_list; i < asn1_tags.exp_count; i++, etmp++) { - ASN1_put_object(&p, etmp->exp_constructed, etmp->exp_len, etmp->exp_tag, - etmp->exp_class); - if (etmp->exp_pad) { - *p++ = 0; - } - } - - // If IMPLICIT, output tag - - if (asn1_tags.imp_tag != -1) { - if (asn1_tags.imp_class == V_ASN1_UNIVERSAL && - (asn1_tags.imp_tag == V_ASN1_SEQUENCE || - asn1_tags.imp_tag == V_ASN1_SET)) { - hdr_constructed = V_ASN1_CONSTRUCTED; - } - ASN1_put_object(&p, hdr_constructed, hdr_len, asn1_tags.imp_tag, - asn1_tags.imp_class); - } - - // Copy across original encoding - OPENSSL_memcpy(p, cpy_start, cpy_len); - - cp = new_der; - - // Obtain new ASN1_TYPE structure - ret = d2i_ASN1_TYPE(NULL, &cp, len); - -err: - OPENSSL_free(orig_der); - OPENSSL_free(new_der); + const uint8_t *der = CBB_data(&cbb); + ASN1_TYPE *ret = d2i_ASN1_TYPE(NULL, &der, CBB_len(&cbb)); + CBB_cleanup(&cbb); return ret; } -static int asn1_cb(const char *elem, size_t len, void *bitstr) { - tag_exp_arg *arg = bitstr; - if (elem == NULL) { - return -1; - } - - // Look for the ':' in name:value pairs. - const char *vstart = NULL; - size_t vlen = 0; - const char *colon = OPENSSL_memchr(elem, ':', len); - if (colon != NULL) { - vstart = colon + 1; - vlen = len - (vstart - elem); - len = colon - elem; - } - - int utype = asn1_str2tag(elem, len); - if (utype == -1) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG); - ERR_add_error_data(2, "tag=", elem); - return -1; - } - - // If this is not a modifier mark end of string and exit - if (!(utype & ASN1_GEN_FLAG)) { - arg->utype = utype; - arg->str = vstart; - // If no value and not end of string, error - if (!vstart && elem[len]) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE); - return -1; - } - return 0; - } - - switch (utype) { - case ASN1_GEN_FLAG_IMP: - // Check for illegal multiple IMPLICIT tagging - if (arg->imp_tag != -1) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING); - return -1; - } - if (!parse_tagging(vstart, vlen, &arg->imp_tag, &arg->imp_class)) { - return -1; - } - break; - - case ASN1_GEN_FLAG_EXP: { - int tmp_tag, tmp_class; - if (!parse_tagging(vstart, vlen, &tmp_tag, &tmp_class)) { - return -1; - } - if (!append_exp(arg, tmp_tag, tmp_class, 1, 0, 0)) { - return -1; - } - break; - } - - case ASN1_GEN_FLAG_SEQWRAP: - if (!append_exp(arg, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL, 1, 0, 1)) { - return -1; - } - break; - - case ASN1_GEN_FLAG_SETWRAP: - if (!append_exp(arg, V_ASN1_SET, V_ASN1_UNIVERSAL, 1, 0, 1)) { - return -1; - } - break; - - case ASN1_GEN_FLAG_BITWRAP: - if (!append_exp(arg, V_ASN1_BIT_STRING, V_ASN1_UNIVERSAL, 0, 1, 1)) { - return -1; - } - break; - - case ASN1_GEN_FLAG_OCTWRAP: - if (!append_exp(arg, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL, 0, 0, 1)) { - return -1; - } - break; - - case ASN1_GEN_FLAG_FORMAT: - if (!vstart) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT); - return -1; - } - if (!strncmp(vstart, "ASCII", 5)) { - arg->format = ASN1_GEN_FORMAT_ASCII; - } else if (!strncmp(vstart, "UTF8", 4)) { - arg->format = ASN1_GEN_FORMAT_UTF8; - } else if (!strncmp(vstart, "HEX", 3)) { - arg->format = ASN1_GEN_FORMAT_HEX; - } else if (!strncmp(vstart, "BITLIST", 7)) { - arg->format = ASN1_GEN_FORMAT_BITLIST; - } else { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT); - return -1; - } - break; - } - - return 1; +static int cbs_str_equal(const CBS *cbs, const char *str) { + return CBS_len(cbs) == strlen(str) && + OPENSSL_memcmp(CBS_data(cbs), str, strlen(str)) == 0; } -static int parse_tagging(const char *vstart, size_t vlen, int *ptag, - int *pclass) { - char erch[2]; - long tag_num; - char *eptr; - if (!vstart) { - return 0; - } - tag_num = strtoul(vstart, &eptr, 10); - // Check we haven't gone past max length: should be impossible - if (eptr && *eptr && (eptr > vstart + vlen)) { - return 0; - } - if (tag_num < 0) { +// parse_tag decodes a tag specifier in |cbs|. It returns the tag on success or +// zero on error. +static CBS_ASN1_TAG parse_tag(const CBS *cbs) { + CBS copy = *cbs; + uint64_t num; + if (!CBS_get_u64_decimal(©, &num) || + num > CBS_ASN1_TAG_NUMBER_MASK) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER); return 0; } - *ptag = tag_num; - // If we have non numeric characters, parse them - if (eptr) { - vlen -= eptr - vstart; - } else { - vlen = 0; - } - if (vlen) { - switch (*eptr) { + + CBS_ASN1_TAG tag_class = CBS_ASN1_CONTEXT_SPECIFIC; + // The tag may be suffixed by a class. + uint8_t c; + if (CBS_get_u8(©, &c)) { + switch (c) { case 'U': - *pclass = V_ASN1_UNIVERSAL; + tag_class = CBS_ASN1_UNIVERSAL; break; - case 'A': - *pclass = V_ASN1_APPLICATION; + tag_class = CBS_ASN1_APPLICATION; break; - case 'P': - *pclass = V_ASN1_PRIVATE; + tag_class = CBS_ASN1_PRIVATE; break; - case 'C': - *pclass = V_ASN1_CONTEXT_SPECIFIC; + tag_class = CBS_ASN1_CONTEXT_SPECIFIC; break; - - default: - erch[0] = *eptr; - erch[1] = 0; + default: { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER); - ERR_add_error_data(2, "Char=", erch); return 0; - break; - } - } else { - *pclass = V_ASN1_CONTEXT_SPECIFIC; - } - - return 1; -} - -// Handle multiple types: SET and SEQUENCE - -static ASN1_TYPE *asn1_multi(int utype, const char *section, - const X509V3_CTX *cnf, int depth) { - ASN1_TYPE *ret = NULL; - STACK_OF(ASN1_TYPE) *sk = NULL; - const STACK_OF(CONF_VALUE) *sect = NULL; - unsigned char *der = NULL; - int derlen; - size_t i; - sk = sk_ASN1_TYPE_new_null(); - if (!sk) { - goto bad; - } - if (section) { - if (!cnf) { - goto bad; - } - sect = X509V3_get_section(cnf, section); - if (!sect) { - goto bad; - } - for (i = 0; i < sk_CONF_VALUE_num(sect); i++) { - ASN1_TYPE *typ = - generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf, depth + 1); - if (!typ) { - goto bad; - } - if (!sk_ASN1_TYPE_push(sk, typ)) { - goto bad; } } + if (CBS_len(©) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_MODIFIER); + return 0; + } } - // Now we has a STACK of the components, convert to the correct form - - if (utype == V_ASN1_SET) { - derlen = i2d_ASN1_SET_ANY(sk, &der); - } else { - derlen = i2d_ASN1_SEQUENCE_ANY(sk, &der); + // Tag [UNIVERSAL 0] is reserved for indefinite-length end-of-contents. We + // also use zero in this file to indicator no explicit tagging. + if (tag_class == CBS_ASN1_UNIVERSAL && num == 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER); + return 0; } - if (derlen < 0) { - goto bad; - } + return tag_class | (CBS_ASN1_TAG)num; +} - if (!(ret = ASN1_TYPE_new())) { - goto bad; - } +static int generate_wrapped(CBB *cbb, const char *str, const X509V3_CTX *cnf, + CBS_ASN1_TAG tag, int padding, int format, + int depth) { + CBB child; + return CBB_add_asn1(cbb, &child, tag) && + (!padding || CBB_add_u8(&child, 0)) && + generate_v3(&child, str, cnf, /*tag=*/0, format, depth + 1) && + CBB_flush(cbb); +} - if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype))) { - goto bad; +static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, + CBS_ASN1_TAG tag, int format, int depth) { + assert((tag & CBS_ASN1_CONSTRUCTED) == 0); + if (depth > ASN1_GEN_MAX_DEPTH) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING); + return 0; } - ret->type = utype; - - ret->value.asn1_string->data = der; - ret->value.asn1_string->length = derlen; + // Process modifiers. This function uses a mix of NUL-terminated strings and + // |CBS|. Several functions only work with NUL-terminated strings, so we need + // to keep track of when a slice spans the whole buffer. + for (;;) { + // Skip whitespace. + while (*str != '\0' && OPENSSL_isspace((unsigned char)*str)) { + str++; + } - der = NULL; + // Modifiers end at commas. + const char *comma = strchr(str, ','); + if (comma == NULL) { + break; + } -bad: - OPENSSL_free(der); - sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); - return ret; -} + // Remove trailing whitespace. + CBS modifier; + CBS_init(&modifier, (const uint8_t *)str, comma - str); + for (;;) { + uint8_t v; + CBS copy = modifier; + if (!CBS_get_last_u8(©, &v) || !OPENSSL_isspace(v)) { + break; + } + modifier = copy; + } -static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, - int exp_constructed, int exp_pad, int imp_ok) { - tag_exp_type *exp_tmp; - // Can only have IMPLICIT if permitted - if ((arg->imp_tag != -1) && !imp_ok) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG); - return 0; - } + // Advance the string past the modifier, but save the original value. We + // will need to rewind if this is not a recognized modifier. + const char *str_old = str; + str = comma + 1; + + // Each modifier is either NAME:VALUE or NAME. + CBS name; + int has_value = CBS_get_until_first(&modifier, &name, ':'); + if (has_value) { + CBS_skip(&modifier, 1); // Skip the colon. + } else { + name = modifier; + CBS_init(&modifier, NULL, 0); + } - if (arg->exp_count == ASN1_FLAG_EXP_MAX) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_DEPTH_EXCEEDED); - return 0; + if (cbs_str_equal(&name, "FORMAT") || cbs_str_equal(&name, "FORM")) { + if (cbs_str_equal(&modifier, "ASCII")) { + format = ASN1_GEN_FORMAT_ASCII; + } else if (cbs_str_equal(&modifier, "UTF8")) { + format = ASN1_GEN_FORMAT_UTF8; + } else if (cbs_str_equal(&modifier, "HEX")) { + format = ASN1_GEN_FORMAT_HEX; + } else if (cbs_str_equal(&modifier, "BITLIST")) { + format = ASN1_GEN_FORMAT_BITLIST; + } else { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_FORMAT); + return 0; + } + } else if (cbs_str_equal(&name, "IMP") || + cbs_str_equal(&name, "IMPLICIT")) { + if (tag != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING); + return 0; + } + tag = parse_tag(&modifier); + if (tag == 0) { + return 0; + } + } else if (cbs_str_equal(&name, "EXP") || + cbs_str_equal(&name, "EXPLICIT")) { + // It would actually be supportable, but OpenSSL does not allow wrapping + // an explicit tag in an implicit tag. + if (tag != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING); + return 0; + } + tag = parse_tag(&modifier); + return tag != 0 && + generate_wrapped(cbb, str, cnf, tag | CBS_ASN1_CONSTRUCTED, + /*padding=*/0, format, depth); + } else if (cbs_str_equal(&name, "OCTWRAP")) { + tag = tag == 0 ? CBS_ASN1_OCTETSTRING : tag; + return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth); + } else if (cbs_str_equal(&name, "BITWRAP")) { + tag = tag == 0 ? CBS_ASN1_BITSTRING : tag; + return generate_wrapped(cbb, str, cnf, tag, /*padding=*/1, format, depth); + } else if (cbs_str_equal(&name, "SEQWRAP")) { + tag = tag == 0 ? CBS_ASN1_SEQUENCE : (tag | CBS_ASN1_CONSTRUCTED); + tag |= CBS_ASN1_CONSTRUCTED; + return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth); + } else if (cbs_str_equal(&name, "SETWRAP")) { + tag = tag == 0 ? CBS_ASN1_SET : (tag | CBS_ASN1_CONSTRUCTED); + return generate_wrapped(cbb, str, cnf, tag, /*padding=*/0, format, depth); + } else { + // If this was not a recognized modifier, rewind |str| to before splitting + // on the comma. The type itself consumes all remaining input. + str = str_old; + break; + } } - exp_tmp = &arg->exp_list[arg->exp_count++]; - - // If IMPLICIT set tag to implicit value then reset implicit tag since it - // has been used. - if (arg->imp_tag != -1) { - exp_tmp->exp_tag = arg->imp_tag; - exp_tmp->exp_class = arg->imp_class; - arg->imp_tag = -1; - arg->imp_class = -1; + // The final element is, like modifiers, NAME:VALUE or NAME, but VALUE spans + // the length of the string, including any commas. + const char *colon = strchr(str, ':'); + CBS name; + const char *value; + int has_value = colon != NULL; + if (has_value) { + CBS_init(&name, (const uint8_t *)str, colon - str); + value = colon + 1; } else { - exp_tmp->exp_tag = exp_tag; - exp_tmp->exp_class = exp_class; - } - exp_tmp->exp_constructed = exp_constructed; - exp_tmp->exp_pad = exp_pad; - - return 1; -} - -static int asn1_str2tag(const char *tagstr, size_t len) { - static const struct tag_name_st tnst[] = { - ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN), - ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN), - ASN1_GEN_STR("NULL", V_ASN1_NULL), - ASN1_GEN_STR("INT", V_ASN1_INTEGER), - ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER), - ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED), - ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED), - ASN1_GEN_STR("OID", V_ASN1_OBJECT), - ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT), - ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME), - ASN1_GEN_STR("UTC", V_ASN1_UTCTIME), - ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME), - ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME), - ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING), - ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING), - ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING), - ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING), - ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING), - ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING), - ASN1_GEN_STR("IA5", V_ASN1_IA5STRING), - ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING), - ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING), - ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING), - ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING), - ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING), - ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING), - ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING), - ASN1_GEN_STR("T61", V_ASN1_T61STRING), - ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING), - ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING), - - // Special cases - ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE), - ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE), - ASN1_GEN_STR("SET", V_ASN1_SET), - // type modifiers - // Explicit tag - ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP), - ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP), - // Implicit tag - ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP), - ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP), - // OCTET STRING wrapper - ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP), - // SEQUENCE wrapper - ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP), - // SET wrapper - ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP), - // BIT STRING wrapper - ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP), - ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT), - ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT), + CBS_init(&name, (const uint8_t *)str, strlen(str)); + value = ""; // Most types treat missing and empty value equivalently. + } + + static const struct { + const char *name; + CBS_ASN1_TAG type; + } kTypes[] = { + {"BOOL", CBS_ASN1_BOOLEAN}, + {"BOOLEAN", CBS_ASN1_BOOLEAN}, + {"NULL", CBS_ASN1_NULL}, + {"INT", CBS_ASN1_INTEGER}, + {"INTEGER", CBS_ASN1_INTEGER}, + {"ENUM", CBS_ASN1_ENUMERATED}, + {"ENUMERATED", CBS_ASN1_ENUMERATED}, + {"OID", CBS_ASN1_OBJECT}, + {"OBJECT", CBS_ASN1_OBJECT}, + {"UTCTIME", CBS_ASN1_UTCTIME}, + {"UTC", CBS_ASN1_UTCTIME}, + {"GENERALIZEDTIME", CBS_ASN1_GENERALIZEDTIME}, + {"GENTIME", CBS_ASN1_GENERALIZEDTIME}, + {"OCT", CBS_ASN1_OCTETSTRING}, + {"OCTETSTRING", CBS_ASN1_OCTETSTRING}, + {"BITSTR", CBS_ASN1_BITSTRING}, + {"BITSTRING", CBS_ASN1_BITSTRING}, + {"UNIVERSALSTRING", CBS_ASN1_UNIVERSALSTRING}, + {"UNIV", CBS_ASN1_UNIVERSALSTRING}, + {"IA5", CBS_ASN1_IA5STRING}, + {"IA5STRING", CBS_ASN1_IA5STRING}, + {"UTF8", CBS_ASN1_UTF8STRING}, + {"UTF8String", CBS_ASN1_UTF8STRING}, + {"BMP", CBS_ASN1_BMPSTRING}, + {"BMPSTRING", CBS_ASN1_BMPSTRING}, + {"PRINTABLESTRING", CBS_ASN1_PRINTABLESTRING}, + {"PRINTABLE", CBS_ASN1_PRINTABLESTRING}, + {"T61", CBS_ASN1_T61STRING}, + {"T61STRING", CBS_ASN1_T61STRING}, + {"TELETEXSTRING", CBS_ASN1_T61STRING}, + {"SEQUENCE", CBS_ASN1_SEQUENCE}, + {"SEQ", CBS_ASN1_SEQUENCE}, + {"SET", CBS_ASN1_SET}, }; - - for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(tnst); i++) { - if (len == tnst[i].len && strncmp(tnst[i].strnam, tagstr, len) == 0) { - return tnst[i].tag; + CBS_ASN1_TAG type = 0; + for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTypes); i++) { + if (cbs_str_equal(&name, kTypes[i].name)) { + type = kTypes[i].type; + break; } } - - return -1; -} - -static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype) { - ASN1_TYPE *atmp = NULL; - - CONF_VALUE vtmp; - - unsigned char *rdata; - long rdlen; - - int no_unused = 1; - - if (!(atmp = ASN1_TYPE_new())) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - return NULL; + if (type == 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_TAG); + return 0; } - if (!str) { - str = ""; + // If there is an implicit tag, use the constructed bit from the base type. + tag = tag == 0 ? type : (tag | (type & CBS_ASN1_CONSTRUCTED)); + CBB child; + if (!CBB_add_asn1(cbb, &child, tag)) { + return 0; } - switch (utype) { - case V_ASN1_NULL: - if (str && *str) { + switch (type) { + case CBS_ASN1_NULL: + if (*value != '\0') { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_NULL_VALUE); - goto bad_form; + return 0; } - break; + return CBB_flush(cbb); - case V_ASN1_BOOLEAN: + case CBS_ASN1_BOOLEAN: { if (format != ASN1_GEN_FORMAT_ASCII) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NOT_ASCII_FORMAT); - goto bad_form; + return 0; } - vtmp.name = NULL; - vtmp.section = NULL; - vtmp.value = (char *)str; - if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean)) { + ASN1_BOOLEAN boolean; + if (!X509V3_bool_from_string(value, &boolean)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BOOLEAN); - goto bad_str; + return 0; } - break; + return CBB_add_u8(&child, boolean ? 0xff : 0x00) && CBB_flush(cbb); + } - case V_ASN1_INTEGER: - case V_ASN1_ENUMERATED: + case CBS_ASN1_INTEGER: + case CBS_ASN1_ENUMERATED: { if (format != ASN1_GEN_FORMAT_ASCII) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT); - goto bad_form; + return 0; } - if (!(atmp->value.integer = s2i_ASN1_INTEGER(NULL, (char *)str))) { + ASN1_INTEGER *obj = s2i_ASN1_INTEGER(NULL, value); + if (obj == NULL) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_INTEGER); - goto bad_str; + return 0; } - break; + int len = i2c_ASN1_INTEGER(obj, NULL); + uint8_t *out; + int ok = len > 0 && // + CBB_add_space(&child, &out, len) && + i2c_ASN1_INTEGER(obj, &out) == len && + CBB_flush(cbb); + ASN1_INTEGER_free(obj); + return ok; + } - case V_ASN1_OBJECT: + case CBS_ASN1_OBJECT: { if (format != ASN1_GEN_FORMAT_ASCII) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT); - goto bad_form; + return 0; } - if (!(atmp->value.object = OBJ_txt2obj(str, 0))) { + ASN1_OBJECT *obj = OBJ_txt2obj(value, /*dont_search_names=*/0); + if (obj == NULL || obj->length == 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT); - goto bad_str; + return 0; } - break; + int ok = CBB_add_bytes(&child, obj->data, obj->length) && CBB_flush(cbb); + ASN1_OBJECT_free(obj); + return ok; + } - case V_ASN1_UTCTIME: - case V_ASN1_GENERALIZEDTIME: + case CBS_ASN1_UTCTIME: + case CBS_ASN1_GENERALIZEDTIME: { if (format != ASN1_GEN_FORMAT_ASCII) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT); - goto bad_form; - } - if (!(atmp->value.asn1_string = ASN1_STRING_new())) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - goto bad_str; - } - if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - goto bad_str; + return 0; } - atmp->value.asn1_string->type = utype; - if (!ASN1_TIME_check(atmp->value.asn1_string)) { + CBS value_cbs; + CBS_init(&value_cbs, (const uint8_t*)value, strlen(value)); + int ok = type == CBS_ASN1_UTCTIME + ? CBS_parse_utc_time(&value_cbs, NULL, + /*allow_timezone_offset=*/0) + : CBS_parse_generalized_time(&value_cbs, NULL, + /*allow_timezone_offset=*/0); + if (!ok) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_TIME_VALUE); - goto bad_str; + return 0; } + return CBB_add_bytes(&child, (const uint8_t *)value, strlen(value)) && + CBB_flush(cbb); + } - break; - - case V_ASN1_BMPSTRING: - case V_ASN1_PRINTABLESTRING: - case V_ASN1_IA5STRING: - case V_ASN1_T61STRING: - case V_ASN1_UTF8STRING: - case V_ASN1_VISIBLESTRING: - case V_ASN1_UNIVERSALSTRING: - case V_ASN1_GENERALSTRING: - case V_ASN1_NUMERICSTRING: - + case CBS_ASN1_UNIVERSALSTRING: + case CBS_ASN1_IA5STRING: + case CBS_ASN1_UTF8STRING: + case CBS_ASN1_BMPSTRING: + case CBS_ASN1_PRINTABLESTRING: + case CBS_ASN1_T61STRING: { + int encoding; if (format == ASN1_GEN_FORMAT_ASCII) { - format = MBSTRING_ASC; + encoding = MBSTRING_ASC; } else if (format == ASN1_GEN_FORMAT_UTF8) { - format = MBSTRING_UTF8; + encoding = MBSTRING_UTF8; } else { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_FORMAT); - goto bad_form; + return 0; } - if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str, -1, - format, ASN1_tag2bit(utype)) <= 0) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - goto bad_str; + ASN1_STRING *obj = NULL; + if (ASN1_mbstring_copy(&obj, (const uint8_t *)value, -1, encoding, + ASN1_tag2bit(type)) <= 0) { + return 0; } + int ok = CBB_add_bytes(&child, obj->data, obj->length) && CBB_flush(cbb); + ASN1_STRING_free(obj); + return ok; + } - break; - - case V_ASN1_BIT_STRING: - - case V_ASN1_OCTET_STRING: + case CBS_ASN1_BITSTRING: + if (format == ASN1_GEN_FORMAT_BITLIST) { + ASN1_BIT_STRING *obj = ASN1_BIT_STRING_new(); + if (obj == NULL) { + return 0; + } + if (!CONF_parse_list(value, ',', 1, bitstr_cb, obj)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR); + ASN1_BIT_STRING_free(obj); + return 0; + } + int len = i2c_ASN1_BIT_STRING(obj, NULL); + uint8_t *out; + int ok = len > 0 && // + CBB_add_space(&child, &out, len) && + i2c_ASN1_BIT_STRING(obj, &out) == len && // + CBB_flush(cbb); + ASN1_BIT_STRING_free(obj); + return ok; + } - if (!(atmp->value.asn1_string = ASN1_STRING_new())) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - goto bad_form; + // The other formats are the same as OCTET STRING, but with the leading + // zero bytes. + if (!CBB_add_u8(&child, 0)) { + return 0; } + OPENSSL_FALLTHROUGH; + case CBS_ASN1_OCTETSTRING: + if (format == ASN1_GEN_FORMAT_ASCII) { + return CBB_add_bytes(&child, (const uint8_t *)value, strlen(value)) && + CBB_flush(cbb); + } if (format == ASN1_GEN_FORMAT_HEX) { - if (!(rdata = x509v3_hex_to_bytes((char *)str, &rdlen))) { + long len; + uint8_t *data = x509v3_hex_to_bytes(value, &len); + if (data == NULL) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX); - goto bad_str; + return 0; } + int ok = CBB_add_bytes(&child, data, len) && CBB_flush(cbb); + OPENSSL_free(data); + return ok; + } - atmp->value.asn1_string->data = rdata; - atmp->value.asn1_string->length = rdlen; - atmp->value.asn1_string->type = utype; + OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT); + return 0; - } else if (format == ASN1_GEN_FORMAT_ASCII) { - ASN1_STRING_set(atmp->value.asn1_string, str, -1); - } else if ((format == ASN1_GEN_FORMAT_BITLIST) && - (utype == V_ASN1_BIT_STRING)) { - if (!CONF_parse_list(str, ',', 1, bitstr_cb, atmp->value.bit_string)) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_LIST_ERROR); - goto bad_str; + case CBS_ASN1_SEQUENCE: + case CBS_ASN1_SET: + if (has_value) { + if (cnf == NULL) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); + return 0; + } + const STACK_OF(CONF_VALUE) *section = X509V3_get_section(cnf, value); + if (section == NULL) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); + return 0; + } + for (size_t i = 0; i < sk_CONF_VALUE_num(section); i++) { + const CONF_VALUE *conf = sk_CONF_VALUE_value(section, i); + if (!generate_v3(&child, conf->value, cnf, /*tag=*/0, + ASN1_GEN_FORMAT_ASCII, depth + 1)) { + return 0; + } } - no_unused = 0; - - } else { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT); - goto bad_form; } - - if ((utype == V_ASN1_BIT_STRING) && no_unused) { - atmp->value.asn1_string->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); - atmp->value.asn1_string->flags |= ASN1_STRING_FLAG_BITS_LEFT; + if (type == CBS_ASN1_SET) { + // The SET type here is a SET OF and must be sorted. + return CBB_flush_asn1_set_of(&child) && CBB_flush(cbb); } - - break; + return CBB_flush(cbb); default: - OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_TYPE); - goto bad_str; - break; + OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR); + return 0; } - - atmp->type = utype; - return atmp; - -bad_str: - ERR_add_error_data(2, "string=", str); -bad_form: - - ASN1_TYPE_free(atmp); - return NULL; } static int bitstr_cb(const char *elem, size_t len, void *bitstr) { - long bitnum; - char *eptr; - if (!elem) { - return 0; - } - bitnum = strtoul(elem, &eptr, 10); - if (eptr && *eptr && (eptr != elem + len)) { - return 0; - } - if (bitnum < 0) { + CBS cbs; + CBS_init(&cbs, (const uint8_t *)elem, len); + uint64_t bitnum; + if (!CBS_get_u64_decimal(&cbs, &bitnum) || CBS_len(&cbs) != 0 || + bitnum > INT_MAX) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER); return 0; } - if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) { + if (!ASN1_BIT_STRING_set_bit(bitstr, (int)bitnum, 1)) { OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index ebd8262d95..fea26e7bcc 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -6028,8 +6028,8 @@ TEST(X509Test, ExtensionFromConf) { 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x04, 0x03, 0x02, 0x02, 0x44}}, {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:1,invalid,5", nullptr, {}}, - // TODO(davidben): Handle overflow and enable this test. - // {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:4294967296", nullptr, {}}, + // Overflow. + {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:4294967296", nullptr, {}}, // Unsupported formats for string types. {kTestOID, "ASN1:FORMAT:BITLIST,IA5:abcd", nullptr, {}}, @@ -6102,6 +6102,13 @@ val = SEQ:seq1 0x30, 0x12, 0x7f, 0x64, 0x0f, 0xbf, 0x87, 0x68, 0x0b, 0x04, 0x09, 0x30, 0x07, 0x31, 0x05, 0x03, 0x03, 0x00, 0x05, 0x00}}, + // Invalid tag numbers. + {kTestOID, "ASN1:EXP:-1,NULL", nullptr, {}}, + {kTestOID, "ASN1:EXP:1?,NULL", nullptr, {}}, + // Fits in |uint32_t| but exceeds |CBS_ASN1_TAG_NUMBER_MASK|, the largest + // tag number we support. + {kTestOID, "ASN1:EXP:536870912,NULL", nullptr, {}}, + // Implicit tagging may also be applied to the underlying type, or the // wrapping modifiers. {kTestOID, @@ -6118,6 +6125,9 @@ val = SEQ:seq1 {kTestOID, "ASN1:IMP:1,EXP:1,NULL", nullptr, {}}, {kTestOID, "ASN1:IMP:1,IMP:1,NULL", nullptr, {}}, + // [UNIVERSAL 0] is reserved. + {kTestOID, "ASN1:0U,NULL", nullptr, {}}, + // Leading and trailing spaces on name:value pairs are removed. However, // while these pairs are delimited by commas, a type will consumes // everything after it, including commas, and spaces. So this is the diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h index 51e15e41ba..05a7026d60 100644 --- a/crypto/x509v3/internal.h +++ b/crypto/x509v3/internal.h @@ -134,7 +134,11 @@ int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value, int X509V3_NAME_from_section(X509_NAME *nm, const STACK_OF(CONF_VALUE) *dn_sk, int chtype); -int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *asn1_bool); +// X509V3_bool_from_string decodes |str| as a boolean. On success, it returns +// one and sets |*out_bool| to resulting value. Otherwise, it returns zero. +int X509V3_bool_from_string(const char *str, ASN1_BOOLEAN *out_bool); + +int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *out_bool); int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); const STACK_OF(CONF_VALUE) *X509V3_get_section(const X509V3_CTX *ctx, const char *section); diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index eec7d08184..96ad2295bd 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -300,23 +300,33 @@ int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, return ret; } -int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *asn1_bool) { - char *btmp; - if (!(btmp = value->value)) { - goto err; - } - if (!strcmp(btmp, "TRUE") || !strcmp(btmp, "true") || !strcmp(btmp, "Y") || - !strcmp(btmp, "y") || !strcmp(btmp, "YES") || !strcmp(btmp, "yes")) { - *asn1_bool = ASN1_BOOLEAN_TRUE; +int X509V3_bool_from_string(const char *str, ASN1_BOOLEAN *out_bool) { + if (!strcmp(str, "TRUE") || !strcmp(str, "true") || !strcmp(str, "Y") || + !strcmp(str, "y") || !strcmp(str, "YES") || !strcmp(str, "yes")) { + *out_bool = ASN1_BOOLEAN_TRUE; return 1; - } else if (!strcmp(btmp, "FALSE") || !strcmp(btmp, "false") || - !strcmp(btmp, "N") || !strcmp(btmp, "n") || !strcmp(btmp, "NO") || - !strcmp(btmp, "no")) { - *asn1_bool = ASN1_BOOLEAN_FALSE; + } + if (!strcmp(str, "FALSE") || !strcmp(str, "false") || !strcmp(str, "N") || + !strcmp(str, "n") || !strcmp(str, "NO") || !strcmp(str, "no")) { + *out_bool = ASN1_BOOLEAN_FALSE; return 1; } -err: OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING); + return 0; +} + +int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *out_bool) { + const char *btmp = value->value; + if (btmp == NULL) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_BOOLEAN_STRING); + goto err; + } + if (!X509V3_bool_from_string(btmp, out_bool)) { + goto err; + } + return 1; + +err: X509V3_conf_err(value); return 0; } From 33b569282ca124c81d9ba74df696a013cb9a80ae Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 31 Dec 2022 17:16:53 -0500 Subject: [PATCH 016/177] Add a fuzzer for the config file machinery. This fuzzes the config file parser, and the converrsion to X.509 extensions. The initial corpus was computed by: 1. Import every file from OpenSSL 1.1.1 that ends in .cnf. 2. For each section in each such file, add a copy with that section copied to the top (the "default") section. 3. Also add a file for each unit test. 4. Minimize the corpus. While I'm here, sort the targets in fuzz/CMakeLists.txt. Change-Id: I0cfc1ae8e2be3e67dae361605ad19833aec3fe4d Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56167 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- fuzz/CMakeLists.txt | 21 +- fuzz/conf.cc | 35 ++ .../08dcd36db4461e27684979b5fc0686526e183c97 | 2 + .../0a1e01eb1f9e8e1803399255c4295a31f0d09d50 | 27 ++ .../0ab7d18185a7251b6ef04aef2f1e6e687e20130a | 92 ++++ .../0b252c0c9bda64bf1660ea4dbd8cf113fa42758b | 2 + .../0d13a928828e81a04c821d7edc9ff2d2df41f1d7 | 24 ++ .../100bf54ae331e2042a88faf2638b166ff27e5e6f | 2 + .../170c6e9fa613ab2781f872c57cd2c59fc01e0767 | 377 ++++++++++++++++ .../1797360721db937be80829d7055d265dc0ff8267 | 7 + .../18bec37e70eec020886a9800c6c56362917783a2 | 2 + .../2202e54f0d7738c3a783eaa429ccde4783616a54 | 5 + .../230abc23734a336467f2c5dec4c3a58559f2ed9a | 2 + .../275b81ee8a1ba2abb0acad60920505a89067535a | 21 + .../281cc97b63f22afd0306f02883f74c4f718ab4f4 | 2 + .../2a050eb8e3426bd96a1327acd6c8914597c4390c | 2 + .../2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd | 2 + .../2cf0606462f76c0946ffe26e2e613a4fe3ce3099 | 2 + .../30cfb27d45f0000106f031c87d4bc4c3074d70a4 | 65 +++ .../328b0f18ee4445e85272d8956999d6141396bfdf | 2 + .../32edc4bdd420e2aedf901789025250206e4e1386 | 24 ++ .../35047bb8f4ab1d64027c5a849420b1696a353c8e | 383 +++++++++++++++++ .../35c202e645ed1be5040eb358fe7eb4db6bfe624f | 168 ++++++++ .../37b929a109a89d8ef4e07e43b3d58ce53610e9a6 | 64 +++ .../37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae | 15 + .../38b948dd3fa55cb37982127562154068ecd8f7ec | 2 + .../395410ecd6d2db9216f9ca77417b290a945243f2 | 19 + .../395ad885030545f2fcf9c1e84c5fa7b173c7d256 | 63 +++ .../3ae4a7d00132b473b7451164636c325fc3d6790f | 2 + .../3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c | 2 + .../42742f12cd752ced1398001ae54d3d0d11620069 | 31 ++ .../45290902222264dc36d93a7dd9669ef419dac293 | 2 + .../48380f4be820e22599410baa62bb004274cbfac2 | 350 +++++++++++++++ .../4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 | 393 +++++++++++++++++ .../4accb3f43a191f145ec9a1c8a747ab09a4be32d2 | 2 + .../4bdb476bbcb81b40c869319e1565606945c68374 | 2 + .../4beed6b185c0a4958b7e4b5cbd272e78859c076b | 80 ++++ .../50076fd5bd0e9429817a7b21a70b6cf3d00f2613 | 2 + .../50dad276fd8b2a80ee94b3cb1f3c24874989d022 | 74 ++++ .../530a33f20602dfa94747ccd7e802e5db91e81613 | 30 ++ .../542737d901a0297a82735ae043b3fa63d654c992 | 361 ++++++++++++++++ .../5469e35d858278e3cb1aed54d0299dec6b485d6a | 2 + .../55c19b8145675fb76d62b2700acb7fafb144bed7 | 62 +++ .../57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 | 2 + .../594a3570ef3c76647f001bf85539b9dc0dee0617 | 2 + .../59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b | 37 ++ .../5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 | 19 + .../5c59d0963dca28f161b3fad9c1aebb6c91759d31 | 2 + .../60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e | 2 + .../6140664f9791c7c0da4efcdb8997b0a21041f88a | 2 + .../616049a4fd7c60684de8d3b7886f950fa21b9869 | 2 + .../68c1b4bbad7a11989b929f8aed14d65b31536164 | 2 + .../697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 | 2 + .../69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc | 52 +++ .../6c7f8c2045867641dd5ae32a8ceb25b8faa39808 | 4 + .../6cc82d1312421cee8a07f13e6fb27d49f08b9840 | 5 + .../6d7936a8355956094938102f653df82c4a99b099 | 2 + .../702d7bd05ada6355620ace60e9b2cd4e0a1b3757 | 66 +++ .../7090fdb7e0d8e7106490d37f9aec664c7d050cf5 | 2 + .../76ae6d85df626927a0be162a6b3846132d40957b | 19 + .../788ddbf9d4770cced2a860ac60c81eea9dea7f92 | 361 ++++++++++++++++ .../78b9cf1525d06cddf920ee48dbd148b76c1ff33c | 15 + .../7aff02c03b03f36d83de3129397fa854d3ab8120 | 2 + .../7d0c17dc2a2dc49ec014bed83b834a59d035b856 | 5 + .../81206f43ddab64bebeada8eca34dbe377dcf0586 | 2 + .../814af1dfe1b44feed24d1a09264146d1a067b104 | 2 + .../81b46b866d7db2cbcb9120d37c580362ee87a38f | 2 + .../8206704aa14a2bde67c185e80255b7549069c432 | 357 ++++++++++++++++ .../822571601d5d7086fa241d10f8177dfbbdc7f13d | 104 +++++ .../823bec7091ae3be48a31a9813abcc49eef62622f | 2 + .../83c71dd51a38cb8a1c79ffe6aad360758b4e08ea | 2 + .../84e212e03800aae7eac44321017a75523b500aec | 357 ++++++++++++++++ .../86b04c728a03d3d796e5a02ec57c22d16b80b59a | 2 + .../8814ab1d77628a2e35cf59dded05a1ba09986b9a | 2 + .../896af997791eac9fbccdd9d86eb46d45e7a8ddf2 | 357 ++++++++++++++++ .../8baa38c5c8540561d86491916d0bb36cc13c1218 | 43 ++ .../8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf | 2 + .../8de6365ad8ab8315fe22408785ed5d1121e0324b | 45 ++ .../8e740a2d8429b288d9b034c8331393211d784167 | 79 ++++ .../8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe | 176 ++++++++ .../917a403d9a6e8db8462cfd2d9f7958b80025dafc | 2 + .../91ded87bf790e2b94c6b4e3e046ea8534b8fc385 | 357 ++++++++++++++++ .../92fde7b859f6f3f548690b89126c09a9f3057b82 | 65 +++ .../93e31109bf290a5a77f1ac5a8695533b700f7f39 | 53 +++ .../9997ee4592ed989c1dfb0f7b93fbd20d5e22702b | 25 ++ .../99d8dd3e2036dde9df15123c52517767f14f4480 | 47 ++ .../9bc8f7c02576f19eb229d6906b12044fb97cff85 | 2 + .../9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 | 2 + .../9d87d1e51de8f52272efaf32bb355b9b049e253b | 2 + .../a2587c4e97408b64274e5e052b74e3754892c13a | 9 + .../a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 | 14 + .../a59ae53ccd6bc5f2a351bef57079029ac18a7d41 | 2 + .../a7d597a082be78a8a48a49bbbccaefcf7375ec24 | 404 ++++++++++++++++++ .../a9efbc43a88aedba79010aded171e39498be0c2f | 404 ++++++++++++++++++ .../aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 | 2 + .../ac5814a191294c3f7c6c68d44cbf3519b3eb644f | 83 ++++ .../acee4ed8c6d6fdc20ff2a54f66b552bd335de75d | 2 + .../aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 | 2 + .../af9f2cbae84ac395975f31730212c68ba4d73d11 | 2 + .../afd1e920f075355a478e95142b2062ee6119fc9d | 2 + .../b031873c1d543faefa84c94e772a8af2e38932d8 | 2 + .../b3ea0a503ac2fdbe8b36642ca820b3f2d960cede | 2 + .../b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 | 2 + .../b43a40ec0466f347383475cf6e4907ea4cefb129 | 73 ++++ .../b6638728fde6ba062209cce4cd0f51956634a981 | 19 + .../b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 | 36 ++ .../b7e7338c20733d3bd2924fb53d8e2b619e059818 | 2 + .../b9c9c2d24d6dd35b445dc6da03603055715ec4e7 | 9 + .../ba3adaea0e8015875583e258bda44aaa3d433b36 | 190 ++++++++ .../bc9109c3decb01fbf6c711238a3670efccb8ff72 | 33 ++ .../bd049724a30d9e151ed04f2c630b9bb994d1c4d7 | 2 + .../be4100590164af4b7689bdaaff5fa34eeaae331f | 51 +++ .../c06bb154438af6218b8f58bc0f70520674fb3090 | 350 +++++++++++++++ .../c53c55a556815bf0869da3fab9bbc94f946e7f17 | 2 + .../c8a605981467c909bef7ea586d7daf2bdbb9357c | 79 ++++ .../c951357508c09946709f3b7085080aa7882351a0 | 2 + .../cb8807caf78392bc3f6866b416b84b57423f0a92 | 2 + .../ce326c4f904c6409744a00ac16a570b11baa8d0f | 17 + .../d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf | 2 + .../d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 | 2 + .../d209fb4ee746274b928fc2fe0d738c3489cfad3e | 2 + .../d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 | 44 ++ .../d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 | 41 ++ .../dafef760e88c3ab60b70bb9cd40c838525e21844 | 112 +++++ .../db3c104f8df5992c03182c0815ff2e18f55ab6e9 | 2 + .../db88bc928305afb566adefef5015363f43ec722d | 76 ++++ .../dd3c504d9aa688c7b6663010be449da67635f043 | 50 +++ .../dd9b29e2d9b871fac7942691fc72f5cbb36004f8 | 165 +++++++ .../de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 | 2 + .../dea83c239f1cf4b30155bb86eb2b8e15298f56e6 | 83 ++++ .../e055b94e4253ca8c820e7d90cd898e91c387305f | 28 ++ .../e26367c7aa40d55985aff3458ed6b6bd775f4bfc | 7 + .../e2c246860c12b137377d1fd48d24beafbeabe730 | 19 + .../e455aa989be06525bd8cf5ab6d8f5406a9735347 | 358 ++++++++++++++++ .../e53857febc1becd1ae5b928971a6e048938d34b3 | 24 ++ .../e5ef73ebd19d87df954f20435820e1f30c9ce289 | 2 + .../e734f951873b98f37a1f4418c045f2b81f03c2eb | 379 ++++++++++++++++ .../e89cd88731014345571db8549b41fc2bd97c3c77 | 60 +++ .../e91a9da2d47e9de221557d52e75bc88383651c74 | 2 + .../ec90d9f753ca4d55f66f65839a9860c94497db24 | 45 ++ .../ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c | 60 +++ .../f1eca4627e6a9f02bf41aca290f6cef886465fac | 2 + .../f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e | 2 + .../f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 | 56 +++ .../fa0bc7b35fb3959a17dbc0320292d864b0df68be | 2 + .../fa88066fa3360a2a2347c6cc7fff330025b33591 | 20 + .../fadf69d83c1e00e57e2531854949d5d1770c1660 | 2 + .../fb131639df5a1df7894bb7e81f9e896624a0e9bf | 2 + .../fbe2f5f1cf481f17c44729e05776c5b5d4251f8f | 2 + .../ffe92960d72947bfdc67cb350c73378fc7d2ba1b | 2 + 150 files changed, 8965 insertions(+), 10 deletions(-) create mode 100644 fuzz/conf.cc create mode 100644 fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 create mode 100644 fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 create mode 100644 fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a create mode 100644 fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b create mode 100644 fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 create mode 100644 fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f create mode 100644 fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 create mode 100644 fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 create mode 100644 fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 create mode 100644 fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 create mode 100644 fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a create mode 100644 fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a create mode 100644 fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 create mode 100644 fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c create mode 100644 fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd create mode 100644 fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 create mode 100644 fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 create mode 100644 fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf create mode 100644 fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 create mode 100644 fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e create mode 100644 fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f create mode 100644 fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 create mode 100644 fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae create mode 100644 fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec create mode 100644 fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 create mode 100644 fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 create mode 100644 fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f create mode 100644 fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c create mode 100644 fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 create mode 100644 fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 create mode 100644 fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 create mode 100644 fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 create mode 100644 fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 create mode 100644 fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 create mode 100644 fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b create mode 100644 fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 create mode 100644 fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 create mode 100644 fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 create mode 100644 fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 create mode 100644 fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a create mode 100644 fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 create mode 100644 fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 create mode 100644 fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 create mode 100644 fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b create mode 100644 fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 create mode 100644 fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 create mode 100644 fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e create mode 100644 fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a create mode 100644 fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 create mode 100644 fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 create mode 100644 fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 create mode 100644 fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc create mode 100644 fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 create mode 100644 fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 create mode 100644 fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 create mode 100644 fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 create mode 100644 fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 create mode 100644 fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b create mode 100644 fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 create mode 100644 fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c create mode 100644 fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 create mode 100644 fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 create mode 100644 fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 create mode 100644 fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 create mode 100644 fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f create mode 100644 fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 create mode 100644 fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d create mode 100644 fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f create mode 100644 fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea create mode 100644 fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec create mode 100644 fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a create mode 100644 fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a create mode 100644 fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 create mode 100644 fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 create mode 100644 fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf create mode 100644 fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b create mode 100644 fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 create mode 100644 fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe create mode 100644 fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc create mode 100644 fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 create mode 100644 fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 create mode 100644 fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 create mode 100644 fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b create mode 100644 fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 create mode 100644 fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 create mode 100644 fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 create mode 100644 fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b create mode 100644 fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a create mode 100644 fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 create mode 100644 fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 create mode 100644 fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 create mode 100644 fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f create mode 100644 fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 create mode 100644 fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f create mode 100644 fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d create mode 100644 fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 create mode 100644 fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 create mode 100644 fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d create mode 100644 fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 create mode 100644 fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede create mode 100644 fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 create mode 100644 fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 create mode 100644 fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 create mode 100644 fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 create mode 100644 fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 create mode 100644 fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 create mode 100644 fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 create mode 100644 fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 create mode 100644 fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 create mode 100644 fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f create mode 100644 fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 create mode 100644 fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 create mode 100644 fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c create mode 100644 fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 create mode 100644 fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 create mode 100644 fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f create mode 100644 fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf create mode 100644 fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 create mode 100644 fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e create mode 100644 fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 create mode 100644 fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 create mode 100644 fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 create mode 100644 fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 create mode 100644 fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d create mode 100644 fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 create mode 100644 fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 create mode 100644 fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 create mode 100644 fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 create mode 100644 fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f create mode 100644 fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc create mode 100644 fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 create mode 100644 fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 create mode 100644 fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 create mode 100644 fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 create mode 100644 fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb create mode 100644 fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 create mode 100644 fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 create mode 100644 fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 create mode 100644 fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c create mode 100644 fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac create mode 100644 fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e create mode 100644 fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 create mode 100644 fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be create mode 100644 fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 create mode 100644 fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 create mode 100644 fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf create mode 100644 fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f create mode 100644 fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index 51da4a80a4..8db1b7e8cb 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -15,19 +15,20 @@ macro(fuzzer name) endmacro() fuzzer(arm_cpuinfo) -fuzzer(bn_mod_exp) fuzzer(bn_div) -fuzzer(privkey) +fuzzer(bn_mod_exp) fuzzer(cert) -fuzzer(spki) -fuzzer(pkcs8) +fuzzer(client ssl) +fuzzer(conf) +fuzzer(decode_client_hello_inner ssl) +fuzzer(der_roundtrip) +fuzzer(dtls_client ssl) +fuzzer(dtls_server ssl) fuzzer(pkcs12) +fuzzer(pkcs8) +fuzzer(privkey) fuzzer(read_pem) fuzzer(server ssl) -fuzzer(client ssl) -fuzzer(dtls_server ssl) -fuzzer(dtls_client ssl) -fuzzer(ssl_ctx_api ssl) fuzzer(session ssl) -fuzzer(decode_client_hello_inner ssl) -fuzzer(der_roundtrip) +fuzzer(spki) +fuzzer(ssl_ctx_api ssl) diff --git a/fuzz/conf.cc b/fuzz/conf.cc new file mode 100644 index 0000000000..eed87f3501 --- /dev/null +++ b/fuzz/conf.cc @@ -0,0 +1,35 @@ +/* Copyright (c) 2022, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include +#include +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { + bssl::UniquePtr bio(BIO_new_mem_buf(buf, len)); + bssl::UniquePtr conf(NCONF_new(nullptr)); + if (NCONF_load_bio(conf.get(), bio.get(), nullptr)) { + // Run with and without |X509V3_CTX| information. + bssl::UniquePtr cert(X509_new()); + X509V3_CTX ctx; + X509V3_set_ctx(&ctx, /*subject=*/cert.get(), /*issuer=*/cert.get(), nullptr, + nullptr, 0); + X509V3_EXT_add_nconf(conf.get(), &ctx, "default", cert.get()); + + cert.reset(X509_new()); + X509V3_EXT_add_nconf(conf.get(), nullptr, "default", cert.get()); + } + return 0; +} diff --git a/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 b/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 new file mode 100644 index 0000000000..fa0363a42b --- /dev/null +++ b/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:1?,NULL + diff --git a/fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 b/fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 new file mode 100644 index 0000000000..71531214c5 --- /dev/null +++ b/fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 @@ -0,0 +1,27 @@ +# [ req ] +default_bits = 2432 +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only + +req_extensions = v3_req # The extensions to add to a certificate request + +#################################################################### +[ req ] +default_bits = 2432 +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only + +req_extensions = v3_req # The extensions to add to a certificate request + +[ req_DN ] +commonName = "Common Name" +commonName_value = "A user" +userId = "User ID" +userId_value = "test" + +[ v3_req ] +extendedKeyUsage = clientAuth +subjectKeyIdentifier = hash +basicConstraints = CA:false diff --git a/fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a b/fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a new file mode 100644 index 0000000000..e26224db7e --- /dev/null +++ b/fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a @@ -0,0 +1,92 @@ +# [ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = testkey.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Queensland +stateOrProvinceName_value = + +localityName = Locality Name (eg, city) +localityName_value = Brisbane + +organizationName = Organization Name (eg, company) +organizationName_default = +organizationName_value = CryptSoft Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = +organizationalUnitName_value = . + +commonName = Common Name (eg, YOUR name) +commonName_value = Eric Young + +emailAddress = Email Address +emailAddress_value = eay@mincom.oz.au diff --git a/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b b/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b new file mode 100644 index 0000000000..311136a3df --- /dev/null +++ b/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:20001231235959Z + diff --git a/fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 b/fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 new file mode 100644 index 0000000000..a276a04715 --- /dev/null +++ b/fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 @@ -0,0 +1,24 @@ +# [ v3_req ] +extendedKeyUsage = clientAuth +subjectKeyIdentifier = hash +basicConstraints = CA:false + +#################################################################### +[ req ] +default_bits = 2432 +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only + +req_extensions = v3_req # The extensions to add to a certificate request + +[ req_DN ] +commonName = "Common Name" +commonName_value = "A user" +userId = "User ID" +userId_value = "test" + +[ v3_req ] +extendedKeyUsage = clientAuth +subjectKeyIdentifier = hash +basicConstraints = CA:false diff --git a/fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f b/fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f new file mode 100644 index 0000000000..366b80bf41 --- /dev/null +++ b/fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:IMP:1,IMP:1,NULL + diff --git a/fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 b/fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 new file mode 100644 index 0000000000..e8ffb437cb --- /dev/null +++ b/fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 @@ -0,0 +1,377 @@ +# [ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = sys\$disk:[.demoCA # Where everything is kept +certs = $dir.certs] # Where the issued certs are kept +crl_dir = $dir.crl] # Where the issued crl are kept +database = $dir]index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir.newcerts] # default place for new certs. + +certificate = $dir]cacert.pem # The CA certificate +serial = $dir]serial. # The current serial number +crlnumber = $dir]crlnumber. # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir]crl.pem # The current CRL +private_key = $dir.private]cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 b/fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 new file mode 100644 index 0000000000..5e8ad5d2b5 --- /dev/null +++ b/fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 @@ -0,0 +1,7 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SEQUENCE:pkcs8 + +[pkcs8] +vers = INT:0 +alg = SEQWRAP,OID:1.3.101.112 +key = FORMAT:HEX,OCTWRAP,OCT:9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 + diff --git a/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 b/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 new file mode 100644 index 0000000000..5cd1829426 --- /dev/null +++ b/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,T61:☃ + diff --git a/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 b/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 new file mode 100644 index 0000000000..9d3715854b --- /dev/null +++ b/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include=conf-includes diff --git a/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a b/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a new file mode 100644 index 0000000000..652b4ac14f --- /dev/null +++ b/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BITSTR:hello + diff --git a/fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a b/fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a new file mode 100644 index 0000000000..80641498d2 --- /dev/null +++ b/fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a @@ -0,0 +1,21 @@ +# [p_test_configured] +module = p_test.dylib +activate = 1 +greeting = Hello OpenSSL, greetings from Test Provider + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + + +openssl_conf = openssl_init + +[openssl_init] +providers = providers + +[providers] +p_test_configured = p_test_configured + +[p_test_configured] +module = p_test.dylib +activate = 1 +greeting = Hello OpenSSL, greetings from Test Provider diff --git a/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 b/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 new file mode 100644 index 0000000000..f320569012 --- /dev/null +++ b/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,BMP:☃ + diff --git a/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c b/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c new file mode 100644 index 0000000000..c7f42d2dde --- /dev/null +++ b/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INTEGER + diff --git a/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd b/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd new file mode 100644 index 0000000000..b18c3cea0f --- /dev/null +++ b/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:20001231235959Z + diff --git a/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 b/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 new file mode 100644 index 0000000000..2091646a87 --- /dev/null +++ b/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,IA5:☃ + diff --git a/fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 b/fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 new file mode 100644 index 0000000000..a71e8ad049 --- /dev/null +++ b/fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 @@ -0,0 +1,65 @@ +# [ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +[ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC diff --git a/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf b/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf new file mode 100644 index 0000000000..7bfbc53eda --- /dev/null +++ b/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf @@ -0,0 +1,2 @@ +basicConstraints = critical,CA:true + diff --git a/fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 b/fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 new file mode 100644 index 0000000000..eb24a6dfc0 --- /dev/null +++ b/fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 @@ -0,0 +1,24 @@ +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# +# create RSA certs - CA + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +distinguished_name = req_distinguished_name +encrypt_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = ES +countryName_value = ES + +organizationName = Organization Name (eg, company) +organizationName_value = Hermanos Locos + +commonName = Common Name (eg, YOUR name) +commonName_value = Hermanos Locos CA + diff --git a/fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e b/fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e new file mode 100644 index 0000000000..81432ae2cf --- /dev/null +++ b/fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e @@ -0,0 +1,383 @@ +# [ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f b/fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f new file mode 100644 index 0000000000..3fc5ba9c42 --- /dev/null +++ b/fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f @@ -0,0 +1,168 @@ +# [ ca ] +default_ca = CA_default # The default ca section + + +# +# This config is used by the Time Stamp Authority tests. +# + +RANDFILE = ./.rnd + +# Extra OBJECT IDENTIFIER info: +oid_section = new_oids + +TSDNSECT = ts_cert_dn +INDEX = 1 + +[ new_oids ] + +# Policies used by the TSA tests. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#---------------------------------------------------------------------- +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] + +dir = ./demoCA +certs = $dir/certs # Where the issued certs are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_md = sha256 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = supplied +stateOrProvinceName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#---------------------------------------------------------------------- +[ req ] +default_bits = 2048 +default_md = sha1 +distinguished_name = $ENV::TSDNSECT +encrypt_rsa_key = no +prompt = no +# attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +string_mask = nombstr + +[ ts_ca_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Budapest +organizationName = Gov-CA Ltd. +commonName = ca1 + +[ ts_cert_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Buda +organizationName = Hun-TSA Ltd. +commonName = tsa$ENV::INDEX + +[ tsa_cert ] + +# TSA server cert is not a CA cert. +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ non_tsa_cert ] + +# This is not a CA cert and not a TSA cert, either (timeStamping usage missing) +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +# timeStamping is not supported by this certificate +# extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ v3_req ] + +# Extensions to add to a certificate request +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature + +[ v3_ca ] + +# Extensions for a typical CA + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true +keyUsage = cRLSign, keyCertSign + +#---------------------------------------------------------------------- +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert1.pem # The TSA signing certificate + # (optional) +certs = $dir/tsaca.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key1.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = yes # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha256 # algorithm to compute certificate + # identifier (optional, default: sha1) + +[ tsa_config2 ] + +# This configuration uses a certificate which doesn't have timeStamping usage. +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert2.pem # The TSA signing certificate + # (optional) +certs = $dir/demoCA/cacert.pem# Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key2.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) diff --git a/fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 b/fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 new file mode 100644 index 0000000000..f5006868e1 --- /dev/null +++ b/fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 @@ -0,0 +1,64 @@ +# [ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae b/fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae new file mode 100644 index 0000000000..b328763528 --- /dev/null +++ b/fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae @@ -0,0 +1,15 @@ +openssl_conf = openssl_init + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + +[openssl_init] +providers = provider_sect + +[provider_sect] +default = default_sect + +[default_sect] +activate = 1 + + diff --git a/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec b/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec new file mode 100644 index 0000000000..b30c2ac09f --- /dev/null +++ b/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:-1,NULL + diff --git a/fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 b/fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 new file mode 100644 index 0000000000..91f796947a --- /dev/null +++ b/fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 @@ -0,0 +1,19 @@ +#################################################################### +[ req ] +default_bits = 2432 +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only + +req_extensions = v3_req # The extensions to add to a certificate request + +[ req_DN ] +commonName = "Common Name" +commonName_value = "A user" +userId = "User ID" +userId_value = "test" + +[ v3_req ] +extendedKeyUsage = clientAuth +subjectKeyIdentifier = hash +basicConstraints = CA:false diff --git a/fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 b/fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 new file mode 100644 index 0000000000..163bbe1d7a --- /dev/null +++ b/fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 @@ -0,0 +1,63 @@ +# [ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + + +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f b/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f new file mode 100644 index 0000000000..1b7e522e59 --- /dev/null +++ b/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:536870912,NULL + diff --git a/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c b/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c new file mode 100644 index 0000000000..3c509c4f4c --- /dev/null +++ b/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,UTC:abcd + diff --git a/fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 b/fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 new file mode 100644 index 0000000000..5a5d7c698b --- /dev/null +++ b/fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 @@ -0,0 +1,31 @@ +# [ req ] +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# +# hacked by iang to do DSA certs - Server + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = ES +countryName_value = ES + +organizationName = Organization Name (eg, company) +organizationName_value = Tortilleras S.A. + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Torti + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Gordita + diff --git a/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 b/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 new file mode 100644 index 0000000000..af4044f251 --- /dev/null +++ b/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,IA5:abcd + diff --git a/fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 b/fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 new file mode 100644 index 0000000000..e64cc9f3a6 --- /dev/null +++ b/fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 @@ -0,0 +1,350 @@ +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = sys\$disk:[.demoCA # Where everything is kept +certs = $dir.certs] # Where the issued certs are kept +crl_dir = $dir.crl] # Where the issued crl are kept +database = $dir]index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir.newcerts] # default place for new certs. + +certificate = $dir]cacert.pem # The CA certificate +serial = $dir]serial. # The current serial number +crlnumber = $dir]crlnumber. # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir]crl.pem # The current CRL +private_key = $dir.private]cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 b/fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 new file mode 100644 index 0000000000..93f589992c --- /dev/null +++ b/fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 @@ -0,0 +1,393 @@ +# [ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 b/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 new file mode 100644 index 0000000000..e8df30af98 --- /dev/null +++ b/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:1 + diff --git a/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 b/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 new file mode 100644 index 0000000000..2a65595263 --- /dev/null +++ b/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SEQ + diff --git a/fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b b/fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b new file mode 100644 index 0000000000..ff379381bd --- /dev/null +++ b/fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b @@ -0,0 +1,80 @@ +# [ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# +# OpenSSL configuration file to create apps directory certificates +# + +# This definition stops the following lines choking if HOME or CN +# is undefined. +HOME = . +RANDFILE = $ENV::HOME/.rnd +CN = "Not Defined" + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +# Don't prompt for fields: use those in section directly +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = v3_ca # The extensions to add to the self signed cert +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = UK + +organizationName = OpenSSL Group +organizationalUnitName = FOR TESTING PURPOSES ONLY +# Take CN from environment so it can come from a script. +commonName = $ENV::CN + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +[ ec_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyAgreement + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign + + diff --git a/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 b/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 new file mode 100644 index 0000000000..078db6e484 --- /dev/null +++ b/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:001231235959Z + diff --git a/fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 b/fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 new file mode 100644 index 0000000000..22325e3a0f --- /dev/null +++ b/fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 @@ -0,0 +1,74 @@ +# [ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 b/fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 new file mode 100644 index 0000000000..695ccce3ca --- /dev/null +++ b/fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 @@ -0,0 +1,30 @@ +# [ req ] +distinguished_name = req_distinguished_name +encrypt_key = no + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# +# create RSA certs - Server + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +distinguished_name = req_distinguished_name +encrypt_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = ES +countryName_value = ES + +organizationName = Organization Name (eg, company) +organizationName_value = Tortilleras S.A. + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Torti + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Gordita diff --git a/fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 b/fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 new file mode 100644 index 0000000000..984050da53 --- /dev/null +++ b/fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 @@ -0,0 +1,361 @@ +# [ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = sys\$disk:[.demoCA # Where everything is kept +certs = $dir.certs] # Where the issued certs are kept +crl_dir = $dir.crl] # Where the issued crl are kept +database = $dir]index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir.newcerts] # default place for new certs. + +certificate = $dir]cacert.pem # The CA certificate +serial = $dir]serial. # The current serial number +crlnumber = $dir]crlnumber. # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir]crl.pem # The current CRL +private_key = $dir.private]cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a b/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a new file mode 100644 index 0000000000..f141d8cafb --- /dev/null +++ b/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:-10 + diff --git a/fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 b/fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 new file mode 100644 index 0000000000..2f34319e5b --- /dev/null +++ b/fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 @@ -0,0 +1,62 @@ +# [ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 b/fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 new file mode 100644 index 0000000000..2efe65399f --- /dev/null +++ b/fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = DER:00:01:02:03:04 + diff --git a/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 b/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 new file mode 100644 index 0000000000..793dc58c66 --- /dev/null +++ b/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTF8:hello + diff --git a/fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b b/fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b new file mode 100644 index 0000000000..e6118dc816 --- /dev/null +++ b/fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b @@ -0,0 +1,37 @@ +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:AB diff --git a/fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 b/fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 new file mode 100644 index 0000000000..df059f24b5 --- /dev/null +++ b/fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 @@ -0,0 +1,19 @@ +# [openssl_init] +providers = providers + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + + +openssl_conf = openssl_init + +[openssl_init] +providers = providers + +[providers] +p_test_configured = p_test_configured + +[p_test_configured] +module = p_test.dylib +activate = 1 +greeting = Hello OpenSSL, greetings from Test Provider diff --git a/fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 b/fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 new file mode 100644 index 0000000000..e81c6be43f --- /dev/null +++ b/fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OID:2.5.29.19 + diff --git a/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e b/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e new file mode 100644 index 0000000000..a1e26adeb3 --- /dev/null +++ b/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL,invalid + diff --git a/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a b/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a new file mode 100644 index 0000000000..e5196faa8b --- /dev/null +++ b/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOL:yes + diff --git a/fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 b/fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 new file mode 100644 index 0000000000..4ac4faed36 --- /dev/null +++ b/fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:IMP:1,EXP:1,NULL + diff --git a/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 b/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 new file mode 100644 index 0000000000..f6f7c24454 --- /dev/null +++ b/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,IA5:abcd + diff --git a/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 b/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 new file mode 100644 index 0000000000..6f69d321e2 --- /dev/null +++ b/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 @@ -0,0 +1,2 @@ +basicConstraints = critical,@section + diff --git a/fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc b/fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc new file mode 100644 index 0000000000..c173a313f3 --- /dev/null +++ b/fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc @@ -0,0 +1,52 @@ +# [ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +[ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC diff --git a/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 b/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 new file mode 100644 index 0000000000..5ba1e55fa3 --- /dev/null +++ b/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 @@ -0,0 +1,4 @@ +basicConstraints = critical,@section +[section] +CA = true + diff --git a/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 b/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 new file mode 100644 index 0000000000..1737b70d18 --- /dev/null +++ b/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include includes.cnf diff --git a/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 b/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 new file mode 100644 index 0000000000..d4b675b0de --- /dev/null +++ b/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,T61:÷ + diff --git a/fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 b/fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 new file mode 100644 index 0000000000..835b2c672d --- /dev/null +++ b/fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 @@ -0,0 +1,66 @@ +# +# OpenSSL example configuration file for automated certificate creation. +# + +# This definition stops the following lines choking if HOME or CN +# is undefined. +HOME = . +RANDFILE = $ENV::HOME/.rnd +CN = "Not Defined" +default_ca = ca + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +# Don't prompt for fields: use those in section directly +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = v3_ca # The extensions to add to the self signed cert +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = UK + +organizationName = OpenSSL Group +# Take CN from environment so it can come from a script. +commonName = $ENV::CN + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ dh_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# DH certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, keyAgreement + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign + diff --git a/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 b/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 new file mode 100644 index 0000000000..ad67743ca2 --- /dev/null +++ b/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UTF8:☃ + diff --git a/fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b b/fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b new file mode 100644 index 0000000000..b3a5a64c3f --- /dev/null +++ b/fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b @@ -0,0 +1,19 @@ +# [ default_conf ] + +ssl_conf = ssl_sect + +# Configuration file to test system default SSL configuration + +openssl_conf = default_conf + +[ default_conf ] + +ssl_conf = ssl_sect + +[ssl_sect] + +system_default = ssl_default_sect + +[ssl_default_sect] +MaxProtocol = TLSv1.2 +MinProtocol = TLSv1.2 diff --git a/fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 b/fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 new file mode 100644 index 0000000000..4a1b3fa9a4 --- /dev/null +++ b/fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 @@ -0,0 +1,361 @@ +# [ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c b/fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c new file mode 100644 index 0000000000..5473d837c1 --- /dev/null +++ b/fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c @@ -0,0 +1,15 @@ +# Configuration file to test system default SSL configuration + +openssl_conf = default_conf + +[ default_conf ] + +ssl_conf = ssl_sect + +[ssl_sect] + +system_default = ssl_default_sect + +[ssl_default_sect] +MaxProtocol = TLSv1.2 +MinProtocol = TLSv1.2 diff --git a/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 b/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 new file mode 100644 index 0000000000..0e0244e77f --- /dev/null +++ b/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:ENUM:0 + diff --git a/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 b/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 new file mode 100644 index 0000000000..345eeb9884 --- /dev/null +++ b/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include conf-includes diff --git a/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 b/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 new file mode 100644 index 0000000000..8e133004ab --- /dev/null +++ b/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,IA5:hello + diff --git a/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 b/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 new file mode 100644 index 0000000000..affc9292fb --- /dev/null +++ b/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,OCT:0123abcd + diff --git a/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f b/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f new file mode 100644 index 0000000000..fd71c48fd6 --- /dev/null +++ b/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:invalid + diff --git a/fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 b/fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 new file mode 100644 index 0000000000..23f29ab772 --- /dev/null +++ b/fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 @@ -0,0 +1,357 @@ +# [ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d b/fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d new file mode 100644 index 0000000000..3f9f1a0423 --- /dev/null +++ b/fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d @@ -0,0 +1,104 @@ +# [ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +x509_extensions = v3_ca # The extensions to add to the cert + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_anything + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha1 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +commonName = Common Name (eg, YOUR name) +commonName_value = Dodgy CA + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +x509_extensions = v3_ca # The extensions to add to the cert + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + + + +[ v3_ca ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true,pathlen:1 +keyUsage = cRLSign, keyCertSign +issuerAltName=issuer:copy diff --git a/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f b/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f new file mode 100644 index 0000000000..19ed239e36 --- /dev/null +++ b/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OBJECT:invalid + diff --git a/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea b/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea new file mode 100644 index 0000000000..c395a158ee --- /dev/null +++ b/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:001231235959Z + diff --git a/fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec b/fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec new file mode 100644 index 0000000000..5114f02626 --- /dev/null +++ b/fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec @@ -0,0 +1,357 @@ +# [ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a b/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a new file mode 100644 index 0000000000..856561f495 --- /dev/null +++ b/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:invalid,IA5:abcd + diff --git a/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a b/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a new file mode 100644 index 0000000000..b8f5f40b0a --- /dev/null +++ b/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OBJECT:basicConstraints + diff --git a/fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 b/fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 new file mode 100644 index 0000000000..e01504fa59 --- /dev/null +++ b/fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 @@ -0,0 +1,357 @@ +# [ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = sys\$disk:[.demoCA # Where everything is kept +certs = $dir.certs] # Where the issued certs are kept +crl_dir = $dir.crl] # Where the issued crl are kept +database = $dir]index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir.newcerts] # default place for new certs. + +certificate = $dir]cacert.pem # The CA certificate +serial = $dir]serial. # The current serial number +crlnumber = $dir]crlnumber. # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir]crl.pem # The current CRL +private_key = $dir.private]cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 b/fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 new file mode 100644 index 0000000000..3566bb0565 --- /dev/null +++ b/fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 @@ -0,0 +1,43 @@ +# [ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:AB + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:AB diff --git a/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf b/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf new file mode 100644 index 0000000000..ab13474192 --- /dev/null +++ b/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,OCT:abcd + diff --git a/fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b b/fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b new file mode 100644 index 0000000000..4501af1228 --- /dev/null +++ b/fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b @@ -0,0 +1,45 @@ +# [ default ] +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ default ] +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + diff --git a/fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 b/fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 new file mode 100644 index 0000000000..ea2ec34cbb --- /dev/null +++ b/fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 @@ -0,0 +1,79 @@ +# [ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign + + +# +# OpenSSL example configuration file for automated certificate creation. +# + +# This definition stops the following lines choking if HOME or CN +# is undefined. +HOME = . +RANDFILE = $ENV::HOME/.rnd +CN = "Not Defined" +default_ca = ca + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +# Don't prompt for fields: use those in section directly +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = v3_ca # The extensions to add to the self signed cert +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = UK + +organizationName = OpenSSL Group +# Take CN from environment so it can come from a script. +commonName = $ENV::CN + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ dh_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# DH certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, keyAgreement + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign + diff --git a/fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe b/fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe new file mode 100644 index 0000000000..70655275af --- /dev/null +++ b/fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe @@ -0,0 +1,176 @@ +# [ req ] +default_bits = 2048 +default_md = sha1 +distinguished_name = $ENV::TSDNSECT +encrypt_rsa_key = no +prompt = no +# attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +string_mask = nombstr + + +# +# This config is used by the Time Stamp Authority tests. +# + +RANDFILE = ./.rnd + +# Extra OBJECT IDENTIFIER info: +oid_section = new_oids + +TSDNSECT = ts_cert_dn +INDEX = 1 + +[ new_oids ] + +# Policies used by the TSA tests. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#---------------------------------------------------------------------- +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] + +dir = ./demoCA +certs = $dir/certs # Where the issued certs are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_md = sha256 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = supplied +stateOrProvinceName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#---------------------------------------------------------------------- +[ req ] +default_bits = 2048 +default_md = sha1 +distinguished_name = $ENV::TSDNSECT +encrypt_rsa_key = no +prompt = no +# attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +string_mask = nombstr + +[ ts_ca_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Budapest +organizationName = Gov-CA Ltd. +commonName = ca1 + +[ ts_cert_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Buda +organizationName = Hun-TSA Ltd. +commonName = tsa$ENV::INDEX + +[ tsa_cert ] + +# TSA server cert is not a CA cert. +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ non_tsa_cert ] + +# This is not a CA cert and not a TSA cert, either (timeStamping usage missing) +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +# timeStamping is not supported by this certificate +# extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ v3_req ] + +# Extensions to add to a certificate request +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature + +[ v3_ca ] + +# Extensions for a typical CA + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true +keyUsage = cRLSign, keyCertSign + +#---------------------------------------------------------------------- +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert1.pem # The TSA signing certificate + # (optional) +certs = $dir/tsaca.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key1.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = yes # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha256 # algorithm to compute certificate + # identifier (optional, default: sha1) + +[ tsa_config2 ] + +# This configuration uses a certificate which doesn't have timeStamping usage. +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert2.pem # The TSA signing certificate + # (optional) +certs = $dir/demoCA/cacert.pem# Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key2.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) diff --git a/fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc b/fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc new file mode 100644 index 0000000000..ba84ff4dff --- /dev/null +++ b/fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:0,EXP:16U,EXP:100A,EXP:1000C,OCTWRAP,SEQWRAP,SETWRAP,BITWRAP,NULL + diff --git a/fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 b/fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 new file mode 100644 index 0000000000..b8860e9067 --- /dev/null +++ b/fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 @@ -0,0 +1,357 @@ +# [ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = sys\$disk:[.demoCA # Where everything is kept +certs = $dir.certs] # Where the issued certs are kept +crl_dir = $dir.crl] # Where the issued crl are kept +database = $dir]index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir.newcerts] # default place for new certs. + +certificate = $dir]cacert.pem # The CA certificate +serial = $dir]serial. # The current serial number +crlnumber = $dir]crlnumber. # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir]crl.pem # The current CRL +private_key = $dir.private]cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = sys\$disk:[.demoCA # TSA root directory +serial = $dir]tsaserial. # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir.cacert.pem] # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 b/fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 new file mode 100644 index 0000000000..3d889d524d --- /dev/null +++ b/fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 @@ -0,0 +1,65 @@ +# [ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 b/fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 new file mode 100644 index 0000000000..aa5e67c060 --- /dev/null +++ b/fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 @@ -0,0 +1,53 @@ +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = testkey.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Queensland +stateOrProvinceName_value = + +localityName = Locality Name (eg, city) +localityName_value = Brisbane + +organizationName = Organization Name (eg, company) +organizationName_default = +organizationName_value = CryptSoft Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = +organizationalUnitName_value = . + +commonName = Common Name (eg, YOUR name) +commonName_value = Eric Young + +emailAddress = Email Address +emailAddress_value = eay@mincom.oz.au diff --git a/fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b b/fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b new file mode 100644 index 0000000000..b718f41b4b --- /dev/null +++ b/fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b @@ -0,0 +1,25 @@ +# [ req_DN ] +commonName = "Common Name" +commonName_value = "A user" +userId = "User ID" +userId_value = "test" + +#################################################################### +[ req ] +default_bits = 2432 +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only + +req_extensions = v3_req # The extensions to add to a certificate request + +[ req_DN ] +commonName = "Common Name" +commonName_value = "A user" +userId = "User ID" +userId_value = "test" + +[ v3_req ] +extendedKeyUsage = clientAuth +subjectKeyIdentifier = hash +basicConstraints = CA:false diff --git a/fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 b/fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 new file mode 100644 index 0000000000..1eb106546a --- /dev/null +++ b/fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 @@ -0,0 +1,47 @@ +# [ req_distinguished_name ] +countryName = AU +organizationName = Dodgy Brothers +0.commonName = Brother 1 +1.commonName = $ENV::CN2 + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd +CN2 = Brother 2 + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 +prompt = no + +[ req_distinguished_name ] +countryName = AU +organizationName = Dodgy Brothers +0.commonName = Brother 1 +1.commonName = $ENV::CN2 + +[ v3_ee ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ee_dsa ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature + +[ v3_ee_ec ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature, keyAgreement + diff --git a/fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 b/fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 new file mode 100644 index 0000000000..62e4502d65 --- /dev/null +++ b/fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,OCT:invalid hex + diff --git a/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 b/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 new file mode 100644 index 0000000000..f5a58d6ce6 --- /dev/null +++ b/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:invalid + diff --git a/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b b/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b new file mode 100644 index 0000000000..12796ea39c --- /dev/null +++ b/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:-0x10 + diff --git a/fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a b/fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a new file mode 100644 index 0000000000..e643cfdbdf --- /dev/null +++ b/fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a @@ -0,0 +1,9 @@ +# This file specifies the Certificate Transparency logs +# that are to be trusted. + +# Google's list of logs can be found here: +# www.certificate-transparency.org/known-logs +# A Python program to convert the log list to OpenSSL's format can be +# found here: +# https://github.com/google/certificate-transparency/blob/master/python/utilities/log_list/print_log_list.py +# Use the "--openssl_output" flag. diff --git a/fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 b/fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 new file mode 100644 index 0000000000..336363f115 --- /dev/null +++ b/fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 @@ -0,0 +1,14 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SEQ:seq + +[seq] +val1 = NULL +val2 = IA5:a +val3 = SET:set +[set] +# Config names do not matter, only the order. +val4 = INT:1 +val3 = INT:2 +val2 = SEQ:empty +val1 = INT:3 +[empty] + diff --git a/fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 b/fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 new file mode 100644 index 0000000000..1c71be9b97 --- /dev/null +++ b/fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1: EXP:0 , IA5: a, b + diff --git a/fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 b/fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 new file mode 100644 index 0000000000..b2678b541e --- /dev/null +++ b/fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 @@ -0,0 +1,404 @@ +# [ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f b/fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f new file mode 100644 index 0000000000..ffaeb92430 --- /dev/null +++ b/fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f @@ -0,0 +1,404 @@ +# [ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 b/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 new file mode 100644 index 0000000000..b844928ba9 --- /dev/null +++ b/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:IA5:hello + diff --git a/fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f b/fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f new file mode 100644 index 0000000000..c474c9b89f --- /dev/null +++ b/fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f @@ -0,0 +1,83 @@ +# [ v3_ca ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true,pathlen:1 +keyUsage = cRLSign, keyCertSign +issuerAltName=issuer:copy + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha1 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +commonName = Common Name (eg, YOUR name) +commonName_value = Dodgy CA + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +x509_extensions = v3_ca # The extensions to add to the cert + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + + + +[ v3_ca ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true,pathlen:1 +keyUsage = cRLSign, keyCertSign +issuerAltName=issuer:copy diff --git a/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d b/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d new file mode 100644 index 0000000000..efed26644b --- /dev/null +++ b/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,PRINTABLE:hello + diff --git a/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 b/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 new file mode 100644 index 0000000000..5af22215e9 --- /dev/null +++ b/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:T61:hello + diff --git a/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 b/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 new file mode 100644 index 0000000000..34df69ea3e --- /dev/null +++ b/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = DER:invalid hex + diff --git a/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d b/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d new file mode 100644 index 0000000000..0d60975534 --- /dev/null +++ b/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN + diff --git a/fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 b/fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 new file mode 100644 index 0000000000..1e53f28f0d --- /dev/null +++ b/fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:IMP:1A,OCTWRAP,IMP:10,SEQWRAP,IMP:100,SETWRAP,IMP:1000,BITWRAP,IMP:10000,NULL + diff --git a/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede b/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede new file mode 100644 index 0000000000..00364439b2 --- /dev/null +++ b/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UTF8: + diff --git a/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 b/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 new file mode 100644 index 0000000000..a7355cdf33 --- /dev/null +++ b/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:PRINTABLE:hello + diff --git a/fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 b/fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 new file mode 100644 index 0000000000..35df398257 --- /dev/null +++ b/fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 @@ -0,0 +1,73 @@ +# [ req_distinguished_name ] +countryName = UK + +organizationName = OpenSSL Group +# Take CN from environment so it can come from a script. +commonName = $ENV::CN + +# +# OpenSSL example configuration file for automated certificate creation. +# + +# This definition stops the following lines choking if HOME or CN +# is undefined. +HOME = . +RANDFILE = $ENV::HOME/.rnd +CN = "Not Defined" +default_ca = ca + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +# Don't prompt for fields: use those in section directly +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = v3_ca # The extensions to add to the self signed cert +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = UK + +organizationName = OpenSSL Group +# Take CN from environment so it can come from a script. +commonName = $ENV::CN + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, nonRepudiation, digitalSignature, keyEncipherment + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ dh_cert ] + +# These extensions are added when 'ca' signs a request for an end entity +# DH certificate + +basicConstraints=critical, CA:FALSE +keyUsage=critical, keyAgreement + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid + +[ v3_ca ] + + +# Extensions for a typical CA + +# PKIX recommendation. + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = critical,CA:true +keyUsage = critical, cRLSign, keyCertSign + diff --git a/fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 b/fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 new file mode 100644 index 0000000000..1fb0855f54 --- /dev/null +++ b/fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 @@ -0,0 +1,19 @@ +# [ssl_sect] + +system_default = ssl_default_sect + +# Configuration file to test system default SSL configuration + +openssl_conf = default_conf + +[ default_conf ] + +ssl_conf = ssl_sect + +[ssl_sect] + +system_default = ssl_default_sect + +[ssl_default_sect] +MaxProtocol = TLSv1.2 +MinProtocol = TLSv1.2 diff --git a/fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 b/fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 new file mode 100644 index 0000000000..66c89006d0 --- /dev/null +++ b/fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 @@ -0,0 +1,36 @@ +[ default ] +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + diff --git a/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 b/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 new file mode 100644 index 0000000000..5ee247ace9 --- /dev/null +++ b/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OCT:hello + diff --git a/fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 b/fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 new file mode 100644 index 0000000000..ab764403a4 --- /dev/null +++ b/fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 @@ -0,0 +1,9 @@ +# Example configuration file +# Connects to the default port of s_server +Connect = localhost:4433 +# Disable TLS v1.2 for test. +# Protocol = ALL, -TLSv1.2 +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 diff --git a/fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 b/fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 new file mode 100644 index 0000000000..b23ebd0ada --- /dev/null +++ b/fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 @@ -0,0 +1,190 @@ +# [ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert1.pem # The TSA signing certificate + # (optional) +certs = $dir/tsaca.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key1.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = yes # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha256 # algorithm to compute certificate + # identifier (optional, default: sha1) + + +# +# This config is used by the Time Stamp Authority tests. +# + +RANDFILE = ./.rnd + +# Extra OBJECT IDENTIFIER info: +oid_section = new_oids + +TSDNSECT = ts_cert_dn +INDEX = 1 + +[ new_oids ] + +# Policies used by the TSA tests. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#---------------------------------------------------------------------- +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] + +dir = ./demoCA +certs = $dir/certs # Where the issued certs are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_md = sha256 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = supplied +stateOrProvinceName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#---------------------------------------------------------------------- +[ req ] +default_bits = 2048 +default_md = sha1 +distinguished_name = $ENV::TSDNSECT +encrypt_rsa_key = no +prompt = no +# attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +string_mask = nombstr + +[ ts_ca_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Budapest +organizationName = Gov-CA Ltd. +commonName = ca1 + +[ ts_cert_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Buda +organizationName = Hun-TSA Ltd. +commonName = tsa$ENV::INDEX + +[ tsa_cert ] + +# TSA server cert is not a CA cert. +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ non_tsa_cert ] + +# This is not a CA cert and not a TSA cert, either (timeStamping usage missing) +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +# timeStamping is not supported by this certificate +# extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ v3_req ] + +# Extensions to add to a certificate request +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature + +[ v3_ca ] + +# Extensions for a typical CA + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true +keyUsage = cRLSign, keyCertSign + +#---------------------------------------------------------------------- +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert1.pem # The TSA signing certificate + # (optional) +certs = $dir/tsaca.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key1.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = yes # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha256 # algorithm to compute certificate + # identifier (optional, default: sha1) + +[ tsa_config2 ] + +# This configuration uses a certificate which doesn't have timeStamping usage. +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert2.pem # The TSA signing certificate + # (optional) +certs = $dir/demoCA/cacert.pem# Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key2.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) diff --git a/fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 b/fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 new file mode 100644 index 0000000000..ebb352dc84 --- /dev/null +++ b/fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 @@ -0,0 +1,33 @@ +# [server_sect] +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 +# Certificates and keys +RSA.Certificate=server.pem +ECDSA.Certificate=server-ec.pem + +# Example config module configuration + +# Name supplied by application to CONF_modules_load_file +# and section containing configuration +testapp = test_sect + +[test_sect] +# list of configuration modules + +# SSL configuration module +ssl_conf = ssl_sect + +[ssl_sect] +# list of SSL configurations +server = server_sect + +[server_sect] +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 +# Certificates and keys +RSA.Certificate=server.pem +ECDSA.Certificate=server-ec.pem diff --git a/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 b/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 new file mode 100644 index 0000000000..6f1d8151ef --- /dev/null +++ b/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN:NO + diff --git a/fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f b/fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f new file mode 100644 index 0000000000..24ba4b62d9 --- /dev/null +++ b/fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f @@ -0,0 +1,51 @@ +# [ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +[ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC diff --git a/fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 b/fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 new file mode 100644 index 0000000000..4acca4b044 --- /dev/null +++ b/fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 @@ -0,0 +1,350 @@ +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 b/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 new file mode 100644 index 0000000000..05c1930730 --- /dev/null +++ b/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN:TRUE + diff --git a/fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c b/fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c new file mode 100644 index 0000000000..62e460c9e8 --- /dev/null +++ b/fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c @@ -0,0 +1,79 @@ +# [ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Queensland +stateOrProvinceName_value = + +localityName = Locality Name (eg, city) +localityName_value = Brisbane + +organizationName = Organization Name (eg, company) +organizationName_default = +organizationName_value = CryptSoft Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = +organizationalUnitName_value = . + +commonName = Common Name (eg, YOUR name) +commonName_value = Eric Young + +emailAddress = Email Address +emailAddress_value = eay@mincom.oz.au + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = testkey.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Queensland +stateOrProvinceName_value = + +localityName = Locality Name (eg, city) +localityName_value = Brisbane + +organizationName = Organization Name (eg, company) +organizationName_default = +organizationName_value = CryptSoft Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = +organizationalUnitName_value = . + +commonName = Common Name (eg, YOUR name) +commonName_value = Eric Young + +emailAddress = Email Address +emailAddress_value = eay@mincom.oz.au diff --git a/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 b/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 new file mode 100644 index 0000000000..b875fbeecb --- /dev/null +++ b/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SET:missing_confdb + diff --git a/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 b/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 new file mode 100644 index 0000000000..74c29bb579 --- /dev/null +++ b/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,PRINTABLE:☃ + diff --git a/fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f b/fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f new file mode 100644 index 0000000000..cb0cefba75 --- /dev/null +++ b/fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f @@ -0,0 +1,17 @@ +# Example configuration file +# Port to listen on +Port = 4433 +# Disable TLS v1.2 for test. +# Protocol = ALL, -TLSv1.2 +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 +Certificate=server.pem +PrivateKey=server.pem +ChainCAFile=root.pem +VerifyCAFile=root.pem + +# Request certificate +VerifyMode=Request +ClientCAFile=root.pem diff --git a/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf b/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf new file mode 100644 index 0000000000..1db545300d --- /dev/null +++ b/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SET + diff --git a/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 b/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 new file mode 100644 index 0000000000..bb6f6d2047 --- /dev/null +++ b/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UNIV:☃ + diff --git a/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e b/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e new file mode 100644 index 0000000000..42aa081fce --- /dev/null +++ b/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:ENUMERATED:0 + diff --git a/fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 b/fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 new file mode 100644 index 0000000000..e679173a6f --- /dev/null +++ b/fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 @@ -0,0 +1,44 @@ +# [ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:1,policy:text:AB diff --git a/fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 b/fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 new file mode 100644 index 0000000000..f655e7448d --- /dev/null +++ b/fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 @@ -0,0 +1,41 @@ +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd +CN2 = Brother 2 + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 +prompt = no + +[ req_distinguished_name ] +countryName = AU +organizationName = Dodgy Brothers +0.commonName = Brother 1 +1.commonName = $ENV::CN2 + +[ v3_ee ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ee_dsa ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature + +[ v3_ee_ec ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always +basicConstraints = CA:false +keyUsage = nonRepudiation, digitalSignature, keyAgreement + diff --git a/fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 b/fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 new file mode 100644 index 0000000000..fe32e8d190 --- /dev/null +++ b/fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 @@ -0,0 +1,112 @@ +# [ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = testkey.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Queensland +stateOrProvinceName_value = + +localityName = Locality Name (eg, city) +localityName_value = Brisbane + +organizationName = Organization Name (eg, company) +organizationName_default = +organizationName_value = CryptSoft Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = +organizationalUnitName_value = . + +commonName = Common Name (eg, YOUR name) +commonName_value = Eric Young + +emailAddress = Email Address +emailAddress_value = eay@mincom.oz.au diff --git a/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 b/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 new file mode 100644 index 0000000000..729aa2b90b --- /dev/null +++ b/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BMP:hello + diff --git a/fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d b/fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d new file mode 100644 index 0000000000..b20a242760 --- /dev/null +++ b/fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d @@ -0,0 +1,76 @@ +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha1 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +commonName = Common Name (eg, YOUR name) +commonName_value = Dodgy CA + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +x509_extensions = v3_ca # The extensions to add to the cert + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + + + +[ v3_ca ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true,pathlen:1 +keyUsage = cRLSign, keyCertSign +issuerAltName=issuer:copy diff --git a/fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 b/fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 new file mode 100644 index 0000000000..db43c1c2d5 --- /dev/null +++ b/fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 @@ -0,0 +1,50 @@ +# [ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +[ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC diff --git a/fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 b/fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 new file mode 100644 index 0000000000..d1642879be --- /dev/null +++ b/fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 @@ -0,0 +1,165 @@ + +# +# This config is used by the Time Stamp Authority tests. +# + +RANDFILE = ./.rnd + +# Extra OBJECT IDENTIFIER info: +oid_section = new_oids + +TSDNSECT = ts_cert_dn +INDEX = 1 + +[ new_oids ] + +# Policies used by the TSA tests. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#---------------------------------------------------------------------- +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] + +dir = ./demoCA +certs = $dir/certs # Where the issued certs are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_md = sha256 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = supplied +stateOrProvinceName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#---------------------------------------------------------------------- +[ req ] +default_bits = 2048 +default_md = sha1 +distinguished_name = $ENV::TSDNSECT +encrypt_rsa_key = no +prompt = no +# attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +string_mask = nombstr + +[ ts_ca_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Budapest +organizationName = Gov-CA Ltd. +commonName = ca1 + +[ ts_cert_dn ] +countryName = HU +stateOrProvinceName = Budapest +localityName = Buda +organizationName = Hun-TSA Ltd. +commonName = tsa$ENV::INDEX + +[ tsa_cert ] + +# TSA server cert is not a CA cert. +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ non_tsa_cert ] + +# This is not a CA cert and not a TSA cert, either (timeStamping usage missing) +basicConstraints=CA:FALSE + +# The following key usage flags are needed for TSA server certificates. +keyUsage = nonRepudiation, digitalSignature +# timeStamping is not supported by this certificate +# extendedKeyUsage = critical,timeStamping + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always + +[ v3_req ] + +# Extensions to add to a certificate request +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature + +[ v3_ca ] + +# Extensions for a typical CA + +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true +keyUsage = cRLSign, keyCertSign + +#---------------------------------------------------------------------- +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert1.pem # The TSA signing certificate + # (optional) +certs = $dir/tsaca.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key1.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = yes # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha256 # algorithm to compute certificate + # identifier (optional, default: sha1) + +[ tsa_config2 ] + +# This configuration uses a certificate which doesn't have timeStamping usage. +# These are used by the TSA reply generation only. +dir = . # TSA root directory +serial = $dir/tsa_serial # The current serial number (mandatory) +signer_cert = $dir/tsa_cert2.pem # The TSA signing certificate + # (optional) +certs = $dir/demoCA/cacert.pem# Certificate chain to include in reply + # (optional) +signer_key = $dir/tsa_key2.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) diff --git a/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 b/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 new file mode 100644 index 0000000000..f4c75cbe62 --- /dev/null +++ b/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:0 + diff --git a/fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 b/fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 new file mode 100644 index 0000000000..b0579ed97e --- /dev/null +++ b/fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 @@ -0,0 +1,83 @@ +# [ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha1 + +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha1 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +commonName = Common Name (eg, YOUR name) +commonName_value = Dodgy CA + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certificates with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +x509_extensions = v3_ca # The extensions to add to the cert + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. +preserve = no # keep passed DN ordering + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + + + +[ v3_ca ] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always +basicConstraints = critical,CA:true,pathlen:1 +keyUsage = cRLSign, keyCertSign +issuerAltName=issuer:copy diff --git a/fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f b/fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f new file mode 100644 index 0000000000..04ff275561 --- /dev/null +++ b/fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f @@ -0,0 +1,28 @@ +# [ssl_sect] +# list of SSL configurations +server = server_sect + +# Example config module configuration + +# Name supplied by application to CONF_modules_load_file +# and section containing configuration +testapp = test_sect + +[test_sect] +# list of configuration modules + +# SSL configuration module +ssl_conf = ssl_sect + +[ssl_sect] +# list of SSL configurations +server = server_sect + +[server_sect] +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 +# Certificates and keys +RSA.Certificate=server.pem +ECDSA.Certificate=server-ec.pem diff --git a/fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc b/fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc new file mode 100644 index 0000000000..c7da588c5d --- /dev/null +++ b/fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc @@ -0,0 +1,7 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SEQ:seq1 + +[seq1] +val = SEQ:seq2 +[seq2] +val = SEQ:seq1 + diff --git a/fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 b/fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 new file mode 100644 index 0000000000..9f3d29a416 --- /dev/null +++ b/fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 @@ -0,0 +1,19 @@ +# [providers] +p_test_configured = p_test_configured + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + + +openssl_conf = openssl_init + +[openssl_init] +providers = providers + +[providers] +p_test_configured = p_test_configured + +[p_test_configured] +module = p_test.dylib +activate = 1 +greeting = Hello OpenSSL, greetings from Test Provider diff --git a/fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 b/fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 new file mode 100644 index 0000000000..b670be000a --- /dev/null +++ b/fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 @@ -0,0 +1,358 @@ +# [ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 b/fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 new file mode 100644 index 0000000000..39ac54edd9 --- /dev/null +++ b/fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 @@ -0,0 +1,24 @@ +# Example config module configuration + +# Name supplied by application to CONF_modules_load_file +# and section containing configuration +testapp = test_sect + +[test_sect] +# list of configuration modules + +# SSL configuration module +ssl_conf = ssl_sect + +[ssl_sect] +# list of SSL configurations +server = server_sect + +[server_sect] +# Only support 3 curves +Curves = P-521:P-384:P-256 +# Restricted signature algorithms +SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512 +# Certificates and keys +RSA.Certificate=server.pem +ECDSA.Certificate=server-ec.pem diff --git a/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 b/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 new file mode 100644 index 0000000000..5ea32ebdd9 --- /dev/null +++ b/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = DER:0001020304 + diff --git a/fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb b/fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb new file mode 100644 index 0000000000..957ce59f67 --- /dev/null +++ b/fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb @@ -0,0 +1,379 @@ +# [ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +# +# OpenSSL example configuration file. +# This is mostly being used for generation of certificate requests. +# + +# Note that you can include other files from the main configuration +# file using the .include directive. +#.include filename + +# This definition stops the following lines choking if HOME isn't +# defined. +HOME = . + +# Extra OBJECT IDENTIFIER info: +#oid_file = $ENV::HOME/.oid +oid_section = new_oids + +# To use this configuration file with the "-extfile" option of the +# "openssl x509" utility, name here the section containing the +# X.509v3 extensions to use: +# extensions = +# (Alternatively, use a configuration file that has only +# X.509v3 extensions in its main [= default] section.) + +[ new_oids ] + +# We can add new OIDs in here for use by 'ca', 'req' and 'ts'. +# Add a simple OID like this: +# testoid1=1.2.3.4 +# Or use config file substitution like this: +# testoid2=${testoid1}.5.6 + +# Policies used by the TSA examples. +tsa_policy1 = 1.2.3.4.1 +tsa_policy2 = 1.2.3.4.5.6 +tsa_policy3 = 1.2.3.4.5.7 + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +#unique_subject = no # Set to 'no' to allow creation of + # several certs with same subject. +new_certs_dir = $dir/newcerts # default place for new certs. + +certificate = $dir/cacert.pem # The CA certificate +serial = $dir/serial # The current serial number +crlnumber = $dir/crlnumber # the current crl number + # must be commented out to leave a V1 CRL +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/cakey.pem# The private key + +x509_extensions = usr_cert # The extensions to add to the cert + +# Comment out the following two lines for the "traditional" +# (and highly broken) format. +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +# Extension copying option: use with caution. +# copy_extensions = copy + +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs +# so this is commented out by default to leave a V1 CRL. +# crlnumber must also be commented out to leave a V1 CRL. +# crl_extensions = crl_ext + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = default # use public key default MD +preserve = no # keep passed DN ordering + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + +# For the CA policy +[ policy_match ] +countryName = match +stateOrProvinceName = match +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +# For the 'anything' policy +# At this point in time, you must list all acceptable 'object' +# types. +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +attributes = req_attributes +x509_extensions = v3_ca # The extensions to add to the self signed cert + +# Passwords for private keys if not present they will be prompted for +# input_password = secret +# output_password = secret + +# This sets a mask for permitted string types. There are several options. +# default: PrintableString, T61String, BMPString. +# pkix : PrintableString, BMPString (PKIX recommendation before 2004) +# utf8only: only UTF8Strings (PKIX recommendation after 2004). +# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). +# MASK:XXXX a literal mask value. +# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. +string_mask = utf8only + +# req_extensions = v3_req # The extensions to add to a certificate request + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_min = 2 +countryName_max = 2 + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Some-State + +localityName = Locality Name (eg, city) + +0.organizationName = Organization Name (eg, company) +0.organizationName_default = Internet Widgits Pty Ltd + +# we can do this but it is not needed normally :-) +#1.organizationName = Second Organization Name (eg, company) +#1.organizationName_default = World Wide Web Pty Ltd + +organizationalUnitName = Organizational Unit Name (eg, section) +#organizationalUnitName_default = + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_max = 64 + +emailAddress = Email Address +emailAddress_max = 64 + +# SET-ex3 = SET extension number 3 + +[ req_attributes ] +challengePassword = A challenge password +challengePassword_min = 4 +challengePassword_max = 20 + +unstructuredName = An optional company name + +[ usr_cert ] + +# These extensions are added when 'ca' signs a request. + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This is required for TSA certificates. +# extendedKeyUsage = critical,timeStamping + +[ v3_req ] + +# Extensions to add to a certificate request + +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +[ v3_ca ] + + +# Extensions for a typical CA + + +# PKIX recommendation. + +subjectKeyIdentifier=hash + +authorityKeyIdentifier=keyid:always,issuer + +basicConstraints = critical,CA:true + +# Key usage: this is typical for a CA certificate. However since it will +# prevent it being used as an test self-signed certificate it is best +# left out by default. +# keyUsage = cRLSign, keyCertSign + +# Some might want this also +# nsCertType = sslCA, emailCA + +# Include email address in subject alt name: another PKIX recommendation +# subjectAltName=email:copy +# Copy issuer details +# issuerAltName=issuer:copy + +# DER hex encoding of an extension: beware experts only! +# obj=DER:02:03 +# Where 'obj' is a standard or added object +# You can even override a supported extension: +# basicConstraints= critical, DER:30:03:01:01:FF + +[ crl_ext ] + +# CRL extensions. +# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. + +# issuerAltName=issuer:copy +authorityKeyIdentifier=keyid:always + +[ proxy_cert_ext ] +# These extensions should be added when creating a proxy certificate + +# This goes against PKIX guidelines but some CAs do it and some software +# requires this to avoid interpreting an end user certificate as a CA. + +basicConstraints=CA:FALSE + +# Here are some examples of the usage of nsCertType. If it is omitted +# the certificate can be used for anything *except* object signing. + +# This is OK for an SSL server. +# nsCertType = server + +# For an object signing certificate this would be used. +# nsCertType = objsign + +# For normal client use this is typical +# nsCertType = client, email + +# and for everything including object signing: +# nsCertType = client, email, objsign + +# This is typical in keyUsage for a client certificate. +# keyUsage = nonRepudiation, digitalSignature, keyEncipherment + +# This will be displayed in Netscape's comment listbox. +nsComment = "OpenSSL Generated Certificate" + +# PKIX recommendations harmless if included in all certificates. +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer + +# This stuff is for subjectAltName and issuerAltname. +# Import the email address. +# subjectAltName=email:copy +# An alternative to produce certificates that aren't +# deprecated according to PKIX. +# subjectAltName=email:move + +# Copy subject details +# issuerAltName=issuer:copy + +#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem +#nsBaseUrl +#nsRevocationUrl +#nsRenewalUrl +#nsCaPolicyUrl +#nsSslServerName + +# This really needs to be in place for it to be a proxy certificate. +proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo + +#################################################################### +[ tsa ] + +default_tsa = tsa_config1 # the default TSA section + +[ tsa_config1 ] + +# These are used by the TSA reply generation only. +dir = ./demoCA # TSA root directory +serial = $dir/tsaserial # The current serial number (mandatory) +crypto_device = builtin # OpenSSL engine to use for signing +signer_cert = $dir/tsacert.pem # The TSA signing certificate + # (optional) +certs = $dir/cacert.pem # Certificate chain to include in reply + # (optional) +signer_key = $dir/private/tsakey.pem # The TSA private key (optional) +signer_digest = sha256 # Signing digest to use. (Optional) +default_policy = tsa_policy1 # Policy if request did not specify it + # (optional) +other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) +digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) +accuracy = secs:1, millisecs:500, microsecs:100 # (optional) +clock_precision_digits = 0 # number of digits after dot. (optional) +ordering = yes # Is ordering defined for timestamps? + # (optional, default: no) +tsa_name = yes # Must the TSA name be included in the reply? + # (optional, default: no) +ess_cert_id_chain = no # Must the ESS cert id chain be included? + # (optional, default: no) +ess_cert_id_alg = sha1 # algorithm to compute certificate + # identifier (optional, default: sha1) diff --git a/fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 b/fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 new file mode 100644 index 0000000000..9ebd56a948 --- /dev/null +++ b/fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 @@ -0,0 +1,60 @@ +# [ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 b/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 new file mode 100644 index 0000000000..4d74085c81 --- /dev/null +++ b/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INTEGER:10 + diff --git a/fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 b/fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 new file mode 100644 index 0000000000..d530e31f99 --- /dev/null +++ b/fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 @@ -0,0 +1,45 @@ +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ req ] +default_bits = 2048 +default_keyfile = keySS.pem +distinguished_name = req_distinguished_name +encrypt_rsa_key = no +default_md = sha256 + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = AU +countryName_value = AU + +organizationName = Organization Name (eg, company) +organizationName_value = Dodgy Brothers + +0.commonName = Common Name (eg, YOUR name) +0.commonName_value = Brother 1 + +1.commonName = Common Name (eg, YOUR name) +1.commonName_value = Brother 2 + +2.commonName = Common Name (eg, YOUR name) +2.commonName_value = Proxy 1 + +3.commonName = Common Name (eg, YOUR name) +3.commonName_value = Proxy 2 + +[ v3_proxy ] +basicConstraints=CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer:always +proxyCertInfo=critical,@proxy_ext + +[ proxy_ext ] +language=id-ppl-anyLanguage +pathlen=0 +policy=text:BC diff --git a/fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c b/fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c new file mode 100644 index 0000000000..d397a64e34 --- /dev/null +++ b/fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c @@ -0,0 +1,60 @@ +# [ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + + +[ default ] +# +# SSLeay example configuration file. +# This is mostly being used for generation of certificate requests. +# + +RANDFILE = ./.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA # Where everything is kept +certs = $dir/certs # Where the issued certs are kept +crl_dir = $dir/crl # Where the issued crl are kept +database = $dir/index.txt # database index file. +new_certs_dir = $dir/new_certs # default place for new certs. + +certificate = $dir/CAcert.pem # The CA certificate +serial = $dir/serial # The current serial number +crl = $dir/crl.pem # The current CRL +private_key = $dir/private/CAkey.pem# The private key +RANDFILE = $dir/private/.rand # private random number file + +default_days = 365 # how long to certify for +default_crl_days= 30 # how long before next CRL +default_md = md5 # which md to use. + +# A few difference way of specifying how similar the request should look +# For type CA, the listed attributes must be the same, and the optional +# and supplied fields are just that :-) +policy = policy_match + diff --git a/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac b/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac new file mode 100644 index 0000000000..18fe178dfd --- /dev/null +++ b/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:invalid + diff --git a/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e b/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e new file mode 100644 index 0000000000..cbe4c7a569 --- /dev/null +++ b/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL + diff --git a/fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 b/fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 new file mode 100644 index 0000000000..bda6eec4b0 --- /dev/null +++ b/fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 @@ -0,0 +1,56 @@ +#################################################################### +[ req ] +default_bits = 2432 +default_keyfile = cakey.pem +default_md = sha256 +distinguished_name = req_DN +string_mask = utf8only +x509_extensions = v3_selfsign + +[ req_DN ] +commonName = "Common Name" +commonName_value = "CA" + +[ v3_selfsign ] +basicConstraints = critical,CA:true +keyUsage = keyCertSign +subjectKeyIdentifier=hash + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +#################################################################### +[ CA_default ] + +dir = ./demoCA +certificate = ./demoCA/cacert.pem +serial = ./demoCA/serial +private_key = ./demoCA/private/cakey.pem +new_certs_dir = ./demoCA/newcerts + +certificate = cacert.pem +private_key = cakey.pem + +x509_extensions = v3_user + +name_opt = ca_default # Subject Name options +cert_opt = ca_default # Certificate field options + +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ v3_user ] +basicConstraints=critical,CA:FALSE +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +issuerAltName=issuer:copy + diff --git a/fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be b/fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be new file mode 100644 index 0000000000..572af85f65 --- /dev/null +++ b/fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,BITSTR:1,invalid,5 + diff --git a/fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 b/fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 new file mode 100644 index 0000000000..543479a209 --- /dev/null +++ b/fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 @@ -0,0 +1,20 @@ +# [default_sect] +activate = 1 + + + +openssl_conf = openssl_init + +# Comment out the next line to ignore configuration errors +config_diagnostics = 1 + +[openssl_init] +providers = provider_sect + +[provider_sect] +default = default_sect + +[default_sect] +activate = 1 + + diff --git a/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 b/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 new file mode 100644 index 0000000000..0da07eda32 --- /dev/null +++ b/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL:invalid + diff --git a/fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf b/fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf new file mode 100644 index 0000000000..f212523fbe --- /dev/null +++ b/fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,BITSTR:1,5 + diff --git a/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f b/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f new file mode 100644 index 0000000000..b24d974c90 --- /dev/null +++ b/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UNIV:hello + diff --git a/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b b/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b new file mode 100644 index 0000000000..f5f6f6a910 --- /dev/null +++ b/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,BITSTR:4294967296 + From f86a63c87cee3935254b3f5298712ca6cff1a589 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Mon, 30 Jan 2023 12:17:39 -0700 Subject: [PATCH 017/177] Introduce a locale-independent version of isdigit While information is contradictory on this subject, investigation of several implementaions and Posix appears to indicate that it is possible to change the behaviour of isdigit() with locale. Change-Id: I6ba9ecbb5563d04d41c54dd071e86b2354483f77 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56625 Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- crypto/bn_extra/convert.c | 2 +- crypto/bytestring/cbs.c | 6 +++--- crypto/mem.c | 4 ++++ include/openssl/mem.h | 4 ++++ ssl/test/test_config.cc | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/crypto/bn_extra/convert.c b/crypto/bn_extra/convert.c index 6e930fc69f..e31de1f064 100644 --- a/crypto/bn_extra/convert.c +++ b/crypto/bn_extra/convert.c @@ -310,7 +310,7 @@ char *BN_bn2dec(const BIGNUM *a) { } int BN_dec2bn(BIGNUM **outp, const char *in) { - return bn_x2bn(outp, in, decode_dec, isdigit); + return bn_x2bn(outp, in, decode_dec, OPENSSL_isdigit); } int BN_asc2bn(BIGNUM **outp, const char *in) { diff --git a/crypto/bytestring/cbs.c b/crypto/bytestring/cbs.c index efafbfb442..30e38fad14 100644 --- a/crypto/bytestring/cbs.c +++ b/crypto/bytestring/cbs.c @@ -232,7 +232,7 @@ int CBS_get_u64_decimal(CBS *cbs, uint64_t *out) { int seen_digit = 0; while (CBS_len(cbs) != 0) { uint8_t c = CBS_data(cbs)[0]; - if (!isdigit(c)) { + if (!OPENSSL_isdigit(c)) { break; } CBS_skip(cbs, 1); @@ -753,13 +753,13 @@ static int cbs_get_two_digits(CBS *cbs, int *out) { if (!CBS_get_u8(cbs, &first_digit)) { return 0; } - if (!isdigit(first_digit)) { + if (!OPENSSL_isdigit(first_digit)) { return 0; } if (!CBS_get_u8(cbs, &second_digit)) { return 0; } - if (!isdigit(second_digit)) { + if (!OPENSSL_isdigit(second_digit)) { return 0; } *out = (first_digit - '0') * 10 + (second_digit - '0'); diff --git a/crypto/mem.c b/crypto/mem.c index e9d3d728f1..9dedab9652 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -308,6 +308,10 @@ char *OPENSSL_strdup(const char *s) { return ret; } +int OPENSSL_isdigit(int c) { + return c >= '0' && c <= '9'; +} + int OPENSSL_tolower(int c) { if (c >= 'A' && c <= 'Z') { return c + ('a' - 'A'); diff --git a/include/openssl/mem.h b/include/openssl/mem.h index 6216040636..0fd1209fb3 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -110,6 +110,10 @@ OPENSSL_EXPORT char *OPENSSL_strdup(const char *s); // OPENSSL_strnlen has the same behaviour as strnlen(3). OPENSSL_EXPORT size_t OPENSSL_strnlen(const char *s, size_t len); +// OPENSSL_isdigit is a locale-independent version of isdigit(3), It +// only recognizes '0' through '9' as digits. +OPENSSL_EXPORT int OPENSSL_isdigit(int c); + // OPENSSL_tolower is a locale-independent version of tolower(3). It only // lowercases ASCII values. Other values are returned as-is. OPENSSL_EXPORT int OPENSSL_tolower(int c); diff --git a/ssl/test/test_config.cc b/ssl/test/test_config.cc index 850cb23fbc..5764b63c5a 100644 --- a/ssl/test/test_config.cc +++ b/ssl/test/test_config.cc @@ -63,7 +63,7 @@ bool StringToInt(T *out, const char *str) { // |strtoull| allows leading '-' with wraparound. Additionally, both // functions accept empty strings and leading whitespace. - if (!isdigit(static_cast(*str)) && + if (!OPENSSL_isdigit(static_cast(*str)) && (!std::is_signed::value || *str != '-')) { return false; } From a7fbc543c9b2305befee733d689fdf8b821ab880 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 11 Dec 2022 11:57:04 -0500 Subject: [PATCH 018/177] Remove now unnecessary check in CBS_peek_asn1_tag. Since we started supporting higher tag numbers, this function needed to call parse_asn1_tag, which is internally bounds-checked. Change-Id: I19202fb1256240155fa1b53dd31f2b96fd0e8d40 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56188 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- crypto/bytestring/cbs.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crypto/bytestring/cbs.c b/crypto/bytestring/cbs.c index 30e38fad14..8f815863c6 100644 --- a/crypto/bytestring/cbs.c +++ b/crypto/bytestring/cbs.c @@ -480,10 +480,6 @@ int CBS_get_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value) { } int CBS_peek_asn1_tag(const CBS *cbs, CBS_ASN1_TAG tag_value) { - if (CBS_len(cbs) < 1) { - return 0; - } - CBS copy = *cbs; CBS_ASN1_TAG actual_tag; return parse_asn1_tag(©, &actual_tag) && tag_value == actual_tag; From 507ac830036d7531489490831814cf03e0d7c4d6 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 12:14:20 -0500 Subject: [PATCH 019/177] Fix error-handling in X509V3_EXT_add_nconf_sk and X509v3_add_ext. See also upstream's abcf241114c4dc33af95288ae7f7d10916c67db0. Fixed: oss-fuzz:55555, oss-fuzz:55556, oss-fuzz:55560 Change-Id: I3b015822806ced39a498017bd2329323ed8dfbf0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56685 Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509/x509_test.cc | 11 +++++++++++ crypto/x509/x509_v3.c | 6 +++++- crypto/x509v3/v3_conf.c | 9 ++++----- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index fea26e7bcc..aebc76a926 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -6205,3 +6205,14 @@ key = FORMAT:HEX,OCTWRAP,OCT:9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703 } } } + +TEST(X509, AddUnserializableExtension) { + bssl::UniquePtr key = PrivateKeyFromPEM(kP256Key); + ASSERT_TRUE(key); + bssl::UniquePtr x509 = + MakeTestCert("Issuer", "Subject", key.get(), /*is_ca=*/true); + ASSERT_TRUE(x509); + bssl::UniquePtr ext(X509_EXTENSION_new()); + ASSERT_TRUE(X509_EXTENSION_set_object(ext.get(), OBJ_nid2obj(NID_undef))); + EXPECT_FALSE(X509_add_ext(x509.get(), ext.get(), /*loc=*/-1)); +} diff --git a/crypto/x509/x509_v3.c b/crypto/x509/x509_v3.c index 9153dce194..dd8435243b 100644 --- a/crypto/x509/x509_v3.c +++ b/crypto/x509/x509_v3.c @@ -148,6 +148,7 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, X509_EXTENSION *new_ex = NULL; int n; STACK_OF(X509_EXTENSION) *sk = NULL; + int free_sk = 0; if (x == NULL) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); @@ -158,6 +159,7 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, if ((sk = sk_X509_EXTENSION_new_null()) == NULL) { goto err; } + free_sk = 1; } else { sk = *x; } @@ -183,7 +185,9 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); err2: X509_EXTENSION_free(new_ex); - sk_X509_EXTENSION_free(sk); + if (free_sk) { + sk_X509_EXTENSION_free(sk); + } return NULL; } diff --git a/crypto/x509v3/v3_conf.c b/crypto/x509v3/v3_conf.c index 480bb3b799..a4f172d3f9 100644 --- a/crypto/x509v3/v3_conf.c +++ b/crypto/x509v3/v3_conf.c @@ -357,13 +357,12 @@ int X509V3_EXT_add_nconf_sk(const CONF *conf, const X509V3_CTX *ctx, for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); X509_EXTENSION *ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value); - if (ext == NULL) { + int ok = ext != NULL && // + (sk == NULL || X509v3_add_ext(sk, ext, -1) != NULL); + X509_EXTENSION_free(ext); + if (!ok) { return 0; } - if (sk) { - X509v3_add_ext(sk, ext, -1); - } - X509_EXTENSION_free(ext); } return 1; } From 8a69c0d4f8f412432f80dd36ee5987fb1675bfbc Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 13:14:54 -0500 Subject: [PATCH 020/177] Check for null value in set_dist_point_name. CONF_VALUEs are a mess. They show up in three forms: - When parsed from a config file (in a CONF), I believe name and value are never NULL. - Internally, CONF represents sections as funny CONF_VALUEs where name is NULL, and value is a STACK_OF(CONF_VALUE) of the wrong type. This is ridiculous and should be a separate type, though I don't believe it ever leaks outside the public API. - When created by X509V3_parse_list, it is possible for them to be value-less, with a NULL value. v2i functions can see the last case, and set_dist_point_name comes from a v2i function. Add a missing NULL check. This only impacts the unsafe, stringly-typed extensions-building APIs that no one should be using anyway. Also fix the name of the test I added in the previous CL. I didn't quite follow the existing convention. Fixed: oss-fuzz:55558 Change-Id: I1a2403312f3ce59007d23fe7e226f2e602653019 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56705 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Commit-Queue: David Benjamin Auto-Submit: David Benjamin --- crypto/x509/x509_test.cc | 6 +++++- crypto/x509v3/v3_crld.c | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index aebc76a926..63ce092a39 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5716,6 +5716,10 @@ TEST(X509Test, ExtensionFromConf) { // If no config is provided, this should fail. {"basicConstraints", "critical,@section", nullptr, {}}, + // issuingDistributionPoint takes a list of name:value pairs. Omitting the + // value is not allowed. + {"issuingDistributionPoint", "fullname", nullptr, {}}, + // The "DER:" prefix just specifies an arbitrary byte string. Colons // separators are ignored. {kTestOID, "DER:0001020304", nullptr, {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, @@ -6206,7 +6210,7 @@ key = FORMAT:HEX,OCTWRAP,OCT:9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703 } } -TEST(X509, AddUnserializableExtension) { +TEST(X509Test, AddUnserializableExtension) { bssl::UniquePtr key = PrivateKeyFromPEM(kP256Key); ASSERT_TRUE(key); bssl::UniquePtr x509 = diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index 4b5a36df86..0b6899a6fb 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -129,6 +129,13 @@ static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, const CONF_VALUE *cnf) { + // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i + // function, |cnf->value| may be NULL. + if (cnf->value == NULL) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); + return 0; + } + STACK_OF(GENERAL_NAME) *fnm = NULL; STACK_OF(X509_NAME_ENTRY) *rnm = NULL; if (!strncmp(cnf->name, "fullname", 9)) { From 741c153370f58dbf73c6680c8f37de656bc2cb3c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 25 Jan 2023 17:37:16 -0500 Subject: [PATCH 021/177] Align the generated CMake build with the main one. Having two of these is tedious and I hope, eventually, we can align them. But for now, sync them manually: - Bump the minimum CMake versions to match - Align the C/C++ version directives - Simplify architecture detection - Trim some Windows defines that date to our overly aggressive warnings - Use the Threads package - Only use _XOPEN_SOURCE on Linux because it's a glibc-specific problem. I've tested this manually, but we don't particularly test this build right now (I forget if anyone is even using it), so this is mostly relying on finding out from others if it breaks something. In the long term, we should merge the two CMake builds. Bug: 542 Change-Id: Icccc466464306967275d29a6982c0e9859fc972c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56445 Commit-Queue: Adam Langley Reviewed-by: Adam Langley Auto-Submit: David Benjamin --- util/generate_build_files.py | 128 ++++++++++++----------------------- 1 file changed, 42 insertions(+), 86 deletions(-) diff --git a/util/generate_build_files.py b/util/generate_build_files.py index c319a55295..383de02d20 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -401,21 +401,21 @@ def __init__(self): self.header = LicenseHeader("#") + R''' # This file is created by generate_build_files.py. Do not edit manually. -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.10) project(BoringSSL LANGUAGES C CXX) -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CLANG 1) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common") endif() -if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common -std=c11") -endif() - -# pthread_rwlock_t requires a feature flag. -if(NOT WIN32) +# pthread_rwlock_t requires a feature flag on glibc. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700") endif() @@ -425,73 +425,19 @@ def __init__(self): add_definitions(-DNOMINMAX) # Allow use of fopen. add_definitions(-D_CRT_SECURE_NO_WARNINGS) - # VS 2017 and higher supports STL-only warning suppressions. - # A bug in CMake < 3.13.0 may cause the space in this value to - # cause issues when building with NASM. In that case, update CMake. - add_definitions("-D_STL_EXTRA_DISABLED_WARNINGS=4774 4987") endif() add_definitions(-DBORINGSSL_IMPLEMENTATION) -# CMake's iOS support uses Apple's multiple-architecture toolchain. It takes an -# architecture list from CMAKE_OSX_ARCHITECTURES, leaves CMAKE_SYSTEM_PROCESSOR -# alone, and expects all architecture-specific logic to be conditioned within -# the source files rather than the build. This does not work for our assembly -# files, so we fix CMAKE_SYSTEM_PROCESSOR and only support single-architecture -# builds. -if(NOT OPENSSL_NO_ASM AND CMAKE_OSX_ARCHITECTURES) - list(LENGTH CMAKE_OSX_ARCHITECTURES NUM_ARCHES) - if(NOT NUM_ARCHES EQUAL 1) - message(FATAL_ERROR "Universal binaries not supported.") - endif() - list(GET CMAKE_OSX_ARCHITECTURES 0 CMAKE_SYSTEM_PROCESSOR) -endif() - -if(OPENSSL_NO_ASM) - add_definitions(-DOPENSSL_NO_ASM) - set(ARCH "generic") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(ARCH "x86_64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") - set(ARCH "x86_64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") - # cmake reports AMD64 on Windows, but we might be building for 32-bit. - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH "x86_64") - else() - set(ARCH "x86") - endif() -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i386") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") - set(ARCH "x86") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - set(ARCH "aarch64") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - set(ARCH "aarch64") -# Apple A12 Bionic chipset which is added in iPhone XS/XS Max/XR uses arm64e architecture. -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64e") - set(ARCH "aarch64") -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm*") - set(ARCH "arm") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips") - # Just to avoid the “unknown processor” error. - set(ARCH "generic") -else() - message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR}) -endif() - if(NOT OPENSSL_NO_ASM) - if(UNIX) + # On x86 and x86_64 Windows, we use the NASM output. + if(WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|x86_64|amd64|x86|i[3-6]86") + enable_language(ASM_NASM) + set(OPENSSL_NASM TRUE) + set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8") + else() enable_language(ASM) - - # Clang's integerated assembler does not support debug symbols. - if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") - endif() - + set(OPENSSL_ASM TRUE) # CMake does not add -isysroot and -arch flags to assembly. if(APPLE) if(CMAKE_OSX_SYSROOT) @@ -501,9 +447,13 @@ def __init__(self): set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") endforeach() endif() - else() - set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8") - enable_language(ASM_NASM) + if(NOT WIN32) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") + endif() + # Clang's integerated assembler does not support debug symbols. + if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") + endif() endif() endif() @@ -537,7 +487,7 @@ def PrintExe(self, out, name, files, libs): out.write(')\n\n') out.write('target_link_libraries(%s %s)\n\n' % (name, ' '.join(libs))) - def PrintSection(self, out, name, files): + def PrintVariable(self, out, name, files): out.write('set(\n') out.write(' %s\n\n' % name) for f in sorted(files): @@ -548,29 +498,35 @@ def WriteFiles(self, files, asm_outputs): with open('CMakeLists.txt', 'w+') as cmake: cmake.write(self.header) + asm_sources = [] + nasm_sources = [] for ((osname, arch), asm_files) in asm_outputs: - self.PrintSection(cmake, 'CRYPTO_%s_%s_SOURCES' % (osname, arch), - asm_files) + if (osname, arch) in (('win', 'x86'), ('win', 'x86_64')): + nasm_sources.extend(asm_files) + else: + asm_sources.extend(asm_files) + self.PrintVariable(cmake, 'CRYPTO_SOURCES_ASM', sorted(asm_sources)) + self.PrintVariable(cmake, 'CRYPTO_SOURCES_NASM', sorted(nasm_sources)) cmake.write( -R'''if(APPLE) - set(CRYPTO_ARCH_SOURCES ${CRYPTO_apple_${ARCH}_SOURCES}) -elseif(UNIX) - set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES}) -elseif(WIN32) - set(CRYPTO_ARCH_SOURCES ${CRYPTO_win_${ARCH}_SOURCES}) +R'''if(OPENSSL_ASM) + list(APPEND CRYPTO_SOURCES_ASM_USED ${CRYPTO_SOURCES_ASM}) +endif() +if(OPENSSL_NASM) + list(APPEND CRYPTO_SOURCES_ASM_USED ${CRYPTO_SOURCES_NASM}) endif() ''') self.PrintLibrary(cmake, 'crypto', - files['crypto'] + ['${CRYPTO_ARCH_SOURCES}']) + files['crypto'] + ['${CRYPTO_SOURCES_ASM_USED}']) self.PrintLibrary(cmake, 'ssl', files['ssl']) self.PrintExe(cmake, 'bssl', files['tool'], ['ssl', 'crypto']) cmake.write( -R'''if(NOT WIN32 AND NOT ANDROID) - target_link_libraries(crypto pthread) +R'''if(NOT ANDROID) + find_package(Threads REQUIRED) + target_link_libraries(crypto Threads::Threads) endif() if(WIN32) From 54b04fdc21d540a6e24f9ddb7ddc3e583518e24f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 11:56:25 -0500 Subject: [PATCH 022/177] Mark standalone Go scripts with go:build ignore gopls currently litters our project with a sea of red, because it assumes Go files are part of a package, but we have a lot of standalone Go scripts. (If there are C files in the same directory as the script, it gets upset about cgo. If there are multiple standalone scripts in the same directory, it gets uspet about duplicate files.) Per https://github.com/golang/go/issues/49657 and https://github.com/golang/tools/blob/master/gopls/doc/settings.md#standalonetags-string, the convention seems to be a go:build ignore tag. Newer versions of gopls run in a "standalone" mode, so we still get all the nice LSP features. As part of this, I had to align the license header comments from /* block comments */ to // line comments. Go build constraints can only be preceded by blank lines and line comments. Block comments apparently aren't allowed. (See https://pkg.go.dev/cmd/go#hdr-Build_constraints.) If I leave the file unconverted, go fmt will immediately move the comment to above the license block. Change-Id: I47c69255522e9aae2bdb97a6e83fcc6ce0cf29d5 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56525 Commit-Queue: Adam Langley Reviewed-by: Adam Langley Auto-Submit: David Benjamin --- crypto/err/err_data_generate.go | 28 ++++++------ crypto/fipsmodule/bn/bn_test_to_fuzzer.go | 2 + crypto/fipsmodule/bn/check_bn_tests.go | 2 + .../ec/make_ec_scalar_base_mult_tests.go | 28 ++++++------ crypto/fipsmodule/ec/make_p256-nistz-tests.go | 28 ++++++------ crypto/fipsmodule/ec/make_tables.go | 28 ++++++------ crypto/obj/objects.go | 2 + crypto/x509/test/make_basic_constraints.go | 28 ++++++------ crypto/x509/test/make_invalid_extensions.go | 28 ++++++------ crypto/x509/test/make_many_constraints.go | 44 ++++++++++--------- crypto/x509/test/make_policy_certs.go | 28 ++++++------ util/all_tests.go | 28 ++++++------ util/check_filenames.go | 2 + util/check_imported_libraries.go | 2 + util/check_stack.go | 2 + util/compare_benchmarks.go | 28 ++++++------ util/convert_comments.go | 2 + util/convert_wycheproof.go | 28 ++++++------ util/diff_asm.go | 28 ++++++------ util/doc.go | 5 ++- util/embed_test_data.go | 4 +- util/fetch_ech_config_list.go | 2 + .../acvp/acvptool/test/check_expected.go | 2 + .../acvp/acvptool/test/trim_vectors.go | 2 + util/fipstools/break-hash.go | 2 + util/fipstools/break-kat.go | 2 + util/godeps.go | 2 + util/make_errors.go | 2 + util/make_prefix_headers.go | 5 ++- util/read_symbols.go | 2 + util/run_android_tests.go | 2 + 31 files changed, 229 insertions(+), 169 deletions(-) diff --git a/crypto/err/err_data_generate.go b/crypto/err/err_data_generate.go index 963964c666..3e06f00bd0 100644 --- a/crypto/err/err_data_generate.go +++ b/crypto/err/err_data_generate.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2015, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2015, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go index 13cff26a05..afe7d61c83 100644 --- a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go +++ b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/crypto/fipsmodule/bn/check_bn_tests.go b/crypto/fipsmodule/bn/check_bn_tests.go index 26443b93d6..0c8493d063 100644 --- a/crypto/fipsmodule/bn/check_bn_tests.go +++ b/crypto/fipsmodule/bn/check_bn_tests.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go b/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go index 716da55b77..1d3896aa98 100644 --- a/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go +++ b/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2018, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/crypto/fipsmodule/ec/make_p256-nistz-tests.go b/crypto/fipsmodule/ec/make_p256-nistz-tests.go index 36194e61b4..e10990b30e 100644 --- a/crypto/fipsmodule/ec/make_p256-nistz-tests.go +++ b/crypto/fipsmodule/ec/make_p256-nistz-tests.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2018, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/crypto/fipsmodule/ec/make_tables.go b/crypto/fipsmodule/ec/make_tables.go index dbcaab06f6..ef7ac64f39 100644 --- a/crypto/fipsmodule/ec/make_tables.go +++ b/crypto/fipsmodule/ec/make_tables.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2020, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/crypto/obj/objects.go b/crypto/obj/objects.go index 1b9ded347b..716adf9486 100644 --- a/crypto/obj/objects.go +++ b/crypto/obj/objects.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/crypto/x509/test/make_basic_constraints.go b/crypto/x509/test/make_basic_constraints.go index 6524799682..ea502b4c8d 100644 --- a/crypto/x509/test/make_basic_constraints.go +++ b/crypto/x509/test/make_basic_constraints.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2020, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // make_basic_constraints.go generates self-signed certificates with the basic // constraints extension. diff --git a/crypto/x509/test/make_invalid_extensions.go b/crypto/x509/test/make_invalid_extensions.go index aba2d71977..8287bf8d31 100644 --- a/crypto/x509/test/make_invalid_extensions.go +++ b/crypto/x509/test/make_invalid_extensions.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2020, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // make_invalid_extensions.go generates a number of certificate chains with // invalid extension encodings. diff --git a/crypto/x509/test/make_many_constraints.go b/crypto/x509/test/make_many_constraints.go index 578618dfbf..24a5c40717 100644 --- a/crypto/x509/test/make_many_constraints.go +++ b/crypto/x509/test/make_many_constraints.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2017, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2017, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // make_many_constraints.go generates test certificates many_constraints.pem, // many_names*.pem, and some_names*.pem for x509_test.cc @@ -107,10 +109,10 @@ func main() { NotBefore: notBefore, NotAfter: notAfter, BasicConstraintsValid: true, - IsCA: true, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - KeyUsage: x509.KeyUsageCertSign, - SignatureAlgorithm: x509.SHA256WithRSA, + IsCA: true, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageCertSign, + SignatureAlgorithm: x509.SHA256WithRSA, } for i := 0; i < 513; i++ { caTemplate.ExcludedDNSDomains = append(caTemplate.ExcludedDNSDomains, fmt.Sprintf("x%d.test", i)) @@ -149,10 +151,10 @@ func main() { NotBefore: notBefore, NotAfter: notAfter, BasicConstraintsValid: true, - IsCA: false, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, - SignatureAlgorithm: x509.SHA256WithRSA, + IsCA: false, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, + SignatureAlgorithm: x509.SHA256WithRSA, } for i := 0; i < leaf.names; i++ { leafTemplate.DNSNames = append(leafTemplate.DNSNames, fmt.Sprintf("t%d.test", i)) diff --git a/crypto/x509/test/make_policy_certs.go b/crypto/x509/test/make_policy_certs.go index c57d97310b..bc944f2def 100644 --- a/crypto/x509/test/make_policy_certs.go +++ b/crypto/x509/test/make_policy_certs.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2020, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // make_policy_certs.go generates certificates for testing policy handling. package main diff --git a/util/all_tests.go b/util/all_tests.go index 4f484f353c..c0dceba55e 100644 --- a/util/all_tests.go +++ b/util/all_tests.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2015, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2015, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/util/check_filenames.go b/util/check_filenames.go index 886c3f6091..384c19f510 100644 --- a/util/check_filenames.go +++ b/util/check_filenames.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // check_filenames.go checks that filenames are unique. Some of our consumers do // not support multiple files with the same name in the same build target, even // if they are in different directories. diff --git a/util/check_imported_libraries.go b/util/check_imported_libraries.go index 187e51441f..f3803f1c1d 100644 --- a/util/check_imported_libraries.go +++ b/util/check_imported_libraries.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // check_imported_libraries.go checks that each of its arguments only imports // allowed libraries. This is used to avoid accidental dependencies on // libstdc++.so. diff --git a/util/check_stack.go b/util/check_stack.go index b718ea4aca..ad763e6529 100644 --- a/util/check_stack.go +++ b/util/check_stack.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // check_stack.go checks that each of its arguments has a non-executable stack. // See https://www.airs.com/blog/archives/518 for details. package main diff --git a/util/compare_benchmarks.go b/util/compare_benchmarks.go index 0c79d638ea..05e1b5db0d 100644 --- a/util/compare_benchmarks.go +++ b/util/compare_benchmarks.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2020 Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2020 Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // compare_benchmarks takes the JSON-formatted output of bssl speed and // compares it against a baseline output. diff --git a/util/convert_comments.go b/util/convert_comments.go index 917f29c861..df9e3d3ae3 100644 --- a/util/convert_comments.go +++ b/util/convert_comments.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/util/convert_wycheproof.go b/util/convert_wycheproof.go index f81771e4b3..809da6f516 100644 --- a/util/convert_wycheproof.go +++ b/util/convert_wycheproof.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2018, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // convert_wycheproof.go converts Wycheproof test vectors into a format more // easily consumed by BoringSSL. diff --git a/util/diff_asm.go b/util/diff_asm.go index 710a42cb69..5ac1c04bbd 100644 --- a/util/diff_asm.go +++ b/util/diff_asm.go @@ -1,16 +1,18 @@ -/* Copyright (c) 2016, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Copyright (c) 2016, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore package main diff --git a/util/doc.go b/util/doc.go index 45caa15ea4..4fb73ca0dc 100644 --- a/util/doc.go +++ b/util/doc.go @@ -1,10 +1,11 @@ +//go:build ignore + // doc generates HTML files from the comments in header files. // // doc expects to be given the path to a JSON file via the --config option. // From that JSON (which is defined by the Config struct) it reads a list of // header file locations and generates HTML files for each in the current // directory. - package main import ( @@ -411,7 +412,7 @@ func (config *Config) parseHeader(path string) (*HeaderFile, error) { lines = lines[1:] lineNo++ break - } + } if line == cppGuard { return nil, fmt.Errorf("hit ending C++ guard while in section on line %d (possibly missing two empty lines ahead of guard?)", lineNo) } diff --git a/util/embed_test_data.go b/util/embed_test_data.go index 266f2969a8..ae7135fae4 100644 --- a/util/embed_test_data.go +++ b/util/embed_test_data.go @@ -10,7 +10,9 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +//go:build ignore // embed_test_data generates a C++ source file which exports a function, // GetTestData, which looks up the specified data files. diff --git a/util/fetch_ech_config_list.go b/util/fetch_ech_config_list.go index 8f09e66b1f..732d0d3b8a 100644 --- a/util/fetch_ech_config_list.go +++ b/util/fetch_ech_config_list.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/util/fipstools/acvp/acvptool/test/check_expected.go b/util/fipstools/acvp/acvptool/test/check_expected.go index ccc803850f..588b8038bd 100644 --- a/util/fipstools/acvp/acvptool/test/check_expected.go +++ b/util/fipstools/acvp/acvptool/test/check_expected.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/util/fipstools/acvp/acvptool/test/trim_vectors.go b/util/fipstools/acvp/acvptool/test/trim_vectors.go index 53e970e028..703f75fd20 100644 --- a/util/fipstools/acvp/acvptool/test/trim_vectors.go +++ b/util/fipstools/acvp/acvptool/test/trim_vectors.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // trimvectors takes an ACVP vector set file and discards all but a single test // from each test group. This hope is that this achieves good coverage without // having to check in megabytes worth of JSON files. diff --git a/util/fipstools/break-hash.go b/util/fipstools/break-hash.go index 9893716b92..b0c59bc573 100644 --- a/util/fipstools/break-hash.go +++ b/util/fipstools/break-hash.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +//go:build ignore + // break-hash parses an ELF binary containing the FIPS module and corrupts the // first byte of the module. This should cause the integrity check to fail. package main diff --git a/util/fipstools/break-kat.go b/util/fipstools/break-kat.go index 6eace5b464..ebf5dd703d 100644 --- a/util/fipstools/break-kat.go +++ b/util/fipstools/break-kat.go @@ -1,3 +1,5 @@ +//go:build + // break-kat corrupts a known-answer-test input in a binary and writes the // corrupted binary to stdout. This is used to demonstrate that the KATs in the // binary notice the error. diff --git a/util/godeps.go b/util/godeps.go index 960faa46be..56be55944f 100644 --- a/util/godeps.go +++ b/util/godeps.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // godeps prints out dependencies of a package in either CMake or Make depfile // format, for incremental rebuilds. // diff --git a/util/make_errors.go b/util/make_errors.go index 4e2718b8d9..0188452587 100644 --- a/util/make_errors.go +++ b/util/make_errors.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( diff --git a/util/make_prefix_headers.go b/util/make_prefix_headers.go index b536f14cea..8787654b5c 100644 --- a/util/make_prefix_headers.go +++ b/util/make_prefix_headers.go @@ -12,12 +12,15 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // This program takes a file containing newline-separated symbols, and generates // boringssl_prefix_symbols.h, boringssl_prefix_symbols_asm.h, and // boringssl_prefix_symbols_nasm.inc. These header files can be used to build // BoringSSL with a prefix for all symbols in order to avoid symbol name // conflicts when linking a project with multiple copies of BoringSSL; see // BUILDING.md for more details. +package main // TODO(joshlf): For platforms which support it, use '#pragma redefine_extname' // instead of a custom macro. This avoids the need for a custom macro, but also @@ -26,8 +29,6 @@ // IllumOS' fork of OpenSSL: // https://github.com/joyent/illumos-extra/blob/master/openssl1x/sunw_prefix.h -package main - import ( "bufio" "flag" diff --git a/util/read_symbols.go b/util/read_symbols.go index 96c148ab5a..69d000282c 100644 --- a/util/read_symbols.go +++ b/util/read_symbols.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + // read_symbols scans one or more .a files and, for each object contained in // the .a files, reads the list of symbols in that object file. package main diff --git a/util/run_android_tests.go b/util/run_android_tests.go index 51b20172a3..59ddbe75a7 100644 --- a/util/run_android_tests.go +++ b/util/run_android_tests.go @@ -12,6 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +//go:build ignore + package main import ( From 4ed497f0c513dbc1c176dcad7806eea5caf6fbef Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 12:03:03 -0500 Subject: [PATCH 023/177] Fix stray */s in // line comment license headers I assume this came from a bad conversion and then got copy-and-pasted everywhere. Change-Id: Id596623608266ce6350d70dff413f38e9fdf13b3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56526 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- decrepit/cfb/cfb.c | 2 +- decrepit/cfb/cfb_test.cc | 2 +- decrepit/xts/xts_test.cc | 2 +- util/ar/ar.go | 2 +- util/ar/ar_test.go | 2 +- util/fipstools/break-hash.go | 2 +- util/fipstools/delocate/delocate.go | 2 +- util/fipstools/delocate/delocate_test.go | 2 +- util/fipstools/fipscommon/const.go | 2 +- util/fipstools/inject_hash/inject_hash.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/decrepit/cfb/cfb.c b/decrepit/cfb/cfb.c index d231153578..c15292cf02 100644 --- a/decrepit/cfb/cfb.c +++ b/decrepit/cfb/cfb.c @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include diff --git a/decrepit/cfb/cfb_test.cc b/decrepit/cfb/cfb_test.cc index 2510a88a6f..da9681eca6 100644 --- a/decrepit/cfb/cfb_test.cc +++ b/decrepit/cfb/cfb_test.cc @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include diff --git a/decrepit/xts/xts_test.cc b/decrepit/xts/xts_test.cc index 22e80facd3..346ca556ce 100644 --- a/decrepit/xts/xts_test.cc +++ b/decrepit/xts/xts_test.cc @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include diff --git a/util/ar/ar.go b/util/ar/ar.go index 756caf53d8..fdc2dd2b18 100644 --- a/util/ar/ar.go +++ b/util/ar/ar.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // ar.go contains functions for parsing .a archive files. diff --git a/util/ar/ar_test.go b/util/ar/ar_test.go index fac0e266ad..31baaf1621 100644 --- a/util/ar/ar_test.go +++ b/util/ar/ar_test.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. package ar diff --git a/util/fipstools/break-hash.go b/util/fipstools/break-hash.go index b0c59bc573..a4ab8083df 100644 --- a/util/fipstools/break-hash.go +++ b/util/fipstools/break-hash.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. //go:build ignore diff --git a/util/fipstools/delocate/delocate.go b/util/fipstools/delocate/delocate.go index c9daff9318..c28be558c2 100644 --- a/util/fipstools/delocate/delocate.go +++ b/util/fipstools/delocate/delocate.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // delocate performs several transformations of textual assembly code. See // crypto/fipsmodule/FIPS.md for an overview. diff --git a/util/fipstools/delocate/delocate_test.go b/util/fipstools/delocate/delocate_test.go index e3dff546e4..e341a3815f 100644 --- a/util/fipstools/delocate/delocate_test.go +++ b/util/fipstools/delocate/delocate_test.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. package main diff --git a/util/fipstools/fipscommon/const.go b/util/fipstools/fipscommon/const.go index f4c0b75d46..c709961e14 100644 --- a/util/fipstools/fipscommon/const.go +++ b/util/fipstools/fipscommon/const.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. package fipscommon diff --git a/util/fipstools/inject_hash/inject_hash.go b/util/fipstools/inject_hash/inject_hash.go index 3680cfdf85..9c30836639 100644 --- a/util/fipstools/inject_hash/inject_hash.go +++ b/util/fipstools/inject_hash/inject_hash.go @@ -10,7 +10,7 @@ // SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // inject_hash parses an archive containing a file object file. It finds a FIPS // module inside that object, calculates its hash and replaces the default hash From f31654786c0e9c54c227b1e966faadc615780ef5 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 12:06:01 -0500 Subject: [PATCH 024/177] Simplify a pair of Go range expressions gopls was warning about this. Change-Id: Ida8ff67bcb9ada253fb075a8a800cbefd432ca8f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56545 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- crypto/fipsmodule/bn/bn_test_to_fuzzer.go | 2 +- crypto/fipsmodule/bn/check_bn_tests.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go index afe7d61c83..2915db5f9d 100644 --- a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go +++ b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go @@ -140,7 +140,7 @@ func checkKeys(t test, keys ...string) bool { } } - for k, _ := range t.Values { + for k := range t.Values { var found bool for _, k2 := range keys { if k == k2 { diff --git a/crypto/fipsmodule/bn/check_bn_tests.go b/crypto/fipsmodule/bn/check_bn_tests.go index 0c8493d063..032b9e328d 100644 --- a/crypto/fipsmodule/bn/check_bn_tests.go +++ b/crypto/fipsmodule/bn/check_bn_tests.go @@ -137,7 +137,7 @@ func checkKeys(t test, keys ...string) bool { } } - for k, _ := range t.Values { + for k := range t.Values { var found bool for _, k2 := range keys { if k == k2 { From 23776d03bdc8e5e15ac82b993d64fa24aae87db4 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 9 Dec 2022 11:33:17 -0500 Subject: [PATCH 025/177] Simplify the external Bazel build. Now that all assembly files are conditionalized, we no longer need to detect platforms at the build level. This is convenient because detecting platforms in Bazel is a bit of a mess. In particular, this reduces how much we depend on @platforms being correct. gRPC's build appears to still be using some legacy modes which seem cause it to, on cross-compiles, report the host's platforms rather than the target. See https://github.com/grpc/grpc/pull/31938 gRPC should eventually fix this, but it is apparently challenging due to complexities in migrating from Bazel's legacy system the new "platforms" mechanism. Instead, try to sidestep this problem by not relying on the build to do this. Now, we primarily rely on os:windows being accurate, and cross-compiling to/from Windows is uncommon. We do also need os:linux to be accurate when Linux is the target OS, but if Linux is the host and gRPC mislabels the target as os:linux, this is fine as long as the target is not FreeBSD, Apple, or another platform that cares about _XOPEN_SOURCE. (In particular, Android is ambivalent.) I've also renamed a few things based on what they were actually selecting. posix_copts was really copts for toolchains with GCC-style flags. Unfortunately, it's not clear how to condition on the compiler, rather than the platform in Bazel, so we'll do the wrong thing on non-MSVC Windows toolchains, but that was true before. Bug: 542 Change-Id: I7330d8961145ae5714d4cad01259044230d96bcd Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56465 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- util/BUILD.toplevel | 205 ++++++++++++----------------------- util/generate_build_files.py | 17 +++ 2 files changed, 89 insertions(+), 133 deletions(-) diff --git a/util/BUILD.toplevel b/util/BUILD.toplevel index c3143894a8..a855aa5a9c 100644 --- a/util/BUILD.toplevel +++ b/util/BUILD.toplevel @@ -18,14 +18,7 @@ load( "crypto_headers", "crypto_internal_headers", "crypto_sources", - "crypto_sources_apple_aarch64", - "crypto_sources_apple_arm", - "crypto_sources_apple_x86", - "crypto_sources_apple_x86_64", - "crypto_sources_linux_aarch64", - "crypto_sources_linux_arm", - "crypto_sources_linux_x86", - "crypto_sources_linux_x86_64", + "crypto_sources_asm", "fips_fragments", "ssl_headers", "ssl_internal_headers", @@ -38,33 +31,47 @@ licenses(["notice"]) exports_files(["LICENSE"]) -[ - ( - config_setting( - name = os + "_" + arch, - constraint_values = [ - "@platforms//os:" + os, - "@platforms//cpu:" + arch, - ], - ), - ) - for os in [ - "linux", - "android", - "macos", - "ios", - "tvos", - "watchos", - ] - for arch in [ - "arm64", - "armv7", - "x86_64", - "x86_32", - ] -] +# By default, the C files will expect assembly files, if any, to be linked in +# with the build. This default can be flipped with -DOPENSSL_NO_ASM. If building +# in a configuration where we have no assembly optimizations, -DOPENSSL_NO_ASM +# has no effect, and either value is fine. +# +# Like C files, assembly files are wrapped in #ifdef (or NASM equivalent), so it +# is safe to include a file for the wrong platform in the build. It will just +# output an empty object file. However, we need some platform selectors to +# distinguish between gas or NASM syntax. +# +# For all non-Windows platforms, we use gas assembly syntax and can assume any +# GCC-compatible toolchain includes a gas-compatible assembler. +# +# For Windows, we use NASM on x86 and x86_64 and gas, specifically +# clang-assembler, on aarch64. We have not yet added NASM support to this build, +# and would need to detect MSVC vs clang-cl for aarch64 so, for now, we just +# disable assembly on Windows across the board. +# +# These two selects for asm_sources and asm_copts must be kept in sync. If we +# specify assembly, we don't want OPENSSL_NO_ASM. If we don't specify assembly, +# we want OPENSSL_NO_ASM, in case the C files expect them in some format (e.g. +# NASM) this build file doesn't yet support. +# +# TODO(https://crbug.com/boringssl/531): Enable assembly for Windows. +asm_sources = select({ + "@platforms//os:windows": [], + "//conditions:default": crypto_sources_asm, +}) +asm_copts = select({ + "@platforms//os:windows": ["-DOPENSSL_NO_ASM"], + "//conditions:default": [], +}) -posix_copts = [ +# Configure C, C++, and common flags for GCC-compatible toolchains. +# +# TODO(davidben): Can we remove some of these? In Bazel, are warnings the +# toolchain or project's responsibility? -Wa,--noexecstack should be unnecessary +# now, though https://crbug.com/boringssl/292 tracks testing this in CI. +# -fno-common did not become default until +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678. +gcc_copts = [ # Assembler option --noexecstack adds .note.GNU-stack to each object to # ensure that binaries can be built with non-executable stack. "-Wa,--noexecstack", @@ -79,119 +86,51 @@ posix_copts = [ "-Wshadow", "-fno-common", ] - -glibc_copts = posix_copts + [ - # This is needed on glibc systems (at least) to get rwlock in pthread, but - # it should not be set on Apple platforms or FreeBSD, where it instead - # disables APIs we use. - # See compat(5), sys/cdefs.h, and https://crbug.com/boringssl/471 - "-D_XOPEN_SOURCE=700", -] - -boringssl_copts = select({ - "@platforms//os:linux": glibc_copts, - "@platforms//os:android": posix_copts, - "@platforms//os:macos": posix_copts, - "@platforms//os:ios": posix_copts, - "@platforms//os:tvos": posix_copts, - "@platforms//os:watchos": posix_copts, - "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"], - "//conditions:default": [], -}) - -# These selects must be kept in sync. -crypto_sources_asm = select({ - ":linux_armv7": crypto_sources_linux_arm, - ":linux_arm64": crypto_sources_linux_aarch64, - ":linux_x86_32": crypto_sources_linux_x86, - ":linux_x86_64": crypto_sources_linux_x86_64, - ":android_armv7": crypto_sources_linux_arm, - ":android_arm64": crypto_sources_linux_aarch64, - ":android_x86_32": crypto_sources_linux_x86, - ":android_x86_64": crypto_sources_linux_x86_64, - ":macos_armv7": crypto_sources_apple_arm, - ":macos_arm64": crypto_sources_apple_aarch64, - ":macos_x86_32": crypto_sources_apple_x86, - ":macos_x86_64": crypto_sources_apple_x86_64, - ":ios_armv7": crypto_sources_apple_arm, - ":ios_arm64": crypto_sources_apple_aarch64, - ":ios_x86_32": crypto_sources_apple_x86, - ":ios_x86_64": crypto_sources_apple_x86_64, - ":tvos_armv7": crypto_sources_apple_arm, - ":tvos_arm64": crypto_sources_apple_aarch64, - ":tvos_x86_32": crypto_sources_apple_x86, - ":tvos_x86_64": crypto_sources_apple_x86_64, - ":watchos_armv7": crypto_sources_apple_arm, - ":watchos_arm64": crypto_sources_apple_aarch64, - ":watchos_x86_32": crypto_sources_apple_x86, - ":watchos_x86_64": crypto_sources_apple_x86_64, - "//conditions:default": [], -}) -boringssl_copts += select({ - ":linux_armv7": [], - ":linux_arm64": [], - ":linux_x86_32": [], - ":linux_x86_64": [], - ":android_armv7": [], - ":android_arm64": [], - ":android_x86_32": [], - ":android_x86_64": [], - ":macos_armv7": [], - ":macos_arm64": [], - ":macos_x86_32": [], - ":macos_x86_64": [], - ":ios_armv7": [], - ":ios_arm64": [], - ":ios_x86_32": [], - ":ios_x86_64": [], - ":tvos_armv7": [], - ":tvos_arm64": [], - ":tvos_x86_32": [], - ":tvos_x86_64": [], - ":watchos_armv7": [], - ":watchos_arm64": [], - ":watchos_x86_32": [], - ":watchos_x86_64": [], - "//conditions:default": ["-DOPENSSL_NO_ASM"], -}) - -# For C targets only (not C++), compile with C11 support. -posix_copts_c11 = [ +gcc_copts_c11 = [ "-std=c11", "-Wmissing-prototypes", "-Wold-style-definition", "-Wstrict-prototypes", ] - -boringssl_copts_c11 = boringssl_copts + select({ - "@platforms//os:linux": posix_copts_c11, - "@platforms//os:android": posix_copts_c11, - "@platforms//os:macos": posix_copts_c11, - "@platforms//os:ios": posix_copts_c11, - "@platforms//os:tvos": posix_copts_c11, - "@platforms//os:watchos": posix_copts_c11, - "//conditions:default": [], -}) - -# For C++ targets only (not C), compile with C++14 support. -posix_copts_cxx = [ +gcc_copts_cxx = [ "-std=c++14", "-Wmissing-declarations", ] -boringssl_copts_cxx = boringssl_copts + select({ - "@platforms//os:linux": posix_copts_cxx, - "@platforms//os:android": posix_copts_cxx, - "@platforms//os:macos": posix_copts_cxx, - "@platforms//os:ios": posix_copts_cxx, - "@platforms//os:tvos": posix_copts_cxx, - "@platforms//os:watchos": posix_copts_cxx, +boringssl_copts = select({ + # We assume that non-Windows builds use a GCC-compatible toolchain and that + # Windows builds do not. + # + # TODO(davidben): Should these be querying something in @bazel_tools? + # Unfortunately, @bazel_tools is undocumented. See + # https://github.com/bazelbuild/bazel/issues/14914 + "@platforms//os:windows": [], + "//conditions:default": gcc_copts, +}) + select({ + # This is needed on glibc systems to get rwlock in pthreads, but it should + # not be set on Apple platforms or FreeBSD, where it instead disables APIs + # we use. + # See compat(5), sys/cdefs.h, and https://crbug.com/boringssl/471 + "@platforms//os:linux": ["-D_XOPEN_SOURCE=700"], + # Without WIN32_LEAN_AND_MEAN, pulls in wincrypt.h, which + # conflicts with our . + "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"], "//conditions:default": [], +}) + asm_copts + +boringssl_copts_c11 = boringssl_copts + select({ + "@platforms//os:windows": [], + "//conditions:default": gcc_copts_c11, +}) + +boringssl_copts_cxx = boringssl_copts + select({ + "@platforms//os:windows": [], + "//conditions:default": gcc_copts_cxx, }) cc_library( name = "crypto", - srcs = crypto_sources + crypto_internal_headers + crypto_sources_asm, + srcs = crypto_sources + crypto_internal_headers + asm_sources, hdrs = crypto_headers + fips_fragments, copts = boringssl_copts_c11, includes = ["src/include"], diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 383de02d20..0cabe9c2b2 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -255,6 +255,23 @@ def WriteFiles(self, files, asm_outputs): self.PrintVariableSection( out, 'crypto_sources_%s_%s' % (osname, arch), asm_files) + # Generate combined source lists for gas and nasm. Consumers have a choice + # of using the per-platform ones or the combined ones. In the combined + # mode, Windows x86 and Windows x86_64 must still be special-cased, but + # otherwise all assembly files can be linked together. + out.write('\n') + out.write('crypto_sources_asm = []\n') + for (osname, arch, _, _, asm_ext) in OS_ARCH_COMBOS: + if asm_ext == 'S': + out.write('crypto_sources_asm.extend(crypto_sources_%s_%s)\n' % + (osname, arch)) + out.write('\n') + out.write('crypto_sources_nasm = []\n') + for (osname, arch, _, _, asm_ext) in OS_ARCH_COMBOS: + if asm_ext == 'asm': + out.write('crypto_sources_nasm.extend(crypto_sources_%s_%s)\n' % + (osname, arch)) + with open('BUILD.generated_tests.bzl', 'w+') as out: out.write(self.header) From a5ab818854d1adf6ee866f768b47f6162f4ca0a9 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 16:27:30 -0500 Subject: [PATCH 026/177] Define BORINGSSL_IMPLEMENTATION in the Bazel build One less patch Envoy needs to apply. It should only matter when building as a shared library on Windows, but the CMake build sets it unconditionally, so match. Change-Id: I96a2696d587839048184c448c2324cab836138a4 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56726 Commit-Queue: David Benjamin Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- util/BUILD.toplevel | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/BUILD.toplevel b/util/BUILD.toplevel index a855aa5a9c..2067864424 100644 --- a/util/BUILD.toplevel +++ b/util/BUILD.toplevel @@ -97,7 +97,9 @@ gcc_copts_cxx = [ "-Wmissing-declarations", ] -boringssl_copts = select({ +boringssl_copts = [ + "-DBORINGSSL_IMPLEMENTATION", +] + select({ # We assume that non-Windows builds use a GCC-compatible toolchain and that # Windows builds do not. # From 07d353680fa7d96e77ba93382deddd030793def4 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 15:18:56 -0500 Subject: [PATCH 027/177] Fix leak on invalid input to a2i_GENERAL_NAME. Also add some tests for this syntax. The error-handling here is slightly subtle. Although we do call GENERAL_NAME_free on the temporary GENERAL_NAME on error, GENERAL_NAME's value is freed based on the type field. That means if you add an object to the value but don't set the type, it won't be freed. Only the OTHERNAME codepath was affected by this, and a malloc failure-only case in the is_string path. I've gone ahead and reworked all the paths so setting the type happens at the same time as setting the value, so this invariant is more locally obvious. This only impacts the unsafe, stringly-typed extensions-building APIs that no one should be using anyway. Bug: oss-fuzz:55569 Change-Id: I6390e4ac1142264cdc86f95fd850f1b8f81e3fc9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56725 Reviewed-by: Adam Langley Commit-Queue: David Benjamin Auto-Submit: David Benjamin --- crypto/x509/x509_test.cc | 29 ++++++++++++++++ crypto/x509v3/v3_alt.c | 75 ++++++++++++++++++++++------------------ 2 files changed, 70 insertions(+), 34 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 63ce092a39..0928d466b9 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5720,6 +5720,35 @@ TEST(X509Test, ExtensionFromConf) { // value is not allowed. {"issuingDistributionPoint", "fullname", nullptr, {}}, + // subjectAltName has a series of string-based inputs for each name type. + {"subjectAltName", + "email:foo@example.com, URI:https://example.com, DNS:example.com, " + "RID:1.2.3.4, IP:127.0.0.1, IP:::1, dirName:section, " + "otherName:1.2.3.4;BOOLEAN:TRUE", + "[section]\nCN=Test\n", + {0x30, 0x78, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x71, 0x30, 0x6f, 0x81, + 0x0f, 0x66, 0x6f, 0x6f, 0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x86, 0x13, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x82, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x88, 0x03, 0x2a, 0x03, 0x04, 0x87, 0x04, 0x7f, 0x00, 0x00, + 0x01, 0x87, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa4, 0x11, 0x30, 0x0f, 0x31, + 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x04, 0x54, 0x65, + 0x73, 0x74, 0xa0, 0x0a, 0x06, 0x03, 0x2a, 0x03, 0x04, 0xa0, 0x03, 0x01, + 0x01, 0xff}}, + + // Syntax errors in each case, where they exist. (The string types just + // copy the string in as-is.) + {"subjectAltName", "RID:not_an_oid", nullptr, {}}, + {"subjectAltName", "IP:not_an_ip", nullptr, {}}, + {"subjectAltName", "dirName:no_conf_db", nullptr, {}}, + {"subjectAltName", "dirName:missing_section", "[section]\nCN=Test\n", {}}, + {"subjectAltName", "otherName:missing_semicolon", nullptr, {}}, + {"subjectAltName", "otherName:1.2.3.4", nullptr, {}}, + {"subjectAltName", "otherName:invalid_oid;BOOLEAN:TRUE", nullptr, {}}, + {"subjectAltName", "otherName:1.2.3.4;invalid_value", nullptr, {}}, + // The "DER:" prefix just specifies an arbitrary byte string. Colons // separators are ignored. {kTestOID, "DER:0001020304", nullptr, {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, diff --git a/crypto/x509v3/v3_alt.c b/crypto/x509v3/v3_alt.c index 660ced5828..f10c1ce2ec 100644 --- a/crypto/x509v3/v3_alt.c +++ b/crypto/x509v3/v3_alt.c @@ -459,14 +459,12 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, int gen_type, const char *value, int is_nc) { - char is_string = 0; - GENERAL_NAME *gen = NULL; - if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return NULL; } + GENERAL_NAME *gen = NULL; if (out) { gen = out; } else { @@ -480,9 +478,17 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, switch (gen_type) { case GEN_URI: case GEN_EMAIL: - case GEN_DNS: - is_string = 1; + case GEN_DNS: { + ASN1_IA5STRING *str = ASN1_IA5STRING_new(); + if (str == NULL || !ASN1_STRING_set(str, value, strlen(value))) { + ASN1_STRING_free(str); + OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + goto err; + } + gen->type = gen_type; + gen->d.ia5 = str; break; + } case GEN_RID: { ASN1_OBJECT *obj; @@ -491,10 +497,13 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, ERR_add_error_data(2, "value=", value); goto err; } + gen->type = GEN_RID; gen->d.rid = obj; - } break; + break; + } case GEN_IPADD: + gen->type = GEN_IPADD; if (is_nc) { gen->d.ip = a2i_IPADDRESS_NC(value); } else { @@ -525,16 +534,6 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, goto err; } - if (is_string) { - if (!(gen->d.ia5 = ASN1_IA5STRING_new()) || - !ASN1_STRING_set(gen->d.ia5, (unsigned char *)value, strlen(value))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - goto err; - } - } - - gen->type = gen_type; - return gen; err: @@ -581,33 +580,40 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, static int do_othername(GENERAL_NAME *gen, const char *value, const X509V3_CTX *ctx) { - char *objtmp = NULL; - const char *p; - int objlen; - if (!(p = strchr(value, ';'))) { + const char *semicolon = strchr(value, ';'); + if (semicolon == NULL) { return 0; } - if (!(gen->d.otherName = OTHERNAME_new())) { - return 0; - } - // Free this up because we will overwrite it. no need to free type_id - // because it is static - ASN1_TYPE_free(gen->d.otherName->value); - if (!(gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx))) { + + OTHERNAME *name = OTHERNAME_new(); + if (name == NULL) { return 0; } - objlen = p - value; - objtmp = OPENSSL_malloc(objlen + 1); + + char *objtmp = OPENSSL_strndup(value, semicolon - value); if (objtmp == NULL) { - return 0; + goto err; } - OPENSSL_strlcpy(objtmp, value, objlen + 1); - gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0); + ASN1_OBJECT_free(name->type_id); + name->type_id = OBJ_txt2obj(objtmp, /*dont_search_names=*/0); OPENSSL_free(objtmp); - if (!gen->d.otherName->type_id) { - return 0; + if (name->type_id == NULL) { + goto err; } + + ASN1_TYPE_free(name->value); + name->value = ASN1_generate_v3(semicolon + 1, ctx); + if (name->value == NULL) { + goto err; + } + + gen->type = GEN_OTHERNAME; + gen->d.otherName = name; return 1; + +err: + OTHERNAME_free(name); + return 0; } static int do_dirname(GENERAL_NAME *gen, const char *value, @@ -627,6 +633,7 @@ static int do_dirname(GENERAL_NAME *gen, const char *value, if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC)) { goto err; } + gen->type = GEN_DIRNAME; gen->d.dirn = nm; ret = 1; From 62ab404cb560a6886196fe65cd3381f2ae3166ca Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 21:06:58 -0500 Subject: [PATCH 028/177] Make X509V3_get_value_int free the old value before overwriting it. This is an unexported API, so it's okay to change it. Many extension types work by parsing a list of key:value pairs and then setting fields based on it. If a key appears twice, it'll just overwrite the old value. But X509V3_get_value_int forgot to free the old value when doing so. Bug: oss-fuzz:55572 Change-Id: I2b39aa7e9214e82fb40ee2e3481697338fe88e1a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56745 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/x509/x509_test.cc | 13 +++++++++++++ crypto/x509v3/internal.h | 10 ++++++++++ crypto/x509v3/v3_utl.c | 1 + 3 files changed, 24 insertions(+) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 0928d466b9..9abe953364 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5706,6 +5706,19 @@ TEST(X509Test, ExtensionFromConf) { {0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff}}, + {"basicConstraints", + "critical,CA:true,pathlen:1", + nullptr, + {0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01}}, + + // key:value tuples can be repeated and just override the previous value. + {"basicConstraints", + "critical,CA:true,pathlen:100,pathlen:1", + nullptr, + {0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01}}, + // Extension contents may be referenced from a config section. {"basicConstraints", "critical,@section", diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h index 05a7026d60..0c068a0455 100644 --- a/crypto/x509v3/internal.h +++ b/crypto/x509v3/internal.h @@ -138,8 +138,18 @@ int X509V3_NAME_from_section(X509_NAME *nm, const STACK_OF(CONF_VALUE) *dn_sk, // one and sets |*out_bool| to resulting value. Otherwise, it returns zero. int X509V3_bool_from_string(const char *str, ASN1_BOOLEAN *out_bool); +// X509V3_get_value_bool decodes |value| as a boolean. On success, it returns +// one and sets |*out_bool| to the resulting value. Otherwise, it returns zero. int X509V3_get_value_bool(const CONF_VALUE *value, ASN1_BOOLEAN *out_bool); + +// X509V3_get_value_int decodes |value| as an integer. On success, it returns +// one and sets |*aint| to the resulting value. Otherwise, it returns zero. If +// |*aint| was non-NULL at the start of the function, it frees the previous +// value before writing a new one. int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); + +// X509V3_get_section behaves like |NCONF_get_section| but queries |ctx|'s +// config database. const STACK_OF(CONF_VALUE) *X509V3_get_section(const X509V3_CTX *ctx, const char *section); diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index 96ad2295bd..c5bf8239b2 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -337,6 +337,7 @@ int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint) { X509V3_conf_err(value); return 0; } + ASN1_INTEGER_free(*aint); *aint = itmp; return 1; } From 2c12ebdf3a97a03b8bab7f4cd3b841926227310f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 10:39:50 -0500 Subject: [PATCH 029/177] Remove the last of the broken NEON workaround All evidence we have points to these devices no longer existing (or at least no longer taking updates) for years. I've kept CRYPTO_has_broken_NEON around for now as there are some older copies of the Chromium measurement code around, but now the function always returns zero. Change-Id: Ib76b68e347749d03611d00caecb6b8b1fdbb37b1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56765 Reviewed-by: Adam Langley Commit-Queue: Adam Langley Auto-Submit: David Benjamin --- crypto/cpu_arm_linux.c | 19 ++------- crypto/cpu_arm_linux.h | 10 ----- crypto/cpu_arm_linux_test.cc | 79 ------------------------------------ fuzz/arm_cpuinfo.cc | 1 - include/openssl/crypto.h | 10 +++-- 5 files changed, 9 insertions(+), 110 deletions(-) diff --git a/crypto/cpu_arm_linux.c b/crypto/cpu_arm_linux.c index 67e6a1bae5..25b50f689d 100644 --- a/crypto/cpu_arm_linux.c +++ b/crypto/cpu_arm_linux.c @@ -144,13 +144,12 @@ static unsigned long getauxval_proc(unsigned long type) { extern uint32_t OPENSSL_armcap_P; -static int g_has_broken_neon, g_needs_hwcap2_workaround; +static int g_needs_hwcap2_workaround; void OPENSSL_cpuid_setup(void) { // We ignore the return value of |read_file| and proceed with an empty // /proc/cpuinfo on error. If |getauxval| works, we will still detect - // capabilities. There may be a false positive due to - // |crypto_cpuinfo_has_broken_neon|, but this is now rare. + // capabilities. char *cpuinfo_data = NULL; size_t cpuinfo_len = 0; read_file(&cpuinfo_data, &cpuinfo_len, "/proc/cpuinfo"); @@ -176,18 +175,6 @@ void OPENSSL_cpuid_setup(void) { hwcap = crypto_get_arm_hwcap_from_cpuinfo(&cpuinfo); } - // Clear NEON support if known broken. Note, if NEON is available statically, - // the non-NEON code is dropped and this workaround is a no-op. - // - // TODO(davidben): The Android NDK now builds with NEON statically available - // by default. Cronet still has some consumers that support NEON-less devices - // (b/150371744). Get metrics on whether they still see this CPU and, if not, - // remove this check entirely. - g_has_broken_neon = crypto_cpuinfo_has_broken_neon(&cpuinfo); - if (g_has_broken_neon) { - hwcap &= ~HWCAP_NEON; - } - // Matching OpenSSL, only report other features if NEON is present. if (hwcap & HWCAP_NEON) { OPENSSL_armcap_P |= ARMV7_NEON; @@ -223,7 +210,7 @@ void OPENSSL_cpuid_setup(void) { OPENSSL_free(cpuinfo_data); } -int CRYPTO_has_broken_NEON(void) { return g_has_broken_neon; } +int CRYPTO_has_broken_NEON(void) { return 0; } int CRYPTO_needs_hwcap2_workaround(void) { return g_needs_hwcap2_workaround; } diff --git a/crypto/cpu_arm_linux.h b/crypto/cpu_arm_linux.h index e326285f32..fa03ae3c12 100644 --- a/crypto/cpu_arm_linux.h +++ b/crypto/cpu_arm_linux.h @@ -183,16 +183,6 @@ static unsigned long crypto_get_arm_hwcap2_from_cpuinfo( return ret; } -// crypto_cpuinfo_has_broken_neon returns one if |cpuinfo| matches a CPU known -// to have broken NEON unit and zero otherwise. See https://crbug.com/341598. -static int crypto_cpuinfo_has_broken_neon(const STRING_PIECE *cpuinfo) { - return cpuinfo_field_equals(cpuinfo, "CPU implementer", "0x51") && - cpuinfo_field_equals(cpuinfo, "CPU architecture", "7") && - cpuinfo_field_equals(cpuinfo, "CPU variant", "0x1") && - cpuinfo_field_equals(cpuinfo, "CPU part", "0x04d") && - cpuinfo_field_equals(cpuinfo, "CPU revision", "0"); -} - #if defined(__cplusplus) } // extern C diff --git a/crypto/cpu_arm_linux_test.cc b/crypto/cpu_arm_linux_test.cc index 019b579051..eb3db1afda 100644 --- a/crypto/cpu_arm_linux_test.cc +++ b/crypto/cpu_arm_linux_test.cc @@ -24,53 +24,7 @@ TEST(ARMLinuxTest, CPUInfo) { const char *cpuinfo; unsigned long hwcap; unsigned long hwcap2; - bool broken_neon; } kTests[] = { - // https://crbug.com/341598#c33 - { - "Processor: ARMv7 Processory rev 0 (v71)\n" - "processor: 0\n" - "BogoMIPS: 13.50\n" - "\n" - "Processor: 1\n" - "BogoMIPS: 13.50\n" - "\n" - "Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 " - "idiva idivt\n" - "CPU implementer : 0x51\n" - "CPU architecture: 7\n" - "CPU variant: 0x1\n" - "CPU part: 0x04d\n" - "CPU revision: 0\n" - "\n" - "Hardware: SAMSUNG M2\n" - "Revision: 0010\n" - "Serial: 00001e030000354e\n", - HWCAP_NEON, - 0, - true, - }, - // https://crbug.com/341598#c39 - { - "Processor : ARMv7 Processor rev 0 (v7l)\n" - "processor : 0\n" - "BogoMIPS : 13.53\n" - "\n" - "Features : swp half thumb fastmult vfp edsp neon vfpv3 tls " - "vfpv4\n" - "CPU implementer : 0x51\n" - "CPU architecture: 7\n" - "CPU variant : 0x1\n" - "CPU part : 0x04d\n" - "CPU revision : 0\n" - "\n" - "Hardware : SAMSUNG M2_ATT\n" - "Revision : 0010\n" - "Serial : 0000df0c00004d4c\n", - HWCAP_NEON, - 0, - true, - }, // Nexus 4 from https://crbug.com/341598#c43 { "Processor : ARMv7 Processor rev 2 (v7l)\n" @@ -99,28 +53,6 @@ TEST(ARMLinuxTest, CPUInfo) { "Serial : 0000000000000000\n", HWCAP_NEON, 0, - false, - }, - // Razr M from https://crbug.com/341598#c43 - { - "Processor : ARMv7 Processor rev 4 (v7l)\n" - "processor : 0\n" - "BogoMIPS : 13.53\n" - "\n" - "Features : swp half thumb fastmult vfp edsp neon vfpv3 tls " - "vfpv4\n" - "CPU implementer : 0x51\n" - "CPU architecture: 7\n" - "CPU variant : 0x1\n" - "CPU part : 0x04d\n" - "CPU revision : 4\n" - "\n" - "Hardware : msm8960dt\n" - "Revision : 82a0\n" - "Serial : 0001000201fe37a5\n", - HWCAP_NEON, - 0, - false, }, // Pixel 2 (truncated slightly) { @@ -165,15 +97,12 @@ TEST(ARMLinuxTest, CPUInfo) { "Hardware : Qualcomm Technologies, Inc MSM8998\n", HWCAP_NEON, // CPU architecture 8 implies NEON. HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2, - false, }, - // Nexus 4 from // Garbage should be tolerated. { "Blah blah blah this is definitely an ARM CPU", 0, 0, - false, }, // A hypothetical ARMv8 CPU without crc32 (and thus no trailing space // after the last crypto entry). @@ -182,7 +111,6 @@ TEST(ARMLinuxTest, CPUInfo) { "CPU architecture: 8\n", HWCAP_NEON, HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2, - false, }, // Various combinations of ARMv8 flags. { @@ -190,42 +118,36 @@ TEST(ARMLinuxTest, CPUInfo) { "CPU architecture: 8\n", HWCAP_NEON, HWCAP2_AES | HWCAP2_SHA1 | HWCAP2_SHA2, - false, }, { "Features : pmull sha2\n" "CPU architecture: 8\n", HWCAP_NEON, HWCAP2_PMULL | HWCAP2_SHA2, - false, }, { "Features : aes aes aes not_aes aes aes \n" "CPU architecture: 8\n", HWCAP_NEON, HWCAP2_AES, - false, }, { "Features : \n" "CPU architecture: 8\n", HWCAP_NEON, 0, - false, }, { "Features : nothing\n" "CPU architecture: 8\n", HWCAP_NEON, 0, - false, }, // If opening /proc/cpuinfo fails, we process the empty string. { "", 0, 0, - false, }, }; @@ -234,6 +156,5 @@ TEST(ARMLinuxTest, CPUInfo) { STRING_PIECE sp = {t.cpuinfo, strlen(t.cpuinfo)}; EXPECT_EQ(t.hwcap, crypto_get_arm_hwcap_from_cpuinfo(&sp)); EXPECT_EQ(t.hwcap2, crypto_get_arm_hwcap2_from_cpuinfo(&sp)); - EXPECT_EQ(t.broken_neon ? 1 : 0, crypto_cpuinfo_has_broken_neon(&sp)); } } diff --git a/fuzz/arm_cpuinfo.cc b/fuzz/arm_cpuinfo.cc index ea40725f93..f62ae7c4a0 100644 --- a/fuzz/arm_cpuinfo.cc +++ b/fuzz/arm_cpuinfo.cc @@ -19,6 +19,5 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { STRING_PIECE sp = {reinterpret_cast(buf), len}; crypto_get_arm_hwcap_from_cpuinfo(&sp); crypto_get_arm_hwcap2_from_cpuinfo(&sp); - crypto_cpuinfo_has_broken_neon(&sp); return 0; } diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h index b1f696ffd2..171ac43f6b 100644 --- a/include/openssl/crypto.h +++ b/include/openssl/crypto.h @@ -75,10 +75,6 @@ OPENSSL_EXPORT void CRYPTO_pre_sandbox_init(void); #if defined(OPENSSL_ARM) && defined(OPENSSL_LINUX) && \ !defined(OPENSSL_STATIC_ARMCAP) -// CRYPTO_has_broken_NEON returns one if the current CPU is known to have a -// broken NEON unit. See https://crbug.com/341598. -OPENSSL_EXPORT int CRYPTO_has_broken_NEON(void); - // CRYPTO_needs_hwcap2_workaround returns one if the ARMv8 AArch32 AT_HWCAP2 // workaround was needed. See https://crbug.com/boringssl/46. OPENSSL_EXPORT int CRYPTO_needs_hwcap2_workaround(void); @@ -193,6 +189,12 @@ OPENSSL_EXPORT uint32_t FIPS_version(void); // the current BoringSSL and zero otherwise. OPENSSL_EXPORT int FIPS_query_algorithm_status(const char *algorithm); +#if defined(OPENSSL_ARM) && defined(OPENSSL_LINUX) && \ + !defined(OPENSSL_STATIC_ARMCAP) +// CRYPTO_has_broken_NEON returns zero. +OPENSSL_EXPORT int CRYPTO_has_broken_NEON(void); +#endif + #if defined(__cplusplus) } // extern C From 1df70cea5daa391e10f5df9057c60fd740b912ab Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 4 Dec 2022 23:48:42 -0500 Subject: [PATCH 030/177] Correctly handle optional ASN1_ITEM_TEMPLATE types. I didn't quite handle this case correctly in https://boringssl-review.googlesource.com/c/boringssl/+/49350, which made it impossible to express an OPTIONAL, doubly-tagged type in crypto/asn1. For some background, an ASN1_ITEM is a top-level type, while an ASN1_TEMPLATE is roughly a field in a SEQUENCE or SET. In ASN.1, types cannot be OPTIONAL or DEFAULT, only fields, so something like ASN1_TFLG_OPTIONAL is a flag an ASN1_TEMPLATE. However, there are many other type-level features that are applied as ASN1_TEMPLATE flags. SEQUENCE OF T and SET OF T are represented as an ASN1_TEMPLATE with the ASN1_TFLG_SEQUENCE_OF or ASN1_TFLG_SET_OF flag and an item of T. Tagging is also a feature of ASN1_TEMPLATE. But some top-level ASN.1 types may be SEQUENCE OF T or be tagged. So one of the types of ASN1_ITEM is ASN1_ITEM_TEMPLATE, which is an ASN1_ITEM that wraps an ASN1_TEMPLATE (which, in turn, wraps an ASN1_ITEM...). Such an ASN1_ITEM could then be placed in a SEQUENCE or SET, where it is OPTIONAL. We didn't correctly handle this case and instead lost the optional bit. Fix this and add a test. This is a little interesting because it means asn1_template_ex_i2d may get an optional bit from the caller, or it may get one from the template itself. (But it will never get both. An ASN1_ITEM_TEMPLATE cannot wrap an optional template because types are not optional.) This case doesn't actually come up, given it doesn't work today. But in my pending rewrite of tasn_enc.c, it made more sense to just make it work, so this CL fixes it and adds a test ahead of time. Bug: 548 Change-Id: I0cf8c25386ddff992bafae029a5a60d026f124d0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56185 Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- crypto/asn1/asn1_test.cc | 57 ++++++++++++++++++++++++++++++++++++++++ crypto/asn1/tasn_enc.c | 28 +++++++++++++------- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 99d7d3092c..59e80d2cb7 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -2600,4 +2600,61 @@ TEST(ASN1Test, OptionalAndDefaultBooleans) { // TODO(https://crbug.com/boringssl/354): Reject explicit DEFAULTs. } +// EXPLICIT_BOOLEAN is a [1] EXPLICIT BOOLEAN. +ASN1_ITEM_TEMPLATE(EXPLICIT_BOOLEAN) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_EXPLICIT, + 1, + EXPLICIT_BOOLEAN, + ASN1_BOOLEAN) +ASN1_ITEM_TEMPLATE_END(EXPLICIT_BOOLEAN) + +// EXPLICIT_OCTET_STRING is a [2] EXPLICIT OCTET STRING. +ASN1_ITEM_TEMPLATE(EXPLICIT_OCTET_STRING) = ASN1_EX_TEMPLATE_TYPE( + ASN1_TFLG_EXPLICIT, 2, EXPLICIT_OCTET_STRING, ASN1_OCTET_STRING) +ASN1_ITEM_TEMPLATE_END(EXPLICIT_OCTET_STRING) + +// DOUBLY_TAGGED is +// SEQUENCE { +// b [3] EXPLICIT [1] EXPLICIT BOOLEAN OPTIONAL, +// oct [4] EXPLICIT [2] EXPLICIT OCTET STRING OPTIONAL } +// with explicit tagging. +struct DOUBLY_TAGGED { + ASN1_BOOLEAN b; + ASN1_OCTET_STRING *oct; +}; + +DECLARE_ASN1_FUNCTIONS(DOUBLY_TAGGED) +ASN1_SEQUENCE(DOUBLY_TAGGED) = { + ASN1_EXP_OPT(DOUBLY_TAGGED, b, EXPLICIT_BOOLEAN, 3), + ASN1_EXP_OPT(DOUBLY_TAGGED, oct, EXPLICIT_OCTET_STRING, 4), +} ASN1_SEQUENCE_END(DOUBLY_TAGGED) +IMPLEMENT_ASN1_FUNCTIONS(DOUBLY_TAGGED) + +// Test that optional fields with two layers of explicit tagging are correctly +// handled. +TEST(ASN1Test, DoublyTagged) { + std::unique_ptr obj( + nullptr, DOUBLY_TAGGED_free); + + // Both fields missing. + static const uint8_t kOmitted[] = {0x30, 0x00}; + const uint8_t *inp = kOmitted; + obj.reset(d2i_DOUBLY_TAGGED(nullptr, &inp, sizeof(kOmitted))); + ASSERT_TRUE(obj); + EXPECT_EQ(obj->b, -1); + EXPECT_FALSE(obj->oct); + TestSerialize(obj.get(), i2d_DOUBLY_TAGGED, kOmitted); + + // Both fields present, true and the empty string. + static const uint8_t kTrueEmpty[] = {0x30, 0x0d, 0xa3, 0x05, 0xa1, + 0x03, 0x01, 0x01, 0xff, 0xa4, + 0x04, 0xa2, 0x02, 0x04, 0x00}; + inp = kTrueEmpty; + obj.reset(d2i_DOUBLY_TAGGED(nullptr, &inp, sizeof(kTrueEmpty))); + ASSERT_TRUE(obj); + EXPECT_EQ(obj->b, 0xff); + ASSERT_TRUE(obj->oct); + EXPECT_EQ(ASN1_STRING_length(obj->oct), 0); + TestSerialize(obj.get(), i2d_DOUBLY_TAGGED, kTrueEmpty); +} + #endif // !WINDOWS || !SHARED_LIBRARY diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index afac17d678..0a0fdb09b6 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -78,7 +78,8 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *out_omit, static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out, int skcontlen, const ASN1_ITEM *item, int do_sort); static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, - const ASN1_TEMPLATE *tt, int tag, int aclass); + const ASN1_TEMPLATE *tt, int tag, int aclass, + int optional); // Top level i2d equivalents @@ -144,11 +145,13 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, switch (it->itype) { case ASN1_ITYPE_PRIMITIVE: if (it->templates) { + // This is an |ASN1_ITEM_TEMPLATE|. if (it->templates->flags & ASN1_TFLG_OPTIONAL) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); return -1; } - return asn1_template_ex_i2d(pval, out, it->templates, tag, aclass); + return asn1_template_ex_i2d(pval, out, it->templates, tag, aclass, + optional); } return asn1_i2d_ex_primitive(pval, out, it, tag, aclass, optional); @@ -179,7 +182,7 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, return -1; } ASN1_VALUE **pchval = asn1_get_field_ptr(pval, chtt); - return asn1_template_ex_i2d(pchval, out, chtt, -1, 0); + return asn1_template_ex_i2d(pchval, out, chtt, -1, 0, /*optional=*/0); } case ASN1_ITYPE_EXTERN: { @@ -223,7 +226,8 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, return -1; } pseqval = asn1_get_field_ptr(pval, seqtt); - tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0); + tmplen = + asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, 0, /*optional=*/0); if (tmplen == -1 || (tmplen > INT_MAX - seqcontlen)) { return -1; } @@ -244,7 +248,8 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, return -1; } pseqval = asn1_get_field_ptr(pval, seqtt); - if (asn1_template_ex_i2d(pseqval, out, seqtt, -1, 0) < 0) { + if (asn1_template_ex_i2d(pseqval, out, seqtt, -1, 0, /*optional=*/0) < + 0) { return -1; } } @@ -259,10 +264,10 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, // asn1_template_ex_i2d behaves like |asn1_item_ex_i2d_opt| but uses an // |ASN1_TEMPLATE| instead of an |ASN1_ITEM|. An |ASN1_TEMPLATE| wraps an -// |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. Instead of -// taking an |optional| parameter, it uses the |ASN1_TFLG_OPTIONAL| flag. +// |ASN1_ITEM| with modifiers such as tagging, SEQUENCE or SET, etc. static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, - const ASN1_TEMPLATE *tt, int tag, int iclass) { + const ASN1_TEMPLATE *tt, int tag, int iclass, + int optional) { int i, ret, ttag, tclass; size_t j; uint32_t flags = tt->flags; @@ -294,7 +299,12 @@ static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out, tclass = 0; } - const int optional = (flags & ASN1_TFLG_OPTIONAL) != 0; + // The template may itself by marked as optional, or this may be the template + // of an |ASN1_ITEM_TEMPLATE| type which was contained inside an outer + // optional template. (They cannot both be true because the + // |ASN1_ITEM_TEMPLATE| codepath rejects optional templates.) + assert(!optional || (flags & ASN1_TFLG_OPTIONAL) == 0); + optional = optional || (flags & ASN1_TFLG_OPTIONAL) != 0; // At this point 'ttag' contains the outer tag to use, and 'tclass' is the // class. From afa460c7b92c646a2c0d0537e14770a2b71cb762 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 5 Dec 2022 19:43:49 -0500 Subject: [PATCH 031/177] Unexport and remove support for implicit tagging on ASN1_ITYPE_EXTERN. Currently, the only EXTERN type is X509_NAME. Implicitly tagging an X509_NAME didn't work anyway because of the cached encoding. Moreover, even if it did work, it'd be invalid. Name in RFC 5280 is actually a one-element CHOICE type, and CHOICE types can never be implicitly tagged. So just remove support. One thing of note: I'm thinking EXTERN can be used later to retain ASN1_ITEM compatibility, once X509 and friends no longer use the template machinery. That means we're not only assuming X509_NAME is never implicitly tagged, but also that external callers using won't implicitly tag a built-in type. This removes a case we need to handle in the rewritten tasn_enc.c. (In particular, crypto/asn1 and crypto/bytestring use a different tag representation and I'd like to minimum the number of conversions we need.) Update-Note: IMPLEMENT_EXTERN_ASN1 can no longer be used outside the library. I found no callers using this machinery, and we're better off gradually migrating every user to CBS/CBB anyway. Bug: 548 Change-Id: I0aab531077d25960dd3f16183656f318d78a0806 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56186 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/internal.h | 22 ++++++++++++++++++++++ crypto/asn1/tasn_dec.c | 14 +++++++++----- crypto/asn1/tasn_enc.c | 8 ++++++-- crypto/x509/x_name.c | 18 ++++++++---------- include/openssl/asn1t.h | 29 ----------------------------- 5 files changed, 45 insertions(+), 46 deletions(-) diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index 21619c92c3..0631861546 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h @@ -230,6 +230,28 @@ typedef struct { OPENSSL_EXPORT void asn1_get_string_table_for_testing( const ASN1_STRING_TABLE **out_ptr, size_t *out_len); +typedef ASN1_VALUE *ASN1_new_func(void); +typedef void ASN1_free_func(ASN1_VALUE *a); +typedef ASN1_VALUE *ASN1_d2i_func(ASN1_VALUE **a, const unsigned char **in, + long length); +typedef int ASN1_i2d_func(ASN1_VALUE *a, unsigned char **in); + +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int opt, ASN1_TLC *ctx); + +typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef struct ASN1_EXTERN_FUNCS_st { + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; +} ASN1_EXTERN_FUNCS; + #if defined(__cplusplus) } // extern C diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 5eb6e6e0db..54e9a99d6d 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -161,7 +161,6 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, char opt, int depth) { const ASN1_TEMPLATE *tt, *errtt = NULL; - const ASN1_EXTERN_FUNCS *ef; const unsigned char *p = NULL, *q; unsigned char oclass; char cst, isopt; @@ -238,10 +237,15 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } return asn1_d2i_ex_primitive(pval, in, len, it, otag, 0, 0); - case ASN1_ITYPE_EXTERN: - // Use new style d2i - ef = it->funcs; - return ef->asn1_ex_d2i(pval, in, len, it, tag, aclass, opt, NULL); + case ASN1_ITYPE_EXTERN: { + // We don't support implicit tagging with external types. + if (tag != -1) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); + goto err; + } + const ASN1_EXTERN_FUNCS *ef = it->funcs; + return ef->asn1_ex_d2i(pval, in, len, it, opt, NULL); + } case ASN1_ITYPE_CHOICE: { // It never makes sense for CHOICE types to have implicit tagging, so if diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index 0a0fdb09b6..e46968c7ea 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -186,9 +186,13 @@ int asn1_item_ex_i2d_opt(ASN1_VALUE **pval, unsigned char **out, } case ASN1_ITYPE_EXTERN: { - // If new style i2d it does all the work + // We don't support implicit tagging with external types. + if (tag != -1) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); + return -1; + } const ASN1_EXTERN_FUNCS *ef = it->funcs; - int ret = ef->asn1_ex_i2d(pval, out, it, tag, aclass); + int ret = ef->asn1_ex_i2d(pval, out, it); if (ret == 0) { // |asn1_ex_i2d| should never return zero. We have already checked // for optional values generically, and |ASN1_ITYPE_EXTERN| fields diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c index 3e7cb94dae..1d6691bcc2 100644 --- a/crypto/x509/x_name.c +++ b/crypto/x509/x_name.c @@ -80,11 +80,11 @@ DEFINE_STACK_OF(STACK_OF_X509_NAME_ENTRY) #define X509_NAME_MAX (1024 * 1024) static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, - long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, ASN1_TLC *ctx); + long len, const ASN1_ITEM *it, int opt, + ASN1_TLC *ctx); static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, - const ASN1_ITEM *it, int tag, int aclass); + const ASN1_ITEM *it); static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it); static void x509_name_ex_free(ASN1_VALUE **val, const ASN1_ITEM *it); @@ -120,13 +120,11 @@ ASN1_ITEM_TEMPLATE_END(X509_NAME_INTERNAL) // convert to the external form. static const ASN1_EXTERN_FUNCS x509_name_ff = { - NULL, x509_name_ex_new, x509_name_ex_free, 0, // Default clear behaviour is OK x509_name_ex_d2i, x509_name_ex_i2d, - NULL, }; IMPLEMENT_EXTERN_ASN1(X509_NAME, V_ASN1_SEQUENCE, x509_name_ff) @@ -189,8 +187,8 @@ static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne) { } static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, - long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, ASN1_TLC *ctx) { + long len, const ASN1_ITEM *it, int opt, + ASN1_TLC *ctx) { const unsigned char *p = *in, *q; STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL; X509_NAME *nm = NULL; @@ -207,8 +205,8 @@ static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, // Get internal representation of Name ASN1_VALUE *intname_val = NULL; ret = ASN1_item_ex_d2i(&intname_val, &p, len, - ASN1_ITEM_rptr(X509_NAME_INTERNAL), tag, aclass, opt, - ctx); + ASN1_ITEM_rptr(X509_NAME_INTERNAL), /*tag=*/-1, + /*aclass=*/0, opt, ctx); if (ret <= 0) { return ret; } @@ -258,7 +256,7 @@ static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, } static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out, - const ASN1_ITEM *it, int tag, int aclass) { + const ASN1_ITEM *it) { X509_NAME *a = (X509_NAME *)*val; if (a->modified && (!x509_name_encode(a) || !x509_name_canon(a))) { return -1; diff --git a/include/openssl/asn1t.h b/include/openssl/asn1t.h index 324eb57f6d..f65519329b 100644 --- a/include/openssl/asn1t.h +++ b/include/openssl/asn1t.h @@ -512,35 +512,6 @@ const char *sname; /* Structure name */ /* Deprecated tag and length cache */ struct ASN1_TLC_st; -/* Typedefs for ASN1 function pointers */ - -typedef ASN1_VALUE * ASN1_new_func(void); -typedef void ASN1_free_func(ASN1_VALUE *a); -typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length); -typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in); - -typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, - int tag, int aclass, char opt, ASN1_TLC *ctx); - -typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass); -typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); -typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); - -typedef int ASN1_ex_print_func(BIO *out, ASN1_VALUE **pval, - int indent, const char *fname, - const ASN1_PCTX *pctx); - -typedef struct ASN1_EXTERN_FUNCS_st { - void *app_data; - ASN1_ex_new_func *asn1_ex_new; - ASN1_ex_free_func *asn1_ex_free; - ASN1_ex_free_func *asn1_ex_clear; - ASN1_ex_d2i *asn1_ex_d2i; - ASN1_ex_i2d *asn1_ex_i2d; - /* asn1_ex_print is unused. */ - ASN1_ex_print_func *asn1_ex_print; -} ASN1_EXTERN_FUNCS; - /* This is the ASN1_AUX structure: it handles various * miscellaneous requirements. For example the use of * reference counts and an informational callback. From 0a1af7828fdb929e2df27007002f5ffe7126670e Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 10 Dec 2022 21:16:48 -0500 Subject: [PATCH 032/177] Remove ASN1_TFLG_COMBINE. This feature is unused and, if I recall, doesn't actually work. (OpenSSL 1.1.0 or so had to rework the feature significantly.) It would actually be nice to embed some fields, but I think that's better done by just switching the parsers to imperative CBS/CBB calls. One less feature to support in the new parsers. Bug: 548 Change-Id: If10a0d9f1ba5eb09c7e570ab7327fb42fa2bd987 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56189 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/internal.h | 3 --- crypto/asn1/tasn_dec.c | 10 +++------- crypto/asn1/tasn_fre.c | 24 +++++++----------------- crypto/asn1/tasn_new.c | 37 +++++++++++++------------------------ crypto/asn1/tasn_utl.c | 6 +----- include/openssl/asn1t.h | 15 --------------- 6 files changed, 24 insertions(+), 71 deletions(-) diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index 0631861546..49286ea439 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h @@ -143,9 +143,6 @@ OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, OPENSSL_EXPORT int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d); -void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, - int combine); - int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 54e9a99d6d..0fb7344738 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -168,8 +168,6 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, int otag; int ret = 0; ASN1_VALUE **pchptr; - int combine = aclass & ASN1_TFLG_COMBINE; - aclass &= ~ASN1_TFLG_COMBINE; if (!pval) { return 0; } @@ -440,9 +438,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, auxerr: OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR); err: - if (combine == 0) { - ASN1_item_ex_free(pval, it); - } + ASN1_item_ex_free(pval, it); if (errtt) { ERR_add_error_data(4, "Field=", errtt->field_name, ", Type=", it->sname); } else { @@ -602,8 +598,8 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } } else { // Nothing special - ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1, - tt->flags & ASN1_TFLG_COMBINE, opt, depth); + ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1, 0, opt, + depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; diff --git a/crypto/asn1/tasn_fre.c b/crypto/asn1/tasn_fre.c index 82c0a0cd28..ebfd3d62dd 100644 --- a/crypto/asn1/tasn_fre.c +++ b/crypto/asn1/tasn_fre.c @@ -66,15 +66,10 @@ // Free up an ASN1 structure void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it) { - asn1_item_combine_free(&val, it, 0); + ASN1_item_ex_free(&val, it); } void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { - asn1_item_combine_free(pval, it, 0); -} - -void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, - int combine) { const ASN1_TEMPLATE *tt = NULL, *seqtt; const ASN1_EXTERN_FUNCS *ef; int i; @@ -117,10 +112,8 @@ void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, if (asn1_cb) { asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL); } - if (!combine) { - OPENSSL_free(*pval); - *pval = NULL; - } + OPENSSL_free(*pval); + *pval = NULL; break; } @@ -160,10 +153,8 @@ void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it, if (asn1_cb) { asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL); } - if (!combine) { - OPENSSL_free(*pval); - *pval = NULL; - } + OPENSSL_free(*pval); + *pval = NULL; break; } } @@ -176,13 +167,12 @@ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) { ASN1_VALUE *vtmp; vtmp = sk_ASN1_VALUE_value(sk, i); - asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0); + ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item)); } sk_ASN1_VALUE_free(sk); *pval = NULL; } else { - asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item), - tt->flags & ASN1_TFLG_COMBINE); + ASN1_item_ex_free(pval, ASN1_ITEM_ptr(tt->item)); } } diff --git a/crypto/asn1/tasn_new.c b/crypto/asn1/tasn_new.c index 563674d797..3727b9b142 100644 --- a/crypto/asn1/tasn_new.c +++ b/crypto/asn1/tasn_new.c @@ -67,8 +67,6 @@ #include "internal.h" -static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, - int combine); static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); @@ -86,11 +84,6 @@ ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it) { // Allocate an ASN1 structure int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { - return asn1_item_ex_combine_new(pval, it, 0); -} - -static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, - int combine) { const ASN1_TEMPLATE *tt = NULL; const ASN1_EXTERN_FUNCS *ef; ASN1_VALUE **pseqval; @@ -134,13 +127,11 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, return 1; } } - if (!combine) { - *pval = OPENSSL_malloc(it->size); - if (!*pval) { - goto memerr; - } - OPENSSL_memset(*pval, 0, it->size); + *pval = OPENSSL_malloc(it->size); + if (!*pval) { + goto memerr; } + OPENSSL_memset(*pval, 0, it->size); asn1_set_choice_selector(pval, -1, it); if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) { goto auxerr2; @@ -160,15 +151,13 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, return 1; } } - if (!combine) { - *pval = OPENSSL_malloc(it->size); - if (!*pval) { - goto memerr; - } - OPENSSL_memset(*pval, 0, it->size); - asn1_refcount_set_one(pval, it); - asn1_enc_init(pval, it); + *pval = OPENSSL_malloc(it->size); + if (!*pval) { + goto memerr; } + OPENSSL_memset(*pval, 0, it->size); + asn1_refcount_set_one(pval, it); + asn1_enc_init(pval, it); for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) { pseqval = asn1_get_field_ptr(pval, tt); if (!ASN1_template_new(pseqval, tt)) { @@ -184,13 +173,13 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, return 1; memerr2: - asn1_item_combine_free(pval, it, combine); + ASN1_item_ex_free(pval, it); memerr: OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; auxerr2: - asn1_item_combine_free(pval, it, combine); + ASN1_item_ex_free(pval, it); auxerr: OPENSSL_PUT_ERROR(ASN1, ASN1_R_AUX_ERROR); return 0; @@ -255,7 +244,7 @@ static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { goto done; } // Otherwise pass it back to the item routine - ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE); + ret = ASN1_item_ex_new(pval, it); done: return ret; } diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c index 9316c22e4c..741ce173ee 100644 --- a/crypto/asn1/tasn_utl.c +++ b/crypto/asn1/tasn_utl.c @@ -203,11 +203,7 @@ int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, // Given an ASN1_TEMPLATE get a pointer to a field ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { - ASN1_VALUE **pvaltmp; - if (tt->flags & ASN1_TFLG_COMBINE) { - return pval; - } - pvaltmp = offset2ptr(*pval, tt->offset); + ASN1_VALUE **pvaltmp = offset2ptr(*pval, tt->offset); // NOTE for BOOLEAN types the field is just a plain int so we can't return // int **, so settle for (int *). return pvaltmp; diff --git a/include/openssl/asn1t.h b/include/openssl/asn1t.h index f65519329b..f3c4b7f91c 100644 --- a/include/openssl/asn1t.h +++ b/include/openssl/asn1t.h @@ -244,11 +244,6 @@ typedef struct ASN1_TLC_st ASN1_TLC; (flags), (tag), offsetof(stname, field),\ #field, ASN1_ITEM_ref(type) } -/* used when the structure is combined with the parent */ - -#define ASN1_EX_COMBINE(flags, tag, type) { \ - (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) } - /* implicit and explicit helper macros */ #define ASN1_IMP_EX(stname, field, type, tag, ex) \ @@ -441,16 +436,6 @@ struct ASN1_ADB_TABLE_st { #define ASN1_TFLG_ADB_OID (0x1<<8) -/* This flag means a parent structure is passed - * instead of the field: this is useful is a - * SEQUENCE is being combined with a CHOICE for - * example. Since this means the structure and - * item name will differ we need to use the - * ASN1_CHOICE_END_name() macro for example. - */ - -#define ASN1_TFLG_COMBINE (0x1<<10) - /* This is the actual ASN1 item itself */ struct ASN1_ITEM_st { From 67bb28c0fe17286b0b31864e91e70b9555887e53 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 14:40:03 -0500 Subject: [PATCH 033/177] Fix OPENSSL_NO_ASM builds with the generated CMake build. I inadverterntly broke this in https://boringssl-review.googlesource.com/c/boringssl/+/56445 Bug: 542 Change-Id: I55dbf18314196d00f4ce19c3f59eabeccb17a8d7 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56766 Auto-Submit: David Benjamin Commit-Queue: David Benjamin Reviewed-by: Adam Langley Commit-Queue: Adam Langley --- util/generate_build_files.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 0cabe9c2b2..ca173c8ba2 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -446,7 +446,9 @@ def __init__(self): add_definitions(-DBORINGSSL_IMPLEMENTATION) -if(NOT OPENSSL_NO_ASM) +if(OPENSSL_NO_ASM) + add_definitions(-DOPENSSL_NO_ASM) +else() # On x86 and x86_64 Windows, we use the NASM output. if(WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64|x86_64|amd64|x86|i[3-6]86") enable_language(ASM_NASM) From 00c70b8d698650e5836049def714b92d622bc4a6 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Wed, 1 Feb 2023 12:41:49 -0700 Subject: [PATCH 034/177] Add locale independent implementations of isalpha, isalnum, isdigit, and isxdigit. All of these can be affected by locale, and although we weren't using them directly (except for isxdigit) we instead had manual versions inline everywhere. While I am here add OPENSSL_fromxdigit and deduplicate a bunch of code in hex decoders pulling out a hex value. Change-Id: Ie75a4fba0f043208c50b0bb14174516462c89673 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56648 Reviewed-by: David Benjamin Commit-Queue: Bob Beck --- crypto/asn1/a_mbstr.c | 5 +--- crypto/bn_extra/convert.c | 17 +++--------- crypto/mem.c | 28 +++++++++++++++++++ crypto/pem/pem_lib.c | 24 +++++++---------- crypto/test/test_util.cc | 20 ++------------ crypto/x509v3/v3_utl.c | 51 ++++++++--------------------------- include/openssl/mem.h | 34 ++++++++++++++++++----- ssl/encrypted_client_hello.cc | 6 ++--- ssl/ssl_cipher.cc | 6 ++--- ssl/ssl_privkey.cc | 3 +-- ssl/test/test_config.cc | 19 ++----------- 11 files changed, 89 insertions(+), 124 deletions(-) diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c index c53d6d588f..ef74d0d363 100644 --- a/crypto/asn1/a_mbstr.c +++ b/crypto/asn1/a_mbstr.c @@ -283,10 +283,7 @@ int asn1_is_printable(uint32_t value) { if (value > 0x7f) { return 0; } - // Note we cannot use |isalnum| because it is locale-dependent. - return ('a' <= value && value <= 'z') || // - ('A' <= value && value <= 'Z') || // - ('0' <= value && value <= '9') || // + return OPENSSL_isalnum(value) || // value == ' ' || value == '\'' || value == '(' || value == ')' || value == '+' || value == ',' || value == '-' || value == '.' || value == '/' || value == ':' || value == '=' || value == '?'; diff --git a/crypto/bn_extra/convert.c b/crypto/bn_extra/convert.c index e31de1f064..78fe102e2d 100644 --- a/crypto/bn_extra/convert.c +++ b/crypto/bn_extra/convert.c @@ -133,18 +133,9 @@ static int decode_hex(BIGNUM *bn, const char *in, int in_len) { BN_ULONG word = 0; int j; for (j = todo; j > 0; j--) { - char c = in[in_len - j]; - - BN_ULONG hex; - if (c >= '0' && c <= '9') { - hex = c - '0'; - } else if (c >= 'a' && c <= 'f') { - hex = c - 'a' + 10; - } else if (c >= 'A' && c <= 'F') { - hex = c - 'A' + 10; - } else { - hex = 0; - // This shouldn't happen. The caller checks |isxdigit|. + uint8_t hex = 0; + if (!OPENSSL_fromxdigit(&hex, in[in_len - j])) { + // This shouldn't happen. The caller checks |OPENSSL_isxdigit|. assert(0); } word = (word << 4) | hex; @@ -240,7 +231,7 @@ static int bn_x2bn(BIGNUM **outp, const char *in, decode_func decode, char_test_ } int BN_hex2bn(BIGNUM **outp, const char *in) { - return bn_x2bn(outp, in, decode_hex, isxdigit); + return bn_x2bn(outp, in, decode_hex, OPENSSL_isxdigit); } char *BN_bn2dec(const BIGNUM *a) { diff --git a/crypto/mem.c b/crypto/mem.c index 9dedab9652..6ee5b0b740 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -308,10 +308,38 @@ char *OPENSSL_strdup(const char *s) { return ret; } +int OPENSSL_isalpha(int c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + int OPENSSL_isdigit(int c) { return c >= '0' && c <= '9'; } +int OPENSSL_isxdigit(int c) { + return OPENSSL_isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); +} + +int OPENSSL_fromxdigit(uint8_t *out, int c) { + if (OPENSSL_isdigit(c)) { + *out = c - '0'; + return 1; + } + if ('a' <= c && c <= 'f') { + *out = c - 'a' + 10; + return 1; + } + if ('A' <= c && c <= 'F') { + *out = c - 'A' + 10; + return 1; + } + return 0; +} + +int OPENSSL_isalnum(int c) { + return OPENSSL_isalpha(c) || OPENSSL_isdigit(c); +} + int OPENSSL_tolower(int c) { if (c >= 'A' && c <= 'Z') { return c + ('a' - 'A'); diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c index 3be92a0870..fc1144e000 100644 --- a/crypto/pem/pem_lib.c +++ b/crypto/pem/pem_lib.c @@ -75,7 +75,7 @@ #define MIN_LENGTH 4 -static int load_iv(char **fromp, unsigned char *to, int num); +static int load_iv(char **fromp, unsigned char *to, size_t num); static int check_pem(const char *nm, const char *name); void PEM_proc_type(char *buf, int type) { @@ -464,8 +464,8 @@ int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) { p = header; for (;;) { c = *header; - if (!(((c >= 'A') && (c <= 'Z')) || (c == '-') || - ((c >= '0') && (c <= '9')))) { + if (!((c >= 'A' && c <= 'Z') || c == '-' || + OPENSSL_isdigit(c))) { break; } header++; @@ -493,28 +493,22 @@ int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) { return 1; } -static int load_iv(char **fromp, unsigned char *to, int num) { - int v, i; +static int load_iv(char **fromp, unsigned char *to, size_t num) { + uint8_t v; char *from; from = *fromp; - for (i = 0; i < num; i++) { + for (size_t i = 0; i < num; i++) { to[i] = 0; } num *= 2; - for (i = 0; i < num; i++) { - if ((*from >= '0') && (*from <= '9')) { - v = *from - '0'; - } else if ((*from >= 'A') && (*from <= 'F')) { - v = *from - 'A' + 10; - } else if ((*from >= 'a') && (*from <= 'f')) { - v = *from - 'a' + 10; - } else { + for (size_t i = 0; i < num; i++) { + if (!OPENSSL_fromxdigit(&v, *from)) { OPENSSL_PUT_ERROR(PEM, PEM_R_BAD_IV_CHARS); return 0; } from++; - to[i / 2] |= v << (long)((!(i & 1)) * 4); + to[i / 2] |= v << (!(i & 1)) * 4; } *fromp = from; diff --git a/crypto/test/test_util.cc b/crypto/test/test_util.cc index 7f954138c0..23e8909fe8 100644 --- a/crypto/test/test_util.cc +++ b/crypto/test/test_util.cc @@ -39,22 +39,6 @@ std::ostream &operator<<(std::ostream &os, const Bytes &in) { return os; } -static bool FromHexDigit(uint8_t *out, char c) { - if ('0' <= c && c <= '9') { - *out = c - '0'; - return true; - } - if ('a' <= c && c <= 'f') { - *out = c - 'a' + 10; - return true; - } - if ('A' <= c && c <= 'F') { - *out = c - 'A' + 10; - return true; - } - return false; -} - bool DecodeHex(std::vector *out, const std::string &in) { out->clear(); if (in.size() % 2 != 0) { @@ -63,8 +47,8 @@ bool DecodeHex(std::vector *out, const std::string &in) { out->reserve(in.size() / 2); for (size_t i = 0; i < in.size(); i += 2) { uint8_t hi, lo; - if (!FromHexDigit(&hi, in[i]) || - !FromHexDigit(&lo, in[i + 1])) { + if (!OPENSSL_fromxdigit(&hi, in[i]) || + !OPENSSL_fromxdigit(&lo, in[i + 1])) { return false; } out->push_back((hi << 4) | lo); diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index c5bf8239b2..fffb83df2c 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -494,6 +494,7 @@ char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) { unsigned char *x509v3_hex_to_bytes(const char *str, long *len) { unsigned char *hexbuf, *q; unsigned char ch, cl, *p; + uint8_t high, low; if (!str) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT); return NULL; @@ -512,28 +513,13 @@ unsigned char *x509v3_hex_to_bytes(const char *str, long *len) { OPENSSL_free(hexbuf); return NULL; } - - if ((ch >= '0') && (ch <= '9')) { - ch -= '0'; - } else if ((ch >= 'a') && (ch <= 'f')) { - ch -= 'a' - 10; - } else if ((ch >= 'A') && (ch <= 'F')) { - ch -= 'A' - 10; - } else { + if (!OPENSSL_fromxdigit(&high, ch)) { goto badhex; } - - if ((cl >= '0') && (cl <= '9')) { - cl -= '0'; - } else if ((cl >= 'a') && (cl <= 'f')) { - cl -= 'a' - 10; - } else if ((cl >= 'A') && (cl <= 'F')) { - cl -= 'A' - 10; - } else { + if (!OPENSSL_fromxdigit(&low, cl)) { goto badhex; } - - *q++ = (ch << 4) | cl; + *q++ = (high << 4) | low; } if (len) { @@ -710,13 +696,7 @@ static int equal_nocase(const unsigned char *pattern, size_t pattern_len, return 0; } if (l != r) { - if ('A' <= l && l <= 'Z') { - l = (l - 'A') + 'a'; - } - if ('A' <= r && r <= 'Z') { - r = (r - 'A') + 'a'; - } - if (l != r) { + if (OPENSSL_tolower(l) != OPENSSL_tolower(r)) { return 0; } } @@ -806,8 +786,7 @@ static int wildcard_match(const unsigned char *prefix, size_t prefix_len, // Check that the part matched by the wildcard contains only // permitted characters and only matches a single label. for (p = wildcard_start; p != wildcard_end; ++p) { - if (!(('0' <= *p && *p <= '9') || ('A' <= *p && *p <= 'Z') || - ('a' <= *p && *p <= 'z') || *p == '-')) { + if (!OPENSSL_isalnum(*p) && *p != '-') { return 0; } } @@ -843,8 +822,7 @@ static const unsigned char *valid_star(const unsigned char *p, size_t len, } star = &p[i]; state &= ~LABEL_START; - } else if (('a' <= p[i] && p[i] <= 'z') || ('A' <= p[i] && p[i] <= 'Z') || - ('0' <= p[i] && p[i] <= '9')) { + } else if (OPENSSL_isalnum(p[i])) { if ((state & LABEL_START) != 0 && len - i >= 4 && OPENSSL_strncasecmp((char *)&p[i], "xn--", 4) == 0) { state |= LABEL_IDNA; @@ -918,8 +896,7 @@ int x509v3_looks_like_dns_name(const unsigned char *in, size_t len) { size_t label_start = 0; for (size_t i = 0; i < len; i++) { unsigned char c = in[i]; - if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || - (c >= 'A' && c <= 'Z') || (c == '-' && i > label_start) || + if (OPENSSL_isalnum(c) || (c == '-' && i > label_start) || // These are not valid characters in hostnames, but commonly found // in deployments outside the Web PKI. c == '_' || c == ':') { @@ -1328,17 +1305,11 @@ static int ipv6_hex(unsigned char *out, const char *in, size_t inlen) { } uint16_t num = 0; while (inlen--) { - unsigned char c = *in++; - num <<= 4; - if ((c >= '0') && (c <= '9')) { - num |= c - '0'; - } else if ((c >= 'A') && (c <= 'F')) { - num |= c - 'A' + 10; - } else if ((c >= 'a') && (c <= 'f')) { - num |= c - 'a' + 10; - } else { + uint8_t val; + if (!OPENSSL_fromxdigit(&val, *in++)) { return 0; } + num = (num << 4) | val; } out[0] = num >> 8; out[1] = num & 0xff; diff --git a/include/openssl/mem.h b/include/openssl/mem.h index 0fd1209fb3..374e188530 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -110,22 +110,42 @@ OPENSSL_EXPORT char *OPENSSL_strdup(const char *s); // OPENSSL_strnlen has the same behaviour as strnlen(3). OPENSSL_EXPORT size_t OPENSSL_strnlen(const char *s, size_t len); -// OPENSSL_isdigit is a locale-independent version of isdigit(3), It +// OPENSSL_isalpha is a locale-independent, ASCII-only version of isalpha(3), It +// only recognizes 'a' through 'z' and 'A' through 'Z' as alphabetic. +OPENSSL_EXPORT int OPENSSL_isalpha(int c); + +// OPENSSL_isdigit is a locale-independent, ASCII-only version of isdigit(3), It // only recognizes '0' through '9' as digits. OPENSSL_EXPORT int OPENSSL_isdigit(int c); -// OPENSSL_tolower is a locale-independent version of tolower(3). It only -// lowercases ASCII values. Other values are returned as-is. +// OPENSSL_isxdigit is a locale-independent, ASCII-only version of isxdigit(3), +// It only recognizes '0' through '9', 'a' through 'f', and 'A through 'F' as +// digits. +OPENSSL_EXPORT int OPENSSL_isxdigit(int c); + +// OPENSSL_fromxdigit returns one if |c| is a hexadecimal digit as recognized +// by OPENSSL_isxdigit, and sets |out| to the corresponding value. Otherwise +// zero is returned. +OPENSSL_EXPORT int OPENSSL_fromxdigit(uint8_t *out, int c); + +// OPENSSL_isalnum is a locale-independent, ASCII-only version of isalnum(3), It +// only recognizes what |OPENSSL_isalpha| and |OPENSSL_isdigit| recognize. +OPENSSL_EXPORT int OPENSSL_isalnum(int c); + +// OPENSSL_tolower is a locale-independent, ASCII-only version of tolower(3). It +// only lowercases ASCII values. Other values are returned as-is. OPENSSL_EXPORT int OPENSSL_tolower(int c); -// OPENSSL_isspace is a locale-independent version of isspace(3). It only -// recognizes '\t', '\n', '\v', '\f', '\r', and ' '. +// OPENSSL_isspace is a locale-independent, ASCII-only version of isspace(3). It +// only recognizes '\t', '\n', '\v', '\f', '\r', and ' '. OPENSSL_EXPORT int OPENSSL_isspace(int c); -// OPENSSL_strcasecmp is a locale-independent version of strcasecmp(3). +// OPENSSL_strcasecmp is a locale-independent, ASCII-only version of +// strcasecmp(3). OPENSSL_EXPORT int OPENSSL_strcasecmp(const char *a, const char *b); -// OPENSSL_strncasecmp is a locale-independent version of strncasecmp(3). +// OPENSSL_strncasecmp is a locale-independent, ASCII-only version of +// strncasecmp(3). OPENSSL_EXPORT int OPENSSL_strncasecmp(const char *a, const char *b, size_t n); // DECIMAL_SIZE returns an upper bound for the length of the decimal diff --git a/ssl/encrypted_client_hello.cc b/ssl/encrypted_client_hello.cc index 9e9adfea7b..e5b04005d2 100644 --- a/ssl/encrypted_client_hello.cc +++ b/ssl/encrypted_client_hello.cc @@ -334,8 +334,7 @@ static bool is_hex_component(Span in) { return false; } for (uint8_t b : in.subspan(2)) { - if (!('0' <= b && b <= '9') && !('a' <= b && b <= 'f') && - !('A' <= b && b <= 'F')) { + if (!OPENSSL_isxdigit(b)) { return false; } } @@ -387,8 +386,7 @@ bool ssl_is_valid_ech_public_name(Span public_name) { return false; } for (uint8_t c : component) { - if (!('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') && - !('0' <= c && c <= '9') && c != '-') { + if (!OPENSSL_isalnum(c) && c != '-') { return false; } } diff --git a/ssl/ssl_cipher.cc b/ssl/ssl_cipher.cc index 7c4c034acc..391944af35 100644 --- a/ssl/ssl_cipher.cc +++ b/ssl/ssl_cipher.cc @@ -1002,8 +1002,7 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, rule = CIPHER_ADD; l++; continue; - } else if (!(ch >= 'a' && ch <= 'z') && !(ch >= 'A' && ch <= 'Z') && - !(ch >= '0' && ch <= '9')) { + } else if (!OPENSSL_isalnum(ch)) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_OPERATOR_IN_GROUP); return false; } else { @@ -1056,8 +1055,7 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, ch = *l; buf = l; buf_len = 0; - while ((ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || - (ch >= 'a' && ch <= 'z') || ch == '-' || ch == '.' || ch == '_') { + while (OPENSSL_isalnum(ch) || ch == '-' || ch == '.' || ch == '_') { ch = *(++l); buf_len++; } diff --git a/ssl/ssl_privkey.cc b/ssl/ssl_privkey.cc index a9f92b61b6..60fda697d7 100644 --- a/ssl/ssl_privkey.cc +++ b/ssl/ssl_privkey.cc @@ -859,8 +859,7 @@ static bool parse_sigalgs_list(Array *out, const char *str) { return false; } - if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || c == '-' || c == '_') { + if (OPENSSL_isalnum(c) || c == '-' || c == '_') { buf[buf_used++] = c; } else { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM); diff --git a/ssl/test/test_config.cc b/ssl/test/test_config.cc index 5764b63c5a..d51c601b40 100644 --- a/ssl/test/test_config.cc +++ b/ssl/test/test_config.cc @@ -925,22 +925,6 @@ static bool GetCertificate(SSL *ssl, bssl::UniquePtr *out_x509, return true; } -static bool FromHexDigit(uint8_t *out, char c) { - if ('0' <= c && c <= '9') { - *out = c - '0'; - return true; - } - if ('a' <= c && c <= 'f') { - *out = c - 'a' + 10; - return true; - } - if ('A' <= c && c <= 'F') { - *out = c - 'A' + 10; - return true; - } - return false; -} - static bool HexDecode(std::string *out, const std::string &in) { if ((in.size() & 1) != 0) { return false; @@ -949,7 +933,8 @@ static bool HexDecode(std::string *out, const std::string &in) { std::unique_ptr buf(new uint8_t[in.size() / 2]); for (size_t i = 0; i < in.size() / 2; i++) { uint8_t high, low; - if (!FromHexDigit(&high, in[i * 2]) || !FromHexDigit(&low, in[i * 2 + 1])) { + if (!OPENSSL_fromxdigit(&high, in[i * 2]) || + !OPENSSL_fromxdigit(&low, in[i * 2 + 1])) { return false; } buf[i] = (high << 4) | low; From a1c79226137e8f60ed572dabdd2435f1f942be0f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 2 Jan 2023 09:55:09 -0800 Subject: [PATCH 035/177] Align header guard style in the remaining headers. Change-Id: I811884dacf14fb6da4dd2300f27c8801145fd3ae Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56645 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- include/openssl/asn1.h | 6 +++--- include/openssl/asn1t.h | 14 ++++++++------ include/openssl/x509.h | 6 +++--- include/openssl/x509v3.h | 6 +++--- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 7866deb247..0370a3e63f 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -55,8 +55,8 @@ * [including the GNU Public Licence.] */ -#ifndef HEADER_ASN1_H -#define HEADER_ASN1_H +#ifndef OPENSSL_HEADER_ASN1_H +#define OPENSSL_HEADER_ASN1_H #include @@ -2108,4 +2108,4 @@ BSSL_NAMESPACE_END #define ASN1_R_WRONG_INTEGER_TYPE 195 #define ASN1_R_INVALID_INTEGER 196 -#endif +#endif // OPENSSL_HEADER_ASN1_H diff --git a/include/openssl/asn1t.h b/include/openssl/asn1t.h index f3c4b7f91c..7547b60af2 100644 --- a/include/openssl/asn1t.h +++ b/include/openssl/asn1t.h @@ -54,13 +54,13 @@ * Hudson (tjh@cryptsoft.com). * */ -#ifndef HEADER_ASN1T_H -#define HEADER_ASN1T_H +#ifndef OPENSSL_HEADER_ASN1T_H +#define OPENSSL_HEADER_ASN1T_H #include #include -#ifdef __cplusplus +#if defined(__cplusplus) extern "C" { #endif @@ -658,7 +658,9 @@ DECLARE_ASN1_ITEM(ASN1_SEQUENCE) DEFINE_STACK_OF(ASN1_VALUE) -#ifdef __cplusplus -} -#endif + +#if defined(__cplusplus) +} // extern "C" #endif + +#endif // OPENSSL_HEADER_ASN1T_H diff --git a/include/openssl/x509.h b/include/openssl/x509.h index ec65cc5324..e3ba8e006d 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -60,8 +60,8 @@ * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. */ -#ifndef HEADER_X509_H -#define HEADER_X509_H +#ifndef OPENSSL_HEADER_X509_H +#define OPENSSL_HEADER_X509_H #include #include @@ -2923,4 +2923,4 @@ BSSL_NAMESPACE_END #define X509_R_NO_CRL_FOUND 143 #define X509_R_INVALID_POLICY_EXTENSION 144 -#endif +#endif // OPENSSL_HEADER_X509_H diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h index 37e1a2273a..f305dae87a 100644 --- a/include/openssl/x509v3.h +++ b/include/openssl/x509v3.h @@ -52,8 +52,8 @@ * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ -#ifndef HEADER_X509V3_H -#define HEADER_X509V3_H +#ifndef OPENSSL_HEADER_X509V3_H +#define OPENSSL_HEADER_X509V3_H #include #include @@ -1027,4 +1027,4 @@ BSSL_NAMESPACE_END #define X509V3_R_INVALID_VALUE 163 #define X509V3_R_TRAILING_DATA_IN_EXTENSION 164 -#endif +#endif // OPENSSL_HEADER_X509V3_H From 31f1466a613774369053a94eabbae38fb9cbb7f9 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 15:17:38 -0500 Subject: [PATCH 036/177] Move OpenSSLConfig.cmake into the cmake/ directory We've already put perlasm.cmake in there. I figure CMake helper files can go in there. It also seems to match what other projects too. Change-Id: Ief6b10cf4e80b8d4b52ca53b90aa425b32037e52 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56566 Auto-Submit: David Benjamin Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- CMakeLists.txt | 2 +- OpenSSLConfig.cmake => cmake/OpenSSLConfig.cmake | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename OpenSSLConfig.cmake => cmake/OpenSSLConfig.cmake (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6085713fa0..536d83e6c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -611,4 +611,4 @@ install(EXPORT OpenSSLTargets NAMESPACE OpenSSL:: DESTINATION lib/cmake/OpenSSL ) -install(FILES OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) +install(FILES cmake/OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) diff --git a/OpenSSLConfig.cmake b/cmake/OpenSSLConfig.cmake similarity index 100% rename from OpenSSLConfig.cmake rename to cmake/OpenSSLConfig.cmake From 50de086abd0f23b58320d6aa310bacdd48e80e53 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Feb 2023 11:25:15 -0500 Subject: [PATCH 037/177] Cap bit indices in the unsafe string-based X.509 extensions API Without a limit, a short input can translate into a very large allocation, which is upsetting the fuzzers. Set a limit of 256, which allows up to a 32-byte allocation. (The highest bit index of any type in RFC 5280 is 8, so this is plenty of buffer.) We do not consider this function to be safe with untrusted inputs (even without bugs, it is prone to string injection vulnerabilities), so DoS is not truly a concern, but the limit is necessary to keep fuzzing effective. Update-Note: If anyone is using FORMAT:BITLIST to create very large BIT STRINGs, this will break. This is unlikely and should be caught by unit tests; if a project hits this outside of tests, that means they are passing untrusted input into this function, which is a security vulnerability in itself, and means they especially need this change to avoid a DoS. Bug: oss-fuzz:55603 Change-Id: Ie9ec0d35c7d67a568371dfa961867bf1404f7e2f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56785 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- crypto/x509/asn1_gen.c | 11 ++++++++++- crypto/x509/x509_test.cc | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c index 6dcf1292ec..37048087f1 100644 --- a/crypto/x509/asn1_gen.c +++ b/crypto/x509/asn1_gen.c @@ -541,7 +541,16 @@ static int bitstr_cb(const char *elem, size_t len, void *bitstr) { CBS_init(&cbs, (const uint8_t *)elem, len); uint64_t bitnum; if (!CBS_get_u64_decimal(&cbs, &bitnum) || CBS_len(&cbs) != 0 || - bitnum > INT_MAX) { + // Cap the highest allowed bit so this mechanism cannot be used to create + // extremely large allocations with short inputs. The highest named bit in + // RFC 5280 is 8, so 256 should give comfortable margin but still only + // allow a 32-byte allocation. + // + // We do not consider this function to be safe with untrusted inputs (even + // without bugs, it is prone to string injection vulnerabilities), so DoS + // is not truly a concern, but the limit is necessary to keep fuzzing + // effective. + bitnum > 256) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_NUMBER); return 0; } diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 9abe953364..cd231c85fb 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -6074,8 +6074,18 @@ TEST(X509Test, ExtensionFromConf) { 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x04, 0x03, 0x02, 0x02, 0x44}}, {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:1,invalid,5", nullptr, {}}, - // Overflow. - {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:4294967296", nullptr, {}}, + // Negative bit inidices are not allowed. + {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:-1", nullptr, {}}, + // We cap bit indices at 256. + {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:257", nullptr, {}}, + {kTestOID, + "ASN1:FORMAT:BITLIST,BITSTR:256", + nullptr, + {0x30, 0x34, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x24, 0x03, 0x22, 0x07, 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, 0x80}}, // Unsupported formats for string types. {kTestOID, "ASN1:FORMAT:BITLIST,IA5:abcd", nullptr, {}}, From 3c7053975b35a631f477f42f07502003d35aa2ff Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Feb 2023 17:25:07 -0500 Subject: [PATCH 038/177] Fix leak on error in v2i_POLICY_MAPPINGS If obj2 were invalid, obj1 leaks. Also both leak if creating the POLICY_MAPPINGS object fails on allocation error. Just swap the order, so the ASN1_OBJECTs go to an owned pointer from the start. Bug: oss-fuzz:55636 Change-Id: Ibf0bf58f44db510623035004f6eb1e00961a5454 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56805 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Reviewed-by: Adam Langley Auto-Submit: David Benjamin Commit-Queue: David Benjamin Commit-Queue: Adam Langley --- crypto/x509/x509_test.cc | 8 ++++++++ crypto/x509v3/v3_pmaps.c | 29 +++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index cd231c85fb..16c47d462c 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5762,6 +5762,14 @@ TEST(X509Test, ExtensionFromConf) { {"subjectAltName", "otherName:invalid_oid;BOOLEAN:TRUE", nullptr, {}}, {"subjectAltName", "otherName:1.2.3.4;invalid_value", nullptr, {}}, + {"policyMappings", + "1.1.1.1:2.2.2.2", + nullptr, + {0x30, 0x15, 0x06, 0x03, 0x55, 0x1d, 0x21, 0x04, 0x0e, 0x30, 0x0c, 0x30, + 0x0a, 0x06, 0x03, 0x29, 0x01, 0x01, 0x06, 0x03, 0x52, 0x02, 0x02}}, + {"policyMappings", "invalid_oid:2.2.2.2", nullptr, {}}, + {"policyMappings", "1.1.1.1:invalid_oid", nullptr, {}}, + // The "DER:" prefix just specifies an arbitrary byte string. Colons // separators are ignored. {kTestOID, "DER:0001020304", nullptr, {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, diff --git a/crypto/x509v3/v3_pmaps.c b/crypto/x509v3/v3_pmaps.c index b6f33841d3..dae4b66640 100644 --- a/crypto/x509v3/v3_pmaps.c +++ b/crypto/x509v3/v3_pmaps.c @@ -124,28 +124,29 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); if (!val->value || !val->name) { - sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); X509V3_conf_err(val); - return NULL; - } - ASN1_OBJECT *obj1 = OBJ_txt2obj(val->name, 0); - ASN1_OBJECT *obj2 = OBJ_txt2obj(val->value, 0); - if (!obj1 || !obj2) { - sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); - OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); - X509V3_conf_err(val); - return NULL; + goto err; } + POLICY_MAPPING *pmap = POLICY_MAPPING_new(); if (pmap == NULL || !sk_POLICY_MAPPING_push(pmaps, pmap)) { POLICY_MAPPING_free(pmap); - sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - return NULL; + goto err; + } + + pmap->issuerDomainPolicy = OBJ_txt2obj(val->name, 0); + pmap->subjectDomainPolicy = OBJ_txt2obj(val->value, 0); + if (!pmap->issuerDomainPolicy || !pmap->subjectDomainPolicy) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); + X509V3_conf_err(val); + goto err; } - pmap->issuerDomainPolicy = obj1; - pmap->subjectDomainPolicy = obj2; } return pmaps; + +err: + sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); + return NULL; } From 5bdf5e4ac251e7e9eca5693104d802d94a28f28b Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 14:06:29 -0500 Subject: [PATCH 039/177] Silence an uninitialized variable false positive in GCC. When building with OPENSSL_NO_ASM, things are inlined enough that GCC figures out bn_reduce_once reads words, but not that bn_big_endian_to_words initializes the parts that are read. Change-Id: Id4d77cec6ca0782edd0d93022436bd307c2bba17 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56826 Reviewed-by: Bob Beck Commit-Queue: David Benjamin Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- crypto/fipsmodule/ec/ec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/fipsmodule/ec/ec.c b/crypto/fipsmodule/ec/ec.c index 4e632e1971..debb965845 100644 --- a/crypto/fipsmodule/ec/ec.c +++ b/crypto/fipsmodule/ec/ec.c @@ -1195,7 +1195,7 @@ int ec_get_x_coordinate_as_scalar(const EC_GROUP *group, EC_SCALAR *out, // Additionally, one can manually check this property for built-in curves. It // is enforced for legacy custom curves in |EC_GROUP_set_generator|. const BIGNUM *order = &group->order; - BN_ULONG words[EC_MAX_WORDS + 1]; + BN_ULONG words[EC_MAX_WORDS + 1] = {0}; bn_big_endian_to_words(words, order->width + 1, bytes, len); bn_reduce_once(out->words, words, /*carry=*/words[order->width], order->d, order->width); From aa83c12069f3d62704fce3d499b068b5bf1b6e31 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 12:21:56 -0500 Subject: [PATCH 040/177] Clear various false positives in RSA constant-time validation This silences a few false positives in the valgrind-based constant-time validation. First, there are a few precondition checks that are publicly true, but valgrind doesn't know that. I've added a constant_time_declassify_int function and stuck those in there, since the existing macro is mostly suited for macros. It also adds a value barrier in production code (see comment for why). If we more thoroughly decoupled RSA from BIGNUM, we could probably avoid this, since a lot of comes from going through public BIGNUM APIs. Next, our BIGNUM strategy is such that bounds on bignums are sometimes computed pessimally, and then clamped down later. Modular arithmetic is trivially bounded and avoids that, but RSA CRT involves some non-modular computations. As a result, we actually compute a few more words than necessary in the RSA result, and then bn_resize_words down. bn_resize_words also has a precondition check, which checks that all discarded words are zero. They are, but valgrind does not know that. Similarly, the BN_bn2bin_padded call at the end checks for discarded non-zero bytes, but valgrind does not know that, because the output is bounded by n, the discarded bytes are zero. I've added a bn_assert_fits_in_bytes to clear this. It's an assert in debug mode and a declassification in constant-time validation. I suspect a different secret integer design would avoid needing this. I think this comes from a combination of non-modular arithmetic, not having callers pass explicit width, and tracking public widths at the word granularity, rather than byte or bit. (Bit would actually be most ideal.) Maybe worth a ponder sometime. Change-Id: I1bc9443d571d2881e2d857c70be913074deac156 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56825 Commit-Queue: Bob Beck Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/fipsmodule/bn/bytes.c | 12 ++++++++++++ crypto/fipsmodule/bn/exponentiation.c | 3 ++- crypto/fipsmodule/bn/internal.h | 12 +++++++++--- crypto/fipsmodule/rsa/rsa_impl.c | 26 ++++++++++++++++++-------- crypto/internal.h | 26 ++++++++++++++++++++++---- 5 files changed, 63 insertions(+), 16 deletions(-) diff --git a/crypto/fipsmodule/bn/bytes.c b/crypto/fipsmodule/bn/bytes.c index da27426c86..331e085962 100644 --- a/crypto/fipsmodule/bn/bytes.c +++ b/crypto/fipsmodule/bn/bytes.c @@ -162,6 +162,18 @@ static int fits_in_bytes(const BN_ULONG *words, size_t num_words, return mask == 0; } +void bn_assert_fits_in_bytes(const BIGNUM *bn, size_t num) { + const uint8_t *bytes = (const uint8_t *)bn->d; + size_t tot_bytes = bn->width * sizeof(BN_ULONG); + if (tot_bytes > num) { + CONSTTIME_DECLASSIFY(bytes + num, tot_bytes - num); + for (size_t i = num; i < tot_bytes; i++) { + assert(bytes[i] == 0); + } + (void)bytes; + } +} + void bn_words_to_big_endian(uint8_t *out, size_t out_len, const BN_ULONG *in, size_t in_len) { // The caller should have selected an output length without truncation. diff --git a/crypto/fipsmodule/bn/exponentiation.c b/crypto/fipsmodule/bn/exponentiation.c index 859cf65b83..ad3770d6c9 100644 --- a/crypto/fipsmodule/bn/exponentiation.c +++ b/crypto/fipsmodule/bn/exponentiation.c @@ -594,7 +594,8 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, OPENSSL_PUT_ERROR(BN, BN_R_NEGATIVE_NUMBER); return 0; } - if (a->neg || BN_ucmp(a, m) >= 0) { + // |a| is secret, but |a < m| is not. + if (a->neg || constant_time_declassify_int(BN_ucmp(a, m)) >= 0) { OPENSSL_PUT_ERROR(BN, BN_R_INPUT_NOT_REDUCED); return 0; } diff --git a/crypto/fipsmodule/bn/internal.h b/crypto/fipsmodule/bn/internal.h index 0bccf1eb10..ca3e3e7905 100644 --- a/crypto/fipsmodule/bn/internal.h +++ b/crypto/fipsmodule/bn/internal.h @@ -217,8 +217,8 @@ extern "C" { #define Hw(t) ((BN_ULONG)((t) >> BN_BITS2)) #endif -// bn_minimal_width returns the minimal value of |bn->top| which fits the -// value of |bn|. +// bn_minimal_width returns the minimal number of words needed to represent +// |bn|. int bn_minimal_width(const BIGNUM *bn); // bn_set_minimal_width sets |bn->width| to |bn_minimal_width(bn)|. If |bn| is @@ -234,7 +234,7 @@ int bn_wexpand(BIGNUM *bn, size_t words); // than a number of words. int bn_expand(BIGNUM *bn, size_t bits); -// bn_resize_words adjusts |bn->top| to be |words|. It returns one on success +// bn_resize_words adjusts |bn->width| to be |words|. It returns one on success // and zero on allocation error or if |bn|'s value is too large. OPENSSL_EXPORT int bn_resize_words(BIGNUM *bn, size_t words); @@ -263,6 +263,12 @@ int bn_fits_in_words(const BIGNUM *bn, size_t num); // is representable in |num| words. Otherwise, it returns zero. int bn_copy_words(BN_ULONG *out, size_t num, const BIGNUM *bn); +// bn_assert_fits_in_bytes asserts that |bn| fits in |num| bytes. This is a +// no-op in release builds, but triggers an assert in debug builds, and +// declassifies all bytes which are therefore known to be zero in constant-time +// validation. +void bn_assert_fits_in_bytes(const BIGNUM *bn, size_t num); + // bn_mul_add_words multiples |ap| by |w|, adds the result to |rp|, and places // the result in |rp|. |ap| and |rp| must both be |num| words long. It returns // the carry word of the operation. |ap| and |rp| may be equal but otherwise may diff --git a/crypto/fipsmodule/rsa/rsa_impl.c b/crypto/fipsmodule/rsa/rsa_impl.c index 3a069ecfc5..b9c47cd0c4 100644 --- a/crypto/fipsmodule/rsa/rsa_impl.c +++ b/crypto/fipsmodule/rsa/rsa_impl.c @@ -722,6 +722,8 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, goto err; } + // The caller should have ensured this. + assert(len == BN_num_bytes(rsa->n)); if (BN_bin2bn(in, len, f) == NULL) { goto err; } @@ -783,16 +785,16 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, // works when the CRT isn't used. That attack is much less likely to succeed // than the CRT attack, but there have likely been improvements since 1997. // - // This check is cheap assuming |e| is small; it almost always is. + // This check is cheap assuming |e| is small, which we require in + // |rsa_check_public_key|. if (rsa->e != NULL) { BIGNUM *vrfy = BN_CTX_get(ctx); if (vrfy == NULL || !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) || - !BN_equal_consttime(vrfy, f)) { + !constant_time_declassify_int(BN_equal_consttime(vrfy, f))) { OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR); goto err; } - } if (do_blinding && @@ -806,6 +808,7 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, // // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010. assert(result->width == rsa->mont_n->N.width); + bn_assert_fits_in_bytes(result, len); if (!BN_bn2bin_padded(out, len, result)) { OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR); goto err; @@ -924,11 +927,18 @@ static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { // so it is correct mod q. Finally, the result is bounded by [m1, n + m1), // and the result is at least |m1|, so this must be the unique answer in // [0, n). - !bn_mul_consttime(r0, r0, q, ctx) || - !bn_uadd_consttime(r0, r0, m1) || - // The result should be bounded by |n|, but fixed-width operations may - // bound the width slightly higher, so fix it. - !bn_resize_words(r0, n->width)) { + !bn_mul_consttime(r0, r0, q, ctx) || // + !bn_uadd_consttime(r0, r0, m1)) { + goto err; + } + + // The result should be bounded by |n|, but fixed-width operations may + // bound the width slightly higher, so fix it. This trips constant-time checks + // because a naive data flow analysis does not realize the excess words are + // publicly zero. + assert(BN_cmp(r0, n) < 0); + bn_assert_fits_in_bytes(r0, BN_num_bytes(n)); + if (!bn_resize_words(r0, n->width)) { goto err; } diff --git a/crypto/internal.h b/crypto/internal.h index f9a243e670..9bbba9e5a0 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -465,20 +465,38 @@ static inline int constant_time_select_int(crypto_word_t mask, int a, int b) { // of memory as secret. Secret data is tracked as it flows to registers and // other parts of a memory. If secret data is used as a condition for a branch, // or as a memory index, it will trigger warnings in valgrind. -#define CONSTTIME_SECRET(x, y) VALGRIND_MAKE_MEM_UNDEFINED(x, y) +#define CONSTTIME_SECRET(ptr, len) VALGRIND_MAKE_MEM_UNDEFINED(ptr, len) // CONSTTIME_DECLASSIFY takes a pointer and a number of bytes and marks that // region of memory as public. Public data is not subject to constant-time // rules. -#define CONSTTIME_DECLASSIFY(x, y) VALGRIND_MAKE_MEM_DEFINED(x, y) +#define CONSTTIME_DECLASSIFY(ptr, len) VALGRIND_MAKE_MEM_DEFINED(ptr, len) #else -#define CONSTTIME_SECRET(x, y) -#define CONSTTIME_DECLASSIFY(x, y) +#define CONSTTIME_SECRET(ptr, len) +#define CONSTTIME_DECLASSIFY(ptr, len) #endif // BORINGSSL_CONSTANT_TIME_VALIDATION +static inline int constant_time_declassify_int(int v) { + // Return |v| through a value barrier to be safe. Valgrind-based constant-time + // validation is partly to check the compiler has not undone any constant-time + // work. Any place |BORINGSSL_CONSTANT_TIME_VALIDATION| influences + // optimizations, this validation is inaccurate. + // + // However, by sending pointers through valgrind, we likely inhibit escape + // analysis. On local variables, particularly booleans, we likely + // significantly impact optimizations. + // + // Thus, to be safe, stick a value barrier, in hopes of comparably inhibiting + // compiler analysis. + static_assert(sizeof(uint32_t) == sizeof(int), + "int is not the same size as uint32_t"); + CONSTTIME_DECLASSIFY(&v, sizeof(v)); + return value_barrier_u32(v); +} + // Thread-safe initialisation. From 53b876a4d15da0145495ec3a17521a2690fe5978 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 23:40:18 -0500 Subject: [PATCH 041/177] Stop clang from un-constant-timing copy_from_prebuf. Newer versions of clang figure out that copy_from_prebuf (used in builds that aren't x86_64 with assembly optimizations) has a bunch of no-op iterations and insert a branch. Add a value barrier to stop it. This was caught by our valgrind-based constant-time validation. As part of this, I noticed that OPENSSL_NO_ASM builds turn off value barriers. This is because the value barriers use an empty inline asm block. While this is technically correct, it's probably unnecessary. The clang|gcc check means we know GCC-style inline assembly is supported. Disabling inline asm is used by sanitizers to shut off unintrumentable code, but there's no uninstrumentable code in the empty string. It's also used by consumers who haven't figured out how to integrate an assembler into their build system, but that also doesn't apply. So just remove the condition on the value barriers so OPENSSL_NO_ASM also get mitigations. Update-Note: It is possible the above is wrong and some OPENSSL_NO_ASM relied on value barriers being disabled. If so, this will break that build and we'll need to reconsider. Change-Id: I6e3ea3ee705bef3afcf42d3532b17aaabbbcc60b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56827 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/curve25519/curve25519.c | 4 ---- crypto/fipsmodule/bn/exponentiation.c | 6 +++++- crypto/fipsmodule/ec/p256.c | 4 ---- crypto/internal.h | 6 +++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/crypto/curve25519/curve25519.c b/crypto/curve25519/curve25519.c index 17740b83ea..6a0af2d9f9 100644 --- a/crypto/curve25519/curve25519.c +++ b/crypto/curve25519/curve25519.c @@ -35,10 +35,6 @@ // Various pre-computed constants. #include "./curve25519_tables.h" -#if defined(OPENSSL_NO_ASM) -#define FIAT_25519_NO_ASM -#endif - #if defined(BORINGSSL_CURVE25519_64BIT) #include "../../third_party/fiat/curve25519_64.h" #else diff --git a/crypto/fipsmodule/bn/exponentiation.c b/crypto/fipsmodule/bn/exponentiation.c index ad3770d6c9..4ec9171e2b 100644 --- a/crypto/fipsmodule/bn/exponentiation.c +++ b/crypto/fipsmodule/bn/exponentiation.c @@ -852,7 +852,11 @@ static int copy_from_prebuf(BIGNUM *b, int top, const BN_ULONG *table, int idx, OPENSSL_memset(b->d, 0, sizeof(BN_ULONG) * top); const int width = 1 << window; for (int i = 0; i < width; i++, table += top) { - BN_ULONG mask = constant_time_eq_int(i, idx); + // Use a value barrier to prevent Clang from adding a branch when |i != idx| + // and making this copy not constant time. Clang is still allowed to learn + // that |mask| is constant across the inner loop, so this won't inhibit any + // vectorization it might do. + BN_ULONG mask = value_barrier_w(constant_time_eq_int(i, idx)); for (int j = 0; j < top; j++) { b->d[j] |= table[j] & mask; } diff --git a/crypto/fipsmodule/ec/p256.c b/crypto/fipsmodule/ec/p256.c index 816e6f1ad4..bbbba948bf 100644 --- a/crypto/fipsmodule/ec/p256.c +++ b/crypto/fipsmodule/ec/p256.c @@ -30,10 +30,6 @@ #include "../delocate.h" #include "./internal.h" -#if defined(OPENSSL_NO_ASM) -#define FIAT_P256_NO_ASM -#endif - #if defined(BORINGSSL_HAS_UINT128) #define BORINGSSL_NISTP256_64BIT 1 #include "../../../third_party/fiat/p256_64.h" diff --git a/crypto/internal.h b/crypto/internal.h index 9bbba9e5a0..4060e4ce4b 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -302,7 +302,7 @@ typedef uint32_t crypto_word_t; // always has the same output for a given input. This allows it to eliminate // dead code, move computations across loops, and vectorize. static inline crypto_word_t value_barrier_w(crypto_word_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) +#if defined(__GNUC__) || defined(__clang__) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; @@ -310,7 +310,7 @@ static inline crypto_word_t value_barrier_w(crypto_word_t a) { // value_barrier_u32 behaves like |value_barrier_w| but takes a |uint32_t|. static inline uint32_t value_barrier_u32(uint32_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) +#if defined(__GNUC__) || defined(__clang__) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; @@ -318,7 +318,7 @@ static inline uint32_t value_barrier_u32(uint32_t a) { // value_barrier_u64 behaves like |value_barrier_w| but takes a |uint64_t|. static inline uint64_t value_barrier_u64(uint64_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) +#if defined(__GNUC__) || defined(__clang__) __asm__("" : "+r"(a) : /* no inputs */); #endif return a; From 210674b62a804e9b30c53df3be020d86f8ce3b55 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 30 Jan 2023 21:50:35 -0500 Subject: [PATCH 042/177] Fix some clang-format formatting. I forgot to put ASN1_CHOICE_END_cb in the StatementMacros list, which caused it to mangle the formatting a bit. Also remove the duplicate ASN1_SEQUENCE_END. Change-Id: I58b6c6f028b81fb717722e02260f3dfaa4d17e4b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56665 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- .clang-format | 2 +- crypto/x509v3/v3_crld.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.clang-format b/.clang-format index 0ab585e26f..33b77f9ad7 100644 --- a/.clang-format +++ b/.clang-format @@ -10,7 +10,6 @@ PointerAlignment: Right IncludeBlocks: Preserve TypenameMacros: ['LHASH_OF', 'STACK_OF'] StatementMacros: - - "ASN1_SEQUENCE_END" - "DECLARE_ASN1_ALLOC_FUNCTIONS" - "DECLARE_ASN1_ALLOC_FUNCTIONS_name" - "DECLARE_ASN1_ENCODE_FUNCTIONS" @@ -69,6 +68,7 @@ StatementMacros: - "IMPLEMENT_PEM_write_fp_const" - "ASN1_ADB_END" - "ASN1_CHOICE_END" + - "ASN1_CHOICE_END_cb" - "ASN1_ITEM_TEMPLATE_END" - "ASN1_SEQUENCE_END" - "ASN1_SEQUENCE_END_cb" diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index 0b6899a6fb..c431b08348 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -384,14 +384,12 @@ static int dpn_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, } -ASN1_CHOICE_cb(DIST_POINT_NAME, dpn_cb) = - { - ASN1_IMP_SEQUENCE_OF(DIST_POINT_NAME, name.fullname, GENERAL_NAME, 0), - ASN1_IMP_SET_OF(DIST_POINT_NAME, name.relativename, X509_NAME_ENTRY, 1), +ASN1_CHOICE_cb(DIST_POINT_NAME, dpn_cb) = { + ASN1_IMP_SEQUENCE_OF(DIST_POINT_NAME, name.fullname, GENERAL_NAME, 0), + ASN1_IMP_SET_OF(DIST_POINT_NAME, name.relativename, X509_NAME_ENTRY, 1), } ASN1_CHOICE_END_cb(DIST_POINT_NAME, DIST_POINT_NAME, type) - - IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT_NAME) +IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT_NAME) ASN1_SEQUENCE(DIST_POINT) = { ASN1_EXP_OPT(DIST_POINT, distpoint, DIST_POINT_NAME, 0), From 8f220ece1e855b969f8b764c49212dc655b55f04 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Feb 2023 23:56:26 -0500 Subject: [PATCH 043/177] Clear false positives in RSA-OAEP constant time validation We check OAEP padding in constant time, but once the padding is determined to be valid (or not), this fact and, if valid, the output length are public. Change-Id: I2aa6a707ca9a91761776746264416736c820977c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56845 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/fipsmodule/rsa/padding.c | 12 +++++++++--- crypto/internal.h | 8 +++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/crypto/fipsmodule/rsa/padding.c b/crypto/fipsmodule/rsa/padding.c index 0dafed442b..17d4c62be9 100644 --- a/crypto/fipsmodule/rsa/padding.c +++ b/crypto/fipsmodule/rsa/padding.c @@ -457,10 +457,16 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, bad |= looking_for_one_byte; - if (bad) { + // Whether the overall padding was valid or not in OAEP is public. + if (constant_time_declassify_w(bad)) { goto decoding_err; } + // Once the padding is known to be valid, the output length is also public. + static_assert(sizeof(size_t) <= sizeof(crypto_word_t), + "size_t does not fit in crypto_word_t"); + one_index = constant_time_declassify_w(one_index); + one_index++; size_t mlen = dblen - one_index; if (max_out < mlen) { @@ -475,8 +481,8 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, return 1; decoding_err: - // to avoid chosen ciphertext attacks, the error message should not reveal - // which kind of decoding error happened + // To avoid chosen ciphertext attacks, the error message should not reveal + // which kind of decoding error happened. OPENSSL_PUT_ERROR(RSA, RSA_R_OAEP_DECODING_ERROR); err: OPENSSL_free(db); diff --git a/crypto/internal.h b/crypto/internal.h index 4060e4ce4b..46a4e70ee9 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -479,7 +479,7 @@ static inline int constant_time_select_int(crypto_word_t mask, int a, int b) { #endif // BORINGSSL_CONSTANT_TIME_VALIDATION -static inline int constant_time_declassify_int(int v) { +static inline crypto_word_t constant_time_declassify_w(crypto_word_t v) { // Return |v| through a value barrier to be safe. Valgrind-based constant-time // validation is partly to check the compiler has not undone any constant-time // work. Any place |BORINGSSL_CONSTANT_TIME_VALIDATION| influences @@ -491,8 +491,14 @@ static inline int constant_time_declassify_int(int v) { // // Thus, to be safe, stick a value barrier, in hopes of comparably inhibiting // compiler analysis. + CONSTTIME_DECLASSIFY(&v, sizeof(v)); + return value_barrier_w(v); +} + +static inline int constant_time_declassify_int(int v) { static_assert(sizeof(uint32_t) == sizeof(int), "int is not the same size as uint32_t"); + // See comment above. CONSTTIME_DECLASSIFY(&v, sizeof(v)); return value_barrier_u32(v); } From eb0b7e4df6eb5a082c2b977784f4270b55c58361 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 3 Feb 2023 15:32:52 -0500 Subject: [PATCH 044/177] Fix leak in error-handling for issuingDistributionPoint Handling of duplicate keys is all over the place. For set_reasons, it tried to catch it but leaked memory. Also fix a hypothetical memory leak in crldp_from_section, but I think it's actually impossible because any list of CONF_VALUE from a section, rather than from X509V3_parse_list, cannot have duplicates. It just overrides the previous value. (Ideally we'd be consistent about whether duplicates override previous values or are caught, but I'm opting to just leave the existing behavior alone because no one should be using these APIs in the first place.) Bug: oss-fuzz:55669 Change-Id: I95d23c257203dcd799d19f334ef847a97d060aad Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56865 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: David Benjamin --- crypto/x509/x509_test.cc | 17 +++++++++++++++++ crypto/x509v3/v3_crld.c | 20 ++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 16c47d462c..4760044f5f 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5733,6 +5733,23 @@ TEST(X509Test, ExtensionFromConf) { // value is not allowed. {"issuingDistributionPoint", "fullname", nullptr, {}}, + // Duplicate reason keys are an error. Reaching this case is interesting. + // The value can a string like "key:value,key:value", or it can be + // "@section" and reference a config section. If using a string, duplicate + // keys are possible, but then it is impossible to put commas in the + // value, as onlysomereasons expects. If using a section reference, it is + // impossible to have a duplicate key because the config file parser + // overrides the old value. + {"issuingDistributionPoint", + "onlysomereasons:keyCompromise", + nullptr, + {0x30, 0x0d, 0x06, 0x03, 0x55, 0x1d, 0x1c, 0x04, 0x06, 0x30, 0x04, 0x83, + 0x02, 0x06, 0x40}}, + {"issuingDistributionPoint", + "onlysomereasons:keyCompromise,onlysomereasons:CACompromise\n", + nullptr, + {}}, + // subjectAltName has a series of string-based inputs for each name type. {"subjectAltName", "email:foo@example.com, URI:https://example.com, DNS:example.com, " diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index c431b08348..0206c7acf7 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -209,26 +209,25 @@ static const BIT_STRING_BITNAME reason_flags[] = { {-1, NULL, NULL}}; static int set_reasons(ASN1_BIT_STRING **preas, const char *value) { - STACK_OF(CONF_VALUE) *rsk = NULL; - const BIT_STRING_BITNAME *pbn; - const char *bnam; - size_t i; - int ret = 0; - rsk = X509V3_parse_list(value); - if (!rsk) { + if (*preas) { + // Duplicate "reasons" or "onlysomereasons" key. + OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_VALUE); return 0; } - if (*preas) { + int ret = 0; + STACK_OF(CONF_VALUE) *rsk = X509V3_parse_list(value); + if (!rsk) { return 0; } - for (i = 0; i < sk_CONF_VALUE_num(rsk); i++) { - bnam = sk_CONF_VALUE_value(rsk, i)->name; + for (size_t i = 0; i < sk_CONF_VALUE_num(rsk); i++) { + const char *bnam = sk_CONF_VALUE_value(rsk, i)->name; if (!*preas) { *preas = ASN1_BIT_STRING_new(); if (!*preas) { goto err; } } + const BIT_STRING_BITNAME *pbn; for (pbn = reason_flags; pbn->lname; pbn++) { if (!strcmp(pbn->sname, bnam)) { if (!ASN1_BIT_STRING_set_bit(*preas, pbn->bitnum, 1)) { @@ -292,6 +291,7 @@ static DIST_POINT *crldp_from_section(const X509V3_CTX *ctx, goto err; } } else if (!strcmp(cnf->name, "CRLissuer")) { + GENERAL_NAMES_free(point->CRLissuer); point->CRLissuer = gnames_from_sectname(ctx, cnf->value); if (!point->CRLissuer) { goto err; From a028a5e01f2cd627e31f3d3dbdd8fe1f707734b4 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 6 Feb 2023 12:22:07 -0500 Subject: [PATCH 045/177] Fix leak in set_dist_point_name error handling. The temporary X509_NAME wasn't destroyed if the section didn't exist. Also document the weird 0 vs -1 convention (see callers), and revise the NULL check added in https://boringssl-review.googlesource.com/c/boringssl/+/56705. It doesn't make a difference, but we should only apply the NULL check after we've looked at the name, and return -1 because, after the name is checked, it's a known syntax error. Also fix a couple of comments that were wrong. It's that the RDNSequence we take from X509_NAME must have one RDN, not that there's one RDNSequence. (This is a consequence of X509_NAME's somewhat odd in-memory representation.) Bug: oss-fuzz:55700 Change-Id: I5745752bfa82802d361803868f962b2b0fa4bd32 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56929 Auto-Submit: David Benjamin Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- crypto/x509/x509_test.cc | 29 +++++++++++++++++++++++++++++ crypto/x509v3/v3_crld.c | 33 ++++++++++++++++++++------------- include/openssl/x509.h | 2 +- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 4760044f5f..e152f3d1a6 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5733,6 +5733,35 @@ TEST(X509Test, ExtensionFromConf) { // value is not allowed. {"issuingDistributionPoint", "fullname", nullptr, {}}, + {"issuingDistributionPoint", + "relativename:name", + "[name]\nCN=Hello\n", + {0x30, 0x1b, 0x06, 0x03, 0x55, 0x1d, 0x1c, 0x04, 0x14, 0x30, + 0x12, 0xa0, 0x10, 0xa1, 0x0e, 0x30, 0x0c, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f}}, + + // relativename referencing a section which doesn't exist. + {"issuingDistributionPoint", + "relativename:wrong_section_name", + "[name]\nCN=Hello\n", + {}}, + + // relativename must be a single RDN. By default, the section-based name + // syntax puts each attribute into its own RDN. + {"issuingDistributionPoint", + "relativename:name", + "[name]\nCN=Hello\nC=US\n", + {}}, + + // A single RDN with multiple attributes is allowed. + {"issuingDistributionPoint", + "relativename:name", + "[name]\nCN=Hello\n+C=US\n", + {0x30, 0x26, 0x06, 0x03, 0x55, 0x1d, 0x1c, 0x04, 0x1f, 0x30, + 0x1d, 0xa0, 0x1b, 0xa1, 0x19, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x30, 0x0c, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f}}, + // Duplicate reason keys are an error. Reaching this case is interesting. // The value can a string like "key:value,key:value", or it can be // "@section" and reference a config section. If using a string, duplicate diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index 0206c7acf7..a3cae42697 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -127,27 +127,30 @@ static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, return gens; } +// set_dist_point_name decodes a DistributionPointName from |cnf| and writes the +// result in |*pdp|. It returns 1 on success, -1 on error, and 0 if |cnf| used +// an unrecognized input type. The zero return can be used by callers to support +// additional syntax. static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, const CONF_VALUE *cnf) { - // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i - // function, |cnf->value| may be NULL. - if (cnf->value == NULL) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); - return 0; - } - STACK_OF(GENERAL_NAME) *fnm = NULL; STACK_OF(X509_NAME_ENTRY) *rnm = NULL; if (!strncmp(cnf->name, "fullname", 9)) { + // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i + // function, |cnf->value| may be NULL. + if (cnf->value == NULL) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); + return -1; + } fnm = gnames_from_sectname(ctx, cnf->value); if (!fnm) { goto err; } } else if (!strcmp(cnf->name, "relativename")) { - int ret; - X509_NAME *nm; - nm = X509_NAME_new(); - if (!nm) { + // If |cnf| comes from |X509V3_parse_list|, which is possible for a v2i + // function, |cnf->value| may be NULL. + if (cnf->value == NULL) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return -1; } const STACK_OF(CONF_VALUE) *dnsect = X509V3_get_section(ctx, cnf->value); @@ -155,14 +158,18 @@ static int set_dist_point_name(DIST_POINT_NAME **pdp, const X509V3_CTX *ctx, OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); return -1; } - ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC); + X509_NAME *nm = X509_NAME_new(); + if (!nm) { + return -1; + } + int ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC); rnm = nm->entries; nm->entries = NULL; X509_NAME_free(nm); if (!ret || sk_X509_NAME_ENTRY_num(rnm) <= 0) { goto err; } - // Since its a name fragment can't have more than one RDNSequence + // There can only be one RDN in nameRelativeToCRLIssuer. if (sk_X509_NAME_ENTRY_value(rnm, sk_X509_NAME_ENTRY_num(rnm) - 1)->set) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_MULTIPLE_RDNS); goto err; diff --git a/include/openssl/x509.h b/include/openssl/x509.h index e3ba8e006d..f38574f62f 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -938,7 +938,7 @@ OPENSSL_EXPORT int X509_NAME_add_entry(X509_NAME *name, // success or zero on error. The entry's attribute type is |obj|. The entry's // attribute value is determined by |type|, |bytes|, and |len|, as in // |X509_NAME_ENTRY_set_data|. The entry's position is determined by |loc| and -// |set| as in |X509_NAME_entry|. +// |set| as in |X509_NAME_add_entry|. OPENSSL_EXPORT int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, const uint8_t *bytes, int len, From db98becc488393f735790ada8b1214cb4b8c58a5 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 6 Feb 2023 14:24:28 -0500 Subject: [PATCH 046/177] Const-correct the various EVP_PKEY PEM writers Change-Id: I6fa17e204cb2003a6803e01604c0187420b4e39b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56945 Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/pem/pem_pk8.c | 38 ++++++++++++++++++++------------------ include/openssl/pem.h | 22 +++++++++++----------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/crypto/pem/pem_pk8.c b/crypto/pem/pem_pk8.c index 85196fa9bc..610f36ca7f 100644 --- a/crypto/pem/pem_pk8.c +++ b/crypto/pem/pem_pk8.c @@ -64,10 +64,10 @@ #include #include -static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid, +static int do_pk8pkey(BIO *bp, const EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u); -static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder, int nid, +static int do_pk8pkey_fp(FILE *bp, const EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u); @@ -76,29 +76,30 @@ static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder, int nid, // is NULL then it uses the unencrypted private key form. The 'nid' versions // uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0. -int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr, - int klen, pem_password_cb *cb, void *u) { +int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid, + char *kstr, int klen, pem_password_cb *cb, + void *u) { return do_pk8pkey(bp, x, 0, nid, NULL, kstr, klen, cb, u); } -int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, - char *kstr, int klen, pem_password_cb *cb, - void *u) { +int PEM_write_bio_PKCS8PrivateKey(BIO *bp, const EVP_PKEY *x, + const EVP_CIPHER *enc, char *kstr, int klen, + pem_password_cb *cb, void *u) { return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u); } -int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, +int i2d_PKCS8PrivateKey_bio(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u) { return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u); } -int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, char *kstr, +int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, const EVP_PKEY *x, int nid, char *kstr, int klen, pem_password_cb *cb, void *u) { return do_pk8pkey(bp, x, 1, nid, NULL, kstr, klen, cb, u); } -static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid, +static int do_pk8pkey(BIO *bp, const EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u) { X509_SIG *p8; @@ -190,28 +191,29 @@ EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, } -int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, +int i2d_PKCS8PrivateKey_fp(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u) { return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u); } -int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, char *kstr, +int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, const EVP_PKEY *x, int nid, char *kstr, int klen, pem_password_cb *cb, void *u) { return do_pk8pkey_fp(fp, x, 1, nid, NULL, kstr, klen, cb, u); } -int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, char *kstr, - int klen, pem_password_cb *cb, void *u) { +int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, int nid, + char *kstr, int klen, pem_password_cb *cb, + void *u) { return do_pk8pkey_fp(fp, x, 0, nid, NULL, kstr, klen, cb, u); } -int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, - char *kstr, int klen, pem_password_cb *cb, - void *u) { +int PEM_write_PKCS8PrivateKey(FILE *fp, const EVP_PKEY *x, + const EVP_CIPHER *enc, char *kstr, int klen, + pem_password_cb *cb, void *u) { return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u); } -static int do_pk8pkey_fp(FILE *fp, EVP_PKEY *x, int isder, int nid, +static int do_pk8pkey_fp(FILE *fp, const EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u) { BIO *bp; diff --git a/include/openssl/pem.h b/include/openssl/pem.h index 56075ae8a4..9319ac80b8 100644 --- a/include/openssl/pem.h +++ b/include/openssl/pem.h @@ -417,40 +417,40 @@ DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY) DECLARE_PEM_rw(PUBKEY, EVP_PKEY) -OPENSSL_EXPORT int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, +OPENSSL_EXPORT int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid, char *kstr, int klen, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, +OPENSSL_EXPORT int PEM_write_bio_PKCS8PrivateKey(BIO *, const EVP_PKEY *, const EVP_CIPHER *, char *, int, pem_password_cb *, void *); -OPENSSL_EXPORT int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, +OPENSSL_EXPORT int i2d_PKCS8PrivateKey_bio(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid, - char *kstr, int klen, +OPENSSL_EXPORT int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, const EVP_PKEY *x, + int nid, char *kstr, int klen, pem_password_cb *cb, void *u); OPENSSL_EXPORT EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, +OPENSSL_EXPORT int i2d_PKCS8PrivateKey_fp(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, - char *kstr, int klen, +OPENSSL_EXPORT int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, const EVP_PKEY *x, + int nid, char *kstr, int klen, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, - char *kstr, int klen, +OPENSSL_EXPORT int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, + int nid, char *kstr, int klen, pem_password_cb *cb, void *u); OPENSSL_EXPORT EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u); -OPENSSL_EXPORT int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, +OPENSSL_EXPORT int PEM_write_PKCS8PrivateKey(FILE *fp, const EVP_PKEY *x, const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cd, void *u); From 582904fdde86be25dfc5ee1a4f5385444c214678 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2023 18:30:36 -0500 Subject: [PATCH 047/177] Move malloc failure testing into OPENSSL_malloc Rather than trying to override the actual malloc symbol, just intercept OPENSSL_malloc and gate it on a build flag. (When we first wrote these, OPENSSL_malloc was just an alias for malloc.) This has several benefits: - This is cross platform. We don't interfere with sanitizers or the libc, or have to mess with global symbols. - This removes the reason bssl_shim and handshaker linked test_support_lib, so we can fix the tes_support_lib / gtest dependency. - If we ever reduce the scope of fallible mallocs, we'll want to constrain the tests to only the ones that are fallible. An interception strategy like this can do it. Hopefully that will also take less time to run in the future. Also fix the ssl malloc failure tests, as they haven't been working for a while. (Malloc failure tests still take far too long to run to the end though. My immediate motivation is less malloc failure and more to tidy up the build.) Bug: 563 Change-Id: I32165b8ecbebfdcfde26964e06a404762edd28e3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56925 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- CMakeLists.txt | 4 ++ crypto/mem.c | 72 +++++++++++++++++++ crypto/test/CMakeLists.txt | 1 - crypto/test/malloc.cc | 143 ------------------------------------- ssl/test/CMakeLists.txt | 4 +- ssl/test/test_config.cc | 30 ++++---- ssl/test/test_state.cc | 23 +++--- 7 files changed, 108 insertions(+), 169 deletions(-) delete mode 100644 crypto/test/malloc.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 536d83e6c5..e0808d7031 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,6 +364,10 @@ if(CONSTANT_TIME_VALIDATION) add_definitions(-DNDEBUG) endif() +if(MALLOC_FAILURE_TESTING) + add_definitions(-DBORINGSSL_MALLOC_FAILURE_TESTING) +endif() + function(go_executable dest package) set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go") if(NOT CMAKE_GENERATOR STREQUAL "Ninja") diff --git a/crypto/mem.c b/crypto/mem.c index 6ee5b0b740..abba4a4481 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -58,6 +58,7 @@ #include #include +#include #include #include @@ -68,6 +69,12 @@ OPENSSL_MSVC_PRAGMA(warning(push, 3)) OPENSSL_MSVC_PRAGMA(warning(pop)) #endif +#if defined(BORINGSSL_MALLOC_FAILURE_TESTING) +#include +#include +#include +#endif + #include "internal.h" @@ -134,7 +141,68 @@ static const uint8_t kBoringSSLBinaryTag[18] = { 3, 0, }; +#if defined(BORINGSSL_MALLOC_FAILURE_TESTING) +static struct CRYPTO_STATIC_MUTEX malloc_failure_lock = + CRYPTO_STATIC_MUTEX_INIT; +static uint64_t current_malloc_count = 0; +static uint64_t malloc_number_to_fail = 0; +static int malloc_failure_enabled = 0, break_on_malloc_fail = 0; + +static void malloc_exit_handler(void) { + CRYPTO_STATIC_MUTEX_lock_read(&malloc_failure_lock); + if (malloc_failure_enabled && current_malloc_count > malloc_number_to_fail) { + _exit(88); + } + CRYPTO_STATIC_MUTEX_unlock_read(&malloc_failure_lock); +} + +static void init_malloc_failure(void) { + const char *env = getenv("MALLOC_NUMBER_TO_FAIL"); + if (env != NULL && env[0] != 0) { + char *endptr; + malloc_number_to_fail = strtoull(env, &endptr, 10); + if (*endptr == 0) { + malloc_failure_enabled = 1; + atexit(malloc_exit_handler); + } + } + break_on_malloc_fail = getenv("MALLOC_BREAK_ON_FAIL") != NULL; +} + +// should_fail_allocation returns one if the current allocation should fail and +// zero otherwise. +static int should_fail_allocation() { + static CRYPTO_once_t once = CRYPTO_ONCE_INIT; + CRYPTO_once(&once, init_malloc_failure); + if (!malloc_failure_enabled) { + return 0; + } + + // We lock just so multi-threaded tests are still correct, but we won't test + // every malloc exhaustively. + CRYPTO_STATIC_MUTEX_lock_write(&malloc_failure_lock); + int should_fail = current_malloc_count == malloc_number_to_fail; + current_malloc_count++; + CRYPTO_STATIC_MUTEX_unlock_write(&malloc_failure_lock); + + if (should_fail && break_on_malloc_fail) { + raise(SIGTRAP); + } + if (should_fail) { + errno = ENOMEM; + } + return should_fail; +} + +#else +static int should_fail_allocation(void) { return 0; } +#endif + void *OPENSSL_malloc(size_t size) { + if (should_fail_allocation()) { + return NULL; + } + if (OPENSSL_memory_alloc != NULL) { assert(OPENSSL_memory_free != NULL); assert(OPENSSL_memory_get_size != NULL); @@ -194,6 +262,10 @@ void OPENSSL_free(void *orig_ptr) { } void *OPENSSL_realloc(void *orig_ptr, size_t new_size) { + if (should_fail_allocation()) { + return NULL; + } + if (orig_ptr == NULL) { return OPENSSL_malloc(new_size); } diff --git a/crypto/test/CMakeLists.txt b/crypto/test/CMakeLists.txt index b968fd78c3..bf2086376c 100644 --- a/crypto/test/CMakeLists.txt +++ b/crypto/test/CMakeLists.txt @@ -5,7 +5,6 @@ add_library( abi_test.cc file_test.cc - malloc.cc test_util.cc wycheproof_util.cc ) diff --git a/crypto/test/malloc.cc b/crypto/test/malloc.cc deleted file mode 100644 index 17189398f4..0000000000 --- a/crypto/test/malloc.cc +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (c) 2014, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include - -#if defined(__GLIBC__) && !defined(__UCLIBC__) -#define OPENSSL_GLIBC -#endif - -// This file isn't built on ARM or Aarch64 because we link statically in those -// builds and trying to override malloc in a static link doesn't work. It also -// requires glibc. It's also disabled on ASan builds as this interferes with -// ASan's malloc interceptor. -// -// TODO(davidben): See if this and ASan's and MSan's interceptors can be made to -// coexist. -#if defined(__linux__) && defined(OPENSSL_GLIBC) && !defined(OPENSSL_ARM) && \ - !defined(OPENSSL_AARCH64) && !defined(OPENSSL_ASAN) && \ - !defined(OPENSSL_MSAN) && !defined(OPENSSL_TSAN) - -#include -#include -#include -#include -#include -#include - -#include - - -// This file defines overrides for the standard allocation functions that allow -// a given allocation to be made to fail for testing. If the program is run -// with MALLOC_NUMBER_TO_FAIL set to a base-10 number then that allocation will -// return NULL. If MALLOC_BREAK_ON_FAIL is also defined then the allocation -// will signal SIGTRAP rather than return NULL. -// -// This code is not thread safe. - -static uint64_t current_malloc_count = 0; -static uint64_t malloc_number_to_fail = 0; -static bool failure_enabled = false, break_on_fail = false, in_call = false; - -extern "C" { -// These are other names for the standard allocation functions. -extern void *__libc_malloc(size_t size); -extern void *__libc_calloc(size_t num_elems, size_t size); -extern void *__libc_realloc(void *ptr, size_t size); -} - -static void exit_handler(void) { - if (failure_enabled && current_malloc_count > malloc_number_to_fail) { - _exit(88); - } -} - -static void cpp_new_handler() { - // Return to try again. It won't fail a second time. - return; -} - -// should_fail_allocation returns true if the current allocation should fail. -static bool should_fail_allocation() { - static bool init = false; - - if (in_call) { - return false; - } - - in_call = true; - - if (!init) { - const char *env = getenv("MALLOC_NUMBER_TO_FAIL"); - if (env != NULL && env[0] != 0) { - char *endptr; - malloc_number_to_fail = strtoull(env, &endptr, 10); - if (*endptr == 0) { - failure_enabled = true; - atexit(exit_handler); - std::set_new_handler(cpp_new_handler); - } - } - break_on_fail = (NULL != getenv("MALLOC_BREAK_ON_FAIL")); - init = true; - } - - in_call = false; - - if (!failure_enabled) { - return false; - } - - bool should_fail = (current_malloc_count == malloc_number_to_fail); - current_malloc_count++; - - if (should_fail && break_on_fail) { - raise(SIGTRAP); - } - return should_fail; -} - -extern "C" { - -void *malloc(size_t size) { - if (should_fail_allocation()) { - errno = ENOMEM; - return NULL; - } - - return __libc_malloc(size); -} - -void *calloc(size_t num_elems, size_t size) { - if (should_fail_allocation()) { - errno = ENOMEM; - return NULL; - } - - return __libc_calloc(num_elems, size); -} - -void *realloc(void *ptr, size_t size) { - if (should_fail_allocation()) { - errno = ENOMEM; - return NULL; - } - - return __libc_realloc(ptr, size); -} - -} // extern "C" - -#endif // defined(linux) && GLIBC && !ARM && !AARCH64 && !ASAN && !TSAN diff --git a/ssl/test/CMakeLists.txt b/ssl/test/CMakeLists.txt index f02d6e24f9..70bb29e8c2 100644 --- a/ssl/test/CMakeLists.txt +++ b/ssl/test/CMakeLists.txt @@ -15,7 +15,7 @@ add_executable( add_dependencies(bssl_shim global_target) -target_link_libraries(bssl_shim test_support_lib ssl crypto) +target_link_libraries(bssl_shim ssl crypto) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") add_executable( @@ -33,7 +33,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") add_dependencies(handshaker global_target) - target_link_libraries(handshaker test_support_lib ssl crypto) + target_link_libraries(handshaker ssl crypto) else() # Declare a dummy target for run_tests to depend on. add_custom_target(handshaker) diff --git a/ssl/test/test_config.cc b/ssl/test/test_config.cc index d51c601b40..94828c6f66 100644 --- a/ssl/test/test_config.cc +++ b/ssl/test/test_config.cc @@ -496,25 +496,26 @@ static CRYPTO_once_t once = CRYPTO_ONCE_INIT; static int g_config_index = 0; static CRYPTO_BUFFER_POOL *g_pool = nullptr; -static void init_once() { - g_config_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL); - if (g_config_index < 0) { - abort(); - } - g_pool = CRYPTO_BUFFER_POOL_new(); - if (!g_pool) { - abort(); - } +static bool InitGlobals() { + CRYPTO_once(&once, [] { + g_config_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL); + g_pool = CRYPTO_BUFFER_POOL_new(); + }); + return g_config_index >= 0 && g_pool != nullptr; } bool SetTestConfig(SSL *ssl, const TestConfig *config) { - CRYPTO_once(&once, init_once); + if (!InitGlobals()) { + return false; + } return SSL_set_ex_data(ssl, g_config_index, (void *)config) == 1; } const TestConfig *GetTestConfig(const SSL *ssl) { - CRYPTO_once(&once, init_once); - return (const TestConfig *)SSL_get_ex_data(ssl, g_config_index); + if (!InitGlobals()) { + return nullptr; + } + return static_cast(SSL_get_ex_data(ssl, g_config_index)); } static int LegacyOCSPCallback(SSL *ssl, void *arg) { @@ -1371,13 +1372,16 @@ static bool MaybeInstallCertCompressionAlg( } bssl::UniquePtr TestConfig::SetupCtx(SSL_CTX *old_ctx) const { + if (!InitGlobals()) { + return nullptr; + } + bssl::UniquePtr ssl_ctx( SSL_CTX_new(is_dtls ? DTLS_method() : TLS_method())); if (!ssl_ctx) { return nullptr; } - CRYPTO_once(&once, init_once); SSL_CTX_set0_buffer_pool(ssl_ctx.get(), g_pool); std::string cipher_list = "ALL"; diff --git a/ssl/test/test_state.cc b/ssl/test/test_state.cc index 86deb5553c..7c22a620b5 100644 --- a/ssl/test/test_state.cc +++ b/ssl/test/test_state.cc @@ -32,25 +32,26 @@ static void TestStateExFree(void *parent, void *ptr, CRYPTO_EX_DATA *ad, delete ((TestState *)ptr); } -static void init_once() { - g_state_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, TestStateExFree); - if (g_state_index < 0) { - abort(); - } +static bool InitGlobals() { + CRYPTO_once(&g_once, [] { + g_state_index = + SSL_get_ex_new_index(0, nullptr, nullptr, nullptr, TestStateExFree); + }); + return g_state_index >= 0; } struct timeval *GetClock() { - CRYPTO_once(&g_once, init_once); return &g_clock; } void AdvanceClock(unsigned seconds) { - CRYPTO_once(&g_once, init_once); g_clock.tv_sec += seconds; } bool SetTestState(SSL *ssl, std::unique_ptr state) { - CRYPTO_once(&g_once, init_once); + if (!InitGlobals()) { + return false; + } // |SSL_set_ex_data| takes ownership of |state| only on success. if (SSL_set_ex_data(ssl, g_state_index, state.get()) == 1) { state.release(); @@ -60,8 +61,10 @@ bool SetTestState(SSL *ssl, std::unique_ptr state) { } TestState *GetTestState(const SSL *ssl) { - CRYPTO_once(&g_once, init_once); - return (TestState *)SSL_get_ex_data(ssl, g_state_index); + if (!InitGlobals()) { + return nullptr; + } + return static_cast(SSL_get_ex_data(ssl, g_state_index)); } static void ssl_ctx_add_session(SSL_SESSION *session, void *void_param) { From 29564f2b633b1275e3e97703d86b41296211fb79 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 3 Feb 2023 18:15:09 -0500 Subject: [PATCH 048/177] Reject even moduli in RSA_check_key. RSA state management is generally a mess right now, which causes thread contention issues in highly threaded servers. We need to do a lot of work within the library to fix it, but in the end state, RSA_check_key (called by the parser), BN_MONT_CTX_set_locked, and freeze_private_key should all be unified. This means that anything which can causes the latter two steps to fail will be lifted up into the parser, currently RSA_check_key. We've broadly done that, but odd moduli (n, p, and q) are currently not covered by RSA_check_key. Fix that. We only need to check for odd n, because odd p and q are then implied by p * q == n. Update-Note: RSA keys with even moduli already do not work. (In addition to being nonsensical, all operations will fail with them because we cannot do Montgomery reduction on even moduli.) This CL shifts the error from when you use the key, to when you parse the key, like our other validation steps. Also after this lands, the check for odd modulus in cl/447099278 can be removed. Bug: 316 Change-Id: Ifa4af610316a8f717a026128078a5d38d046bff9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56885 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- crypto/evp/evp_tests.txt | 5 +++++ crypto/fipsmodule/rsa/rsa.c | 3 ++- crypto/fipsmodule/rsa/rsa_impl.c | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/crypto/evp/evp_tests.txt b/crypto/evp/evp_tests.txt index 0c890fd63c..7fe2bced70 100644 --- a/crypto/evp/evp_tests.txt +++ b/crypto/evp/evp_tests.txt @@ -21,6 +21,11 @@ PublicKey = RSA-2048-SPKI-Negative Input = 30820121300d06092a864886f70d01010105000382010e003082010902820100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001 Error = NEGATIVE_NUMBER +# An RSA key with an even modulus +PublicKey = RSA-2048-Even-Modulus +Input = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44e0203010001 +Error = BAD_RSA_PARAMETERS + # The same key but with missing parameters rather than a NULL. PublicKey = RSA-2048-SPKI-Invalid Input = 30820120300b06092a864886f70d0101010382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001 diff --git a/crypto/fipsmodule/rsa/rsa.c b/crypto/fipsmodule/rsa/rsa.c index 6b3e228146..bbac05f51e 100644 --- a/crypto/fipsmodule/rsa/rsa.c +++ b/crypto/fipsmodule/rsa/rsa.c @@ -787,7 +787,8 @@ int RSA_check_key(const RSA *key) { // Check that p * q == n. Before we multiply, we check that p and q are in // bounds, to avoid a DoS vector in |bn_mul_consttime| below. Note that - // n was bound by |rsa_check_public_key|. + // n was bound by |rsa_check_public_key|. This also implicitly checks p and q + // are odd, which is a necessary condition for Montgomery reduction. if (BN_is_negative(key->p) || BN_cmp(key->p, key->n) >= 0 || BN_is_negative(key->q) || BN_cmp(key->q, key->n) >= 0) { OPENSSL_PUT_ERROR(RSA, RSA_R_N_NOT_EQUAL_P_Q); diff --git a/crypto/fipsmodule/rsa/rsa_impl.c b/crypto/fipsmodule/rsa/rsa_impl.c index b9c47cd0c4..df465f242d 100644 --- a/crypto/fipsmodule/rsa/rsa_impl.c +++ b/crypto/fipsmodule/rsa/rsa_impl.c @@ -85,6 +85,13 @@ int rsa_check_public_key(const RSA *rsa) { return 0; } + // RSA moduli must be odd. In addition to being necessary for RSA in general, + // we cannot setup Montgomery reduction with even moduli. + if (!BN_is_odd(rsa->n)) { + OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS); + return 0; + } + // Mitigate DoS attacks by limiting the exponent size. 33 bits was chosen as // the limit based on the recommendations in [1] and [2]. Windows CryptoAPI // doesn't support values larger than 32 bits [3], so it is unlikely that From 3a16df9aa055b8e330bc1fa2e09e0be8ee404a94 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Feb 2023 13:57:09 -0500 Subject: [PATCH 049/177] Rearrange bn/generic.c In preparation for adding aarch64 bn_add_words and bn_sub_words implementations, rearrange this so we first define BN_ADD_ASM and BN_MUL_ASM defines, and then gate fallbacks on that. This also required moving some functions around to group the add/mul functions together. Change-Id: I59281706db35ad3fb1186a4afd345a820f5542d2 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56965 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Commit-Queue: David Benjamin Auto-Submit: David Benjamin --- crypto/fipsmodule/bn/generic.c | 327 +++++++++++++++++---------------- 1 file changed, 170 insertions(+), 157 deletions(-) diff --git a/crypto/fipsmodule/bn/generic.c b/crypto/fipsmodule/bn/generic.c index ee80a3ce77..628cc53a6c 100644 --- a/crypto/fipsmodule/bn/generic.c +++ b/crypto/fipsmodule/bn/generic.c @@ -61,11 +61,20 @@ #include "internal.h" -// This file has two other implementations: x86 assembly language in -// asm/bn-586.pl and x86_64 inline assembly in asm/x86_64-gcc.c. -#if defined(OPENSSL_NO_ASM) || \ - !(defined(OPENSSL_X86) || \ - (defined(OPENSSL_X86_64) && (defined(__GNUC__) || defined(__clang__)))) +#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86) +// See asm/bn-586.pl. +#define BN_ADD_ASM +#define BN_MUL_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \ + (defined(__GNUC__) || defined(__clang__)) +// See asm/x86_64-gcc.c +#define BN_ADD_ASM +#define BN_MUL_ASM +#endif + +#if !defined(BN_MUL_ASM) #ifdef BN_ULLONG #define mul_add(r, a, w, c) \ @@ -201,157 +210,6 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, size_t n) { } } -#ifdef BN_ULLONG -BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - size_t n) { - BN_ULLONG ll = 0; - - if (n == 0) { - return 0; - } - - while (n & ~3) { - ll += (BN_ULLONG)a[0] + b[0]; - r[0] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[1] + b[1]; - r[1] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[2] + b[2]; - r[2] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[3] + b[3]; - r[3] = (BN_ULONG)ll; - ll >>= BN_BITS2; - a += 4; - b += 4; - r += 4; - n -= 4; - } - while (n) { - ll += (BN_ULLONG)a[0] + b[0]; - r[0] = (BN_ULONG)ll; - ll >>= BN_BITS2; - a++; - b++; - r++; - n--; - } - return (BN_ULONG)ll; -} - -#else // !BN_ULLONG - -BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - size_t n) { - BN_ULONG c, l, t; - - if (n == 0) { - return (BN_ULONG)0; - } - - c = 0; - while (n & ~3) { - t = a[0]; - t += c; - c = (t < c); - l = t + b[0]; - c += (l < t); - r[0] = l; - t = a[1]; - t += c; - c = (t < c); - l = t + b[1]; - c += (l < t); - r[1] = l; - t = a[2]; - t += c; - c = (t < c); - l = t + b[2]; - c += (l < t); - r[2] = l; - t = a[3]; - t += c; - c = (t < c); - l = t + b[3]; - c += (l < t); - r[3] = l; - a += 4; - b += 4; - r += 4; - n -= 4; - } - while (n) { - t = a[0]; - t += c; - c = (t < c); - l = t + b[0]; - c += (l < t); - r[0] = l; - a++; - b++; - r++; - n--; - } - return (BN_ULONG)c; -} - -#endif // !BN_ULLONG - -BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - size_t n) { - BN_ULONG t1, t2; - int c = 0; - - if (n == 0) { - return (BN_ULONG)0; - } - - while (n & ~3) { - t1 = a[0]; - t2 = b[0]; - r[0] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } - t1 = a[1]; - t2 = b[1]; - r[1] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } - t1 = a[2]; - t2 = b[2]; - r[2] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } - t1 = a[3]; - t2 = b[3]; - r[3] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } - a += 4; - b += 4; - r += 4; - n -= 4; - } - while (n) { - t1 = a[0]; - t2 = b[0]; - r[0] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } - a++; - b++; - r++; - n--; - } - return c; -} - // mul_add_c(a,b,c0,c1,c2) -- c+=a*b for three word number c=(c2,c1,c0) // mul_add_c2(a,b,c0,c1,c2) -- c+=2*a*b for three word number c=(c2,c1,c0) // sqr_add_c(a,i,c0,c1,c2) -- c+=a[i]^2 for three word number c=(c2,c1,c0) @@ -708,4 +566,159 @@ void bn_sqr_comba4(BN_ULONG r[8], const BN_ULONG a[4]) { #undef sqr_add_c #undef sqr_add_c2 -#endif +#endif // !BN_MUL_ASM + +#if !defined(BN_ADD_ASM) + +#ifdef BN_ULLONG +BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + size_t n) { + BN_ULLONG ll = 0; + + if (n == 0) { + return 0; + } + + while (n & ~3) { + ll += (BN_ULLONG)a[0] + b[0]; + r[0] = (BN_ULONG)ll; + ll >>= BN_BITS2; + ll += (BN_ULLONG)a[1] + b[1]; + r[1] = (BN_ULONG)ll; + ll >>= BN_BITS2; + ll += (BN_ULLONG)a[2] + b[2]; + r[2] = (BN_ULONG)ll; + ll >>= BN_BITS2; + ll += (BN_ULLONG)a[3] + b[3]; + r[3] = (BN_ULONG)ll; + ll >>= BN_BITS2; + a += 4; + b += 4; + r += 4; + n -= 4; + } + while (n) { + ll += (BN_ULLONG)a[0] + b[0]; + r[0] = (BN_ULONG)ll; + ll >>= BN_BITS2; + a++; + b++; + r++; + n--; + } + return (BN_ULONG)ll; +} + +#else // !BN_ULLONG + +BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + size_t n) { + BN_ULONG c, l, t; + + if (n == 0) { + return (BN_ULONG)0; + } + + c = 0; + while (n & ~3) { + t = a[0]; + t += c; + c = (t < c); + l = t + b[0]; + c += (l < t); + r[0] = l; + t = a[1]; + t += c; + c = (t < c); + l = t + b[1]; + c += (l < t); + r[1] = l; + t = a[2]; + t += c; + c = (t < c); + l = t + b[2]; + c += (l < t); + r[2] = l; + t = a[3]; + t += c; + c = (t < c); + l = t + b[3]; + c += (l < t); + r[3] = l; + a += 4; + b += 4; + r += 4; + n -= 4; + } + while (n) { + t = a[0]; + t += c; + c = (t < c); + l = t + b[0]; + c += (l < t); + r[0] = l; + a++; + b++; + r++; + n--; + } + return (BN_ULONG)c; +} + +#endif // !BN_ULLONG + +BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + size_t n) { + BN_ULONG t1, t2; + int c = 0; + + if (n == 0) { + return (BN_ULONG)0; + } + + while (n & ~3) { + t1 = a[0]; + t2 = b[0]; + r[0] = t1 - t2 - c; + if (t1 != t2) { + c = (t1 < t2); + } + t1 = a[1]; + t2 = b[1]; + r[1] = t1 - t2 - c; + if (t1 != t2) { + c = (t1 < t2); + } + t1 = a[2]; + t2 = b[2]; + r[2] = t1 - t2 - c; + if (t1 != t2) { + c = (t1 < t2); + } + t1 = a[3]; + t2 = b[3]; + r[3] = t1 - t2 - c; + if (t1 != t2) { + c = (t1 < t2); + } + a += 4; + b += 4; + r += 4; + n -= 4; + } + while (n) { + t1 = a[0]; + t2 = b[0]; + r[0] = t1 - t2 - c; + if (t1 != t2) { + c = (t1 < t2); + } + a++; + b++; + r++; + n--; + } + return c; +} + +#endif // !BN_ADD_ASM From d1b451676eada2f2dcad9a20debf8b76fa17f403 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Feb 2023 14:50:36 -0500 Subject: [PATCH 050/177] Add bn_add_words and bn_sub_words assembly for aarch64. It is 2023 and compilers *still* cannot use carry flags effectively, particularly GCC. There are some Clang-specific built-ins which help x86_64 (where we have asm anyway) but, on aarch64, the built-ins actually *regress performance* over the current formulation! I suspect Clang is getting confused by Arm and Intel having opposite borrow flags. https://clang.llvm.org/docs/LanguageExtensions.html#multiprecision-arithmetic-builtins Just include aarch64 assembly to avoid this. This provides a noticeable perf boost in code that uses these functions (Where bn_mul_mont is available, they're not used much in RSA, but the generic EC implementation does modular additions, and RSA private key checking spends a lot of time in our add/sub-based bn_div_consttime.) The new code is also smaller than the generic one (18 instructions each), probably because it avoids all the flag spills and only tries to unroll by two iterations. Before: Did 7137 RSA 2048 signing operations in 4022094us (1774.4 ops/sec) Did 326000 RSA 2048 verify (same key) operations in 4001828us (81462.8 ops/sec) Did 278000 RSA 2048 verify (fresh key) operations in 4001392us (69475.8 ops/sec) Did 34830 RSA 2048 private key parse operations in 4038893us (8623.7 ops/sec) Did 1196 RSA 4096 signing operations in 4015759us (297.8 ops/sec) Did 90000 RSA 4096 verify (same key) operations in 4041959us (22266.4 ops/sec) Did 79000 RSA 4096 verify (fresh key) operations in 4034561us (19580.8 ops/sec) Did 12222 RSA 4096 private key parse operations in 4004831us (3051.8 ops/sec) Did 10626 ECDSA P-384 signing operations in 4030764us (2636.2 ops/sec) Did 10800 ECDSA P-384 verify operations in 4052718us (2664.9 ops/sec) Did 4182 ECDSA P-521 signing operations in 4076198us (1026.0 ops/sec) Did 4059 ECDSA P-521 verify operations in 4063819us (998.8 ops/sec) After: Did 7189 RSA 2048 signing operations in 4021331us (1787.7 ops/sec) [+0.7%] Did 326000 RSA 2048 verify (same key) operations in 4010811us (81280.3 ops/sec) [-0.2%] Did 278000 RSA 2048 verify (fresh key) operations in 4004206us (69427.0 ops/sec) [-0.1%] Did 53040 RSA 2048 private key parse operations in 4050953us (13093.2 ops/sec) [+51.8%] Did 1200 RSA 4096 signing operations in 4035548us (297.4 ops/sec) [-0.2%] Did 90000 RSA 4096 verify (same key) operations in 4035686us (22301.0 ops/sec) [+0.2%] Did 80000 RSA 4096 verify (fresh key) operations in 4020989us (19895.6 ops/sec) [+1.6%] Did 20468 RSA 4096 private key parse operations in 4037474us (5069.5 ops/sec) [+66.1%] Did 11070 ECDSA P-384 signing operations in 4023595us (2751.3 ops/sec) [+4.4%] Did 11232 ECDSA P-384 verify operations in 4063116us (2764.4 ops/sec) [+3.7%] Did 4387 ECDSA P-521 signing operations in 4052728us (1082.5 ops/sec) [+5.5%] Did 4305 ECDSA P-521 verify operations in 4064660us (1059.1 ops/sec) [+6.0%] Change-Id: If2f739373cdd10fa1d4925d5e2725e87d2255fc0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56966 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/fipsmodule/CMakeLists.txt | 1 + crypto/fipsmodule/bn/asm/bn-armv8.pl | 118 +++++++++++++++++++++++++++ crypto/fipsmodule/bn/generic.c | 5 ++ 3 files changed, 124 insertions(+) create mode 100755 crypto/fipsmodule/bn/asm/bn-armv8.pl diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt index 2bfadab440..66fd44838f 100644 --- a/crypto/fipsmodule/CMakeLists.txt +++ b/crypto/fipsmodule/CMakeLists.txt @@ -3,6 +3,7 @@ include_directories(../../include) perlasm(BCM_SOURCES aarch64 aesv8-armv8 aes/asm/aesv8-armx.pl) perlasm(BCM_SOURCES aarch64 aesv8-gcm-armv8 modes/asm/aesv8-gcm-armv8.pl) perlasm(BCM_SOURCES aarch64 armv8-mont bn/asm/armv8-mont.pl) +perlasm(BCM_SOURCES aarch64 bn-armv8 bn/asm/bn-armv8.pl) perlasm(BCM_SOURCES aarch64 ghash-neon-armv8 modes/asm/ghash-neon-armv8.pl) perlasm(BCM_SOURCES aarch64 ghashv8-armv8 modes/asm/ghashv8-armx.pl) perlasm(BCM_SOURCES aarch64 p256_beeu-armv8-asm ec/asm/p256_beeu-armv8-asm.pl) diff --git a/crypto/fipsmodule/bn/asm/bn-armv8.pl b/crypto/fipsmodule/bn/asm/bn-armv8.pl new file mode 100755 index 0000000000..5aed8df15f --- /dev/null +++ b/crypto/fipsmodule/bn/asm/bn-armv8.pl @@ -0,0 +1,118 @@ +#!/usr/bin/env perl +# Copyright (c) 2023, Google Inc. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +use strict; + +my $flavour = shift; +my $output = shift; +if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } + +$0 =~ m/(.*[\/\\])[^\/\\]+$/; +my $dir = $1; +my $xlate; +( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or +( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or +die "can't locate arm-xlate.pl"; + +open OUT, "| \"$^X\" \"$xlate\" $flavour \"$output\""; +*STDOUT = *OUT; + +my ($rp, $ap, $bp, $num) = ("x0", "x1", "x2", "x3"); +my ($a0, $a1, $b0, $b1, $num_pairs) = ("x4", "x5", "x6", "x7", "x8"); +my $code = <<____; +#include + +.text + +// BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); +.type bn_add_words, %function +.globl bn_add_words +.align 4 +bn_add_words: + AARCH64_VALID_CALL_TARGET + # Clear the carry flag. + cmn xzr, xzr + + # aarch64 can load two registers at a time, so we do two loop iterations at + # at a time. Split $num = 2 * $num_pairs + $num. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr $num_pairs, $num, #1 + and $num, $num, #1 + + cbz $num_pairs, .Ladd_tail +.Ladd_loop: + ldp $a0, $a1, [$ap], #16 + ldp $b0, $b1, [$bp], #16 + sub $num_pairs, $num_pairs, #1 + adcs $a0, $a0, $b0 + adcs $a1, $a1, $b1 + stp $a0, $a1, [$rp], #16 + cbnz $num_pairs, .Ladd_loop + +.Ladd_tail: + cbz $num, .Ladd_exit + ldr $a0, [$ap], #8 + ldr $b0, [$bp], #8 + adcs $a0, $a0, $b0 + str $a0, [$rp], #8 + +.Ladd_exit: + cset x0, cs + ret +.size bn_add_words,.-bn_add_words + +// BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); +.type bn_sub_words, %function +.globl bn_sub_words +.align 4 +bn_sub_words: + AARCH64_VALID_CALL_TARGET + # Set the carry flag. Arm's borrow bit is flipped from the carry flag, + # so we want C = 1 here. + cmp xzr, xzr + + # aarch64 can load two registers at a time, so we do two loop iterations at + # at a time. Split $num = 2 * $num_pairs + $num. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr $num_pairs, $num, #1 + and $num, $num, #1 + + cbz $num_pairs, .Lsub_tail +.Lsub_loop: + ldp $a0, $a1, [$ap], #16 + ldp $b0, $b1, [$bp], #16 + sub $num_pairs, $num_pairs, #1 + sbcs $a0, $a0, $b0 + sbcs $a1, $a1, $b1 + stp $a0, $a1, [$rp], #16 + cbnz $num_pairs, .Lsub_loop + +.Lsub_tail: + cbz $num, .Lsub_exit + ldr $a0, [$ap], #8 + ldr $b0, [$bp], #8 + sbcs $a0, $a0, $b0 + str $a0, [$rp], #8 + +.Lsub_exit: + cset x0, cc + ret +size bn_sub_words,.-bn_sub_words +____ + +print $code; +close STDOUT or die "error closing STDOUT: $!"; diff --git a/crypto/fipsmodule/bn/generic.c b/crypto/fipsmodule/bn/generic.c index 628cc53a6c..df4a834af7 100644 --- a/crypto/fipsmodule/bn/generic.c +++ b/crypto/fipsmodule/bn/generic.c @@ -74,6 +74,11 @@ #define BN_MUL_ASM #endif +#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) +// See asm/bn-armv8.pl. +#define BN_ADD_ASM +#endif + #if !defined(BN_MUL_ASM) #ifdef BN_ULLONG From d4396e387c820198f509a6927facea84592cddd8 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 1 Feb 2023 15:35:56 -0500 Subject: [PATCH 051/177] Avoid branches in GCC in bn/generic.c. bn/generic.c is used for functions like bn_add_words, when there is no assembly implementation available. They're meant to be constant-time, but are particularly dependent on the compiler in this. I ran our valgrind-based tooling and found a couple issues in GCC: First, the various mul_add and sqr_add macros end up branching in GCC. Replacing the conditionals with expressions like c += (a < b) seems to mitigate this. Second, bn_sub_words produces branches in GCC. Replacing the expressions with bit expressions involving the boolean comparisons seems to work for now. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79173 discusses problems with GCC here, which seem to be as yet unresolved. Clang already reliably avoided branches in all of these. (Though it still spills the carry flag far more than would be ideal.) I also checked in godbolt that the new versions didn't generate branches in MSVC, but we don't have tooling to validate this as rigorously. Change-Id: I739758a396fb5ee27fb88bee71bd13ae9cb92bd0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56967 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/fipsmodule/bn/generic.c | 38 +++++++++------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/crypto/fipsmodule/bn/generic.c b/crypto/fipsmodule/bn/generic.c index df4a834af7..bf4971f160 100644 --- a/crypto/fipsmodule/bn/generic.c +++ b/crypto/fipsmodule/bn/generic.c @@ -232,9 +232,7 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, size_t n) { (c0) = (BN_ULONG)Lw(t); \ hi = (BN_ULONG)Hw(t); \ (c1) += (hi); \ - if ((c1) < hi) { \ - (c2)++; \ - } \ + (c2) += (c1) < hi; \ } while (0) #define mul_add_c2(a, b, c0, c1, c2) \ @@ -245,16 +243,12 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, size_t n) { (c0) = (BN_ULONG)Lw(tt); \ hi = (BN_ULONG)Hw(tt); \ (c1) += hi; \ - if ((c1) < hi) { \ - (c2)++; \ - } \ + (c2) += (c1) < hi; \ t += (c0); /* no carry */ \ (c0) = (BN_ULONG)Lw(t); \ hi = (BN_ULONG)Hw(t); \ (c1) += hi; \ - if ((c1) < hi) { \ - (c2)++; \ - } \ + (c2) += (c1) < hi; \ } while (0) #define sqr_add_c(a, i, c0, c1, c2) \ @@ -265,9 +259,7 @@ void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, size_t n) { (c0) = (BN_ULONG)Lw(t); \ hi = (BN_ULONG)Hw(t); \ (c1) += hi; \ - if ((c1) < hi) { \ - (c2)++; \ - } \ + (c2) += (c1) < hi; \ } while (0) #define sqr_add_c2(a, i, j, c0, c1, c2) mul_add_c2((a)[i], (a)[j], c0, c1, c2) @@ -675,7 +667,7 @@ BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, size_t n) { BN_ULONG t1, t2; - int c = 0; + BN_ULONG c = 0; if (n == 0) { return (BN_ULONG)0; @@ -685,27 +677,19 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, t1 = a[0]; t2 = b[0]; r[0] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } + c = (t1 < t2) | ((t1 == t2) & c); t1 = a[1]; t2 = b[1]; r[1] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } + c = (t1 < t2) | ((t1 == t2) & c); t1 = a[2]; t2 = b[2]; r[2] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } + c = (t1 < t2) | ((t1 == t2) & c); t1 = a[3]; t2 = b[3]; r[3] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } + c = (t1 < t2) | ((t1 == t2) & c); a += 4; b += 4; r += 4; @@ -715,9 +699,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, t1 = a[0]; t2 = b[0]; r[0] = t1 - t2 - c; - if (t1 != t2) { - c = (t1 < t2); - } + c = (t1 < t2) | ((t1 == t2) & c); a++; b++; r++; From a9ce915318ff01fbb4ddbb3c276a03acd2d7cc56 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 6 Feb 2023 15:45:56 -0500 Subject: [PATCH 052/177] Add ABI tests for bn_add_words, etc. They're written in assembly, yet we never actually had ABI tests for them. Change-Id: Ib1c6c1d55c91d718f77f7dce9b6d691fb86c89b4 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56930 Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/fipsmodule/bn/bn_test.cc | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crypto/fipsmodule/bn/bn_test.cc b/crypto/fipsmodule/bn/bn_test.cc index 9d9e1d368a..01dcfbb163 100644 --- a/crypto/fipsmodule/bn/bn_test.cc +++ b/crypto/fipsmodule/bn/bn_test.cc @@ -2796,6 +2796,41 @@ TEST_F(BNTest, MontgomeryLarge) { ctx(), nullptr)); } +#if defined(SUPPORTS_ABI_TEST) +// These functions are not always implemented in assembly, but they sometimes +// are, so include ABI tests for each. +TEST_F(BNTest, ArithmeticABI) { + EXPECT_EQ(0u, CHECK_ABI(bn_add_words, nullptr, nullptr, nullptr, 0)); + EXPECT_EQ(0u, CHECK_ABI(bn_sub_words, nullptr, nullptr, nullptr, 0)); + + for (size_t num : + {1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65}) { + SCOPED_TRACE(num); + std::vector a(num, 123456789); + std::vector b(num, static_cast(-1)); + std::vector r(num); + + CHECK_ABI(bn_add_words, r.data(), a.data(), b.data(), num); + CHECK_ABI(bn_sub_words, r.data(), a.data(), b.data(), num); + + CHECK_ABI(bn_mul_words, r.data(), a.data(), num, 42); + CHECK_ABI(bn_mul_add_words, r.data(), a.data(), num, 42); + + r.resize(2 * num); + CHECK_ABI(bn_sqr_words, r.data(), a.data(), num); + + if (num == 4) { + CHECK_ABI(bn_mul_comba4, r.data(), a.data(), b.data()); + CHECK_ABI(bn_sqr_comba4, r.data(), a.data()); + } + if (num == 8) { + CHECK_ABI(bn_mul_comba8, r.data(), a.data(), b.data()); + CHECK_ABI(bn_sqr_comba8, r.data(), a.data()); + } + } +} +#endif + #if defined(OPENSSL_BN_ASM_MONT) && defined(SUPPORTS_ABI_TEST) TEST_F(BNTest, BNMulMontABI) { for (size_t words : {4, 5, 6, 7, 8, 16, 32}) { From 5e356a8a9a28bd6541ba360b47f69628e13bb534 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2023 19:44:34 -0500 Subject: [PATCH 053/177] Partially mitigate quadratic-time malloc tests in unit tests Malloc failure testing is quadratic in the number of allocations. To test a failure at allocation N, we must first run the previous N-1 allocations. Now that we have combined GTest binaries, this does not work very well. Use the test listener to reset the counter across independent tests. We assume failures in a previous test won't interfere in the next one and run each test's counter in parallel. The assumption isn't *quite* true because we have a lot of internal init-once machinery that is reused across otherwise "independent" tests, but it's close enough that I was able to find some bugs, fixed in the next commit. That said, the tests still take too long to run to completion. Bug: 127 Change-Id: I6836793448fbdc740a8cc424361e6b3dd66fb8a6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56926 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/internal.h | 10 ++++++++++ crypto/mem.c | 14 ++++++++++++-- crypto/test/gtest_main.h | 18 +++++++++++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/crypto/internal.h b/crypto/internal.h index 46a4e70ee9..576ad85c9b 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -225,6 +225,16 @@ typedef __uint128_t uint128_t; #define OPENSSL_SSE2 #endif +#if defined(BORINGSSL_MALLOC_FAILURE_TESTING) +// OPENSSL_reset_malloc_counter_for_testing, when malloc testing is enabled, +// resets the internal malloc counter, to simulate further malloc failures. This +// should be called in between independent tests, at a point where failure from +// a previous test will not impact subsequent ones. +OPENSSL_EXPORT void OPENSSL_reset_malloc_counter_for_testing(void); +#else +OPENSSL_INLINE void OPENSSL_reset_malloc_counter_for_testing(void) {} +#endif + // Pointer utility functions. diff --git a/crypto/mem.c b/crypto/mem.c index abba4a4481..97a85e9953 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -146,11 +146,14 @@ static struct CRYPTO_STATIC_MUTEX malloc_failure_lock = CRYPTO_STATIC_MUTEX_INIT; static uint64_t current_malloc_count = 0; static uint64_t malloc_number_to_fail = 0; -static int malloc_failure_enabled = 0, break_on_malloc_fail = 0; +static int malloc_failure_enabled = 0, break_on_malloc_fail = 0, + any_malloc_failed = 0; static void malloc_exit_handler(void) { CRYPTO_STATIC_MUTEX_lock_read(&malloc_failure_lock); - if (malloc_failure_enabled && current_malloc_count > malloc_number_to_fail) { + if (any_malloc_failed) { + // Signal to the test driver that some allocation failed, so it knows to + // increment the counter and continue. _exit(88); } CRYPTO_STATIC_MUTEX_unlock_read(&malloc_failure_lock); @@ -183,6 +186,7 @@ static int should_fail_allocation() { CRYPTO_STATIC_MUTEX_lock_write(&malloc_failure_lock); int should_fail = current_malloc_count == malloc_number_to_fail; current_malloc_count++; + any_malloc_failed = any_malloc_failed || should_fail; CRYPTO_STATIC_MUTEX_unlock_write(&malloc_failure_lock); if (should_fail && break_on_malloc_fail) { @@ -194,6 +198,12 @@ static int should_fail_allocation() { return should_fail; } +void OPENSSL_reset_malloc_counter_for_testing(void) { + CRYPTO_STATIC_MUTEX_lock_write(&malloc_failure_lock); + current_malloc_count = 0; + CRYPTO_STATIC_MUTEX_unlock_write(&malloc_failure_lock); +} + #else static int should_fail_allocation(void) { return 0; } #endif diff --git a/crypto/test/gtest_main.h b/crypto/test/gtest_main.h index 20ccf21433..05d468ecfc 100644 --- a/crypto/test/gtest_main.h +++ b/crypto/test/gtest_main.h @@ -31,13 +31,15 @@ OPENSSL_MSVC_PRAGMA(warning(pop)) #include #endif +#include "../internal.h" + BSSL_NAMESPACE_BEGIN -class ErrorTestEventListener : public testing::EmptyTestEventListener { +class TestEventListener : public testing::EmptyTestEventListener { public: - ErrorTestEventListener() {} - ~ErrorTestEventListener() override {} + TestEventListener() {} + ~TestEventListener() override {} void OnTestEnd(const testing::TestInfo &test_info) override { if (test_info.result()->Failed()) { @@ -48,6 +50,13 @@ class ErrorTestEventListener : public testing::EmptyTestEventListener { // error queue without printing. ERR_clear_error(); } + + // Malloc failure testing is quadratic in the number of mallocs. Running + // multiple tests sequentially thus scales badly. Reset the malloc counter + // between tests. This way we will test, each test with the first allocation + // failing, then the second, and so on, until the test with the most + // allocations runs out. + OPENSSL_reset_malloc_counter_for_testing(); } }; @@ -75,8 +84,7 @@ inline void SetupGoogleTest() { signal(SIGPIPE, SIG_IGN); #endif - testing::UnitTest::GetInstance()->listeners().Append( - new ErrorTestEventListener); + testing::UnitTest::GetInstance()->listeners().Append(new TestEventListener); } BSSL_NAMESPACE_END From f7d37fba96e5640186b31ccb834bde98102d6ac7 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2023 19:45:04 -0500 Subject: [PATCH 054/177] Fix various malloc failure paths. Caught by running malloc failure tests on unit tests. Bug: 563 Change-Id: Ic0167ef346a282dc8b5a26a1cedafced7fef9ed0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56927 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/a_mbstr.c | 33 +++++------- crypto/asn1/asn1_test.cc | 2 + crypto/ecdh_extra/ecdh_test.cc | 1 + crypto/evp/p_hkdf.c | 4 +- crypto/fipsmodule/bn/exponentiation.c | 2 +- crypto/fipsmodule/ec/ec_test.cc | 9 ++-- crypto/obj/obj.c | 25 ++++++--- crypto/pkcs7/pkcs7_test.cc | 1 + crypto/rsa_extra/rsa_test.cc | 1 + crypto/stack/stack_test.cc | 2 + crypto/x509/x509_cmp.c | 10 ++-- crypto/x509/x509_test.cc | 4 ++ ssl/handoff.cc | 12 ++++- ssl/ssl_session.cc | 1 + ssl/ssl_test.cc | 75 +++++++++++++++++---------- ssl/tls13_enc.cc | 1 + 16 files changed, 121 insertions(+), 62 deletions(-) diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c index ef74d0d363..81916c22e8 100644 --- a/crypto/asn1/a_mbstr.c +++ b/crypto/asn1/a_mbstr.c @@ -85,11 +85,6 @@ OPENSSL_DECLARE_ERROR_REASON(ASN1, INVALID_UTF8STRING) int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, int inform, unsigned long mask, long minsize, long maxsize) { - int str_type; - char free_out; - ASN1_STRING *dest; - size_t nchar = 0; - char strbuf[32]; if (len == -1) { len = strlen((const char *)in); } @@ -128,7 +123,7 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, // Check |minsize| and |maxsize| and work out the minimal type, if any. CBS cbs; CBS_init(&cbs, in, len); - size_t utf8_len = 0; + size_t utf8_len = 0, nchar = 0; while (CBS_len(&cbs) != 0) { uint32_t c; if (!decode_func(&cbs, &c)) { @@ -169,6 +164,7 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, utf8_len += cbb_get_utf8_len(c); } + char strbuf[32]; if (minsize > 0 && nchar < (size_t)minsize) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT); BIO_snprintf(strbuf, sizeof strbuf, "%ld", minsize); @@ -184,6 +180,7 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, } // Now work out output format and string type + int str_type; int (*encode_func)(CBB *, uint32_t) = cbb_add_latin1; size_t size_estimate = nchar; int outform = MBSTRING_ASC; @@ -216,31 +213,28 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, if (!out) { return str_type; } + + int free_dest = 0; + ASN1_STRING *dest; if (*out) { - free_out = 0; dest = *out; - if (dest->data) { - dest->length = 0; - OPENSSL_free(dest->data); - dest->data = NULL; - } - dest->type = str_type; } else { - free_out = 1; + free_dest = 1; dest = ASN1_STRING_type_new(str_type); if (!dest) { OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return -1; } - *out = dest; } // If both the same type just copy across if (inform == outform) { if (!ASN1_STRING_set(dest, in, len)) { OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - return -1; + goto err; } + dest->type = str_type; + *out = dest; return str_type; } @@ -267,12 +261,13 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, OPENSSL_free(data); goto err; } - dest->length = (int)(data_len - 1); - dest->data = data; + dest->type = str_type; + ASN1_STRING_set0(dest, data, (int)data_len - 1); + *out = dest; return str_type; err: - if (free_out) { + if (free_dest) { ASN1_STRING_free(dest); } CBB_cleanup(&cbb); diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 59e80d2cb7..3bb7b3484c 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -1339,6 +1339,7 @@ TEST(ASN1Test, StringPrintEx) { SCOPED_TRACE(t.flags); bssl::UniquePtr str(ASN1_STRING_type_new(t.type)); + ASSERT_TRUE(str); ASSERT_TRUE(ASN1_STRING_set(str.get(), t.data.data(), t.data.size())); str->flags = t.str_flags; @@ -1393,6 +1394,7 @@ TEST(ASN1Test, StringPrintEx) { SCOPED_TRACE(t.flags); bssl::UniquePtr str(ASN1_STRING_type_new(t.type)); + ASSERT_TRUE(str); ASSERT_TRUE(ASN1_STRING_set(str.get(), t.data.data(), t.data.size())); str->flags = t.str_flags; diff --git a/crypto/ecdh_extra/ecdh_test.cc b/crypto/ecdh_extra/ecdh_test.cc index 4b88754fd3..39485259d8 100644 --- a/crypto/ecdh_extra/ecdh_test.cc +++ b/crypto/ecdh_extra/ecdh_test.cc @@ -274,6 +274,7 @@ TEST(ECDHTest, GroupMismatch) { } bssl::UniquePtr key(EC_KEY_new()); + ASSERT_TRUE(key); ASSERT_TRUE(EC_KEY_set_group(key.get(), a.get())); ASSERT_TRUE(EC_KEY_generate_key(key.get())); diff --git a/crypto/evp/p_hkdf.c b/crypto/evp/p_hkdf.c index 932372dfdd..05158e2995 100644 --- a/crypto/evp/p_hkdf.c +++ b/crypto/evp/p_hkdf.c @@ -64,7 +64,7 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->key_len != 0) { hctx_dst->key = OPENSSL_memdup(hctx_src->key, hctx_src->key_len); - if (hctx_src->key == NULL) { + if (hctx_dst->key == NULL) { OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } @@ -73,7 +73,7 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->salt_len != 0) { hctx_dst->salt = OPENSSL_memdup(hctx_src->salt, hctx_src->salt_len); - if (hctx_src->salt == NULL) { + if (hctx_dst->salt == NULL) { OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/bn/exponentiation.c b/crypto/fipsmodule/bn/exponentiation.c index 4ec9171e2b..41c7233540 100644 --- a/crypto/fipsmodule/bn/exponentiation.c +++ b/crypto/fipsmodule/bn/exponentiation.c @@ -444,6 +444,7 @@ static int mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, return BN_one(r); } + BN_RECP_CTX_init(&recp); BN_CTX_start(ctx); aa = BN_CTX_get(ctx); val[0] = BN_CTX_get(ctx); @@ -451,7 +452,6 @@ static int mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, goto err; } - BN_RECP_CTX_init(&recp); if (m->neg) { // ignore sign of 'm' if (!BN_copy(aa, m)) { diff --git a/crypto/fipsmodule/ec/ec_test.cc b/crypto/fipsmodule/ec/ec_test.cc index 8e144ec0c3..88665b2e46 100644 --- a/crypto/fipsmodule/ec/ec_test.cc +++ b/crypto/fipsmodule/ec/ec_test.cc @@ -656,6 +656,7 @@ TEST_P(ECCurveTest, Compare) { bssl::UniquePtr inf1(EC_POINT_new(group())), inf2(EC_POINT_new(group())); ASSERT_TRUE(inf1); + ASSERT_TRUE(inf2); ASSERT_TRUE(EC_POINT_set_to_infinity(group(), inf1.get())); // |q| is currently -|pub2|. ASSERT_TRUE(EC_POINT_add(group(), inf2.get(), pub2, q.get(), nullptr)); @@ -843,8 +844,8 @@ TEST_P(ECCurveTest, SetInvalidPrivateKey) { bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key); - bssl::UniquePtr bn(BN_new()); - ASSERT_TRUE(BN_one(bn.get())); + bssl::UniquePtr bn(BN_dup(BN_value_one())); + ASSERT_TRUE(bn); BN_set_negative(bn.get(), 1); EXPECT_FALSE(EC_KEY_set_private_key(key.get(), bn.get())) << "Unexpectedly set a key of -1"; @@ -937,11 +938,13 @@ TEST_P(ECCurveTest, P224Bug) { TEST_P(ECCurveTest, GPlusMinusG) { const EC_POINT *g = EC_GROUP_get0_generator(group()); + bssl::UniquePtr p(EC_POINT_dup(g, group())); ASSERT_TRUE(p); ASSERT_TRUE(EC_POINT_invert(group(), p.get(), nullptr)); - bssl::UniquePtr sum(EC_POINT_new(group())); + bssl::UniquePtr sum(EC_POINT_new(group())); + ASSERT_TRUE(sum); ASSERT_TRUE(EC_POINT_add(group(), sum.get(), g, p.get(), nullptr)); EXPECT_TRUE(EC_POINT_is_at_infinity(group(), sum.get())); } diff --git a/crypto/obj/obj.c b/crypto/obj/obj.c index 958625d02c..c4e1aee6f6 100644 --- a/crypto/obj/obj.c +++ b/crypto/obj/obj.c @@ -506,25 +506,37 @@ static int cmp_long_name(const ASN1_OBJECT *a, const ASN1_OBJECT *b) { // obj_add_object inserts |obj| into the various global hashes for run-time // added objects. It returns one on success or zero otherwise. static int obj_add_object(ASN1_OBJECT *obj) { - int ok; - ASN1_OBJECT *old_object; - obj->flags &= ~(ASN1_OBJECT_FLAG_DYNAMIC | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS | ASN1_OBJECT_FLAG_DYNAMIC_DATA); CRYPTO_STATIC_MUTEX_lock_write(&global_added_lock); if (global_added_by_nid == NULL) { global_added_by_nid = lh_ASN1_OBJECT_new(hash_nid, cmp_nid); + } + if (global_added_by_data == NULL) { global_added_by_data = lh_ASN1_OBJECT_new(hash_data, cmp_data); - global_added_by_short_name = lh_ASN1_OBJECT_new(hash_short_name, cmp_short_name); + } + if (global_added_by_short_name == NULL) { + global_added_by_short_name = + lh_ASN1_OBJECT_new(hash_short_name, cmp_short_name); + } + if (global_added_by_long_name == NULL) { global_added_by_long_name = lh_ASN1_OBJECT_new(hash_long_name, cmp_long_name); } + int ok = 0; + if (global_added_by_nid == NULL || + global_added_by_data == NULL || + global_added_by_short_name == NULL || + global_added_by_long_name == NULL) { + goto err; + } + // We don't pay attention to |old_object| (which contains any previous object // that was evicted from the hashes) because we don't have a reference count // on ASN1_OBJECT values. Also, we should never have duplicates nids and so // should always have objects in |global_added_by_nid|. - + ASN1_OBJECT *old_object; ok = lh_ASN1_OBJECT_insert(global_added_by_nid, &old_object, obj); if (obj->length != 0 && obj->data != NULL) { ok &= lh_ASN1_OBJECT_insert(global_added_by_data, &old_object, obj); @@ -535,8 +547,9 @@ static int obj_add_object(ASN1_OBJECT *obj) { if (obj->ln != NULL) { ok &= lh_ASN1_OBJECT_insert(global_added_by_long_name, &old_object, obj); } - CRYPTO_STATIC_MUTEX_unlock_write(&global_added_lock); +err: + CRYPTO_STATIC_MUTEX_unlock_write(&global_added_lock); return ok; } diff --git a/crypto/pkcs7/pkcs7_test.cc b/crypto/pkcs7/pkcs7_test.cc index bf85379645..3c042ec5f0 100644 --- a/crypto/pkcs7/pkcs7_test.cc +++ b/crypto/pkcs7/pkcs7_test.cc @@ -639,6 +639,7 @@ static void TestPEMCRLs(const char *pem) { bssl::UniquePtr bio(BIO_new_mem_buf(pem, strlen(pem))); ASSERT_TRUE(bio); bssl::UniquePtr crls(sk_X509_CRL_new_null()); + ASSERT_TRUE(crls); ASSERT_TRUE(PKCS7_get_PEM_CRLs(crls.get(), bio.get())); ASSERT_EQ(1u, sk_X509_CRL_num(crls.get())); diff --git a/crypto/rsa_extra/rsa_test.cc b/crypto/rsa_extra/rsa_test.cc index 883eb97f2d..d3ee69b31c 100644 --- a/crypto/rsa_extra/rsa_test.cc +++ b/crypto/rsa_extra/rsa_test.cc @@ -513,6 +513,7 @@ TEST(RSATest, GenerateFIPS) { SCOPED_TRACE(bits); rsa.reset(RSA_new()); + ASSERT_TRUE(rsa); ASSERT_TRUE(RSA_generate_key_fips(rsa.get(), bits, nullptr)); EXPECT_EQ(bits, BN_num_bits(rsa->n)); } diff --git a/crypto/stack/stack_test.cc b/crypto/stack/stack_test.cc index 98e54489a2..1ff44b9a4b 100644 --- a/crypto/stack/stack_test.cc +++ b/crypto/stack/stack_test.cc @@ -317,6 +317,7 @@ TEST(StackTest, Sorted) { // sk_*_find should return the first matching element in all cases. TEST(StackTest, FindFirst) { bssl::UniquePtr sk(sk_TEST_INT_new(compare)); + ASSERT_TRUE(sk); auto value = TEST_INT_new(1); ASSERT_TRUE(value); ASSERT_TRUE(bssl::PushToStack(sk.get(), std::move(value))); @@ -397,6 +398,7 @@ TEST(StackTest, BinarySearch) { TEST(StackTest, DeleteIf) { bssl::UniquePtr sk(sk_TEST_INT_new(compare)); + ASSERT_TRUE(sk); for (int v : {1, 9, 2, 8, 3, 7, 4, 6, 5}) { auto obj = TEST_INT_new(v); ASSERT_TRUE(obj); diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c index 7e3c39552a..b640413cde 100644 --- a/crypto/x509/x509_cmp.c +++ b/crypto/x509/x509_cmp.c @@ -284,10 +284,12 @@ int X509_check_private_key(X509 *x, const EVP_PKEY *k) { // count but it has the same effect by duping the STACK and upping the ref of // each X509 structure. STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain) { - STACK_OF(X509) *ret; - size_t i; - ret = sk_X509_dup(chain); - for (i = 0; i < sk_X509_num(ret); i++) { + STACK_OF(X509) *ret = sk_X509_dup(chain); + if (ret == NULL) { + OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); + return NULL; + } + for (size_t i = 0; i < sk_X509_num(ret); i++) { X509_up_ref(sk_X509_value(ret, i)); } return ret; diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index e152f3d1a6..4f931b3e72 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -1391,6 +1391,7 @@ TEST(X509Test, ZeroLengthsWithX509PARAM) { TEST(X509Test, ZeroLengthsWithCheckFunctions) { bssl::UniquePtr leaf(CertFromPEM(kSANTypesLeaf)); + ASSERT_TRUE(leaf); EXPECT_EQ( 1, X509_check_host(leaf.get(), kHostname, strlen(kHostname), 0, nullptr)); @@ -2467,7 +2468,9 @@ TEST(X509Test, TestPrintUTCTIME) { for (auto t : asn1_utctime_tests) { SCOPED_TRACE(t.val); bssl::UniquePtr tm(ASN1_UTCTIME_new()); + ASSERT_TRUE(tm); bssl::UniquePtr bio(BIO_new(BIO_s_mem())); + ASSERT_TRUE(bio); // Use this instead of ASN1_UTCTIME_set() because some callers get // type-confused and pass ASN1_GENERALIZEDTIME to ASN1_UTCTIME_print(). @@ -2525,6 +2528,7 @@ TEST(X509Test, PrettyPrintIntegers) { TEST(X509Test, X509NameSet) { bssl::UniquePtr name(X509_NAME_new()); + ASSERT_TRUE(name); EXPECT_TRUE(X509_NAME_add_entry_by_txt( name.get(), "C", MBSTRING_ASC, reinterpret_cast("US"), -1, -1, 0)); diff --git a/ssl/handoff.cc b/ssl/handoff.cc index b885c4c028..39f0bacf76 100644 --- a/ssl/handoff.cc +++ b/ssl/handoff.cc @@ -124,6 +124,9 @@ static bool apply_remote_features(SSL *ssl, CBS *in) { return false; } bssl::UniquePtr supported(sk_SSL_CIPHER_new_null()); + if (!supported) { + return false; + } while (CBS_len(&ciphers)) { uint16_t id; if (!CBS_get_u16(&ciphers, &id)) { @@ -141,6 +144,9 @@ static bool apply_remote_features(SSL *ssl, CBS *in) { ssl->config->cipher_list ? ssl->config->cipher_list->ciphers.get() : ssl->ctx->cipher_list->ciphers.get(); bssl::UniquePtr unsupported(sk_SSL_CIPHER_new_null()); + if (!unsupported) { + return false; + } for (const SSL_CIPHER *configured_cipher : configured) { if (sk_SSL_CIPHER_find(supported.get(), nullptr, configured_cipher)) { continue; @@ -151,7 +157,8 @@ static bool apply_remote_features(SSL *ssl, CBS *in) { } if (sk_SSL_CIPHER_num(unsupported.get()) && !ssl->config->cipher_list) { ssl->config->cipher_list = bssl::MakeUnique(); - if (!ssl->config->cipher_list->Init(*ssl->ctx->cipher_list)) { + if (!ssl->config->cipher_list || + !ssl->config->cipher_list->Init(*ssl->ctx->cipher_list)) { return false; } } @@ -488,6 +495,9 @@ bool SSL_apply_handback(SSL *ssl, Span handback) { } s3->hs = ssl_handshake_new(ssl); + if (!s3->hs) { + return false; + } SSL_HANDSHAKE *const hs = s3->hs.get(); if (!session_reused || type == handback_tls13) { hs->new_session = diff --git a/ssl/ssl_session.cc b/ssl/ssl_session.cc index 5b61ebad40..885e27d365 100644 --- a/ssl/ssl_session.cc +++ b/ssl/ssl_session.cc @@ -221,6 +221,7 @@ UniquePtr SSL_SESSION_dup(SSL_SESSION *session, int dup_flags) { new_session->certs.reset(sk_CRYPTO_BUFFER_deep_copy( session->certs.get(), buf_up_ref, CRYPTO_BUFFER_free)); if (new_session->certs == nullptr) { + OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index 17209298f8..f51c11efc1 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc @@ -1100,6 +1100,12 @@ static bool GetClientHello(SSL *ssl, std::vector *out) { if (!BIO_mem_contents(bio.get(), &client_hello, &client_hello_len)) { return false; } + + // We did not get far enough to write a ClientHello. + if (client_hello_len == 0) { + return false; + } + *out = std::vector(client_hello, client_hello + client_hello_len); return true; } @@ -1974,6 +1980,7 @@ TEST(SSLTest, UnsupportedECHConfig) { TEST(SSLTest, ECHClientRandomsMatch) { bssl::UniquePtr server_ctx = CreateContextWithTestCertificate(TLS_method()); + ASSERT_TRUE(server_ctx); bssl::UniquePtr keys = MakeTestECHKeys(); ASSERT_TRUE(keys); ASSERT_TRUE(SSL_CTX_set1_ech_keys(server_ctx.get(), keys.get())); @@ -2342,6 +2349,7 @@ TEST(SSLTest, ECHThreads) { bssl::UniquePtr server_ctx = CreateContextWithTestCertificate(TLS_method()); + ASSERT_TRUE(server_ctx); ASSERT_TRUE(SSL_CTX_set1_ech_keys(server_ctx.get(), keys1.get())); bssl::UniquePtr client_ctx(SSL_CTX_new(TLS_method())); @@ -3249,7 +3257,7 @@ static void ExpectSessionReused(SSL_CTX *client_ctx, SSL_CTX *server_ctx, bssl::UniquePtr client, server; ClientConfig config; config.session = session; - EXPECT_TRUE( + ASSERT_TRUE( ConnectClientAndServer(&client, &server, client_ctx, server_ctx, config)); EXPECT_EQ(SSL_session_reused(client.get()), SSL_session_reused(server.get())); @@ -3454,7 +3462,7 @@ TEST_P(SSLVersionTest, SessionTimeout) { for (bool server_test : {false, true}) { SCOPED_TRACE(server_test); - ResetContexts(); + ASSERT_NO_FATAL_FAILURE(ResetContexts()); SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH); SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH); @@ -4170,7 +4178,7 @@ TEST_P(SSLVersionTest, SSLWriteRetry) { TEST_P(SSLVersionTest, RecordCallback) { for (bool test_server : {true, false}) { SCOPED_TRACE(test_server); - ResetContexts(); + ASSERT_NO_FATAL_FAILURE(ResetContexts()); bool read_seen = false; bool write_seen = false; @@ -4735,6 +4743,7 @@ static void ConnectClientAndServerWithTicketMethod( state->retry_count = retry_count; state->failure_mode = failure_mode; + ASSERT_GE(ssl_test_ticket_aead_get_ex_index(), 0); ASSERT_TRUE(SSL_set_ex_data(server.get(), ssl_test_ticket_aead_get_ex_index(), state)); @@ -4788,9 +4797,9 @@ TEST_P(TicketAEADMethodTest, Resume) { SSL_CTX_set_ticket_aead_method(server_ctx.get(), &kSSLTestTicketMethod); bssl::UniquePtr client, server; - ConnectClientAndServerWithTicketMethod(&client, &server, client_ctx.get(), - server_ctx.get(), retry_count, - failure_mode, nullptr); + ASSERT_NO_FATAL_FAILURE(ConnectClientAndServerWithTicketMethod( + &client, &server, client_ctx.get(), server_ctx.get(), retry_count, + failure_mode, nullptr)); switch (failure_mode) { case ssl_test_ticket_aead_ok: case ssl_test_ticket_aead_open_hard_fail: @@ -4806,9 +4815,9 @@ TEST_P(TicketAEADMethodTest, Resume) { ASSERT_TRUE(FlushNewSessionTickets(client.get(), server.get())); bssl::UniquePtr session = std::move(g_last_session); - ConnectClientAndServerWithTicketMethod(&client, &server, client_ctx.get(), - server_ctx.get(), retry_count, - failure_mode, session.get()); + ASSERT_NO_FATAL_FAILURE(ConnectClientAndServerWithTicketMethod( + &client, &server, client_ctx.get(), server_ctx.get(), retry_count, + failure_mode, session.get())); switch (failure_mode) { case ssl_test_ticket_aead_ok: ASSERT_TRUE(client); @@ -5190,6 +5199,7 @@ TEST(SSLTest, Handoff) { ASSERT_TRUE(CBBFinishArray(cbb.get(), &handoff)); bssl::UniquePtr handshaker(SSL_new(handshaker_ctx.get())); + ASSERT_TRUE(handshaker); // Note split handshakes determines 0-RTT support, for both the current // handshake and newly-issued tickets, entirely by |handshaker|. There is // no need to call |SSL_set_early_data_enabled| on |server|. @@ -5215,6 +5225,7 @@ TEST(SSLTest, Handoff) { ASSERT_TRUE(CBBFinishArray(cbb_handback.get(), &handback)); bssl::UniquePtr server2(SSL_new(server_ctx.get())); + ASSERT_TRUE(server2); ASSERT_TRUE(SSL_apply_handback(server2.get(), handback)); MoveBIOs(server2.get(), handshaker.get()); @@ -5342,6 +5353,7 @@ TEST(SSLTest, SigAlgs) { }; UniquePtr ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(ctx); unsigned n = 1; for (const auto &test : kTests) { @@ -5397,6 +5409,7 @@ TEST(SSLTest, SigAlgsList) { }; UniquePtr ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(ctx); unsigned n = 1; for (const auto &test : kTests) { @@ -5422,7 +5435,9 @@ TEST(SSLTest, SigAlgsList) { TEST(SSLTest, ApplyHandoffRemovesUnsupportedCiphers) { bssl::UniquePtr server_ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(server_ctx); bssl::UniquePtr server(SSL_new(server_ctx.get())); + ASSERT_TRUE(server); // handoff is a handoff message that has been artificially modified to pretend // that only cipher 0x0A is supported. When it is applied to |server|, all @@ -5460,7 +5475,9 @@ TEST(SSLTest, ApplyHandoffRemovesUnsupportedCiphers) { TEST(SSLTest, ApplyHandoffRemovesUnsupportedCurves) { bssl::UniquePtr server_ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(server_ctx); bssl::UniquePtr server(SSL_new(server_ctx.get())); + ASSERT_TRUE(server); // handoff is a handoff message that has been artificially modified to pretend // that only one curve is supported. When it is applied to |server|, all @@ -5500,10 +5517,12 @@ TEST(SSLTest, ZeroSizedWiteFlushesHandshakeMessages) { // flush them. bssl::UniquePtr server_ctx( CreateContextWithTestCertificate(TLS_method())); + ASSERT_TRUE(server_ctx); EXPECT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_3_VERSION)); EXPECT_TRUE(SSL_CTX_set_min_proto_version(server_ctx.get(), TLS1_3_VERSION)); bssl::UniquePtr client_ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(client_ctx); EXPECT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION)); EXPECT_TRUE(SSL_CTX_set_min_proto_version(client_ctx.get(), TLS1_3_VERSION)); @@ -5584,7 +5603,7 @@ TEST_P(SSLVersionTest, SessionCacheThreads) { ClientConfig config; config.session = session; UniquePtr client, server; - EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), + ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), server_ctx_.get(), config)); }; @@ -5677,7 +5696,7 @@ TEST_P(SSLVersionTest, SessionCacheThreads) { TEST_P(SSLVersionTest, SessionTicketThreads) { for (bool renew_ticket : {false, true}) { SCOPED_TRACE(renew_ticket); - ResetContexts(); + ASSERT_NO_FATAL_FAILURE(ResetContexts()); SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH); SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH); if (renew_ticket) { @@ -5696,7 +5715,7 @@ TEST_P(SSLVersionTest, SessionTicketThreads) { ClientConfig config; config.session = session; UniquePtr client, server; - EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), + ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), server_ctx_.get(), config)); }; @@ -5733,6 +5752,8 @@ TEST(SSLTest, GetCertificateThreads) { X509 *cert2 = SSL_CTX_get0_certificate(ctx.get()); thread.join(); + ASSERT_TRUE(cert2); + ASSERT_TRUE(cert2_thread); EXPECT_EQ(cert2, cert2_thread); EXPECT_EQ(0, X509_cmp(cert.get(), cert2)); } @@ -6105,8 +6126,10 @@ class QUICMethodTest : public testing::Test { SSL_set_accept_state(server_.get()); transport_.reset(new MockQUICTransportPair); - ex_data_.Set(client_.get(), transport_->client()); - ex_data_.Set(server_.get(), transport_->server()); + if (!ex_data_.Set(client_.get(), transport_->client()) || + !ex_data_.Set(server_.get(), transport_->server())) { + return false; + } if (allow_out_of_order_writes_) { transport_->client()->AllowOutOfOrderWrites(); transport_->server()->AllowOutOfOrderWrites(); @@ -6494,7 +6517,7 @@ TEST_F(QUICMethodTest, ZeroRTTRejectMismatchedParameters) { // The server will consume the ClientHello, but it will not accept 0-RTT. ASSERT_TRUE(ProvideHandshakeData(server_.get())); ASSERT_EQ(SSL_do_handshake(server_.get()), -1); - EXPECT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(server_.get(), -1)); + ASSERT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(server_.get(), -1)); EXPECT_FALSE(SSL_in_early_data(server_.get())); EXPECT_FALSE(transport_->server()->HasReadSecret(ssl_encryption_early_data)); @@ -6579,7 +6602,7 @@ TEST_F(QUICMethodTest, ZeroRTTReject) { // The server will consume the ClientHello, but it will not accept 0-RTT. ASSERT_TRUE(ProvideHandshakeData(server_.get())); ASSERT_EQ(SSL_do_handshake(server_.get()), -1); - EXPECT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(server_.get(), -1)); + ASSERT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(server_.get(), -1)); EXPECT_FALSE(SSL_in_early_data(server_.get())); EXPECT_FALSE( transport_->server()->HasReadSecret(ssl_encryption_early_data)); @@ -6747,8 +6770,8 @@ TEST_F(QUICMethodTest, Buffered) { ASSERT_TRUE(CreateClientAndServer()); BufferedFlight client_flight, server_flight; - buffered_flights.Set(client_.get(), &client_flight); - buffered_flights.Set(server_.get(), &server_flight); + ASSERT_TRUE(buffered_flights.Set(client_.get(), &client_flight)); + ASSERT_TRUE(buffered_flights.Set(server_.get(), &server_flight)); ASSERT_TRUE(CompleteHandshakesForQUIC()); @@ -6969,10 +6992,10 @@ TEST_F(QUICMethodTest, ForbidCrossProtocolResumptionClient) { EXPECT_FALSE(g_last_session); ASSERT_TRUE(ProvideHandshakeData(client_.get())); EXPECT_EQ(SSL_process_quic_post_handshake(client_.get()), 1); - EXPECT_TRUE(g_last_session); + ASSERT_TRUE(g_last_session); // Pretend that g_last_session came from a TLS-over-TCP connection. - g_last_session.get()->is_quic = false; + g_last_session->is_quic = false; // Create a second connection and verify that resumption does not occur with // a session from a non-QUIC connection. This tests that the client does not @@ -7010,7 +7033,7 @@ TEST_F(QUICMethodTest, ForbidCrossProtocolResumptionServer) { EXPECT_FALSE(g_last_session); ASSERT_TRUE(ProvideHandshakeData(client_.get())); EXPECT_EQ(SSL_process_quic_post_handshake(client_.get()), 1); - EXPECT_TRUE(g_last_session); + ASSERT_TRUE(g_last_session); // Attempt a resumption with g_last_session using TLS_method. bssl::UniquePtr client_ctx(SSL_CTX_new(TLS_method())); @@ -7027,7 +7050,7 @@ TEST_F(QUICMethodTest, ForbidCrossProtocolResumptionServer) { // The TLS-over-TCP client will refuse to resume with a quic session, so // mark is_quic = false to bypass the client check to test the server check. - g_last_session.get()->is_quic = false; + g_last_session->is_quic = false; SSL_set_session(client.get(), g_last_session.get()); BIO *bio1, *bio2; @@ -7386,7 +7409,7 @@ TEST_P(SSLVersionTest, TicketSessionIDsMatch) { bssl::UniquePtr client, server; ClientConfig config; config.session = session.get(); - EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), + ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(), server_ctx_.get(), config)); EXPECT_TRUE(SSL_session_reused(client.get())); EXPECT_TRUE(SSL_session_reused(server.get())); @@ -7770,7 +7793,7 @@ TEST(SSLTest, ALPNConfig) { auto check_alpn_proto = [&](Span expected) { observed_alpn.clear(); bssl::UniquePtr client, server; - EXPECT_TRUE(ConnectClientAndServer(&client, &server, ctx.get(), ctx.get())); + ASSERT_TRUE(ConnectClientAndServer(&client, &server, ctx.get(), ctx.get())); EXPECT_EQ(Bytes(expected), Bytes(observed_alpn)); }; @@ -8411,7 +8434,7 @@ TEST(SSLTest, ErrorSyscallAfterCloseNotify) { ASSERT_TRUE(client_ctx); ASSERT_TRUE(server_ctx); bssl::UniquePtr client, server; - EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(), + ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(), server_ctx.get())); // Replace the write |BIO| with |wbio_silent_error|. @@ -8477,7 +8500,7 @@ TEST(SSLTest, QuietShutdown) { ASSERT_TRUE(server_ctx); SSL_CTX_set_quiet_shutdown(server_ctx.get(), 1); bssl::UniquePtr client, server; - EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(), + ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(), server_ctx.get())); // Quiet shutdown is enabled, so |SSL_shutdown| on the server should diff --git a/ssl/tls13_enc.cc b/ssl/tls13_enc.cc index ad023ef8eb..23889bd1c2 100644 --- a/ssl/tls13_enc.cc +++ b/ssl/tls13_enc.cc @@ -111,6 +111,7 @@ static bool hkdf_expand_label(Span out, const EVP_MD *digest, !CBB_add_u8_length_prefixed(cbb.get(), &child) || !CBB_add_bytes(&child, hash.data(), hash.size()) || !CBBFinishArray(cbb.get(), &hkdf_label)) { + OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } From 8bc06cf491243eb95afebc80020c958a16e269a7 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2023 20:05:04 -0500 Subject: [PATCH 055/177] Clean up test_support_lib and GTest dependencies slightly. test_support_lib depends on GTest and should be marked as such. Historically it was a bit fuzzy, but now it's unambiguous. With that cleaned up, we can remove one of the global include_directories calls and rely on CMake's INTERFACE_INCLUDE_DIRECTORIES machinery. (CMake's documentation and "modern CMake" prefers setting include directories on the target and letting them flow up the dependency tree, rather than configuring it globally across the project.) Change-Id: I364df834d62328b69f146fbe35c10af97618a713 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56567 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- CMakeLists.txt | 8 +++++--- crypto/test/CMakeLists.txt | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e0808d7031..1a1a0080b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -512,9 +512,11 @@ endif() # Add minimal googletest targets. The provided one has many side-effects, and # googletest has a very straightforward build. add_library(boringssl_gtest third_party/googletest/src/gtest-all.cc) -target_include_directories(boringssl_gtest PRIVATE third_party/googletest) - -include_directories(third_party/googletest/include) +target_include_directories( + boringssl_gtest + PUBLIC third_party/googletest/include + PRIVATE third_party/googletest +) # Declare a dummy target to build all unit tests. Test targets should inject # themselves as dependencies next to the target definition. diff --git a/crypto/test/CMakeLists.txt b/crypto/test/CMakeLists.txt index bf2086376c..939cbb6939 100644 --- a/crypto/test/CMakeLists.txt +++ b/crypto/test/CMakeLists.txt @@ -17,6 +17,7 @@ endif() if(WIN32) target_link_libraries(test_support_lib dbghelp) endif() +target_link_libraries(test_support_lib boringssl_gtest crypto) add_dependencies(test_support_lib global_target) add_library( @@ -28,3 +29,4 @@ add_library( ) add_dependencies(boringssl_gtest_main global_target) +target_link_libraries(boringssl_gtest_main boringssl_gtest crypto test_support_lib) From 61266e464b9b509a8a0943b9cc826c97c31e04e7 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 15:53:30 -0500 Subject: [PATCH 056/177] Limit the CMake -isysroot assembly workaround to older CMake It was fixed in CMake 3.19 with https://gitlab.kitware.com/cmake/cmake/-/issues/20771 Change-Id: Ia76ab6690e233bc650e11a79db381c00f21c83a1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56568 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- CMakeLists.txt | 5 +++-- util/generate_build_files.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a1a0080b5..1cb72269fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -420,8 +420,9 @@ if(FIPS_DELOCATE OR NOT OPENSSL_NO_ASM) else() enable_language(ASM) set(OPENSSL_ASM TRUE) - # CMake does not add -isysroot and -arch flags to assembly. - if(APPLE) + # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/20771 in older + # CMake versions. + if(APPLE AND CMAKE_VERSION VERSION_LESS 3.19) if(CMAKE_OSX_SYSROOT) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") endif() diff --git a/util/generate_build_files.py b/util/generate_build_files.py index ca173c8ba2..c221f04781 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -457,8 +457,9 @@ def __init__(self): else() enable_language(ASM) set(OPENSSL_ASM TRUE) - # CMake does not add -isysroot and -arch flags to assembly. - if(APPLE) + # Work around https://gitlab.kitware.com/cmake/cmake/-/issues/20771 in older + # CMake versions. + if(APPLE AND CMAKE_VERSION VERSION_LESS 3.19) if(CMAKE_OSX_SYSROOT) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") endif() From 60d61196e43cfcea45936de667f98f5d6a6fa684 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 16:46:36 -0500 Subject: [PATCH 057/177] Remove old clang-cl workaround Looks like this has since been fixed (or isn't hitting GTest anymore for some reason). Bug: chromium:772117 Change-Id: I2c2fb694e4429281e20fd252ef9c2c34e29a425c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56570 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cb72269fb..a2d45ae451 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,9 +137,6 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) # as -Weverything, to match MSVC. Instead -W3 is the alias for -Wall. # See http://llvm.org/viewvc/llvm-project?view=revision&revision=319116 set(C_CXX_FLAGS "${C_CXX_FLAGS} -W3 -Wno-unused-parameter -fmsc-version=1900") - # googletest suppresses warning C4996 via a pragma, but clang-cl does not - # honor it. Suppress it here to compensate. See https://crbug.com/772117. - set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wno-deprecated-declarations") else() if(EMSCRIPTEN) # emscripten's emcc/clang does not accept the "-ggdb" flag. From f219ae96bef5be04e78ddb5b5226ccb6439bd3ed Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 31 Jan 2023 13:36:55 -0500 Subject: [PATCH 058/177] Fix the type of x400Address in GENERAL_NAME This fixes CVE-2023-0286. The main impact is that GENERAL_NAME_cmp, when given x400Addresses, can interpret a pointer with the wrong type. Applications that set X509_V_FLAG_CRL_CHECK and take CRLs from untrusted sources should take this patch. Change-Id: Ib76265fa098df3cb0db075646773c14d59d0ca75 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56985 Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- crypto/x509/x509_test.cc | 2 ++ crypto/x509v3/v3_genn.c | 2 +- include/openssl/x509v3.h | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 4f931b3e72..2fa22e7ad9 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -3591,6 +3591,8 @@ TEST(X509Test, GeneralName) { {0x82, 0x01, 0x61}, // [2 PRIMITIVE] { "b" } {0x82, 0x01, 0x62}, + // [3] {} + {0xa3, 0x00}, // [4] { // SEQUENCE { // SET { diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c index f313c797df..aafad93960 100644 --- a/crypto/x509v3/v3_genn.c +++ b/crypto/x509v3/v3_genn.c @@ -129,7 +129,7 @@ int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) { switch (a->type) { case GEN_X400: - return ASN1_TYPE_cmp(a->d.x400Address, b->d.x400Address); + return ASN1_STRING_cmp(a->d.x400Address, b->d.x400Address); case GEN_EDIPARTY: return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName); diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h index f305dae87a..9002286c54 100644 --- a/include/openssl/x509v3.h +++ b/include/openssl/x509v3.h @@ -167,7 +167,7 @@ typedef struct GENERAL_NAME_st { OTHERNAME *otherName; // otherName ASN1_IA5STRING *rfc822Name; ASN1_IA5STRING *dNSName; - ASN1_TYPE *x400Address; + ASN1_STRING *x400Address; X509_NAME *directoryName; EDIPARTYNAME *ediPartyName; ASN1_IA5STRING *uniformResourceIdentifier; @@ -179,7 +179,6 @@ typedef struct GENERAL_NAME_st { X509_NAME *dirn; // dirn ASN1_IA5STRING *ia5; // rfc822Name, dNSName, uniformResourceIdentifier ASN1_OBJECT *rid; // registeredID - ASN1_TYPE *other; // x400Address } d; } GENERAL_NAME; From e3912cdf9b5095f8ecdf1c6390b79ebe5cf48f31 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 7 Feb 2023 12:00:27 -0500 Subject: [PATCH 059/177] Also test i2d_GENERAL_NAME in X509Test.GeneralName GENERAL_NAME uses a weird ASN1_SEQUENCE item type. Test that serializing it works. Change-Id: I8d44eb637f58a9fbe870b1998b0d75e2bfcde601 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56986 Auto-Submit: David Benjamin Commit-Queue: David Benjamin Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- crypto/x509/x509_test.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 2fa22e7ad9..2e885c4deb 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -3690,6 +3690,12 @@ TEST(X509Test, GeneralName) { ASSERT_TRUE(a); ASSERT_EQ(ptr, kNames[i].data() + kNames[i].size()); + uint8_t *enc = nullptr; + int enc_len = i2d_GENERAL_NAME(a.get(), &enc); + ASSERT_GE(enc_len, 0); + bssl::UniquePtr free_enc(enc); + EXPECT_EQ(Bytes(enc, enc_len), Bytes(kNames[i])); + for (size_t j = 0; j < OPENSSL_ARRAY_SIZE(kNames); j++) { SCOPED_TRACE(Bytes(kNames[j])); From d3d7d36151ce966ed132bfcb9e108fffa6d70535 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 7 Feb 2023 12:03:04 -0500 Subject: [PATCH 060/177] Unexport GENERAL_NAME_cmp This function was involved in both CVE-2020-1971 and CVE-2023-0286. Both times, we've had to confirm there were no external callers. Unexport it so we can be sure of this. Change-Id: I37b756f5bd66e389f03540872371001c85a0b5af Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56987 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509v3/internal.h | 8 ++++++++ crypto/x509v3/v3_genn.c | 36 +++++++++++++++++++----------------- include/openssl/x509v3.h | 7 ------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h index 0c068a0455..e9d601ba38 100644 --- a/crypto/x509v3/internal.h +++ b/crypto/x509v3/internal.h @@ -181,6 +181,14 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); ERR_add_error_data(6, "section:", (val)->section, ",name:", (val)->name, \ ",value:", (val)->value); +// GENERAL_NAME_cmp returns zero if |a| and |b| are equal and a non-zero +// value otherwise. Note this function does not provide a comparison suitable +// for sorting. +// +// This function is exported for testing. +OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a, + const GENERAL_NAME *b); + #if defined(__cplusplus) } // extern C diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c index aafad93960..d593727b0d 100644 --- a/crypto/x509v3/v3_genn.c +++ b/crypto/x509v3/v3_genn.c @@ -61,6 +61,8 @@ #include #include +#include "internal.h" + ASN1_SEQUENCE(OTHERNAME) = { ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT), @@ -121,6 +123,22 @@ static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) { return ASN1_STRING_cmp(a->partyName, b->partyName); } +// Returns 0 if they are equal, != 0 otherwise. +static int othername_cmp(OTHERNAME *a, OTHERNAME *b) { + int result = -1; + + if (!a || !b) { + return -1; + } + // Check their type first. + if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) { + return result; + } + // Check the value. + result = ASN1_TYPE_cmp(a->value, b->value); + return result; +} + // Returns 0 if they are equal, != 0 otherwise. int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) { if (!a || !b || a->type != b->type) { @@ -135,7 +153,7 @@ int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) { return edipartyname_cmp(a->d.ediPartyName, b->d.ediPartyName); case GEN_OTHERNAME: - return OTHERNAME_cmp(a->d.otherName, b->d.otherName); + return othername_cmp(a->d.otherName, b->d.otherName); case GEN_EMAIL: case GEN_DNS: @@ -155,22 +173,6 @@ int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b) { return -1; } -// Returns 0 if they are equal, != 0 otherwise. -int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b) { - int result = -1; - - if (!a || !b) { - return -1; - } - // Check their type first. - if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) { - return result; - } - // Check the value. - result = ASN1_TYPE_cmp(a->value, b->value); - return result; -} - void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value) { switch (type) { case GEN_X400: diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h index 9002286c54..04b3cb925c 100644 --- a/include/openssl/x509v3.h +++ b/include/openssl/x509v3.h @@ -426,12 +426,6 @@ DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); -// GENERAL_NAME_cmp returns zero if |a| and |b| are equal and a non-zero -// value otherwise. Note this function does not provide a comparison suitable -// for sorting. -OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a, - const GENERAL_NAME *b); - // i2v_GENERAL_NAME serializes |gen| as a |CONF_VALUE|. If |ret| is non-NULL, it // appends the value to |ret| and returns |ret| on success or NULL on error. If // it returns NULL, the caller is still responsible for freeing |ret|. If |ret| @@ -468,7 +462,6 @@ OPENSSL_EXPORT GENERAL_NAMES *v2i_GENERAL_NAMES( DECLARE_ASN1_FUNCTIONS_const(OTHERNAME) DECLARE_ASN1_FUNCTIONS_const(EDIPARTYNAME) -OPENSSL_EXPORT int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); OPENSSL_EXPORT void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype); From 0586618453a279d14dbd6db7fdfaab37047ad39c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 18:25:06 -0500 Subject: [PATCH 061/177] Trim unnecessary -lrt and ws2_32 deps in the build. The ws2_32 dependency comes from BIO, which is in libcrypto. Once it's added there, it should get inherited by anything downstream, so we don't need to keep listing it. We also no longer need -lrt. We tried to remove it in https://boringssl-review.googlesource.com/4622, but had to revert it in https://boringssl-review.googlesource.com/4894 because of clock_gettime. clock_gettime, per the Linux man page, is now in libc, not librt, as of glibc 2.17. THat was released December 2012, well past our five year watermark, so clean this part of the build up. Change-Id: Ie6a07434b0cb02fe916b32ab8c326ec33d40bcb6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56606 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/CMakeLists.txt | 5 +---- decrepit/CMakeLists.txt | 3 --- ssl/CMakeLists.txt | 3 --- tool/CMakeLists.txt | 17 +---------------- util/generate_build_files.py | 2 +- 5 files changed, 3 insertions(+), 27 deletions(-) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index ec6d2ee295..45231bb986 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -330,7 +330,7 @@ if(FIPS_DELOCATE OR FIPS_SHARED) add_dependencies(crypto bcm_o_target) endif() -SET_TARGET_PROPERTIES(crypto PROPERTIES LINKER_LANGUAGE C) +set_target_properties(crypto PROPERTIES LINKER_LANGUAGE C) if(WIN32) target_link_libraries(crypto ws2_32) @@ -436,7 +436,4 @@ add_executable( add_dependencies(crypto_test global_target) target_link_libraries(crypto_test test_support_lib boringssl_gtest crypto) -if(WIN32) - target_link_libraries(crypto_test ws2_32) -endif() add_dependencies(all_tests crypto_test) diff --git a/decrepit/CMakeLists.txt b/decrepit/CMakeLists.txt index 16985da199..2c10f0ee2a 100644 --- a/decrepit/CMakeLists.txt +++ b/decrepit/CMakeLists.txt @@ -43,7 +43,4 @@ add_dependencies(decrepit_test global_target) target_link_libraries(decrepit_test test_support_lib boringssl_gtest decrepit crypto) -if(WIN32) - target_link_libraries(decrepit_test ws2_32) -endif() add_dependencies(all_tests decrepit_test) diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index b4b1032612..b558be4fdf 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -69,7 +69,4 @@ add_executable( add_dependencies(ssl_test global_target) target_link_libraries(ssl_test test_support_lib boringssl_gtest ssl crypto) -if(WIN32) - target_link_libraries(ssl_test ws2_32) -endif() add_dependencies(all_tests ssl_test) diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index f98e96e371..e84d229fd5 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -22,20 +22,5 @@ add_executable( transport_common.cc ) install(TARGETS bssl DESTINATION ${CMAKE_INSTALL_BINDIR}) - add_dependencies(bssl global_target) - -if(WIN32) - target_link_libraries(bssl ws2_32) -endif() - -if(APPLE OR WIN32 OR ANDROID) - target_link_libraries(bssl ssl crypto) -else() - find_library(FOUND_LIBRT rt) - if(FOUND_LIBRT) - target_link_libraries(bssl ssl crypto -lrt) - else() - target_link_libraries(bssl ssl crypto) - endif() -endif() +target_link_libraries(bssl ssl crypto) diff --git a/util/generate_build_files.py b/util/generate_build_files.py index c221f04781..9a62c838ec 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -550,7 +550,7 @@ def WriteFiles(self, files, asm_outputs): endif() if(WIN32) - target_link_libraries(bssl ws2_32) + target_link_libraries(crypto ws2_32) endif() ''') From 70e415d6b836c3c98b207a4c050c99c7971a1930 Mon Sep 17 00:00:00 2001 From: Alexander Chernyakhovsky Date: Tue, 7 Feb 2023 15:59:01 -0500 Subject: [PATCH 062/177] Remove if'd-out OCB-AES assembly BoringSSL never shipped the OCB-AES assembly, but took two different strategies in disabling it for x86 versus x86_64. For x86, the implementation was deleted, but for x86_64 it was wrapped in `if(0)`. Since we're no longer as concerned about keeping the assembly from diverging from upstream, be consistent in how the OCB-AES functions are removed from both by deleting them from x86_64. Change-Id: I5233134e3e131fed56f365ed6f43f30c39dd2e33 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56989 Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- crypto/fipsmodule/aes/asm/aesni-x86_64.pl | 949 ---------------------- 1 file changed, 949 deletions(-) diff --git a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl index 2abc8d03b4..320760a841 100644 --- a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl +++ b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl @@ -2764,955 +2764,6 @@ sub aesni_generate8 { .cfi_endproc .size ${PREFIX}_xts_decrypt,.-${PREFIX}_xts_decrypt ___ -} - -###################################################################### -# void aesni_ocb_[en|de]crypt(const char *inp, char *out, size_t blocks, -# const AES_KEY *key, unsigned int start_block_num, -# unsigned char offset_i[16], const unsigned char L_[][16], -# unsigned char checksum[16]); -# -if (0) { # Omit these functions in BoringSSL -my @offset=map("%xmm$_",(10..15)); -my ($checksum,$rndkey0l)=("%xmm8","%xmm9"); -my ($block_num,$offset_p)=("%r8","%r9"); # 5th and 6th arguments -my ($L_p,$checksum_p) = ("%rbx","%rbp"); -my ($i1,$i3,$i5) = ("%r12","%r13","%r14"); -my $seventh_arg = $win64 ? 56 : 8; -my $blocks = $len; - -$code.=<<___; -.globl ${PREFIX}_ocb_encrypt -.type ${PREFIX}_ocb_encrypt,\@function,6 -.align 32 -${PREFIX}_ocb_encrypt: -.cfi_startproc - lea (%rsp),%rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 -___ -$code.=<<___ if ($win64); - lea -0xa0(%rsp),%rsp - movaps %xmm6,0x00(%rsp) # offload everything - movaps %xmm7,0x10(%rsp) - movaps %xmm8,0x20(%rsp) - movaps %xmm9,0x30(%rsp) - movaps %xmm10,0x40(%rsp) - movaps %xmm11,0x50(%rsp) - movaps %xmm12,0x60(%rsp) - movaps %xmm13,0x70(%rsp) - movaps %xmm14,0x80(%rsp) - movaps %xmm15,0x90(%rsp) -.Locb_enc_body: -___ -$code.=<<___; - mov $seventh_arg(%rax),$L_p # 7th argument - mov $seventh_arg+8(%rax),$checksum_p# 8th argument - - mov 240($key),$rnds_ - mov $key,$key_ - shl \$4,$rnds_ - $movkey ($key),$rndkey0l # round[0] - $movkey 16($key,$rnds_),$rndkey1 # round[last] - - movdqu ($offset_p),@offset[5] # load last offset_i - pxor $rndkey1,$rndkey0l # round[0] ^ round[last] - pxor $rndkey1,@offset[5] # offset_i ^ round[last] - - mov \$16+32,$rounds - lea 32($key_,$rnds_),$key - $movkey 16($key_),$rndkey1 # round[1] - sub %r10,%rax # twisted $rounds - mov %rax,%r10 # backup twisted $rounds - - movdqu ($L_p),@offset[0] # L_0 for all odd-numbered blocks - movdqu ($checksum_p),$checksum # load checksum - - test \$1,$block_num # is first block number odd? - jnz .Locb_enc_odd - - bsf $block_num,$i1 - add \$1,$block_num - shl \$4,$i1 - movdqu ($L_p,$i1),$inout5 # borrow - movdqu ($inp),$inout0 - lea 16($inp),$inp - - call __ocb_encrypt1 - - movdqa $inout5,@offset[5] - movups $inout0,($out) - lea 16($out),$out - sub \$1,$blocks - jz .Locb_enc_done - -.Locb_enc_odd: - lea 1($block_num),$i1 # even-numbered blocks - lea 3($block_num),$i3 - lea 5($block_num),$i5 - lea 6($block_num),$block_num - bsf $i1,$i1 # ntz(block) - bsf $i3,$i3 - bsf $i5,$i5 - shl \$4,$i1 # ntz(block) -> table offset - shl \$4,$i3 - shl \$4,$i5 - - sub \$6,$blocks - jc .Locb_enc_short - jmp .Locb_enc_grandloop - -.align 32 -.Locb_enc_grandloop: - movdqu `16*0`($inp),$inout0 # load input - movdqu `16*1`($inp),$inout1 - movdqu `16*2`($inp),$inout2 - movdqu `16*3`($inp),$inout3 - movdqu `16*4`($inp),$inout4 - movdqu `16*5`($inp),$inout5 - lea `16*6`($inp),$inp - - call __ocb_encrypt6 - - movups $inout0,`16*0`($out) # store output - movups $inout1,`16*1`($out) - movups $inout2,`16*2`($out) - movups $inout3,`16*3`($out) - movups $inout4,`16*4`($out) - movups $inout5,`16*5`($out) - lea `16*6`($out),$out - sub \$6,$blocks - jnc .Locb_enc_grandloop - -.Locb_enc_short: - add \$6,$blocks - jz .Locb_enc_done - - movdqu `16*0`($inp),$inout0 - cmp \$2,$blocks - jb .Locb_enc_one - movdqu `16*1`($inp),$inout1 - je .Locb_enc_two - - movdqu `16*2`($inp),$inout2 - cmp \$4,$blocks - jb .Locb_enc_three - movdqu `16*3`($inp),$inout3 - je .Locb_enc_four - - movdqu `16*4`($inp),$inout4 - pxor $inout5,$inout5 - - call __ocb_encrypt6 - - movdqa @offset[4],@offset[5] - movups $inout0,`16*0`($out) - movups $inout1,`16*1`($out) - movups $inout2,`16*2`($out) - movups $inout3,`16*3`($out) - movups $inout4,`16*4`($out) - - jmp .Locb_enc_done - -.align 16 -.Locb_enc_one: - movdqa @offset[0],$inout5 # borrow - - call __ocb_encrypt1 - - movdqa $inout5,@offset[5] - movups $inout0,`16*0`($out) - jmp .Locb_enc_done - -.align 16 -.Locb_enc_two: - pxor $inout2,$inout2 - pxor $inout3,$inout3 - - call __ocb_encrypt4 - - movdqa @offset[1],@offset[5] - movups $inout0,`16*0`($out) - movups $inout1,`16*1`($out) - - jmp .Locb_enc_done - -.align 16 -.Locb_enc_three: - pxor $inout3,$inout3 - - call __ocb_encrypt4 - - movdqa @offset[2],@offset[5] - movups $inout0,`16*0`($out) - movups $inout1,`16*1`($out) - movups $inout2,`16*2`($out) - - jmp .Locb_enc_done - -.align 16 -.Locb_enc_four: - call __ocb_encrypt4 - - movdqa @offset[3],@offset[5] - movups $inout0,`16*0`($out) - movups $inout1,`16*1`($out) - movups $inout2,`16*2`($out) - movups $inout3,`16*3`($out) - -.Locb_enc_done: - pxor $rndkey0,@offset[5] # "remove" round[last] - movdqu $checksum,($checksum_p) # store checksum - movdqu @offset[5],($offset_p) # store last offset_i - - xorps %xmm0,%xmm0 # clear register bank - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -$code.=<<___ if (!$win64); - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - pxor %xmm8,%xmm8 - pxor %xmm9,%xmm9 - pxor %xmm10,%xmm10 - pxor %xmm11,%xmm11 - pxor %xmm12,%xmm12 - pxor %xmm13,%xmm13 - pxor %xmm14,%xmm14 - pxor %xmm15,%xmm15 - lea 0x28(%rsp),%rax -.cfi_def_cfa %rax,8 -___ -$code.=<<___ if ($win64); - movaps 0x00(%rsp),%xmm6 - movaps %xmm0,0x00(%rsp) # clear stack - movaps 0x10(%rsp),%xmm7 - movaps %xmm0,0x10(%rsp) - movaps 0x20(%rsp),%xmm8 - movaps %xmm0,0x20(%rsp) - movaps 0x30(%rsp),%xmm9 - movaps %xmm0,0x30(%rsp) - movaps 0x40(%rsp),%xmm10 - movaps %xmm0,0x40(%rsp) - movaps 0x50(%rsp),%xmm11 - movaps %xmm0,0x50(%rsp) - movaps 0x60(%rsp),%xmm12 - movaps %xmm0,0x60(%rsp) - movaps 0x70(%rsp),%xmm13 - movaps %xmm0,0x70(%rsp) - movaps 0x80(%rsp),%xmm14 - movaps %xmm0,0x80(%rsp) - movaps 0x90(%rsp),%xmm15 - movaps %xmm0,0x90(%rsp) - lea 0xa0+0x28(%rsp),%rax -.Locb_enc_pop: -___ -$code.=<<___; - mov -40(%rax),%r14 -.cfi_restore %r14 - mov -32(%rax),%r13 -.cfi_restore %r13 - mov -24(%rax),%r12 -.cfi_restore %r12 - mov -16(%rax),%rbp -.cfi_restore %rbp - mov -8(%rax),%rbx -.cfi_restore %rbx - lea (%rax),%rsp -.cfi_def_cfa_register %rsp -.Locb_enc_epilogue: - ret -.cfi_endproc -.size ${PREFIX}_ocb_encrypt,.-${PREFIX}_ocb_encrypt - -.type __ocb_encrypt6,\@abi-omnipotent -.align 32 -__ocb_encrypt6: - pxor $rndkey0l,@offset[5] # offset_i ^ round[0] - movdqu ($L_p,$i1),@offset[1] - movdqa @offset[0],@offset[2] - movdqu ($L_p,$i3),@offset[3] - movdqa @offset[0],@offset[4] - pxor @offset[5],@offset[0] - movdqu ($L_p,$i5),@offset[5] - pxor @offset[0],@offset[1] - pxor $inout0,$checksum # accumulate checksum - pxor @offset[0],$inout0 # input ^ round[0] ^ offset_i - pxor @offset[1],@offset[2] - pxor $inout1,$checksum - pxor @offset[1],$inout1 - pxor @offset[2],@offset[3] - pxor $inout2,$checksum - pxor @offset[2],$inout2 - pxor @offset[3],@offset[4] - pxor $inout3,$checksum - pxor @offset[3],$inout3 - pxor @offset[4],@offset[5] - pxor $inout4,$checksum - pxor @offset[4],$inout4 - pxor $inout5,$checksum - pxor @offset[5],$inout5 - $movkey 32($key_),$rndkey0 - - lea 1($block_num),$i1 # even-numbered blocks - lea 3($block_num),$i3 - lea 5($block_num),$i5 - add \$6,$block_num - pxor $rndkey0l,@offset[0] # offset_i ^ round[last] - bsf $i1,$i1 # ntz(block) - bsf $i3,$i3 - bsf $i5,$i5 - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - pxor $rndkey0l,@offset[1] - pxor $rndkey0l,@offset[2] - aesenc $rndkey1,$inout4 - pxor $rndkey0l,@offset[3] - pxor $rndkey0l,@offset[4] - aesenc $rndkey1,$inout5 - $movkey 48($key_),$rndkey1 - pxor $rndkey0l,@offset[5] - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - $movkey 64($key_),$rndkey0 - shl \$4,$i1 # ntz(block) -> table offset - shl \$4,$i3 - jmp .Locb_enc_loop6 - -.align 32 -.Locb_enc_loop6: - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_enc_loop6 - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - $movkey 16($key_),$rndkey1 - shl \$4,$i5 - - aesenclast @offset[0],$inout0 - movdqu ($L_p),@offset[0] # L_0 for all odd-numbered blocks - mov %r10,%rax # restore twisted rounds - aesenclast @offset[1],$inout1 - aesenclast @offset[2],$inout2 - aesenclast @offset[3],$inout3 - aesenclast @offset[4],$inout4 - aesenclast @offset[5],$inout5 - ret -.size __ocb_encrypt6,.-__ocb_encrypt6 - -.type __ocb_encrypt4,\@abi-omnipotent -.align 32 -__ocb_encrypt4: - pxor $rndkey0l,@offset[5] # offset_i ^ round[0] - movdqu ($L_p,$i1),@offset[1] - movdqa @offset[0],@offset[2] - movdqu ($L_p,$i3),@offset[3] - pxor @offset[5],@offset[0] - pxor @offset[0],@offset[1] - pxor $inout0,$checksum # accumulate checksum - pxor @offset[0],$inout0 # input ^ round[0] ^ offset_i - pxor @offset[1],@offset[2] - pxor $inout1,$checksum - pxor @offset[1],$inout1 - pxor @offset[2],@offset[3] - pxor $inout2,$checksum - pxor @offset[2],$inout2 - pxor $inout3,$checksum - pxor @offset[3],$inout3 - $movkey 32($key_),$rndkey0 - - pxor $rndkey0l,@offset[0] # offset_i ^ round[last] - pxor $rndkey0l,@offset[1] - pxor $rndkey0l,@offset[2] - pxor $rndkey0l,@offset[3] - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - $movkey 48($key_),$rndkey1 - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - $movkey 64($key_),$rndkey0 - jmp .Locb_enc_loop4 - -.align 32 -.Locb_enc_loop4: - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_enc_loop4 - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - $movkey 16($key_),$rndkey1 - mov %r10,%rax # restore twisted rounds - - aesenclast @offset[0],$inout0 - aesenclast @offset[1],$inout1 - aesenclast @offset[2],$inout2 - aesenclast @offset[3],$inout3 - ret -.size __ocb_encrypt4,.-__ocb_encrypt4 - -.type __ocb_encrypt1,\@abi-omnipotent -.align 32 -__ocb_encrypt1: - pxor @offset[5],$inout5 # offset_i - pxor $rndkey0l,$inout5 # offset_i ^ round[0] - pxor $inout0,$checksum # accumulate checksum - pxor $inout5,$inout0 # input ^ round[0] ^ offset_i - $movkey 32($key_),$rndkey0 - - aesenc $rndkey1,$inout0 - $movkey 48($key_),$rndkey1 - pxor $rndkey0l,$inout5 # offset_i ^ round[last] - - aesenc $rndkey0,$inout0 - $movkey 64($key_),$rndkey0 - jmp .Locb_enc_loop1 - -.align 32 -.Locb_enc_loop1: - aesenc $rndkey1,$inout0 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesenc $rndkey0,$inout0 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_enc_loop1 - - aesenc $rndkey1,$inout0 - $movkey 16($key_),$rndkey1 # redundant in tail - mov %r10,%rax # restore twisted rounds - - aesenclast $inout5,$inout0 - ret -.size __ocb_encrypt1,.-__ocb_encrypt1 - -.globl ${PREFIX}_ocb_decrypt -.type ${PREFIX}_ocb_decrypt,\@function,6 -.align 32 -${PREFIX}_ocb_decrypt: -.cfi_startproc - lea (%rsp),%rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 -___ -$code.=<<___ if ($win64); - lea -0xa0(%rsp),%rsp - movaps %xmm6,0x00(%rsp) # offload everything - movaps %xmm7,0x10(%rsp) - movaps %xmm8,0x20(%rsp) - movaps %xmm9,0x30(%rsp) - movaps %xmm10,0x40(%rsp) - movaps %xmm11,0x50(%rsp) - movaps %xmm12,0x60(%rsp) - movaps %xmm13,0x70(%rsp) - movaps %xmm14,0x80(%rsp) - movaps %xmm15,0x90(%rsp) -.Locb_dec_body: -___ -$code.=<<___; - mov $seventh_arg(%rax),$L_p # 7th argument - mov $seventh_arg+8(%rax),$checksum_p# 8th argument - - mov 240($key),$rnds_ - mov $key,$key_ - shl \$4,$rnds_ - $movkey ($key),$rndkey0l # round[0] - $movkey 16($key,$rnds_),$rndkey1 # round[last] - - movdqu ($offset_p),@offset[5] # load last offset_i - pxor $rndkey1,$rndkey0l # round[0] ^ round[last] - pxor $rndkey1,@offset[5] # offset_i ^ round[last] - - mov \$16+32,$rounds - lea 32($key_,$rnds_),$key - $movkey 16($key_),$rndkey1 # round[1] - sub %r10,%rax # twisted $rounds - mov %rax,%r10 # backup twisted $rounds - - movdqu ($L_p),@offset[0] # L_0 for all odd-numbered blocks - movdqu ($checksum_p),$checksum # load checksum - - test \$1,$block_num # is first block number odd? - jnz .Locb_dec_odd - - bsf $block_num,$i1 - add \$1,$block_num - shl \$4,$i1 - movdqu ($L_p,$i1),$inout5 # borrow - movdqu ($inp),$inout0 - lea 16($inp),$inp - - call __ocb_decrypt1 - - movdqa $inout5,@offset[5] - movups $inout0,($out) - xorps $inout0,$checksum # accumulate checksum - lea 16($out),$out - sub \$1,$blocks - jz .Locb_dec_done - -.Locb_dec_odd: - lea 1($block_num),$i1 # even-numbered blocks - lea 3($block_num),$i3 - lea 5($block_num),$i5 - lea 6($block_num),$block_num - bsf $i1,$i1 # ntz(block) - bsf $i3,$i3 - bsf $i5,$i5 - shl \$4,$i1 # ntz(block) -> table offset - shl \$4,$i3 - shl \$4,$i5 - - sub \$6,$blocks - jc .Locb_dec_short - jmp .Locb_dec_grandloop - -.align 32 -.Locb_dec_grandloop: - movdqu `16*0`($inp),$inout0 # load input - movdqu `16*1`($inp),$inout1 - movdqu `16*2`($inp),$inout2 - movdqu `16*3`($inp),$inout3 - movdqu `16*4`($inp),$inout4 - movdqu `16*5`($inp),$inout5 - lea `16*6`($inp),$inp - - call __ocb_decrypt6 - - movups $inout0,`16*0`($out) # store output - pxor $inout0,$checksum # accumulate checksum - movups $inout1,`16*1`($out) - pxor $inout1,$checksum - movups $inout2,`16*2`($out) - pxor $inout2,$checksum - movups $inout3,`16*3`($out) - pxor $inout3,$checksum - movups $inout4,`16*4`($out) - pxor $inout4,$checksum - movups $inout5,`16*5`($out) - pxor $inout5,$checksum - lea `16*6`($out),$out - sub \$6,$blocks - jnc .Locb_dec_grandloop - -.Locb_dec_short: - add \$6,$blocks - jz .Locb_dec_done - - movdqu `16*0`($inp),$inout0 - cmp \$2,$blocks - jb .Locb_dec_one - movdqu `16*1`($inp),$inout1 - je .Locb_dec_two - - movdqu `16*2`($inp),$inout2 - cmp \$4,$blocks - jb .Locb_dec_three - movdqu `16*3`($inp),$inout3 - je .Locb_dec_four - - movdqu `16*4`($inp),$inout4 - pxor $inout5,$inout5 - - call __ocb_decrypt6 - - movdqa @offset[4],@offset[5] - movups $inout0,`16*0`($out) # store output - pxor $inout0,$checksum # accumulate checksum - movups $inout1,`16*1`($out) - pxor $inout1,$checksum - movups $inout2,`16*2`($out) - pxor $inout2,$checksum - movups $inout3,`16*3`($out) - pxor $inout3,$checksum - movups $inout4,`16*4`($out) - pxor $inout4,$checksum - - jmp .Locb_dec_done - -.align 16 -.Locb_dec_one: - movdqa @offset[0],$inout5 # borrow - - call __ocb_decrypt1 - - movdqa $inout5,@offset[5] - movups $inout0,`16*0`($out) # store output - xorps $inout0,$checksum # accumulate checksum - jmp .Locb_dec_done - -.align 16 -.Locb_dec_two: - pxor $inout2,$inout2 - pxor $inout3,$inout3 - - call __ocb_decrypt4 - - movdqa @offset[1],@offset[5] - movups $inout0,`16*0`($out) # store output - xorps $inout0,$checksum # accumulate checksum - movups $inout1,`16*1`($out) - xorps $inout1,$checksum - - jmp .Locb_dec_done - -.align 16 -.Locb_dec_three: - pxor $inout3,$inout3 - - call __ocb_decrypt4 - - movdqa @offset[2],@offset[5] - movups $inout0,`16*0`($out) # store output - xorps $inout0,$checksum # accumulate checksum - movups $inout1,`16*1`($out) - xorps $inout1,$checksum - movups $inout2,`16*2`($out) - xorps $inout2,$checksum - - jmp .Locb_dec_done - -.align 16 -.Locb_dec_four: - call __ocb_decrypt4 - - movdqa @offset[3],@offset[5] - movups $inout0,`16*0`($out) # store output - pxor $inout0,$checksum # accumulate checksum - movups $inout1,`16*1`($out) - pxor $inout1,$checksum - movups $inout2,`16*2`($out) - pxor $inout2,$checksum - movups $inout3,`16*3`($out) - pxor $inout3,$checksum - -.Locb_dec_done: - pxor $rndkey0,@offset[5] # "remove" round[last] - movdqu $checksum,($checksum_p) # store checksum - movdqu @offset[5],($offset_p) # store last offset_i - - xorps %xmm0,%xmm0 # clear register bank - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -$code.=<<___ if (!$win64); - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - pxor %xmm8,%xmm8 - pxor %xmm9,%xmm9 - pxor %xmm10,%xmm10 - pxor %xmm11,%xmm11 - pxor %xmm12,%xmm12 - pxor %xmm13,%xmm13 - pxor %xmm14,%xmm14 - pxor %xmm15,%xmm15 - lea 0x28(%rsp),%rax -.cfi_def_cfa %rax,8 -___ -$code.=<<___ if ($win64); - movaps 0x00(%rsp),%xmm6 - movaps %xmm0,0x00(%rsp) # clear stack - movaps 0x10(%rsp),%xmm7 - movaps %xmm0,0x10(%rsp) - movaps 0x20(%rsp),%xmm8 - movaps %xmm0,0x20(%rsp) - movaps 0x30(%rsp),%xmm9 - movaps %xmm0,0x30(%rsp) - movaps 0x40(%rsp),%xmm10 - movaps %xmm0,0x40(%rsp) - movaps 0x50(%rsp),%xmm11 - movaps %xmm0,0x50(%rsp) - movaps 0x60(%rsp),%xmm12 - movaps %xmm0,0x60(%rsp) - movaps 0x70(%rsp),%xmm13 - movaps %xmm0,0x70(%rsp) - movaps 0x80(%rsp),%xmm14 - movaps %xmm0,0x80(%rsp) - movaps 0x90(%rsp),%xmm15 - movaps %xmm0,0x90(%rsp) - lea 0xa0+0x28(%rsp),%rax -.Locb_dec_pop: -___ -$code.=<<___; - mov -40(%rax),%r14 -.cfi_restore %r14 - mov -32(%rax),%r13 -.cfi_restore %r13 - mov -24(%rax),%r12 -.cfi_restore %r12 - mov -16(%rax),%rbp -.cfi_restore %rbp - mov -8(%rax),%rbx -.cfi_restore %rbx - lea (%rax),%rsp -.cfi_def_cfa_register %rsp -.Locb_dec_epilogue: - ret -.cfi_endproc -.size ${PREFIX}_ocb_decrypt,.-${PREFIX}_ocb_decrypt - -.type __ocb_decrypt6,\@abi-omnipotent -.align 32 -__ocb_decrypt6: - pxor $rndkey0l,@offset[5] # offset_i ^ round[0] - movdqu ($L_p,$i1),@offset[1] - movdqa @offset[0],@offset[2] - movdqu ($L_p,$i3),@offset[3] - movdqa @offset[0],@offset[4] - pxor @offset[5],@offset[0] - movdqu ($L_p,$i5),@offset[5] - pxor @offset[0],@offset[1] - pxor @offset[0],$inout0 # input ^ round[0] ^ offset_i - pxor @offset[1],@offset[2] - pxor @offset[1],$inout1 - pxor @offset[2],@offset[3] - pxor @offset[2],$inout2 - pxor @offset[3],@offset[4] - pxor @offset[3],$inout3 - pxor @offset[4],@offset[5] - pxor @offset[4],$inout4 - pxor @offset[5],$inout5 - $movkey 32($key_),$rndkey0 - - lea 1($block_num),$i1 # even-numbered blocks - lea 3($block_num),$i3 - lea 5($block_num),$i5 - add \$6,$block_num - pxor $rndkey0l,@offset[0] # offset_i ^ round[last] - bsf $i1,$i1 # ntz(block) - bsf $i3,$i3 - bsf $i5,$i5 - - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - pxor $rndkey0l,@offset[1] - pxor $rndkey0l,@offset[2] - aesdec $rndkey1,$inout4 - pxor $rndkey0l,@offset[3] - pxor $rndkey0l,@offset[4] - aesdec $rndkey1,$inout5 - $movkey 48($key_),$rndkey1 - pxor $rndkey0l,@offset[5] - - aesdec $rndkey0,$inout0 - aesdec $rndkey0,$inout1 - aesdec $rndkey0,$inout2 - aesdec $rndkey0,$inout3 - aesdec $rndkey0,$inout4 - aesdec $rndkey0,$inout5 - $movkey 64($key_),$rndkey0 - shl \$4,$i1 # ntz(block) -> table offset - shl \$4,$i3 - jmp .Locb_dec_loop6 - -.align 32 -.Locb_dec_loop6: - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - aesdec $rndkey1,$inout4 - aesdec $rndkey1,$inout5 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesdec $rndkey0,$inout0 - aesdec $rndkey0,$inout1 - aesdec $rndkey0,$inout2 - aesdec $rndkey0,$inout3 - aesdec $rndkey0,$inout4 - aesdec $rndkey0,$inout5 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_dec_loop6 - - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - aesdec $rndkey1,$inout4 - aesdec $rndkey1,$inout5 - $movkey 16($key_),$rndkey1 - shl \$4,$i5 - - aesdeclast @offset[0],$inout0 - movdqu ($L_p),@offset[0] # L_0 for all odd-numbered blocks - mov %r10,%rax # restore twisted rounds - aesdeclast @offset[1],$inout1 - aesdeclast @offset[2],$inout2 - aesdeclast @offset[3],$inout3 - aesdeclast @offset[4],$inout4 - aesdeclast @offset[5],$inout5 - ret -.size __ocb_decrypt6,.-__ocb_decrypt6 - -.type __ocb_decrypt4,\@abi-omnipotent -.align 32 -__ocb_decrypt4: - pxor $rndkey0l,@offset[5] # offset_i ^ round[0] - movdqu ($L_p,$i1),@offset[1] - movdqa @offset[0],@offset[2] - movdqu ($L_p,$i3),@offset[3] - pxor @offset[5],@offset[0] - pxor @offset[0],@offset[1] - pxor @offset[0],$inout0 # input ^ round[0] ^ offset_i - pxor @offset[1],@offset[2] - pxor @offset[1],$inout1 - pxor @offset[2],@offset[3] - pxor @offset[2],$inout2 - pxor @offset[3],$inout3 - $movkey 32($key_),$rndkey0 - - pxor $rndkey0l,@offset[0] # offset_i ^ round[last] - pxor $rndkey0l,@offset[1] - pxor $rndkey0l,@offset[2] - pxor $rndkey0l,@offset[3] - - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - $movkey 48($key_),$rndkey1 - - aesdec $rndkey0,$inout0 - aesdec $rndkey0,$inout1 - aesdec $rndkey0,$inout2 - aesdec $rndkey0,$inout3 - $movkey 64($key_),$rndkey0 - jmp .Locb_dec_loop4 - -.align 32 -.Locb_dec_loop4: - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesdec $rndkey0,$inout0 - aesdec $rndkey0,$inout1 - aesdec $rndkey0,$inout2 - aesdec $rndkey0,$inout3 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_dec_loop4 - - aesdec $rndkey1,$inout0 - aesdec $rndkey1,$inout1 - aesdec $rndkey1,$inout2 - aesdec $rndkey1,$inout3 - $movkey 16($key_),$rndkey1 - mov %r10,%rax # restore twisted rounds - - aesdeclast @offset[0],$inout0 - aesdeclast @offset[1],$inout1 - aesdeclast @offset[2],$inout2 - aesdeclast @offset[3],$inout3 - ret -.size __ocb_decrypt4,.-__ocb_decrypt4 - -.type __ocb_decrypt1,\@abi-omnipotent -.align 32 -__ocb_decrypt1: - pxor @offset[5],$inout5 # offset_i - pxor $rndkey0l,$inout5 # offset_i ^ round[0] - pxor $inout5,$inout0 # input ^ round[0] ^ offset_i - $movkey 32($key_),$rndkey0 - - aesdec $rndkey1,$inout0 - $movkey 48($key_),$rndkey1 - pxor $rndkey0l,$inout5 # offset_i ^ round[last] - - aesdec $rndkey0,$inout0 - $movkey 64($key_),$rndkey0 - jmp .Locb_dec_loop1 - -.align 32 -.Locb_dec_loop1: - aesdec $rndkey1,$inout0 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - - aesdec $rndkey0,$inout0 - $movkey -16($key,%rax),$rndkey0 - jnz .Locb_dec_loop1 - - aesdec $rndkey1,$inout0 - $movkey 16($key_),$rndkey1 # redundant in tail - mov %r10,%rax # restore twisted rounds - - aesdeclast $inout5,$inout0 - ret -.size __ocb_decrypt1,.-__ocb_decrypt1 -___ } }} ######################################################################## From 49d7b2d6a4d586e2debfa847e81b5ad9a9d3218a Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 7 Feb 2023 15:55:48 -0500 Subject: [PATCH 063/177] Remove stale TODO in util/bot/DEPS We are using the CIPD copy of CMake on Windows now. Change-Id: Idb9f62876c69333f9504540bad8321a173eaec3e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56988 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- util/bot/DEPS | 1 - 1 file changed, 1 deletion(-) diff --git a/util/bot/DEPS b/util/bot/DEPS index 1f36250a10..d8f93e0c4f 100644 --- a/util/bot/DEPS +++ b/util/bot/DEPS @@ -122,7 +122,6 @@ recursedeps = [ ] hooks = [ - # TODO(https://crbug.com/1180257): Use CIPD for CMake on Windows. { 'name': 'perl_win32', 'pattern': '.', From 908b1300ff4ed3cfc3c965d846560f2593a51491 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 16 Jan 2023 15:17:16 -0500 Subject: [PATCH 064/177] Don't use object reuse in X509_parse_from_buffer. Instead, move the CRYPTO_BUFFER into ASN1_ENCODING (due to padding, upgrading the two bitfields do a pointer doesn't increase memory usage), and instead thread a CRYPTO_BUFFER parameter through tasn_dec.c. Later, I want to reimplement the X509 and X509_CINF parsers with CBS/CBB directly (https://crbug.com/boringssl/547), but that will be easier once the whole crypto/asn1 machinery is rewritten with CBS/CBB (https://crbug.com/boringssl/548). That, in turn, will be easier with object reuse gone. But to get rid of object reuse, I need to remove the one place in the library where we ourselves use it. Bug: 550 Change-Id: Ia4df3da9280f808b124ac1f4ad58745dfe0f49e2 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56646 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/internal.h | 40 +++++++++++++++++++------------- crypto/asn1/tasn_dec.c | 49 ++++++++++++++++++++++++---------------- crypto/asn1/tasn_utl.c | 33 +++++++++++++-------------- crypto/x509/internal.h | 1 - crypto/x509/x509_test.cc | 10 ++++++-- crypto/x509/x_name.c | 2 +- crypto/x509/x_x509.c | 32 +++++++------------------- 7 files changed, 86 insertions(+), 81 deletions(-) diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index 49286ea439..a60a037031 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h @@ -122,20 +122,16 @@ struct asn1_object_st { ASN1_OBJECT *ASN1_OBJECT_new(void); -// ASN1_ENCODING structure: this is used to save the received -// encoding of an ASN1 type. This is useful to get round -// problems with invalid encodings which can break signatures. +// ASN1_ENCODING is used to save the received encoding of an ASN.1 type. This +// avoids problems with invalid encodings that break signatures. typedef struct ASN1_ENCODING_st { - unsigned char *enc; // DER encoding - long len; // Length of encoding, or zero if not present. - // alias_only is zero if |enc| owns the buffer that it points to - // (although |enc| may still be NULL). If one, |enc| points into a - // buffer that is owned elsewhere. - unsigned alias_only : 1; - // alias_only_on_next_parse is one iff the next parsing operation - // should avoid taking a copy of the input and rather set - // |alias_only|. - unsigned alias_only_on_next_parse : 1; + // enc is the saved DER encoding. Its ownership is determined by |buf|. + uint8_t *enc; + // len is the length of |enc|. If zero, there is no saved encoding. + size_t len; + // buf, if non-NULL, is the |CRYPTO_BUFFER| that |enc| points into. If NULL, + // |enc| must be released with |OPENSSL_free|. + CRYPTO_BUFFER *buf; } ASN1_ENCODING; OPENSSL_EXPORT int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d, @@ -147,9 +143,18 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); + +// ASN1_item_ex_d2i parses |len| bytes from |*in| as a structure of type |it| +// and writes the result to |*pval|. If |tag| is non-negative, |it| is +// implicitly tagged with the tag specified by |tag| and |aclass|. If |opt| is +// non-zero, the value is optional. If |buf| is non-NULL, |*in| must point into +// |buf|. +// +// This function returns one and advances |*in| if an object was successfully +// parsed, -1 if an optional value was successfully skipped, and zero on error. int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, char opt, - ASN1_TLC *ctx); + CRYPTO_BUFFER *buf); // ASN1_item_ex_i2d encodes |*pval| as a value of type |it| to |out| under the // i2d output convention. It returns a non-zero length on success and -1 on @@ -191,8 +196,11 @@ void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it); int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it); -int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, - const ASN1_ITEM *it); +// asn1_enc_save saves |inlen| bytes from |in| as |*pval|'s saved encoding. It +// returns one on success and zero on error. If |buf| is non-NULL, |in| must +// point into |buf|. +int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t inlen, + const ASN1_ITEM *it, CRYPTO_BUFFER *buf); // asn1_encoding_clear clears the cached encoding in |enc|. void asn1_encoding_clear(ASN1_ENCODING *enc); diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 0fb7344738..bdde8e3684 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include @@ -79,10 +80,10 @@ static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass, static int asn1_template_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - int depth); + CRYPTO_BUFFER *buf, int depth); static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - int depth); + CRYPTO_BUFFER *buf, int depth); static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, const ASN1_ITEM *it); static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, @@ -90,7 +91,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, int aclass, char opt); static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, int depth); + char opt, CRYPTO_BUFFER *buf, int depth); // Table to convert tags to bit values, used for MSTRING type static const unsigned long tag2bit[31] = { @@ -148,7 +149,8 @@ ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, pval = &ptmpval; } - if (asn1_item_ex_d2i(pval, in, len, it, -1, 0, 0, 0) > 0) { + if (asn1_item_ex_d2i(pval, in, len, it, /*tag=*/-1, /*aclass=*/0, /*opt=*/0, + /*buf=*/NULL, /*depth=*/0) > 0) { return *pval; } return NULL; @@ -159,7 +161,7 @@ ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, - char opt, int depth) { + char opt, CRYPTO_BUFFER *buf, int depth) { const ASN1_TEMPLATE *tt, *errtt = NULL; const unsigned char *p = NULL, *q; unsigned char oclass; @@ -172,6 +174,11 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, return 0; } + if (buf != NULL) { + assert(CRYPTO_BUFFER_data(buf) <= *in && + *in + len <= CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)); + } + // Bound |len| to comfortably fit in an int. Lengths in this module often // switch between int and long without overflow checks. if (len > INT_MAX / 2) { @@ -194,7 +201,8 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE); goto err; } - return asn1_template_ex_d2i(pval, in, len, it->templates, opt, depth); + return asn1_template_ex_d2i(pval, in, len, it->templates, opt, buf, + depth); } return asn1_d2i_ex_primitive(pval, in, len, it, tag, aclass, opt); break; @@ -277,7 +285,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) { pchptr = asn1_get_field_ptr(pval, tt); // We mark field as OPTIONAL so its absence can be recognised. - ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, depth); + ret = asn1_template_ex_d2i(pchptr, &p, len, tt, 1, buf, depth); // If field not present, try the next one if (ret == -1) { continue; @@ -383,7 +391,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } // attempt to read in field, allowing each to be OPTIONAL - ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, depth); + ret = asn1_template_ex_d2i(pseqval, &p, len, seqtt, isopt, buf, depth); if (!ret) { errtt = seqtt; goto err; @@ -422,7 +430,7 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, } } // Save encoding - if (!asn1_enc_save(pval, *in, p - *in, it)) { + if (!asn1_enc_save(pval, *in, p - *in, it, buf)) { goto auxerr; } if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL)) { @@ -449,8 +457,9 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, char opt, - ASN1_TLC *ctx) { - return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, 0); + CRYPTO_BUFFER *buf) { + return asn1_item_ex_d2i(pval, in, len, it, tag, aclass, opt, buf, + /*depth=*/0); } // Templates are handled with two separate functions. One handles any @@ -458,7 +467,7 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, long inlen, const ASN1_TEMPLATE *tt, char opt, - int depth) { + CRYPTO_BUFFER *buf, int depth) { int aclass; int ret; long len; @@ -490,7 +499,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, return 0; } // We've found the field so it can't be OPTIONAL now - ret = asn1_template_noexp_d2i(val, &p, len, tt, 0, depth); + ret = asn1_template_noexp_d2i(val, &p, len, tt, /*opt=*/0, buf, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); return 0; @@ -503,7 +512,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, goto err; } } else { - return asn1_template_noexp_d2i(val, in, inlen, tt, opt, depth); + return asn1_template_noexp_d2i(val, in, inlen, tt, opt, buf, depth); } *in = p; @@ -516,7 +525,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **val, const unsigned char **in, static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, - int depth) { + CRYPTO_BUFFER *buf, int depth) { int aclass; int ret; const unsigned char *p; @@ -574,8 +583,8 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, ASN1_VALUE *skfield; const unsigned char *q = p; skfield = NULL; - if (!asn1_item_ex_d2i(&skfield, &p, len, ASN1_ITEM_ptr(tt->item), -1, 0, - 0, depth)) { + if (!asn1_item_ex_d2i(&skfield, &p, len, ASN1_ITEM_ptr(tt->item), + /*tag=*/-1, /*aclass=*/0, /*opt=*/0, buf, depth)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; } @@ -589,7 +598,7 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } else if (flags & ASN1_TFLG_IMPTAG) { // IMPLICIT tagging ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), tt->tag, - aclass, opt, depth); + aclass, opt, buf, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -598,8 +607,8 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } } else { // Nothing special - ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), -1, 0, opt, - depth); + ret = asn1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), /*tag=*/-1, + /*aclass=*/0, opt, buf, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c index 741ce173ee..488c206c45 100644 --- a/crypto/asn1/tasn_utl.c +++ b/crypto/asn1/tasn_utl.c @@ -63,6 +63,7 @@ #include #include #include +#include #include #include "../internal.h" @@ -135,8 +136,7 @@ void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (enc) { enc->enc = NULL; enc->len = 0; - enc->alias_only = 0; - enc->alias_only_on_next_parse = 0; + enc->buf = NULL; } } @@ -147,42 +147,41 @@ void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { } } -int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, - const ASN1_ITEM *it) { +int asn1_enc_save(ASN1_VALUE **pval, const uint8_t *in, size_t in_len, + const ASN1_ITEM *it, CRYPTO_BUFFER *buf) { ASN1_ENCODING *enc; enc = asn1_get_enc_ptr(pval, it); if (!enc) { return 1; } - if (!enc->alias_only) { - OPENSSL_free(enc->enc); - } - - enc->alias_only = enc->alias_only_on_next_parse; - enc->alias_only_on_next_parse = 0; - - if (enc->alias_only) { + asn1_encoding_clear(enc); + if (buf != NULL) { + assert(CRYPTO_BUFFER_data(buf) <= in && + in + in_len <= CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)); + CRYPTO_BUFFER_up_ref(buf); + enc->buf = buf; enc->enc = (uint8_t *)in; } else { - enc->enc = OPENSSL_memdup(in, inlen); + enc->enc = OPENSSL_memdup(in, in_len); if (!enc->enc) { return 0; } } - enc->len = inlen; + enc->len = in_len; return 1; } void asn1_encoding_clear(ASN1_ENCODING *enc) { - if (!enc->alias_only) { + if (enc->buf != NULL) { + CRYPTO_BUFFER_free(enc->buf); + } else { OPENSSL_free(enc->enc); } enc->enc = NULL; enc->len = 0; - enc->alias_only = 0; - enc->alias_only_on_next_parse = 0; + enc->buf = NULL; } int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h index 7bf14c9091..6c594ecd4c 100644 --- a/crypto/x509/internal.h +++ b/crypto/x509/internal.h @@ -159,7 +159,6 @@ struct x509_st { NAME_CONSTRAINTS *nc; unsigned char cert_hash[SHA256_DIGEST_LENGTH]; X509_CERT_AUX *aux; - CRYPTO_BUFFER *buf; CRYPTO_MUTEX lock; } /* X509 */; diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 2e885c4deb..178e5f8d57 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -2381,12 +2381,18 @@ TEST(X509Test, TestFromBufferReused) { size_t data2_len; bssl::UniquePtr data2; ASSERT_TRUE(PEMToDER(&data2, &data2_len, kLeafPEM)); + EXPECT_TRUE(buffers_alias(root->cert_info->enc.enc, root->cert_info->enc.len, + CRYPTO_BUFFER_data(buf.get()), + CRYPTO_BUFFER_len(buf.get()))); X509 *x509p = root.get(); const uint8_t *inp = data2.get(); X509 *ret = d2i_X509(&x509p, &inp, data2_len); ASSERT_EQ(root.get(), ret); - ASSERT_EQ(nullptr, root->buf); + ASSERT_EQ(nullptr, root->cert_info->enc.buf); + EXPECT_FALSE(buffers_alias(root->cert_info->enc.enc, root->cert_info->enc.len, + CRYPTO_BUFFER_data(buf.get()), + CRYPTO_BUFFER_len(buf.get()))); // Free |data2| and ensure that |root| took its own copy. Otherwise the // following will trigger a use-after-free. @@ -2401,7 +2407,7 @@ TEST(X509Test, TestFromBufferReused) { ASSERT_EQ(static_cast(data2_len), i2d_len); ASSERT_EQ(0, OPENSSL_memcmp(data2.get(), i2d, i2d_len)); - ASSERT_EQ(nullptr, root->buf); + ASSERT_EQ(nullptr, root->cert_info->enc.buf); } TEST(X509Test, TestFailedParseFromBuffer) { diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c index 1d6691bcc2..f017423b2c 100644 --- a/crypto/x509/x_name.c +++ b/crypto/x509/x_name.c @@ -206,7 +206,7 @@ static int x509_name_ex_d2i(ASN1_VALUE **val, const unsigned char **in, ASN1_VALUE *intname_val = NULL; ret = ASN1_item_ex_d2i(&intname_val, &p, len, ASN1_ITEM_rptr(X509_NAME_INTERNAL), /*tag=*/-1, - /*aclass=*/0, opt, ctx); + /*aclass=*/0, opt, /*buf=*/NULL); if (ret <= 0) { return ret; } diff --git a/crypto/x509/x_x509.c b/crypto/x509/x_x509.c index 4f23fd68bb..5205267f52 100644 --- a/crypto/x509/x_x509.c +++ b/crypto/x509/x_x509.c @@ -101,16 +101,10 @@ static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, ret->akid = NULL; ret->aux = NULL; ret->crldp = NULL; - ret->buf = NULL; CRYPTO_new_ex_data(&ret->ex_data); CRYPTO_MUTEX_init(&ret->lock); break; - case ASN1_OP_D2I_PRE: - CRYPTO_BUFFER_free(ret->buf); - ret->buf = NULL; - break; - case ASN1_OP_D2I_POST: { // The version must be one of v1(0), v2(1), or v3(2). long version = X509_VERSION_1; @@ -150,7 +144,6 @@ static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, CRL_DIST_POINTS_free(ret->crldp); GENERAL_NAMES_free(ret->altname); NAME_CONSTRAINTS_free(ret->nc); - CRYPTO_BUFFER_free(ret->buf); break; } @@ -170,29 +163,20 @@ IMPLEMENT_ASN1_DUP_FUNCTION(X509) X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { if (CRYPTO_BUFFER_len(buf) > LONG_MAX) { OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW); - return 0; - } - - X509 *x509 = X509_new(); - if (x509 == NULL) { return NULL; } - x509->cert_info->enc.alias_only_on_next_parse = 1; - + // Pass |buf| into the parser so that the cached encoding in |X509_CINF| can + // alias into the original buffer and save some memory. const uint8_t *inp = CRYPTO_BUFFER_data(buf); - X509 *x509p = x509; - X509 *ret = d2i_X509(&x509p, &inp, CRYPTO_BUFFER_len(buf)); - if (ret == NULL || - inp - CRYPTO_BUFFER_data(buf) != (ptrdiff_t)CRYPTO_BUFFER_len(buf)) { - X509_free(x509p); + X509 *ret = NULL; + if (ASN1_item_ex_d2i((ASN1_VALUE **)&ret, &inp, CRYPTO_BUFFER_len(buf), + ASN1_ITEM_rptr(X509), /*tag=*/-1, + /*aclass=*/0, /*opt=*/0, buf) <= 0 || + inp != CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)) { + X509_free(ret); return NULL; } - assert(x509p == x509); - assert(ret == x509); - - CRYPTO_BUFFER_up_ref(buf); - ret->buf = buf; return ret; } From d9ea5553c3c9af6460257b035e9ebfbffbc78a1d Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 8 Feb 2023 09:29:31 -0500 Subject: [PATCH 065/177] Don't use negative values for unimplemented modes Our EVP_CIPHER_mode returns an unsigned value and including negative numbers in switch/case when the value is unsigned causes some warnings. This should avoid the need for https://github.com/nodejs/node/pull/46564 (Having them be positive shouldn't have compat impacts. CCM is 8, but no cipher will report CCM, so any path checking for it will just be dead code.) Change-Id: I8dcf5ea55fad9732a09d6da73114cde5d69397d3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57025 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: David Benjamin --- include/openssl/cipher.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/openssl/cipher.h b/include/openssl/cipher.h index 0e52ac8dc9..310d7c237f 100644 --- a/include/openssl/cipher.h +++ b/include/openssl/cipher.h @@ -341,6 +341,12 @@ OPENSSL_EXPORT int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, #define EVP_CIPH_GCM_MODE 0x6 #define EVP_CIPH_XTS_MODE 0x7 +// The following values are never returned from |EVP_CIPHER_mode| and are +// included only to make it easier to compile code with BoringSSL. +#define EVP_CIPH_CCM_MODE 0x8 +#define EVP_CIPH_OCB_MODE 0x9 +#define EVP_CIPH_WRAP_MODE 0xa + // Cipher flags (for |EVP_CIPHER_flags|). @@ -506,9 +512,6 @@ OPENSSL_EXPORT const EVP_CIPHER *EVP_cast5_cbc(void); // The following flags do nothing and are included only to make it easier to // compile code with BoringSSL. -#define EVP_CIPH_CCM_MODE (-1) -#define EVP_CIPH_OCB_MODE (-2) -#define EVP_CIPH_WRAP_MODE (-3) #define EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 0 // EVP_CIPHER_CTX_set_flags does nothing. From 19721cd7789e4e4a69c0786951b452262eaba251 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 16 Jan 2023 16:19:03 -0500 Subject: [PATCH 066/177] Remove d2i_FOO object reuse The "object reuse" mode in d2i_FOO is extremely problematic. See bug for details. When we rewrite d2i_RSAPublicKey, etc., with CBS, we switched dropped this fragile behavior and replaced it with freeing the old value and replacing it with the new value. Extend this behavior to all functions generated by crypto/asn1 templates too. In particular, tasn_dec.c already frees the original object on error, which means callers must already be prepared for OpenSSL to free their reused object. The one caller I found that would be incompatible (via both running tests and auditing callers) was actually broken due to this error case, and has been fixed. Update-Note: This slightly changes the calling convention of the d2i_FOO functions. The change should be compatible with almost all valid calls. If something goes wrong, it should hopefully be quite obvious. If affected (or unaffected), prefer to set the output parameter to NULL and use the return value instead. Fixed: 550 Change-Id: Ie54cdf17f8f5a4d76fdbcddeaa27e6afd3fa9d8e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56647 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- PORTING.md | 9 ++--- crypto/asn1/tasn_dec.c | 30 +++++++++++---- crypto/x509/x509_test.cc | 11 +++++- include/openssl/asn1.h | 83 +++++++++++++--------------------------- include/openssl/x509.h | 19 +++++---- 5 files changed, 71 insertions(+), 81 deletions(-) diff --git a/PORTING.md b/PORTING.md index 9adaf738ec..eb951f577f 100644 --- a/PORTING.md +++ b/PORTING.md @@ -170,14 +170,13 @@ OpenSSL's ASN.1 stack uses `d2i` functions for parsing. They have the form: In addition to returning the result, OpenSSL places it in `*out` if `out` is not `NULL`. On input, if `*out` is not `NULL`, OpenSSL will usually (but not always) reuse that object rather than allocating a new one. In BoringSSL, these -functions are compatibility wrappers over a newer ASN.1 stack. Even if `*out` -is not `NULL`, these wrappers will always allocate a new object and free the -previous one. +functions will always allocate a new object and free the previous one. Ensure that callers do not rely on this object reuse behavior. It is recommended to avoid the `out` parameter completely and always pass in `NULL`. -Note that less error-prone APIs are available for BoringSSL-specific code (see -below). +In most cases, even in OpenSSL, relying on object reuse is not safe because, on +parse error, OpenSSL will free the reused object. Note that less error-prone +APIs are available for BoringSSL-specific code (see below). ### Memory allocation diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index bdde8e3684..39329b6879 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -61,6 +61,7 @@ #include #include +#include #include #include @@ -144,20 +145,35 @@ unsigned long ASN1_tag2bit(int tag) { ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it) { - ASN1_VALUE *ptmpval = NULL; - if (!pval) { - pval = &ptmpval; + ASN1_VALUE *ret = NULL; + if (asn1_item_ex_d2i(&ret, in, len, it, /*tag=*/-1, /*aclass=*/0, /*opt=*/0, + /*buf=*/NULL, /*depth=*/0) <= 0) { + // Clean up, in case the caller left a partial object. + // + // TODO(davidben): I don't think it can leave one, but the codepaths below + // are a bit inconsistent. Revisit this when rewriting this function. + ASN1_item_ex_free(&ret, it); } - if (asn1_item_ex_d2i(pval, in, len, it, /*tag=*/-1, /*aclass=*/0, /*opt=*/0, - /*buf=*/NULL, /*depth=*/0) > 0) { - return *pval; + // If the caller supplied an output pointer, free the old one and replace it + // with |ret|. This differs from OpenSSL slightly in that we don't support + // object reuse. We run this on both success and failure. On failure, even + // with object reuse, OpenSSL destroys the previous object. + if (pval != NULL) { + ASN1_item_ex_free(pval, it); + *pval = ret; } - return NULL; + return ret; } // Decode an item, taking care of IMPLICIT tagging, if any. If 'opt' set and // tag mismatch return -1 to handle OPTIONAL +// +// TODO(davidben): Historically, all functions in this file had to account for +// |*pval| containing an arbitrary existing value. This is no longer the case +// because |ASN1_item_d2i| now always starts from NULL. As part of rewriting +// this function, take the simplified assumptions into account. Though we must +// still account for the internal calls to |ASN1_item_ex_new|. static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, int aclass, diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 178e5f8d57..0e681aa120 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -2385,9 +2385,16 @@ TEST(X509Test, TestFromBufferReused) { CRYPTO_BUFFER_data(buf.get()), CRYPTO_BUFFER_len(buf.get()))); - X509 *x509p = root.get(); + // Historically, this function tested the interaction betweeen + // |X509_parse_from_buffer| and object reuse. We no longer support object + // reuse, so |d2i_X509| will replace |raw| with a new object. However, we + // retain this test to verify that releasing objects from |d2i_X509| works + // correctly. + X509 *raw = root.release(); const uint8_t *inp = data2.get(); - X509 *ret = d2i_X509(&x509p, &inp, data2_len); + X509 *ret = d2i_X509(&raw, &inp, data2_len); + root.reset(raw); + ASSERT_EQ(root.get(), ret); ASSERT_EQ(nullptr, root->cert_info->enc.buf); EXPECT_FALSE(buffers_alias(root->cert_info->enc.enc, root->cert_info->enc.len, diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 0370a3e63f..6c7c1a8a81 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -213,38 +213,10 @@ OPENSSL_EXPORT const char *ASN1_tag2str(int tag); // // Note: If |out| and |*out| are both non-NULL, the object at |*out| is not // updated in-place. Instead, it is freed, and the pointer is updated to the -// new object. This differs from OpenSSL, which behaves more like -// |d2i_SAMPLE_with_reuse|. Callers are recommended to set |out| to NULL and -// instead use the return value. +// new object. This differs from OpenSSL. Callers are recommended to set |out| +// to NULL and instead use the return value. SAMPLE *d2i_SAMPLE(SAMPLE **out, const uint8_t **inp, long len); -// d2i_SAMPLE_with_reuse parses a structure from up to |len| bytes at |*inp|. On -// success, it advances |*inp| by the number of bytes read and returns a -// non-NULL pointer to an object containing the parsed structure. The object is -// determined from |out| as follows: -// -// If |out| is NULL, the function places the result in a newly-allocated -// |SAMPLE| object and returns it. This mode is recommended. -// -// If |out| is non-NULL, but |*out| is NULL, the function also places the result -// in a newly-allocated |SAMPLE| object. It sets |*out| to this object and also -// returns it. -// -// If |out| and |*out| are both non-NULL, the function updates the object at -// |*out| in-place with the result and returns |*out|. -// -// If any of the above fail, the function returns NULL. -// -// This function does not reject trailing data in the input. This allows the -// caller to parse a sequence of concatenated structures. Callers parsing only -// one structure should check for trailing data by comparing the updated |*inp| -// with the end of the input. -// -// WARNING: Callers should not rely on the in-place update mode. It often -// produces the wrong result or breaks the type's internal invariants. Future -// revisions of BoringSSL may standardize on the |d2i_SAMPLE| behavior. -SAMPLE *d2i_SAMPLE_with_reuse(SAMPLE **out, const uint8_t **inp, long len); - // i2d_SAMPLE marshals |in|. On error, it returns a negative value. On success, // it returns the length of the result and outputs it via |outp| as follows: // @@ -348,8 +320,8 @@ OPENSSL_EXPORT ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); OPENSSL_EXPORT void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); // ASN1_item_d2i parses the ASN.1 type |it| from up to |len| bytes at |*inp|. -// It behaves like |d2i_SAMPLE_with_reuse|, except that |out| and the return -// value are cast to |ASN1_VALUE| pointers. +// It behaves like |d2i_SAMPLE|, except that |out| and the return value are cast +// to |ASN1_VALUE| pointers. // // TODO(https://crbug.com/boringssl/444): C strict aliasing forbids type-punning // |T*| and |ASN1_VALUE*| the way this function signature does. When that bug is @@ -654,7 +626,7 @@ OPENSSL_EXPORT void ASN1_VISIBLESTRING_free(ASN1_VISIBLESTRING *str); // The following functions parse up to |len| bytes from |*inp| as a // DER-encoded ASN.1 value of the corresponding type, as described in -// |d2i_SAMPLE_with_reuse|. +// |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -846,7 +818,7 @@ OPENSSL_EXPORT ASN1_STRING *DIRECTORYSTRING_new(void); OPENSSL_EXPORT void DIRECTORYSTRING_free(ASN1_STRING *str); // d2i_DIRECTORYSTRING parses up to |len| bytes from |*inp| as a DER-encoded -// X.509 DirectoryString (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// X.509 DirectoryString (RFC 5280), as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -879,7 +851,7 @@ OPENSSL_EXPORT ASN1_STRING *DISPLAYTEXT_new(void); OPENSSL_EXPORT void DISPLAYTEXT_free(ASN1_STRING *str); // d2i_DISPLAYTEXT parses up to |len| bytes from |*inp| as a DER-encoded X.509 -// DisplayText (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// DisplayText (RFC 5280), as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -940,7 +912,7 @@ OPENSSL_EXPORT ASN1_BIT_STRING *ASN1_BIT_STRING_new(void); OPENSSL_EXPORT void ASN1_BIT_STRING_free(ASN1_BIT_STRING *str); // d2i_ASN1_BIT_STRING parses up to |len| bytes from |*inp| as a DER-encoded -// ASN.1 BIT STRING, as described in |d2i_SAMPLE_with_reuse|. +// ASN.1 BIT STRING, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -955,8 +927,7 @@ OPENSSL_EXPORT int i2d_ASN1_BIT_STRING(const ASN1_BIT_STRING *in, // c2i_ASN1_BIT_STRING decodes |len| bytes from |*inp| as the contents of a // DER-encoded BIT STRING, excluding the tag and length. It behaves like -// |d2i_SAMPLE_with_reuse| except, on success, it always consumes all |len| -// bytes. +// |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1051,7 +1022,7 @@ OPENSSL_EXPORT void ASN1_INTEGER_free(ASN1_INTEGER *str); OPENSSL_EXPORT ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); // d2i_ASN1_INTEGER parses up to |len| bytes from |*inp| as a DER-encoded -// ASN.1 INTEGER, as described in |d2i_SAMPLE_with_reuse|. +// ASN.1 INTEGER, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1064,8 +1035,7 @@ OPENSSL_EXPORT int i2d_ASN1_INTEGER(const ASN1_INTEGER *in, uint8_t **outp); // c2i_ASN1_INTEGER decodes |len| bytes from |*inp| as the contents of a // DER-encoded INTEGER, excluding the tag and length. It behaves like -// |d2i_SAMPLE_with_reuse| except, on success, it always consumes all |len| -// bytes. +// |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // some invalid inputs, but this will be removed in the future. @@ -1136,7 +1106,7 @@ OPENSSL_EXPORT ASN1_ENUMERATED *ASN1_ENUMERATED_new(void); OPENSSL_EXPORT void ASN1_ENUMERATED_free(ASN1_ENUMERATED *str); // d2i_ASN1_ENUMERATED parses up to |len| bytes from |*inp| as a DER-encoded -// ASN.1 ENUMERATED, as described in |d2i_SAMPLE_with_reuse|. +// ASN.1 ENUMERATED, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1214,7 +1184,7 @@ OPENSSL_EXPORT ASN1_UTCTIME *ASN1_UTCTIME_new(void); OPENSSL_EXPORT void ASN1_UTCTIME_free(ASN1_UTCTIME *str); // d2i_ASN1_UTCTIME parses up to |len| bytes from |*inp| as a DER-encoded -// ASN.1 UTCTime, as described in |d2i_SAMPLE_with_reuse|. +// ASN.1 UTCTime, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1268,7 +1238,7 @@ OPENSSL_EXPORT ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_new(void); OPENSSL_EXPORT void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *str); // d2i_ASN1_GENERALIZEDTIME parses up to |len| bytes from |*inp| as a -// DER-encoded ASN.1 GeneralizedTime, as described in |d2i_SAMPLE_with_reuse|. +// DER-encoded ASN.1 GeneralizedTime, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1326,7 +1296,7 @@ OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_new(void); OPENSSL_EXPORT void ASN1_TIME_free(ASN1_TIME *str); // d2i_ASN1_TIME parses up to |len| bytes from |*inp| as a DER-encoded X.509 -// Time (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// Time (RFC 5280), as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1464,7 +1434,7 @@ OPENSSL_EXPORT ASN1_OBJECT *ASN1_OBJECT_create(int nid, const uint8_t *data, OPENSSL_EXPORT void ASN1_OBJECT_free(ASN1_OBJECT *a); // d2i_ASN1_OBJECT parses a DER-encoded ASN.1 OBJECT IDENTIFIER from up to |len| -// bytes at |*inp|, as described in |d2i_SAMPLE_with_reuse|. +// bytes at |*inp|, as described in |d2i_SAMPLE|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1477,8 +1447,7 @@ OPENSSL_EXPORT int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, uint8_t **outp); // c2i_ASN1_OBJECT decodes |len| bytes from |*inp| as the contents of a // DER-encoded OBJECT IDENTIFIER, excluding the tag and length. It behaves like -// |d2i_SAMPLE_with_reuse| except, on success, it always consumes all |len| -// bytes. +// |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. OPENSSL_EXPORT ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **out, const uint8_t **inp, long len); @@ -1568,10 +1537,10 @@ OPENSSL_EXPORT ASN1_TYPE *ASN1_TYPE_new(void); OPENSSL_EXPORT void ASN1_TYPE_free(ASN1_TYPE *a); // d2i_ASN1_TYPE parses up to |len| bytes from |*inp| as an ASN.1 value of any -// type, as described in |d2i_SAMPLE_with_reuse|. Note this function only -// validates primitive, universal types supported by this library. Values of -// type |V_ASN1_SEQUENCE|, |V_ASN1_SET|, |V_ASN1_OTHER|, or an unsupported -// primitive type must be validated by the caller when interpreting. +// type, as described in |d2i_SAMPLE|. Note this function only validates +// primitive, universal types supported by this library. Values of type +// |V_ASN1_SEQUENCE|, |V_ASN1_SET|, |V_ASN1_OTHER|, or an unsupported primitive +// type must be validated by the caller when interpreting. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1615,9 +1584,9 @@ OPENSSL_EXPORT int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; // d2i_ASN1_SEQUENCE_ANY parses up to |len| bytes from |*inp| as a DER-encoded -// ASN.1 SEQUENCE OF ANY structure, as described in |d2i_SAMPLE_with_reuse|. The -// resulting |ASN1_SEQUENCE_ANY| owns its contents and thus must be released -// with |sk_ASN1_TYPE_pop_free| and |ASN1_TYPE_free|, not |sk_ASN1_TYPE_free|. +// ASN.1 SEQUENCE OF ANY structure, as described in |d2i_SAMPLE|. The resulting +// |ASN1_SEQUENCE_ANY| owns its contents and thus must be released with +// |sk_ASN1_TYPE_pop_free| and |ASN1_TYPE_free|, not |sk_ASN1_TYPE_free|. // // TODO(https://crbug.com/boringssl/354): This function currently also accepts // BER, but this will be removed in the future. @@ -1631,7 +1600,7 @@ OPENSSL_EXPORT int i2d_ASN1_SEQUENCE_ANY(const ASN1_SEQUENCE_ANY *in, uint8_t **outp); // d2i_ASN1_SET_ANY parses up to |len| bytes from |*inp| as a DER-encoded ASN.1 -// SET OF ANY structure, as described in |d2i_SAMPLE_with_reuse|. The resulting +// SET OF ANY structure, as described in |d2i_SAMPLE|. The resulting // |ASN1_SEQUENCE_ANY| owns its contents and thus must be released with // |sk_ASN1_TYPE_pop_free| and |ASN1_TYPE_free|, not |sk_ASN1_TYPE_free|. // @@ -1943,7 +1912,7 @@ OPENSSL_EXPORT void ASN1_PRINTABLE_free(ASN1_STRING *str); // d2i_ASN1_PRINTABLE parses up to |len| bytes from |*inp| as a DER-encoded // CHOICE of an ad-hoc subset of string-like types, as described in -// |d2i_SAMPLE_with_reuse|. +// |d2i_SAMPLE|. // // Do not use this. Despite, the name it has no connection to PrintableString or // printable characters. See https://crbug.com/boringssl/412. diff --git a/include/openssl/x509.h b/include/openssl/x509.h index f38574f62f..32ddceeb79 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -146,7 +146,7 @@ OPENSSL_EXPORT X509 *X509_dup(X509 *x509); OPENSSL_EXPORT void X509_free(X509 *x509); // d2i_X509 parses up to |len| bytes from |*inp| as a DER-encoded X.509 -// Certificate (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// Certificate (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509 *d2i_X509(X509 **out, const uint8_t **inp, long len); // X509_parse_from_buffer parses an X.509 structure from |buf| and returns a @@ -398,8 +398,7 @@ OPENSSL_EXPORT int i2d_X509_AUX(X509 *x509, unsigned char **outp); // d2i_X509_AUX parses up to |length| bytes from |*inp| as a DER-encoded X.509 // Certificate (RFC 5280), followed optionally by a separate, OpenSSL-specific -// structure with auxiliary properties. It behaves as described in -// |d2i_SAMPLE_with_reuse|. +// structure with auxiliary properties. It behaves as described in |d2i_SAMPLE|. // // Some auxiliary properties affect trust decisions, so this function should not // be used with untrusted input. @@ -485,7 +484,7 @@ OPENSSL_EXPORT X509_CRL *X509_CRL_dup(X509_CRL *crl); OPENSSL_EXPORT void X509_CRL_free(X509_CRL *crl); // d2i_X509_CRL parses up to |len| bytes from |*inp| as a DER-encoded X.509 -// CertificateList (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// CertificateList (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_CRL *d2i_X509_CRL(X509_CRL **out, const uint8_t **inp, long len); @@ -699,7 +698,7 @@ OPENSSL_EXPORT X509_REQ *X509_REQ_dup(X509_REQ *req); OPENSSL_EXPORT void X509_REQ_free(X509_REQ *req); // d2i_X509_REQ parses up to |len| bytes from |*inp| as a DER-encoded -// CertificateRequest (RFC 2986), as described in |d2i_SAMPLE_with_reuse|. +// CertificateRequest (RFC 2986), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp, long len); @@ -850,7 +849,7 @@ OPENSSL_EXPORT X509_NAME *X509_NAME_new(void); OPENSSL_EXPORT void X509_NAME_free(X509_NAME *name); // d2i_X509_NAME parses up to |len| bytes from |*inp| as a DER-encoded X.509 -// Name (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// Name (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_NAME *d2i_X509_NAME(X509_NAME **out, const uint8_t **inp, long len); @@ -970,7 +969,7 @@ OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_new(void); OPENSSL_EXPORT void X509_NAME_ENTRY_free(X509_NAME_ENTRY *entry); // d2i_X509_NAME_ENTRY parses up to |len| bytes from |*inp| as a DER-encoded -// AttributeTypeAndValue (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// AttributeTypeAndValue (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_NAME_ENTRY *d2i_X509_NAME_ENTRY(X509_NAME_ENTRY **out, const uint8_t **inp, long len); @@ -1073,7 +1072,7 @@ OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_new(void); OPENSSL_EXPORT void X509_EXTENSION_free(X509_EXTENSION *ex); // d2i_X509_EXTENSION parses up to |len| bytes from |*inp| as a DER-encoded -// X.509 Extension (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// X.509 Extension (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **out, const uint8_t **inp, long len); @@ -1149,7 +1148,7 @@ typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; DECLARE_ASN1_ITEM(X509_EXTENSIONS) // d2i_X509_EXTENSIONS parses up to |len| bytes from |*inp| as a DER-encoded -// SEQUENCE OF Extension (RFC 5280), as described in |d2i_SAMPLE_with_reuse|. +// SEQUENCE OF Extension (RFC 5280), as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_EXTENSIONS *d2i_X509_EXTENSIONS(X509_EXTENSIONS **out, const uint8_t **inp, long len); @@ -1235,7 +1234,7 @@ OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_dup(const X509_ALGOR *alg); OPENSSL_EXPORT void X509_ALGOR_free(X509_ALGOR *alg); // d2i_X509_ALGOR parses up to |len| bytes from |*inp| as a DER-encoded -// AlgorithmIdentifier, as described in |d2i_SAMPLE_with_reuse|. +// AlgorithmIdentifier, as described in |d2i_SAMPLE|. OPENSSL_EXPORT X509_ALGOR *d2i_X509_ALGOR(X509_ALGOR **out, const uint8_t **inp, long len); From 6e20b77e6b79069e2468686bdc69169d3fa2252e Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Wed, 8 Feb 2023 11:32:19 -0700 Subject: [PATCH 067/177] Get rid of time_t usage internally, change to int64_t We still keep time_t stuff around for calling time() and for external interfaces that are meant to give you time_t values, but we stop using time_t internally. For publicly exposed and used inputs that rely on time_t, _posix versions are added to support providing times as an int64_t, and internal use is changed to use the _posix version. Several legacy functions which are extensivly used and and use pointers to time_t are retained for compatibility, along with posix time versions of them which we use exclusively. This fixes the tests which were disabled on 32 bit platorms to always run. Update-Note: This is a potentially breaking change for things that bind to the ASN1_[UTC|GENERALIZED]TIME_set and ASN1_TIME_adj family of functions (and can not type convert a time_t to an int64). Bug: 416 Change-Id: Ic4daba5a299d8f35191853742640750a1ecc53d6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/54765 Commit-Queue: Bob Beck Reviewed-by: David Benjamin --- crypto/asn1/a_gentm.c | 9 ++-- crypto/asn1/a_time.c | 28 ++++++------ crypto/asn1/a_utctm.c | 11 ++--- crypto/asn1/asn1_test.cc | 66 +++++++++++++-------------- crypto/x509/internal.h | 2 +- crypto/x509/x509_test.cc | 28 ++++++------ crypto/x509/x509_time_test.cc | 84 +++++++++++++++++++++++++++++++++-- crypto/x509/x509_vfy.c | 45 ++++++++++++------- crypto/x509/x509_vpm.c | 6 ++- include/openssl/asn1.h | 63 +++++++++++++++----------- include/openssl/x509.h | 13 ++++++ 11 files changed, 235 insertions(+), 120 deletions(-) diff --git a/crypto/asn1/a_gentm.c b/crypto/asn1/a_gentm.c index 096e912b99..ff1f97cbba 100644 --- a/crypto/asn1/a_gentm.c +++ b/crypto/asn1/a_gentm.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -98,15 +99,15 @@ int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) { } ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, - time_t t) { - return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0); + int64_t posix_time) { + return ASN1_GENERALIZEDTIME_adj(s, posix_time, 0, 0); } ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, - time_t t, int offset_day, + int64_t posix_time, int offset_day, long offset_sec) { struct tm data; - if (!OPENSSL_gmtime(&t, &data)) { + if (!OPENSSL_posix_to_tm(posix_time, &data)) { return NULL; } diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c index 643584bca5..87bf092138 100644 --- a/crypto/asn1/a_time.c +++ b/crypto/asn1/a_time.c @@ -74,29 +74,31 @@ IMPLEMENT_ASN1_MSTRING(ASN1_TIME, B_ASN1_TIME) IMPLEMENT_ASN1_FUNCTIONS_const(ASN1_TIME) -ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t) { - return ASN1_TIME_adj(s, t, 0, 0); +ASN1_TIME *ASN1_TIME_set_posix(ASN1_TIME *s, int64_t posix_time) { + return ASN1_TIME_adj(s, posix_time, 0, 0); } -ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day, +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t time) { + return ASN1_TIME_adj(s, time, 0, 0); +} + +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, int64_t posix_time, int offset_day, long offset_sec) { - struct tm *ts; - struct tm data; + struct tm tm; - ts = OPENSSL_gmtime(&t, &data); - if (ts == NULL) { + if (!OPENSSL_posix_to_tm(posix_time, &tm)) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ERROR_GETTING_TIME); return NULL; } if (offset_day || offset_sec) { - if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec)) { + if (!OPENSSL_gmtime_adj(&tm, offset_day, offset_sec)) { return NULL; } } - if ((ts->tm_year >= 50) && (ts->tm_year < 150)) { - return ASN1_UTCTIME_adj(s, t, offset_day, offset_sec); + if ((tm.tm_year >= 50) && (tm.tm_year < 150)) { + return ASN1_UTCTIME_adj(s, posix_time, offset_day, offset_sec); } - return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec); + return ASN1_GENERALIZEDTIME_adj(s, posix_time, offset_day, offset_sec); } int ASN1_TIME_check(const ASN1_TIME *t) { @@ -172,9 +174,7 @@ int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) { static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *t, int allow_timezone_offset) { if (t == NULL) { - time_t now_t; - time(&now_t); - if (OPENSSL_gmtime(&now_t, tm)) { + if (OPENSSL_posix_to_tm(time(NULL), tm)) { return 1; } return 0; diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c index d8d26ff6c8..45c4081ec5 100644 --- a/crypto/asn1/a_utctm.c +++ b/crypto/asn1/a_utctm.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -98,14 +99,14 @@ int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) { return 1; } -ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t) { - return ASN1_UTCTIME_adj(s, t, 0, 0); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, int64_t posix_time) { + return ASN1_UTCTIME_adj(s, posix_time, 0, 0); } -ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, int64_t posix_time, int offset_day, long offset_sec) { struct tm data; - if (!OPENSSL_gmtime(&t, &data)) { + if (!OPENSSL_posix_to_tm(posix_time, &data)) { return NULL; } @@ -151,7 +152,7 @@ int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) { return -2; } - if (!OPENSSL_gmtime(&t, &ttm)) { + if (!OPENSSL_posix_to_tm(t, &ttm)) { return -2; } diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 3bb7b3484c..47d235640e 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -922,7 +922,7 @@ static std::string ASN1StringToStdString(const ASN1_STRING *str) { ASN1_STRING_get0_data(str) + ASN1_STRING_length(str)); } -static bool ASN1Time_check_time_t(const ASN1_TIME *s, time_t t) { +static bool ASN1Time_check_posix(const ASN1_TIME *s, int64_t t) { struct tm stm, ttm; int day, sec; @@ -940,7 +940,7 @@ static bool ASN1Time_check_time_t(const ASN1_TIME *s, time_t t) { default: return false; } - if (!OPENSSL_gmtime(&t, &ttm) || + if (!OPENSSL_posix_to_tm(t, &ttm) || !OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm)) { return false; } @@ -964,37 +964,35 @@ static std::string PrintStringToBIO(const ASN1_STRING *str, TEST(ASN1Test, SetTime) { static const struct { - time_t time; + int64_t time; const char *generalized; const char *utc; const char *printed; } kTests[] = { - {-631152001, "19491231235959Z", nullptr, "Dec 31 23:59:59 1949 GMT"}, - {-631152000, "19500101000000Z", "500101000000Z", - "Jan 1 00:00:00 1950 GMT"}, - {0, "19700101000000Z", "700101000000Z", "Jan 1 00:00:00 1970 GMT"}, - {981173106, "20010203040506Z", "010203040506Z", "Feb 3 04:05:06 2001 GMT"}, - {951804000, "20000229060000Z", "000229060000Z", "Feb 29 06:00:00 2000 GMT"}, - // NASA says this is the correct time for posterity. - {-16751025, "19690621025615Z", "690621025615Z", "Jun 21 02:56:15 1969 GMT"}, - // -1 is sometimes used as an error value. Ensure we correctly handle it. - {-1, "19691231235959Z", "691231235959Z", "Dec 31 23:59:59 1969 GMT"}, -#if defined(OPENSSL_64_BIT) - // TODO(https://crbug.com/boringssl/416): These cases overflow 32-bit - // |time_t| and do not consistently work on 32-bit platforms. For now, - // disable the tests on 32-bit. Re-enable them once the bug is fixed. - {2524607999, "20491231235959Z", "491231235959Z", - "Dec 31 23:59:59 2049 GMT"}, - {2524608000, "20500101000000Z", nullptr, "Jan 1 00:00:00 2050 GMT"}, - // Test boundary conditions. - {-62167219200, "00000101000000Z", nullptr, "Jan 1 00:00:00 0 GMT"}, - {-62167219201, nullptr, nullptr, nullptr}, - {253402300799, "99991231235959Z", nullptr, "Dec 31 23:59:59 9999 GMT"}, - {253402300800, nullptr, nullptr, nullptr}, -#endif + {-631152001, "19491231235959Z", nullptr, "Dec 31 23:59:59 1949 GMT"}, + {-631152000, "19500101000000Z", "500101000000Z", + "Jan 1 00:00:00 1950 GMT"}, + {0, "19700101000000Z", "700101000000Z", "Jan 1 00:00:00 1970 GMT"}, + {981173106, "20010203040506Z", "010203040506Z", + "Feb 3 04:05:06 2001 GMT"}, + {951804000, "20000229060000Z", "000229060000Z", + "Feb 29 06:00:00 2000 GMT"}, + // NASA says this is the correct time for posterity. + {-16751025, "19690621025615Z", "690621025615Z", + "Jun 21 02:56:15 1969 GMT"}, + // -1 is sometimes used as an error value. Ensure we correctly handle it. + {-1, "19691231235959Z", "691231235959Z", "Dec 31 23:59:59 1969 GMT"}, + {2524607999, "20491231235959Z", "491231235959Z", + "Dec 31 23:59:59 2049 GMT"}, + {2524608000, "20500101000000Z", nullptr, "Jan 1 00:00:00 2050 GMT"}, + // Test boundary conditions. + {-62167219200, "00000101000000Z", nullptr, "Jan 1 00:00:00 0 GMT"}, + {-62167219201, nullptr, nullptr, nullptr}, + {253402300799, "99991231235959Z", nullptr, "Dec 31 23:59:59 9999 GMT"}, + {253402300800, nullptr, nullptr, nullptr}, }; for (const auto &t : kTests) { - time_t tt; + int64_t tt; SCOPED_TRACE(t.time); bssl::UniquePtr utc(ASN1_UTCTIME_set(nullptr, t.time)); @@ -1002,8 +1000,8 @@ TEST(ASN1Test, SetTime) { ASSERT_TRUE(utc); EXPECT_EQ(V_ASN1_UTCTIME, ASN1_STRING_type(utc.get())); EXPECT_EQ(t.utc, ASN1StringToStdString(utc.get())); - EXPECT_TRUE(ASN1Time_check_time_t(utc.get(), t.time)); - EXPECT_EQ(ASN1_TIME_to_time_t(utc.get(), &tt), 1); + EXPECT_TRUE(ASN1Time_check_posix(utc.get(), t.time)); + EXPECT_EQ(ASN1_TIME_to_posix(utc.get(), &tt), 1); EXPECT_EQ(tt, t.time); EXPECT_EQ(PrintStringToBIO(utc.get(), &ASN1_UTCTIME_print), t.printed); EXPECT_EQ(PrintStringToBIO(utc.get(), &ASN1_TIME_print), t.printed); @@ -1017,8 +1015,8 @@ TEST(ASN1Test, SetTime) { ASSERT_TRUE(generalized); EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(generalized.get())); EXPECT_EQ(t.generalized, ASN1StringToStdString(generalized.get())); - EXPECT_TRUE(ASN1Time_check_time_t(generalized.get(), t.time)); - EXPECT_EQ(ASN1_TIME_to_time_t(generalized.get(), &tt), 1); + EXPECT_TRUE(ASN1Time_check_posix(generalized.get(), t.time)); + EXPECT_EQ(ASN1_TIME_to_posix(generalized.get(), &tt), 1); EXPECT_EQ(tt, t.time); EXPECT_EQ( PrintStringToBIO(generalized.get(), &ASN1_GENERALIZEDTIME_print), @@ -1029,7 +1027,7 @@ TEST(ASN1Test, SetTime) { EXPECT_FALSE(generalized); } - bssl::UniquePtr choice(ASN1_TIME_set(nullptr, t.time)); + bssl::UniquePtr choice(ASN1_TIME_set_posix(nullptr, t.time)); if (t.generalized) { ASSERT_TRUE(choice); if (t.utc) { @@ -1039,8 +1037,8 @@ TEST(ASN1Test, SetTime) { EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(choice.get())); EXPECT_EQ(t.generalized, ASN1StringToStdString(choice.get())); } - EXPECT_TRUE(ASN1Time_check_time_t(choice.get(), t.time)); - EXPECT_EQ(ASN1_TIME_to_time_t(choice.get(), &tt), 1); + EXPECT_TRUE(ASN1Time_check_posix(choice.get(), t.time)); + EXPECT_EQ(ASN1_TIME_to_posix(choice.get(), &tt), 1); EXPECT_EQ(tt, t.time); } else { EXPECT_FALSE(choice); diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h index 6c594ecd4c..407dcd7b3e 100644 --- a/crypto/x509/internal.h +++ b/crypto/x509/internal.h @@ -228,7 +228,7 @@ struct X509_crl_st { struct X509_VERIFY_PARAM_st { char *name; - time_t check_time; // Time to use + int64_t check_time; // POSIX time to use unsigned long inh_flags; // Inheritance flags unsigned long flags; // Various verify flags int purpose; // purpose to check untrusted certificates diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 0e681aa120..96c80b37ae 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -1099,7 +1099,7 @@ static bssl::UniquePtr CRLsToStack( return stack; } -static const time_t kReferenceTime = 1474934400 /* Sep 27th, 2016 */; +static const int64_t kReferenceTime = 1474934400 /* Sep 27th, 2016 */; static int Verify( X509 *leaf, const std::vector &roots, @@ -1133,7 +1133,7 @@ static int Verify( X509_STORE_CTX_set0_crls(ctx.get(), crls_stack.get()); X509_VERIFY_PARAM *param = X509_STORE_CTX_get0_param(ctx.get()); - X509_VERIFY_PARAM_set_time(param, kReferenceTime); + X509_VERIFY_PARAM_set_time_posix(param, kReferenceTime); if (configure_callback) { configure_callback(param); } @@ -1484,7 +1484,7 @@ TEST(X509Test, TestCRL) { EXPECT_EQ(X509_V_ERR_CRL_HAS_EXPIRED, Verify(leaf.get(), {root.get()}, {root.get()}, {basic_crl.get()}, X509_V_FLAG_CRL_CHECK, [](X509_VERIFY_PARAM *param) { - X509_VERIFY_PARAM_set_time( + X509_VERIFY_PARAM_set_time_posix( param, kReferenceTime + 2 * 30 * 24 * 3600); })); @@ -1493,7 +1493,7 @@ TEST(X509Test, TestCRL) { Verify(leaf.get(), {root.get()}, {root.get()}, {basic_crl.get()}, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_NO_CHECK_TIME, [](X509_VERIFY_PARAM *param) { - X509_VERIFY_PARAM_set_time( + X509_VERIFY_PARAM_set_time_posix( param, kReferenceTime + 2 * 30 * 24 * 3600); })); @@ -2096,7 +2096,7 @@ TEST(X509Test, SignCRL) { ASSERT_TRUE(X509_CRL_set_version(crl.get(), X509_CRL_VERSION_2)); bssl::UniquePtr last_update(ASN1_TIME_new()); ASSERT_TRUE(last_update); - ASSERT_TRUE(ASN1_TIME_set(last_update.get(), kReferenceTime)); + ASSERT_TRUE(ASN1_TIME_set_posix(last_update.get(), kReferenceTime)); ASSERT_TRUE(X509_CRL_set1_lastUpdate(crl.get(), last_update.get())); bssl::UniquePtr issuer(X509_NAME_new()); ASSERT_TRUE(issuer); @@ -3979,13 +3979,13 @@ TEST(X509Test, Expiry) { // The following are measured in seconds relative to kReferenceTime. The // validity periods are staggered so we can independently test both leaf and // root time checks. - const time_t kSecondsInDay = 24 * 3600; - const time_t kRootStart = -30 * kSecondsInDay; - const time_t kIntermediateStart = -20 * kSecondsInDay; - const time_t kLeafStart = -10 * kSecondsInDay; - const time_t kIntermediateEnd = 10 * kSecondsInDay; - const time_t kLeafEnd = 20 * kSecondsInDay; - const time_t kRootEnd = 30 * kSecondsInDay; + const int64_t kSecondsInDay = 24 * 3600; + const int64_t kRootStart = -30 * kSecondsInDay; + const int64_t kIntermediateStart = -20 * kSecondsInDay; + const int64_t kLeafStart = -10 * kSecondsInDay; + const int64_t kIntermediateEnd = 10 * kSecondsInDay; + const int64_t kLeafEnd = 20 * kSecondsInDay; + const int64_t kRootEnd = 30 * kSecondsInDay; bssl::UniquePtr root = MakeTestCert("Root", "Root", key.get(), /*is_ca=*/true); @@ -4023,9 +4023,9 @@ TEST(X509Test, Expiry) { ASSERT_TRUE(X509_sign(leaf.get(), key.get(), EVP_sha256())); struct VerifyAt { - time_t time; + int64_t time; void operator()(X509_VERIFY_PARAM *param) const { - X509_VERIFY_PARAM_set_time(param, time); + X509_VERIFY_PARAM_set_time_posix(param, time); } }; diff --git a/crypto/x509/x509_time_test.cc b/crypto/x509/x509_time_test.cc index fcd51c89f0..c0327d28a5 100644 --- a/crypto/x509/x509_time_test.cc +++ b/crypto/x509/x509_time_test.cc @@ -20,7 +20,7 @@ struct TestData { const char *data; int type; - time_t cmp_time; + int64_t cmp_time; // -1 if asn1_time <= cmp_time, 1 if asn1_time > cmp_time, 0 if error. int expected; }; @@ -211,6 +211,85 @@ static TestData kX509CmpTests[] = { 0, 0, }, + // Test limits and unusual cases. + { + "99991231235959Z", V_ASN1_GENERALIZEDTIME, + // Test a very large positive time with the largest representable time + 253402300799, + -1, // TODO(bbe): This is *technically* wrong by rfc5280. + }, + { + "99991231235959Z", V_ASN1_GENERALIZEDTIME, + // one second after the largest possible time should still compare + // correctly + 253402300800, + -1, // TODO(bbe): This is *technically* wrong by rfc5280. + }, + { + "99991231235959Z", + V_ASN1_GENERALIZEDTIME, + // Test one second before the largest time + 253402300798, + 1, + }, + { + "700101000000Z", + V_ASN1_UTCTIME, + // The epoch, which should not fail. a time of 0 must be valid. + 0, + -1, + }, + { + "700101000000Z", + V_ASN1_UTCTIME, + // One second before the epoch should compare correctly. + -1, + 1, + }, + { + "700101000000Z", + V_ASN1_UTCTIME, + // One second after the epoch should compare correctly. + 1, + -1, + }, + { + "690621025615Z", + V_ASN1_UTCTIME, + // Test a negative time, we use a time from NASA, close to but not quite + // at the epoch. + -16751025, + -1, + }, + { + "690621025615Z", + V_ASN1_UTCTIME, + // Test one small second before our negative time. + -16751026, + 1, + }, + { + "690621025615Z", + V_ASN1_UTCTIME, + // Test one giant second after our negative time. + -16751024, + -1, + }, + { + "00000101000000Z", + V_ASN1_GENERALIZEDTIME, + // Test a very large negative time with the earliest representable time + -62167219200, + -1, + }, + { + "00000101000000Z", + V_ASN1_GENERALIZEDTIME, + // Test one second after the earliest time. + -62167219199, + -1, + }, + }; TEST(X509TimeTest, TestCmpTime) { @@ -224,8 +303,7 @@ TEST(X509TimeTest, TestCmpTime) { t.data = (unsigned char*) test.data; t.length = strlen(test.data); - EXPECT_EQ(test.expected, - X509_cmp_time(&t, &test.cmp_time)); + EXPECT_EQ(test.expected, X509_cmp_time_posix(&t, test.cmp_time)); } } diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index 7638d0d814..92882921e5 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -978,14 +978,14 @@ static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) { if (notify) { ctx->current_crl = crl; } - time_t *ptime; + int64_t ptime; if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) { - ptime = &ctx->param->check_time; + ptime = ctx->param->check_time; } else { - ptime = NULL; + ptime = time(NULL); } - int i = X509_cmp_time(X509_CRL_get0_lastUpdate(crl), ptime); + int i = X509_cmp_time_posix(X509_CRL_get0_lastUpdate(crl), ptime); if (i == 0) { if (!notify) { return 0; @@ -1007,7 +1007,7 @@ static int check_crl_time(X509_STORE_CTX *ctx, X509_CRL *crl, int notify) { } if (X509_CRL_get0_nextUpdate(crl)) { - i = X509_cmp_time(X509_CRL_get0_nextUpdate(crl), ptime); + i = X509_cmp_time_posix(X509_CRL_get0_nextUpdate(crl), ptime); if (i == 0) { if (!notify) { @@ -1724,14 +1724,14 @@ static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) { return 1; } - time_t *ptime; + int64_t ptime; if (ctx->param->flags & X509_V_FLAG_USE_CHECK_TIME) { - ptime = &ctx->param->check_time; + ptime = ctx->param->check_time; } else { - ptime = NULL; + ptime = time(NULL); } - int i = X509_cmp_time(X509_get_notBefore(x), ptime); + int i = X509_cmp_time_posix(X509_get_notBefore(x), ptime); if (i == 0) { ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; ctx->current_cert = x; @@ -1748,7 +1748,7 @@ static int check_cert_time(X509_STORE_CTX *ctx, X509 *x) { } } - i = X509_cmp_time(X509_get_notAfter(x), ptime); + i = X509_cmp_time_posix(X509_get_notAfter(x), ptime); if (i == 0) { ctx->error = X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; ctx->current_cert = x; @@ -1851,17 +1851,21 @@ static int internal_verify(X509_STORE_CTX *ctx) { } int X509_cmp_current_time(const ASN1_TIME *ctm) { - return X509_cmp_time(ctm, NULL); + return X509_cmp_time_posix(ctm, time(NULL)); } int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time) { + int64_t compare_time = (cmp_time == NULL) ? time(NULL) : *cmp_time; + return X509_cmp_time_posix(ctm, compare_time); +} + +int X509_cmp_time_posix(const ASN1_TIME *ctm, int64_t cmp_time) { int64_t ctm_time; if (!ASN1_TIME_to_posix(ctm, &ctm_time)) { return 0; } - int64_t compare_time = (cmp_time == NULL) ? time(NULL) : *cmp_time; // The return value 0 is reserved for errors. - return (ctm_time - compare_time <= 0) ? -1 : 1; + return (ctm_time - cmp_time <= 0) ? -1 : 1; } ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec) { @@ -1874,12 +1878,12 @@ ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, time_t *in_tm) { ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, long offset_sec, time_t *in_tm) { - time_t t = 0; + int64_t t = 0; if (in_tm) { t = *in_tm; } else { - time(&t); + t = time(NULL); } return ASN1_TIME_adj(s, t, offset_day, offset_sec); @@ -2307,12 +2311,19 @@ void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags) { X509_VERIFY_PARAM_set_flags(ctx->param, flags); } +void X509_STORE_CTX_set_time_posix(X509_STORE_CTX *ctx, unsigned long flags, + int64_t t) { + X509_VERIFY_PARAM_set_time_posix(ctx->param, t); +} + void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t) { - X509_VERIFY_PARAM_set_time(ctx->param, t); + X509_STORE_CTX_set_time_posix(ctx, flags, t); } -X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx) { return ctx->cert; } +X509 *X509_STORE_CTX_get0_cert(X509_STORE_CTX *ctx) { + return ctx->cert; +} void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, int (*verify_cb)(int, X509_STORE_CTX *)) { diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index 8ea2c6a672..d985cb742e 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -378,11 +378,15 @@ void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth) { param->depth = depth; } -void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t) { +void X509_VERIFY_PARAM_set_time_posix(X509_VERIFY_PARAM *param, int64_t t) { param->check_time = t; param->flags |= X509_V_FLAG_USE_CHECK_TIME; } +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t) { + X509_VERIFY_PARAM_set_time_posix(param, t); +} + int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy) { if (!param->policies) { diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 6c7c1a8a81..26634a8895 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -1202,20 +1202,23 @@ DECLARE_ASN1_ITEM(ASN1_UTCTIME) // ASN1_UTCTIME_check returns one if |a| is a valid UTCTime and zero otherwise. OPENSSL_EXPORT int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); -// ASN1_UTCTIME_set represents |t| as a UTCTime and writes the result to |s|. It -// returns |s| on success and NULL on error. If |s| is NULL, it returns a -// newly-allocated |ASN1_UTCTIME| instead. +// ASN1_UTCTIME_set represents |posix_time| as a UTCTime and writes the result +// to |s|. It returns |s| on success and NULL on error. If |s| is NULL, it +// returns a newly-allocated |ASN1_UTCTIME| instead. // // Note this function may fail if the time is out of range for UTCTime. -OPENSSL_EXPORT ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +OPENSSL_EXPORT ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, + int64_t posix_time); -// ASN1_UTCTIME_adj adds |offset_day| days and |offset_sec| seconds to |t| and -// writes the result to |s| as a UTCTime. It returns |s| on success and NULL on -// error. If |s| is NULL, it returns a newly-allocated |ASN1_UTCTIME| instead. +// ASN1_UTCTIME_adj adds |offset_day| days and |offset_sec| seconds to +// |posix_time| and writes the result to |s| as a UTCTime. It returns |s| on +// success and NULL on error. If |s| is NULL, it returns a newly-allocated +// |ASN1_UTCTIME| instead. // // Note this function may fail if the time overflows or is out of range for // UTCTime. -OPENSSL_EXPORT ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, +OPENSSL_EXPORT ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, + int64_t posix_time, int offset_day, long offset_sec); // ASN1_UTCTIME_set_string sets |s| to a UTCTime whose contents are a copy of @@ -1258,23 +1261,24 @@ DECLARE_ASN1_ITEM(ASN1_GENERALIZEDTIME) // zero otherwise. OPENSSL_EXPORT int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); -// ASN1_GENERALIZEDTIME_set represents |t| as a GeneralizedTime and writes the -// result to |s|. It returns |s| on success and NULL on error. If |s| is NULL, -// it returns a newly-allocated |ASN1_GENERALIZEDTIME| instead. +// ASN1_GENERALIZEDTIME_set represents |posix_time| as a GeneralizedTime and +// writes the result to |s|. It returns |s| on success and NULL on error. If |s| +// is NULL, it returns a newly-allocated |ASN1_GENERALIZEDTIME| instead. // // Note this function may fail if the time is out of range for GeneralizedTime. OPENSSL_EXPORT ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set( - ASN1_GENERALIZEDTIME *s, time_t t); + ASN1_GENERALIZEDTIME *s, int64_t posix_time); // ASN1_GENERALIZEDTIME_adj adds |offset_day| days and |offset_sec| seconds to -// |t| and writes the result to |s| as a GeneralizedTime. It returns |s| on -// success and NULL on error. If |s| is NULL, it returns a newly-allocated -// |ASN1_GENERALIZEDTIME| instead. +// |posix_time| and writes the result to |s| as a GeneralizedTime. It returns +// |s| on success and NULL on error. If |s| is NULL, it returns a +// newly-allocated |ASN1_GENERALIZEDTIME| instead. // // Note this function may fail if the time overflows or is out of range for // GeneralizedTime. OPENSSL_EXPORT ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj( - ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, long offset_sec); + ASN1_GENERALIZEDTIME *s, int64_t posix_time, int offset_day, + long offset_sec); // ASN1_GENERALIZEDTIME_set_string sets |s| to a GeneralizedTime whose contents // are a copy of |str|. It returns one on success and zero on error or if |str| @@ -1324,24 +1328,29 @@ DECLARE_ASN1_ITEM(ASN1_TIME) OPENSSL_EXPORT int ASN1_TIME_diff(int *out_days, int *out_seconds, const ASN1_TIME *from, const ASN1_TIME *to); -// ASN1_TIME_set represents |t| as a GeneralizedTime or UTCTime and writes -// the result to |s|. As in RFC 5280, section 4.1.2.5, it uses UTCTime when the -// time fits and GeneralizedTime otherwise. It returns |s| on success and NULL -// on error. If |s| is NULL, it returns a newly-allocated |ASN1_TIME| instead. +// ASN1_TIME_set_posix represents |posix_time| as a GeneralizedTime or UTCTime +// and writes the result to |s|. As in RFC 5280, section 4.1.2.5, it uses +// UTCTime when the time fits and GeneralizedTime otherwise. It returns |s| on +// success and NULL on error. If |s| is NULL, it returns a newly-allocated +// |ASN1_TIME| instead. // // Note this function may fail if the time is out of range for GeneralizedTime. -OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_set_posix(ASN1_TIME *s, int64_t posix_time); + +// ASN1_TIME_set is exactly the same as |ASN1_TIME_set_posix| but with a +// time_t as input for compatibility. +OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t time); // ASN1_TIME_adj adds |offset_day| days and |offset_sec| seconds to -// |t| and writes the result to |s|. As in RFC 5280, section 4.1.2.5, it uses -// UTCTime when the time fits and GeneralizedTime otherwise. It returns |s| on -// success and NULL on error. If |s| is NULL, it returns a newly-allocated -// |ASN1_GENERALIZEDTIME| instead. +// |posix_time| and writes the result to |s|. As in RFC 5280, section 4.1.2.5, +// it uses UTCTime when the time fits and GeneralizedTime otherwise. It returns +// |s| on success and NULL on error. If |s| is NULL, it returns a +// newly-allocated |ASN1_GENERALIZEDTIME| instead. // // Note this function may fail if the time overflows or is out of range for // GeneralizedTime. -OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day, - long offset_sec); +OPENSSL_EXPORT ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, int64_t posix_time, + int offset_day, long offset_sec); // ASN1_TIME_check returns one if |t| is a valid UTCTime or GeneralizedTime, and // zero otherwise. |t|'s type determines which check is performed. This diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 32ddceeb79..179c5707a4 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -1837,6 +1837,14 @@ OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev); // error, not equality. OPENSSL_EXPORT int X509_cmp_time(const ASN1_TIME *s, time_t *t); +// X509_cmp_time_posix compares |s| against |t|. On success, it returns a +// negative number if |s| <= |t| and a positive number if |s| > |t|. On error, +// it returns zero. +// +// WARNING: Unlike most comparison functions, this function returns zero on +// error, not equality. +OPENSSL_EXPORT int X509_cmp_time_posix(const ASN1_TIME *s, int64_t t); + // X509_cmp_current_time behaves like |X509_cmp_time| but compares |s| against // the current time. OPENSSL_EXPORT int X509_cmp_current_time(const ASN1_TIME *s); @@ -2770,6 +2778,9 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); OPENSSL_EXPORT void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, time_t t); +OPENSSL_EXPORT void X509_STORE_CTX_set_time_posix(X509_STORE_CTX *ctx, + unsigned long flags, + int64_t t); OPENSSL_EXPORT void X509_STORE_CTX_set_verify_cb( X509_STORE_CTX *ctx, int (*verify_cb)(int, X509_STORE_CTX *)); @@ -2804,6 +2815,8 @@ OPENSSL_EXPORT void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); OPENSSL_EXPORT void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +OPENSSL_EXPORT void X509_VERIFY_PARAM_set_time_posix(X509_VERIFY_PARAM *param, + int64_t t); OPENSSL_EXPORT int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, ASN1_OBJECT *policy); OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_policies( From 261ec612e21b81a4c16bbda615d0850556483b4f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 16:34:48 -0500 Subject: [PATCH 068/177] Move Go CMake support into its own file. Slowly reduce clutter in the top-level CMake file. Change-Id: Ib7ca2aee7337db82ed1989c56bbaaf6ee5da0768 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56569 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- CMakeLists.txt | 52 +++---------------------------------------------- cmake/go.cmake | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 49 deletions(-) create mode 100644 cmake/go.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d45ae451..9fa818c953 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ if(WIN32) endif() include(sources.cmake) +include(cmake/go.cmake) include(cmake/perlasm.cmake) enable_language(C) @@ -29,17 +30,13 @@ include(GNUInstallDirs) add_custom_target(global_target) if(ANDROID) - # Android-NDK CMake files reconfigure the path and so Go and Perl won't be - # found. However, ninja will still find them in $PATH if we just name them. + # Android-NDK CMake files reconfigure the path and so Perl won't be found. + # However, ninja will still find them in $PATH if we just name them. if(NOT PERL_EXECUTABLE) set(PERL_EXECUTABLE "perl") endif() - if(NOT GO_EXECUTABLE) - set(GO_EXECUTABLE "go") - endif() else() find_package(Perl REQUIRED) - find_program(GO_EXECUTABLE go) endif() if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING) @@ -56,10 +53,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING) endif() endif() -if(NOT GO_EXECUTABLE) - message(FATAL_ERROR "Could not find Go") -endif() - if(USE_CUSTOM_LIBCXX) set(BORINGSSL_ALLOW_CXX_RUNTIME 1) endif() @@ -365,45 +358,6 @@ if(MALLOC_FAILURE_TESTING) add_definitions(-DBORINGSSL_MALLOC_FAILURE_TESTING) endif() -function(go_executable dest package) - set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go") - if(NOT CMAKE_GENERATOR STREQUAL "Ninja") - # The DEPFILE parameter to add_custom_command only works with Ninja. Query - # the sources at configure time. Additionally, everything depends on go.mod. - # That affects what external packages to use. - # - # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting - # 3.21, it works with Visual Studio and Xcode too. - execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake - -pkg ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - OUTPUT_VARIABLE sources - RESULT_VARIABLE godeps_result) - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${sources} ${CMAKE_SOURCE_DIR}/go.mod) - else() - # Ninja expects the target in the depfile to match the output. This is a - # relative path from the build directory. - string(LENGTH "${CMAKE_BINARY_DIR}" root_dir_length) - math(EXPR root_dir_length "${root_dir_length} + 1") - string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}" ${root_dir_length} -1 target) - set(target "${target}/${dest}") - - set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile - -target ${target} -pkg ${package} -out ${depfile} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${godeps} ${CMAKE_SOURCE_DIR}/go.mod - DEPFILE ${depfile}) - endif() -endfunction() - if(OPENSSL_NO_ASM) add_definitions(-DOPENSSL_NO_ASM) endif() diff --git a/cmake/go.cmake b/cmake/go.cmake new file mode 100644 index 0000000000..6aca79a89e --- /dev/null +++ b/cmake/go.cmake @@ -0,0 +1,53 @@ +if(ANDROID) + # Android-NDK CMake files reconfigure the path and so Go won't be found. + # However, ninja will still find them in $PATH if we just name them. + if(NOT GO_EXECUTABLE) + set(GO_EXECUTABLE "go") + endif() +else() + find_program(GO_EXECUTABLE go) +endif() + +if(NOT GO_EXECUTABLE) + message(FATAL_ERROR "Could not find Go") +endif() + +function(go_executable dest package) + set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go") + if(NOT CMAKE_GENERATOR STREQUAL "Ninja") + # The DEPFILE parameter to add_custom_command only works with Ninja. Query + # the sources at configure time. Additionally, everything depends on go.mod. + # That affects what external packages to use. + # + # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting + # 3.21, it works with Visual Studio and Xcode too. + execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake + -pkg ${package} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE sources + RESULT_VARIABLE godeps_result) + add_custom_command(OUTPUT ${dest} + COMMAND ${GO_EXECUTABLE} build + -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${sources} ${CMAKE_SOURCE_DIR}/go.mod) + else() + # Ninja expects the target in the depfile to match the output. This is a + # relative path from the build directory. + string(LENGTH "${CMAKE_BINARY_DIR}" root_dir_length) + math(EXPR root_dir_length "${root_dir_length} + 1") + string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}" ${root_dir_length} -1 target) + set(target "${target}/${dest}") + + set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") + add_custom_command(OUTPUT ${dest} + COMMAND ${GO_EXECUTABLE} build + -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} + COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile + -target ${target} -pkg ${package} -out ${depfile} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${godeps} ${CMAKE_SOURCE_DIR}/go.mod + DEPFILE ${depfile}) + endif() +endfunction() + From 04b3a96452b57f74f9768b1126f35b7398ddfff3 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Wed, 8 Feb 2023 21:08:49 +0000 Subject: [PATCH 069/177] Revert "Drop HRSS assembly." This reverts commit 97873cd1a59b97ced00907e274afaff75edf4a57. In some configurations, Clang (when building for debug) compiles poly_mul_vec_aux with a huge (12KB) stack frame. It appears to be expanding the code into a huge SSA graph and then assigning every value in the graph to the stack. When optimising it can store the live values in only a few hundreds bytes of stack, but since this function recurses, the debug build can overflow the stack. Unclear quite what to do about this, but this change solves the immediate issue. Change-Id: Ifa531f91f10bf04de92e8d07fbb14c668b366454 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57065 Auto-Submit: Adam Langley Commit-Queue: Adam Langley Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/CMakeLists.txt | 1 + crypto/hrss/asm/poly_rq_mul.S | 8493 +++++++++++++++++++++++++++++++++ crypto/hrss/hrss.c | 12 + crypto/hrss/internal.h | 20 + util/generate_build_files.py | 3 + 5 files changed, 8529 insertions(+) create mode 100644 crypto/hrss/asm/poly_rq_mul.S diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 45231bb986..1425ad54da 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -17,6 +17,7 @@ endif() set( CRYPTO_SOURCES_ASM curve25519/asm/x25519-asm-arm.S + hrss/asm/poly_rq_mul.S poly1305/poly1305_arm_asm.S ) perlasm(CRYPTO_SOURCES aarch64 chacha/chacha-armv8 chacha/asm/chacha-armv8.pl) diff --git a/crypto/hrss/asm/poly_rq_mul.S b/crypto/hrss/asm/poly_rq_mul.S new file mode 100644 index 0000000000..eaf45a8732 --- /dev/null +++ b/crypto/hrss/asm/poly_rq_mul.S @@ -0,0 +1,8493 @@ +// Copyright (c) 2017, the HRSS authors. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SMALL) && defined(__linux__) && defined(__x86_64__) + +#if defined(BORINGSSL_PREFIX) +#include +#endif + +// This is the polynomial multiplication function from [HRSS], provided by kind +// permission of the authors. +// +// HRSS: https://eprint.iacr.org/2017/1005 + +# This file was generated by poly_rq_mul.py +.text +.align 32 +const3: +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +.word 3 +const9: +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +.word 9 +const0: +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +const729: +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +.word 729 +const3_inv: +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +.word 43691 +const5_inv: +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +.word 52429 +shuf48_16: +.byte 10 +.byte 11 +.byte 12 +.byte 13 +.byte 14 +.byte 15 +.byte 0 +.byte 1 +.byte 2 +.byte 3 +.byte 4 +.byte 5 +.byte 6 +.byte 7 +.byte 8 +.byte 9 +.byte 10 +.byte 11 +.byte 12 +.byte 13 +.byte 14 +.byte 15 +.byte 0 +.byte 1 +.byte 2 +.byte 3 +.byte 4 +.byte 5 +.byte 6 +.byte 7 +.byte 8 +.byte 9 +shufmin1_mask3: +.byte 2 +.byte 3 +.byte 4 +.byte 5 +.byte 6 +.byte 7 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +.byte 255 +mask32_to_16: +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +.word 0xffff +.word 0x0 +mask5_3_5_3: +.word 0 +.word 0 +.word 0 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 0 +.word 0 +.word 0 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +mask3_5_3_5: +.word 65535 +.word 65535 +.word 65535 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 65535 +.word 65535 +.word 65535 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +mask3_5_4_3_1: +.word 65535 +.word 65535 +.word 65535 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 65535 +.word 65535 +.word 65535 +.word 0 +mask_keephigh: +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 0 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +.word 65535 +mask_mod8192: +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.word 8191 +.text +.global poly_Rq_mul +.hidden poly_Rq_mul +.type poly_Rq_mul, @function +.att_syntax prefix +poly_Rq_mul: +.cfi_startproc +push %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset rbp, -16 +movq %rsp, %rbp +.cfi_def_cfa_register rbp +push %r12 +.cfi_offset r12, -24 +# This function originally used a significant amount of stack space. As an +# alternative, the needed scratch space is now passed in as the 4th argument. +# The amount of scratch space used must thus be kept in sync with +# POLY_MUL_RQ_SCRATCH_SPACE in internal.h. +# +# Setting RSP to point into the given scratch space upsets the ABI tests +# therefore all references to RSP are switched to R8. +mov %rcx, %r8 +addq $6144+12288+512+9408+32, %r8 +mov %r8, %rax +subq $6144, %r8 +mov %r8, %r11 +subq $12288, %r8 +mov %r8, %r12 +subq $512, %r8 +vmovdqa const3(%rip), %ymm3 +vmovdqu 0(%rsi), %ymm0 +vmovdqu 88(%rsi), %ymm1 +vmovdqu 176(%rsi), %ymm2 +vmovdqu 264(%rsi), %ymm12 +vmovdqu 1056(%rsi), %ymm4 +vmovdqu 1144(%rsi), %ymm5 +vmovdqu 1232(%rsi), %ymm6 +vmovdqu 1320(%rsi), %ymm7 +vmovdqu 352(%rsi), %ymm8 +vmovdqu 440(%rsi), %ymm9 +vmovdqu 528(%rsi), %ymm10 +vmovdqu 616(%rsi), %ymm11 +vmovdqa %ymm0, 0(%rax) +vmovdqa %ymm1, 96(%rax) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 192(%rax) +vmovdqa %ymm2, 288(%rax) +vmovdqa %ymm12, 384(%rax) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 480(%rax) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 576(%rax) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 672(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 768(%rax) +vmovdqa %ymm4, 5184(%rax) +vmovdqa %ymm5, 5280(%rax) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5376(%rax) +vmovdqa %ymm6, 5472(%rax) +vmovdqa %ymm7, 5568(%rax) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5664(%rax) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5760(%rax) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5856(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 5952(%rax) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 704(%rsi), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 792(%rsi), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 880(%rsi), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 968(%rsi), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 864(%rax) +vmovdqa %ymm9, 960(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1056(%rax) +vmovdqa %ymm10, 1152(%rax) +vmovdqa %ymm11, 1248(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1344(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1440(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1536(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1632(%rax) +vmovdqa %ymm12, 1728(%rax) +vmovdqa %ymm13, 1824(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1920(%rax) +vmovdqa %ymm14, 2016(%rax) +vmovdqa %ymm15, 2112(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2208(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2304(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2400(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2496(%rax) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2592(%rax) +vmovdqa %ymm9, 2688(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2784(%rax) +vmovdqa %ymm10, 2880(%rax) +vmovdqa %ymm11, 2976(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3072(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3168(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3264(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3360(%rax) +vmovdqa %ymm12, 3456(%rax) +vmovdqa %ymm13, 3552(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3648(%rax) +vmovdqa %ymm14, 3744(%rax) +vmovdqa %ymm15, 3840(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 3936(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4032(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4128(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4224(%rax) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4320(%rax) +vmovdqa %ymm13, 4416(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4512(%rax) +vmovdqa %ymm14, 4608(%rax) +vmovdqa %ymm15, 4704(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4800(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4896(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4992(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5088(%rax) +vmovdqu 32(%rsi), %ymm0 +vmovdqu 120(%rsi), %ymm1 +vmovdqu 208(%rsi), %ymm2 +vmovdqu 296(%rsi), %ymm12 +vmovdqu 1088(%rsi), %ymm4 +vmovdqu 1176(%rsi), %ymm5 +vmovdqu 1264(%rsi), %ymm6 +vmovdqu 1352(%rsi), %ymm7 +vmovdqu 384(%rsi), %ymm8 +vmovdqu 472(%rsi), %ymm9 +vmovdqu 560(%rsi), %ymm10 +vmovdqu 648(%rsi), %ymm11 +vmovdqa %ymm0, 32(%rax) +vmovdqa %ymm1, 128(%rax) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 224(%rax) +vmovdqa %ymm2, 320(%rax) +vmovdqa %ymm12, 416(%rax) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 512(%rax) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 608(%rax) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 704(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 800(%rax) +vmovdqa %ymm4, 5216(%rax) +vmovdqa %ymm5, 5312(%rax) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5408(%rax) +vmovdqa %ymm6, 5504(%rax) +vmovdqa %ymm7, 5600(%rax) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5696(%rax) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5792(%rax) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5888(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 5984(%rax) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 736(%rsi), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 824(%rsi), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 912(%rsi), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 1000(%rsi), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 896(%rax) +vmovdqa %ymm9, 992(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1088(%rax) +vmovdqa %ymm10, 1184(%rax) +vmovdqa %ymm11, 1280(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1376(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1472(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1568(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1664(%rax) +vmovdqa %ymm12, 1760(%rax) +vmovdqa %ymm13, 1856(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1952(%rax) +vmovdqa %ymm14, 2048(%rax) +vmovdqa %ymm15, 2144(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2240(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2336(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2432(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2528(%rax) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2624(%rax) +vmovdqa %ymm9, 2720(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2816(%rax) +vmovdqa %ymm10, 2912(%rax) +vmovdqa %ymm11, 3008(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3104(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3200(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3296(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3392(%rax) +vmovdqa %ymm12, 3488(%rax) +vmovdqa %ymm13, 3584(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3680(%rax) +vmovdqa %ymm14, 3776(%rax) +vmovdqa %ymm15, 3872(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 3968(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4064(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4160(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4256(%rax) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4352(%rax) +vmovdqa %ymm13, 4448(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4544(%rax) +vmovdqa %ymm14, 4640(%rax) +vmovdqa %ymm15, 4736(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4832(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4928(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 5024(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5120(%rax) +vmovdqu 64(%rsi), %ymm0 +vmovdqu 152(%rsi), %ymm1 +vmovdqu 240(%rsi), %ymm2 +vmovdqu 328(%rsi), %ymm12 +vmovdqu 1120(%rsi), %ymm4 +vmovdqu 1208(%rsi), %ymm5 +vmovdqu 1296(%rsi), %ymm6 + +# Only 18 bytes more can be read, but vmovdqu reads 32. +# Copy 18 bytes to the red zone and zero pad to 32 bytes. +xor %r9, %r9 +movq %r9, -16(%rsp) +movq %r9, -8(%rsp) +movq 1384(%rsi), %r9 +movq %r9, -32(%rsp) +movq 1384+8(%rsi), %r9 +movq %r9, -24(%rsp) +movw 1384+16(%rsi), %r9w +movw %r9w, -16(%rsp) +vmovdqu -32(%rsp), %ymm7 + +vmovdqu 416(%rsi), %ymm8 +vmovdqu 504(%rsi), %ymm9 +vmovdqu 592(%rsi), %ymm10 +vmovdqu 680(%rsi), %ymm11 +vmovdqa %ymm0, 64(%rax) +vmovdqa %ymm1, 160(%rax) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 256(%rax) +vmovdqa %ymm2, 352(%rax) +vmovdqa %ymm12, 448(%rax) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 544(%rax) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 640(%rax) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 736(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 832(%rax) +vmovdqa %ymm4, 5248(%rax) +vmovdqa %ymm5, 5344(%rax) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5440(%rax) +vmovdqa %ymm6, 5536(%rax) +vmovdqa %ymm7, 5632(%rax) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5728(%rax) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5824(%rax) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5920(%rax) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 6016(%rax) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 768(%rsi), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 856(%rsi), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 944(%rsi), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 1032(%rsi), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 928(%rax) +vmovdqa %ymm9, 1024(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1120(%rax) +vmovdqa %ymm10, 1216(%rax) +vmovdqa %ymm11, 1312(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1408(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1504(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1600(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1696(%rax) +vmovdqa %ymm12, 1792(%rax) +vmovdqa %ymm13, 1888(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1984(%rax) +vmovdqa %ymm14, 2080(%rax) +vmovdqa %ymm15, 2176(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2272(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2368(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2464(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2560(%rax) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2656(%rax) +vmovdqa %ymm9, 2752(%rax) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2848(%rax) +vmovdqa %ymm10, 2944(%rax) +vmovdqa %ymm11, 3040(%rax) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3136(%rax) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3232(%rax) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3328(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3424(%rax) +vmovdqa %ymm12, 3520(%rax) +vmovdqa %ymm13, 3616(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3712(%rax) +vmovdqa %ymm14, 3808(%rax) +vmovdqa %ymm15, 3904(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4000(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4096(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4192(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4288(%rax) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4384(%rax) +vmovdqa %ymm13, 4480(%rax) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4576(%rax) +vmovdqa %ymm14, 4672(%rax) +vmovdqa %ymm15, 4768(%rax) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4864(%rax) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4960(%rax) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 5056(%rax) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5152(%rax) +vmovdqu 0(%rdx), %ymm0 +vmovdqu 88(%rdx), %ymm1 +vmovdqu 176(%rdx), %ymm2 +vmovdqu 264(%rdx), %ymm12 +vmovdqu 1056(%rdx), %ymm4 +vmovdqu 1144(%rdx), %ymm5 +vmovdqu 1232(%rdx), %ymm6 +vmovdqu 1320(%rdx), %ymm7 +vmovdqu 352(%rdx), %ymm8 +vmovdqu 440(%rdx), %ymm9 +vmovdqu 528(%rdx), %ymm10 +vmovdqu 616(%rdx), %ymm11 +vmovdqa %ymm0, 0(%r11) +vmovdqa %ymm1, 96(%r11) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 192(%r11) +vmovdqa %ymm2, 288(%r11) +vmovdqa %ymm12, 384(%r11) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 480(%r11) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 576(%r11) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 672(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 768(%r11) +vmovdqa %ymm4, 5184(%r11) +vmovdqa %ymm5, 5280(%r11) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5376(%r11) +vmovdqa %ymm6, 5472(%r11) +vmovdqa %ymm7, 5568(%r11) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5664(%r11) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5760(%r11) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5856(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 5952(%r11) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 704(%rdx), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 792(%rdx), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 880(%rdx), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 968(%rdx), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 864(%r11) +vmovdqa %ymm9, 960(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1056(%r11) +vmovdqa %ymm10, 1152(%r11) +vmovdqa %ymm11, 1248(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1344(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1440(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1536(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1632(%r11) +vmovdqa %ymm12, 1728(%r11) +vmovdqa %ymm13, 1824(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1920(%r11) +vmovdqa %ymm14, 2016(%r11) +vmovdqa %ymm15, 2112(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2208(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2304(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2400(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2496(%r11) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2592(%r11) +vmovdqa %ymm9, 2688(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2784(%r11) +vmovdqa %ymm10, 2880(%r11) +vmovdqa %ymm11, 2976(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3072(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3168(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3264(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3360(%r11) +vmovdqa %ymm12, 3456(%r11) +vmovdqa %ymm13, 3552(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3648(%r11) +vmovdqa %ymm14, 3744(%r11) +vmovdqa %ymm15, 3840(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 3936(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4032(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4128(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4224(%r11) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4320(%r11) +vmovdqa %ymm13, 4416(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4512(%r11) +vmovdqa %ymm14, 4608(%r11) +vmovdqa %ymm15, 4704(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4800(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4896(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4992(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5088(%r11) +vmovdqu 32(%rdx), %ymm0 +vmovdqu 120(%rdx), %ymm1 +vmovdqu 208(%rdx), %ymm2 +vmovdqu 296(%rdx), %ymm12 +vmovdqu 1088(%rdx), %ymm4 +vmovdqu 1176(%rdx), %ymm5 +vmovdqu 1264(%rdx), %ymm6 +vmovdqu 1352(%rdx), %ymm7 +vmovdqu 384(%rdx), %ymm8 +vmovdqu 472(%rdx), %ymm9 +vmovdqu 560(%rdx), %ymm10 +vmovdqu 648(%rdx), %ymm11 +vmovdqa %ymm0, 32(%r11) +vmovdqa %ymm1, 128(%r11) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 224(%r11) +vmovdqa %ymm2, 320(%r11) +vmovdqa %ymm12, 416(%r11) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 512(%r11) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 608(%r11) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 704(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 800(%r11) +vmovdqa %ymm4, 5216(%r11) +vmovdqa %ymm5, 5312(%r11) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5408(%r11) +vmovdqa %ymm6, 5504(%r11) +vmovdqa %ymm7, 5600(%r11) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5696(%r11) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5792(%r11) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5888(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 5984(%r11) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 736(%rdx), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 824(%rdx), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 912(%rdx), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 1000(%rdx), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 896(%r11) +vmovdqa %ymm9, 992(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1088(%r11) +vmovdqa %ymm10, 1184(%r11) +vmovdqa %ymm11, 1280(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1376(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1472(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1568(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1664(%r11) +vmovdqa %ymm12, 1760(%r11) +vmovdqa %ymm13, 1856(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1952(%r11) +vmovdqa %ymm14, 2048(%r11) +vmovdqa %ymm15, 2144(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2240(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2336(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2432(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2528(%r11) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2624(%r11) +vmovdqa %ymm9, 2720(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2816(%r11) +vmovdqa %ymm10, 2912(%r11) +vmovdqa %ymm11, 3008(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3104(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3200(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3296(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3392(%r11) +vmovdqa %ymm12, 3488(%r11) +vmovdqa %ymm13, 3584(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3680(%r11) +vmovdqa %ymm14, 3776(%r11) +vmovdqa %ymm15, 3872(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 3968(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4064(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4160(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4256(%r11) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4352(%r11) +vmovdqa %ymm13, 4448(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4544(%r11) +vmovdqa %ymm14, 4640(%r11) +vmovdqa %ymm15, 4736(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4832(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4928(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 5024(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5120(%r11) +vmovdqu 64(%rdx), %ymm0 +vmovdqu 152(%rdx), %ymm1 +vmovdqu 240(%rdx), %ymm2 +vmovdqu 328(%rdx), %ymm12 +vmovdqu 1120(%rdx), %ymm4 +vmovdqu 1208(%rdx), %ymm5 +vmovdqu 1296(%rdx), %ymm6 + +# Only 18 bytes more can be read, but vmovdqu reads 32. +# Copy 18 bytes to the red zone and zero pad to 32 bytes. +xor %r9, %r9 +movq %r9, -16(%rsp) +movq %r9, -8(%rsp) +movq 1384(%rdx), %r9 +movq %r9, -32(%rsp) +movq 1384+8(%rdx), %r9 +movq %r9, -24(%rsp) +movw 1384+16(%rdx), %r9w +movw %r9w, -16(%rsp) +vmovdqu -32(%rsp), %ymm7 + +vmovdqu 416(%rdx), %ymm8 +vmovdqu 504(%rdx), %ymm9 +vmovdqu 592(%rdx), %ymm10 +vmovdqu 680(%rdx), %ymm11 +vmovdqa %ymm0, 64(%r11) +vmovdqa %ymm1, 160(%r11) +vpaddw %ymm0, %ymm1, %ymm14 +vmovdqa %ymm14, 256(%r11) +vmovdqa %ymm2, 352(%r11) +vmovdqa %ymm12, 448(%r11) +vpaddw %ymm2, %ymm12, %ymm14 +vmovdqa %ymm14, 544(%r11) +vpaddw %ymm0, %ymm2, %ymm14 +vmovdqa %ymm14, 640(%r11) +vpaddw %ymm1, %ymm12, %ymm15 +vmovdqa %ymm15, 736(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 832(%r11) +vmovdqa %ymm4, 5248(%r11) +vmovdqa %ymm5, 5344(%r11) +vpaddw %ymm4, %ymm5, %ymm14 +vmovdqa %ymm14, 5440(%r11) +vmovdqa %ymm6, 5536(%r11) +vmovdqa %ymm7, 5632(%r11) +vpaddw %ymm6, %ymm7, %ymm14 +vmovdqa %ymm14, 5728(%r11) +vpaddw %ymm4, %ymm6, %ymm14 +vmovdqa %ymm14, 5824(%r11) +vpaddw %ymm5, %ymm7, %ymm15 +vmovdqa %ymm15, 5920(%r11) +vpaddw %ymm14, %ymm15, %ymm14 +vmovdqa %ymm14, 6016(%r11) +vmovdqa %ymm0, 0(%r8) +vmovdqa %ymm1, 32(%r8) +vmovdqa %ymm2, 64(%r8) +vmovdqa %ymm12, 96(%r8) +vmovdqa %ymm8, 128(%r8) +vmovdqa %ymm9, 160(%r8) +vmovdqa %ymm10, 192(%r8) +vmovdqa %ymm11, 224(%r8) +vmovdqu 768(%rdx), %ymm0 +vpaddw 0(%r8), %ymm0, %ymm1 +vpaddw 128(%r8), %ymm4, %ymm2 +vpaddw %ymm2, %ymm1, %ymm8 +vpsubw %ymm2, %ymm1, %ymm12 +vmovdqa %ymm0, 256(%r8) +vmovdqu 856(%rdx), %ymm0 +vpaddw 32(%r8), %ymm0, %ymm1 +vpaddw 160(%r8), %ymm5, %ymm2 +vpaddw %ymm2, %ymm1, %ymm9 +vpsubw %ymm2, %ymm1, %ymm13 +vmovdqa %ymm0, 288(%r8) +vmovdqu 944(%rdx), %ymm0 +vpaddw 64(%r8), %ymm0, %ymm1 +vpaddw 192(%r8), %ymm6, %ymm2 +vpaddw %ymm2, %ymm1, %ymm10 +vpsubw %ymm2, %ymm1, %ymm14 +vmovdqa %ymm0, 320(%r8) +vmovdqu 1032(%rdx), %ymm0 +vpaddw 96(%r8), %ymm0, %ymm1 +vpaddw 224(%r8), %ymm7, %ymm2 +vpaddw %ymm2, %ymm1, %ymm11 +vpsubw %ymm2, %ymm1, %ymm15 +vmovdqa %ymm0, 352(%r8) +vmovdqa %ymm8, 928(%r11) +vmovdqa %ymm9, 1024(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 1120(%r11) +vmovdqa %ymm10, 1216(%r11) +vmovdqa %ymm11, 1312(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 1408(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 1504(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 1600(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 1696(%r11) +vmovdqa %ymm12, 1792(%r11) +vmovdqa %ymm13, 1888(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 1984(%r11) +vmovdqa %ymm14, 2080(%r11) +vmovdqa %ymm15, 2176(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 2272(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 2368(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 2464(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 2560(%r11) +vmovdqa 256(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm4, %ymm1 +vpaddw 128(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm8 +vpsubw %ymm1, %ymm0, %ymm12 +vmovdqa 288(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm5, %ymm1 +vpaddw 160(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm9 +vpsubw %ymm1, %ymm0, %ymm13 +vmovdqa 320(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm6, %ymm1 +vpaddw 192(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm10 +vpsubw %ymm1, %ymm0, %ymm14 +vmovdqa 352(%r8), %ymm0 +vpsllw $2, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm0 +vpsllw $2, %ymm7, %ymm1 +vpaddw 224(%r8), %ymm1, %ymm1 +vpsllw $1, %ymm1, %ymm1 +vpaddw %ymm1, %ymm0, %ymm11 +vpsubw %ymm1, %ymm0, %ymm15 +vmovdqa %ymm8, 2656(%r11) +vmovdqa %ymm9, 2752(%r11) +vpaddw %ymm8, %ymm9, %ymm0 +vmovdqa %ymm0, 2848(%r11) +vmovdqa %ymm10, 2944(%r11) +vmovdqa %ymm11, 3040(%r11) +vpaddw %ymm10, %ymm11, %ymm0 +vmovdqa %ymm0, 3136(%r11) +vpaddw %ymm8, %ymm10, %ymm0 +vmovdqa %ymm0, 3232(%r11) +vpaddw %ymm9, %ymm11, %ymm1 +vmovdqa %ymm1, 3328(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 3424(%r11) +vmovdqa %ymm12, 3520(%r11) +vmovdqa %ymm13, 3616(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 3712(%r11) +vmovdqa %ymm14, 3808(%r11) +vmovdqa %ymm15, 3904(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4000(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4096(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 4192(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 4288(%r11) +vpmullw %ymm3, %ymm4, %ymm0 +vpaddw 256(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 128(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 0(%r8), %ymm0, %ymm12 +vpmullw %ymm3, %ymm5, %ymm0 +vpaddw 288(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 160(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 32(%r8), %ymm0, %ymm13 +vpmullw %ymm3, %ymm6, %ymm0 +vpaddw 320(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 192(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 64(%r8), %ymm0, %ymm14 +vpmullw %ymm3, %ymm7, %ymm0 +vpaddw 352(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 224(%r8), %ymm0, %ymm0 +vpmullw %ymm3, %ymm0, %ymm0 +vpaddw 96(%r8), %ymm0, %ymm15 +vmovdqa %ymm12, 4384(%r11) +vmovdqa %ymm13, 4480(%r11) +vpaddw %ymm12, %ymm13, %ymm0 +vmovdqa %ymm0, 4576(%r11) +vmovdqa %ymm14, 4672(%r11) +vmovdqa %ymm15, 4768(%r11) +vpaddw %ymm14, %ymm15, %ymm0 +vmovdqa %ymm0, 4864(%r11) +vpaddw %ymm12, %ymm14, %ymm0 +vmovdqa %ymm0, 4960(%r11) +vpaddw %ymm13, %ymm15, %ymm1 +vmovdqa %ymm1, 5056(%r11) +vpaddw %ymm0, %ymm1, %ymm0 +vmovdqa %ymm0, 5152(%r11) +subq $9408, %r8 +mov $4, %ecx +karatsuba_loop_4eced63f144beffcb0247f9c6f67d165: +mov %r8, %r9 +mov %r8, %r10 +subq $32, %r8 +vmovdqa 0(%rax), %ymm0 +vmovdqa 192(%rax), %ymm1 +vmovdqa 384(%rax), %ymm2 +vmovdqa 576(%rax), %ymm3 +vpunpcklwd 96(%rax), %ymm0, %ymm4 +vpunpckhwd 96(%rax), %ymm0, %ymm5 +vpunpcklwd 288(%rax), %ymm1, %ymm6 +vpunpckhwd 288(%rax), %ymm1, %ymm7 +vpunpcklwd 480(%rax), %ymm2, %ymm8 +vpunpckhwd 480(%rax), %ymm2, %ymm9 +vpunpcklwd 672(%rax), %ymm3, %ymm10 +vpunpckhwd 672(%rax), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 768(%rax), %ymm0 +vmovdqa 960(%rax), %ymm1 +vmovdqa 1152(%rax), %ymm2 +vmovdqa 1344(%rax), %ymm3 +vpunpcklwd 864(%rax), %ymm0, %ymm12 +vpunpckhwd 864(%rax), %ymm0, %ymm13 +vpunpcklwd 1056(%rax), %ymm1, %ymm14 +vpunpckhwd 1056(%rax), %ymm1, %ymm15 +vpunpcklwd 1248(%rax), %ymm2, %ymm0 +vpunpckhwd 1248(%rax), %ymm2, %ymm1 +vpunpcklwd 1440(%rax), %ymm3, %ymm2 +vpunpckhwd 1440(%rax), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 0(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 32(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 64(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 96(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 128(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 160(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 192(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 256(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 288(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 320(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 352(%r9) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 384(%r9) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 416(%r9) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 448(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 224(%r9) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 480(%r9) +vmovdqa 32(%rax), %ymm0 +vmovdqa 224(%rax), %ymm1 +vmovdqa 416(%rax), %ymm2 +vmovdqa 608(%rax), %ymm3 +vpunpcklwd 128(%rax), %ymm0, %ymm4 +vpunpckhwd 128(%rax), %ymm0, %ymm5 +vpunpcklwd 320(%rax), %ymm1, %ymm6 +vpunpckhwd 320(%rax), %ymm1, %ymm7 +vpunpcklwd 512(%rax), %ymm2, %ymm8 +vpunpckhwd 512(%rax), %ymm2, %ymm9 +vpunpcklwd 704(%rax), %ymm3, %ymm10 +vpunpckhwd 704(%rax), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 800(%rax), %ymm0 +vmovdqa 992(%rax), %ymm1 +vmovdqa 1184(%rax), %ymm2 +vmovdqa 1376(%rax), %ymm3 +vpunpcklwd 896(%rax), %ymm0, %ymm12 +vpunpckhwd 896(%rax), %ymm0, %ymm13 +vpunpcklwd 1088(%rax), %ymm1, %ymm14 +vpunpckhwd 1088(%rax), %ymm1, %ymm15 +vpunpcklwd 1280(%rax), %ymm2, %ymm0 +vpunpckhwd 1280(%rax), %ymm2, %ymm1 +vpunpcklwd 1472(%rax), %ymm3, %ymm2 +vpunpckhwd 1472(%rax), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 512(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 544(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 576(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 608(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 640(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 672(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 704(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 768(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 800(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 832(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 864(%r9) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 896(%r9) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 928(%r9) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 960(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 736(%r9) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 992(%r9) +vmovdqa 64(%rax), %ymm0 +vmovdqa 256(%rax), %ymm1 +vmovdqa 448(%rax), %ymm2 +vmovdqa 640(%rax), %ymm3 +vpunpcklwd 160(%rax), %ymm0, %ymm4 +vpunpckhwd 160(%rax), %ymm0, %ymm5 +vpunpcklwd 352(%rax), %ymm1, %ymm6 +vpunpckhwd 352(%rax), %ymm1, %ymm7 +vpunpcklwd 544(%rax), %ymm2, %ymm8 +vpunpckhwd 544(%rax), %ymm2, %ymm9 +vpunpcklwd 736(%rax), %ymm3, %ymm10 +vpunpckhwd 736(%rax), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 832(%rax), %ymm0 +vmovdqa 1024(%rax), %ymm1 +vmovdqa 1216(%rax), %ymm2 +vmovdqa 1408(%rax), %ymm3 +vpunpcklwd 928(%rax), %ymm0, %ymm12 +vpunpckhwd 928(%rax), %ymm0, %ymm13 +vpunpcklwd 1120(%rax), %ymm1, %ymm14 +vpunpckhwd 1120(%rax), %ymm1, %ymm15 +vpunpcklwd 1312(%rax), %ymm2, %ymm0 +vpunpckhwd 1312(%rax), %ymm2, %ymm1 +vpunpcklwd 1504(%rax), %ymm3, %ymm2 +vpunpckhwd 1504(%rax), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 1024(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 1056(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 1088(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 1120(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 1152(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1184(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1216(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1280(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1312(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 1344(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 1376(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1248(%r9) +vmovdqa 0(%r11), %ymm0 +vmovdqa 192(%r11), %ymm1 +vmovdqa 384(%r11), %ymm2 +vmovdqa 576(%r11), %ymm3 +vpunpcklwd 96(%r11), %ymm0, %ymm4 +vpunpckhwd 96(%r11), %ymm0, %ymm5 +vpunpcklwd 288(%r11), %ymm1, %ymm6 +vpunpckhwd 288(%r11), %ymm1, %ymm7 +vpunpcklwd 480(%r11), %ymm2, %ymm8 +vpunpckhwd 480(%r11), %ymm2, %ymm9 +vpunpcklwd 672(%r11), %ymm3, %ymm10 +vpunpckhwd 672(%r11), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 768(%r11), %ymm0 +vmovdqa 960(%r11), %ymm1 +vmovdqa 1152(%r11), %ymm2 +vmovdqa 1344(%r11), %ymm3 +vpunpcklwd 864(%r11), %ymm0, %ymm12 +vpunpckhwd 864(%r11), %ymm0, %ymm13 +vpunpcklwd 1056(%r11), %ymm1, %ymm14 +vpunpckhwd 1056(%r11), %ymm1, %ymm15 +vpunpcklwd 1248(%r11), %ymm2, %ymm0 +vpunpckhwd 1248(%r11), %ymm2, %ymm1 +vpunpcklwd 1440(%r11), %ymm3, %ymm2 +vpunpckhwd 1440(%r11), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 1408(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 1440(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 1472(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 1504(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 1536(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1568(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1600(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1664(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1696(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 1728(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 1760(%r9) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 1792(%r9) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 1824(%r9) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 1856(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1632(%r9) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 1888(%r9) +vmovdqa 32(%r11), %ymm0 +vmovdqa 224(%r11), %ymm1 +vmovdqa 416(%r11), %ymm2 +vmovdqa 608(%r11), %ymm3 +vpunpcklwd 128(%r11), %ymm0, %ymm4 +vpunpckhwd 128(%r11), %ymm0, %ymm5 +vpunpcklwd 320(%r11), %ymm1, %ymm6 +vpunpckhwd 320(%r11), %ymm1, %ymm7 +vpunpcklwd 512(%r11), %ymm2, %ymm8 +vpunpckhwd 512(%r11), %ymm2, %ymm9 +vpunpcklwd 704(%r11), %ymm3, %ymm10 +vpunpckhwd 704(%r11), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 800(%r11), %ymm0 +vmovdqa 992(%r11), %ymm1 +vmovdqa 1184(%r11), %ymm2 +vmovdqa 1376(%r11), %ymm3 +vpunpcklwd 896(%r11), %ymm0, %ymm12 +vpunpckhwd 896(%r11), %ymm0, %ymm13 +vpunpcklwd 1088(%r11), %ymm1, %ymm14 +vpunpckhwd 1088(%r11), %ymm1, %ymm15 +vpunpcklwd 1280(%r11), %ymm2, %ymm0 +vpunpckhwd 1280(%r11), %ymm2, %ymm1 +vpunpcklwd 1472(%r11), %ymm3, %ymm2 +vpunpckhwd 1472(%r11), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 1920(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 1952(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 1984(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 2016(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 2048(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 2080(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 2112(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 2176(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 2208(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 2240(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2272(%r9) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2304(%r9) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2336(%r9) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2368(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 2144(%r9) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 2400(%r9) +vmovdqa 64(%r11), %ymm0 +vmovdqa 256(%r11), %ymm1 +vmovdqa 448(%r11), %ymm2 +vmovdqa 640(%r11), %ymm3 +vpunpcklwd 160(%r11), %ymm0, %ymm4 +vpunpckhwd 160(%r11), %ymm0, %ymm5 +vpunpcklwd 352(%r11), %ymm1, %ymm6 +vpunpckhwd 352(%r11), %ymm1, %ymm7 +vpunpcklwd 544(%r11), %ymm2, %ymm8 +vpunpckhwd 544(%r11), %ymm2, %ymm9 +vpunpcklwd 736(%r11), %ymm3, %ymm10 +vpunpckhwd 736(%r11), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 832(%r11), %ymm0 +vmovdqa 1024(%r11), %ymm1 +vmovdqa 1216(%r11), %ymm2 +vmovdqa 1408(%r11), %ymm3 +vpunpcklwd 928(%r11), %ymm0, %ymm12 +vpunpckhwd 928(%r11), %ymm0, %ymm13 +vpunpcklwd 1120(%r11), %ymm1, %ymm14 +vpunpckhwd 1120(%r11), %ymm1, %ymm15 +vpunpcklwd 1312(%r11), %ymm2, %ymm0 +vpunpckhwd 1312(%r11), %ymm2, %ymm1 +vpunpcklwd 1504(%r11), %ymm3, %ymm2 +vpunpckhwd 1504(%r11), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 2432(%r9) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 2464(%r9) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 2496(%r9) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 2528(%r9) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 2560(%r9) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 2592(%r9) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 2624(%r9) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 2688(%r9) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 2720(%r9) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 2752(%r9) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2784(%r9) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 2656(%r9) +addq $32, %r8 +innerloop_4eced63f144beffcb0247f9c6f67d165: +vmovdqa 0(%r9), %ymm0 +vmovdqa 1408(%r9), %ymm6 +vmovdqa 32(%r9), %ymm1 +vmovdqa 1440(%r9), %ymm7 +vmovdqa 64(%r9), %ymm2 +vmovdqa 1472(%r9), %ymm8 +vmovdqa 96(%r9), %ymm3 +vmovdqa 1504(%r9), %ymm9 +vmovdqa 128(%r9), %ymm4 +vmovdqa 1536(%r9), %ymm10 +vmovdqa 160(%r9), %ymm5 +vmovdqa 1568(%r9), %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 2816(%r10) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 2848(%r10) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 2880(%r10) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 2912(%r10) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 2944(%r10) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 2976(%r10) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3008(%r10) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3040(%r10) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3072(%r10) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3104(%r10) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 3136(%r10) +vmovdqa 192(%r9), %ymm0 +vmovdqa 1600(%r9), %ymm6 +vmovdqa 224(%r9), %ymm1 +vmovdqa 1632(%r9), %ymm7 +vmovdqa 256(%r9), %ymm2 +vmovdqa 1664(%r9), %ymm8 +vmovdqa 288(%r9), %ymm3 +vmovdqa 1696(%r9), %ymm9 +vmovdqa 320(%r9), %ymm4 +vmovdqa 1728(%r9), %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 3200(%r10) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3232(%r10) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3264(%r10) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3296(%r10) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3328(%r10) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3360(%r10) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3392(%r10) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3424(%r10) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 3456(%r10) +vpaddw 0(%r9), %ymm0, %ymm0 +vpaddw 1408(%r9), %ymm6, %ymm6 +vpaddw 32(%r9), %ymm1, %ymm1 +vpaddw 1440(%r9), %ymm7, %ymm7 +vpaddw 64(%r9), %ymm2, %ymm2 +vpaddw 1472(%r9), %ymm8, %ymm8 +vpaddw 96(%r9), %ymm3, %ymm3 +vpaddw 1504(%r9), %ymm9, %ymm9 +vpaddw 128(%r9), %ymm4, %ymm4 +vpaddw 1536(%r9), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 2976(%r10), %ymm12, %ymm12 +vpsubw 3360(%r10), %ymm12, %ymm12 +vmovdqa %ymm12, 3168(%r10) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 3008(%r10), %ymm0 +vpsubw 3200(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 3392(%r10), %ymm6, %ymm6 +vmovdqa %ymm6, 3200(%r10) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 2816(%r10), %ymm0, %ymm0 +vmovdqa %ymm0, 3008(%r10) +vmovdqa 3040(%r10), %ymm1 +vpsubw 3232(%r10), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 3424(%r10), %ymm7, %ymm7 +vmovdqa %ymm7, 3232(%r10) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 2848(%r10), %ymm1, %ymm1 +vmovdqa %ymm1, 3040(%r10) +vmovdqa 3072(%r10), %ymm2 +vpsubw 3264(%r10), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 3456(%r10), %ymm8, %ymm8 +vmovdqa %ymm8, 3264(%r10) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 2880(%r10), %ymm2, %ymm2 +vmovdqa %ymm2, 3072(%r10) +vmovdqa 3104(%r10), %ymm3 +vpsubw 3296(%r10), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 3296(%r10) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 2912(%r10), %ymm3, %ymm3 +vmovdqa %ymm3, 3104(%r10) +vmovdqa 3136(%r10), %ymm4 +vpsubw 3328(%r10), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 2944(%r10), %ymm4, %ymm4 +vmovdqa %ymm4, 3136(%r10) +vmovdqa 352(%r9), %ymm0 +vmovdqa 1760(%r9), %ymm6 +vmovdqa 384(%r9), %ymm1 +vmovdqa 1792(%r9), %ymm7 +vmovdqa 416(%r9), %ymm2 +vmovdqa 1824(%r9), %ymm8 +vmovdqa 448(%r9), %ymm3 +vmovdqa 1856(%r9), %ymm9 +vmovdqa 480(%r9), %ymm4 +vmovdqa 1888(%r9), %ymm10 +vmovdqa 512(%r9), %ymm5 +vmovdqa 1920(%r9), %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 3520(%r10) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3552(%r10) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3584(%r10) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3616(%r10) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3648(%r10) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3680(%r10) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3712(%r10) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3744(%r10) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3776(%r10) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3808(%r10) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 3840(%r10) +vmovdqa 544(%r9), %ymm0 +vmovdqa 1952(%r9), %ymm6 +vmovdqa 576(%r9), %ymm1 +vmovdqa 1984(%r9), %ymm7 +vmovdqa 608(%r9), %ymm2 +vmovdqa 2016(%r9), %ymm8 +vmovdqa 640(%r9), %ymm3 +vmovdqa 2048(%r9), %ymm9 +vmovdqa 672(%r9), %ymm4 +vmovdqa 2080(%r9), %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 3904(%r10) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 3936(%r10) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 3968(%r10) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 4000(%r10) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 4032(%r10) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 4064(%r10) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 4096(%r10) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 4128(%r10) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 4160(%r10) +vpaddw 352(%r9), %ymm0, %ymm0 +vpaddw 1760(%r9), %ymm6, %ymm6 +vpaddw 384(%r9), %ymm1, %ymm1 +vpaddw 1792(%r9), %ymm7, %ymm7 +vpaddw 416(%r9), %ymm2, %ymm2 +vpaddw 1824(%r9), %ymm8, %ymm8 +vpaddw 448(%r9), %ymm3, %ymm3 +vpaddw 1856(%r9), %ymm9, %ymm9 +vpaddw 480(%r9), %ymm4, %ymm4 +vpaddw 1888(%r9), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 3680(%r10), %ymm12, %ymm12 +vpsubw 4064(%r10), %ymm12, %ymm12 +vmovdqa %ymm12, 3872(%r10) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 3712(%r10), %ymm0 +vpsubw 3904(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 4096(%r10), %ymm6, %ymm6 +vmovdqa %ymm6, 3904(%r10) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 3520(%r10), %ymm0, %ymm0 +vmovdqa %ymm0, 3712(%r10) +vmovdqa 3744(%r10), %ymm1 +vpsubw 3936(%r10), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 4128(%r10), %ymm7, %ymm7 +vmovdqa %ymm7, 3936(%r10) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 3552(%r10), %ymm1, %ymm1 +vmovdqa %ymm1, 3744(%r10) +vmovdqa 3776(%r10), %ymm2 +vpsubw 3968(%r10), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 4160(%r10), %ymm8, %ymm8 +vmovdqa %ymm8, 3968(%r10) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 3584(%r10), %ymm2, %ymm2 +vmovdqa %ymm2, 3776(%r10) +vmovdqa 3808(%r10), %ymm3 +vpsubw 4000(%r10), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 4000(%r10) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 3616(%r10), %ymm3, %ymm3 +vmovdqa %ymm3, 3808(%r10) +vmovdqa 3840(%r10), %ymm4 +vpsubw 4032(%r10), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 3648(%r10), %ymm4, %ymm4 +vmovdqa %ymm4, 3840(%r10) +vmovdqa 0(%r9), %ymm0 +vmovdqa 1408(%r9), %ymm6 +vpaddw 352(%r9), %ymm0, %ymm0 +vpaddw 1760(%r9), %ymm6, %ymm6 +vmovdqa 32(%r9), %ymm1 +vmovdqa 1440(%r9), %ymm7 +vpaddw 384(%r9), %ymm1, %ymm1 +vpaddw 1792(%r9), %ymm7, %ymm7 +vmovdqa 64(%r9), %ymm2 +vmovdqa 1472(%r9), %ymm8 +vpaddw 416(%r9), %ymm2, %ymm2 +vpaddw 1824(%r9), %ymm8, %ymm8 +vmovdqa 96(%r9), %ymm3 +vmovdqa 1504(%r9), %ymm9 +vpaddw 448(%r9), %ymm3, %ymm3 +vpaddw 1856(%r9), %ymm9, %ymm9 +vmovdqa 128(%r9), %ymm4 +vmovdqa 1536(%r9), %ymm10 +vpaddw 480(%r9), %ymm4, %ymm4 +vpaddw 1888(%r9), %ymm10, %ymm10 +vmovdqa 160(%r9), %ymm5 +vmovdqa 1568(%r9), %ymm11 +vpaddw 512(%r9), %ymm5, %ymm5 +vpaddw 1920(%r9), %ymm11, %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 5888(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 5920(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 5952(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 5984(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6016(%r8) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6048(%r8) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6080(%r8) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6112(%r8) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6144(%r8) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6176(%r8) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 6208(%r8) +vmovdqa 192(%r9), %ymm0 +vmovdqa 1600(%r9), %ymm6 +vpaddw 544(%r9), %ymm0, %ymm0 +vpaddw 1952(%r9), %ymm6, %ymm6 +vmovdqa 224(%r9), %ymm1 +vmovdqa 1632(%r9), %ymm7 +vpaddw 576(%r9), %ymm1, %ymm1 +vpaddw 1984(%r9), %ymm7, %ymm7 +vmovdqa 256(%r9), %ymm2 +vmovdqa 1664(%r9), %ymm8 +vpaddw 608(%r9), %ymm2, %ymm2 +vpaddw 2016(%r9), %ymm8, %ymm8 +vmovdqa 288(%r9), %ymm3 +vmovdqa 1696(%r9), %ymm9 +vpaddw 640(%r9), %ymm3, %ymm3 +vpaddw 2048(%r9), %ymm9, %ymm9 +vmovdqa 320(%r9), %ymm4 +vmovdqa 1728(%r9), %ymm10 +vpaddw 672(%r9), %ymm4, %ymm4 +vpaddw 2080(%r9), %ymm10, %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 6272(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6304(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6336(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6368(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6400(%r8) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6432(%r8) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6464(%r8) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6496(%r8) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 6528(%r8) +vpaddw 0(%r9), %ymm0, %ymm0 +vpaddw 1408(%r9), %ymm6, %ymm6 +vpaddw 352(%r9), %ymm0, %ymm0 +vpaddw 1760(%r9), %ymm6, %ymm6 +vpaddw 32(%r9), %ymm1, %ymm1 +vpaddw 1440(%r9), %ymm7, %ymm7 +vpaddw 384(%r9), %ymm1, %ymm1 +vpaddw 1792(%r9), %ymm7, %ymm7 +vpaddw 64(%r9), %ymm2, %ymm2 +vpaddw 1472(%r9), %ymm8, %ymm8 +vpaddw 416(%r9), %ymm2, %ymm2 +vpaddw 1824(%r9), %ymm8, %ymm8 +vpaddw 96(%r9), %ymm3, %ymm3 +vpaddw 1504(%r9), %ymm9, %ymm9 +vpaddw 448(%r9), %ymm3, %ymm3 +vpaddw 1856(%r9), %ymm9, %ymm9 +vpaddw 128(%r9), %ymm4, %ymm4 +vpaddw 1536(%r9), %ymm10, %ymm10 +vpaddw 480(%r9), %ymm4, %ymm4 +vpaddw 1888(%r9), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 6048(%r8), %ymm12, %ymm12 +vpsubw 6432(%r8), %ymm12, %ymm12 +vmovdqa %ymm12, 6240(%r8) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 6080(%r8), %ymm0 +vpsubw 6272(%r8), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 6464(%r8), %ymm6, %ymm6 +vmovdqa %ymm6, 6272(%r8) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 5888(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 6080(%r8) +vmovdqa 6112(%r8), %ymm1 +vpsubw 6304(%r8), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 6496(%r8), %ymm7, %ymm7 +vmovdqa %ymm7, 6304(%r8) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 5920(%r8), %ymm1, %ymm1 +vmovdqa %ymm1, 6112(%r8) +vmovdqa 6144(%r8), %ymm2 +vpsubw 6336(%r8), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 6528(%r8), %ymm8, %ymm8 +vmovdqa %ymm8, 6336(%r8) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 5952(%r8), %ymm2, %ymm2 +vmovdqa %ymm2, 6144(%r8) +vmovdqa 6176(%r8), %ymm3 +vpsubw 6368(%r8), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 6368(%r8) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 5984(%r8), %ymm3, %ymm3 +vmovdqa %ymm3, 6176(%r8) +vmovdqa 6208(%r8), %ymm4 +vpsubw 6400(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 6016(%r8), %ymm4, %ymm4 +vmovdqa %ymm4, 6208(%r8) +vmovdqa 6208(%r8), %ymm0 +vpsubw 3136(%r10), %ymm0, %ymm0 +vpsubw 3840(%r10), %ymm0, %ymm0 +vmovdqa %ymm0, 3488(%r10) +vmovdqa 3168(%r10), %ymm0 +vpsubw 3520(%r10), %ymm0, %ymm0 +vmovdqa 6240(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3872(%r10), %ymm1, %ymm1 +vpsubw 2816(%r10), %ymm0, %ymm0 +vpaddw 5888(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3168(%r10) +vmovdqa %ymm1, 3520(%r10) +vmovdqa 3200(%r10), %ymm0 +vpsubw 3552(%r10), %ymm0, %ymm0 +vmovdqa 6272(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3904(%r10), %ymm1, %ymm1 +vpsubw 2848(%r10), %ymm0, %ymm0 +vpaddw 5920(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3200(%r10) +vmovdqa %ymm1, 3552(%r10) +vmovdqa 3232(%r10), %ymm0 +vpsubw 3584(%r10), %ymm0, %ymm0 +vmovdqa 6304(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3936(%r10), %ymm1, %ymm1 +vpsubw 2880(%r10), %ymm0, %ymm0 +vpaddw 5952(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3232(%r10) +vmovdqa %ymm1, 3584(%r10) +vmovdqa 3264(%r10), %ymm0 +vpsubw 3616(%r10), %ymm0, %ymm0 +vmovdqa 6336(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3968(%r10), %ymm1, %ymm1 +vpsubw 2912(%r10), %ymm0, %ymm0 +vpaddw 5984(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3264(%r10) +vmovdqa %ymm1, 3616(%r10) +vmovdqa 3296(%r10), %ymm0 +vpsubw 3648(%r10), %ymm0, %ymm0 +vmovdqa 6368(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4000(%r10), %ymm1, %ymm1 +vpsubw 2944(%r10), %ymm0, %ymm0 +vpaddw 6016(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3296(%r10) +vmovdqa %ymm1, 3648(%r10) +vmovdqa 3328(%r10), %ymm0 +vpsubw 3680(%r10), %ymm0, %ymm0 +vmovdqa 6400(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4032(%r10), %ymm1, %ymm1 +vpsubw 2976(%r10), %ymm0, %ymm0 +vpaddw 6048(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3328(%r10) +vmovdqa %ymm1, 3680(%r10) +vmovdqa 3360(%r10), %ymm0 +vpsubw 3712(%r10), %ymm0, %ymm0 +vmovdqa 6432(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4064(%r10), %ymm1, %ymm1 +vpsubw 3008(%r10), %ymm0, %ymm0 +vpaddw 6080(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3360(%r10) +vmovdqa %ymm1, 3712(%r10) +vmovdqa 3392(%r10), %ymm0 +vpsubw 3744(%r10), %ymm0, %ymm0 +vmovdqa 6464(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4096(%r10), %ymm1, %ymm1 +vpsubw 3040(%r10), %ymm0, %ymm0 +vpaddw 6112(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3392(%r10) +vmovdqa %ymm1, 3744(%r10) +vmovdqa 3424(%r10), %ymm0 +vpsubw 3776(%r10), %ymm0, %ymm0 +vmovdqa 6496(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4128(%r10), %ymm1, %ymm1 +vpsubw 3072(%r10), %ymm0, %ymm0 +vpaddw 6144(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3424(%r10) +vmovdqa %ymm1, 3776(%r10) +vmovdqa 3456(%r10), %ymm0 +vpsubw 3808(%r10), %ymm0, %ymm0 +vmovdqa 6528(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 4160(%r10), %ymm1, %ymm1 +vpsubw 3104(%r10), %ymm0, %ymm0 +vpaddw 6176(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3456(%r10) +vmovdqa %ymm1, 3808(%r10) +neg %ecx +jns done_4eced63f144beffcb0247f9c6f67d165 +add $704, %r9 +add $1408, %r10 +jmp innerloop_4eced63f144beffcb0247f9c6f67d165 +done_4eced63f144beffcb0247f9c6f67d165: +sub $704, %r9 +sub $1408, %r10 +vmovdqa 0(%r9), %ymm0 +vpaddw 704(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6592(%r8) +vmovdqa 1408(%r9), %ymm0 +vpaddw 2112(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7296(%r8) +vmovdqa 32(%r9), %ymm0 +vpaddw 736(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6624(%r8) +vmovdqa 1440(%r9), %ymm0 +vpaddw 2144(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7328(%r8) +vmovdqa 64(%r9), %ymm0 +vpaddw 768(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6656(%r8) +vmovdqa 1472(%r9), %ymm0 +vpaddw 2176(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7360(%r8) +vmovdqa 96(%r9), %ymm0 +vpaddw 800(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6688(%r8) +vmovdqa 1504(%r9), %ymm0 +vpaddw 2208(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7392(%r8) +vmovdqa 128(%r9), %ymm0 +vpaddw 832(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6720(%r8) +vmovdqa 1536(%r9), %ymm0 +vpaddw 2240(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7424(%r8) +vmovdqa 160(%r9), %ymm0 +vpaddw 864(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6752(%r8) +vmovdqa 1568(%r9), %ymm0 +vpaddw 2272(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7456(%r8) +vmovdqa 192(%r9), %ymm0 +vpaddw 896(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6784(%r8) +vmovdqa 1600(%r9), %ymm0 +vpaddw 2304(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7488(%r8) +vmovdqa 224(%r9), %ymm0 +vpaddw 928(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6816(%r8) +vmovdqa 1632(%r9), %ymm0 +vpaddw 2336(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7520(%r8) +vmovdqa 256(%r9), %ymm0 +vpaddw 960(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6848(%r8) +vmovdqa 1664(%r9), %ymm0 +vpaddw 2368(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7552(%r8) +vmovdqa 288(%r9), %ymm0 +vpaddw 992(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6880(%r8) +vmovdqa 1696(%r9), %ymm0 +vpaddw 2400(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7584(%r8) +vmovdqa 320(%r9), %ymm0 +vpaddw 1024(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6912(%r8) +vmovdqa 1728(%r9), %ymm0 +vpaddw 2432(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7616(%r8) +vmovdqa 352(%r9), %ymm0 +vpaddw 1056(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6944(%r8) +vmovdqa 1760(%r9), %ymm0 +vpaddw 2464(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7648(%r8) +vmovdqa 384(%r9), %ymm0 +vpaddw 1088(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 6976(%r8) +vmovdqa 1792(%r9), %ymm0 +vpaddw 2496(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7680(%r8) +vmovdqa 416(%r9), %ymm0 +vpaddw 1120(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7008(%r8) +vmovdqa 1824(%r9), %ymm0 +vpaddw 2528(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7712(%r8) +vmovdqa 448(%r9), %ymm0 +vpaddw 1152(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7040(%r8) +vmovdqa 1856(%r9), %ymm0 +vpaddw 2560(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7744(%r8) +vmovdqa 480(%r9), %ymm0 +vpaddw 1184(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7072(%r8) +vmovdqa 1888(%r9), %ymm0 +vpaddw 2592(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7776(%r8) +vmovdqa 512(%r9), %ymm0 +vpaddw 1216(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7104(%r8) +vmovdqa 1920(%r9), %ymm0 +vpaddw 2624(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7808(%r8) +vmovdqa 544(%r9), %ymm0 +vpaddw 1248(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7136(%r8) +vmovdqa 1952(%r9), %ymm0 +vpaddw 2656(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7840(%r8) +vmovdqa 576(%r9), %ymm0 +vpaddw 1280(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7168(%r8) +vmovdqa 1984(%r9), %ymm0 +vpaddw 2688(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7872(%r8) +vmovdqa 608(%r9), %ymm0 +vpaddw 1312(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7200(%r8) +vmovdqa 2016(%r9), %ymm0 +vpaddw 2720(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7904(%r8) +vmovdqa 640(%r9), %ymm0 +vpaddw 1344(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7232(%r8) +vmovdqa 2048(%r9), %ymm0 +vpaddw 2752(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7936(%r8) +vmovdqa 672(%r9), %ymm0 +vpaddw 1376(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7264(%r8) +vmovdqa 2080(%r9), %ymm0 +vpaddw 2784(%r9), %ymm0, %ymm0 +vmovdqa %ymm0, 7968(%r8) +vmovdqa 6592(%r8), %ymm0 +vmovdqa 7296(%r8), %ymm6 +vmovdqa 6624(%r8), %ymm1 +vmovdqa 7328(%r8), %ymm7 +vmovdqa 6656(%r8), %ymm2 +vmovdqa 7360(%r8), %ymm8 +vmovdqa 6688(%r8), %ymm3 +vmovdqa 7392(%r8), %ymm9 +vmovdqa 6720(%r8), %ymm4 +vmovdqa 7424(%r8), %ymm10 +vmovdqa 6752(%r8), %ymm5 +vmovdqa 7456(%r8), %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 8000(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8032(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8064(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8096(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8128(%r8) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8160(%r8) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8192(%r8) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8224(%r8) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8256(%r8) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8288(%r8) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 8320(%r8) +vmovdqa 6784(%r8), %ymm0 +vmovdqa 7488(%r8), %ymm6 +vmovdqa 6816(%r8), %ymm1 +vmovdqa 7520(%r8), %ymm7 +vmovdqa 6848(%r8), %ymm2 +vmovdqa 7552(%r8), %ymm8 +vmovdqa 6880(%r8), %ymm3 +vmovdqa 7584(%r8), %ymm9 +vmovdqa 6912(%r8), %ymm4 +vmovdqa 7616(%r8), %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 8384(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8416(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8448(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8480(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8512(%r8) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8544(%r8) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8576(%r8) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8608(%r8) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 8640(%r8) +vpaddw 6592(%r8), %ymm0, %ymm0 +vpaddw 7296(%r8), %ymm6, %ymm6 +vpaddw 6624(%r8), %ymm1, %ymm1 +vpaddw 7328(%r8), %ymm7, %ymm7 +vpaddw 6656(%r8), %ymm2, %ymm2 +vpaddw 7360(%r8), %ymm8, %ymm8 +vpaddw 6688(%r8), %ymm3, %ymm3 +vpaddw 7392(%r8), %ymm9, %ymm9 +vpaddw 6720(%r8), %ymm4, %ymm4 +vpaddw 7424(%r8), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 8160(%r8), %ymm12, %ymm12 +vpsubw 8544(%r8), %ymm12, %ymm12 +vmovdqa %ymm12, 8352(%r8) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 8192(%r8), %ymm0 +vpsubw 8384(%r8), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 8576(%r8), %ymm6, %ymm6 +vmovdqa %ymm6, 8384(%r8) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 8000(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8192(%r8) +vmovdqa 8224(%r8), %ymm1 +vpsubw 8416(%r8), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 8608(%r8), %ymm7, %ymm7 +vmovdqa %ymm7, 8416(%r8) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 8032(%r8), %ymm1, %ymm1 +vmovdqa %ymm1, 8224(%r8) +vmovdqa 8256(%r8), %ymm2 +vpsubw 8448(%r8), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 8640(%r8), %ymm8, %ymm8 +vmovdqa %ymm8, 8448(%r8) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 8064(%r8), %ymm2, %ymm2 +vmovdqa %ymm2, 8256(%r8) +vmovdqa 8288(%r8), %ymm3 +vpsubw 8480(%r8), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 8480(%r8) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 8096(%r8), %ymm3, %ymm3 +vmovdqa %ymm3, 8288(%r8) +vmovdqa 8320(%r8), %ymm4 +vpsubw 8512(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 8128(%r8), %ymm4, %ymm4 +vmovdqa %ymm4, 8320(%r8) +vmovdqa 6944(%r8), %ymm0 +vmovdqa 7648(%r8), %ymm6 +vmovdqa 6976(%r8), %ymm1 +vmovdqa 7680(%r8), %ymm7 +vmovdqa 7008(%r8), %ymm2 +vmovdqa 7712(%r8), %ymm8 +vmovdqa 7040(%r8), %ymm3 +vmovdqa 7744(%r8), %ymm9 +vmovdqa 7072(%r8), %ymm4 +vmovdqa 7776(%r8), %ymm10 +vmovdqa 7104(%r8), %ymm5 +vmovdqa 7808(%r8), %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 8704(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8736(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8768(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8800(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8832(%r8) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8864(%r8) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8896(%r8) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8928(%r8) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 8960(%r8) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 8992(%r8) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 9024(%r8) +vmovdqa 7136(%r8), %ymm0 +vmovdqa 7840(%r8), %ymm6 +vmovdqa 7168(%r8), %ymm1 +vmovdqa 7872(%r8), %ymm7 +vmovdqa 7200(%r8), %ymm2 +vmovdqa 7904(%r8), %ymm8 +vmovdqa 7232(%r8), %ymm3 +vmovdqa 7936(%r8), %ymm9 +vmovdqa 7264(%r8), %ymm4 +vmovdqa 7968(%r8), %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 9088(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 9120(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 9152(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 9184(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 9216(%r8) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 9248(%r8) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 9280(%r8) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 9312(%r8) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 9344(%r8) +vpaddw 6944(%r8), %ymm0, %ymm0 +vpaddw 7648(%r8), %ymm6, %ymm6 +vpaddw 6976(%r8), %ymm1, %ymm1 +vpaddw 7680(%r8), %ymm7, %ymm7 +vpaddw 7008(%r8), %ymm2, %ymm2 +vpaddw 7712(%r8), %ymm8, %ymm8 +vpaddw 7040(%r8), %ymm3, %ymm3 +vpaddw 7744(%r8), %ymm9, %ymm9 +vpaddw 7072(%r8), %ymm4, %ymm4 +vpaddw 7776(%r8), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 8864(%r8), %ymm12, %ymm12 +vpsubw 9248(%r8), %ymm12, %ymm12 +vmovdqa %ymm12, 9056(%r8) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 8896(%r8), %ymm0 +vpsubw 9088(%r8), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 9280(%r8), %ymm6, %ymm6 +vmovdqa %ymm6, 9088(%r8) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 8704(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8896(%r8) +vmovdqa 8928(%r8), %ymm1 +vpsubw 9120(%r8), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 9312(%r8), %ymm7, %ymm7 +vmovdqa %ymm7, 9120(%r8) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 8736(%r8), %ymm1, %ymm1 +vmovdqa %ymm1, 8928(%r8) +vmovdqa 8960(%r8), %ymm2 +vpsubw 9152(%r8), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 9344(%r8), %ymm8, %ymm8 +vmovdqa %ymm8, 9152(%r8) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 8768(%r8), %ymm2, %ymm2 +vmovdqa %ymm2, 8960(%r8) +vmovdqa 8992(%r8), %ymm3 +vpsubw 9184(%r8), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 9184(%r8) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 8800(%r8), %ymm3, %ymm3 +vmovdqa %ymm3, 8992(%r8) +vmovdqa 9024(%r8), %ymm4 +vpsubw 9216(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 8832(%r8), %ymm4, %ymm4 +vmovdqa %ymm4, 9024(%r8) +vmovdqa 6592(%r8), %ymm0 +vmovdqa 7296(%r8), %ymm6 +vpaddw 6944(%r8), %ymm0, %ymm0 +vpaddw 7648(%r8), %ymm6, %ymm6 +vmovdqa 6624(%r8), %ymm1 +vmovdqa 7328(%r8), %ymm7 +vpaddw 6976(%r8), %ymm1, %ymm1 +vpaddw 7680(%r8), %ymm7, %ymm7 +vmovdqa 6656(%r8), %ymm2 +vmovdqa 7360(%r8), %ymm8 +vpaddw 7008(%r8), %ymm2, %ymm2 +vpaddw 7712(%r8), %ymm8, %ymm8 +vmovdqa 6688(%r8), %ymm3 +vmovdqa 7392(%r8), %ymm9 +vpaddw 7040(%r8), %ymm3, %ymm3 +vpaddw 7744(%r8), %ymm9, %ymm9 +vmovdqa 6720(%r8), %ymm4 +vmovdqa 7424(%r8), %ymm10 +vpaddw 7072(%r8), %ymm4, %ymm4 +vpaddw 7776(%r8), %ymm10, %ymm10 +vmovdqa 6752(%r8), %ymm5 +vmovdqa 7456(%r8), %ymm11 +vpaddw 7104(%r8), %ymm5, %ymm5 +vpaddw 7808(%r8), %ymm11, %ymm11 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 5888(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 5920(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 5952(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 5984(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6016(%r8) +vpmullw %ymm0, %ymm11, %ymm13 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6048(%r8) +vpmullw %ymm1, %ymm11, %ymm12 +vpmullw %ymm2, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6080(%r8) +vpmullw %ymm2, %ymm11, %ymm13 +vpmullw %ymm3, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm5, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6112(%r8) +vpmullw %ymm3, %ymm11, %ymm12 +vpmullw %ymm4, %ymm10, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm5, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6144(%r8) +vpmullw %ymm4, %ymm11, %ymm13 +vpmullw %ymm5, %ymm10, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6176(%r8) +vpmullw %ymm5, %ymm11, %ymm12 +vmovdqa %ymm12, 6208(%r8) +vmovdqa 6784(%r8), %ymm0 +vmovdqa 7488(%r8), %ymm6 +vpaddw 7136(%r8), %ymm0, %ymm0 +vpaddw 7840(%r8), %ymm6, %ymm6 +vmovdqa 6816(%r8), %ymm1 +vmovdqa 7520(%r8), %ymm7 +vpaddw 7168(%r8), %ymm1, %ymm1 +vpaddw 7872(%r8), %ymm7, %ymm7 +vmovdqa 6848(%r8), %ymm2 +vmovdqa 7552(%r8), %ymm8 +vpaddw 7200(%r8), %ymm2, %ymm2 +vpaddw 7904(%r8), %ymm8, %ymm8 +vmovdqa 6880(%r8), %ymm3 +vmovdqa 7584(%r8), %ymm9 +vpaddw 7232(%r8), %ymm3, %ymm3 +vpaddw 7936(%r8), %ymm9, %ymm9 +vmovdqa 6912(%r8), %ymm4 +vmovdqa 7616(%r8), %ymm10 +vpaddw 7264(%r8), %ymm4, %ymm4 +vpaddw 7968(%r8), %ymm10, %ymm10 +vpmullw %ymm0, %ymm6, %ymm12 +vmovdqa %ymm12, 6272(%r8) +vpmullw %ymm0, %ymm7, %ymm13 +vpmullw %ymm1, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6304(%r8) +vpmullw %ymm0, %ymm8, %ymm12 +vpmullw %ymm1, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6336(%r8) +vpmullw %ymm0, %ymm9, %ymm13 +vpmullw %ymm1, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm2, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm6, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6368(%r8) +vpmullw %ymm0, %ymm10, %ymm12 +vpmullw %ymm1, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm2, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm3, %ymm7, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm6, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6400(%r8) +vpmullw %ymm1, %ymm10, %ymm13 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6432(%r8) +vpmullw %ymm2, %ymm10, %ymm12 +vpmullw %ymm3, %ymm9, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vpmullw %ymm4, %ymm8, %ymm15 +vpaddw %ymm12, %ymm15, %ymm12 +vmovdqa %ymm12, 6464(%r8) +vpmullw %ymm3, %ymm10, %ymm13 +vpmullw %ymm4, %ymm9, %ymm15 +vpaddw %ymm13, %ymm15, %ymm13 +vmovdqa %ymm13, 6496(%r8) +vpmullw %ymm4, %ymm10, %ymm12 +vmovdqa %ymm12, 6528(%r8) +vpaddw 6592(%r8), %ymm0, %ymm0 +vpaddw 7296(%r8), %ymm6, %ymm6 +vpaddw 6944(%r8), %ymm0, %ymm0 +vpaddw 7648(%r8), %ymm6, %ymm6 +vpaddw 6624(%r8), %ymm1, %ymm1 +vpaddw 7328(%r8), %ymm7, %ymm7 +vpaddw 6976(%r8), %ymm1, %ymm1 +vpaddw 7680(%r8), %ymm7, %ymm7 +vpaddw 6656(%r8), %ymm2, %ymm2 +vpaddw 7360(%r8), %ymm8, %ymm8 +vpaddw 7008(%r8), %ymm2, %ymm2 +vpaddw 7712(%r8), %ymm8, %ymm8 +vpaddw 6688(%r8), %ymm3, %ymm3 +vpaddw 7392(%r8), %ymm9, %ymm9 +vpaddw 7040(%r8), %ymm3, %ymm3 +vpaddw 7744(%r8), %ymm9, %ymm9 +vpaddw 6720(%r8), %ymm4, %ymm4 +vpaddw 7424(%r8), %ymm10, %ymm10 +vpaddw 7072(%r8), %ymm4, %ymm4 +vpaddw 7776(%r8), %ymm10, %ymm10 +vpmullw %ymm0, %ymm11, %ymm12 +vpmullw %ymm1, %ymm10, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm2, %ymm9, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm3, %ymm8, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm4, %ymm7, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpmullw %ymm5, %ymm6, %ymm15 +vpaddw %ymm15, %ymm12, %ymm12 +vpsubw 6048(%r8), %ymm12, %ymm12 +vpsubw 6432(%r8), %ymm12, %ymm12 +vmovdqa %ymm12, 6240(%r8) +vpmullw %ymm5, %ymm7, %ymm12 +vpmullw %ymm5, %ymm8, %ymm13 +vpmullw %ymm5, %ymm9, %ymm14 +vpmullw %ymm5, %ymm10, %ymm15 +vpmullw %ymm1, %ymm11, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm10, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm3, %ymm9, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm4, %ymm8, %ymm5 +vpaddw %ymm5, %ymm12, %ymm12 +vpmullw %ymm2, %ymm11, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm10, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm4, %ymm9, %ymm5 +vpaddw %ymm5, %ymm13, %ymm13 +vpmullw %ymm3, %ymm11, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm10, %ymm5 +vpaddw %ymm5, %ymm14, %ymm14 +vpmullw %ymm4, %ymm11, %ymm5 +vpaddw %ymm5, %ymm15, %ymm15 +vpmullw %ymm0, %ymm10, %ymm11 +vpmullw %ymm1, %ymm9, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm2, %ymm8, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm3, %ymm7, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm4, %ymm6, %ymm5 +vpaddw %ymm5, %ymm11, %ymm11 +vpmullw %ymm0, %ymm9, %ymm10 +vpmullw %ymm1, %ymm8, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm2, %ymm7, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm3, %ymm6, %ymm5 +vpaddw %ymm5, %ymm10, %ymm10 +vpmullw %ymm0, %ymm8, %ymm9 +vpmullw %ymm1, %ymm7, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm2, %ymm6, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vpmullw %ymm0, %ymm7, %ymm8 +vpmullw %ymm1, %ymm6, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vpmullw %ymm0, %ymm6, %ymm7 +vmovdqa 6080(%r8), %ymm0 +vpsubw 6272(%r8), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm6 +vpsubw 6464(%r8), %ymm6, %ymm6 +vmovdqa %ymm6, 6272(%r8) +vpaddw %ymm7, %ymm0, %ymm0 +vpsubw 5888(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 6080(%r8) +vmovdqa 6112(%r8), %ymm1 +vpsubw 6304(%r8), %ymm1, %ymm1 +vpsubw %ymm1, %ymm13, %ymm7 +vpsubw 6496(%r8), %ymm7, %ymm7 +vmovdqa %ymm7, 6304(%r8) +vpaddw %ymm8, %ymm1, %ymm1 +vpsubw 5920(%r8), %ymm1, %ymm1 +vmovdqa %ymm1, 6112(%r8) +vmovdqa 6144(%r8), %ymm2 +vpsubw 6336(%r8), %ymm2, %ymm2 +vpsubw %ymm2, %ymm14, %ymm8 +vpsubw 6528(%r8), %ymm8, %ymm8 +vmovdqa %ymm8, 6336(%r8) +vpaddw %ymm9, %ymm2, %ymm2 +vpsubw 5952(%r8), %ymm2, %ymm2 +vmovdqa %ymm2, 6144(%r8) +vmovdqa 6176(%r8), %ymm3 +vpsubw 6368(%r8), %ymm3, %ymm3 +vpsubw %ymm3, %ymm15, %ymm9 +vmovdqa %ymm9, 6368(%r8) +vpaddw %ymm10, %ymm3, %ymm3 +vpsubw 5984(%r8), %ymm3, %ymm3 +vmovdqa %ymm3, 6176(%r8) +vmovdqa 6208(%r8), %ymm4 +vpsubw 6400(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vpsubw 6016(%r8), %ymm4, %ymm4 +vmovdqa %ymm4, 6208(%r8) +vmovdqa 8352(%r8), %ymm0 +vpsubw 8704(%r8), %ymm0, %ymm0 +vmovdqa 6240(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9056(%r8), %ymm1, %ymm6 +vpsubw 8000(%r8), %ymm0, %ymm0 +vpaddw 5888(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8352(%r8) +vmovdqa 8384(%r8), %ymm0 +vpsubw 8736(%r8), %ymm0, %ymm0 +vmovdqa 6272(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9088(%r8), %ymm1, %ymm7 +vpsubw 8032(%r8), %ymm0, %ymm0 +vpaddw 5920(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8384(%r8) +vmovdqa 8416(%r8), %ymm0 +vpsubw 8768(%r8), %ymm0, %ymm0 +vmovdqa 6304(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9120(%r8), %ymm1, %ymm8 +vpsubw 8064(%r8), %ymm0, %ymm0 +vpaddw 5952(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8416(%r8) +vmovdqa 8448(%r8), %ymm0 +vpsubw 8800(%r8), %ymm0, %ymm0 +vmovdqa 6336(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9152(%r8), %ymm1, %ymm9 +vpsubw 8096(%r8), %ymm0, %ymm0 +vpaddw 5984(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8448(%r8) +vmovdqa 8480(%r8), %ymm0 +vpsubw 8832(%r8), %ymm0, %ymm0 +vmovdqa 6368(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9184(%r8), %ymm1, %ymm10 +vpsubw 8128(%r8), %ymm0, %ymm0 +vpaddw 6016(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8480(%r8) +vmovdqa 8512(%r8), %ymm0 +vpsubw 8864(%r8), %ymm0, %ymm0 +vmovdqa 6400(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9216(%r8), %ymm1, %ymm11 +vpsubw 8160(%r8), %ymm0, %ymm0 +vpaddw 6048(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8512(%r8) +vmovdqa 8544(%r8), %ymm0 +vpsubw 8896(%r8), %ymm0, %ymm0 +vmovdqa 6432(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9248(%r8), %ymm1, %ymm12 +vpsubw 8192(%r8), %ymm0, %ymm0 +vpaddw 6080(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8544(%r8) +vmovdqa 8576(%r8), %ymm0 +vpsubw 8928(%r8), %ymm0, %ymm0 +vmovdqa 6464(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9280(%r8), %ymm1, %ymm13 +vpsubw 8224(%r8), %ymm0, %ymm0 +vpaddw 6112(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8576(%r8) +vmovdqa 8608(%r8), %ymm0 +vpsubw 8960(%r8), %ymm0, %ymm0 +vmovdqa 6496(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9312(%r8), %ymm1, %ymm14 +vpsubw 8256(%r8), %ymm0, %ymm0 +vpaddw 6144(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8608(%r8) +vmovdqa 8640(%r8), %ymm0 +vpsubw 8992(%r8), %ymm0, %ymm0 +vmovdqa 6528(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 9344(%r8), %ymm1, %ymm15 +vpsubw 8288(%r8), %ymm0, %ymm0 +vpaddw 6176(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 8640(%r8) +vmovdqa 6208(%r8), %ymm0 +vpsubw 8320(%r8), %ymm0, %ymm0 +vpsubw 9024(%r8), %ymm0, %ymm0 +vpsubw 3488(%r10), %ymm0, %ymm0 +vpsubw 4896(%r10), %ymm0, %ymm0 +vmovdqa %ymm0, 4192(%r10) +vmovdqa 3520(%r10), %ymm0 +vpsubw 4224(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm6, %ymm6 +vpsubw 4928(%r10), %ymm6, %ymm6 +vpsubw 2816(%r10), %ymm0, %ymm0 +vpaddw 8000(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3520(%r10) +vmovdqa %ymm6, 4224(%r10) +vmovdqa 3552(%r10), %ymm0 +vpsubw 4256(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm7, %ymm7 +vpsubw 4960(%r10), %ymm7, %ymm7 +vpsubw 2848(%r10), %ymm0, %ymm0 +vpaddw 8032(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3552(%r10) +vmovdqa %ymm7, 4256(%r10) +vmovdqa 3584(%r10), %ymm0 +vpsubw 4288(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm8, %ymm8 +vpsubw 4992(%r10), %ymm8, %ymm8 +vpsubw 2880(%r10), %ymm0, %ymm0 +vpaddw 8064(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3584(%r10) +vmovdqa %ymm8, 4288(%r10) +vmovdqa 3616(%r10), %ymm0 +vpsubw 4320(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm9, %ymm9 +vpsubw 5024(%r10), %ymm9, %ymm9 +vpsubw 2912(%r10), %ymm0, %ymm0 +vpaddw 8096(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3616(%r10) +vmovdqa %ymm9, 4320(%r10) +vmovdqa 3648(%r10), %ymm0 +vpsubw 4352(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm10, %ymm10 +vpsubw 5056(%r10), %ymm10, %ymm10 +vpsubw 2944(%r10), %ymm0, %ymm0 +vpaddw 8128(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3648(%r10) +vmovdqa %ymm10, 4352(%r10) +vmovdqa 3680(%r10), %ymm0 +vpsubw 4384(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm11, %ymm11 +vpsubw 5088(%r10), %ymm11, %ymm11 +vpsubw 2976(%r10), %ymm0, %ymm0 +vpaddw 8160(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3680(%r10) +vmovdqa %ymm11, 4384(%r10) +vmovdqa 3712(%r10), %ymm0 +vpsubw 4416(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm12, %ymm12 +vpsubw 5120(%r10), %ymm12, %ymm12 +vpsubw 3008(%r10), %ymm0, %ymm0 +vpaddw 8192(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3712(%r10) +vmovdqa %ymm12, 4416(%r10) +vmovdqa 3744(%r10), %ymm0 +vpsubw 4448(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm13, %ymm13 +vpsubw 5152(%r10), %ymm13, %ymm13 +vpsubw 3040(%r10), %ymm0, %ymm0 +vpaddw 8224(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3744(%r10) +vmovdqa %ymm13, 4448(%r10) +vmovdqa 3776(%r10), %ymm0 +vpsubw 4480(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm14, %ymm14 +vpsubw 5184(%r10), %ymm14, %ymm14 +vpsubw 3072(%r10), %ymm0, %ymm0 +vpaddw 8256(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3776(%r10) +vmovdqa %ymm14, 4480(%r10) +vmovdqa 3808(%r10), %ymm0 +vpsubw 4512(%r10), %ymm0, %ymm0 +vpsubw %ymm0, %ymm15, %ymm15 +vpsubw 5216(%r10), %ymm15, %ymm15 +vpsubw 3104(%r10), %ymm0, %ymm0 +vpaddw 8288(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3808(%r10) +vmovdqa %ymm15, 4512(%r10) +vmovdqa 3840(%r10), %ymm0 +vpsubw 4544(%r10), %ymm0, %ymm0 +vmovdqa 9024(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5248(%r10), %ymm1, %ymm1 +vpsubw 3136(%r10), %ymm0, %ymm0 +vpaddw 8320(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3840(%r10) +vmovdqa %ymm1, 4544(%r10) +vmovdqa 3872(%r10), %ymm0 +vpsubw 4576(%r10), %ymm0, %ymm0 +vmovdqa 9056(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5280(%r10), %ymm1, %ymm1 +vpsubw 3168(%r10), %ymm0, %ymm0 +vpaddw 8352(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3872(%r10) +vmovdqa %ymm1, 4576(%r10) +vmovdqa 3904(%r10), %ymm0 +vpsubw 4608(%r10), %ymm0, %ymm0 +vmovdqa 9088(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5312(%r10), %ymm1, %ymm1 +vpsubw 3200(%r10), %ymm0, %ymm0 +vpaddw 8384(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3904(%r10) +vmovdqa %ymm1, 4608(%r10) +vmovdqa 3936(%r10), %ymm0 +vpsubw 4640(%r10), %ymm0, %ymm0 +vmovdqa 9120(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5344(%r10), %ymm1, %ymm1 +vpsubw 3232(%r10), %ymm0, %ymm0 +vpaddw 8416(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3936(%r10) +vmovdqa %ymm1, 4640(%r10) +vmovdqa 3968(%r10), %ymm0 +vpsubw 4672(%r10), %ymm0, %ymm0 +vmovdqa 9152(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5376(%r10), %ymm1, %ymm1 +vpsubw 3264(%r10), %ymm0, %ymm0 +vpaddw 8448(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 3968(%r10) +vmovdqa %ymm1, 4672(%r10) +vmovdqa 4000(%r10), %ymm0 +vpsubw 4704(%r10), %ymm0, %ymm0 +vmovdqa 9184(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5408(%r10), %ymm1, %ymm1 +vpsubw 3296(%r10), %ymm0, %ymm0 +vpaddw 8480(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4000(%r10) +vmovdqa %ymm1, 4704(%r10) +vmovdqa 4032(%r10), %ymm0 +vpsubw 4736(%r10), %ymm0, %ymm0 +vmovdqa 9216(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5440(%r10), %ymm1, %ymm1 +vpsubw 3328(%r10), %ymm0, %ymm0 +vpaddw 8512(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4032(%r10) +vmovdqa %ymm1, 4736(%r10) +vmovdqa 4064(%r10), %ymm0 +vpsubw 4768(%r10), %ymm0, %ymm0 +vmovdqa 9248(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5472(%r10), %ymm1, %ymm1 +vpsubw 3360(%r10), %ymm0, %ymm0 +vpaddw 8544(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4064(%r10) +vmovdqa %ymm1, 4768(%r10) +vmovdqa 4096(%r10), %ymm0 +vpsubw 4800(%r10), %ymm0, %ymm0 +vmovdqa 9280(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5504(%r10), %ymm1, %ymm1 +vpsubw 3392(%r10), %ymm0, %ymm0 +vpaddw 8576(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4096(%r10) +vmovdqa %ymm1, 4800(%r10) +vmovdqa 4128(%r10), %ymm0 +vpsubw 4832(%r10), %ymm0, %ymm0 +vmovdqa 9312(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5536(%r10), %ymm1, %ymm1 +vpsubw 3424(%r10), %ymm0, %ymm0 +vpaddw 8608(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4128(%r10) +vmovdqa %ymm1, 4832(%r10) +vmovdqa 4160(%r10), %ymm0 +vpsubw 4864(%r10), %ymm0, %ymm0 +vmovdqa 9344(%r8), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5568(%r10), %ymm1, %ymm1 +vpsubw 3456(%r10), %ymm0, %ymm0 +vpaddw 8640(%r8), %ymm0, %ymm0 +vmovdqa %ymm0, 4160(%r10) +vmovdqa %ymm1, 4864(%r10) +vpxor %ymm1, %ymm1, %ymm1 +vmovdqa %ymm1, 5600(%r10) +subq $32, %r8 +vmovdqa 2816(%r10), %ymm0 +vmovdqa 2880(%r10), %ymm1 +vmovdqa 2944(%r10), %ymm2 +vmovdqa 3008(%r10), %ymm3 +vpunpcklwd 2848(%r10), %ymm0, %ymm4 +vpunpckhwd 2848(%r10), %ymm0, %ymm5 +vpunpcklwd 2912(%r10), %ymm1, %ymm6 +vpunpckhwd 2912(%r10), %ymm1, %ymm7 +vpunpcklwd 2976(%r10), %ymm2, %ymm8 +vpunpckhwd 2976(%r10), %ymm2, %ymm9 +vpunpcklwd 3040(%r10), %ymm3, %ymm10 +vpunpckhwd 3040(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 3072(%r10), %ymm0 +vmovdqa 3136(%r10), %ymm1 +vmovdqa 3200(%r10), %ymm2 +vmovdqa 3264(%r10), %ymm3 +vpunpcklwd 3104(%r10), %ymm0, %ymm12 +vpunpckhwd 3104(%r10), %ymm0, %ymm13 +vpunpcklwd 3168(%r10), %ymm1, %ymm14 +vpunpckhwd 3168(%r10), %ymm1, %ymm15 +vpunpcklwd 3232(%r10), %ymm2, %ymm0 +vpunpckhwd 3232(%r10), %ymm2, %ymm1 +vpunpcklwd 3296(%r10), %ymm3, %ymm2 +vpunpckhwd 3296(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 0(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 192(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 384(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 576(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 768(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 960(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1152(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1536(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1728(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 1920(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2112(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2304(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2496(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2688(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1344(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 2880(%r12) +vmovdqa 3328(%r10), %ymm0 +vmovdqa 3392(%r10), %ymm1 +vmovdqa 3456(%r10), %ymm2 +vmovdqa 3520(%r10), %ymm3 +vpunpcklwd 3360(%r10), %ymm0, %ymm4 +vpunpckhwd 3360(%r10), %ymm0, %ymm5 +vpunpcklwd 3424(%r10), %ymm1, %ymm6 +vpunpckhwd 3424(%r10), %ymm1, %ymm7 +vpunpcklwd 3488(%r10), %ymm2, %ymm8 +vpunpckhwd 3488(%r10), %ymm2, %ymm9 +vpunpcklwd 3552(%r10), %ymm3, %ymm10 +vpunpckhwd 3552(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 3584(%r10), %ymm0 +vmovdqa 3648(%r10), %ymm1 +vmovdqa 3712(%r10), %ymm2 +vmovdqa 3776(%r10), %ymm3 +vpunpcklwd 3616(%r10), %ymm0, %ymm12 +vpunpckhwd 3616(%r10), %ymm0, %ymm13 +vpunpcklwd 3680(%r10), %ymm1, %ymm14 +vpunpckhwd 3680(%r10), %ymm1, %ymm15 +vpunpcklwd 3744(%r10), %ymm2, %ymm0 +vpunpckhwd 3744(%r10), %ymm2, %ymm1 +vpunpcklwd 3808(%r10), %ymm3, %ymm2 +vpunpckhwd 3808(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 32(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 224(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 416(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 608(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 800(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 992(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1184(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1568(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1760(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 1952(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2144(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2336(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2528(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2720(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1376(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 2912(%r12) +vmovdqa 3840(%r10), %ymm0 +vmovdqa 3904(%r10), %ymm1 +vmovdqa 3968(%r10), %ymm2 +vmovdqa 4032(%r10), %ymm3 +vpunpcklwd 3872(%r10), %ymm0, %ymm4 +vpunpckhwd 3872(%r10), %ymm0, %ymm5 +vpunpcklwd 3936(%r10), %ymm1, %ymm6 +vpunpckhwd 3936(%r10), %ymm1, %ymm7 +vpunpcklwd 4000(%r10), %ymm2, %ymm8 +vpunpckhwd 4000(%r10), %ymm2, %ymm9 +vpunpcklwd 4064(%r10), %ymm3, %ymm10 +vpunpckhwd 4064(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 4096(%r10), %ymm0 +vmovdqa 4160(%r10), %ymm1 +vmovdqa 4224(%r10), %ymm2 +vmovdqa 4288(%r10), %ymm3 +vpunpcklwd 4128(%r10), %ymm0, %ymm12 +vpunpckhwd 4128(%r10), %ymm0, %ymm13 +vpunpcklwd 4192(%r10), %ymm1, %ymm14 +vpunpckhwd 4192(%r10), %ymm1, %ymm15 +vpunpcklwd 4256(%r10), %ymm2, %ymm0 +vpunpckhwd 4256(%r10), %ymm2, %ymm1 +vpunpcklwd 4320(%r10), %ymm3, %ymm2 +vpunpckhwd 4320(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 64(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 256(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 448(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 640(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 832(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1024(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1216(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1600(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1792(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 1984(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2176(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2368(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2560(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2752(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1408(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 2944(%r12) +vmovdqa 4224(%r10), %ymm0 +vmovdqa 4288(%r10), %ymm1 +vmovdqa 4352(%r10), %ymm2 +vmovdqa 4416(%r10), %ymm3 +vpunpcklwd 4256(%r10), %ymm0, %ymm4 +vpunpckhwd 4256(%r10), %ymm0, %ymm5 +vpunpcklwd 4320(%r10), %ymm1, %ymm6 +vpunpckhwd 4320(%r10), %ymm1, %ymm7 +vpunpcklwd 4384(%r10), %ymm2, %ymm8 +vpunpckhwd 4384(%r10), %ymm2, %ymm9 +vpunpcklwd 4448(%r10), %ymm3, %ymm10 +vpunpckhwd 4448(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 4480(%r10), %ymm0 +vmovdqa 4544(%r10), %ymm1 +vmovdqa 4608(%r10), %ymm2 +vmovdqa 4672(%r10), %ymm3 +vpunpcklwd 4512(%r10), %ymm0, %ymm12 +vpunpckhwd 4512(%r10), %ymm0, %ymm13 +vpunpcklwd 4576(%r10), %ymm1, %ymm14 +vpunpckhwd 4576(%r10), %ymm1, %ymm15 +vpunpcklwd 4640(%r10), %ymm2, %ymm0 +vpunpckhwd 4640(%r10), %ymm2, %ymm1 +vpunpcklwd 4704(%r10), %ymm3, %ymm2 +vpunpckhwd 4704(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 96(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 288(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 480(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 672(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 864(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1056(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1248(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1632(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1824(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 2016(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2208(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2400(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2592(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2784(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1440(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 2976(%r12) +vmovdqa 4736(%r10), %ymm0 +vmovdqa 4800(%r10), %ymm1 +vmovdqa 4864(%r10), %ymm2 +vmovdqa 4928(%r10), %ymm3 +vpunpcklwd 4768(%r10), %ymm0, %ymm4 +vpunpckhwd 4768(%r10), %ymm0, %ymm5 +vpunpcklwd 4832(%r10), %ymm1, %ymm6 +vpunpckhwd 4832(%r10), %ymm1, %ymm7 +vpunpcklwd 4896(%r10), %ymm2, %ymm8 +vpunpckhwd 4896(%r10), %ymm2, %ymm9 +vpunpcklwd 4960(%r10), %ymm3, %ymm10 +vpunpckhwd 4960(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 4992(%r10), %ymm0 +vmovdqa 5056(%r10), %ymm1 +vmovdqa 5120(%r10), %ymm2 +vmovdqa 5184(%r10), %ymm3 +vpunpcklwd 5024(%r10), %ymm0, %ymm12 +vpunpckhwd 5024(%r10), %ymm0, %ymm13 +vpunpcklwd 5088(%r10), %ymm1, %ymm14 +vpunpckhwd 5088(%r10), %ymm1, %ymm15 +vpunpcklwd 5152(%r10), %ymm2, %ymm0 +vpunpckhwd 5152(%r10), %ymm2, %ymm1 +vpunpcklwd 5216(%r10), %ymm3, %ymm2 +vpunpckhwd 5216(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 128(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 320(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 512(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 704(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 896(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1088(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1280(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1664(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1856(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 2048(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2240(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2432(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2624(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2816(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1472(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 3008(%r12) +vmovdqa 5248(%r10), %ymm0 +vmovdqa 5312(%r10), %ymm1 +vmovdqa 5376(%r10), %ymm2 +vmovdqa 5440(%r10), %ymm3 +vpunpcklwd 5280(%r10), %ymm0, %ymm4 +vpunpckhwd 5280(%r10), %ymm0, %ymm5 +vpunpcklwd 5344(%r10), %ymm1, %ymm6 +vpunpckhwd 5344(%r10), %ymm1, %ymm7 +vpunpcklwd 5408(%r10), %ymm2, %ymm8 +vpunpckhwd 5408(%r10), %ymm2, %ymm9 +vpunpcklwd 5472(%r10), %ymm3, %ymm10 +vpunpckhwd 5472(%r10), %ymm3, %ymm11 +vpunpckldq %ymm6, %ymm4, %ymm0 +vpunpckhdq %ymm6, %ymm4, %ymm1 +vpunpckldq %ymm7, %ymm5, %ymm2 +vpunpckhdq %ymm7, %ymm5, %ymm3 +vpunpckldq %ymm10, %ymm8, %ymm12 +vpunpckhdq %ymm10, %ymm8, %ymm13 +vpunpckldq %ymm11, %ymm9, %ymm14 +vpunpckhdq %ymm11, %ymm9, %ymm15 +vpunpcklqdq %ymm12, %ymm0, %ymm4 +vpunpckhqdq %ymm12, %ymm0, %ymm5 +vpunpcklqdq %ymm13, %ymm1, %ymm6 +vpunpckhqdq %ymm13, %ymm1, %ymm7 +vpunpcklqdq %ymm14, %ymm2, %ymm8 +vpunpckhqdq %ymm14, %ymm2, %ymm9 +vpunpcklqdq %ymm15, %ymm3, %ymm10 +vpunpckhqdq %ymm15, %ymm3, %ymm11 +vmovdqa 5504(%r10), %ymm0 +vmovdqa 5568(%r10), %ymm1 +vmovdqa 5632(%r10), %ymm2 +vmovdqa 5696(%r10), %ymm3 +vpunpcklwd 5536(%r10), %ymm0, %ymm12 +vpunpckhwd 5536(%r10), %ymm0, %ymm13 +vpunpcklwd 5600(%r10), %ymm1, %ymm14 +vpunpckhwd 5600(%r10), %ymm1, %ymm15 +vpunpcklwd 5664(%r10), %ymm2, %ymm0 +vpunpckhwd 5664(%r10), %ymm2, %ymm1 +vpunpcklwd 5728(%r10), %ymm3, %ymm2 +vpunpckhwd 5728(%r10), %ymm3, %ymm3 +vmovdqa %ymm11, 0(%r8) +vpunpckldq %ymm14, %ymm12, %ymm11 +vpunpckhdq %ymm14, %ymm12, %ymm12 +vpunpckldq %ymm15, %ymm13, %ymm14 +vpunpckhdq %ymm15, %ymm13, %ymm15 +vpunpckldq %ymm2, %ymm0, %ymm13 +vpunpckhdq %ymm2, %ymm0, %ymm0 +vpunpckldq %ymm3, %ymm1, %ymm2 +vpunpckhdq %ymm3, %ymm1, %ymm1 +vpunpcklqdq %ymm13, %ymm11, %ymm3 +vpunpckhqdq %ymm13, %ymm11, %ymm13 +vpunpcklqdq %ymm0, %ymm12, %ymm11 +vpunpckhqdq %ymm0, %ymm12, %ymm0 +vpunpcklqdq %ymm2, %ymm14, %ymm12 +vpunpckhqdq %ymm2, %ymm14, %ymm2 +vpunpcklqdq %ymm1, %ymm15, %ymm14 +vpunpckhqdq %ymm1, %ymm15, %ymm1 +vinserti128 $1, %xmm3, %ymm4, %ymm15 +vmovdqa %ymm15, 160(%r12) +vinserti128 $1, %xmm13, %ymm5, %ymm15 +vmovdqa %ymm15, 352(%r12) +vinserti128 $1, %xmm11, %ymm6, %ymm15 +vmovdqa %ymm15, 544(%r12) +vinserti128 $1, %xmm0, %ymm7, %ymm15 +vmovdqa %ymm15, 736(%r12) +vinserti128 $1, %xmm12, %ymm8, %ymm15 +vmovdqa %ymm15, 928(%r12) +vinserti128 $1, %xmm2, %ymm9, %ymm15 +vmovdqa %ymm15, 1120(%r12) +vinserti128 $1, %xmm14, %ymm10, %ymm15 +vmovdqa %ymm15, 1312(%r12) +vpermq $78, %ymm4, %ymm4 +vpermq $78, %ymm5, %ymm5 +vpermq $78, %ymm6, %ymm6 +vpermq $78, %ymm7, %ymm7 +vpermq $78, %ymm8, %ymm8 +vpermq $78, %ymm9, %ymm9 +vpermq $78, %ymm10, %ymm10 +vinserti128 $0, %xmm4, %ymm3, %ymm15 +vmovdqa %ymm15, 1696(%r12) +vinserti128 $0, %xmm5, %ymm13, %ymm15 +vmovdqa %ymm15, 1888(%r12) +vinserti128 $0, %xmm6, %ymm11, %ymm15 +vmovdqa %ymm15, 2080(%r12) +vinserti128 $0, %xmm7, %ymm0, %ymm15 +vmovdqa %ymm15, 2272(%r12) +vinserti128 $0, %xmm8, %ymm12, %ymm15 +vmovdqa %ymm15, 2464(%r12) +vinserti128 $0, %xmm9, %ymm2, %ymm15 +vmovdqa %ymm15, 2656(%r12) +vinserti128 $0, %xmm10, %ymm14, %ymm15 +vmovdqa %ymm15, 2848(%r12) +vmovdqa 0(%r8), %ymm11 +vinserti128 $1, %xmm1, %ymm11, %ymm14 +vmovdqa %ymm14, 1504(%r12) +vpermq $78, %ymm11, %ymm11 +vinserti128 $0, %xmm11, %ymm1, %ymm1 +vmovdqa %ymm1, 3040(%r12) +addq $32, %r8 +add $1536, %rax +add $1536, %r11 +add $3072, %r12 +dec %ecx +jnz karatsuba_loop_4eced63f144beffcb0247f9c6f67d165 +sub $12288, %r12 +add $9408-2400, %r8 +vpxor %ymm0, %ymm0, %ymm0 +vmovdqa %ymm0, 1792(%r8) +vmovdqa %ymm0, 1824(%r8) +vmovdqa %ymm0, 1856(%r8) +vmovdqa %ymm0, 1888(%r8) +vmovdqa %ymm0, 1920(%r8) +vmovdqa %ymm0, 1952(%r8) +vmovdqa %ymm0, 1984(%r8) +vmovdqa %ymm0, 2016(%r8) +vmovdqa %ymm0, 2048(%r8) +vmovdqa %ymm0, 2080(%r8) +vmovdqa %ymm0, 2112(%r8) +vmovdqa %ymm0, 2144(%r8) +vmovdqa %ymm0, 2176(%r8) +vmovdqa %ymm0, 2208(%r8) +vmovdqa %ymm0, 2240(%r8) +vmovdqa %ymm0, 2272(%r8) +vmovdqa %ymm0, 2304(%r8) +vmovdqa %ymm0, 2336(%r8) +vmovdqa %ymm0, 2368(%r8) +vmovdqa %ymm0, 2400(%r8) +vmovdqa %ymm0, 2432(%r8) +vmovdqa %ymm0, 2464(%r8) +vmovdqa %ymm0, 2496(%r8) +vmovdqa %ymm0, 2528(%r8) +vmovdqa %ymm0, 2560(%r8) +vmovdqa %ymm0, 2592(%r8) +vmovdqa %ymm0, 2624(%r8) +vmovdqa %ymm0, 2656(%r8) +vmovdqa %ymm0, 2688(%r8) +vmovdqa %ymm0, 2720(%r8) +vmovdqa %ymm0, 2752(%r8) +vmovdqa %ymm0, 2784(%r8) +vmovdqa const729(%rip), %ymm15 +vmovdqa const3_inv(%rip), %ymm14 +vmovdqa const5_inv(%rip), %ymm13 +vmovdqa const9(%rip), %ymm12 +vmovdqa 96(%r12), %ymm0 +vpsubw 192(%r12), %ymm0, %ymm0 +vmovdqa 480(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 288(%r12), %ymm1, %ymm1 +vpsubw 0(%r12), %ymm0, %ymm0 +vpaddw 384(%r12), %ymm0, %ymm0 +vmovdqa 672(%r12), %ymm2 +vpsubw 768(%r12), %ymm2, %ymm2 +vmovdqa 1056(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 864(%r12), %ymm3, %ymm3 +vpsubw 576(%r12), %ymm2, %ymm2 +vpaddw 960(%r12), %ymm2, %ymm2 +vmovdqa 1248(%r12), %ymm4 +vpsubw 1344(%r12), %ymm4, %ymm4 +vmovdqa 1632(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 1440(%r12), %ymm5, %ymm5 +vpsubw 1152(%r12), %ymm4, %ymm4 +vpaddw 1536(%r12), %ymm4, %ymm4 +vpsubw 576(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 0(%r12), %ymm1, %ymm1 +vpaddw 1152(%r12), %ymm1, %ymm1 +vmovdqa 288(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 1440(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 864(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 0(%r12), %ymm8 +vmovdqa 864(%r12), %ymm9 +vmovdqa %ymm8, 0(%r8) +vmovdqa %ymm0, 32(%r8) +vmovdqa %ymm1, 64(%r8) +vmovdqa %ymm7, 96(%r8) +vmovdqa %ymm5, 128(%r8) +vmovdqa %ymm2, 160(%r8) +vmovdqa %ymm3, 192(%r8) +vmovdqa %ymm9, 224(%r8) +vmovdqa 1824(%r12), %ymm0 +vpsubw 1920(%r12), %ymm0, %ymm0 +vmovdqa 2208(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 2016(%r12), %ymm1, %ymm1 +vpsubw 1728(%r12), %ymm0, %ymm0 +vpaddw 2112(%r12), %ymm0, %ymm0 +vmovdqa 2400(%r12), %ymm2 +vpsubw 2496(%r12), %ymm2, %ymm2 +vmovdqa 2784(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 2592(%r12), %ymm3, %ymm3 +vpsubw 2304(%r12), %ymm2, %ymm2 +vpaddw 2688(%r12), %ymm2, %ymm2 +vmovdqa 2976(%r12), %ymm4 +vpsubw 3072(%r12), %ymm4, %ymm4 +vmovdqa 3360(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 3168(%r12), %ymm5, %ymm5 +vpsubw 2880(%r12), %ymm4, %ymm4 +vpaddw 3264(%r12), %ymm4, %ymm4 +vpsubw 2304(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 1728(%r12), %ymm1, %ymm1 +vpaddw 2880(%r12), %ymm1, %ymm1 +vmovdqa 2016(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 3168(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 2592(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 1728(%r12), %ymm8 +vmovdqa 2592(%r12), %ymm9 +vmovdqa %ymm8, 256(%r8) +vmovdqa %ymm0, 288(%r8) +vmovdqa %ymm1, 320(%r8) +vmovdqa %ymm7, 352(%r8) +vmovdqa %ymm5, 384(%r8) +vmovdqa %ymm2, 416(%r8) +vmovdqa %ymm3, 448(%r8) +vmovdqa %ymm9, 480(%r8) +vmovdqa 3552(%r12), %ymm0 +vpsubw 3648(%r12), %ymm0, %ymm0 +vmovdqa 3936(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3744(%r12), %ymm1, %ymm1 +vpsubw 3456(%r12), %ymm0, %ymm0 +vpaddw 3840(%r12), %ymm0, %ymm0 +vmovdqa 4128(%r12), %ymm2 +vpsubw 4224(%r12), %ymm2, %ymm2 +vmovdqa 4512(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 4320(%r12), %ymm3, %ymm3 +vpsubw 4032(%r12), %ymm2, %ymm2 +vpaddw 4416(%r12), %ymm2, %ymm2 +vmovdqa 4704(%r12), %ymm4 +vpsubw 4800(%r12), %ymm4, %ymm4 +vmovdqa 5088(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 4896(%r12), %ymm5, %ymm5 +vpsubw 4608(%r12), %ymm4, %ymm4 +vpaddw 4992(%r12), %ymm4, %ymm4 +vpsubw 4032(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 3456(%r12), %ymm1, %ymm1 +vpaddw 4608(%r12), %ymm1, %ymm1 +vmovdqa 3744(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 4896(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 4320(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 3456(%r12), %ymm8 +vmovdqa 4320(%r12), %ymm9 +vmovdqa %ymm8, 512(%r8) +vmovdqa %ymm0, 544(%r8) +vmovdqa %ymm1, 576(%r8) +vmovdqa %ymm7, 608(%r8) +vmovdqa %ymm5, 640(%r8) +vmovdqa %ymm2, 672(%r8) +vmovdqa %ymm3, 704(%r8) +vmovdqa %ymm9, 736(%r8) +vmovdqa 5280(%r12), %ymm0 +vpsubw 5376(%r12), %ymm0, %ymm0 +vmovdqa 5664(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5472(%r12), %ymm1, %ymm1 +vpsubw 5184(%r12), %ymm0, %ymm0 +vpaddw 5568(%r12), %ymm0, %ymm0 +vmovdqa 5856(%r12), %ymm2 +vpsubw 5952(%r12), %ymm2, %ymm2 +vmovdqa 6240(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 6048(%r12), %ymm3, %ymm3 +vpsubw 5760(%r12), %ymm2, %ymm2 +vpaddw 6144(%r12), %ymm2, %ymm2 +vmovdqa 6432(%r12), %ymm4 +vpsubw 6528(%r12), %ymm4, %ymm4 +vmovdqa 6816(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 6624(%r12), %ymm5, %ymm5 +vpsubw 6336(%r12), %ymm4, %ymm4 +vpaddw 6720(%r12), %ymm4, %ymm4 +vpsubw 5760(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 5184(%r12), %ymm1, %ymm1 +vpaddw 6336(%r12), %ymm1, %ymm1 +vmovdqa 5472(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 6624(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 6048(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 5184(%r12), %ymm8 +vmovdqa 6048(%r12), %ymm9 +vmovdqa %ymm8, 768(%r8) +vmovdqa %ymm0, 800(%r8) +vmovdqa %ymm1, 832(%r8) +vmovdqa %ymm7, 864(%r8) +vmovdqa %ymm5, 896(%r8) +vmovdqa %ymm2, 928(%r8) +vmovdqa %ymm3, 960(%r8) +vmovdqa %ymm9, 992(%r8) +vmovdqa 7008(%r12), %ymm0 +vpsubw 7104(%r12), %ymm0, %ymm0 +vmovdqa 7392(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 7200(%r12), %ymm1, %ymm1 +vpsubw 6912(%r12), %ymm0, %ymm0 +vpaddw 7296(%r12), %ymm0, %ymm0 +vmovdqa 7584(%r12), %ymm2 +vpsubw 7680(%r12), %ymm2, %ymm2 +vmovdqa 7968(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 7776(%r12), %ymm3, %ymm3 +vpsubw 7488(%r12), %ymm2, %ymm2 +vpaddw 7872(%r12), %ymm2, %ymm2 +vmovdqa 8160(%r12), %ymm4 +vpsubw 8256(%r12), %ymm4, %ymm4 +vmovdqa 8544(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 8352(%r12), %ymm5, %ymm5 +vpsubw 8064(%r12), %ymm4, %ymm4 +vpaddw 8448(%r12), %ymm4, %ymm4 +vpsubw 7488(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 6912(%r12), %ymm1, %ymm1 +vpaddw 8064(%r12), %ymm1, %ymm1 +vmovdqa 7200(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 8352(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 7776(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 6912(%r12), %ymm8 +vmovdqa 7776(%r12), %ymm9 +vmovdqa %ymm8, 1024(%r8) +vmovdqa %ymm0, 1056(%r8) +vmovdqa %ymm1, 1088(%r8) +vmovdqa %ymm7, 1120(%r8) +vmovdqa %ymm5, 1152(%r8) +vmovdqa %ymm2, 1184(%r8) +vmovdqa %ymm3, 1216(%r8) +vmovdqa %ymm9, 1248(%r8) +vmovdqa 8736(%r12), %ymm0 +vpsubw 8832(%r12), %ymm0, %ymm0 +vmovdqa 9120(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 8928(%r12), %ymm1, %ymm1 +vpsubw 8640(%r12), %ymm0, %ymm0 +vpaddw 9024(%r12), %ymm0, %ymm0 +vmovdqa 9312(%r12), %ymm2 +vpsubw 9408(%r12), %ymm2, %ymm2 +vmovdqa 9696(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 9504(%r12), %ymm3, %ymm3 +vpsubw 9216(%r12), %ymm2, %ymm2 +vpaddw 9600(%r12), %ymm2, %ymm2 +vmovdqa 9888(%r12), %ymm4 +vpsubw 9984(%r12), %ymm4, %ymm4 +vmovdqa 10272(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 10080(%r12), %ymm5, %ymm5 +vpsubw 9792(%r12), %ymm4, %ymm4 +vpaddw 10176(%r12), %ymm4, %ymm4 +vpsubw 9216(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 8640(%r12), %ymm1, %ymm1 +vpaddw 9792(%r12), %ymm1, %ymm1 +vmovdqa 8928(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 10080(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 9504(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 8640(%r12), %ymm8 +vmovdqa 9504(%r12), %ymm9 +vmovdqa %ymm8, 1280(%r8) +vmovdqa %ymm0, 1312(%r8) +vmovdqa %ymm1, 1344(%r8) +vmovdqa %ymm7, 1376(%r8) +vmovdqa %ymm5, 1408(%r8) +vmovdqa %ymm2, 1440(%r8) +vmovdqa %ymm3, 1472(%r8) +vmovdqa %ymm9, 1504(%r8) +vmovdqa 10464(%r12), %ymm0 +vpsubw 10560(%r12), %ymm0, %ymm0 +vmovdqa 10848(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 10656(%r12), %ymm1, %ymm1 +vpsubw 10368(%r12), %ymm0, %ymm0 +vpaddw 10752(%r12), %ymm0, %ymm0 +vmovdqa 11040(%r12), %ymm2 +vpsubw 11136(%r12), %ymm2, %ymm2 +vmovdqa 11424(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 11232(%r12), %ymm3, %ymm3 +vpsubw 10944(%r12), %ymm2, %ymm2 +vpaddw 11328(%r12), %ymm2, %ymm2 +vmovdqa 11616(%r12), %ymm4 +vpsubw 11712(%r12), %ymm4, %ymm4 +vmovdqa 12000(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 11808(%r12), %ymm5, %ymm5 +vpsubw 11520(%r12), %ymm4, %ymm4 +vpaddw 11904(%r12), %ymm4, %ymm4 +vpsubw 10944(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 10368(%r12), %ymm1, %ymm1 +vpaddw 11520(%r12), %ymm1, %ymm1 +vmovdqa 10656(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 11808(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 11232(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 10368(%r12), %ymm8 +vmovdqa 11232(%r12), %ymm9 +vmovdqa %ymm8, 1536(%r8) +vmovdqa %ymm0, 1568(%r8) +vmovdqa %ymm1, 1600(%r8) +vmovdqa %ymm7, 1632(%r8) +vmovdqa %ymm5, 1664(%r8) +vmovdqa %ymm2, 1696(%r8) +vmovdqa %ymm3, 1728(%r8) +vmovdqa %ymm9, 1760(%r8) +vmovdqa 0(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm10 +vpunpckhwd const0(%rip), %ymm11, %ymm9 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm9, %ymm9 +vmovdqa 256(%r8), %ymm8 +vpunpcklwd const0(%rip), %ymm8, %ymm7 +vpunpckhwd const0(%rip), %ymm8, %ymm8 +vmovdqa 512(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm7, %ymm4 +vpaddd %ymm6, %ymm8, %ymm3 +vpsubd %ymm10, %ymm4, %ymm4 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm5, %ymm7, %ymm5 +vpsubd %ymm6, %ymm8, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1536(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm8 +vpunpckhwd const0(%rip), %ymm5, %ymm7 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm7, %ymm7 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm7, %ymm3, %ymm3 +vpsrld $1, %ymm4, %ymm4 +vpsrld $1, %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpackusdw %ymm3, %ymm4, %ymm3 +vmovdqa 768(%r8), %ymm4 +vpaddw 1024(%r8), %ymm4, %ymm7 +vpsubw 1024(%r8), %ymm4, %ymm4 +vpsrlw $2, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsllw $1, %ymm11, %ymm8 +vpsubw %ymm8, %ymm7, %ymm8 +vpsllw $7, %ymm5, %ymm7 +vpsubw %ymm7, %ymm8, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm3, %ymm7, %ymm7 +vmovdqa 1280(%r8), %ymm8 +vpsubw %ymm11, %ymm8, %ymm8 +vpmullw %ymm15, %ymm5, %ymm9 +vpsubw %ymm9, %ymm8, %ymm9 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm7, %ymm3, %ymm3 +vpmullw %ymm12, %ymm7, %ymm8 +vpaddw %ymm8, %ymm3, %ymm8 +vpmullw %ymm12, %ymm8, %ymm8 +vpsubw %ymm8, %ymm9, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm4, %ymm8, %ymm8 +vpsubw %ymm8, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpmullw %ymm13, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_3_5(%rip), %ymm7, %ymm9 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm10 +vpor %ymm10, %ymm7, %ymm7 +vpaddw %ymm7, %ymm11, %ymm11 +vmovdqa %xmm9, 2048(%r8) +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm9 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm10 +vpor %ymm10, %ymm8, %ymm8 +vpaddw %ymm8, %ymm6, %ymm6 +vmovdqa %xmm9, 2304(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm9 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm10 +vpor %ymm10, %ymm5, %ymm5 +vpaddw %ymm5, %ymm3, %ymm3 +vmovdqa %xmm9, 2560(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 0(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 352(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 704(%rdi) +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %ymm4, 1056(%rdi) +vmovdqa 32(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm8 +vpunpckhwd const0(%rip), %ymm5, %ymm7 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm7, %ymm7 +vmovdqa 288(%r8), %ymm4 +vpunpcklwd const0(%rip), %ymm4, %ymm3 +vpunpckhwd const0(%rip), %ymm4, %ymm4 +vmovdqa 544(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm3, %ymm9 +vpaddd %ymm6, %ymm4, %ymm10 +vpsubd %ymm8, %ymm9, %ymm9 +vpsubd %ymm7, %ymm10, %ymm10 +vpsubd %ymm11, %ymm3, %ymm11 +vpsubd %ymm6, %ymm4, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1568(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm3, %ymm3 +vpsubd %ymm4, %ymm9, %ymm9 +vpsubd %ymm3, %ymm10, %ymm10 +vpsrld $1, %ymm9, %ymm9 +vpsrld $1, %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpackusdw %ymm10, %ymm9, %ymm10 +vmovdqa 800(%r8), %ymm9 +vpaddw 1056(%r8), %ymm9, %ymm3 +vpsubw 1056(%r8), %ymm9, %ymm9 +vpsrlw $2, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsllw $1, %ymm5, %ymm4 +vpsubw %ymm4, %ymm3, %ymm4 +vpsllw $7, %ymm11, %ymm3 +vpsubw %ymm3, %ymm4, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm10, %ymm3, %ymm3 +vmovdqa 1312(%r8), %ymm4 +vpsubw %ymm5, %ymm4, %ymm4 +vpmullw %ymm15, %ymm11, %ymm7 +vpsubw %ymm7, %ymm4, %ymm7 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm3, %ymm10, %ymm10 +vpmullw %ymm12, %ymm3, %ymm4 +vpaddw %ymm4, %ymm10, %ymm4 +vpmullw %ymm12, %ymm4, %ymm4 +vpsubw %ymm4, %ymm7, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpmullw %ymm13, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_3_5(%rip), %ymm3, %ymm7 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm8 +vpor %ymm8, %ymm3, %ymm3 +vpaddw %ymm3, %ymm5, %ymm5 +vmovdqa %xmm7, 2080(%r8) +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm7 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm8 +vpor %ymm8, %ymm4, %ymm4 +vpaddw %ymm4, %ymm6, %ymm6 +vmovdqa %xmm7, 2336(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm7 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm8 +vpor %ymm8, %ymm11, %ymm11 +vpaddw %ymm11, %ymm10, %ymm10 +vmovdqa %xmm7, 2592(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 88(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 440(%rdi) +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 792(%rdi) +vpand mask_mod8192(%rip), %ymm9, %ymm9 +vmovdqu %ymm9, 1144(%rdi) +vmovdqa 64(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm3, %ymm3 +vmovdqa 320(%r8), %ymm9 +vpunpcklwd const0(%rip), %ymm9, %ymm10 +vpunpckhwd const0(%rip), %ymm9, %ymm9 +vmovdqa 576(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm10, %ymm7 +vpaddd %ymm6, %ymm9, %ymm8 +vpsubd %ymm4, %ymm7, %ymm7 +vpsubd %ymm3, %ymm8, %ymm8 +vpsubd %ymm5, %ymm10, %ymm5 +vpsubd %ymm6, %ymm9, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1600(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm9 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm10, %ymm10 +vpsubd %ymm9, %ymm7, %ymm7 +vpsubd %ymm10, %ymm8, %ymm8 +vpsrld $1, %ymm7, %ymm7 +vpsrld $1, %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpackusdw %ymm8, %ymm7, %ymm8 +vmovdqa 832(%r8), %ymm7 +vpaddw 1088(%r8), %ymm7, %ymm10 +vpsubw 1088(%r8), %ymm7, %ymm7 +vpsrlw $2, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsllw $1, %ymm11, %ymm9 +vpsubw %ymm9, %ymm10, %ymm9 +vpsllw $7, %ymm5, %ymm10 +vpsubw %ymm10, %ymm9, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm8, %ymm10, %ymm10 +vmovdqa 1344(%r8), %ymm9 +vpsubw %ymm11, %ymm9, %ymm9 +vpmullw %ymm15, %ymm5, %ymm3 +vpsubw %ymm3, %ymm9, %ymm3 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm10, %ymm8, %ymm8 +vpmullw %ymm12, %ymm10, %ymm9 +vpaddw %ymm9, %ymm8, %ymm9 +vpmullw %ymm12, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm7, %ymm9, %ymm9 +vpsubw %ymm9, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vpmullw %ymm13, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm3 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm10, %ymm10 +vpaddw %ymm10, %ymm11, %ymm11 +vmovdqa %xmm3, 2112(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_3_5(%rip), %ymm9, %ymm3 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm9, %ymm9 +vpaddw %ymm9, %ymm6, %ymm6 +vmovdqa %xmm3, 2368(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm3 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm5, %ymm5 +vpaddw %ymm5, %ymm8, %ymm8 +vmovdqa %xmm3, 2624(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 176(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 528(%rdi) +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %ymm8, 880(%rdi) +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %ymm7, 1232(%rdi) +vmovdqa 96(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm9 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm10, %ymm10 +vmovdqa 352(%r8), %ymm7 +vpunpcklwd const0(%rip), %ymm7, %ymm8 +vpunpckhwd const0(%rip), %ymm7, %ymm7 +vmovdqa 608(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm8, %ymm3 +vpaddd %ymm6, %ymm7, %ymm4 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm10, %ymm4, %ymm4 +vpsubd %ymm11, %ymm8, %ymm11 +vpsubd %ymm6, %ymm7, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1632(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm7 +vpunpckhwd const0(%rip), %ymm11, %ymm8 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm8, %ymm8 +vpsubd %ymm7, %ymm3, %ymm3 +vpsubd %ymm8, %ymm4, %ymm4 +vpsrld $1, %ymm3, %ymm3 +vpsrld $1, %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpackusdw %ymm4, %ymm3, %ymm4 +vmovdqa 864(%r8), %ymm3 +vpaddw 1120(%r8), %ymm3, %ymm8 +vpsubw 1120(%r8), %ymm3, %ymm3 +vpsrlw $2, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsllw $1, %ymm5, %ymm7 +vpsubw %ymm7, %ymm8, %ymm7 +vpsllw $7, %ymm11, %ymm8 +vpsubw %ymm8, %ymm7, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm4, %ymm8, %ymm8 +vmovdqa 1376(%r8), %ymm7 +vpsubw %ymm5, %ymm7, %ymm7 +vpmullw %ymm15, %ymm11, %ymm10 +vpsubw %ymm10, %ymm7, %ymm10 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm8, %ymm4, %ymm4 +vpmullw %ymm12, %ymm8, %ymm7 +vpaddw %ymm7, %ymm4, %ymm7 +vpmullw %ymm12, %ymm7, %ymm7 +vpsubw %ymm7, %ymm10, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm3, %ymm7, %ymm7 +vpsubw %ymm7, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpmullw %ymm13, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm10 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm9 +vpor %ymm9, %ymm8, %ymm8 +vpaddw %ymm8, %ymm5, %ymm5 +vmovdqa %xmm10, 2144(%r8) +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_3_5(%rip), %ymm7, %ymm10 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm9 +vpor %ymm9, %ymm7, %ymm7 +vpaddw %ymm7, %ymm6, %ymm6 +vmovdqa %xmm10, 2400(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm10 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm9 +vpor %ymm9, %ymm11, %ymm11 +vpaddw %ymm11, %ymm4, %ymm4 +vmovdqa %xmm10, 2656(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 264(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 616(%rdi) +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %ymm4, 968(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 1320(%rdi) +vmovdqa 128(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm7 +vpunpckhwd const0(%rip), %ymm11, %ymm8 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm8, %ymm8 +vmovdqa 384(%r8), %ymm3 +vpunpcklwd const0(%rip), %ymm3, %ymm4 +vpunpckhwd const0(%rip), %ymm3, %ymm3 +vmovdqa 640(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm4, %ymm10 +vpaddd %ymm6, %ymm3, %ymm9 +vpsubd %ymm7, %ymm10, %ymm10 +vpsubd %ymm8, %ymm9, %ymm9 +vpsubd %ymm5, %ymm4, %ymm5 +vpsubd %ymm6, %ymm3, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1664(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm3 +vpunpckhwd const0(%rip), %ymm5, %ymm4 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm4, %ymm4 +vpsubd %ymm3, %ymm10, %ymm10 +vpsubd %ymm4, %ymm9, %ymm9 +vpsrld $1, %ymm10, %ymm10 +vpsrld $1, %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpackusdw %ymm9, %ymm10, %ymm9 +vmovdqa 896(%r8), %ymm10 +vpaddw 1152(%r8), %ymm10, %ymm4 +vpsubw 1152(%r8), %ymm10, %ymm10 +vpsrlw $2, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsllw $1, %ymm11, %ymm3 +vpsubw %ymm3, %ymm4, %ymm3 +vpsllw $7, %ymm5, %ymm4 +vpsubw %ymm4, %ymm3, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vmovdqa 1408(%r8), %ymm3 +vpsubw %ymm11, %ymm3, %ymm3 +vpmullw %ymm15, %ymm5, %ymm8 +vpsubw %ymm8, %ymm3, %ymm8 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpmullw %ymm12, %ymm4, %ymm3 +vpaddw %ymm3, %ymm9, %ymm3 +vpmullw %ymm12, %ymm3, %ymm3 +vpsubw %ymm3, %ymm8, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm10, %ymm3, %ymm3 +vpsubw %ymm3, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vpmullw %ymm13, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vmovdqu 352(%rdi), %ymm8 +vmovdqu 704(%rdi), %ymm7 +vmovdqu 1056(%rdi), %ymm2 +vpaddw %ymm11, %ymm8, %ymm11 +vpaddw %ymm6, %ymm7, %ymm6 +vpaddw %ymm9, %ymm2, %ymm9 +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm2 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm7 +vpor %ymm7, %ymm10, %ymm10 +vmovdqu 0(%rdi), %ymm7 +vpaddw %ymm10, %ymm7, %ymm7 +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %ymm7, 0(%rdi) +vmovdqa %xmm2, 1920(%r8) +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm2 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm7 +vpor %ymm7, %ymm4, %ymm4 +vpaddw %ymm4, %ymm11, %ymm11 +vmovdqa %xmm2, 2176(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_3_5(%rip), %ymm3, %ymm2 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm7 +vpor %ymm7, %ymm3, %ymm3 +vpaddw %ymm3, %ymm6, %ymm6 +vmovdqa %xmm2, 2432(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm2 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm7 +vpor %ymm7, %ymm5, %ymm5 +vpaddw %ymm5, %ymm9, %ymm9 +vmovdqa %xmm2, 2688(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 352(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 704(%rdi) +vpand mask_mod8192(%rip), %ymm9, %ymm9 +vmovdqu %ymm9, 1056(%rdi) +vmovdqa 160(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm3 +vpunpckhwd const0(%rip), %ymm5, %ymm4 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm4, %ymm4 +vmovdqa 416(%r8), %ymm10 +vpunpcklwd const0(%rip), %ymm10, %ymm9 +vpunpckhwd const0(%rip), %ymm10, %ymm10 +vmovdqa 672(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm9, %ymm2 +vpaddd %ymm6, %ymm10, %ymm7 +vpsubd %ymm3, %ymm2, %ymm2 +vpsubd %ymm4, %ymm7, %ymm7 +vpsubd %ymm11, %ymm9, %ymm11 +vpsubd %ymm6, %ymm10, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1696(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm10 +vpunpckhwd const0(%rip), %ymm11, %ymm9 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm9, %ymm9 +vpsubd %ymm10, %ymm2, %ymm2 +vpsubd %ymm9, %ymm7, %ymm7 +vpsrld $1, %ymm2, %ymm2 +vpsrld $1, %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpackusdw %ymm7, %ymm2, %ymm7 +vmovdqa 928(%r8), %ymm2 +vpaddw 1184(%r8), %ymm2, %ymm9 +vpsubw 1184(%r8), %ymm2, %ymm2 +vpsrlw $2, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsllw $1, %ymm5, %ymm10 +vpsubw %ymm10, %ymm9, %ymm10 +vpsllw $7, %ymm11, %ymm9 +vpsubw %ymm9, %ymm10, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm7, %ymm9, %ymm9 +vmovdqa 1440(%r8), %ymm10 +vpsubw %ymm5, %ymm10, %ymm10 +vpmullw %ymm15, %ymm11, %ymm4 +vpsubw %ymm4, %ymm10, %ymm4 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm9, %ymm7, %ymm7 +vpmullw %ymm12, %ymm9, %ymm10 +vpaddw %ymm10, %ymm7, %ymm10 +vpmullw %ymm12, %ymm10, %ymm10 +vpsubw %ymm10, %ymm4, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm2, %ymm10, %ymm10 +vpsubw %ymm10, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vpmullw %ymm13, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vmovdqu 440(%rdi), %ymm4 +vmovdqu 792(%rdi), %ymm3 +vmovdqu 1144(%rdi), %ymm8 +vpaddw %ymm5, %ymm4, %ymm5 +vpaddw %ymm6, %ymm3, %ymm6 +vpaddw %ymm7, %ymm8, %ymm7 +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_3_5(%rip), %ymm2, %ymm8 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm2, %ymm2 +vmovdqu 88(%rdi), %ymm3 +vpaddw %ymm2, %ymm3, %ymm3 +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 88(%rdi) +vmovdqa %xmm8, 1952(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_3_5(%rip), %ymm9, %ymm8 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm9, %ymm9 +vpaddw %ymm9, %ymm5, %ymm5 +vmovdqa %xmm8, 2208(%r8) +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm8 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm10, %ymm10 +vpaddw %ymm10, %ymm6, %ymm6 +vmovdqa %xmm8, 2464(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm8 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm11, %ymm11 +vpaddw %ymm11, %ymm7, %ymm7 +vmovdqa %xmm8, 2720(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 440(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 792(%rdi) +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %ymm7, 1144(%rdi) +vmovdqa 192(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm10 +vpunpckhwd const0(%rip), %ymm11, %ymm9 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm9, %ymm9 +vmovdqa 448(%r8), %ymm2 +vpunpcklwd const0(%rip), %ymm2, %ymm7 +vpunpckhwd const0(%rip), %ymm2, %ymm2 +vmovdqa 704(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm7, %ymm8 +vpaddd %ymm6, %ymm2, %ymm3 +vpsubd %ymm10, %ymm8, %ymm8 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm5, %ymm7, %ymm5 +vpsubd %ymm6, %ymm2, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1728(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm7 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm7, %ymm7 +vpsubd %ymm2, %ymm8, %ymm8 +vpsubd %ymm7, %ymm3, %ymm3 +vpsrld $1, %ymm8, %ymm8 +vpsrld $1, %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpackusdw %ymm3, %ymm8, %ymm3 +vmovdqa 960(%r8), %ymm8 +vpaddw 1216(%r8), %ymm8, %ymm7 +vpsubw 1216(%r8), %ymm8, %ymm8 +vpsrlw $2, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsllw $1, %ymm11, %ymm2 +vpsubw %ymm2, %ymm7, %ymm2 +vpsllw $7, %ymm5, %ymm7 +vpsubw %ymm7, %ymm2, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm3, %ymm7, %ymm7 +vmovdqa 1472(%r8), %ymm2 +vpsubw %ymm11, %ymm2, %ymm2 +vpmullw %ymm15, %ymm5, %ymm9 +vpsubw %ymm9, %ymm2, %ymm9 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm7, %ymm3, %ymm3 +vpmullw %ymm12, %ymm7, %ymm2 +vpaddw %ymm2, %ymm3, %ymm2 +vpmullw %ymm12, %ymm2, %ymm2 +vpsubw %ymm2, %ymm9, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vpmullw %ymm13, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vmovdqu 528(%rdi), %ymm9 +vmovdqu 880(%rdi), %ymm10 +vmovdqu 1232(%rdi), %ymm4 +vpaddw %ymm11, %ymm9, %ymm11 +vpaddw %ymm6, %ymm10, %ymm6 +vpaddw %ymm3, %ymm4, %ymm3 +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm4 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm10 +vpor %ymm10, %ymm8, %ymm8 +vmovdqu 176(%rdi), %ymm10 +vpaddw %ymm8, %ymm10, %ymm10 +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 176(%rdi) +vmovdqa %xmm4, 1984(%r8) +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_3_5(%rip), %ymm7, %ymm4 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm10 +vpor %ymm10, %ymm7, %ymm7 +vpaddw %ymm7, %ymm11, %ymm11 +vmovdqa %xmm4, 2240(%r8) +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_3_5(%rip), %ymm2, %ymm4 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm10 +vpor %ymm10, %ymm2, %ymm2 +vpaddw %ymm2, %ymm6, %ymm6 +vmovdqa %xmm4, 2496(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm4 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm10 +vpor %ymm10, %ymm5, %ymm5 +vpaddw %ymm5, %ymm3, %ymm3 +vmovdqa %xmm4, 2752(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 528(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 880(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 1232(%rdi) +vmovdqa 224(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm7 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm7, %ymm7 +vmovdqa 480(%r8), %ymm8 +vpunpcklwd const0(%rip), %ymm8, %ymm3 +vpunpckhwd const0(%rip), %ymm8, %ymm8 +vmovdqa 736(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm3, %ymm4 +vpaddd %ymm6, %ymm8, %ymm10 +vpsubd %ymm2, %ymm4, %ymm4 +vpsubd %ymm7, %ymm10, %ymm10 +vpsubd %ymm11, %ymm3, %ymm11 +vpsubd %ymm6, %ymm8, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1760(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm3, %ymm3 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm3, %ymm10, %ymm10 +vpsrld $1, %ymm4, %ymm4 +vpsrld $1, %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpackusdw %ymm10, %ymm4, %ymm10 +vmovdqa 992(%r8), %ymm4 +vpaddw 1248(%r8), %ymm4, %ymm3 +vpsubw 1248(%r8), %ymm4, %ymm4 +vpsrlw $2, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsllw $1, %ymm5, %ymm8 +vpsubw %ymm8, %ymm3, %ymm8 +vpsllw $7, %ymm11, %ymm3 +vpsubw %ymm3, %ymm8, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm10, %ymm3, %ymm3 +vmovdqa 1504(%r8), %ymm8 +vpsubw %ymm5, %ymm8, %ymm8 +vpmullw %ymm15, %ymm11, %ymm7 +vpsubw %ymm7, %ymm8, %ymm7 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm3, %ymm10, %ymm10 +vpmullw %ymm12, %ymm3, %ymm8 +vpaddw %ymm8, %ymm10, %ymm8 +vpmullw %ymm12, %ymm8, %ymm8 +vpsubw %ymm8, %ymm7, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm4, %ymm8, %ymm8 +vpsubw %ymm8, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpmullw %ymm13, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vmovdqu 616(%rdi), %ymm7 +vmovdqu 968(%rdi), %ymm2 +vmovdqu 1320(%rdi), %ymm9 +vpaddw %ymm5, %ymm7, %ymm5 +vpaddw %ymm6, %ymm2, %ymm6 +vpaddw %ymm10, %ymm9, %ymm10 +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm9 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm2 +vpor %ymm2, %ymm4, %ymm4 +vmovdqu 264(%rdi), %ymm2 +vpaddw %ymm4, %ymm2, %ymm2 +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %ymm2, 264(%rdi) +vmovdqa %xmm9, 2016(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_3_5(%rip), %ymm3, %ymm9 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm2 +vpor %ymm2, %ymm3, %ymm3 +vpaddw %ymm3, %ymm5, %ymm5 +vmovdqa %xmm9, 2272(%r8) +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm9 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm2 +vpor %ymm2, %ymm8, %ymm8 +vpaddw %ymm8, %ymm6, %ymm6 +vmovdqa %xmm9, 2528(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm9 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm2 +vpor %ymm2, %ymm11, %ymm11 +vpaddw %ymm11, %ymm10, %ymm10 +vmovdqa %xmm9, 2784(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 616(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 968(%rdi) +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 1320(%rdi) +vmovdqa 128(%r12), %ymm0 +vpsubw 224(%r12), %ymm0, %ymm0 +vmovdqa 512(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 320(%r12), %ymm1, %ymm1 +vpsubw 32(%r12), %ymm0, %ymm0 +vpaddw 416(%r12), %ymm0, %ymm0 +vmovdqa 704(%r12), %ymm2 +vpsubw 800(%r12), %ymm2, %ymm2 +vmovdqa 1088(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 896(%r12), %ymm3, %ymm3 +vpsubw 608(%r12), %ymm2, %ymm2 +vpaddw 992(%r12), %ymm2, %ymm2 +vmovdqa 1280(%r12), %ymm4 +vpsubw 1376(%r12), %ymm4, %ymm4 +vmovdqa 1664(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 1472(%r12), %ymm5, %ymm5 +vpsubw 1184(%r12), %ymm4, %ymm4 +vpaddw 1568(%r12), %ymm4, %ymm4 +vpsubw 608(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 32(%r12), %ymm1, %ymm1 +vpaddw 1184(%r12), %ymm1, %ymm1 +vmovdqa 320(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 1472(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 896(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 32(%r12), %ymm8 +vmovdqa 896(%r12), %ymm9 +vmovdqa %ymm8, 0(%r8) +vmovdqa %ymm0, 32(%r8) +vmovdqa %ymm1, 64(%r8) +vmovdqa %ymm7, 96(%r8) +vmovdqa %ymm5, 128(%r8) +vmovdqa %ymm2, 160(%r8) +vmovdqa %ymm3, 192(%r8) +vmovdqa %ymm9, 224(%r8) +vmovdqa 1856(%r12), %ymm0 +vpsubw 1952(%r12), %ymm0, %ymm0 +vmovdqa 2240(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 2048(%r12), %ymm1, %ymm1 +vpsubw 1760(%r12), %ymm0, %ymm0 +vpaddw 2144(%r12), %ymm0, %ymm0 +vmovdqa 2432(%r12), %ymm2 +vpsubw 2528(%r12), %ymm2, %ymm2 +vmovdqa 2816(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 2624(%r12), %ymm3, %ymm3 +vpsubw 2336(%r12), %ymm2, %ymm2 +vpaddw 2720(%r12), %ymm2, %ymm2 +vmovdqa 3008(%r12), %ymm4 +vpsubw 3104(%r12), %ymm4, %ymm4 +vmovdqa 3392(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 3200(%r12), %ymm5, %ymm5 +vpsubw 2912(%r12), %ymm4, %ymm4 +vpaddw 3296(%r12), %ymm4, %ymm4 +vpsubw 2336(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 1760(%r12), %ymm1, %ymm1 +vpaddw 2912(%r12), %ymm1, %ymm1 +vmovdqa 2048(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 3200(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 2624(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 1760(%r12), %ymm8 +vmovdqa 2624(%r12), %ymm9 +vmovdqa %ymm8, 256(%r8) +vmovdqa %ymm0, 288(%r8) +vmovdqa %ymm1, 320(%r8) +vmovdqa %ymm7, 352(%r8) +vmovdqa %ymm5, 384(%r8) +vmovdqa %ymm2, 416(%r8) +vmovdqa %ymm3, 448(%r8) +vmovdqa %ymm9, 480(%r8) +vmovdqa 3584(%r12), %ymm0 +vpsubw 3680(%r12), %ymm0, %ymm0 +vmovdqa 3968(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3776(%r12), %ymm1, %ymm1 +vpsubw 3488(%r12), %ymm0, %ymm0 +vpaddw 3872(%r12), %ymm0, %ymm0 +vmovdqa 4160(%r12), %ymm2 +vpsubw 4256(%r12), %ymm2, %ymm2 +vmovdqa 4544(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 4352(%r12), %ymm3, %ymm3 +vpsubw 4064(%r12), %ymm2, %ymm2 +vpaddw 4448(%r12), %ymm2, %ymm2 +vmovdqa 4736(%r12), %ymm4 +vpsubw 4832(%r12), %ymm4, %ymm4 +vmovdqa 5120(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 4928(%r12), %ymm5, %ymm5 +vpsubw 4640(%r12), %ymm4, %ymm4 +vpaddw 5024(%r12), %ymm4, %ymm4 +vpsubw 4064(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 3488(%r12), %ymm1, %ymm1 +vpaddw 4640(%r12), %ymm1, %ymm1 +vmovdqa 3776(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 4928(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 4352(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 3488(%r12), %ymm8 +vmovdqa 4352(%r12), %ymm9 +vmovdqa %ymm8, 512(%r8) +vmovdqa %ymm0, 544(%r8) +vmovdqa %ymm1, 576(%r8) +vmovdqa %ymm7, 608(%r8) +vmovdqa %ymm5, 640(%r8) +vmovdqa %ymm2, 672(%r8) +vmovdqa %ymm3, 704(%r8) +vmovdqa %ymm9, 736(%r8) +vmovdqa 5312(%r12), %ymm0 +vpsubw 5408(%r12), %ymm0, %ymm0 +vmovdqa 5696(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5504(%r12), %ymm1, %ymm1 +vpsubw 5216(%r12), %ymm0, %ymm0 +vpaddw 5600(%r12), %ymm0, %ymm0 +vmovdqa 5888(%r12), %ymm2 +vpsubw 5984(%r12), %ymm2, %ymm2 +vmovdqa 6272(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 6080(%r12), %ymm3, %ymm3 +vpsubw 5792(%r12), %ymm2, %ymm2 +vpaddw 6176(%r12), %ymm2, %ymm2 +vmovdqa 6464(%r12), %ymm4 +vpsubw 6560(%r12), %ymm4, %ymm4 +vmovdqa 6848(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 6656(%r12), %ymm5, %ymm5 +vpsubw 6368(%r12), %ymm4, %ymm4 +vpaddw 6752(%r12), %ymm4, %ymm4 +vpsubw 5792(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 5216(%r12), %ymm1, %ymm1 +vpaddw 6368(%r12), %ymm1, %ymm1 +vmovdqa 5504(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 6656(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 6080(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 5216(%r12), %ymm8 +vmovdqa 6080(%r12), %ymm9 +vmovdqa %ymm8, 768(%r8) +vmovdqa %ymm0, 800(%r8) +vmovdqa %ymm1, 832(%r8) +vmovdqa %ymm7, 864(%r8) +vmovdqa %ymm5, 896(%r8) +vmovdqa %ymm2, 928(%r8) +vmovdqa %ymm3, 960(%r8) +vmovdqa %ymm9, 992(%r8) +vmovdqa 7040(%r12), %ymm0 +vpsubw 7136(%r12), %ymm0, %ymm0 +vmovdqa 7424(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 7232(%r12), %ymm1, %ymm1 +vpsubw 6944(%r12), %ymm0, %ymm0 +vpaddw 7328(%r12), %ymm0, %ymm0 +vmovdqa 7616(%r12), %ymm2 +vpsubw 7712(%r12), %ymm2, %ymm2 +vmovdqa 8000(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 7808(%r12), %ymm3, %ymm3 +vpsubw 7520(%r12), %ymm2, %ymm2 +vpaddw 7904(%r12), %ymm2, %ymm2 +vmovdqa 8192(%r12), %ymm4 +vpsubw 8288(%r12), %ymm4, %ymm4 +vmovdqa 8576(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 8384(%r12), %ymm5, %ymm5 +vpsubw 8096(%r12), %ymm4, %ymm4 +vpaddw 8480(%r12), %ymm4, %ymm4 +vpsubw 7520(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 6944(%r12), %ymm1, %ymm1 +vpaddw 8096(%r12), %ymm1, %ymm1 +vmovdqa 7232(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 8384(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 7808(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 6944(%r12), %ymm8 +vmovdqa 7808(%r12), %ymm9 +vmovdqa %ymm8, 1024(%r8) +vmovdqa %ymm0, 1056(%r8) +vmovdqa %ymm1, 1088(%r8) +vmovdqa %ymm7, 1120(%r8) +vmovdqa %ymm5, 1152(%r8) +vmovdqa %ymm2, 1184(%r8) +vmovdqa %ymm3, 1216(%r8) +vmovdqa %ymm9, 1248(%r8) +vmovdqa 8768(%r12), %ymm0 +vpsubw 8864(%r12), %ymm0, %ymm0 +vmovdqa 9152(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 8960(%r12), %ymm1, %ymm1 +vpsubw 8672(%r12), %ymm0, %ymm0 +vpaddw 9056(%r12), %ymm0, %ymm0 +vmovdqa 9344(%r12), %ymm2 +vpsubw 9440(%r12), %ymm2, %ymm2 +vmovdqa 9728(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 9536(%r12), %ymm3, %ymm3 +vpsubw 9248(%r12), %ymm2, %ymm2 +vpaddw 9632(%r12), %ymm2, %ymm2 +vmovdqa 9920(%r12), %ymm4 +vpsubw 10016(%r12), %ymm4, %ymm4 +vmovdqa 10304(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 10112(%r12), %ymm5, %ymm5 +vpsubw 9824(%r12), %ymm4, %ymm4 +vpaddw 10208(%r12), %ymm4, %ymm4 +vpsubw 9248(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 8672(%r12), %ymm1, %ymm1 +vpaddw 9824(%r12), %ymm1, %ymm1 +vmovdqa 8960(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 10112(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 9536(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 8672(%r12), %ymm8 +vmovdqa 9536(%r12), %ymm9 +vmovdqa %ymm8, 1280(%r8) +vmovdqa %ymm0, 1312(%r8) +vmovdqa %ymm1, 1344(%r8) +vmovdqa %ymm7, 1376(%r8) +vmovdqa %ymm5, 1408(%r8) +vmovdqa %ymm2, 1440(%r8) +vmovdqa %ymm3, 1472(%r8) +vmovdqa %ymm9, 1504(%r8) +vmovdqa 10496(%r12), %ymm0 +vpsubw 10592(%r12), %ymm0, %ymm0 +vmovdqa 10880(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 10688(%r12), %ymm1, %ymm1 +vpsubw 10400(%r12), %ymm0, %ymm0 +vpaddw 10784(%r12), %ymm0, %ymm0 +vmovdqa 11072(%r12), %ymm2 +vpsubw 11168(%r12), %ymm2, %ymm2 +vmovdqa 11456(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 11264(%r12), %ymm3, %ymm3 +vpsubw 10976(%r12), %ymm2, %ymm2 +vpaddw 11360(%r12), %ymm2, %ymm2 +vmovdqa 11648(%r12), %ymm4 +vpsubw 11744(%r12), %ymm4, %ymm4 +vmovdqa 12032(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 11840(%r12), %ymm5, %ymm5 +vpsubw 11552(%r12), %ymm4, %ymm4 +vpaddw 11936(%r12), %ymm4, %ymm4 +vpsubw 10976(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 10400(%r12), %ymm1, %ymm1 +vpaddw 11552(%r12), %ymm1, %ymm1 +vmovdqa 10688(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 11840(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 11264(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 10400(%r12), %ymm8 +vmovdqa 11264(%r12), %ymm9 +vmovdqa %ymm8, 1536(%r8) +vmovdqa %ymm0, 1568(%r8) +vmovdqa %ymm1, 1600(%r8) +vmovdqa %ymm7, 1632(%r8) +vmovdqa %ymm5, 1664(%r8) +vmovdqa %ymm2, 1696(%r8) +vmovdqa %ymm3, 1728(%r8) +vmovdqa %ymm9, 1760(%r8) +vmovdqa 0(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm3, %ymm3 +vmovdqa 256(%r8), %ymm4 +vpunpcklwd const0(%rip), %ymm4, %ymm10 +vpunpckhwd const0(%rip), %ymm4, %ymm4 +vmovdqa 512(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm10, %ymm9 +vpaddd %ymm6, %ymm4, %ymm2 +vpsubd %ymm8, %ymm9, %ymm9 +vpsubd %ymm3, %ymm2, %ymm2 +vpsubd %ymm5, %ymm10, %ymm5 +vpsubd %ymm6, %ymm4, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1536(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm4 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm10, %ymm10 +vpsubd %ymm4, %ymm9, %ymm9 +vpsubd %ymm10, %ymm2, %ymm2 +vpsrld $1, %ymm9, %ymm9 +vpsrld $1, %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpackusdw %ymm2, %ymm9, %ymm2 +vmovdqa 768(%r8), %ymm9 +vpaddw 1024(%r8), %ymm9, %ymm10 +vpsubw 1024(%r8), %ymm9, %ymm9 +vpsrlw $2, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsllw $1, %ymm11, %ymm4 +vpsubw %ymm4, %ymm10, %ymm4 +vpsllw $7, %ymm5, %ymm10 +vpsubw %ymm10, %ymm4, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm2, %ymm10, %ymm10 +vmovdqa 1280(%r8), %ymm4 +vpsubw %ymm11, %ymm4, %ymm4 +vpmullw %ymm15, %ymm5, %ymm3 +vpsubw %ymm3, %ymm4, %ymm3 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm10, %ymm2, %ymm2 +vpmullw %ymm12, %ymm10, %ymm4 +vpaddw %ymm4, %ymm2, %ymm4 +vpmullw %ymm12, %ymm4, %ymm4 +vpsubw %ymm4, %ymm3, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpmullw %ymm13, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm3 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm8 +vpor %ymm8, %ymm10, %ymm10 +vpaddw 2048(%r8), %ymm11, %ymm11 +vpaddw %ymm10, %ymm11, %ymm11 +vmovdqa %xmm3, 2048(%r8) +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm3 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm8 +vpor %ymm8, %ymm4, %ymm4 +vpaddw 2304(%r8), %ymm6, %ymm6 +vpaddw %ymm4, %ymm6, %ymm6 +vmovdqa %xmm3, 2304(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm3 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm8 +vpor %ymm8, %ymm5, %ymm5 +vpaddw 2560(%r8), %ymm2, %ymm2 +vpaddw %ymm5, %ymm2, %ymm2 +vmovdqa %xmm3, 2560(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 32(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 384(%rdi) +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %ymm2, 736(%rdi) +vpand mask_mod8192(%rip), %ymm9, %ymm9 +vmovdqu %ymm9, 1088(%rdi) +vmovdqa 32(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm4 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm10, %ymm10 +vmovdqa 288(%r8), %ymm9 +vpunpcklwd const0(%rip), %ymm9, %ymm2 +vpunpckhwd const0(%rip), %ymm9, %ymm9 +vmovdqa 544(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm2, %ymm3 +vpaddd %ymm6, %ymm9, %ymm8 +vpsubd %ymm4, %ymm3, %ymm3 +vpsubd %ymm10, %ymm8, %ymm8 +vpsubd %ymm11, %ymm2, %ymm11 +vpsubd %ymm6, %ymm9, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1568(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm9 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm2, %ymm2 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm2, %ymm8, %ymm8 +vpsrld $1, %ymm3, %ymm3 +vpsrld $1, %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpackusdw %ymm8, %ymm3, %ymm8 +vmovdqa 800(%r8), %ymm3 +vpaddw 1056(%r8), %ymm3, %ymm2 +vpsubw 1056(%r8), %ymm3, %ymm3 +vpsrlw $2, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsllw $1, %ymm5, %ymm9 +vpsubw %ymm9, %ymm2, %ymm9 +vpsllw $7, %ymm11, %ymm2 +vpsubw %ymm2, %ymm9, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vmovdqa 1312(%r8), %ymm9 +vpsubw %ymm5, %ymm9, %ymm9 +vpmullw %ymm15, %ymm11, %ymm10 +vpsubw %ymm10, %ymm9, %ymm10 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpmullw %ymm12, %ymm2, %ymm9 +vpaddw %ymm9, %ymm8, %ymm9 +vpmullw %ymm12, %ymm9, %ymm9 +vpsubw %ymm9, %ymm10, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm3, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpmullw %ymm13, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_3_5(%rip), %ymm2, %ymm10 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm4 +vpor %ymm4, %ymm2, %ymm2 +vpaddw 2080(%r8), %ymm5, %ymm5 +vpaddw %ymm2, %ymm5, %ymm5 +vmovdqa %xmm10, 2080(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_3_5(%rip), %ymm9, %ymm10 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm4 +vpor %ymm4, %ymm9, %ymm9 +vpaddw 2336(%r8), %ymm6, %ymm6 +vpaddw %ymm9, %ymm6, %ymm6 +vmovdqa %xmm10, 2336(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm10 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm4 +vpor %ymm4, %ymm11, %ymm11 +vpaddw 2592(%r8), %ymm8, %ymm8 +vpaddw %ymm11, %ymm8, %ymm8 +vmovdqa %xmm10, 2592(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 120(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 472(%rdi) +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %ymm8, 824(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 1176(%rdi) +vmovdqa 64(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm9 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm2, %ymm2 +vmovdqa 320(%r8), %ymm3 +vpunpcklwd const0(%rip), %ymm3, %ymm8 +vpunpckhwd const0(%rip), %ymm3, %ymm3 +vmovdqa 576(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm8, %ymm10 +vpaddd %ymm6, %ymm3, %ymm4 +vpsubd %ymm9, %ymm10, %ymm10 +vpsubd %ymm2, %ymm4, %ymm4 +vpsubd %ymm5, %ymm8, %ymm5 +vpsubd %ymm6, %ymm3, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1600(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm3 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm8, %ymm8 +vpsubd %ymm3, %ymm10, %ymm10 +vpsubd %ymm8, %ymm4, %ymm4 +vpsrld $1, %ymm10, %ymm10 +vpsrld $1, %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpackusdw %ymm4, %ymm10, %ymm4 +vmovdqa 832(%r8), %ymm10 +vpaddw 1088(%r8), %ymm10, %ymm8 +vpsubw 1088(%r8), %ymm10, %ymm10 +vpsrlw $2, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsllw $1, %ymm11, %ymm3 +vpsubw %ymm3, %ymm8, %ymm3 +vpsllw $7, %ymm5, %ymm8 +vpsubw %ymm8, %ymm3, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm4, %ymm8, %ymm8 +vmovdqa 1344(%r8), %ymm3 +vpsubw %ymm11, %ymm3, %ymm3 +vpmullw %ymm15, %ymm5, %ymm2 +vpsubw %ymm2, %ymm3, %ymm2 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm8, %ymm4, %ymm4 +vpmullw %ymm12, %ymm8, %ymm3 +vpaddw %ymm3, %ymm4, %ymm3 +vpmullw %ymm12, %ymm3, %ymm3 +vpsubw %ymm3, %ymm2, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm10, %ymm3, %ymm3 +vpsubw %ymm3, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vpmullw %ymm13, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm2 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm9 +vpor %ymm9, %ymm8, %ymm8 +vpaddw 2112(%r8), %ymm11, %ymm11 +vpaddw %ymm8, %ymm11, %ymm11 +vmovdqa %xmm2, 2112(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_3_5(%rip), %ymm3, %ymm2 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm9 +vpor %ymm9, %ymm3, %ymm3 +vpaddw 2368(%r8), %ymm6, %ymm6 +vpaddw %ymm3, %ymm6, %ymm6 +vmovdqa %xmm2, 2368(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm2 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm9 +vpor %ymm9, %ymm5, %ymm5 +vpaddw 2624(%r8), %ymm4, %ymm4 +vpaddw %ymm5, %ymm4, %ymm4 +vmovdqa %xmm2, 2624(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 208(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 560(%rdi) +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %ymm4, 912(%rdi) +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 1264(%rdi) +vmovdqa 96(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm3 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm8, %ymm8 +vmovdqa 352(%r8), %ymm10 +vpunpcklwd const0(%rip), %ymm10, %ymm4 +vpunpckhwd const0(%rip), %ymm10, %ymm10 +vmovdqa 608(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm4, %ymm2 +vpaddd %ymm6, %ymm10, %ymm9 +vpsubd %ymm3, %ymm2, %ymm2 +vpsubd %ymm8, %ymm9, %ymm9 +vpsubd %ymm11, %ymm4, %ymm11 +vpsubd %ymm6, %ymm10, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1632(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm10 +vpunpckhwd const0(%rip), %ymm11, %ymm4 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm4, %ymm4 +vpsubd %ymm10, %ymm2, %ymm2 +vpsubd %ymm4, %ymm9, %ymm9 +vpsrld $1, %ymm2, %ymm2 +vpsrld $1, %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpackusdw %ymm9, %ymm2, %ymm9 +vmovdqa 864(%r8), %ymm2 +vpaddw 1120(%r8), %ymm2, %ymm4 +vpsubw 1120(%r8), %ymm2, %ymm2 +vpsrlw $2, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsllw $1, %ymm5, %ymm10 +vpsubw %ymm10, %ymm4, %ymm10 +vpsllw $7, %ymm11, %ymm4 +vpsubw %ymm4, %ymm10, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vmovdqa 1376(%r8), %ymm10 +vpsubw %ymm5, %ymm10, %ymm10 +vpmullw %ymm15, %ymm11, %ymm8 +vpsubw %ymm8, %ymm10, %ymm8 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpmullw %ymm12, %ymm4, %ymm10 +vpaddw %ymm10, %ymm9, %ymm10 +vpmullw %ymm12, %ymm10, %ymm10 +vpsubw %ymm10, %ymm8, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm2, %ymm10, %ymm10 +vpsubw %ymm10, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vpmullw %ymm13, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm8 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm4, %ymm4 +vpaddw 2144(%r8), %ymm5, %ymm5 +vpaddw %ymm4, %ymm5, %ymm5 +vmovdqa %xmm8, 2144(%r8) +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm8 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm10, %ymm10 +vpaddw 2400(%r8), %ymm6, %ymm6 +vpaddw %ymm10, %ymm6, %ymm6 +vmovdqa %xmm8, 2400(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm8 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm3 +vpor %ymm3, %ymm11, %ymm11 +vpaddw 2656(%r8), %ymm9, %ymm9 +vpaddw %ymm11, %ymm9, %ymm9 +vmovdqa %xmm8, 2656(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 296(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 648(%rdi) +vpand mask_mod8192(%rip), %ymm9, %ymm9 +vmovdqu %ymm9, 1000(%rdi) +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %ymm2, 1352(%rdi) +vmovdqa 128(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm10 +vpunpckhwd const0(%rip), %ymm11, %ymm4 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm4, %ymm4 +vmovdqa 384(%r8), %ymm2 +vpunpcklwd const0(%rip), %ymm2, %ymm9 +vpunpckhwd const0(%rip), %ymm2, %ymm2 +vmovdqa 640(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm9, %ymm8 +vpaddd %ymm6, %ymm2, %ymm3 +vpsubd %ymm10, %ymm8, %ymm8 +vpsubd %ymm4, %ymm3, %ymm3 +vpsubd %ymm5, %ymm9, %ymm5 +vpsubd %ymm6, %ymm2, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1664(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm9 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm9, %ymm9 +vpsubd %ymm2, %ymm8, %ymm8 +vpsubd %ymm9, %ymm3, %ymm3 +vpsrld $1, %ymm8, %ymm8 +vpsrld $1, %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpackusdw %ymm3, %ymm8, %ymm3 +vmovdqa 896(%r8), %ymm8 +vpaddw 1152(%r8), %ymm8, %ymm9 +vpsubw 1152(%r8), %ymm8, %ymm8 +vpsrlw $2, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsllw $1, %ymm11, %ymm2 +vpsubw %ymm2, %ymm9, %ymm2 +vpsllw $7, %ymm5, %ymm9 +vpsubw %ymm9, %ymm2, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm3, %ymm9, %ymm9 +vmovdqa 1408(%r8), %ymm2 +vpsubw %ymm11, %ymm2, %ymm2 +vpmullw %ymm15, %ymm5, %ymm4 +vpsubw %ymm4, %ymm2, %ymm4 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm3 +vpmullw %ymm12, %ymm9, %ymm2 +vpaddw %ymm2, %ymm3, %ymm2 +vpmullw %ymm12, %ymm2, %ymm2 +vpsubw %ymm2, %ymm4, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vpmullw %ymm13, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vmovdqu 384(%rdi), %ymm4 +vmovdqu 736(%rdi), %ymm10 +vmovdqu 1088(%rdi), %ymm7 +vpaddw %ymm11, %ymm4, %ymm11 +vpaddw %ymm6, %ymm10, %ymm6 +vpaddw %ymm3, %ymm7, %ymm3 +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm7 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm10 +vpor %ymm10, %ymm8, %ymm8 +vmovdqu 32(%rdi), %ymm10 +vpaddw 1920(%r8), %ymm10, %ymm10 +vpaddw %ymm8, %ymm10, %ymm10 +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 32(%rdi) +vmovdqa %xmm7, 1920(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_3_5(%rip), %ymm9, %ymm7 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm10 +vpor %ymm10, %ymm9, %ymm9 +vpaddw 2176(%r8), %ymm11, %ymm11 +vpaddw %ymm9, %ymm11, %ymm11 +vmovdqa %xmm7, 2176(%r8) +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_3_5(%rip), %ymm2, %ymm7 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm10 +vpor %ymm10, %ymm2, %ymm2 +vpaddw 2432(%r8), %ymm6, %ymm6 +vpaddw %ymm2, %ymm6, %ymm6 +vmovdqa %xmm7, 2432(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm7 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm10 +vpor %ymm10, %ymm5, %ymm5 +vpaddw 2688(%r8), %ymm3, %ymm3 +vpaddw %ymm5, %ymm3, %ymm3 +vmovdqa %xmm7, 2688(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 384(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 736(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %ymm3, 1088(%rdi) +vmovdqa 160(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm9 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm9, %ymm9 +vmovdqa 416(%r8), %ymm8 +vpunpcklwd const0(%rip), %ymm8, %ymm3 +vpunpckhwd const0(%rip), %ymm8, %ymm8 +vmovdqa 672(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm3, %ymm7 +vpaddd %ymm6, %ymm8, %ymm10 +vpsubd %ymm2, %ymm7, %ymm7 +vpsubd %ymm9, %ymm10, %ymm10 +vpsubd %ymm11, %ymm3, %ymm11 +vpsubd %ymm6, %ymm8, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1696(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm3, %ymm3 +vpsubd %ymm8, %ymm7, %ymm7 +vpsubd %ymm3, %ymm10, %ymm10 +vpsrld $1, %ymm7, %ymm7 +vpsrld $1, %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpackusdw %ymm10, %ymm7, %ymm10 +vmovdqa 928(%r8), %ymm7 +vpaddw 1184(%r8), %ymm7, %ymm3 +vpsubw 1184(%r8), %ymm7, %ymm7 +vpsrlw $2, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsllw $1, %ymm5, %ymm8 +vpsubw %ymm8, %ymm3, %ymm8 +vpsllw $7, %ymm11, %ymm3 +vpsubw %ymm3, %ymm8, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm10, %ymm3, %ymm3 +vmovdqa 1440(%r8), %ymm8 +vpsubw %ymm5, %ymm8, %ymm8 +vpmullw %ymm15, %ymm11, %ymm9 +vpsubw %ymm9, %ymm8, %ymm9 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm3, %ymm10, %ymm10 +vpmullw %ymm12, %ymm3, %ymm8 +vpaddw %ymm8, %ymm10, %ymm8 +vpmullw %ymm12, %ymm8, %ymm8 +vpsubw %ymm8, %ymm9, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm7, %ymm8, %ymm8 +vpsubw %ymm8, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vpmullw %ymm13, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vmovdqu 472(%rdi), %ymm9 +vmovdqu 824(%rdi), %ymm2 +vmovdqu 1176(%rdi), %ymm4 +vpaddw %ymm5, %ymm9, %ymm5 +vpaddw %ymm6, %ymm2, %ymm6 +vpaddw %ymm10, %ymm4, %ymm10 +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_3_5(%rip), %ymm7, %ymm4 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm7, %ymm7 +vmovdqu 120(%rdi), %ymm2 +vpaddw 1952(%r8), %ymm2, %ymm2 +vpaddw %ymm7, %ymm2, %ymm2 +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %ymm2, 120(%rdi) +vmovdqa %xmm4, 1952(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_3_5(%rip), %ymm3, %ymm4 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm3, %ymm3 +vpaddw 2208(%r8), %ymm5, %ymm5 +vpaddw %ymm3, %ymm5, %ymm5 +vmovdqa %xmm4, 2208(%r8) +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_3_5(%rip), %ymm8, %ymm4 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm8, %ymm8 +vpaddw 2464(%r8), %ymm6, %ymm6 +vpaddw %ymm8, %ymm6, %ymm6 +vmovdqa %xmm4, 2464(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm4 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm11, %ymm11 +vpaddw 2720(%r8), %ymm10, %ymm10 +vpaddw %ymm11, %ymm10, %ymm10 +vmovdqa %xmm4, 2720(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 472(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 824(%rdi) +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %ymm10, 1176(%rdi) +vmovdqa 192(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm3 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm3, %ymm3 +vmovdqa 448(%r8), %ymm7 +vpunpcklwd const0(%rip), %ymm7, %ymm10 +vpunpckhwd const0(%rip), %ymm7, %ymm7 +vmovdqa 704(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm10, %ymm4 +vpaddd %ymm6, %ymm7, %ymm2 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm3, %ymm2, %ymm2 +vpsubd %ymm5, %ymm10, %ymm5 +vpsubd %ymm6, %ymm7, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1728(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm7 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm10, %ymm10 +vpsubd %ymm7, %ymm4, %ymm4 +vpsubd %ymm10, %ymm2, %ymm2 +vpsrld $1, %ymm4, %ymm4 +vpsrld $1, %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpackusdw %ymm2, %ymm4, %ymm2 +vmovdqa 960(%r8), %ymm4 +vpaddw 1216(%r8), %ymm4, %ymm10 +vpsubw 1216(%r8), %ymm4, %ymm4 +vpsrlw $2, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsllw $1, %ymm11, %ymm7 +vpsubw %ymm7, %ymm10, %ymm7 +vpsllw $7, %ymm5, %ymm10 +vpsubw %ymm10, %ymm7, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm2, %ymm10, %ymm10 +vmovdqa 1472(%r8), %ymm7 +vpsubw %ymm11, %ymm7, %ymm7 +vpmullw %ymm15, %ymm5, %ymm3 +vpsubw %ymm3, %ymm7, %ymm3 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm10, %ymm2, %ymm2 +vpmullw %ymm12, %ymm10, %ymm7 +vpaddw %ymm7, %ymm2, %ymm7 +vpmullw %ymm12, %ymm7, %ymm7 +vpsubw %ymm7, %ymm3, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm4, %ymm7, %ymm7 +vpsubw %ymm7, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpmullw %ymm13, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vmovdqu 560(%rdi), %ymm3 +vmovdqu 912(%rdi), %ymm8 +vmovdqu 1264(%rdi), %ymm9 +vpaddw %ymm11, %ymm3, %ymm11 +vpaddw %ymm6, %ymm8, %ymm6 +vpaddw %ymm2, %ymm9, %ymm2 +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm9 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm8 +vpor %ymm8, %ymm4, %ymm4 +vmovdqu 208(%rdi), %ymm8 +vpaddw 1984(%r8), %ymm8, %ymm8 +vpaddw %ymm4, %ymm8, %ymm8 +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %ymm8, 208(%rdi) +vmovdqa %xmm9, 1984(%r8) +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_3_5(%rip), %ymm10, %ymm9 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm8 +vpor %ymm8, %ymm10, %ymm10 +vpaddw 2240(%r8), %ymm11, %ymm11 +vpaddw %ymm10, %ymm11, %ymm11 +vmovdqa %xmm9, 2240(%r8) +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_3_5(%rip), %ymm7, %ymm9 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm8 +vpor %ymm8, %ymm7, %ymm7 +vpaddw 2496(%r8), %ymm6, %ymm6 +vpaddw %ymm7, %ymm6, %ymm6 +vmovdqa %xmm9, 2496(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_3_5(%rip), %ymm5, %ymm9 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $206, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm8 +vpor %ymm8, %ymm5, %ymm5 +vpaddw 2752(%r8), %ymm2, %ymm2 +vpaddw %ymm5, %ymm2, %ymm2 +vmovdqa %xmm9, 2752(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 560(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 912(%rdi) +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %ymm2, 1264(%rdi) +vmovdqa 224(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm7 +vpunpckhwd const0(%rip), %ymm5, %ymm10 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm10, %ymm10 +vmovdqa 480(%r8), %ymm4 +vpunpcklwd const0(%rip), %ymm4, %ymm2 +vpunpckhwd const0(%rip), %ymm4, %ymm4 +vmovdqa 736(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm2, %ymm9 +vpaddd %ymm6, %ymm4, %ymm8 +vpsubd %ymm7, %ymm9, %ymm9 +vpsubd %ymm10, %ymm8, %ymm8 +vpsubd %ymm11, %ymm2, %ymm11 +vpsubd %ymm6, %ymm4, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1760(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm2, %ymm2 +vpsubd %ymm4, %ymm9, %ymm9 +vpsubd %ymm2, %ymm8, %ymm8 +vpsrld $1, %ymm9, %ymm9 +vpsrld $1, %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpackusdw %ymm8, %ymm9, %ymm8 +vmovdqa 992(%r8), %ymm9 +vpaddw 1248(%r8), %ymm9, %ymm2 +vpsubw 1248(%r8), %ymm9, %ymm9 +vpsrlw $2, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsllw $1, %ymm5, %ymm4 +vpsubw %ymm4, %ymm2, %ymm4 +vpsllw $7, %ymm11, %ymm2 +vpsubw %ymm2, %ymm4, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vmovdqa 1504(%r8), %ymm4 +vpsubw %ymm5, %ymm4, %ymm4 +vpmullw %ymm15, %ymm11, %ymm10 +vpsubw %ymm10, %ymm4, %ymm10 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpmullw %ymm12, %ymm2, %ymm4 +vpaddw %ymm4, %ymm8, %ymm4 +vpmullw %ymm12, %ymm4, %ymm4 +vpsubw %ymm4, %ymm10, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpmullw %ymm13, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vmovdqu 648(%rdi), %ymm10 +vmovdqu 1000(%rdi), %ymm7 +vmovdqu 1352(%rdi), %ymm3 +vpaddw %ymm5, %ymm10, %ymm5 +vpaddw %ymm6, %ymm7, %ymm6 +vpaddw %ymm8, %ymm3, %ymm8 +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_3_5(%rip), %ymm9, %ymm3 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm7 +vpor %ymm7, %ymm9, %ymm9 +vmovdqu 296(%rdi), %ymm7 +vpaddw 2016(%r8), %ymm7, %ymm7 +vpaddw %ymm9, %ymm7, %ymm7 +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %ymm7, 296(%rdi) +vmovdqa %xmm3, 2016(%r8) +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_3_5(%rip), %ymm2, %ymm3 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm7 +vpor %ymm7, %ymm2, %ymm2 +vpaddw 2272(%r8), %ymm5, %ymm5 +vpaddw %ymm2, %ymm5, %ymm5 +vmovdqa %xmm3, 2272(%r8) +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_3_5(%rip), %ymm4, %ymm3 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm7 +vpor %ymm7, %ymm4, %ymm4 +vpaddw 2528(%r8), %ymm6, %ymm6 +vpaddw %ymm4, %ymm6, %ymm6 +vmovdqa %xmm3, 2528(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_3_5(%rip), %ymm11, %ymm3 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $206, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm7 +vpor %ymm7, %ymm11, %ymm11 +vpaddw 2784(%r8), %ymm8, %ymm8 +vpaddw %ymm11, %ymm8, %ymm8 +vmovdqa %xmm3, 2784(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %ymm5, 648(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %ymm6, 1000(%rdi) +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %ymm8, 1352(%rdi) +vmovdqa 160(%r12), %ymm0 +vpsubw 256(%r12), %ymm0, %ymm0 +vmovdqa 544(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 352(%r12), %ymm1, %ymm1 +vpsubw 64(%r12), %ymm0, %ymm0 +vpaddw 448(%r12), %ymm0, %ymm0 +vmovdqa 736(%r12), %ymm2 +vpsubw 832(%r12), %ymm2, %ymm2 +vmovdqa 1120(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 928(%r12), %ymm3, %ymm3 +vpsubw 640(%r12), %ymm2, %ymm2 +vpaddw 1024(%r12), %ymm2, %ymm2 +vmovdqa 1312(%r12), %ymm4 +vpsubw 1408(%r12), %ymm4, %ymm4 +vmovdqa 1696(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 1504(%r12), %ymm5, %ymm5 +vpsubw 1216(%r12), %ymm4, %ymm4 +vpaddw 1600(%r12), %ymm4, %ymm4 +vpsubw 640(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 64(%r12), %ymm1, %ymm1 +vpaddw 1216(%r12), %ymm1, %ymm1 +vmovdqa 352(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 1504(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 928(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 64(%r12), %ymm8 +vmovdqa 928(%r12), %ymm9 +vmovdqa %ymm8, 0(%r8) +vmovdqa %ymm0, 32(%r8) +vmovdqa %ymm1, 64(%r8) +vmovdqa %ymm7, 96(%r8) +vmovdqa %ymm5, 128(%r8) +vmovdqa %ymm2, 160(%r8) +vmovdqa %ymm3, 192(%r8) +vmovdqa %ymm9, 224(%r8) +vmovdqa 1888(%r12), %ymm0 +vpsubw 1984(%r12), %ymm0, %ymm0 +vmovdqa 2272(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 2080(%r12), %ymm1, %ymm1 +vpsubw 1792(%r12), %ymm0, %ymm0 +vpaddw 2176(%r12), %ymm0, %ymm0 +vmovdqa 2464(%r12), %ymm2 +vpsubw 2560(%r12), %ymm2, %ymm2 +vmovdqa 2848(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 2656(%r12), %ymm3, %ymm3 +vpsubw 2368(%r12), %ymm2, %ymm2 +vpaddw 2752(%r12), %ymm2, %ymm2 +vmovdqa 3040(%r12), %ymm4 +vpsubw 3136(%r12), %ymm4, %ymm4 +vmovdqa 3424(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 3232(%r12), %ymm5, %ymm5 +vpsubw 2944(%r12), %ymm4, %ymm4 +vpaddw 3328(%r12), %ymm4, %ymm4 +vpsubw 2368(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 1792(%r12), %ymm1, %ymm1 +vpaddw 2944(%r12), %ymm1, %ymm1 +vmovdqa 2080(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 3232(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 2656(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 1792(%r12), %ymm8 +vmovdqa 2656(%r12), %ymm9 +vmovdqa %ymm8, 256(%r8) +vmovdqa %ymm0, 288(%r8) +vmovdqa %ymm1, 320(%r8) +vmovdqa %ymm7, 352(%r8) +vmovdqa %ymm5, 384(%r8) +vmovdqa %ymm2, 416(%r8) +vmovdqa %ymm3, 448(%r8) +vmovdqa %ymm9, 480(%r8) +vmovdqa 3616(%r12), %ymm0 +vpsubw 3712(%r12), %ymm0, %ymm0 +vmovdqa 4000(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 3808(%r12), %ymm1, %ymm1 +vpsubw 3520(%r12), %ymm0, %ymm0 +vpaddw 3904(%r12), %ymm0, %ymm0 +vmovdqa 4192(%r12), %ymm2 +vpsubw 4288(%r12), %ymm2, %ymm2 +vmovdqa 4576(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 4384(%r12), %ymm3, %ymm3 +vpsubw 4096(%r12), %ymm2, %ymm2 +vpaddw 4480(%r12), %ymm2, %ymm2 +vmovdqa 4768(%r12), %ymm4 +vpsubw 4864(%r12), %ymm4, %ymm4 +vmovdqa 5152(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 4960(%r12), %ymm5, %ymm5 +vpsubw 4672(%r12), %ymm4, %ymm4 +vpaddw 5056(%r12), %ymm4, %ymm4 +vpsubw 4096(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 3520(%r12), %ymm1, %ymm1 +vpaddw 4672(%r12), %ymm1, %ymm1 +vmovdqa 3808(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 4960(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 4384(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 3520(%r12), %ymm8 +vmovdqa 4384(%r12), %ymm9 +vmovdqa %ymm8, 512(%r8) +vmovdqa %ymm0, 544(%r8) +vmovdqa %ymm1, 576(%r8) +vmovdqa %ymm7, 608(%r8) +vmovdqa %ymm5, 640(%r8) +vmovdqa %ymm2, 672(%r8) +vmovdqa %ymm3, 704(%r8) +vmovdqa %ymm9, 736(%r8) +vmovdqa 5344(%r12), %ymm0 +vpsubw 5440(%r12), %ymm0, %ymm0 +vmovdqa 5728(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 5536(%r12), %ymm1, %ymm1 +vpsubw 5248(%r12), %ymm0, %ymm0 +vpaddw 5632(%r12), %ymm0, %ymm0 +vmovdqa 5920(%r12), %ymm2 +vpsubw 6016(%r12), %ymm2, %ymm2 +vmovdqa 6304(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 6112(%r12), %ymm3, %ymm3 +vpsubw 5824(%r12), %ymm2, %ymm2 +vpaddw 6208(%r12), %ymm2, %ymm2 +vmovdqa 6496(%r12), %ymm4 +vpsubw 6592(%r12), %ymm4, %ymm4 +vmovdqa 6880(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 6688(%r12), %ymm5, %ymm5 +vpsubw 6400(%r12), %ymm4, %ymm4 +vpaddw 6784(%r12), %ymm4, %ymm4 +vpsubw 5824(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 5248(%r12), %ymm1, %ymm1 +vpaddw 6400(%r12), %ymm1, %ymm1 +vmovdqa 5536(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 6688(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 6112(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 5248(%r12), %ymm8 +vmovdqa 6112(%r12), %ymm9 +vmovdqa %ymm8, 768(%r8) +vmovdqa %ymm0, 800(%r8) +vmovdqa %ymm1, 832(%r8) +vmovdqa %ymm7, 864(%r8) +vmovdqa %ymm5, 896(%r8) +vmovdqa %ymm2, 928(%r8) +vmovdqa %ymm3, 960(%r8) +vmovdqa %ymm9, 992(%r8) +vmovdqa 7072(%r12), %ymm0 +vpsubw 7168(%r12), %ymm0, %ymm0 +vmovdqa 7456(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 7264(%r12), %ymm1, %ymm1 +vpsubw 6976(%r12), %ymm0, %ymm0 +vpaddw 7360(%r12), %ymm0, %ymm0 +vmovdqa 7648(%r12), %ymm2 +vpsubw 7744(%r12), %ymm2, %ymm2 +vmovdqa 8032(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 7840(%r12), %ymm3, %ymm3 +vpsubw 7552(%r12), %ymm2, %ymm2 +vpaddw 7936(%r12), %ymm2, %ymm2 +vmovdqa 8224(%r12), %ymm4 +vpsubw 8320(%r12), %ymm4, %ymm4 +vmovdqa 8608(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 8416(%r12), %ymm5, %ymm5 +vpsubw 8128(%r12), %ymm4, %ymm4 +vpaddw 8512(%r12), %ymm4, %ymm4 +vpsubw 7552(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 6976(%r12), %ymm1, %ymm1 +vpaddw 8128(%r12), %ymm1, %ymm1 +vmovdqa 7264(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 8416(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 7840(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 6976(%r12), %ymm8 +vmovdqa 7840(%r12), %ymm9 +vmovdqa %ymm8, 1024(%r8) +vmovdqa %ymm0, 1056(%r8) +vmovdqa %ymm1, 1088(%r8) +vmovdqa %ymm7, 1120(%r8) +vmovdqa %ymm5, 1152(%r8) +vmovdqa %ymm2, 1184(%r8) +vmovdqa %ymm3, 1216(%r8) +vmovdqa %ymm9, 1248(%r8) +vmovdqa 8800(%r12), %ymm0 +vpsubw 8896(%r12), %ymm0, %ymm0 +vmovdqa 9184(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 8992(%r12), %ymm1, %ymm1 +vpsubw 8704(%r12), %ymm0, %ymm0 +vpaddw 9088(%r12), %ymm0, %ymm0 +vmovdqa 9376(%r12), %ymm2 +vpsubw 9472(%r12), %ymm2, %ymm2 +vmovdqa 9760(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 9568(%r12), %ymm3, %ymm3 +vpsubw 9280(%r12), %ymm2, %ymm2 +vpaddw 9664(%r12), %ymm2, %ymm2 +vmovdqa 9952(%r12), %ymm4 +vpsubw 10048(%r12), %ymm4, %ymm4 +vmovdqa 10336(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 10144(%r12), %ymm5, %ymm5 +vpsubw 9856(%r12), %ymm4, %ymm4 +vpaddw 10240(%r12), %ymm4, %ymm4 +vpsubw 9280(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 8704(%r12), %ymm1, %ymm1 +vpaddw 9856(%r12), %ymm1, %ymm1 +vmovdqa 8992(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 10144(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 9568(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 8704(%r12), %ymm8 +vmovdqa 9568(%r12), %ymm9 +vmovdqa %ymm8, 1280(%r8) +vmovdqa %ymm0, 1312(%r8) +vmovdqa %ymm1, 1344(%r8) +vmovdqa %ymm7, 1376(%r8) +vmovdqa %ymm5, 1408(%r8) +vmovdqa %ymm2, 1440(%r8) +vmovdqa %ymm3, 1472(%r8) +vmovdqa %ymm9, 1504(%r8) +vmovdqa 10528(%r12), %ymm0 +vpsubw 10624(%r12), %ymm0, %ymm0 +vmovdqa 10912(%r12), %ymm1 +vpsubw %ymm0, %ymm1, %ymm1 +vpsubw 10720(%r12), %ymm1, %ymm1 +vpsubw 10432(%r12), %ymm0, %ymm0 +vpaddw 10816(%r12), %ymm0, %ymm0 +vmovdqa 11104(%r12), %ymm2 +vpsubw 11200(%r12), %ymm2, %ymm2 +vmovdqa 11488(%r12), %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw 11296(%r12), %ymm3, %ymm3 +vpsubw 11008(%r12), %ymm2, %ymm2 +vpaddw 11392(%r12), %ymm2, %ymm2 +vmovdqa 11680(%r12), %ymm4 +vpsubw 11776(%r12), %ymm4, %ymm4 +vmovdqa 12064(%r12), %ymm5 +vpsubw %ymm4, %ymm5, %ymm5 +vpsubw 11872(%r12), %ymm5, %ymm5 +vpsubw 11584(%r12), %ymm4, %ymm4 +vpaddw 11968(%r12), %ymm4, %ymm4 +vpsubw 11008(%r12), %ymm1, %ymm1 +vpsubw %ymm1, %ymm5, %ymm5 +vpsubw %ymm3, %ymm5, %ymm5 +vpsubw 10432(%r12), %ymm1, %ymm1 +vpaddw 11584(%r12), %ymm1, %ymm1 +vmovdqa 10720(%r12), %ymm6 +vpsubw %ymm2, %ymm6, %ymm7 +vmovdqa 11872(%r12), %ymm2 +vpsubw %ymm7, %ymm2, %ymm2 +vpsubw 11296(%r12), %ymm2, %ymm2 +vpsubw %ymm0, %ymm7, %ymm7 +vpaddw %ymm4, %ymm7, %ymm7 +vmovdqa 10432(%r12), %ymm8 +vmovdqa 11296(%r12), %ymm9 +vmovdqa %ymm8, 1536(%r8) +vmovdqa %ymm0, 1568(%r8) +vmovdqa %ymm1, 1600(%r8) +vmovdqa %ymm7, 1632(%r8) +vmovdqa %ymm5, 1664(%r8) +vmovdqa %ymm2, 1696(%r8) +vmovdqa %ymm3, 1728(%r8) +vmovdqa %ymm9, 1760(%r8) +vmovdqa 0(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm2, %ymm2 +vmovdqa 256(%r8), %ymm9 +vpunpcklwd const0(%rip), %ymm9, %ymm8 +vpunpckhwd const0(%rip), %ymm9, %ymm9 +vmovdqa 512(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm8, %ymm3 +vpaddd %ymm6, %ymm9, %ymm7 +vpsubd %ymm4, %ymm3, %ymm3 +vpsubd %ymm2, %ymm7, %ymm7 +vpsubd %ymm5, %ymm8, %ymm5 +vpsubd %ymm6, %ymm9, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1536(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm9 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm8, %ymm8 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm8, %ymm7, %ymm7 +vpsrld $1, %ymm3, %ymm3 +vpsrld $1, %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpackusdw %ymm7, %ymm3, %ymm7 +vmovdqa 768(%r8), %ymm3 +vpaddw 1024(%r8), %ymm3, %ymm8 +vpsubw 1024(%r8), %ymm3, %ymm3 +vpsrlw $2, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsllw $1, %ymm11, %ymm9 +vpsubw %ymm9, %ymm8, %ymm9 +vpsllw $7, %ymm5, %ymm8 +vpsubw %ymm8, %ymm9, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm7, %ymm8, %ymm8 +vmovdqa 1280(%r8), %ymm9 +vpsubw %ymm11, %ymm9, %ymm9 +vpmullw %ymm15, %ymm5, %ymm2 +vpsubw %ymm2, %ymm9, %ymm2 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm8, %ymm7, %ymm7 +vpmullw %ymm12, %ymm8, %ymm9 +vpaddw %ymm9, %ymm7, %ymm9 +vpmullw %ymm12, %ymm9, %ymm9 +vpsubw %ymm9, %ymm2, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm3, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpmullw %ymm13, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_4_3_1(%rip), %ymm8, %ymm2 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm4 +vpor %ymm4, %ymm8, %ymm8 +vpaddw 2048(%r8), %ymm11, %ymm11 +vpaddw %ymm8, %ymm11, %ymm11 +vmovdqa %xmm2, 2048(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_4_3_1(%rip), %ymm9, %ymm2 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm4 +vpor %ymm4, %ymm9, %ymm9 +vpaddw 2304(%r8), %ymm6, %ymm6 +vpaddw %ymm9, %ymm6, %ymm6 +vmovdqa %xmm2, 2304(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_4_3_1(%rip), %ymm5, %ymm2 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm4 +vpor %ymm4, %ymm5, %ymm5 +vpaddw 2560(%r8), %ymm7, %ymm7 +vpaddw %ymm5, %ymm7, %ymm7 +vmovdqa %xmm2, 2560(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %xmm11, 64(%rdi) +vextracti128 $1, %ymm11, %xmm11 +vmovq %xmm11, 80(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 416(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 432(%rdi) +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %xmm7, 768(%rdi) +vextracti128 $1, %ymm7, %xmm7 +vmovq %xmm7, 784(%rdi) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %xmm3, 1120(%rdi) +vextracti128 $1, %ymm3, %xmm3 +vmovq %xmm3, 1136(%rdi) +vmovdqa 32(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm9 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm8, %ymm8 +vmovdqa 288(%r8), %ymm3 +vpunpcklwd const0(%rip), %ymm3, %ymm7 +vpunpckhwd const0(%rip), %ymm3, %ymm3 +vmovdqa 544(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm7, %ymm2 +vpaddd %ymm6, %ymm3, %ymm4 +vpsubd %ymm9, %ymm2, %ymm2 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm11, %ymm7, %ymm11 +vpsubd %ymm6, %ymm3, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1568(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm3 +vpunpckhwd const0(%rip), %ymm11, %ymm7 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm7, %ymm7 +vpsubd %ymm3, %ymm2, %ymm2 +vpsubd %ymm7, %ymm4, %ymm4 +vpsrld $1, %ymm2, %ymm2 +vpsrld $1, %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpackusdw %ymm4, %ymm2, %ymm4 +vmovdqa 800(%r8), %ymm2 +vpaddw 1056(%r8), %ymm2, %ymm7 +vpsubw 1056(%r8), %ymm2, %ymm2 +vpsrlw $2, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsllw $1, %ymm5, %ymm3 +vpsubw %ymm3, %ymm7, %ymm3 +vpsllw $7, %ymm11, %ymm7 +vpsubw %ymm7, %ymm3, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm4, %ymm7, %ymm7 +vmovdqa 1312(%r8), %ymm3 +vpsubw %ymm5, %ymm3, %ymm3 +vpmullw %ymm15, %ymm11, %ymm8 +vpsubw %ymm8, %ymm3, %ymm8 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm7, %ymm4, %ymm4 +vpmullw %ymm12, %ymm7, %ymm3 +vpaddw %ymm3, %ymm4, %ymm3 +vpmullw %ymm12, %ymm3, %ymm3 +vpsubw %ymm3, %ymm8, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vpsubw %ymm3, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vpmullw %ymm13, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_4_3_1(%rip), %ymm7, %ymm8 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $139, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm9 +vpor %ymm9, %ymm7, %ymm7 +vpaddw 2080(%r8), %ymm5, %ymm5 +vpaddw %ymm7, %ymm5, %ymm5 +vmovdqa %xmm8, 2080(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_4_3_1(%rip), %ymm3, %ymm8 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $139, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm9 +vpor %ymm9, %ymm3, %ymm3 +vpaddw 2336(%r8), %ymm6, %ymm6 +vpaddw %ymm3, %ymm6, %ymm6 +vmovdqa %xmm8, 2336(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_4_3_1(%rip), %ymm11, %ymm8 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $139, %ymm8, %ymm8 +vpand mask_keephigh(%rip), %ymm8, %ymm9 +vpor %ymm9, %ymm11, %ymm11 +vpaddw 2592(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vmovdqa %xmm8, 2592(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %xmm5, 152(%rdi) +vextracti128 $1, %ymm5, %xmm5 +vmovq %xmm5, 168(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 504(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 520(%rdi) +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %xmm4, 856(%rdi) +vextracti128 $1, %ymm4, %xmm4 +vmovq %xmm4, 872(%rdi) +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %xmm2, 1208(%rdi) +vextracti128 $1, %ymm2, %xmm2 +vmovq %xmm2, 1224(%rdi) +vmovdqa 64(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm3 +vpunpckhwd const0(%rip), %ymm11, %ymm7 +vpslld $1, %ymm3, %ymm3 +vpslld $1, %ymm7, %ymm7 +vmovdqa 320(%r8), %ymm2 +vpunpcklwd const0(%rip), %ymm2, %ymm4 +vpunpckhwd const0(%rip), %ymm2, %ymm2 +vmovdqa 576(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm4, %ymm8 +vpaddd %ymm6, %ymm2, %ymm9 +vpsubd %ymm3, %ymm8, %ymm8 +vpsubd %ymm7, %ymm9, %ymm9 +vpsubd %ymm5, %ymm4, %ymm5 +vpsubd %ymm6, %ymm2, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1600(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm4 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm4, %ymm4 +vpsubd %ymm2, %ymm8, %ymm8 +vpsubd %ymm4, %ymm9, %ymm9 +vpsrld $1, %ymm8, %ymm8 +vpsrld $1, %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpackusdw %ymm9, %ymm8, %ymm9 +vmovdqa 832(%r8), %ymm8 +vpaddw 1088(%r8), %ymm8, %ymm4 +vpsubw 1088(%r8), %ymm8, %ymm8 +vpsrlw $2, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsllw $1, %ymm11, %ymm2 +vpsubw %ymm2, %ymm4, %ymm2 +vpsllw $7, %ymm5, %ymm4 +vpsubw %ymm4, %ymm2, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm9, %ymm4, %ymm4 +vmovdqa 1344(%r8), %ymm2 +vpsubw %ymm11, %ymm2, %ymm2 +vpmullw %ymm15, %ymm5, %ymm7 +vpsubw %ymm7, %ymm2, %ymm7 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm4, %ymm9, %ymm9 +vpmullw %ymm12, %ymm4, %ymm2 +vpaddw %ymm2, %ymm9, %ymm2 +vpmullw %ymm12, %ymm2, %ymm2 +vpsubw %ymm2, %ymm7, %ymm2 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm6, %ymm2, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vpmullw %ymm13, %ymm2, %ymm2 +vpsubw %ymm2, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_4_3_1(%rip), %ymm4, %ymm7 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $139, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm3 +vpor %ymm3, %ymm4, %ymm4 +vpaddw 2112(%r8), %ymm11, %ymm11 +vpaddw %ymm4, %ymm11, %ymm11 +vmovdqa %xmm7, 2112(%r8) +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_4_3_1(%rip), %ymm2, %ymm7 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $139, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm3 +vpor %ymm3, %ymm2, %ymm2 +vpaddw 2368(%r8), %ymm6, %ymm6 +vpaddw %ymm2, %ymm6, %ymm6 +vmovdqa %xmm7, 2368(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_4_3_1(%rip), %ymm5, %ymm7 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $139, %ymm7, %ymm7 +vpand mask_keephigh(%rip), %ymm7, %ymm3 +vpor %ymm3, %ymm5, %ymm5 +vpaddw 2624(%r8), %ymm9, %ymm9 +vpaddw %ymm5, %ymm9, %ymm9 +vmovdqa %xmm7, 2624(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %xmm11, 240(%rdi) +vextracti128 $1, %ymm11, %xmm11 +vmovq %xmm11, 256(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 592(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 608(%rdi) +vpand mask_mod8192(%rip), %ymm9, %ymm9 +vmovdqu %xmm9, 944(%rdi) +vextracti128 $1, %ymm9, %xmm9 +vmovq %xmm9, 960(%rdi) +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %xmm8, 1296(%rdi) +vextracti128 $1, %ymm8, %xmm8 +vmovq %xmm8, 1312(%rdi) +vmovdqa 96(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm2 +vpunpckhwd const0(%rip), %ymm5, %ymm4 +vpslld $1, %ymm2, %ymm2 +vpslld $1, %ymm4, %ymm4 +vmovdqa 352(%r8), %ymm8 +vpunpcklwd const0(%rip), %ymm8, %ymm9 +vpunpckhwd const0(%rip), %ymm8, %ymm8 +vmovdqa 608(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm9, %ymm7 +vpaddd %ymm6, %ymm8, %ymm3 +vpsubd %ymm2, %ymm7, %ymm7 +vpsubd %ymm4, %ymm3, %ymm3 +vpsubd %ymm11, %ymm9, %ymm11 +vpsubd %ymm6, %ymm8, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1632(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm9 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm9, %ymm9 +vpsubd %ymm8, %ymm7, %ymm7 +vpsubd %ymm9, %ymm3, %ymm3 +vpsrld $1, %ymm7, %ymm7 +vpsrld $1, %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpackusdw %ymm3, %ymm7, %ymm3 +vmovdqa 864(%r8), %ymm7 +vpaddw 1120(%r8), %ymm7, %ymm9 +vpsubw 1120(%r8), %ymm7, %ymm7 +vpsrlw $2, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsllw $1, %ymm5, %ymm8 +vpsubw %ymm8, %ymm9, %ymm8 +vpsllw $7, %ymm11, %ymm9 +vpsubw %ymm9, %ymm8, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm3, %ymm9, %ymm9 +vmovdqa 1376(%r8), %ymm8 +vpsubw %ymm5, %ymm8, %ymm8 +vpmullw %ymm15, %ymm11, %ymm4 +vpsubw %ymm4, %ymm8, %ymm4 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm3 +vpmullw %ymm12, %ymm9, %ymm8 +vpaddw %ymm8, %ymm3, %ymm8 +vpmullw %ymm12, %ymm8, %ymm8 +vpsubw %ymm8, %ymm4, %ymm8 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm6, %ymm8, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm7, %ymm8, %ymm8 +vpsubw %ymm8, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vpmullw %ymm13, %ymm8, %ymm8 +vpsubw %ymm8, %ymm6, %ymm6 +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_4_3_1(%rip), %ymm9, %ymm4 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $139, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm9, %ymm9 +vpaddw 2144(%r8), %ymm5, %ymm5 +vpaddw %ymm9, %ymm5, %ymm5 +vmovdqa %xmm4, 2144(%r8) +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_4_3_1(%rip), %ymm8, %ymm4 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $139, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm8, %ymm8 +vpaddw 2400(%r8), %ymm6, %ymm6 +vpaddw %ymm8, %ymm6, %ymm6 +vmovdqa %xmm4, 2400(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_4_3_1(%rip), %ymm11, %ymm4 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $139, %ymm4, %ymm4 +vpand mask_keephigh(%rip), %ymm4, %ymm2 +vpor %ymm2, %ymm11, %ymm11 +vpaddw 2656(%r8), %ymm3, %ymm3 +vpaddw %ymm11, %ymm3, %ymm3 +vmovdqa %xmm4, 2656(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %xmm5, 328(%rdi) +vextracti128 $1, %ymm5, %xmm5 +vmovq %xmm5, 344(%rdi) +vpshufb shufmin1_mask3(%rip), %ymm5, %ymm5 +vmovdqa %xmm5, 1792(%r8) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 680(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 696(%rdi) +vpshufb shufmin1_mask3(%rip), %ymm6, %ymm6 +vmovdqa %xmm6, 1824(%r8) +vpand mask_mod8192(%rip), %ymm3, %ymm3 +vmovdqu %xmm3, 1032(%rdi) +vextracti128 $1, %ymm3, %xmm3 +vmovq %xmm3, 1048(%rdi) +vpshufb shufmin1_mask3(%rip), %ymm3, %ymm3 +vmovdqa %xmm3, 1856(%r8) +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %xmm7, 1384(%rdi) +vextracti128 $1, %ymm7, %xmm7 +vpextrw $0, %xmm7, 1400(%rdi) +vpshufb shufmin1_mask3(%rip), %ymm7, %ymm7 +vmovdqa %xmm7, 1888(%r8) +vmovdqa 128(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm8 +vpunpckhwd const0(%rip), %ymm11, %ymm9 +vpslld $1, %ymm8, %ymm8 +vpslld $1, %ymm9, %ymm9 +vmovdqa 384(%r8), %ymm7 +vpunpcklwd const0(%rip), %ymm7, %ymm3 +vpunpckhwd const0(%rip), %ymm7, %ymm7 +vmovdqa 640(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm3, %ymm4 +vpaddd %ymm6, %ymm7, %ymm2 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm9, %ymm2, %ymm2 +vpsubd %ymm5, %ymm3, %ymm5 +vpsubd %ymm6, %ymm7, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1664(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm7 +vpunpckhwd const0(%rip), %ymm5, %ymm3 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm3, %ymm3 +vpsubd %ymm7, %ymm4, %ymm4 +vpsubd %ymm3, %ymm2, %ymm2 +vpsrld $1, %ymm4, %ymm4 +vpsrld $1, %ymm2, %ymm2 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm2, %ymm2 +vpackusdw %ymm2, %ymm4, %ymm2 +vmovdqa 896(%r8), %ymm4 +vpaddw 1152(%r8), %ymm4, %ymm3 +vpsubw 1152(%r8), %ymm4, %ymm4 +vpsrlw $2, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsllw $1, %ymm11, %ymm7 +vpsubw %ymm7, %ymm3, %ymm7 +vpsllw $7, %ymm5, %ymm3 +vpsubw %ymm3, %ymm7, %ymm3 +vpsrlw $3, %ymm3, %ymm3 +vpsubw %ymm2, %ymm3, %ymm3 +vmovdqa 1408(%r8), %ymm7 +vpsubw %ymm11, %ymm7, %ymm7 +vpmullw %ymm15, %ymm5, %ymm9 +vpsubw %ymm9, %ymm7, %ymm9 +vpmullw %ymm14, %ymm3, %ymm3 +vpsubw %ymm3, %ymm2, %ymm2 +vpmullw %ymm12, %ymm3, %ymm7 +vpaddw %ymm7, %ymm2, %ymm7 +vpmullw %ymm12, %ymm7, %ymm7 +vpsubw %ymm7, %ymm9, %ymm7 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm6, %ymm7, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm4, %ymm7, %ymm7 +vpsubw %ymm7, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vpmullw %ymm13, %ymm7, %ymm7 +vpsubw %ymm7, %ymm6, %ymm6 +vmovdqu 416(%rdi), %ymm9 +vmovdqu 768(%rdi), %ymm8 +vmovdqu 1120(%rdi), %ymm10 +vpaddw %ymm11, %ymm9, %ymm11 +vpaddw %ymm6, %ymm8, %ymm6 +vpaddw %ymm2, %ymm10, %ymm2 +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_4_3_1(%rip), %ymm4, %ymm10 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $139, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm8 +vpor %ymm8, %ymm4, %ymm4 +vmovdqu 64(%rdi), %ymm8 +vpaddw 1920(%r8), %ymm8, %ymm8 +vpaddw %ymm4, %ymm8, %ymm8 +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %xmm8, 64(%rdi) +vextracti128 $1, %ymm8, %xmm8 +vmovq %xmm8, 80(%rdi) +vmovdqa %xmm10, 1920(%r8) +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_4_3_1(%rip), %ymm3, %ymm10 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $139, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm8 +vpor %ymm8, %ymm3, %ymm3 +vpaddw 2176(%r8), %ymm11, %ymm11 +vpaddw %ymm3, %ymm11, %ymm11 +vmovdqa %xmm10, 2176(%r8) +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_4_3_1(%rip), %ymm7, %ymm10 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $139, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm8 +vpor %ymm8, %ymm7, %ymm7 +vpaddw 2432(%r8), %ymm6, %ymm6 +vpaddw %ymm7, %ymm6, %ymm6 +vmovdqa %xmm10, 2432(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_4_3_1(%rip), %ymm5, %ymm10 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $139, %ymm10, %ymm10 +vpand mask_keephigh(%rip), %ymm10, %ymm8 +vpor %ymm8, %ymm5, %ymm5 +vpaddw 2688(%r8), %ymm2, %ymm2 +vpaddw %ymm5, %ymm2, %ymm2 +vmovdqa %xmm10, 2688(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %xmm11, 416(%rdi) +vextracti128 $1, %ymm11, %xmm11 +vmovq %xmm11, 432(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 768(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 784(%rdi) +vpand mask_mod8192(%rip), %ymm2, %ymm2 +vmovdqu %xmm2, 1120(%rdi) +vextracti128 $1, %ymm2, %xmm2 +vmovq %xmm2, 1136(%rdi) +vmovdqa 160(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm7 +vpunpckhwd const0(%rip), %ymm5, %ymm3 +vpslld $1, %ymm7, %ymm7 +vpslld $1, %ymm3, %ymm3 +vmovdqa 416(%r8), %ymm4 +vpunpcklwd const0(%rip), %ymm4, %ymm2 +vpunpckhwd const0(%rip), %ymm4, %ymm4 +vmovdqa 672(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm2, %ymm10 +vpaddd %ymm6, %ymm4, %ymm8 +vpsubd %ymm7, %ymm10, %ymm10 +vpsubd %ymm3, %ymm8, %ymm8 +vpsubd %ymm11, %ymm2, %ymm11 +vpsubd %ymm6, %ymm4, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1696(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm2, %ymm2 +vpsubd %ymm4, %ymm10, %ymm10 +vpsubd %ymm2, %ymm8, %ymm8 +vpsrld $1, %ymm10, %ymm10 +vpsrld $1, %ymm8, %ymm8 +vpand mask32_to_16(%rip), %ymm10, %ymm10 +vpand mask32_to_16(%rip), %ymm8, %ymm8 +vpackusdw %ymm8, %ymm10, %ymm8 +vmovdqa 928(%r8), %ymm10 +vpaddw 1184(%r8), %ymm10, %ymm2 +vpsubw 1184(%r8), %ymm10, %ymm10 +vpsrlw $2, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsllw $1, %ymm5, %ymm4 +vpsubw %ymm4, %ymm2, %ymm4 +vpsllw $7, %ymm11, %ymm2 +vpsubw %ymm2, %ymm4, %ymm2 +vpsrlw $3, %ymm2, %ymm2 +vpsubw %ymm8, %ymm2, %ymm2 +vmovdqa 1440(%r8), %ymm4 +vpsubw %ymm5, %ymm4, %ymm4 +vpmullw %ymm15, %ymm11, %ymm3 +vpsubw %ymm3, %ymm4, %ymm3 +vpmullw %ymm14, %ymm2, %ymm2 +vpsubw %ymm2, %ymm8, %ymm8 +vpmullw %ymm12, %ymm2, %ymm4 +vpaddw %ymm4, %ymm8, %ymm4 +vpmullw %ymm12, %ymm4, %ymm4 +vpsubw %ymm4, %ymm3, %ymm4 +vpmullw %ymm14, %ymm4, %ymm4 +vpsubw %ymm6, %ymm4, %ymm4 +vpsrlw $3, %ymm4, %ymm4 +vpsubw %ymm10, %ymm4, %ymm4 +vpsubw %ymm4, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vpmullw %ymm13, %ymm4, %ymm4 +vpsubw %ymm4, %ymm6, %ymm6 +vmovdqu 504(%rdi), %ymm3 +vmovdqu 856(%rdi), %ymm7 +vmovdqu 1208(%rdi), %ymm9 +vpaddw %ymm5, %ymm3, %ymm5 +vpaddw %ymm6, %ymm7, %ymm6 +vpaddw %ymm8, %ymm9, %ymm8 +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_4_3_1(%rip), %ymm10, %ymm9 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $139, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm7 +vpor %ymm7, %ymm10, %ymm10 +vmovdqu 152(%rdi), %ymm7 +vpaddw 1952(%r8), %ymm7, %ymm7 +vpaddw %ymm10, %ymm7, %ymm7 +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %xmm7, 152(%rdi) +vextracti128 $1, %ymm7, %xmm7 +vmovq %xmm7, 168(%rdi) +vmovdqa %xmm9, 1952(%r8) +vpshufb shuf48_16(%rip), %ymm2, %ymm2 +vpand mask3_5_4_3_1(%rip), %ymm2, %ymm9 +vpand mask5_3_5_3(%rip), %ymm2, %ymm2 +vpermq $139, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm7 +vpor %ymm7, %ymm2, %ymm2 +vpaddw 2208(%r8), %ymm5, %ymm5 +vpaddw %ymm2, %ymm5, %ymm5 +vmovdqa %xmm9, 2208(%r8) +vpshufb shuf48_16(%rip), %ymm4, %ymm4 +vpand mask3_5_4_3_1(%rip), %ymm4, %ymm9 +vpand mask5_3_5_3(%rip), %ymm4, %ymm4 +vpermq $139, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm7 +vpor %ymm7, %ymm4, %ymm4 +vpaddw 2464(%r8), %ymm6, %ymm6 +vpaddw %ymm4, %ymm6, %ymm6 +vmovdqa %xmm9, 2464(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_4_3_1(%rip), %ymm11, %ymm9 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $139, %ymm9, %ymm9 +vpand mask_keephigh(%rip), %ymm9, %ymm7 +vpor %ymm7, %ymm11, %ymm11 +vpaddw 2720(%r8), %ymm8, %ymm8 +vpaddw %ymm11, %ymm8, %ymm8 +vmovdqa %xmm9, 2720(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %xmm5, 504(%rdi) +vextracti128 $1, %ymm5, %xmm5 +vmovq %xmm5, 520(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 856(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 872(%rdi) +vpand mask_mod8192(%rip), %ymm8, %ymm8 +vmovdqu %xmm8, 1208(%rdi) +vextracti128 $1, %ymm8, %xmm8 +vmovq %xmm8, 1224(%rdi) +vmovdqa 192(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm4 +vpunpckhwd const0(%rip), %ymm11, %ymm2 +vpslld $1, %ymm4, %ymm4 +vpslld $1, %ymm2, %ymm2 +vmovdqa 448(%r8), %ymm10 +vpunpcklwd const0(%rip), %ymm10, %ymm8 +vpunpckhwd const0(%rip), %ymm10, %ymm10 +vmovdqa 704(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm5 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm5, %ymm8, %ymm9 +vpaddd %ymm6, %ymm10, %ymm7 +vpsubd %ymm4, %ymm9, %ymm9 +vpsubd %ymm2, %ymm7, %ymm7 +vpsubd %ymm5, %ymm8, %ymm5 +vpsubd %ymm6, %ymm10, %ymm6 +vpsrld $1, %ymm5, %ymm5 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm5, %ymm5 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm5, %ymm6 +vmovdqa 1728(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm10 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm8, %ymm8 +vpsubd %ymm10, %ymm9, %ymm9 +vpsubd %ymm8, %ymm7, %ymm7 +vpsrld $1, %ymm9, %ymm9 +vpsrld $1, %ymm7, %ymm7 +vpand mask32_to_16(%rip), %ymm9, %ymm9 +vpand mask32_to_16(%rip), %ymm7, %ymm7 +vpackusdw %ymm7, %ymm9, %ymm7 +vmovdqa 960(%r8), %ymm9 +vpaddw 1216(%r8), %ymm9, %ymm8 +vpsubw 1216(%r8), %ymm9, %ymm9 +vpsrlw $2, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsllw $1, %ymm11, %ymm10 +vpsubw %ymm10, %ymm8, %ymm10 +vpsllw $7, %ymm5, %ymm8 +vpsubw %ymm8, %ymm10, %ymm8 +vpsrlw $3, %ymm8, %ymm8 +vpsubw %ymm7, %ymm8, %ymm8 +vmovdqa 1472(%r8), %ymm10 +vpsubw %ymm11, %ymm10, %ymm10 +vpmullw %ymm15, %ymm5, %ymm2 +vpsubw %ymm2, %ymm10, %ymm2 +vpmullw %ymm14, %ymm8, %ymm8 +vpsubw %ymm8, %ymm7, %ymm7 +vpmullw %ymm12, %ymm8, %ymm10 +vpaddw %ymm10, %ymm7, %ymm10 +vpmullw %ymm12, %ymm10, %ymm10 +vpsubw %ymm10, %ymm2, %ymm10 +vpmullw %ymm14, %ymm10, %ymm10 +vpsubw %ymm6, %ymm10, %ymm10 +vpsrlw $3, %ymm10, %ymm10 +vpsubw %ymm9, %ymm10, %ymm10 +vpsubw %ymm10, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vpmullw %ymm13, %ymm10, %ymm10 +vpsubw %ymm10, %ymm6, %ymm6 +vmovdqu 592(%rdi), %ymm2 +vmovdqu 944(%rdi), %ymm4 +vmovdqu 1296(%rdi), %ymm3 +vpaddw %ymm11, %ymm2, %ymm11 +vpaddw %ymm6, %ymm4, %ymm6 +vpaddw %ymm7, %ymm3, %ymm7 +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_4_3_1(%rip), %ymm9, %ymm3 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $139, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm9, %ymm9 +vmovdqu 240(%rdi), %ymm4 +vpaddw 1984(%r8), %ymm4, %ymm4 +vpaddw %ymm9, %ymm4, %ymm4 +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %xmm4, 240(%rdi) +vextracti128 $1, %ymm4, %xmm4 +vmovq %xmm4, 256(%rdi) +vmovdqa %xmm3, 1984(%r8) +vpshufb shuf48_16(%rip), %ymm8, %ymm8 +vpand mask3_5_4_3_1(%rip), %ymm8, %ymm3 +vpand mask5_3_5_3(%rip), %ymm8, %ymm8 +vpermq $139, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm8, %ymm8 +vpaddw 2240(%r8), %ymm11, %ymm11 +vpaddw %ymm8, %ymm11, %ymm11 +vmovdqa %xmm3, 2240(%r8) +vpshufb shuf48_16(%rip), %ymm10, %ymm10 +vpand mask3_5_4_3_1(%rip), %ymm10, %ymm3 +vpand mask5_3_5_3(%rip), %ymm10, %ymm10 +vpermq $139, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm10, %ymm10 +vpaddw 2496(%r8), %ymm6, %ymm6 +vpaddw %ymm10, %ymm6, %ymm6 +vmovdqa %xmm3, 2496(%r8) +vpshufb shuf48_16(%rip), %ymm5, %ymm5 +vpand mask3_5_4_3_1(%rip), %ymm5, %ymm3 +vpand mask5_3_5_3(%rip), %ymm5, %ymm5 +vpermq $139, %ymm3, %ymm3 +vpand mask_keephigh(%rip), %ymm3, %ymm4 +vpor %ymm4, %ymm5, %ymm5 +vpaddw 2752(%r8), %ymm7, %ymm7 +vpaddw %ymm5, %ymm7, %ymm7 +vmovdqa %xmm3, 2752(%r8) +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %xmm11, 592(%rdi) +vextracti128 $1, %ymm11, %xmm11 +vmovq %xmm11, 608(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 944(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 960(%rdi) +vpand mask_mod8192(%rip), %ymm7, %ymm7 +vmovdqu %xmm7, 1296(%rdi) +vextracti128 $1, %ymm7, %xmm7 +vmovq %xmm7, 1312(%rdi) +vmovdqa 224(%r8), %ymm5 +vpunpcklwd const0(%rip), %ymm5, %ymm10 +vpunpckhwd const0(%rip), %ymm5, %ymm8 +vpslld $1, %ymm10, %ymm10 +vpslld $1, %ymm8, %ymm8 +vmovdqa 480(%r8), %ymm9 +vpunpcklwd const0(%rip), %ymm9, %ymm7 +vpunpckhwd const0(%rip), %ymm9, %ymm9 +vmovdqa 736(%r8), %ymm6 +vpunpcklwd const0(%rip), %ymm6, %ymm11 +vpunpckhwd const0(%rip), %ymm6, %ymm6 +vpaddd %ymm11, %ymm7, %ymm3 +vpaddd %ymm6, %ymm9, %ymm4 +vpsubd %ymm10, %ymm3, %ymm3 +vpsubd %ymm8, %ymm4, %ymm4 +vpsubd %ymm11, %ymm7, %ymm11 +vpsubd %ymm6, %ymm9, %ymm6 +vpsrld $1, %ymm11, %ymm11 +vpsrld $1, %ymm6, %ymm6 +vpand mask32_to_16(%rip), %ymm11, %ymm11 +vpand mask32_to_16(%rip), %ymm6, %ymm6 +vpackusdw %ymm6, %ymm11, %ymm6 +vmovdqa 1760(%r8), %ymm11 +vpunpcklwd const0(%rip), %ymm11, %ymm9 +vpunpckhwd const0(%rip), %ymm11, %ymm7 +vpslld $1, %ymm9, %ymm9 +vpslld $1, %ymm7, %ymm7 +vpsubd %ymm9, %ymm3, %ymm3 +vpsubd %ymm7, %ymm4, %ymm4 +vpsrld $1, %ymm3, %ymm3 +vpsrld $1, %ymm4, %ymm4 +vpand mask32_to_16(%rip), %ymm3, %ymm3 +vpand mask32_to_16(%rip), %ymm4, %ymm4 +vpackusdw %ymm4, %ymm3, %ymm4 +vmovdqa 992(%r8), %ymm3 +vpaddw 1248(%r8), %ymm3, %ymm7 +vpsubw 1248(%r8), %ymm3, %ymm3 +vpsrlw $2, %ymm3, %ymm3 +vpsubw %ymm6, %ymm3, %ymm3 +vpmullw %ymm14, %ymm3, %ymm3 +vpsllw $1, %ymm5, %ymm9 +vpsubw %ymm9, %ymm7, %ymm9 +vpsllw $7, %ymm11, %ymm7 +vpsubw %ymm7, %ymm9, %ymm7 +vpsrlw $3, %ymm7, %ymm7 +vpsubw %ymm4, %ymm7, %ymm7 +vmovdqa 1504(%r8), %ymm9 +vpsubw %ymm5, %ymm9, %ymm9 +vpmullw %ymm15, %ymm11, %ymm8 +vpsubw %ymm8, %ymm9, %ymm8 +vpmullw %ymm14, %ymm7, %ymm7 +vpsubw %ymm7, %ymm4, %ymm4 +vpmullw %ymm12, %ymm7, %ymm9 +vpaddw %ymm9, %ymm4, %ymm9 +vpmullw %ymm12, %ymm9, %ymm9 +vpsubw %ymm9, %ymm8, %ymm9 +vpmullw %ymm14, %ymm9, %ymm9 +vpsubw %ymm6, %ymm9, %ymm9 +vpsrlw $3, %ymm9, %ymm9 +vpsubw %ymm3, %ymm9, %ymm9 +vpsubw %ymm9, %ymm3, %ymm3 +vpsubw %ymm3, %ymm6, %ymm6 +vpmullw %ymm13, %ymm9, %ymm9 +vpsubw %ymm9, %ymm6, %ymm6 +vextracti128 $1, %ymm4, %xmm8 +vpshufb shufmin1_mask3(%rip), %ymm8, %ymm8 +vmovdqa %ymm8, 2816(%r8) +vextracti128 $1, %ymm3, %xmm8 +vpshufb shufmin1_mask3(%rip), %ymm8, %ymm8 +vmovdqa %ymm8, 2848(%r8) +vextracti128 $1, %ymm7, %xmm8 +vpshufb shufmin1_mask3(%rip), %ymm8, %ymm8 +vmovdqa %ymm8, 2880(%r8) +vmovdqu 680(%rdi), %ymm8 +vmovdqu 1032(%rdi), %ymm10 + +# Only 18 bytes can be read at 1384, but vmovdqu reads 32. +# Copy 18 bytes to the red zone and zero pad to 32 bytes. +xor %r9, %r9 +movq %r9, -16(%rsp) +movq %r9, -8(%rsp) +movq 1384(%rdi), %r9 +movq %r9, -32(%rsp) +movq 1384+8(%rdi), %r9 +movq %r9, -24(%rsp) +movw 1384+16(%rdi), %r9w +movw %r9w, -16(%rsp) +vmovdqu -32(%rsp), %ymm2 + +vpaddw %ymm5, %ymm8, %ymm5 +vpaddw %ymm6, %ymm10, %ymm6 +vpaddw %ymm4, %ymm2, %ymm4 +vpshufb shuf48_16(%rip), %ymm3, %ymm3 +vpand mask3_5_4_3_1(%rip), %ymm3, %ymm2 +vpand mask5_3_5_3(%rip), %ymm3, %ymm3 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm10 +vpor %ymm10, %ymm3, %ymm3 +vmovdqu 328(%rdi), %ymm10 +vpaddw 2016(%r8), %ymm10, %ymm10 +vpaddw %ymm3, %ymm10, %ymm10 +vpand mask_mod8192(%rip), %ymm10, %ymm10 +vmovdqu %xmm10, 328(%rdi) +vextracti128 $1, %ymm10, %xmm10 +vmovq %xmm10, 344(%rdi) +vpshufb shufmin1_mask3(%rip), %ymm10, %ymm10 +vmovdqa %xmm10, 1792(%r8) +vmovdqa %xmm2, 2016(%r8) +vpshufb shuf48_16(%rip), %ymm7, %ymm7 +vpand mask3_5_4_3_1(%rip), %ymm7, %ymm2 +vpand mask5_3_5_3(%rip), %ymm7, %ymm7 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm10 +vpor %ymm10, %ymm7, %ymm7 +vpaddw 2272(%r8), %ymm5, %ymm5 +vpaddw %ymm7, %ymm5, %ymm5 +vmovdqa %xmm2, 2272(%r8) +vpshufb shuf48_16(%rip), %ymm9, %ymm9 +vpand mask3_5_4_3_1(%rip), %ymm9, %ymm2 +vpand mask5_3_5_3(%rip), %ymm9, %ymm9 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm10 +vpor %ymm10, %ymm9, %ymm9 +vpaddw 2528(%r8), %ymm6, %ymm6 +vpaddw %ymm9, %ymm6, %ymm6 +vmovdqa %xmm2, 2528(%r8) +vpshufb shuf48_16(%rip), %ymm11, %ymm11 +vpand mask3_5_4_3_1(%rip), %ymm11, %ymm2 +vpand mask5_3_5_3(%rip), %ymm11, %ymm11 +vpermq $139, %ymm2, %ymm2 +vpand mask_keephigh(%rip), %ymm2, %ymm10 +vpor %ymm10, %ymm11, %ymm11 +vpaddw 2784(%r8), %ymm4, %ymm4 +vpaddw %ymm11, %ymm4, %ymm4 +vmovdqa %xmm2, 2784(%r8) +vpand mask_mod8192(%rip), %ymm5, %ymm5 +vmovdqu %xmm5, 680(%rdi) +vextracti128 $1, %ymm5, %xmm5 +vmovq %xmm5, 696(%rdi) +vpand mask_mod8192(%rip), %ymm6, %ymm6 +vmovdqu %xmm6, 1032(%rdi) +vextracti128 $1, %ymm6, %xmm6 +vmovq %xmm6, 1048(%rdi) +vpand mask_mod8192(%rip), %ymm4, %ymm4 +vmovdqu %xmm4, 1384(%rdi) +vextracti128 $1, %ymm4, %xmm4 +vpextrw $0, %xmm4, 1400(%rdi) +vmovdqu 0(%rdi), %ymm11 +vpaddw 1888(%r8), %ymm11, %ymm11 +vpaddw 2816(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 0(%rdi) +vmovdqu 352(%rdi), %ymm11 +vpaddw 2528(%r8), %ymm11, %ymm11 +vpaddw 2848(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 352(%rdi) +vmovdqu 704(%rdi), %ymm11 +vpaddw 2784(%r8), %ymm11, %ymm11 +vpaddw 2880(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 704(%rdi) +vmovdqu 88(%rdi), %ymm11 +vpaddw 2048(%r8), %ymm11, %ymm11 +vpaddw 1920(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 88(%rdi) +vmovdqu 440(%rdi), %ymm11 +vpaddw 2304(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 440(%rdi) +vmovdqu 792(%rdi), %ymm11 +vpaddw 2560(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 792(%rdi) +vmovdqu 176(%rdi), %ymm11 +vpaddw 2080(%r8), %ymm11, %ymm11 +vpaddw 1952(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 176(%rdi) +vmovdqu 528(%rdi), %ymm11 +vpaddw 2336(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 528(%rdi) +vmovdqu 880(%rdi), %ymm11 +vpaddw 2592(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 880(%rdi) +vmovdqu 264(%rdi), %ymm11 +vpaddw 2112(%r8), %ymm11, %ymm11 +vpaddw 1984(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 264(%rdi) +vmovdqu 616(%rdi), %ymm11 +vpaddw 2368(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 616(%rdi) +vmovdqu 968(%rdi), %ymm11 +vpaddw 2624(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 968(%rdi) +vmovdqu 352(%rdi), %ymm11 +vpaddw 2144(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 352(%rdi) +vmovdqu 704(%rdi), %ymm11 +vpaddw 2400(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 704(%rdi) +vmovdqu 1056(%rdi), %ymm11 +vpaddw 2656(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 1056(%rdi) +vmovdqu 440(%rdi), %ymm11 +vpaddw 2176(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 440(%rdi) +vmovdqu 792(%rdi), %ymm11 +vpaddw 2432(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 792(%rdi) +vmovdqu 1144(%rdi), %ymm11 +vpaddw 2688(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 1144(%rdi) +vmovdqu 528(%rdi), %ymm11 +vpaddw 2208(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 528(%rdi) +vmovdqu 880(%rdi), %ymm11 +vpaddw 2464(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 880(%rdi) +vmovdqu 1232(%rdi), %ymm11 +vpaddw 2720(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 1232(%rdi) +vmovdqu 616(%rdi), %ymm11 +vpaddw 2240(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 616(%rdi) +vmovdqu 968(%rdi), %ymm11 +vpaddw 2496(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 968(%rdi) +vmovdqu 1320(%rdi), %ymm11 +vpaddw 2752(%r8), %ymm11, %ymm11 +vpand mask_mod8192(%rip), %ymm11, %ymm11 +vmovdqu %ymm11, 1320(%rdi) +pop %r12 +.cfi_restore r12 +pop %rbp +.cfi_restore rbp +.cfi_def_cfa_register rsp +.cfi_adjust_cfa_offset -8 +ret +.cfi_endproc +.size poly_Rq_mul,.-poly_Rq_mul + +#endif + +#if defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff --git a/crypto/hrss/hrss.c b/crypto/hrss/hrss.c index 6feca2c264..572e9817c9 100644 --- a/crypto/hrss/hrss.c +++ b/crypto/hrss/hrss.c @@ -971,6 +971,11 @@ struct POLY_MUL_SCRATCH { vec_t scratch[172]; } vec; #endif + +#if defined(POLY_RQ_MUL_ASM) + // This is the space used by |poly_Rq_mul|. + uint8_t rq[POLY_MUL_RQ_SCRATCH_SPACE]; +#endif } u; }; @@ -1321,6 +1326,13 @@ static void poly_mul_novec(struct POLY_MUL_SCRATCH *scratch, struct poly *out, static void poly_mul(struct POLY_MUL_SCRATCH *scratch, struct poly *r, const struct poly *a, const struct poly *b) { +#if defined(POLY_RQ_MUL_ASM) + if (CRYPTO_is_AVX2_capable()) { + poly_Rq_mul(r->v, a->v, b->v, scratch->u.rq); + poly_normalize(r); + } else +#endif + #if defined(HRSS_HAVE_VECTOR_UNIT) if (vec_capable()) { poly_mul_vec(scratch, r, a, b); diff --git a/crypto/hrss/internal.h b/crypto/hrss/internal.h index 636fa92ea9..340b2e0ef0 100644 --- a/crypto/hrss/internal.h +++ b/crypto/hrss/internal.h @@ -41,6 +41,26 @@ OPENSSL_EXPORT void HRSS_poly3_mul(struct poly3 *out, const struct poly3 *x, OPENSSL_EXPORT void HRSS_poly3_invert(struct poly3 *out, const struct poly3 *in); +// On x86-64, we can use the AVX2 code from [HRSS]. (The authors have given +// explicit permission for this and signed a CLA.) However it's 57KB of object +// code, so it's not used if |OPENSSL_SMALL| is defined. +#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SMALL) && \ + defined(OPENSSL_X86_64) && defined(OPENSSL_LINUX) +#define POLY_RQ_MUL_ASM +// POLY_MUL_RQ_SCRATCH_SPACE is the number of bytes of scratch space needed +// by the assembly function poly_Rq_mul. +#define POLY_MUL_RQ_SCRATCH_SPACE (6144 + 6144 + 12288 + 512 + 9408 + 32) + +// poly_Rq_mul is defined in assembly. Inputs and outputs must be 16-byte- +// aligned. +extern void poly_Rq_mul( + uint16_t r[N + 3], const uint16_t a[N + 3], const uint16_t b[N + 3], + // The following should be `scratch[POLY_MUL_RQ_SCRATCH_SPACE]` but + // GCC 11.1 has a bug with unions that breaks that. + uint8_t scratch[]); +#endif + + #if defined(__cplusplus) } // extern "C" #endif diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 9a62c838ec..faf6d8ab14 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -49,6 +49,9 @@ 'src/crypto/curve25519/asm/x25519-asm-arm.S', 'src/crypto/poly1305/poly1305_arm_asm.S', ], + ('linux', 'x86_64'): [ + 'src/crypto/hrss/asm/poly_rq_mul.S', + ], } PREFIX = None From 8846d7b3c35745f5ecc053f650dd76d3750d7ce5 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Thu, 9 Feb 2023 08:54:39 -0700 Subject: [PATCH 070/177] VMS? I don't think so. Take this for a walk behind the barn. Change-Id: Ia7518c6eeb87f21bbcb88d3b688745d07e963662 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57085 Reviewed-by: David Benjamin Commit-Queue: Bob Beck --- crypto/x509/by_dir.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c index b959bb8bd1..3ad8128cdc 100644 --- a/crypto/x509/by_dir.c +++ b/crypto/x509/by_dir.c @@ -319,29 +319,8 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, hent = NULL; } for (;;) { - char c = '/'; -#ifdef OPENSSL_SYS_VMS - c = ent->dir[strlen(ent->dir) - 1]; - if (c != ':' && c != '>' && c != ']') { - // If no separator is present, we assume the directory - // specifier is a logical name, and add a colon. We - // really should use better VMS routines for merging - // things like this, but this will do for now... -- - // Richard Levitte - c = ':'; - } else { - c = '\0'; - } -#endif - if (c == '\0') { - // This is special. When c == '\0', no directory - // separator should be added. - BIO_snprintf(b->data, b->max, "%s%08lx.%s%d", ent->dir, h, postfix, - k); - } else { - BIO_snprintf(b->data, b->max, "%s%c%08lx.%s%d", ent->dir, c, h, - postfix, k); - } + BIO_snprintf(b->data, b->max, "%s/%08lx.%s%d", ent->dir, h, postfix, + k); #ifndef OPENSSL_NO_POSIX_IO #if defined(_WIN32) && !defined(stat) #define stat _stat From 9580424ca8579317d0ccf1d8db5e58539f239a20 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 9 Feb 2023 15:51:35 -0500 Subject: [PATCH 071/177] Bound the overall output size of ASN1_generate_v3 The output of ASN1_generate_v3 is *mostly* linear with the input, except SEQ and SET reference config sections. Sections can be referenced multiple times, and so the structure grows exponentially. Cap the total output size to mitigate this. As before, we don't consider these functions safe to use with untrusted inputs, but unbounded growth will frustrate fuzzing. This CL sets the limit to 64K, which should be enough for anyone. (This is the size of a single X.509 extension, whereas certificates themselves should not get that large.) While not strictly necessary, this also rearranges the ASN1_mbstring_copy call to pass in a maximum output. This portion does scale linearly with the output, so it's fine, but the fuzzer discovered an input with a 700K-byte input, which, with fuzzer instrumentation and sanitizers, seems to be a bit slow. This change should help the fuzzer get past those cases faster. Update-Note: The stringly-typed API for constructing X.509 extensions now has a maximum output size. If anyone was constructing an extension larger than 64K, this will break. This is unlikely and should be caught by unit tests; if a project hits this outside of tests, that means they are passing untrusted input into this function, which is a security vulnerability in itself, and means they especially need this change to avoid a DoS. Bug: oss-fuzz:55725 Change-Id: Ibb65854293f44bf48ed5855016ef7cd46d2fae77 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57125 Reviewed-by: Bob Beck Commit-Queue: David Benjamin Auto-Submit: David Benjamin --- crypto/asn1/a_mbstr.c | 16 ++++------- crypto/x509/asn1_gen.c | 30 ++++++++++++++++++-- crypto/x509/x509_test.cc | 59 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 12 deletions(-) diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c index 81916c22e8..e1a3df2e72 100644 --- a/crypto/asn1/a_mbstr.c +++ b/crypto/asn1/a_mbstr.c @@ -162,20 +162,16 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, nchar++; utf8_len += cbb_get_utf8_len(c); + if (maxsize > 0 && nchar > (size_t)maxsize) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG); + ERR_add_error_dataf("maxsize=%ld", maxsize); + return -1; + } } - char strbuf[32]; if (minsize > 0 && nchar < (size_t)minsize) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT); - BIO_snprintf(strbuf, sizeof strbuf, "%ld", minsize); - ERR_add_error_data(2, "minsize=", strbuf); - return -1; - } - - if (maxsize > 0 && nchar > (size_t)maxsize) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG); - BIO_snprintf(strbuf, sizeof strbuf, "%ld", maxsize); - ERR_add_error_data(2, "maxsize=", strbuf); + ERR_add_error_dataf("minsize=%ld", minsize); return -1; } diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c index 37048087f1..989deee1b6 100644 --- a/crypto/x509/asn1_gen.c +++ b/crypto/x509/asn1_gen.c @@ -79,6 +79,11 @@ // ASN1_GEN_MAX_DEPTH is the maximum number of nested TLVs allowed. #define ASN1_GEN_MAX_DEPTH 50 +// ASN1_GEN_MAX_OUTPUT is the maximum output, in bytes, allowed. This limit is +// necessary because the SEQUENCE and SET section reference mechanism allows the +// output length to grow super-linearly with the input length. +#define ASN1_GEN_MAX_OUTPUT (64 * 1024) + // ASN1_GEN_FORMAT_* are the values for the format modifiers. #define ASN1_GEN_FORMAT_ASCII 1 #define ASN1_GEN_FORMAT_UTF8 2 @@ -105,6 +110,15 @@ ASN1_TYPE *ASN1_generate_v3(const char *str, const X509V3_CTX *cnf) { return NULL; } + // While not strictly necessary to avoid a DoS (we rely on any super-linear + // checks being performed internally), cap the overall output to + // |ASN1_GEN_MAX_OUTPUT| so the externally-visible behavior is consistent. + if (CBB_len(&cbb) > ASN1_GEN_MAX_OUTPUT) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG); + CBB_cleanup(&cbb); + return NULL; + } + const uint8_t *der = CBB_data(&cbb); ASN1_TYPE *ret = d2i_ASN1_TYPE(NULL, &der, CBB_len(&cbb)); CBB_cleanup(&cbb); @@ -446,9 +460,14 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, return 0; } + // |maxsize| is measured in code points, rather than bytes, but pass it in + // as a loose cap so fuzzers can exit from excessively long inputs + // earlier. This limit is not load-bearing because |ASN1_mbstring_ncopy|'s + // output is already linear in the input. ASN1_STRING *obj = NULL; - if (ASN1_mbstring_copy(&obj, (const uint8_t *)value, -1, encoding, - ASN1_tag2bit(type)) <= 0) { + if (ASN1_mbstring_ncopy(&obj, (const uint8_t *)value, -1, encoding, + ASN1_tag2bit(type), /*minsize=*/0, + /*maxsize=*/ASN1_GEN_MAX_OUTPUT) <= 0) { return 0; } int ok = CBB_add_bytes(&child, obj->data, obj->length) && CBB_flush(cbb); @@ -522,6 +541,13 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, ASN1_GEN_FORMAT_ASCII, depth + 1)) { return 0; } + // This recursive call, by referencing |section|, is the one place + // where |generate_v3|'s output can be super-linear in the input. + // Check bounds here. + if (CBB_len(&child) > ASN1_GEN_MAX_OUTPUT) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_TOO_LONG); + return 0; + } } } if (type == CBS_ASN1_SET) { diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 96c80b37ae..e496d82bee 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -6293,6 +6293,65 @@ key = FORMAT:HEX,OCTWRAP,OCT:9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703 0x20, 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84, 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69, 0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae, 0x7f, 0x60}}, + + // Sections can be referenced multiple times. + {kTestOID, + "ASN1:SEQUENCE:seq1", + R"( +[seq1] +val1 = SEQUENCE:seq2 +val2 = SEQUENCE:seq2 +[seq2] +val1 = INT:1 +val2 = INT:2 +)", + {0x30, 0x22, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x12, + 0x30, 0x10, 0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, + 0x02, 0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}}, + + // But we cap this before it blows up exponentially. + {kTestOID, + "ASN1:SEQ:seq1", + R"( +[seq1] +val1 = SEQ:seq2 +val2 = SEQ:seq2 +[seq2] +val1 = SEQ:seq3 +val2 = SEQ:seq3 +[seq3] +val1 = SEQ:seq4 +val2 = SEQ:seq4 +[seq4] +val1 = SEQ:seq5 +val2 = SEQ:seq5 +[seq5] +val1 = SEQ:seq6 +val2 = SEQ:seq6 +[seq6] +val1 = SEQ:seq7 +val2 = SEQ:seq7 +[seq7] +val1 = SEQ:seq8 +val2 = SEQ:seq8 +[seq8] +val1 = SEQ:seq9 +val2 = SEQ:seq9 +[seq9] +val1 = SEQ:seq10 +val2 = SEQ:seq10 +[seq10] +val1 = SEQ:seq11 +val2 = SEQ:seq11 +[seq11] +val1 = SEQ:seq12 +val2 = SEQ:seq12 +[seq12] +val1 = IA5:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +val2 = IA5:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB +)", + {}}, }; for (const auto &t : kTests) { SCOPED_TRACE(t.name); From bd7e4197cdb889f13ce01cf1a029eaa7b6cd6da9 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Thu, 9 Feb 2023 00:28:40 +0000 Subject: [PATCH 072/177] Generate Rust wrappers for HKDF This change exposes the necessary APIs for rust-openssl's HKDF wrappers in [PKeyCtxRef] (https://docs.rs/openssl/latest/openssl/pkey_ctx/struct.PkeyCtxRef.html#method.set_hkdf_mode). Diff of the generated bindings: https://gist.github.com/mauricelam/51602bf17d4a5f9023a27cbe5f9ff705 Change-Id: Ic8df3d5308cfee5964ceadd3c2524b77e12512fb Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57066 Reviewed-by: Alex Gaynor Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- rust/wrapper.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/wrapper.h b/rust/wrapper.h index 316cff1491..1d65c5a44f 100644 --- a/rust/wrapper.h +++ b/rust/wrapper.h @@ -40,6 +40,7 @@ #include "../include/openssl/hpke.h" #include "../include/openssl/hrss.h" #include "../include/openssl/is_boringssl.h" +#include "../include/openssl/kdf.h" #include "../include/openssl/lhash.h" #include "../include/openssl/md4.h" #include "../include/openssl/md5.h" From ace33161544814ed6dc9e9d17cfde0422881b9d2 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 10 Feb 2023 13:25:14 -0500 Subject: [PATCH 073/177] Add a note in INCORPORATING about which branch to use Especially when they were named "2214" instead of "chromium-2214", I've seen papers and other projects treat them as releases. Add a note to make it clear they are not releases. Change-Id: Ie820b800de3d25a31d3083d4ceff75e1d7f74a06 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57145 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- INCORPORATING.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/INCORPORATING.md b/INCORPORATING.md index 96bf90880b..f793e88acc 100644 --- a/INCORPORATING.md +++ b/INCORPORATING.md @@ -3,6 +3,22 @@ **Note**: if your target project is not a Google project then first read the [main README](/README.md) about the purpose of BoringSSL. +## Which branch to use + +BoringSSL usage typically follows a +["live at head"](https://abseil.io/about/philosophy#we-recommend-that-you-choose-to-live-at-head) +model. Projects pin to whatever the current latest of BoringSSL is at the time +of update, and regularly update it to pick up new changes. + +While the BoringSSL repository may contain project-specific branches, e.g. +`chromium-2214`, those are _not_ supported release branches and must not as +such. In rare cases, BoringSSL will temporarily maintain a short-lived branch on +behalf of a project. Most such branches are no longer updated, because the +corresponding project no longer needs them, and we do not create new ones to +replace the ones that are no longer updated. E.g., not every Chromium release +branch has a corresponding BoringSSL `chromium-*` branch. Even while active, the +branch may not contain all changes relevant to a general BoringSSL consumer. + ## Bazel If you are using [Bazel](https://bazel.build) then you can incorporate From 350f8547cf2101669684ebdb99b49b11fff5e217 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 7 Feb 2023 16:11:58 -0700 Subject: [PATCH 074/177] Add OPENSSL_asprintf and friends for asprintf(3) functionality. This includes an internal version which allows a flag to specify the use of system malloc, or OPENSSL_malloc - this in turn allows us to use this function in the ERR family of functions and allow for ERR to not call OPENSSL_malloc with a circular dependency. Bug: 564 Change-Id: Ifd02d062fda9695cddbb0dbef2e1c1db0802a486 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57005 Auto-Submit: Bob Beck Reviewed-by: David Benjamin Commit-Queue: Bob Beck --- crypto/internal.h | 7 ++++ crypto/mem.c | 98 ++++++++++++++++++++++++++++++++++++------- include/openssl/mem.h | 20 +++++++-- 3 files changed, 108 insertions(+), 17 deletions(-) diff --git a/crypto/internal.h b/crypto/internal.h index 576ad85c9b..f12871f052 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -1299,6 +1299,13 @@ OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) { extern uint8_t BORINGSSL_function_hit[7]; #endif // BORINGSSL_DISPATCH_TEST +// OPENSSL_vasprintf_internal is just like |vasprintf(3)|. if |system_malloc| is +// 0, memory will be allocated with |OPENSSL_malloc| and must be freed with +// |OPENSSL_free|. Otherwise the system |malloc| function is used and the memory +// must be freed with the system |free| function. +OPENSSL_EXPORT int OPENSSL_vasprintf_internal(char **str, const char *format, + va_list args, int system_malloc) + OPENSSL_PRINTF_FORMAT_FUNC(2, 0); #if defined(__cplusplus) } // extern C diff --git a/crypto/mem.c b/crypto/mem.c index 97a85e9953..f75e89eae5 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -57,9 +57,11 @@ #include #include +#include +#include #include -#include #include +#include #include @@ -127,7 +129,7 @@ WEAK_SYMBOL_FUNC(void, sdallocx, (void *ptr, size_t size, int flags)); // primitives used must tolerate every other synchronization primitive linked // into the process, including pthreads locks. Failing to meet these constraints // may result in deadlocks, crashes, or memory corruption. -WEAK_SYMBOL_FUNC(void*, OPENSSL_memory_alloc, (size_t size)); +WEAK_SYMBOL_FUNC(void *, OPENSSL_memory_alloc, (size_t size)); WEAK_SYMBOL_FUNC(void, OPENSSL_memory_free, (void *ptr)); WEAK_SYMBOL_FUNC(size_t, OPENSSL_memory_get_size, (void *ptr)); @@ -135,10 +137,25 @@ WEAK_SYMBOL_FUNC(size_t, OPENSSL_memory_get_size, (void *ptr)); // are linking in BoringSSL and, roughly, what version they are using. static const uint8_t kBoringSSLBinaryTag[18] = { // 16 bytes of magic tag. - 0x8c, 0x62, 0x20, 0x0b, 0xd2, 0xa0, 0x72, 0x58, - 0x44, 0xa8, 0x96, 0x69, 0xad, 0x55, 0x7e, 0xec, + 0x8c, + 0x62, + 0x20, + 0x0b, + 0xd2, + 0xa0, + 0x72, + 0x58, + 0x44, + 0xa8, + 0x96, + 0x69, + 0xad, + 0x55, + 0x7e, + 0xec, // Current source iteration. Incremented ~monthly. - 3, 0, + 3, + 0, }; #if defined(BORINGSSL_MALLOC_FAILURE_TESTING) @@ -321,9 +338,7 @@ void OPENSSL_cleanse(void *ptr, size_t len) { #endif // !OPENSSL_NO_ASM } -void OPENSSL_clear_free(void *ptr, size_t unused) { - OPENSSL_free(ptr); -} +void OPENSSL_clear_free(void *ptr, size_t unused) { OPENSSL_free(ptr); } int CRYPTO_secure_malloc_init(size_t size, size_t min_size) { return 0; } @@ -394,9 +409,7 @@ int OPENSSL_isalpha(int c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } -int OPENSSL_isdigit(int c) { - return c >= '0' && c <= '9'; -} +int OPENSSL_isdigit(int c) { return c >= '0' && c <= '9'; } int OPENSSL_isxdigit(int c) { return OPENSSL_isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); @@ -418,9 +431,7 @@ int OPENSSL_fromxdigit(uint8_t *out, int c) { return 0; } -int OPENSSL_isalnum(int c) { - return OPENSSL_isalpha(c) || OPENSSL_isdigit(c); -} +int OPENSSL_isalnum(int c) { return OPENSSL_isalpha(c) || OPENSSL_isdigit(c); } int OPENSSL_tolower(int c) { if (c >= 'A' && c <= 'Z') { @@ -478,6 +489,65 @@ int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) { return vsnprintf(buf, n, format, args); } +int OPENSSL_vasprintf_internal(char **str, const char *format, va_list args, + int system_malloc) { + void *(*allocate)(size_t) = system_malloc ? malloc : OPENSSL_malloc; + void (*deallocate)(void *) = system_malloc ? free : OPENSSL_free; + void *(*reallocate)(void *, size_t) = + system_malloc ? realloc : OPENSSL_realloc; + char *candidate = NULL; + size_t candidate_len = 64; // TODO(bbe) what's the best initial size? + + if ((candidate = allocate(candidate_len)) == NULL) { + goto err; + } + va_list args_copy; + va_copy(args_copy, args); + int ret = vsnprintf(candidate, candidate_len, format, args_copy); + va_end(args_copy); + if (ret == INT_MAX || ret < 0) { + // Failed, or size not int representable. + goto err; + } + if ((size_t)ret >= candidate_len) { + // Too big to fit in allocation. + char *tmp; + + candidate_len = ret + 1; + if ((tmp = reallocate(candidate, candidate_len)) == NULL) { + goto err; + } + candidate = tmp; + va_copy(args_copy, args); + ret = vsnprintf(candidate, candidate_len, format, args_copy); + va_end(args_copy); + } + // At this point this can't happen unless vsnprintf is insane. + if (ret < 0 || (size_t)ret >= candidate_len) { + goto err; + } + *str = candidate; + return ret; + + err: + deallocate(candidate); + *str = NULL; + errno = ENOMEM; + return -1; +} + +int OPENSSL_vasprintf(char **str, const char *format, va_list args) { + return OPENSSL_vasprintf_internal(str, format, args, /*system_malloc=*/0); +} + +int OPENSSL_asprintf(char **str, const char *format, ...) { + va_list args; + va_start(args, format); + int ret = OPENSSL_vasprintf(str, format, args); + va_end(args); + return ret; +} + char *OPENSSL_strndup(const char *str, size_t size) { size = OPENSSL_strnlen(str, size); diff --git a/include/openssl/mem.h b/include/openssl/mem.h index 374e188530..0cce93d0df 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -84,7 +84,8 @@ OPENSSL_EXPORT void OPENSSL_free(void *ptr); // OPENSSL_realloc returns a pointer to a buffer of |new_size| bytes that // contains the contents of |ptr|. Unlike |realloc|, a new buffer is always -// allocated and the data at |ptr| is always wiped and freed. +// allocated and the data at |ptr| is always wiped and freed. Memory is +// allocated with |OPENSSL_malloc| and must be freed with |OPENSSL_free|. OPENSSL_EXPORT void *OPENSSL_realloc(void *ptr, size_t new_size); // OPENSSL_cleanse zeros out |len| bytes of memory at |ptr|. This is similar to @@ -160,12 +161,25 @@ OPENSSL_EXPORT int BIO_snprintf(char *buf, size_t n, const char *format, ...) OPENSSL_EXPORT int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) OPENSSL_PRINTF_FORMAT_FUNC(3, 0); +// OPENSSL_vasprintf has the same behavior as vasprintf(3), except that +// memory allocated in a returned string must be freed with |OPENSSL_free|. +OPENSSL_EXPORT int OPENSSL_vasprintf(char **str, const char *format, + va_list args) + OPENSSL_PRINTF_FORMAT_FUNC(2, 0); + +// OPENSSL_asprintf has the same behavior as asprintf(3), except that +// memory allocated in a returned string must be freed with |OPENSSL_free|. +OPENSSL_EXPORT int OPENSSL_asprintf(char **str, const char *format, ...) + OPENSSL_PRINTF_FORMAT_FUNC(2, 3); + // OPENSSL_strndup returns an allocated, duplicate of |str|, which is, at most, -// |size| bytes. The result is always NUL terminated. +// |size| bytes. The result is always NUL terminated. The memory allocated +// must be freed with |OPENSSL_free|. OPENSSL_EXPORT char *OPENSSL_strndup(const char *str, size_t size); // OPENSSL_memdup returns an allocated, duplicate of |size| bytes from |data| or -// NULL on allocation failure. +// NULL on allocation failure. The memory allocated must be freed with +// |OPENSSL_free|. OPENSSL_EXPORT void *OPENSSL_memdup(const void *data, size_t size); // OPENSSL_strlcpy acts like strlcpy(3). From fc524c161e8640e017b0d838f76e75dc49181e34 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 7 Feb 2023 14:32:41 -0700 Subject: [PATCH 075/177] Make ERR and thread use system malloc. This will let us call ERR and thread_local from OPENSSL_malloc without creating a circular dependency. We also make ERR_get_error_line_data add ERR_FLAG_MALLOCED to the returned flags value, since some projects appear to be making assumptions about it being there. Bug: 564 Update-Note: Any recent documentation (in all OpenSSL forks) for the ERR functions cautions against freeing the returned ERR "data" strings, as freeing them is handled by the error library. This change can make an existing double free bug more obvious by being more likely to cause a crash with the double free. Change-Id: Ie30bd3aee0b506473988b90675c48510969db31a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57045 Reviewed-by: David Benjamin Commit-Queue: Bob Beck Auto-Submit: Bob Beck --- crypto/err/err.c | 139 +++++++++++++++++++++------------------- crypto/err/err_test.cc | 8 +-- crypto/thread_pthread.c | 11 ++-- crypto/thread_win.c | 11 ++-- include/openssl/err.h | 8 ++- include/openssl/mem.h | 9 ++- 6 files changed, 101 insertions(+), 85 deletions(-) diff --git a/crypto/err/err.c b/crypto/err/err.c index 9b6d23816a..133a831588 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -106,11 +106,15 @@ * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ +// Ensure we can't call OPENSSL_malloc circularly. +#define _BORINGSSL_PROHIBIT_OPENSSL_MALLOC #include #include #include #include +#include +#include #include #if defined(OPENSSL_WINDOWS) @@ -129,8 +133,8 @@ OPENSSL_MSVC_PRAGMA(warning(pop)) struct err_error_st { // file contains the filename where the error occurred. const char *file; - // data contains a NUL-terminated string with optional data. It must be freed - // with |OPENSSL_free|. + // data contains a NUL-terminated string with optional data. It is allocated + // with system |malloc| and must be freed with |free| (not |OPENSSL_free|) char *data; // packed contains the error library and reason, as packed by ERR_PACK. uint32_t packed; @@ -162,7 +166,7 @@ extern const char kOpenSSLReasonStringData[]; // err_clear clears the given queued error. static void err_clear(struct err_error_st *error) { - OPENSSL_free(error->data); + free(error->data); OPENSSL_memset(error, 0, sizeof(struct err_error_st)); } @@ -170,12 +174,19 @@ static void err_copy(struct err_error_st *dst, const struct err_error_st *src) { err_clear(dst); dst->file = src->file; if (src->data != NULL) { - dst->data = OPENSSL_strdup(src->data); + // Disable deprecated functions on msvc so it doesn't complain about strdup. + OPENSSL_MSVC_PRAGMA(warning(push)) + OPENSSL_MSVC_PRAGMA(warning(disable : 4996)) + // We can't use OPENSSL_strdup because we don't want to call OPENSSL_malloc, + // which can affect the error stack. + dst->data = strdup(src->data); + OPENSSL_MSVC_PRAGMA(warning(pop)) } dst->packed = src->packed; dst->line = src->line; } + // global_next_library contains the next custom library value to return. static int global_next_library = ERR_NUM_LIBS; @@ -194,15 +205,15 @@ static void err_state_free(void *statep) { for (unsigned i = 0; i < ERR_NUM_ERRORS; i++) { err_clear(&state->errors[i]); } - OPENSSL_free(state->to_free); - OPENSSL_free(state); + free(state->to_free); + free(state); } // err_get_state gets the ERR_STATE object for the current thread. static ERR_STATE *err_get_state(void) { ERR_STATE *state = CRYPTO_get_thread_local(OPENSSL_THREAD_LOCAL_ERR); if (state == NULL) { - state = OPENSSL_malloc(sizeof(ERR_STATE)); + state = malloc(sizeof(ERR_STATE)); if (state == NULL) { return NULL; } @@ -258,7 +269,10 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, } else { *data = error->data; if (flags != NULL) { - *flags = ERR_FLAG_STRING; + // Without |ERR_FLAG_MALLOCED|, rust-openssl assumes the string has a + // static lifetime. In both cases, we retain ownership of the string, + // and the caller is not expected to free it. + *flags = ERR_FLAG_STRING | ERR_FLAG_MALLOCED; } // If this error is being removed, take ownership of data from // the error. The semantics are such that the caller doesn't @@ -267,7 +281,7 @@ static uint32_t get_error_values(int inc, int top, const char **file, int *line, // error queue. if (inc) { if (error->data != NULL) { - OPENSSL_free(state->to_free); + free(state->to_free); state->to_free = error->data; } error->data = NULL; @@ -335,7 +349,7 @@ void ERR_clear_error(void) { for (i = 0; i < ERR_NUM_ERRORS; i++) { err_clear(&state->errors[i]); } - OPENSSL_free(state->to_free); + free(state->to_free); state->to_free = NULL; state->top = state->bottom = 0; @@ -629,13 +643,13 @@ static void err_set_error_data(char *data) { struct err_error_st *error; if (state == NULL || state->top == state->bottom) { - OPENSSL_free(data); + free(data); return; } error = &state->errors[state->top]; - OPENSSL_free(error->data); + free(error->data); error->data = data; } @@ -672,48 +686,42 @@ void ERR_put_error(int library, int unused, int reason, const char *file, // concatenates them and sets the result as the data on the most recent // error. static void err_add_error_vdata(unsigned num, va_list args) { - size_t alloced, new_len, len = 0, substr_len; - char *buf; + size_t total_size = 0; const char *substr; - unsigned i; + char *buf; - alloced = 80; - buf = OPENSSL_malloc(alloced + 1); - if (buf == NULL) { + va_list args_copy; + va_copy(args_copy, args); + for (size_t i = 0; i < num; i++) { + substr = va_arg(args_copy, const char *); + if (substr == NULL) { + continue; + } + size_t substr_len = strlen(substr); + if (SIZE_MAX - total_size < substr_len) { + return; // Would overflow. + } + total_size += substr_len; + } + va_end(args_copy); + if (total_size == SIZE_MAX) { + return; // Would overflow. + } + total_size += 1; // NUL terminator. + if ((buf = malloc(total_size)) == NULL) { return; } - - for (i = 0; i < num; i++) { + buf[0] = '\0'; + for (size_t i = 0; i < num; i++) { substr = va_arg(args, const char *); if (substr == NULL) { continue; } - - substr_len = strlen(substr); - new_len = len + substr_len; - if (new_len > alloced) { - char *new_buf; - - if (alloced + 20 + 1 < alloced) { - // overflow. - OPENSSL_free(buf); - return; - } - - alloced = new_len + 20; - new_buf = OPENSSL_realloc(buf, alloced + 1); - if (new_buf == NULL) { - OPENSSL_free(buf); - return; - } - buf = new_buf; + if (OPENSSL_strlcat(buf, substr, total_size) >= total_size) { + assert(0); // should not be possible. } - - OPENSSL_memcpy(buf + len, substr, substr_len); - len = new_len; } - - buf[len] = 0; + va_end(args); err_set_error_data(buf); } @@ -725,21 +733,13 @@ void ERR_add_error_data(unsigned count, ...) { } void ERR_add_error_dataf(const char *format, ...) { + char *buf = NULL; va_list ap; - char *buf; - static const unsigned buf_len = 256; - // A fixed-size buffer is used because va_copy (which would be needed in - // order to call vsnprintf twice and measure the buffer) wasn't defined until - // C99. - buf = OPENSSL_malloc(buf_len + 1); - if (buf == NULL) { + va_start(ap, format); + if (OPENSSL_vasprintf_internal(&buf, format, ap, /*system_malloc=*/1) == -1) { return; } - - va_start(ap, format); - BIO_vsnprintf(buf, buf_len, format, ap); - buf[buf_len] = 0; va_end(ap); err_set_error_data(buf); @@ -751,13 +751,20 @@ void ERR_set_error_data(char *data, int flags) { assert(0); return; } + // Disable deprecated functions on msvc so it doesn't complain about strdup. + OPENSSL_MSVC_PRAGMA(warning(push)) + OPENSSL_MSVC_PRAGMA(warning(disable : 4996)) + // We can not use OPENSSL_strdup because we don't want to call OPENSSL_malloc, + // which can affect the error stack. + char *copy = strdup(data); + OPENSSL_MSVC_PRAGMA(warning(pop)) + if (copy != NULL) { + err_set_error_data(copy); + } if (flags & ERR_FLAG_MALLOCED) { - err_set_error_data(data); - } else { - char *copy = OPENSSL_strdup(data); - if (copy != NULL) { - err_set_error_data(copy); - } + // We can not take ownership of |data| directly because it is allocated with + // |OPENSSL_malloc| and we will free it with system |free| later. + OPENSSL_free(data); } } @@ -819,8 +826,8 @@ void ERR_SAVE_STATE_free(ERR_SAVE_STATE *state) { for (size_t i = 0; i < state->num_errors; i++) { err_clear(&state->errors[i]); } - OPENSSL_free(state->errors); - OPENSSL_free(state); + free(state->errors); + free(state); } ERR_SAVE_STATE *ERR_save_state(void) { @@ -829,7 +836,7 @@ ERR_SAVE_STATE *ERR_save_state(void) { return NULL; } - ERR_SAVE_STATE *ret = OPENSSL_malloc(sizeof(ERR_SAVE_STATE)); + ERR_SAVE_STATE *ret = malloc(sizeof(ERR_SAVE_STATE)); if (ret == NULL) { return NULL; } @@ -839,9 +846,9 @@ ERR_SAVE_STATE *ERR_save_state(void) { ? state->top - state->bottom : ERR_NUM_ERRORS + state->top - state->bottom; assert(num_errors < ERR_NUM_ERRORS); - ret->errors = OPENSSL_malloc(num_errors * sizeof(struct err_error_st)); + ret->errors = malloc(num_errors * sizeof(struct err_error_st)); if (ret->errors == NULL) { - OPENSSL_free(ret); + free(ret); return NULL; } OPENSSL_memset(ret->errors, 0, num_errors * sizeof(struct err_error_st)); diff --git a/crypto/err/err_test.cc b/crypto/err/err_test.cc index 5dbe77654b..8e9f03c62b 100644 --- a/crypto/err/err_test.cc +++ b/crypto/err/err_test.cc @@ -71,7 +71,7 @@ TEST(ErrTest, PutError) { EXPECT_STREQ("test", file); EXPECT_EQ(4, line); - EXPECT_TRUE(flags & ERR_FLAG_STRING); + EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED); EXPECT_EQ(1, ERR_GET_LIB(packed_error)); EXPECT_EQ(2, ERR_GET_REASON(packed_error)); EXPECT_STREQ("testing", data); @@ -167,7 +167,7 @@ TEST(ErrTest, SaveAndRestore) { EXPECT_STREQ("test1.c", file); EXPECT_EQ(line, 1); EXPECT_STREQ(data, "data1"); - EXPECT_EQ(flags, ERR_FLAG_STRING); + EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED); // The state may be restored, both over an empty and non-empty state. for (unsigned i = 0; i < 2; i++) { @@ -180,7 +180,7 @@ TEST(ErrTest, SaveAndRestore) { EXPECT_STREQ("test1.c", file); EXPECT_EQ(line, 1); EXPECT_STREQ(data, "data1"); - EXPECT_EQ(flags, ERR_FLAG_STRING); + EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED); packed_error = ERR_get_error_line_data(&file, &line, &data, &flags); EXPECT_EQ(ERR_GET_LIB(packed_error), 2); @@ -196,7 +196,7 @@ TEST(ErrTest, SaveAndRestore) { EXPECT_STREQ("test3.c", file); EXPECT_EQ(line, 3); EXPECT_STREQ(data, "data3"); - EXPECT_EQ(flags, ERR_FLAG_STRING); + EXPECT_EQ(flags, ERR_FLAG_STRING | ERR_FLAG_MALLOCED); // The error queue is now empty for the next iteration. EXPECT_EQ(0u, ERR_get_error()); diff --git a/crypto/thread_pthread.c b/crypto/thread_pthread.c index 08bdd5a750..82cbbfe574 100644 --- a/crypto/thread_pthread.c +++ b/crypto/thread_pthread.c @@ -12,6 +12,8 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Ensure we can't call OPENSSL_malloc circularly. +#define _BORINGSSL_PROHIBIT_OPENSSL_MALLOC #include "internal.h" #if defined(OPENSSL_PTHREADS) @@ -21,9 +23,6 @@ #include #include -#include - - static_assert(sizeof(CRYPTO_MUTEX) >= sizeof(pthread_rwlock_t), "CRYPTO_MUTEX is too small"); static_assert(alignof(CRYPTO_MUTEX) >= alignof(pthread_rwlock_t), @@ -118,7 +117,7 @@ static void thread_local_destructor(void *arg) { } } - OPENSSL_free(pointers); + free(pointers); } static pthread_once_t g_thread_local_init_once = PTHREAD_ONCE_INIT; @@ -153,14 +152,14 @@ int CRYPTO_set_thread_local(thread_local_data_t index, void *value, void **pointers = pthread_getspecific(g_thread_local_key); if (pointers == NULL) { - pointers = OPENSSL_malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); + pointers = malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); if (pointers == NULL) { destructor(value); return 0; } OPENSSL_memset(pointers, 0, sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); if (pthread_setspecific(g_thread_local_key, pointers) != 0) { - OPENSSL_free(pointers); + free(pointers); destructor(value); return 0; } diff --git a/crypto/thread_win.c b/crypto/thread_win.c index 3b61bfcfcd..57e4f9be60 100644 --- a/crypto/thread_win.c +++ b/crypto/thread_win.c @@ -12,6 +12,8 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +// Ensure we can't call OPENSSL_malloc circularly. +#define _BORINGSSL_PROHIBIT_OPENSSL_MALLOC #include "internal.h" #if defined(OPENSSL_WINDOWS_THREADS) @@ -24,9 +26,6 @@ OPENSSL_MSVC_PRAGMA(warning(pop)) #include #include -#include - - static_assert(sizeof(CRYPTO_MUTEX) >= sizeof(SRWLOCK), "CRYPTO_MUTEX is too small"); static_assert(alignof(CRYPTO_MUTEX) >= alignof(SRWLOCK), @@ -129,7 +128,7 @@ static void NTAPI thread_local_destructor(PVOID module, DWORD reason, } } - OPENSSL_free(pointers); + free(pointers); } // Thread Termination Callbacks. @@ -234,14 +233,14 @@ int CRYPTO_set_thread_local(thread_local_data_t index, void *value, void **pointers = get_thread_locals(); if (pointers == NULL) { - pointers = OPENSSL_malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); + pointers = malloc(sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); if (pointers == NULL) { destructor(value); return 0; } OPENSSL_memset(pointers, 0, sizeof(void *) * NUM_OPENSSL_THREAD_LOCALS); if (TlsSetValue(g_thread_local_key, pointers) == 0) { - OPENSSL_free(pointers); + free(pointers); destructor(value); return 0; } diff --git a/include/openssl/err.h b/include/openssl/err.h index 7abeae2e3d..0ec71b171f 100644 --- a/include/openssl/err.h +++ b/include/openssl/err.h @@ -188,8 +188,12 @@ OPENSSL_EXPORT uint32_t ERR_get_error_line(const char **file, int *line); #define ERR_FLAG_STRING 1 // ERR_FLAG_MALLOCED is passed into |ERR_set_error_data| to indicate that |data| -// was allocated with |OPENSSL_malloc|. It is never returned from -// |ERR_get_error_line_data|. +// was allocated with |OPENSSL_malloc|. +// +// It is, separately, returned in |*flags| from |ERR_get_error_line_data| to +// indicate that |*data| has a non-static lifetime, but this lifetime is still +// managed by the library. The caller must not call |OPENSSL_free| or |free| on +// |data|. #define ERR_FLAG_MALLOCED 2 // ERR_get_error_line_data acts like |ERR_get_error_line|, but also returns the diff --git a/include/openssl/mem.h b/include/openssl/mem.h index 0cce93d0df..dca7d465be 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -75,18 +75,25 @@ extern "C" { // unless stated otherwise. -// OPENSSL_malloc acts like a regular |malloc|. +#ifndef _BORINGSSL_PROHIBIT_OPENSSL_MALLOC +// OPENSSL_malloc is similar to a regular |malloc|, but allocates additional +// private data. The resulting pointer must be freed with |OPENSSL_free|. In +// the case of a malloc failure, prior to returning NULL |OPENSSL_malloc| will +// push |ERR_R_MALLOC_FAILURE| onto the openssl error stack. OPENSSL_EXPORT void *OPENSSL_malloc(size_t size); +#endif // !_BORINGSSL_PROHIBIT_OPENSSL_MALLOC // OPENSSL_free does nothing if |ptr| is NULL. Otherwise it zeros out the // memory allocated at |ptr| and frees it. OPENSSL_EXPORT void OPENSSL_free(void *ptr); +#ifndef _BORINGSSL_PROHIBIT_OPENSSL_MALLOC // OPENSSL_realloc returns a pointer to a buffer of |new_size| bytes that // contains the contents of |ptr|. Unlike |realloc|, a new buffer is always // allocated and the data at |ptr| is always wiped and freed. Memory is // allocated with |OPENSSL_malloc| and must be freed with |OPENSSL_free|. OPENSSL_EXPORT void *OPENSSL_realloc(void *ptr, size_t new_size); +#endif // !_BORINGSSL_PROHIBIT_OPENSSL_MALLOC // OPENSSL_cleanse zeros out |len| bytes of memory at |ptr|. This is similar to // |memset_s| from C11. From d5e93f521b3fd4f57049583a1584d285e5aab16c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 13 Feb 2023 10:21:56 -0500 Subject: [PATCH 076/177] Cap decimal input sizes in s2i_ASN1_INTEGER Decoding from decimal takes quadratic time, and BN_dec2bn will happily decode however large of input you pass in. This frustrates fuzzers. I've added a cap to the input length in s2i_ASN1_INTEGER for now, rather than BN_dec2bn, because we've seen people use BN for surprisingly large calculator operations, and BN generally doesn't cap inputs to quadratic (or worse) algorithms beyond memory limits. (We generally rely on cryptography using fixed parameter sizes, though RSA, DSA, and DH were misstandardized and need ad-hoc limits everywhere.) Update-Note: The stringly-typed API for constructing X.509 extensions now has (very generous) maximum input length for decimal integers of 8,192 digits. If anyone was relying on a higher input, this will break. This is unlikely and should be caught by unit tests; if a project hits this outside of tests, that means they are passing untrusted input into this function, which is a security vulnerability in itself, and means they especially need this change to avoid a DoS. Bug: chromium:1415108 Change-Id: I138249d23ca6b1996f8437dba98633349bb3042b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57205 Commit-Queue: David Benjamin Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- crypto/x509/x509_test.cc | 10 +++++++--- crypto/x509v3/v3_utl.c | 10 ++++++++++ include/openssl/bn.h | 12 ++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index e496d82bee..d80ee19722 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5718,7 +5718,8 @@ TEST(X509Test, ExtensionFromConf) { static const char kTestOID[] = "1.2.840.113554.4.1.72585.2"; const struct { const char *name; - const char *value; + std::string value; + // conf is the serialized confdb, or nullptr if none is to be provided. const char *conf; // expected is the resulting extension, encoded in DER, or the empty string // if an error is expected. @@ -6352,6 +6353,9 @@ val1 = IA5:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA val2 = IA5:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB )", {}}, + + // Integer sizes are capped to mitigate quadratic behavior. + {kTestOID, "ASN1:INT:" + std::string(16384, '9'), nullptr, {}}, }; for (const auto &t : kTests) { SCOPED_TRACE(t.name); @@ -6370,7 +6374,7 @@ val2 = IA5:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB } bssl::UniquePtr ext( - X509V3_EXT_nconf(conf.get(), nullptr, t.name, t.value)); + X509V3_EXT_nconf(conf.get(), nullptr, t.name, t.value.c_str())); if (t.expected.empty()) { EXPECT_FALSE(ext); } else { @@ -6386,7 +6390,7 @@ val2 = IA5:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB X509V3_CTX ctx; X509V3_set_ctx(&ctx, nullptr, nullptr, nullptr, nullptr, 0); X509V3_set_nconf(&ctx, conf.get()); - ext.reset(X509V3_EXT_nconf(conf.get(), &ctx, t.name, t.value)); + ext.reset(X509V3_EXT_nconf(conf.get(), &ctx, t.name, t.value.c_str())); if (t.expected.empty()) { EXPECT_FALSE(ext); } else { diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index fffb83df2c..7e1ce517ef 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -260,6 +260,16 @@ ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method, if (ishex) { ret = BN_hex2bn(&bn, value); } else { + // Decoding from decimal scales quadratically in the input length. Bound the + // largest decimal input we accept in the config parser. 8,192 decimal + // digits allows values up to 27,213 bits. Ths exceeds the largest RSA, DSA, + // or DH modulus we support, and those are not usefully represented in + // decimal. + if (strlen(value) > 8192) { + BN_free(bn); + OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER); + return 0; + } ret = BN_dec2bn(&bn, value); } diff --git a/include/openssl/bn.h b/include/openssl/bn.h index 633bb9c110..1fa499c8f9 100644 --- a/include/openssl/bn.h +++ b/include/openssl/bn.h @@ -142,6 +142,10 @@ extern "C" { // strategies that may not be ideal for other applications. Non-cryptographic // uses should use a more general-purpose integer library, especially if // performance-sensitive. +// +// Many functions in BN scale quadratically or higher in the bit length of their +// input. Callers at this layer are assumed to have capped input sizes within +// their performance tolerances. // BN_ULONG is the native word size when working with big integers. @@ -289,6 +293,10 @@ OPENSSL_EXPORT int BN_hex2bn(BIGNUM **outp, const char *in); // BN_bn2dec returns an allocated string that contains a NUL-terminated, // decimal representation of |bn|. If |bn| is negative, the first char in the // resulting string will be '-'. Returns NULL on allocation failure. +// +// Converting an arbitrarily large integer to decimal is quadratic in the bit +// length of |a|. This function assumes the caller has capped the input within +// performance tolerances. OPENSSL_EXPORT char *BN_bn2dec(const BIGNUM *a); // BN_dec2bn parses the leading decimal number from |in|, which may be @@ -297,6 +305,10 @@ OPENSSL_EXPORT char *BN_bn2dec(const BIGNUM *a); // decimal number and stores it in |*outp|. If |*outp| is NULL then it // allocates a new BIGNUM and updates |*outp|. It returns the number of bytes // of |in| processed or zero on error. +// +// Converting an arbitrarily large integer to decimal is quadratic in the bit +// length of |a|. This function assumes the caller has capped the input within +// performance tolerances. OPENSSL_EXPORT int BN_dec2bn(BIGNUM **outp, const char *in); // BN_asc2bn acts like |BN_dec2bn| or |BN_hex2bn| depending on whether |in| From dcabfe2d8940529a69e007660fa7bf6c15954ecc Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 7 Feb 2023 19:06:08 -0700 Subject: [PATCH 077/177] Make OPENSSL_malloc push ERR_R_MALLOC_FAILURE on failure. Remove all the other ERR_R_MALLOC_FAILURES from the codebase. Also changes cbb to push to the error stack, to correctly report cbb failures instead of now only reporting malloc failures. Previously it turned all cbb failures into a malloc failure Bug: 564 Change-Id: Ic13208bf9d9aaa470e83b2f15782fc94946bbc7b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57046 Auto-Submit: Bob Beck Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- crypto/asn1/a_bitstr.c | 2 -- crypto/asn1/a_bool.c | 1 - crypto/asn1/a_dup.c | 1 - crypto/asn1/a_i2d_fp.c | 1 - crypto/asn1/a_mbstr.c | 3 -- crypto/asn1/a_object.c | 4 --- crypto/asn1/asn1_lib.c | 2 -- crypto/asn1/asn_pack.c | 1 - crypto/asn1/tasn_dec.c | 4 --- crypto/asn1/tasn_enc.c | 2 -- crypto/asn1/tasn_new.c | 2 -- crypto/bio/bio.c | 2 -- crypto/bio/pair.c | 2 -- crypto/bio/printf.c | 1 - crypto/bn_extra/convert.c | 14 +++----- crypto/buf/buf.c | 8 ++--- crypto/bytestring/cbb.c | 7 ++++ crypto/conf/conf.c | 5 --- crypto/digest_extra/digest_extra.c | 3 -- crypto/dsa/dsa.c | 1 - crypto/ec_extra/ec_asn1.c | 1 - crypto/evp/evp.c | 1 - crypto/evp/evp_ctx.c | 1 - crypto/evp/p_ed25519.c | 1 - crypto/evp/p_ed25519_asn1.c | 2 -- crypto/evp/p_hkdf.c | 8 ----- crypto/evp/p_x25519.c | 1 - crypto/evp/p_x25519_asn1.c | 2 -- crypto/evp/print.c | 1 - crypto/evp/scrypt.c | 1 - crypto/ex_data.c | 6 ---- crypto/fipsmodule/bn/bn.c | 2 -- crypto/fipsmodule/bn/ctx.c | 2 -- crypto/fipsmodule/bn/gcd.c | 1 - crypto/fipsmodule/bn/prime.c | 1 - crypto/fipsmodule/bn/sqrt.c | 1 - crypto/fipsmodule/cipher/cipher.c | 2 -- crypto/fipsmodule/dh/dh.c | 1 - crypto/fipsmodule/digest/digest.c | 3 -- crypto/fipsmodule/ec/ec.c | 3 -- crypto/fipsmodule/ec/ec_key.c | 4 --- crypto/fipsmodule/ec/oct.c | 1 - crypto/fipsmodule/ec/wnaf.c | 1 - crypto/fipsmodule/rsa/blinding.c | 1 - crypto/fipsmodule/rsa/padding.c | 4 --- crypto/fipsmodule/rsa/rsa.c | 8 ----- crypto/fipsmodule/rsa/rsa_impl.c | 6 ---- .../service_indicator/service_indicator.c | 1 - crypto/hpke/hpke.c | 2 -- crypto/internal.h | 2 +- crypto/mem.c | 34 +++++++++---------- crypto/obj/obj.c | 1 - crypto/pem/pem_info.c | 1 - crypto/pem/pem_lib.c | 8 ----- crypto/pkcs7/pkcs7_x509.c | 1 - crypto/pkcs8/pkcs8.c | 3 -- crypto/pkcs8/pkcs8_x509.c | 4 --- crypto/trust_token/pmbtoken.c | 17 ---------- crypto/trust_token/trust_token.c | 14 -------- crypto/trust_token/voprf.c | 13 ------- crypto/x509/a_digest.c | 1 - crypto/x509/a_sign.c | 1 - crypto/x509/a_verify.c | 1 - crypto/x509/asn1_gen.c | 1 - crypto/x509/by_dir.c | 2 -- crypto/x509/policy.c | 11 ------ crypto/x509/x509_att.c | 8 ++--- crypto/x509/x509_cmp.c | 1 - crypto/x509/x509_lu.c | 1 - crypto/x509/x509_obj.c | 6 ++-- crypto/x509/x509_trs.c | 4 --- crypto/x509/x509_v3.c | 2 -- crypto/x509/x509_vfy.c | 7 ---- crypto/x509/x509name.c | 1 - crypto/x509/x509spki.c | 3 -- crypto/x509/x_crl.c | 1 - crypto/x509/x_info.c | 1 - crypto/x509/x_name.c | 13 +++---- crypto/x509/x_pkey.c | 1 - crypto/x509v3/v3_akey.c | 1 - crypto/x509v3/v3_alt.c | 8 ----- crypto/x509v3/v3_bcons.c | 1 - crypto/x509v3/v3_bitst.c | 2 -- crypto/x509v3/v3_conf.c | 2 -- crypto/x509v3/v3_cpols.c | 34 +++++++------------ crypto/x509v3/v3_crld.c | 20 +++++------ crypto/x509v3/v3_extku.c | 1 - crypto/x509v3/v3_ia5.c | 2 -- crypto/x509v3/v3_info.c | 4 --- crypto/x509v3/v3_lib.c | 3 -- crypto/x509v3/v3_ncons.c | 6 ++-- crypto/x509v3/v3_pci.c | 5 --- crypto/x509v3/v3_pcons.c | 1 - crypto/x509v3/v3_pmaps.c | 2 -- crypto/x509v3/v3_purp.c | 4 --- crypto/x509v3/v3_skey.c | 3 -- crypto/x509v3/v3_utl.c | 18 +++------- include/openssl/mem.h | 3 +- ssl/d1_both.cc | 3 -- ssl/encrypted_client_hello.cc | 5 --- ssl/extensions.cc | 1 - ssl/handshake_client.cc | 3 -- ssl/handshake_server.cc | 4 --- ssl/internal.h | 2 -- ssl/s3_both.cc | 1 - ssl/ssl_aead_ctx.cc | 1 - ssl/ssl_asn1.cc | 29 ---------------- ssl/ssl_cert.cc | 4 --- ssl/ssl_key_share.cc | 3 -- ssl/ssl_lib.cc | 1 - ssl/ssl_session.cc | 1 - ssl/ssl_x509.cc | 5 --- ssl/t1_enc.cc | 1 - ssl/tls13_both.cc | 7 ---- ssl/tls13_client.cc | 1 - ssl/tls13_enc.cc | 1 - 116 files changed, 70 insertions(+), 422 deletions(-) diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c index 3d60d3bd8e..2be07a45aa 100644 --- a/crypto/asn1/a_bitstr.c +++ b/crypto/asn1/a_bitstr.c @@ -184,7 +184,6 @@ ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, if (len > 0) { s = OPENSSL_memdup(p, len); if (s == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } p += len; @@ -236,7 +235,6 @@ int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value) { c = (unsigned char *)OPENSSL_realloc(a->data, w + 1); } if (c == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; } if (w + 1 - a->length > 0) { diff --git a/crypto/asn1/a_bool.c b/crypto/asn1/a_bool.c index 8dc84d4c46..67d6813a40 100644 --- a/crypto/asn1/a_bool.c +++ b/crypto/asn1/a_bool.c @@ -70,7 +70,6 @@ int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp) { if (*pp == NULL) { if ((p = allocated = OPENSSL_malloc(r)) == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return -1; } } else { diff --git a/crypto/asn1/a_dup.c b/crypto/asn1/a_dup.c index 8ee0c7eb72..b37a5c61b9 100644 --- a/crypto/asn1/a_dup.c +++ b/crypto/asn1/a_dup.c @@ -75,7 +75,6 @@ void *ASN1_item_dup(const ASN1_ITEM *it, void *x) { i = ASN1_item_i2d(x, &b, it); if (b == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return NULL; } p = b; diff --git a/crypto/asn1/a_i2d_fp.c b/crypto/asn1/a_i2d_fp.c index 4a14f2bcc1..e0713faecd 100644 --- a/crypto/asn1/a_i2d_fp.c +++ b/crypto/asn1/a_i2d_fp.c @@ -76,7 +76,6 @@ int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x) { unsigned char *b = NULL; int n = ASN1_item_i2d(x, &b, it); if (b == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c index e1a3df2e72..80cfac44e0 100644 --- a/crypto/asn1/a_mbstr.c +++ b/crypto/asn1/a_mbstr.c @@ -218,7 +218,6 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, free_dest = 1; dest = ASN1_STRING_type_new(str_type); if (!dest) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return -1; } } @@ -226,7 +225,6 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, // If both the same type just copy across if (inform == outform) { if (!ASN1_STRING_set(dest, in, len)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } dest->type = str_type; @@ -236,7 +234,6 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, CBB cbb; if (!CBB_init(&cbb, size_estimate + 1)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } CBS_init(&cbs, in, len); diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c index 8c420c6134..56219e1f81 100644 --- a/crypto/asn1/a_object.c +++ b/crypto/asn1/a_object.c @@ -86,7 +86,6 @@ int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp) { unsigned char *p, *allocated = NULL; if (*pp == NULL) { if ((p = allocated = OPENSSL_malloc(objsize)) == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return -1; } } else { @@ -211,7 +210,6 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, OPENSSL_free(data); data = (unsigned char *)OPENSSL_malloc(length); if (data == NULL) { - i = ERR_R_MALLOC_FAILURE; goto err; } ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; @@ -236,7 +234,6 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, *pp = p; return ret; err: - OPENSSL_PUT_ERROR(ASN1, i); if ((ret != NULL) && ((a == NULL) || (*a != ret))) { ASN1_OBJECT_free(ret); } @@ -248,7 +245,6 @@ ASN1_OBJECT *ASN1_OBJECT_new(void) { ret = (ASN1_OBJECT *)OPENSSL_malloc(sizeof(ASN1_OBJECT)); if (ret == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return NULL; } ret->length = 0; diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c index 73f828efb1..3b97b38e0b 100644 --- a/crypto/asn1/asn1_lib.c +++ b/crypto/asn1/asn1_lib.c @@ -299,7 +299,6 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, ossl_ssize_t len_s) { } if (str->data == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); str->data = c; return 0; } @@ -331,7 +330,6 @@ ASN1_STRING *ASN1_STRING_type_new(int type) { ret = (ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING)); if (ret == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return NULL; } ret->length = 0; diff --git a/crypto/asn1/asn_pack.c b/crypto/asn1/asn_pack.c index 069cef0b3c..c42cc05ea0 100644 --- a/crypto/asn1/asn_pack.c +++ b/crypto/asn1/asn_pack.c @@ -72,7 +72,6 @@ ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **out) { if (out == NULL || *out == NULL) { ret = ASN1_STRING_new(); if (ret == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); OPENSSL_free(new_data); return NULL; } diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 39329b6879..4f25fbbac1 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -590,7 +590,6 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, } if (!*val) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } @@ -607,7 +606,6 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, len -= p - q; if (!sk_ASN1_VALUE_push((STACK_OF(ASN1_VALUE) *)*val, skfield)) { ASN1_item_ex_free(&skfield, ASN1_ITEM_ptr(tt->item)); - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } } @@ -872,7 +870,6 @@ static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, if (!*pval) { stmp = ASN1_STRING_type_new(utype); if (!stmp) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } *pval = (ASN1_VALUE *)stmp; @@ -881,7 +878,6 @@ static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, stmp->type = utype; } if (!ASN1_STRING_set(stmp, cont, len)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); ASN1_STRING_free(stmp); *pval = NULL; goto err; diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index e46968c7ea..9d4d587ee6 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -92,7 +92,6 @@ int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it) { } buf = OPENSSL_malloc(len); if (!buf) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return -1; } p = buf; @@ -461,7 +460,6 @@ static int asn1_set_seq_out(STACK_OF(ASN1_VALUE) *sk, unsigned char **out, unsigned char *const buf = OPENSSL_malloc(skcontlen); DER_ENC *encoded = OPENSSL_malloc(sk_ASN1_VALUE_num(sk) * sizeof(*encoded)); if (encoded == NULL || buf == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/asn1/tasn_new.c b/crypto/asn1/tasn_new.c index 3727b9b142..8a90b436d1 100644 --- a/crypto/asn1/tasn_new.c +++ b/crypto/asn1/tasn_new.c @@ -175,7 +175,6 @@ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { memerr2: ASN1_item_ex_free(pval, it); memerr: - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; auxerr2: @@ -235,7 +234,6 @@ static int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { STACK_OF(ASN1_VALUE) *skval; skval = sk_ASN1_VALUE_new_null(); if (!skval) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); ret = 0; goto done; } diff --git a/crypto/bio/bio.c b/crypto/bio/bio.c index 453e45acee..610c733b2f 100644 --- a/crypto/bio/bio.c +++ b/crypto/bio/bio.c @@ -72,7 +72,6 @@ BIO *BIO_new(const BIO_METHOD *method) { BIO *ret = OPENSSL_malloc(sizeof(BIO)); if (ret == NULL) { - OPENSSL_PUT_ERROR(BIO, ERR_R_MALLOC_FAILURE); return NULL; } @@ -609,7 +608,6 @@ int BIO_read_asn1(BIO *bio, uint8_t **out, size_t *out_len, size_t max_len) { *out = OPENSSL_malloc(len); if (*out == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; } OPENSSL_memcpy(*out, header, header_len); diff --git a/crypto/bio/pair.c b/crypto/bio/pair.c index 8f47568def..c4d09c14a2 100644 --- a/crypto/bio/pair.c +++ b/crypto/bio/pair.c @@ -317,7 +317,6 @@ static int bio_make_pair(BIO *bio1, BIO *bio2, size_t writebuf1_len, } b1->buf = OPENSSL_malloc(b1->size); if (b1->buf == NULL) { - OPENSSL_PUT_ERROR(BIO, ERR_R_MALLOC_FAILURE); return 0; } b1->len = 0; @@ -330,7 +329,6 @@ static int bio_make_pair(BIO *bio1, BIO *bio2, size_t writebuf1_len, } b2->buf = OPENSSL_malloc(b2->size); if (b2->buf == NULL) { - OPENSSL_PUT_ERROR(BIO, ERR_R_MALLOC_FAILURE); return 0; } b2->len = 0; diff --git a/crypto/bio/printf.c b/crypto/bio/printf.c index 253546b7cf..102256bccb 100644 --- a/crypto/bio/printf.c +++ b/crypto/bio/printf.c @@ -83,7 +83,6 @@ int BIO_printf(BIO *bio, const char *format, ...) { out = OPENSSL_malloc(requested_len + 1); out_malloced = 1; if (out == NULL) { - OPENSSL_PUT_ERROR(BIO, ERR_R_MALLOC_FAILURE); return -1; } va_start(args, format); diff --git a/crypto/bn_extra/convert.c b/crypto/bn_extra/convert.c index 78fe102e2d..29234effd2 100644 --- a/crypto/bn_extra/convert.c +++ b/crypto/bn_extra/convert.c @@ -81,7 +81,6 @@ char *BN_bn2hex(const BIGNUM *bn) { char *buf = OPENSSL_malloc(1 /* leading '-' */ + 1 /* zero is non-empty */ + width * BN_BYTES * 2 + 1 /* trailing NUL */); if (buf == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } @@ -241,12 +240,12 @@ char *BN_bn2dec(const BIGNUM *a) { CBB cbb; if (!CBB_init(&cbb, 16) || !CBB_add_u8(&cbb, 0 /* trailing NUL */)) { - goto cbb_err; + goto err; } if (BN_is_zero(a)) { if (!CBB_add_u8(&cbb, '0')) { - goto cbb_err; + goto err; } } else { copy = BN_dup(a); @@ -263,7 +262,7 @@ char *BN_bn2dec(const BIGNUM *a) { const int add_leading_zeros = !BN_is_zero(copy); for (int i = 0; i < BN_DEC_NUM && (add_leading_zeros || word != 0); i++) { if (!CBB_add_u8(&cbb, '0' + word % 10)) { - goto cbb_err; + goto err; } word /= 10; } @@ -273,13 +272,13 @@ char *BN_bn2dec(const BIGNUM *a) { if (BN_is_negative(a) && !CBB_add_u8(&cbb, '-')) { - goto cbb_err; + goto err; } uint8_t *data; size_t len; if (!CBB_finish(&cbb, &data, &len)) { - goto cbb_err; + goto err; } // Reverse the buffer. @@ -292,8 +291,6 @@ char *BN_bn2dec(const BIGNUM *a) { BN_free(copy); return (char *)data; -cbb_err: - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); err: BN_free(copy); CBB_cleanup(&cbb); @@ -427,7 +424,6 @@ BIGNUM *BN_mpi2bn(const uint8_t *in, size_t len, BIGNUM *out) { if (out == NULL) { out = BN_new(); if (out == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } out_is_alloced = 1; diff --git a/crypto/buf/buf.c b/crypto/buf/buf.c index bd97dd347c..57bf34d4b0 100644 --- a/crypto/buf/buf.c +++ b/crypto/buf/buf.c @@ -69,7 +69,6 @@ BUF_MEM *BUF_MEM_new(void) { ret = OPENSSL_malloc(sizeof(BUF_MEM)); if (ret == NULL) { - OPENSSL_PUT_ERROR(BUF, ERR_R_MALLOC_FAILURE); return NULL; } @@ -93,21 +92,18 @@ int BUF_MEM_reserve(BUF_MEM *buf, size_t cap) { size_t n = cap + 3; if (n < cap) { - // overflow - OPENSSL_PUT_ERROR(BUF, ERR_R_MALLOC_FAILURE); + OPENSSL_PUT_ERROR(BUF, ERR_R_OVERFLOW); return 0; } n = n / 3; size_t alloc_size = n * 4; if (alloc_size / 4 != n) { - // overflow - OPENSSL_PUT_ERROR(BUF, ERR_R_MALLOC_FAILURE); + OPENSSL_PUT_ERROR(BUF, ERR_R_OVERFLOW); return 0; } char *new_buf = OPENSSL_realloc(buf->data, alloc_size); if (new_buf == NULL) { - OPENSSL_PUT_ERROR(BUF, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/bytestring/cbb.c b/crypto/bytestring/cbb.c index 1692b4ea61..5280dc8f9c 100644 --- a/crypto/bytestring/cbb.c +++ b/crypto/bytestring/cbb.c @@ -19,6 +19,7 @@ #include #include +#include #include "../internal.h" @@ -77,11 +78,13 @@ static int cbb_buffer_reserve(struct cbb_buffer_st *base, uint8_t **out, size_t newlen = base->len + len; if (newlen < base->len) { // Overflow + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } if (newlen > base->cap) { if (!base->can_resize) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } @@ -121,6 +124,7 @@ static int cbb_buffer_add(struct cbb_buffer_st *base, uint8_t **out, int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len) { if (cbb->is_child) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -191,6 +195,7 @@ int CBB_flush(CBB *cbb) { assert (child->pending_len_len == 1); if (len > 0xfffffffe) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); // Too large. goto err; } else if (len > 0xffffff) { @@ -229,6 +234,7 @@ int CBB_flush(CBB *cbb) { len >>= 8; } if (len != 0) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } @@ -634,6 +640,7 @@ int CBB_flush_asn1_set_of(CBB *cbb) { CBS_init(&cbs, CBB_data(cbb), CBB_len(cbb)); while (CBS_len(&cbs) != 0) { if (!CBS_get_any_asn1_element(&cbs, NULL, NULL, NULL)) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } num_children++; diff --git a/crypto/conf/conf.c b/crypto/conf/conf.c index 8874896112..622c13ed00 100644 --- a/crypto/conf/conf.c +++ b/crypto/conf/conf.c @@ -132,7 +132,6 @@ CONF *NCONF_new(void *method) { CONF_VALUE *CONF_VALUE_new(void) { CONF_VALUE *v = OPENSSL_malloc(sizeof(CONF_VALUE)); if (!v) { - OPENSSL_PUT_ERROR(CONF, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(v, 0, sizeof(CONF_VALUE)); @@ -340,7 +339,6 @@ static int str_copy(CONF *conf, char *section, char **pto, char *from) { goto err; } if (!BUF_MEM_grow_clean(buf, newsize)) { - OPENSSL_PUT_ERROR(CONF, ERR_R_MALLOC_FAILURE); goto err; } while (*p) { @@ -552,7 +550,6 @@ static int def_load_bio(CONF *conf, BIO *in, long *out_error_line) { section = OPENSSL_strdup(kDefaultSectionName); if (section == NULL) { - OPENSSL_PUT_ERROR(CONF, ERR_R_MALLOC_FAILURE); goto err; } @@ -687,7 +684,6 @@ static int def_load_bio(CONF *conf, BIO *in, long *out_error_line) { } v->name = OPENSSL_strdup(pname); if (v->name == NULL) { - OPENSSL_PUT_ERROR(CONF, ERR_R_MALLOC_FAILURE); goto err; } if (!str_copy(conf, psection, &(v->value), start)) { @@ -706,7 +702,6 @@ static int def_load_bio(CONF *conf, BIO *in, long *out_error_line) { tv = sv; } if (add_string(conf, tv, v) == 0) { - OPENSSL_PUT_ERROR(CONF, ERR_R_MALLOC_FAILURE); goto err; } v = NULL; diff --git a/crypto/digest_extra/digest_extra.c b/crypto/digest_extra/digest_extra.c index 8cbb28e3af..08ed671a80 100644 --- a/crypto/digest_extra/digest_extra.c +++ b/crypto/digest_extra/digest_extra.c @@ -200,7 +200,6 @@ int EVP_marshal_digest_algorithm(CBB *cbb, const EVP_MD *md) { CBB algorithm, oid, null; if (!CBB_add_asn1(cbb, &algorithm, CBS_ASN1_SEQUENCE) || !CBB_add_asn1(&algorithm, &oid, CBS_ASN1_OBJECT)) { - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } @@ -209,7 +208,6 @@ int EVP_marshal_digest_algorithm(CBB *cbb, const EVP_MD *md) { for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kMDOIDs); i++) { if (nid == kMDOIDs[i].nid) { if (!CBB_add_bytes(&oid, kMDOIDs[i].oid, kMDOIDs[i].oid_len)) { - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } found = 1; @@ -224,7 +222,6 @@ int EVP_marshal_digest_algorithm(CBB *cbb, const EVP_MD *md) { if (!CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || !CBB_flush(cbb)) { - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/dsa/dsa.c b/crypto/dsa/dsa.c index ecffdf75e5..4d9b1f01ed 100644 --- a/crypto/dsa/dsa.c +++ b/crypto/dsa/dsa.c @@ -90,7 +90,6 @@ static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT; DSA *DSA_new(void) { DSA *dsa = OPENSSL_malloc(sizeof(DSA)); if (dsa == NULL) { - OPENSSL_PUT_ERROR(DSA, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/ec_extra/ec_asn1.c b/crypto/ec_extra/ec_asn1.c index ee75165df0..5c0dab1a4f 100644 --- a/crypto/ec_extra/ec_asn1.c +++ b/crypto/ec_extra/ec_asn1.c @@ -504,7 +504,6 @@ EC_KEY *o2i_ECPublicKey(EC_KEY **keyp, const uint8_t **inp, long len) { ret = *keyp; if (ret->pub_key == NULL && (ret->pub_key = EC_POINT_new(ret->group)) == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } if (!EC_POINT_oct2point(ret->group, ret->pub_key, *inp, len, NULL)) { diff --git a/crypto/evp/evp.c b/crypto/evp/evp.c index f11ef9f46a..39e40fd20c 100644 --- a/crypto/evp/evp.c +++ b/crypto/evp/evp.c @@ -85,7 +85,6 @@ EVP_PKEY *EVP_PKEY_new(void) { ret = OPENSSL_malloc(sizeof(EVP_PKEY)); if (ret == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/evp/evp_ctx.c b/crypto/evp/evp_ctx.c index 5f31ddb398..771f13f003 100644 --- a/crypto/evp/evp_ctx.c +++ b/crypto/evp/evp_ctx.c @@ -88,7 +88,6 @@ static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e, const EVP_PKEY_METHOD *pmeth) { EVP_PKEY_CTX *ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); if (!ret) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(EVP_PKEY_CTX)); diff --git a/crypto/evp/p_ed25519.c b/crypto/evp/p_ed25519.c index b3d8cc9858..cd787a1526 100644 --- a/crypto/evp/p_ed25519.c +++ b/crypto/evp/p_ed25519.c @@ -27,7 +27,6 @@ static int pkey_ed25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } static int pkey_ed25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { ED25519_KEY *key = OPENSSL_malloc(sizeof(ED25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/evp/p_ed25519_asn1.c b/crypto/evp/p_ed25519_asn1.c index 9f9251c956..c3f88850fe 100644 --- a/crypto/evp/p_ed25519_asn1.c +++ b/crypto/evp/p_ed25519_asn1.c @@ -36,7 +36,6 @@ static int ed25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { ED25519_KEY *key = OPENSSL_malloc(sizeof(ED25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } @@ -59,7 +58,6 @@ static int ed25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { ED25519_KEY *key = OPENSSL_malloc(sizeof(ED25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/evp/p_hkdf.c b/crypto/evp/p_hkdf.c index 05158e2995..0d7ede82c2 100644 --- a/crypto/evp/p_hkdf.c +++ b/crypto/evp/p_hkdf.c @@ -37,13 +37,11 @@ typedef struct { static int pkey_hkdf_init(EVP_PKEY_CTX *ctx) { HKDF_PKEY_CTX *hctx = OPENSSL_malloc(sizeof(HKDF_PKEY_CTX)); if (hctx == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } OPENSSL_memset(hctx, 0, sizeof(HKDF_PKEY_CTX)); if (!CBB_init(&hctx->info, 0)) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); OPENSSL_free(hctx); return 0; } @@ -65,7 +63,6 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->key_len != 0) { hctx_dst->key = OPENSSL_memdup(hctx_src->key, hctx_src->key_len); if (hctx_dst->key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } hctx_dst->key_len = hctx_src->key_len; @@ -74,7 +71,6 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (hctx_src->salt_len != 0) { hctx_dst->salt = OPENSSL_memdup(hctx_src->salt, hctx_src->salt_len); if (hctx_dst->salt == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } hctx_dst->salt_len = hctx_src->salt_len; @@ -82,7 +78,6 @@ static int pkey_hkdf_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { if (!CBB_add_bytes(&hctx_dst->info, CBB_data(&hctx_src->info), CBB_len(&hctx_src->info))) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } @@ -159,7 +154,6 @@ static int pkey_hkdf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { case EVP_PKEY_CTRL_HKDF_KEY: { const CBS *key = p2; if (!CBS_stow(key, &hctx->key, &hctx->key_len)) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } return 1; @@ -167,7 +161,6 @@ static int pkey_hkdf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { case EVP_PKEY_CTRL_HKDF_SALT: { const CBS *salt = p2; if (!CBS_stow(salt, &hctx->salt, &hctx->salt_len)) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } return 1; @@ -177,7 +170,6 @@ static int pkey_hkdf_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) { // |EVP_PKEY_CTX_add1_hkdf_info| appends to the info string, rather than // replacing it. if (!CBB_add_bytes(&hctx->info, CBS_data(info), CBS_len(info))) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } return 1; diff --git a/crypto/evp/p_x25519.c b/crypto/evp/p_x25519.c index ed7df39a98..75ef6e10a7 100644 --- a/crypto/evp/p_x25519.c +++ b/crypto/evp/p_x25519.c @@ -27,7 +27,6 @@ static int pkey_x25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; } static int pkey_x25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { X25519_KEY *key = OPENSSL_malloc(sizeof(X25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/evp/p_x25519_asn1.c b/crypto/evp/p_x25519_asn1.c index e36b41e36e..3573f240c3 100644 --- a/crypto/evp/p_x25519_asn1.c +++ b/crypto/evp/p_x25519_asn1.c @@ -36,7 +36,6 @@ static int x25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { X25519_KEY *key = OPENSSL_malloc(sizeof(X25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } @@ -57,7 +56,6 @@ static int x25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { X25519_KEY *key = OPENSSL_malloc(sizeof(X25519_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/evp/print.c b/crypto/evp/print.c index 11fad3cef4..ed0fb0eeca 100644 --- a/crypto/evp/print.c +++ b/crypto/evp/print.c @@ -117,7 +117,6 @@ static int bn_print(BIO *bp, const char *name, const BIGNUM *num, int off) { size_t len = BN_num_bytes(num); uint8_t *buf = OPENSSL_malloc(len + 1); if (buf == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/evp/scrypt.c b/crypto/evp/scrypt.c index 14a5e02c98..8212cd15ee 100644 --- a/crypto/evp/scrypt.c +++ b/crypto/evp/scrypt.c @@ -177,7 +177,6 @@ int EVP_PBE_scrypt(const char *password, size_t password_len, size_t V_blocks = N * 2 * r; block_t *B = OPENSSL_malloc((B_blocks + T_blocks + V_blocks) * sizeof(block_t)); if (B == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/ex_data.c b/crypto/ex_data.c index 532a3ad5e5..867ced3c94 100644 --- a/crypto/ex_data.c +++ b/crypto/ex_data.c @@ -137,7 +137,6 @@ int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, int *out_index, funcs = OPENSSL_malloc(sizeof(CRYPTO_EX_DATA_FUNCS)); if (funcs == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return 0; } @@ -152,7 +151,6 @@ int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, int *out_index, } if (ex_data_class->meth == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); goto err; } @@ -164,7 +162,6 @@ int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, int *out_index, } if (!sk_CRYPTO_EX_DATA_FUNCS_push(ex_data_class->meth, funcs)) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); goto err; } funcs = NULL; // |sk_CRYPTO_EX_DATA_FUNCS_push| takes ownership. @@ -190,7 +187,6 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val) { if (ad->sk == NULL) { ad->sk = sk_void_new_null(); if (ad->sk == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return 0; } } @@ -198,7 +194,6 @@ int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val) { // Add NULL values until the stack is long enough. for (size_t i = sk_void_num(ad->sk); i <= (size_t)index; i++) { if (!sk_void_push(ad->sk, NULL)) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return 0; } } @@ -235,7 +230,6 @@ static int get_func_pointers(STACK_OF(CRYPTO_EX_DATA_FUNCS) **out, CRYPTO_STATIC_MUTEX_unlock_read(&ex_data_class->lock); if (n > 0 && *out == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/bn/bn.c b/crypto/fipsmodule/bn/bn.c index 93fae56940..d7d86263d2 100644 --- a/crypto/fipsmodule/bn/bn.c +++ b/crypto/fipsmodule/bn/bn.c @@ -76,7 +76,6 @@ BIGNUM *BN_new(void) { BIGNUM *bn = OPENSSL_malloc(sizeof(BIGNUM)); if (bn == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } @@ -364,7 +363,6 @@ int bn_wexpand(BIGNUM *bn, size_t words) { a = OPENSSL_malloc(sizeof(BN_ULONG) * words); if (a == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/bn/ctx.c b/crypto/fipsmodule/bn/ctx.c index f8c7ebfa62..007316110c 100644 --- a/crypto/fipsmodule/bn/ctx.c +++ b/crypto/fipsmodule/bn/ctx.c @@ -108,7 +108,6 @@ struct bignum_ctx { BN_CTX *BN_CTX_new(void) { BN_CTX *ret = OPENSSL_malloc(sizeof(BN_CTX)); if (!ret) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } @@ -162,7 +161,6 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx) { if (ctx->bignums == NULL) { ctx->bignums = sk_BIGNUM_new_null(); if (ctx->bignums == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); ctx->error = 1; return NULL; } diff --git a/crypto/fipsmodule/bn/gcd.c b/crypto/fipsmodule/bn/gcd.c index bd0fa6f5de..e8cc764cf8 100644 --- a/crypto/fipsmodule/bn/gcd.c +++ b/crypto/fipsmodule/bn/gcd.c @@ -286,7 +286,6 @@ BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, const BIGNUM *n, if (out == NULL) { new_out = BN_new(); if (new_out == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } out = new_out; diff --git a/crypto/fipsmodule/bn/prime.c b/crypto/fipsmodule/bn/prime.c index 0578558296..2d2ab6937f 100644 --- a/crypto/fipsmodule/bn/prime.c +++ b/crypto/fipsmodule/bn/prime.c @@ -362,7 +362,6 @@ static int probable_prime_dh_safe(BIGNUM *rnd, int bits, const BIGNUM *add, BN_GENCB *BN_GENCB_new(void) { BN_GENCB *callback = OPENSSL_malloc(sizeof(BN_GENCB)); if (callback == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(callback, 0, sizeof(BN_GENCB)); diff --git a/crypto/fipsmodule/bn/sqrt.c b/crypto/fipsmodule/bn/sqrt.c index 9180d54020..f97675308a 100644 --- a/crypto/fipsmodule/bn/sqrt.c +++ b/crypto/fipsmodule/bn/sqrt.c @@ -445,7 +445,6 @@ int BN_sqrt(BIGNUM *out_sqrt, const BIGNUM *in, BN_CTX *ctx) { last_delta = BN_CTX_get(ctx); delta = BN_CTX_get(ctx); if (estimate == NULL || tmp == NULL || last_delta == NULL || delta == NULL) { - OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/fipsmodule/cipher/cipher.c b/crypto/fipsmodule/cipher/cipher.c index ee455784a7..18b5e0a5e9 100644 --- a/crypto/fipsmodule/cipher/cipher.c +++ b/crypto/fipsmodule/cipher/cipher.c @@ -116,7 +116,6 @@ int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) { out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size); if (!out->cipher_data) { out->cipher = NULL; - OPENSSL_PUT_ERROR(CIPHER, ERR_R_MALLOC_FAILURE); return 0; } OPENSSL_memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size); @@ -165,7 +164,6 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size); if (!ctx->cipher_data) { ctx->cipher = NULL; - OPENSSL_PUT_ERROR(CIPHER, ERR_R_MALLOC_FAILURE); return 0; } } else { diff --git a/crypto/fipsmodule/dh/dh.c b/crypto/fipsmodule/dh/dh.c index 11dbfc2990..83435118a0 100644 --- a/crypto/fipsmodule/dh/dh.c +++ b/crypto/fipsmodule/dh/dh.c @@ -75,7 +75,6 @@ DH *DH_new(void) { DH *dh = OPENSSL_malloc(sizeof(DH)); if (dh == NULL) { - OPENSSL_PUT_ERROR(DH, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/fipsmodule/digest/digest.c b/crypto/fipsmodule/digest/digest.c index cb723d6c8b..f499c468ff 100644 --- a/crypto/fipsmodule/digest/digest.c +++ b/crypto/fipsmodule/digest/digest.c @@ -144,7 +144,6 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) { if (in->pctx) { pctx = in->pctx_ops->dup(in->pctx); if (!pctx) { - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } } @@ -158,7 +157,6 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) { if (pctx) { in->pctx_ops->free(pctx); } - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } } else { @@ -207,7 +205,6 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *engine) { assert(type->ctx_size != 0); uint8_t *md_data = OPENSSL_malloc(type->ctx_size); if (md_data == NULL) { - OPENSSL_PUT_ERROR(DIGEST, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/ec/ec.c b/crypto/fipsmodule/ec/ec.c index debb965845..61ecc1f337 100644 --- a/crypto/fipsmodule/ec/ec.c +++ b/crypto/fipsmodule/ec/ec.c @@ -285,7 +285,6 @@ EC_GROUP *ec_group_new(const EC_METHOD *meth) { ret = OPENSSL_malloc(sizeof(EC_GROUP)); if (ret == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(EC_GROUP)); @@ -447,7 +446,6 @@ static EC_GROUP *ec_group_new_from_data(const struct built_in_curve *curve) { BN_CTX *ctx = BN_CTX_new(); if (ctx == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); goto err; } @@ -686,7 +684,6 @@ EC_POINT *EC_POINT_new(const EC_GROUP *group) { EC_POINT *ret = OPENSSL_malloc(sizeof *ret); if (ret == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/fipsmodule/ec/ec_key.c b/crypto/fipsmodule/ec/ec_key.c index 31a097e82d..f391a61c7b 100644 --- a/crypto/fipsmodule/ec/ec_key.c +++ b/crypto/fipsmodule/ec/ec_key.c @@ -88,7 +88,6 @@ DEFINE_STATIC_EX_DATA_CLASS(g_ec_ex_data_class) static EC_WRAPPED_SCALAR *ec_wrapped_scalar_new(const EC_GROUP *group) { EC_WRAPPED_SCALAR *wrapped = OPENSSL_malloc(sizeof(EC_WRAPPED_SCALAR)); if (wrapped == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } @@ -109,7 +108,6 @@ EC_KEY *EC_KEY_new(void) { return EC_KEY_new_method(NULL); } EC_KEY *EC_KEY_new_method(const ENGINE *engine) { EC_KEY *ret = OPENSSL_malloc(sizeof(EC_KEY)); if (ret == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } @@ -142,7 +140,6 @@ EC_KEY *EC_KEY_new_method(const ENGINE *engine) { EC_KEY *EC_KEY_new_by_curve_name(int nid) { EC_KEY *ret = EC_KEY_new(); if (ret == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return NULL; } ret->group = EC_GROUP_new_by_curve_name(nid); @@ -467,7 +464,6 @@ size_t EC_KEY_priv2buf(const EC_KEY *key, uint8_t **out_buf) { uint8_t *buf = OPENSSL_malloc(len); if (buf == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/ec/oct.c b/crypto/fipsmodule/ec/oct.c index dd2e007810..3f0c0d65e7 100644 --- a/crypto/fipsmodule/ec/oct.c +++ b/crypto/fipsmodule/ec/oct.c @@ -241,7 +241,6 @@ size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, } uint8_t *buf = OPENSSL_malloc(len); if (buf == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); return 0; } len = EC_POINT_point2oct(group, point, form, buf, len, ctx); diff --git a/crypto/fipsmodule/ec/wnaf.c b/crypto/fipsmodule/ec/wnaf.c index 65cc89459e..ce0d4b8b6b 100644 --- a/crypto/fipsmodule/ec/wnaf.c +++ b/crypto/fipsmodule/ec/wnaf.c @@ -205,7 +205,6 @@ int ec_GFp_mont_mul_public_batch(const EC_GROUP *group, EC_RAW_POINT *r, wNAF_alloc = OPENSSL_malloc(num * sizeof(wNAF_alloc[0])); precomp_alloc = OPENSSL_malloc(num * sizeof(precomp_alloc[0])); if (wNAF_alloc == NULL || precomp_alloc == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); goto err; } wNAF = wNAF_alloc; diff --git a/crypto/fipsmodule/rsa/blinding.c b/crypto/fipsmodule/rsa/blinding.c index 29477bd75b..c4cfcc2313 100644 --- a/crypto/fipsmodule/rsa/blinding.c +++ b/crypto/fipsmodule/rsa/blinding.c @@ -132,7 +132,6 @@ static int bn_blinding_create_param(BN_BLINDING *b, const BIGNUM *e, BN_BLINDING *BN_BLINDING_new(void) { BN_BLINDING *ret = OPENSSL_malloc(sizeof(BN_BLINDING)); if (ret == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(BN_BLINDING)); diff --git a/crypto/fipsmodule/rsa/padding.c b/crypto/fipsmodule/rsa/padding.c index 17d4c62be9..85f7835a64 100644 --- a/crypto/fipsmodule/rsa/padding.c +++ b/crypto/fipsmodule/rsa/padding.c @@ -358,7 +358,6 @@ int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, dbmask = OPENSSL_malloc(emlen - mdlen); if (dbmask == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto out; } @@ -413,7 +412,6 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, FIPS_service_indicator_lock_state(); db = OPENSSL_malloc(dblen); if (db == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } @@ -543,7 +541,6 @@ int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash, const uint8_t *H = EM + maskedDBLen; DB = OPENSSL_malloc(maskedDBLen); if (!DB) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } if (!PKCS1_MGF1(DB, maskedDBLen, H, hLen, mgf1Hash)) { @@ -653,7 +650,6 @@ int RSA_padding_add_PKCS1_PSS_mgf1(const RSA *rsa, unsigned char *EM, if (sLen > 0) { salt = OPENSSL_malloc(sLen); if (!salt) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } if (!RAND_bytes(salt, sLen)) { diff --git a/crypto/fipsmodule/rsa/rsa.c b/crypto/fipsmodule/rsa/rsa.c index bbac05f51e..2139275f82 100644 --- a/crypto/fipsmodule/rsa/rsa.c +++ b/crypto/fipsmodule/rsa/rsa.c @@ -88,7 +88,6 @@ RSA *RSA_new(void) { return RSA_new_method(NULL); } RSA *RSA_new_method(const ENGINE *engine) { RSA *rsa = OPENSSL_malloc(sizeof(RSA)); if (rsa == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return NULL; } @@ -530,7 +529,6 @@ int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len, uint8_t *signed_msg = OPENSSL_malloc(signed_msg_len); if (!signed_msg) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -610,7 +608,6 @@ int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, size_t padded_len = RSA_size(rsa); uint8_t *padded = OPENSSL_malloc(padded_len); if (padded == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -644,7 +641,6 @@ int rsa_verify_no_self_test(int hash_nid, const uint8_t *digest, buf = OPENSSL_malloc(rsa_size); if (!buf) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -691,7 +687,6 @@ int RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *digest, size_t digest_len, size_t em_len = RSA_size(rsa); uint8_t *em = OPENSSL_malloc(em_len); if (em == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -772,7 +767,6 @@ int RSA_check_key(const RSA *key) { BN_CTX *ctx = BN_CTX_new(); if (ctx == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -900,7 +894,6 @@ int RSA_check_fips(RSA *key) { BN_CTX *ctx = BN_CTX_new(); if (ctx == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } @@ -947,7 +940,6 @@ int RSA_check_fips(RSA *key) { unsigned sig_len = RSA_size(key); uint8_t *sig = OPENSSL_malloc(sig_len); if (sig == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/fipsmodule/rsa/rsa_impl.c b/crypto/fipsmodule/rsa/rsa_impl.c index df465f242d..4500b1a808 100644 --- a/crypto/fipsmodule/rsa/rsa_impl.c +++ b/crypto/fipsmodule/rsa/rsa_impl.c @@ -295,7 +295,6 @@ int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, result = BN_CTX_get(ctx); buf = OPENSSL_malloc(rsa_size); if (!f || !result || !buf) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } @@ -498,7 +497,6 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, buf = OPENSSL_malloc(rsa_size); if (buf == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } @@ -551,7 +549,6 @@ int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, // Allocate a temporary buffer to hold the padded plaintext. buf = OPENSSL_malloc(rsa_size); if (buf == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } } @@ -633,7 +630,6 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out, f = BN_CTX_get(ctx); result = BN_CTX_get(ctx); if (f == NULL || result == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } @@ -643,7 +639,6 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out, // Allocate a temporary buffer to hold the padded plaintext. buf = OPENSSL_malloc(rsa_size); if (buf == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } } @@ -725,7 +720,6 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, result = BN_CTX_get(ctx); if (f == NULL || result == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/fipsmodule/service_indicator/service_indicator.c b/crypto/fipsmodule/service_indicator/service_indicator.c index febe534480..dd38bd74d6 100644 --- a/crypto/fipsmodule/service_indicator/service_indicator.c +++ b/crypto/fipsmodule/service_indicator/service_indicator.c @@ -51,7 +51,6 @@ static struct fips_service_indicator_state *service_indicator_get(void) { if (indicator == NULL) { indicator = OPENSSL_malloc(sizeof(struct fips_service_indicator_state)); if (indicator == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/hpke/hpke.c b/crypto/hpke/hpke.c index faea2eea06..3dfdb29b07 100644 --- a/crypto/hpke/hpke.c +++ b/crypto/hpke/hpke.c @@ -250,7 +250,6 @@ void EVP_HPKE_KEY_cleanup(EVP_HPKE_KEY *key) { EVP_HPKE_KEY *EVP_HPKE_KEY_new(void) { EVP_HPKE_KEY *key = OPENSSL_malloc(sizeof(EVP_HPKE_KEY)); if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return NULL; } EVP_HPKE_KEY_zero(key); @@ -465,7 +464,6 @@ void EVP_HPKE_CTX_cleanup(EVP_HPKE_CTX *ctx) { EVP_HPKE_CTX *EVP_HPKE_CTX_new(void) { EVP_HPKE_CTX *ctx = OPENSSL_malloc(sizeof(EVP_HPKE_CTX)); if (ctx == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); return NULL; } EVP_HPKE_CTX_zero(ctx); diff --git a/crypto/internal.h b/crypto/internal.h index f12871f052..a4cd929125 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -1299,7 +1299,7 @@ OPENSSL_INLINE int CRYPTO_is_ARMv8_PMULL_capable(void) { extern uint8_t BORINGSSL_function_hit[7]; #endif // BORINGSSL_DISPATCH_TEST -// OPENSSL_vasprintf_internal is just like |vasprintf(3)|. if |system_malloc| is +// OPENSSL_vasprintf_internal is just like |vasprintf(3)|. If |system_malloc| is // 0, memory will be allocated with |OPENSSL_malloc| and must be freed with // |OPENSSL_free|. Otherwise the system |malloc| function is used and the memory // must be freed with the system |free| function. diff --git a/crypto/mem.c b/crypto/mem.c index f75e89eae5..4905caf7f4 100644 --- a/crypto/mem.c +++ b/crypto/mem.c @@ -227,13 +227,17 @@ static int should_fail_allocation(void) { return 0; } void *OPENSSL_malloc(size_t size) { if (should_fail_allocation()) { - return NULL; + goto err; } if (OPENSSL_memory_alloc != NULL) { assert(OPENSSL_memory_free != NULL); assert(OPENSSL_memory_get_size != NULL); - return OPENSSL_memory_alloc(size); + void *ptr = OPENSSL_memory_alloc(size); + if (ptr == NULL && size != 0) { + goto err; + } + return ptr; } if (size + OPENSSL_MALLOC_PREFIX < size) { @@ -245,18 +249,23 @@ void *OPENSSL_malloc(size_t size) { // rare code path. uint8_t unused = *(volatile uint8_t *)kBoringSSLBinaryTag; (void) unused; - return NULL; + goto err; } void *ptr = malloc(size + OPENSSL_MALLOC_PREFIX); if (ptr == NULL) { - return NULL; + goto err; } *(size_t *)ptr = size; __asan_poison_memory_region(ptr, OPENSSL_MALLOC_PREFIX); return ((uint8_t *)ptr) + OPENSSL_MALLOC_PREFIX; + + err: + // This only works because ERR does not call OPENSSL_malloc. + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); + return NULL; } void OPENSSL_free(void *orig_ptr) { @@ -289,10 +298,6 @@ void OPENSSL_free(void *orig_ptr) { } void *OPENSSL_realloc(void *orig_ptr, size_t new_size) { - if (should_fail_allocation()) { - return NULL; - } - if (orig_ptr == NULL) { return OPENSSL_malloc(new_size); } @@ -505,24 +510,21 @@ int OPENSSL_vasprintf_internal(char **str, const char *format, va_list args, va_copy(args_copy, args); int ret = vsnprintf(candidate, candidate_len, format, args_copy); va_end(args_copy); - if (ret == INT_MAX || ret < 0) { - // Failed, or size not int representable. + if (ret < 0) { goto err; } if ((size_t)ret >= candidate_len) { // Too big to fit in allocation. char *tmp; - candidate_len = ret + 1; + candidate_len = (size_t)ret + 1; if ((tmp = reallocate(candidate, candidate_len)) == NULL) { goto err; } candidate = tmp; - va_copy(args_copy, args); - ret = vsnprintf(candidate, candidate_len, format, args_copy); - va_end(args_copy); + ret = vsnprintf(candidate, candidate_len, format, args); } - // At this point this can't happen unless vsnprintf is insane. + // At this point this should not happen unless vsnprintf is insane. if (ret < 0 || (size_t)ret >= candidate_len) { goto err; } @@ -559,7 +561,6 @@ char *OPENSSL_strndup(const char *str, size_t size) { } char *ret = OPENSSL_malloc(alloc_size); if (ret == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return NULL; } @@ -598,7 +599,6 @@ void *OPENSSL_memdup(const void *data, size_t size) { void *ret = OPENSSL_malloc(size); if (ret == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/obj/obj.c b/crypto/obj/obj.c index c4e1aee6f6..1ce9d5479e 100644 --- a/crypto/obj/obj.c +++ b/crypto/obj/obj.c @@ -155,7 +155,6 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) { return r; err: - OPENSSL_PUT_ERROR(OBJ, ERR_R_MALLOC_FAILURE); OPENSSL_free(ln); OPENSSL_free(sn); OPENSSL_free(data); diff --git a/crypto/pem/pem_info.c b/crypto/pem/pem_info.c index 80c06b81ce..c097013d40 100644 --- a/crypto/pem/pem_info.c +++ b/crypto/pem/pem_info.c @@ -139,7 +139,6 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, if (sk == NULL) { ret = sk_X509_INFO_new_null(); if (ret == NULL) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); return NULL; } } else { diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c index fc1144e000..28ed438b92 100644 --- a/crypto/pem/pem_lib.c +++ b/crypto/pem/pem_lib.c @@ -298,7 +298,6 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, // actually it needs the cipher block size extra... data = (unsigned char *)OPENSSL_malloc((unsigned int)dsize + 20); if (data == NULL) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } p = data; @@ -552,7 +551,6 @@ int PEM_write_bio(BIO *bp, const char *name, const char *header, buf = OPENSSL_malloc(PEM_BUFSIZE * 8); if (buf == NULL) { - reason = ERR_R_MALLOC_FAILURE; goto err; } @@ -615,7 +613,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, BUF_MEM_free(nameB); BUF_MEM_free(headerB); BUF_MEM_free(dataB); - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); return 0; } @@ -641,7 +638,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, continue; } if (!BUF_MEM_grow(nameB, i + 9)) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } OPENSSL_memcpy(nameB->data, &(buf[11]), i - 6); @@ -651,7 +647,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, } hl = 0; if (!BUF_MEM_grow(headerB, 256)) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } headerB->data[0] = '\0'; @@ -671,7 +666,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, break; } if (!BUF_MEM_grow(headerB, hl + i + 9)) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } if (strncmp(buf, "-----END ", 9) == 0) { @@ -685,7 +679,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, bl = 0; if (!BUF_MEM_grow(dataB, 1024)) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } dataB->data[0] = '\0'; @@ -712,7 +705,6 @@ int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, break; } if (!BUF_MEM_grow_clean(dataB, i + bl + 9)) { - OPENSSL_PUT_ERROR(PEM, ERR_R_MALLOC_FAILURE); goto err; } OPENSSL_memcpy(&(dataB->data[bl]), buf, i); diff --git a/crypto/pkcs7/pkcs7_x509.c b/crypto/pkcs7/pkcs7_x509.c index 773c5923d4..fd71bd7b37 100644 --- a/crypto/pkcs7/pkcs7_x509.c +++ b/crypto/pkcs7/pkcs7_x509.c @@ -328,7 +328,6 @@ int i2d_PKCS7(const PKCS7 *p7, uint8_t **out) { if (*out == NULL) { *out = OPENSSL_malloc(p7->ber_len); if (*out == NULL) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); return -1; } OPENSSL_memcpy(*out, p7->ber_bytes, p7->ber_len); diff --git a/crypto/pkcs8/pkcs8.c b/crypto/pkcs8/pkcs8.c index 84b7b12719..6dd111b854 100644 --- a/crypto/pkcs8/pkcs8.c +++ b/crypto/pkcs8/pkcs8.c @@ -76,7 +76,6 @@ static int pkcs12_encode_password(const char *in, size_t in_len, uint8_t **out, size_t *out_len) { CBB cbb; if (!CBB_init(&cbb, in_len * 2)) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); return 0; } @@ -162,7 +161,6 @@ int pkcs12_key_gen(const char *pass, size_t pass_len, const uint8_t *salt, I = OPENSSL_malloc(I_len); if (I_len != 0 && I == NULL) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); goto err; } @@ -390,7 +388,6 @@ int pkcs8_pbe_decrypt(uint8_t **out, size_t *out_len, CBS *algorithm, buf = OPENSSL_malloc(in_len); if (buf == NULL) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/pkcs8/pkcs8_x509.c b/crypto/pkcs8/pkcs8_x509.c index de50567121..83d34e6a1f 100644 --- a/crypto/pkcs8/pkcs8_x509.c +++ b/crypto/pkcs8/pkcs8_x509.c @@ -334,7 +334,6 @@ static int parse_bag_attributes(CBS *attrs, uint8_t **out_friendly_name, // Convert the friendly name to UTF-8. CBB cbb; if (!CBB_init(&cbb, CBS_len(&value))) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); goto err; } while (CBS_len(&value) != 0) { @@ -347,7 +346,6 @@ static int parse_bag_attributes(CBS *attrs, uint8_t **out_friendly_name, } } if (!CBB_finish(&cbb, out_friendly_name, out_friendly_name_len)) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); CBB_cleanup(&cbb); goto err; } @@ -844,7 +842,6 @@ int i2d_PKCS12(const PKCS12 *p12, uint8_t **out) { if (*out == NULL) { *out = OPENSSL_malloc(p12->ber_len); if (*out == NULL) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); return -1; } OPENSSL_memcpy(*out, p12->ber_bytes, p12->ber_len); @@ -883,7 +880,6 @@ int PKCS12_parse(const PKCS12 *p12, const char *password, EVP_PKEY **out_pkey, if (!ca_certs) { ca_certs = sk_X509_new_null(); if (ca_certs == NULL) { - OPENSSL_PUT_ERROR(PKCS8, ERR_R_MALLOC_FAILURE); return 0; } ca_certs_alloced = 1; diff --git a/crypto/trust_token/pmbtoken.c b/crypto/trust_token/pmbtoken.c index 7a95a7d142..2e25cf52e9 100644 --- a/crypto/trust_token/pmbtoken.c +++ b/crypto/trust_token/pmbtoken.c @@ -332,7 +332,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( const EC_GROUP *group = method->group; STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = sk_TRUST_TOKEN_PRETOKEN_new_null(); if (pretokens == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -341,7 +340,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( TRUST_TOKEN_PRETOKEN *pretoken = OPENSSL_malloc(sizeof(TRUST_TOKEN_PRETOKEN)); if (pretoken == NULL || !sk_TRUST_TOKEN_PRETOKEN_push(pretokens, pretoken)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); TRUST_TOKEN_PRETOKEN_free(pretoken); goto err; } @@ -360,7 +358,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( // We sample |pretoken->r| in Montgomery form to simplify inverting. if (!ec_random_nonzero_scalar(group, &pretoken->r, kDefaultAdditionalData)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -395,7 +392,6 @@ static int scalar_to_cbb(CBB *out, const EC_GROUP *group, uint8_t *buf; size_t scalar_len = BN_num_bytes(&group->order); if (!CBB_add_space(out, &buf, scalar_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } ec_scalar_to_bytes(group, buf, &scalar_len, scalar); @@ -435,7 +431,6 @@ static int hash_c_dleq(const PMBTOKEN_METHOD *method, EC_SCALAR *out, !point_to_cbb(&cbb, method->group, K1) || !CBB_finish(&cbb, &buf, &len) || !method->hash_c(method->group, out, buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -473,7 +468,6 @@ static int hash_c_dleqor(const PMBTOKEN_METHOD *method, EC_SCALAR *out, !point_to_cbb(&cbb, method->group, K11) || !CBB_finish(&cbb, &buf, &len) || !method->hash_c(method->group, out, buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -505,7 +499,6 @@ static int hash_c_batch(const PMBTOKEN_METHOD *method, EC_SCALAR *out, !CBB_add_u16(&cbb, (uint16_t)index) || !CBB_finish(&cbb, &buf, &len) || !method->hash_c(method->group, out, buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -640,7 +633,6 @@ static int dleq_generate(const PMBTOKEN_METHOD *method, CBB *cbb, if (!scalar_to_cbb(cbb, group, &cs) || !scalar_to_cbb(cbb, group, &us) || !scalar_to_cbb(cbb, group, &vs)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } @@ -676,7 +668,6 @@ static int dleq_generate(const PMBTOKEN_METHOD *method, CBB *cbb, !scalar_to_cbb(cbb, group, &u1) || !scalar_to_cbb(cbb, group, &v0) || !scalar_to_cbb(cbb, group, &v1)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } @@ -835,7 +826,6 @@ static int pmbtoken_sign(const PMBTOKEN_METHOD *method, !point_to_cbb(&batch_cbb, method->group, &key->pubs) || !point_to_cbb(&batch_cbb, method->group, &key->pub0) || !point_to_cbb(&batch_cbb, method->group, &key->pub1)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -876,7 +866,6 @@ static int pmbtoken_sign(const PMBTOKEN_METHOD *method, !point_to_cbb(&batch_cbb, group, &affines[0]) || !point_to_cbb(&batch_cbb, group, &affines[1]) || !point_to_cbb(&batch_cbb, group, &affines[2])) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } Tps[i] = Tp; @@ -958,7 +947,6 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( int ok = 0; STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); if (ret == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return NULL; } @@ -983,7 +971,6 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( !point_to_cbb(&batch_cbb, method->group, &key->pubs) || !point_to_cbb(&batch_cbb, method->group, &key->pub0) || !point_to_cbb(&batch_cbb, method->group, &key->pub1)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -1014,7 +1001,6 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( !point_to_cbb(&batch_cbb, group, &Sp_affine) || !point_to_cbb(&batch_cbb, group, &Wp_affine) || !point_to_cbb(&batch_cbb, group, &Wsp_affine)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -1052,7 +1038,6 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( CBB_cleanup(&token_cbb); if (token == NULL || !sk_TRUST_TOKEN_push(ret, token)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); TRUST_TOKEN_free(token); goto err; } @@ -1202,7 +1187,6 @@ static int pmbtoken_exp1_hash_s(const EC_GROUP *group, EC_RAW_POINT *out, !CBB_finish(&cbb, &buf, &len) || !ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( group, out, kHashSLabel, sizeof(kHashSLabel), buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -1376,7 +1360,6 @@ static int pmbtoken_exp2_hash_s(const EC_GROUP *group, EC_RAW_POINT *out, !CBB_finish(&cbb, &buf, &len) || !ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( group, out, kHashSLabel, sizeof(kHashSLabel), buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/trust_token/trust_token.c b/crypto/trust_token/trust_token.c index 51b40ad1ca..7cccf1afc7 100644 --- a/crypto/trust_token/trust_token.c +++ b/crypto/trust_token/trust_token.c @@ -85,13 +85,11 @@ void TRUST_TOKEN_PRETOKEN_free(TRUST_TOKEN_PRETOKEN *pretoken) { TRUST_TOKEN *TRUST_TOKEN_new(const uint8_t *data, size_t len) { TRUST_TOKEN *ret = OPENSSL_malloc(sizeof(TRUST_TOKEN)); if (ret == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(TRUST_TOKEN)); ret->data = OPENSSL_memdup(data, len); if (len != 0 && ret->data == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); OPENSSL_free(ret); return NULL; } @@ -174,7 +172,6 @@ TRUST_TOKEN_CLIENT *TRUST_TOKEN_CLIENT_new(const TRUST_TOKEN_METHOD *method, TRUST_TOKEN_CLIENT *ret = OPENSSL_malloc(sizeof(TRUST_TOKEN_CLIENT)); if (ret == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(TRUST_TOKEN_CLIENT)); @@ -238,7 +235,6 @@ static int trust_token_client_begin_issuance_impl( STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = NULL; if (!CBB_init(&request, 0) || !CBB_add_u16(&request, count)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -249,7 +245,6 @@ static int trust_token_client_begin_issuance_impl( } if (!CBB_finish(&request, out, out_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -345,7 +340,6 @@ int TRUST_TOKEN_CLIENT_begin_redemption(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, !CBB_add_bytes(&inner, data, data_len) || (ctx->method->has_srr && !CBB_add_u64(&request, time)) || !CBB_finish(&request, out, out_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); CBB_cleanup(&request); return 0; } @@ -361,7 +355,6 @@ int TRUST_TOKEN_CLIENT_finish_redemption(TRUST_TOKEN_CLIENT *ctx, CBS_init(&in, response, response_len); if (!ctx->method->has_srr) { if (!CBS_stow(&in, out_rr, out_rr_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } @@ -398,7 +391,6 @@ int TRUST_TOKEN_CLIENT_finish_redemption(TRUST_TOKEN_CLIENT *ctx, size_t srr_len, sig_len; if (!CBS_stow(&srr, &srr_buf, &srr_len) || !CBS_stow(&sig, &sig_buf, &sig_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); OPENSSL_free(srr_buf); OPENSSL_free(sig_buf); return 0; @@ -421,7 +413,6 @@ TRUST_TOKEN_ISSUER *TRUST_TOKEN_ISSUER_new(const TRUST_TOKEN_METHOD *method, TRUST_TOKEN_ISSUER *ret = OPENSSL_malloc(sizeof(TRUST_TOKEN_ISSUER)); if (ret == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(ret, 0, sizeof(TRUST_TOKEN_ISSUER)); @@ -479,7 +470,6 @@ int TRUST_TOKEN_ISSUER_set_metadata_key(TRUST_TOKEN_ISSUER *ctx, ctx->metadata_key_len = 0; ctx->metadata_key = OPENSSL_memdup(key, len); if (ctx->metadata_key == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } ctx->metadata_key_len = len; @@ -531,7 +521,6 @@ int TRUST_TOKEN_ISSUER_issue(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, if (!CBB_init(&response, 0) || !CBB_add_u16(&response, num_to_issue) || !CBB_add_u32(&response, public_metadata)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -546,7 +535,6 @@ int TRUST_TOKEN_ISSUER_issue(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, } if (!CBB_finish(&response, out, out_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -601,13 +589,11 @@ static int trust_token_issuer_redeem_impl( uint8_t *client_data_buf = NULL; size_t client_data_len = 0; if (!CBS_stow(&client_data, &client_data_buf, &client_data_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } TRUST_TOKEN *token = TRUST_TOKEN_new(nonce, TRUST_TOKEN_NONCE_SIZE); if (token == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } *out_public = public_metadata; diff --git a/crypto/trust_token/voprf.c b/crypto/trust_token/voprf.c index da29c85641..adf02a78d4 100644 --- a/crypto/trust_token/voprf.c +++ b/crypto/trust_token/voprf.c @@ -91,7 +91,6 @@ static int scalar_to_cbb(CBB *out, const EC_GROUP *group, uint8_t *buf; size_t scalar_len = BN_num_bytes(&group->order); if (!CBB_add_space(out, &buf, scalar_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } ec_scalar_to_bytes(group, buf, &scalar_len, scalar); @@ -212,7 +211,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens = sk_TRUST_TOKEN_PRETOKEN_new_null(); if (pretokens == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -222,7 +220,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, OPENSSL_malloc(sizeof(TRUST_TOKEN_PRETOKEN)); if (pretoken == NULL || !sk_TRUST_TOKEN_PRETOKEN_push(pretokens, pretoken)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); TRUST_TOKEN_PRETOKEN_free(pretoken); goto err; } @@ -242,7 +239,6 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, EC_SCALAR r; if (!ec_random_nonzero_scalar(group, &r, kDefaultAdditionalData)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -292,7 +288,6 @@ static int hash_to_scalar_dleq(const VOPRF_METHOD *method, EC_SCALAR *out, !cbb_add_point(&cbb, method->group, K1) || !CBB_finish(&cbb, &buf, &len) || !method->hash_to_scalar(method->group, out, buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -324,7 +319,6 @@ static int hash_to_scalar_batch(const VOPRF_METHOD *method, EC_SCALAR *out, !CBB_add_u16(&cbb, (uint16_t)index) || !CBB_finish(&cbb, &buf, &len) || !method->hash_to_scalar(method->group, out, buf, len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -387,7 +381,6 @@ static int dleq_generate(const VOPRF_METHOD *method, CBB *cbb, // Store DLEQ proof in transcript. if (!scalar_to_cbb(cbb, group, &c) || !scalar_to_cbb(cbb, group, &u)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return 0; } @@ -488,7 +481,6 @@ static int voprf_sign(const VOPRF_METHOD *method, !es || !CBB_init(&batch_cbb, 0) || !cbb_add_point(&batch_cbb, method->group, &key->pubs)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -508,7 +500,6 @@ static int voprf_sign(const VOPRF_METHOD *method, if (!cbb_add_point(&batch_cbb, group, &BT_affine) || !cbb_add_point(&batch_cbb, group, &Z_affine)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } BTs[i] = BT; @@ -575,7 +566,6 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( int ok = 0; STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); if (ret == NULL) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); return NULL; } @@ -594,7 +584,6 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( !es || !CBB_init(&batch_cbb, 0) || !cbb_add_point(&batch_cbb, method->group, &key->pubs)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -613,7 +602,6 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( if (!cbb_add_point(&batch_cbb, group, &pretoken->Tp) || !cbb_add_point(&batch_cbb, group, &Z_affine)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -644,7 +632,6 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( CBB_cleanup(&token_cbb); if (token == NULL || !sk_TRUST_TOKEN_push(ret, token)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); TRUST_TOKEN_free(token); goto err; } diff --git a/crypto/x509/a_digest.c b/crypto/x509/a_digest.c index d7dcecc73c..4686993e77 100644 --- a/crypto/x509/a_digest.c +++ b/crypto/x509/a_digest.c @@ -68,7 +68,6 @@ int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, i = i2d(data, NULL); if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } p = str; diff --git a/crypto/x509/a_sign.c b/crypto/x509/a_sign.c index 3711a00490..de89fabd71 100644 --- a/crypto/x509/a_sign.c +++ b/crypto/x509/a_sign.c @@ -107,7 +107,6 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, buf_out = OPENSSL_malloc((unsigned int)outl); if ((buf_in == NULL) || (buf_out == NULL)) { outl = 0; - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509/a_verify.c b/crypto/x509/a_verify.c index af2c914557..a70769fd0b 100644 --- a/crypto/x509/a_verify.c +++ b/crypto/x509/a_verify.c @@ -98,7 +98,6 @@ int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *a, inl = ASN1_item_i2d(asn, &buf_in, it); if (buf_in == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c index 989deee1b6..937069e883 100644 --- a/crypto/x509/asn1_gen.c +++ b/crypto/x509/asn1_gen.c @@ -581,7 +581,6 @@ static int bitstr_cb(const char *elem, size_t len, void *bitstr) { return 0; } if (!ASN1_BIT_STRING_set_bit(bitstr, (int)bitnum, 1)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); return 0; } return 1; diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c index 3ad8128cdc..0283a0dba7 100644 --- a/crypto/x509/by_dir.c +++ b/crypto/x509/by_dir.c @@ -211,7 +211,6 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type) { if (ctx->dirs == NULL) { ctx->dirs = sk_BY_DIR_ENTRY_new_null(); if (!ctx->dirs) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } } @@ -300,7 +299,6 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, ent = sk_BY_DIR_ENTRY_value(ctx->dirs, i); j = strlen(ent->dir) + 1 + 8 + 6 + 1 + 1; if (!BUF_MEM_grow(b, j)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto finish; } if (type == X509_LU_CRL && ent->hashes) { diff --git a/crypto/x509/policy.c b/crypto/x509/policy.c index 393cb84c21..47ac2d8c50 100644 --- a/crypto/x509/policy.c +++ b/crypto/x509/policy.c @@ -109,7 +109,6 @@ static X509_POLICY_NODE *x509_policy_node_new(const ASN1_OBJECT *policy) { assert(!is_any_policy(policy)); X509_POLICY_NODE *node = OPENSSL_malloc(sizeof(X509_POLICY_NODE)); if (node == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(node, 0, sizeof(X509_POLICY_NODE)); @@ -137,13 +136,11 @@ static void x509_policy_level_free(X509_POLICY_LEVEL *level) { static X509_POLICY_LEVEL *x509_policy_level_new(void) { X509_POLICY_LEVEL *level = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL)); if (level == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memset(level, 0, sizeof(X509_POLICY_LEVEL)); level->nodes = sk_X509_POLICY_NODE_new(x509_policy_node_cmp); if (level->nodes == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); x509_policy_level_free(level); return NULL; } @@ -188,7 +185,6 @@ static int x509_policy_level_add_nodes(X509_POLICY_LEVEL *level, for (size_t i = 0; i < sk_X509_POLICY_NODE_num(nodes); i++) { X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(nodes, i); if (!sk_X509_POLICY_NODE_push(level->nodes, node)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } sk_X509_POLICY_NODE_set(nodes, i, NULL); @@ -287,7 +283,6 @@ static int process_certificate_policies(const X509 *x509, if (previous_level_has_any_policy) { new_nodes = sk_X509_POLICY_NODE_new_null(); if (new_nodes == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) { @@ -300,7 +295,6 @@ static int process_certificate_policies(const X509 *x509, if (node == NULL || // !sk_X509_POLICY_NODE_push(new_nodes, node)) { x509_policy_node_free(node); - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } } @@ -397,7 +391,6 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, // as part of RFC 5280, section 6.1.4, step (b.1). new_nodes = sk_X509_POLICY_NODE_new_null(); if (new_nodes == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } const ASN1_OBJECT *last_policy = NULL; @@ -442,7 +435,6 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, if (mappings == NULL) { mappings = sk_POLICY_MAPPING_new_null(); if (mappings == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } } @@ -471,7 +463,6 @@ static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, // Convert |mappings| to our "expected_policy_set" representation. next = x509_policy_level_new(); if (next == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } next->has_any_policy = level->has_any_policy; @@ -689,7 +680,6 @@ int X509_policy_check(const STACK_OF(X509) *certs, levels = sk_X509_POLICY_LEVEL_new_null(); if (levels == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } @@ -727,7 +717,6 @@ int X509_policy_check(const STACK_OF(X509) *certs, // Insert into the list. if (!sk_X509_POLICY_LEVEL_push(levels, level)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } X509_POLICY_LEVEL *current_level = level; diff --git a/crypto/x509/x509_att.c b/crypto/x509/x509_att.c index 4a4ee476d2..0dda757f55 100644 --- a/crypto/x509/x509_att.c +++ b/crypto/x509/x509_att.c @@ -125,7 +125,7 @@ STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, if (x == NULL) { OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); - goto err2; + goto err; } if (*x == NULL) { @@ -137,7 +137,7 @@ STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, } if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL) { - goto err2; + goto err; } if (!sk_X509_ATTRIBUTE_push(sk, new_attr)) { goto err; @@ -147,8 +147,6 @@ STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, } return sk; err: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); -err2: if (new_attr != NULL) { X509_ATTRIBUTE_free(new_attr); } @@ -226,7 +224,6 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, if ((attr == NULL) || (*attr == NULL)) { if ((ret = X509_ATTRIBUTE_new()) == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } } else { @@ -326,7 +323,6 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, } return 1; err: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); ASN1_TYPE_free(ttmp); ASN1_STRING_free(stmp); return 0; diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c index b640413cde..b696b9491e 100644 --- a/crypto/x509/x509_cmp.c +++ b/crypto/x509/x509_cmp.c @@ -286,7 +286,6 @@ int X509_check_private_key(X509 *x, const EVP_PKEY *k) { STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain) { STACK_OF(X509) *ret = sk_X509_dup(chain); if (ret == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_X509_num(ret); i++) { diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c index 7a2d3a2616..2ec8971bd4 100644 --- a/crypto/x509/x509_lu.c +++ b/crypto/x509/x509_lu.c @@ -320,7 +320,6 @@ static int x509_store_add(X509_STORE *ctx, void *x, int is_crl) { X509_OBJECT *const obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT)); if (obj == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/x509/x509_obj.c b/crypto/x509/x509_obj.c index 6caae4d62c..ed6dcc6636 100644 --- a/crypto/x509/x509_obj.c +++ b/crypto/x509/x509_obj.c @@ -119,7 +119,7 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { num = ne->value->length; if (num > NAME_ONELINE_MAX) { OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG); - goto end; + goto err; } q = ne->value->data; @@ -155,7 +155,7 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { l += 1 + l1 + 1 + l2; if (l > NAME_ONELINE_MAX) { OPENSSL_PUT_ERROR(X509, X509_R_NAME_TOO_LONG); - goto end; + goto err; } if (b != NULL) { if (!BUF_MEM_grow(b, l + 1)) { @@ -201,8 +201,6 @@ char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len) { } return p; err: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); -end: BUF_MEM_free(b); return NULL; } diff --git a/crypto/x509/x509_trs.c b/crypto/x509/x509_trs.c index 49c66c169a..1329a9f951 100644 --- a/crypto/x509/x509_trs.c +++ b/crypto/x509/x509_trs.c @@ -183,7 +183,6 @@ int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), // Need a new entry if (idx == -1) { if (!(trtmp = OPENSSL_malloc(sizeof(X509_TRUST)))) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } trtmp->flags = X509_TRUST_DYNAMIC; @@ -194,7 +193,6 @@ int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), // Duplicate the supplied name. name_dup = OPENSSL_strdup(name); if (name_dup == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); if (idx == -1) { OPENSSL_free(trtmp); } @@ -219,12 +217,10 @@ int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), // If its a new entry manage the dynamic table if (idx == -1) { if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); trtable_free(trtmp); return 0; } if (!sk_X509_TRUST_push(trtable, trtmp)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); trtable_free(trtmp); return 0; } diff --git a/crypto/x509/x509_v3.c b/crypto/x509/x509_v3.c index dd8435243b..0d4ecfa22b 100644 --- a/crypto/x509/x509_v3.c +++ b/crypto/x509/x509_v3.c @@ -182,7 +182,6 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, } return sk; err: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); err2: X509_EXTENSION_free(new_ex); if (free_sk) { @@ -213,7 +212,6 @@ X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, if ((ex == NULL) || (*ex == NULL)) { if ((ret = X509_EXTENSION_new()) == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } } else { diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index 92882921e5..7f3e232730 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -205,7 +205,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // the first entry is in place ctx->chain = sk_X509_new_null(); if (ctx->chain == NULL || !sk_X509_push(ctx->chain, ctx->cert)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); ctx->error = X509_V_ERR_OUT_OF_MEM; goto end; } @@ -214,7 +213,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // We use a temporary STACK so we can chop and hack at it. if (ctx->untrusted != NULL && (sktmp = sk_X509_dup(ctx->untrusted)) == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); ctx->error = X509_V_ERR_OUT_OF_MEM; goto end; } @@ -262,7 +260,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { xtmp = find_issuer(ctx, sktmp, x); if (xtmp != NULL) { if (!sk_X509_push(ctx->chain, xtmp)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); ctx->error = X509_V_ERR_OUT_OF_MEM; ok = 0; goto end; @@ -358,7 +355,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { x = xtmp; if (!sk_X509_push(ctx->chain, x)) { X509_free(xtmp); - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); ctx->error = X509_V_ERR_OUT_OF_MEM; ok = 0; goto end; @@ -1994,7 +1990,6 @@ X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, EVP_PKEY *skey, return crl; memerr: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); if (crl) { X509_CRL_free(crl); } @@ -2145,7 +2140,6 @@ X509_STORE_CTX *X509_STORE_CTX_new(void) { X509_STORE_CTX *ctx; ctx = (X509_STORE_CTX *)OPENSSL_malloc(sizeof(X509_STORE_CTX)); if (!ctx) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } X509_STORE_CTX_zero(ctx); @@ -2265,7 +2259,6 @@ int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, } OPENSSL_memset(ctx, 0, sizeof(X509_STORE_CTX)); - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c index fcfbc0c91c..cc86e289a6 100644 --- a/crypto/x509/x509name.c +++ b/crypto/x509/x509name.c @@ -263,7 +263,6 @@ int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, } new_name->set = set; if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } if (inc) { diff --git a/crypto/x509/x509spki.c b/crypto/x509/x509spki.c index 825153416e..8ff2053ae5 100644 --- a/crypto/x509/x509spki.c +++ b/crypto/x509/x509spki.c @@ -90,7 +90,6 @@ NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len) { return NULL; } if (!(spki_der = OPENSSL_malloc(spki_len))) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } if (!EVP_DecodeBase64(spki_der, &spki_len, spki_len, (const uint8_t *)str, @@ -119,13 +118,11 @@ char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) { } der_spki = OPENSSL_malloc(der_len); if (der_spki == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } b64_str = OPENSSL_malloc(b64_len); if (b64_str == NULL) { OPENSSL_free(der_spki); - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } p = der_spki; diff --git a/crypto/x509/x_crl.c b/crypto/x509/x_crl.c index 1480448e53..9c4c116c3d 100644 --- a/crypto/x509/x_crl.c +++ b/crypto/x509/x_crl.c @@ -372,7 +372,6 @@ int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev) { inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp); } if (!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return 0; } asn1_encoding_clear(&inf->enc); diff --git a/crypto/x509/x_info.c b/crypto/x509/x_info.c index e6f9be2c09..0f074f613c 100644 --- a/crypto/x509/x_info.c +++ b/crypto/x509/x_info.c @@ -66,7 +66,6 @@ X509_INFO *X509_INFO_new(void) { ret = (X509_INFO *)OPENSSL_malloc(sizeof(X509_INFO)); if (ret == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/x509/x_name.c b/crypto/x509/x_name.c index f017423b2c..a65c116d3b 100644 --- a/crypto/x509/x_name.c +++ b/crypto/x509/x_name.c @@ -152,7 +152,6 @@ static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it) { return 1; memerr: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); if (ret) { if (ret->entries) { sk_X509_NAME_ENTRY_free(ret->entries); @@ -279,23 +278,23 @@ static int x509_name_encode(X509_NAME *a) { STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = sk_STACK_OF_X509_NAME_ENTRY_new_null(); if (!intname) { - goto memerr; + goto err; } for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) { entry = sk_X509_NAME_ENTRY_value(a->entries, i); if (entry->set != set) { entries = sk_X509_NAME_ENTRY_new_null(); if (!entries) { - goto memerr; + goto err; } if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries)) { sk_X509_NAME_ENTRY_free(entries); - goto memerr; + goto err; } set = entry->set; } if (!sk_X509_NAME_ENTRY_push(entries, entry)) { - goto memerr; + goto err; } } ASN1_VALUE *intname_val = (ASN1_VALUE *)intname; @@ -305,7 +304,7 @@ static int x509_name_encode(X509_NAME *a) { goto err; } if (!BUF_MEM_grow(a->bytes, len)) { - goto memerr; + goto err; } p = (unsigned char *)a->bytes->data; if (ASN1_item_ex_i2d(&intname_val, &p, ASN1_ITEM_rptr(X509_NAME_INTERNAL), @@ -315,8 +314,6 @@ static int x509_name_encode(X509_NAME *a) { sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free); a->modified = 0; return 1; -memerr: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); err: sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname, local_sk_X509_NAME_ENTRY_free); return 0; diff --git a/crypto/x509/x_pkey.c b/crypto/x509/x_pkey.c index 52bc5b673d..d48ecd111f 100644 --- a/crypto/x509/x_pkey.c +++ b/crypto/x509/x_pkey.c @@ -69,7 +69,6 @@ X509_PKEY *X509_PKEY_new(void) { X509_PKEY *ret = OPENSSL_malloc(sizeof(X509_PKEY)); if (ret == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); goto err; } OPENSSL_memset(ret, 0, sizeof(X509_PKEY)); diff --git a/crypto/x509v3/v3_akey.c b/crypto/x509v3/v3_akey.c index b4093bf15c..2af596af0b 100644 --- a/crypto/x509v3/v3_akey.c +++ b/crypto/x509v3/v3_akey.c @@ -201,7 +201,6 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, if (isname) { if (!(gens = sk_GENERAL_NAME_new_null()) || !(gen = GENERAL_NAME_new()) || !sk_GENERAL_NAME_push(gens, gen)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } gen->type = GEN_DIRNAME; diff --git a/crypto/x509v3/v3_alt.c b/crypto/x509v3/v3_alt.c index f10c1ce2ec..858ef4d13b 100644 --- a/crypto/x509v3/v3_alt.c +++ b/crypto/x509v3/v3_alt.c @@ -275,7 +275,6 @@ static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); if (gens == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -326,7 +325,6 @@ static int copy_issuer(const X509V3_CTX *ctx, GENERAL_NAMES *gens) { for (size_t j = 0; j < sk_GENERAL_NAME_num(ialt); j++) { GENERAL_NAME *gen = sk_GENERAL_NAME_value(ialt, j); if (!sk_GENERAL_NAME_push(gens, gen)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } // Ownership of |gen| has moved from |ialt| to |gens|. @@ -345,7 +343,6 @@ static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); if (gens == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -407,14 +404,12 @@ static int copy_email(const X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { i--; } if (!email || !(gen = GENERAL_NAME_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } gen->d.ia5 = email; email = NULL; gen->type = GEN_EMAIL; if (!sk_GENERAL_NAME_push(gens, gen)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } gen = NULL; @@ -433,7 +428,6 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); if (gens == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -470,7 +464,6 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, } else { gen = GENERAL_NAME_new(); if (gen == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } } @@ -482,7 +475,6 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, ASN1_IA5STRING *str = ASN1_IA5STRING_new(); if (str == NULL || !ASN1_STRING_set(str, value, strlen(value))) { ASN1_STRING_free(str); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } gen->type = gen_type; diff --git a/crypto/x509v3/v3_bcons.c b/crypto/x509v3/v3_bcons.c index c558c78e64..e614b8ec69 100644 --- a/crypto/x509v3/v3_bcons.c +++ b/crypto/x509v3/v3_bcons.c @@ -110,7 +110,6 @@ static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *values) { BASIC_CONSTRAINTS *bcons = NULL; if (!(bcons = BASIC_CONSTRAINTS_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { diff --git a/crypto/x509v3/v3_bitst.c b/crypto/x509v3/v3_bitst.c index d87dcf995d..1201738b55 100644 --- a/crypto/x509v3/v3_bitst.c +++ b/crypto/x509v3/v3_bitst.c @@ -105,7 +105,6 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { ASN1_BIT_STRING *bs; if (!(bs = ASN1_BIT_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { @@ -114,7 +113,6 @@ static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, for (bnam = method->usr_data; bnam->lname; bnam++) { if (!strcmp(bnam->sname, val->name) || !strcmp(bnam->lname, val->name)) { if (!ASN1_BIT_STRING_set_bit(bs, bnam->bitnum, 1)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); ASN1_BIT_STRING_free(bs); return NULL; } diff --git a/crypto/x509v3/v3_conf.c b/crypto/x509v3/v3_conf.c index a4f172d3f9..ebf33f182c 100644 --- a/crypto/x509v3/v3_conf.c +++ b/crypto/x509v3/v3_conf.c @@ -236,7 +236,6 @@ static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid, return ext; merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } @@ -314,7 +313,6 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, } if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509v3/v3_cpols.c b/crypto/x509v3/v3_cpols.c index 84d458c65a..e66e260b00 100644 --- a/crypto/x509v3/v3_cpols.c +++ b/crypto/x509v3/v3_cpols.c @@ -153,7 +153,6 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *value) { STACK_OF(POLICYINFO) *pols = sk_POLICYINFO_new_null(); if (pols == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } STACK_OF(CONF_VALUE) *vals = X509V3_parse_list(value); @@ -195,7 +194,6 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } pol = POLICYINFO_new(); if (pol == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); ASN1_OBJECT_free(pobj); goto err; } @@ -203,7 +201,6 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (!sk_POLICYINFO_push(pols, pol)) { POLICYINFO_free(pol); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } } @@ -221,7 +218,7 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, POLICYINFO *pol; POLICYQUALINFO *qual; if (!(pol = POLICYINFO_new())) { - goto merr; + goto err; } for (size_t i = 0; i < sk_CONF_VALUE_num(polstrs); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(polstrs, i); @@ -239,10 +236,10 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, pol->qualifiers = sk_POLICYQUALINFO_new_null(); } if (!(qual = POLICYQUALINFO_new())) { - goto merr; + goto err; } if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual)) { - goto merr; + goto err; } qual->pqualid = OBJ_nid2obj(NID_id_qt_cps); if (qual->pqualid == NULL) { @@ -254,7 +251,7 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, goto err; } if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value, strlen(cnf->value))) { - goto merr; + goto err; } } else if (x509v3_conf_name_matches(cnf->name, "userNotice")) { if (*cnf->value != '@') { @@ -277,7 +274,7 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, pol->qualifiers = sk_POLICYQUALINFO_new_null(); } if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual)) { - goto merr; + goto err; } } else { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OPTION); @@ -293,9 +290,6 @@ static POLICYINFO *policy_section(const X509V3_CTX *ctx, return pol; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - err: POLICYINFO_free(pol); return NULL; @@ -307,7 +301,7 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, USERNOTICE *notice; POLICYQUALINFO *qual; if (!(qual = POLICYQUALINFO_new())) { - goto merr; + goto err; } qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice); if (qual->pqualid == NULL) { @@ -315,7 +309,7 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, goto err; } if (!(notice = USERNOTICE_new())) { - goto merr; + goto err; } qual->d.usernotice = notice; for (size_t i = 0; i < sk_CONF_VALUE_num(unot); i++) { @@ -323,16 +317,16 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, if (!strcmp(cnf->name, "explicitText")) { notice->exptext = ASN1_VISIBLESTRING_new(); if (notice->exptext == NULL) { - goto merr; + goto err; } if (!ASN1_STRING_set(notice->exptext, cnf->value, strlen(cnf->value))) { - goto merr; + goto err; } } else if (!strcmp(cnf->name, "organization")) { NOTICEREF *nref; if (!notice->noticeref) { if (!(nref = NOTICEREF_new())) { - goto merr; + goto err; } notice->noticeref = nref; } else { @@ -345,14 +339,14 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, } if (!ASN1_STRING_set(nref->organization, cnf->value, strlen(cnf->value))) { - goto merr; + goto err; } } else if (!strcmp(cnf->name, "noticeNumbers")) { NOTICEREF *nref; STACK_OF(CONF_VALUE) *nos; if (!notice->noticeref) { if (!(nref = NOTICEREF_new())) { - goto merr; + goto err; } notice->noticeref = nref; } else { @@ -384,9 +378,6 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, return qual; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - err: POLICYQUALINFO_free(qual); return NULL; @@ -403,7 +394,6 @@ static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, } if (!sk_ASN1_INTEGER_push(nnums, aint)) { ASN1_INTEGER_free(aint); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return 0; } } diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index a3cae42697..4162c3538f 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -319,7 +319,7 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, GENERAL_NAMES *gens = NULL; GENERAL_NAME *gen = NULL; if (!(crld = sk_DIST_POINT_new_null())) { - goto merr; + goto err; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { DIST_POINT *point; @@ -335,28 +335,28 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (!sk_DIST_POINT_push(crld, point)) { DIST_POINT_free(point); - goto merr; + goto err; } } else { if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) { goto err; } if (!(gens = GENERAL_NAMES_new())) { - goto merr; + goto err; } if (!sk_GENERAL_NAME_push(gens, gen)) { - goto merr; + goto err; } gen = NULL; if (!(point = DIST_POINT_new())) { - goto merr; + goto err; } if (!sk_DIST_POINT_push(crld, point)) { DIST_POINT_free(point); - goto merr; + goto err; } if (!(point->distpoint = DIST_POINT_NAME_new())) { - goto merr; + goto err; } point->distpoint->name.fullname = gens; point->distpoint->type = 0; @@ -365,8 +365,6 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } return crld; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); err: GENERAL_NAME_free(gen); GENERAL_NAMES_free(gens); @@ -449,7 +447,7 @@ static void *v2i_idp(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const STACK_OF(CONF_VALUE) *nval) { ISSUING_DIST_POINT *idp = ISSUING_DIST_POINT_new(); if (!idp) { - goto merr; + goto err; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); @@ -490,8 +488,6 @@ static void *v2i_idp(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } return idp; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); err: ISSUING_DIST_POINT_free(idp); return NULL; diff --git a/crypto/x509v3/v3_extku.c b/crypto/x509v3/v3_extku.c index 46f40a78dc..d678ac781d 100644 --- a/crypto/x509v3/v3_extku.c +++ b/crypto/x509v3/v3_extku.c @@ -129,7 +129,6 @@ static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { EXTENDED_KEY_USAGE *extku = sk_ASN1_OBJECT_new_null(); if (extku == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/x509v3/v3_ia5.c b/crypto/x509v3/v3_ia5.c index 8104e7befd..e0f9e6bfda 100644 --- a/crypto/x509v3/v3_ia5.c +++ b/crypto/x509v3/v3_ia5.c @@ -76,7 +76,6 @@ static char *i2s_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, void *ext) { return NULL; } if (!(tmp = OPENSSL_malloc(ia5->length + 1))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } OPENSSL_memcpy(tmp, ia5->data, ia5->length); @@ -100,7 +99,6 @@ static void *s2i_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, } return ia5; err: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/crypto/x509v3/v3_info.c b/crypto/x509v3/v3_info.c index e6b3cc5931..2ac92213f5 100644 --- a/crypto/x509v3/v3_info.c +++ b/crypto/x509v3/v3_info.c @@ -157,7 +157,6 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( return tret; err: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); if (ret == NULL && tret != NULL) { sk_CONF_VALUE_pop_free(tret, X509V3_conf_free); } @@ -171,14 +170,12 @@ static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, ACCESS_DESCRIPTION *acc; char *objtmp, *ptmp; if (!(ainfo = sk_ACCESS_DESCRIPTION_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); if (!(acc = ACCESS_DESCRIPTION_new()) || !sk_ACCESS_DESCRIPTION_push(ainfo, acc)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } ptmp = strchr(cnf->name, ';'); @@ -194,7 +191,6 @@ static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, goto err; } if (!(objtmp = OPENSSL_malloc(objlen + 1))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } OPENSSL_strlcpy(objtmp, cnf->name, objlen + 1); diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c index 51d15bb6ac..d006a5ee8b 100644 --- a/crypto/x509v3/v3_lib.c +++ b/crypto/x509v3/v3_lib.c @@ -79,12 +79,10 @@ static int ext_stack_cmp(const X509V3_EXT_METHOD **a, int X509V3_EXT_add(X509V3_EXT_METHOD *ext) { if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_stack_cmp))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); ext_list_free(ext); return 0; } if (!sk_X509V3_EXT_METHOD_push(ext_list, ext)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); ext_list_free(ext); return 0; } @@ -168,7 +166,6 @@ int X509V3_EXT_add_alias(int nid_to, int nid_from) { } if (!(tmpext = (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METHOD)))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return 0; } *tmpext = *ext; diff --git a/crypto/x509v3/v3_ncons.c b/crypto/x509v3/v3_ncons.c index 1b3b9f8a15..ac9559f5c6 100644 --- a/crypto/x509v3/v3_ncons.c +++ b/crypto/x509v3/v3_ncons.c @@ -127,7 +127,7 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, GENERAL_SUBTREE *sub = NULL; ncons = NAME_CONSTRAINTS_new(); if (!ncons) { - goto memerr; + goto err; } for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); @@ -151,15 +151,13 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, *ptree = sk_GENERAL_SUBTREE_new_null(); } if (!*ptree || !sk_GENERAL_SUBTREE_push(*ptree, sub)) { - goto memerr; + goto err; } sub = NULL; } return ncons; -memerr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); err: NAME_CONSTRAINTS_free(ncons); GENERAL_SUBTREE_free(sub); diff --git a/crypto/x509v3/v3_pci.c b/crypto/x509v3/v3_pci.c index e680b5b367..f6b380248d 100644 --- a/crypto/x509v3/v3_pci.c +++ b/crypto/x509v3/v3_pci.c @@ -122,7 +122,6 @@ static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language, if (!*policy) { *policy = ASN1_OCTET_STRING_new(); if (!*policy) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); X509V3_conf_err(val); return 0; } @@ -150,7 +149,6 @@ static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language, // too! (*policy)->data = NULL; (*policy)->length = 0; - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); X509V3_conf_err(val); goto err; } @@ -170,7 +168,6 @@ static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language, // too! (*policy)->data = NULL; (*policy)->length = 0; - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); X509V3_conf_err(val); goto err; } @@ -180,7 +177,6 @@ static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language, goto err; } if (!tmp_data) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); X509V3_conf_err(val); goto err; } @@ -246,7 +242,6 @@ static void *r2i_pci(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, pci = PROXY_CERT_INFO_EXTENSION_new(); if (!pci) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509v3/v3_pcons.c b/crypto/x509v3/v3_pcons.c index 4cb554157a..7b70a4e431 100644 --- a/crypto/x509v3/v3_pcons.c +++ b/crypto/x509v3/v3_pcons.c @@ -112,7 +112,6 @@ static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *values) { POLICY_CONSTRAINTS *pcons = NULL; if (!(pcons = POLICY_CONSTRAINTS_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { diff --git a/crypto/x509v3/v3_pmaps.c b/crypto/x509v3/v3_pmaps.c index dae4b66640..cd8efd6d2d 100644 --- a/crypto/x509v3/v3_pmaps.c +++ b/crypto/x509v3/v3_pmaps.c @@ -117,7 +117,6 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { POLICY_MAPPINGS *pmaps = sk_POLICY_MAPPING_new_null(); if (pmaps == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } @@ -132,7 +131,6 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, POLICY_MAPPING *pmap = POLICY_MAPPING_new(); if (pmap == NULL || !sk_POLICY_MAPPING_push(pmaps, pmap)) { POLICY_MAPPING_free(pmap); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c index 44151328ae..9f22f1acec 100644 --- a/crypto/x509v3/v3_purp.c +++ b/crypto/x509v3/v3_purp.c @@ -224,7 +224,6 @@ int X509_PURPOSE_add(int id, int trust, int flags, // Need a new entry if (idx == -1) { if (!(ptmp = OPENSSL_malloc(sizeof(X509_PURPOSE)))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return 0; } ptmp->flags = X509_PURPOSE_DYNAMIC; @@ -236,7 +235,6 @@ int X509_PURPOSE_add(int id, int trust, int flags, name_dup = OPENSSL_strdup(name); sname_dup = OPENSSL_strdup(sname); if (name_dup == NULL || sname_dup == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); if (name_dup != NULL) { OPENSSL_free(name_dup); } @@ -270,12 +268,10 @@ int X509_PURPOSE_add(int id, int trust, int flags, // If its a new entry manage the dynamic table if (idx == -1) { if (!xptable && !(xptable = sk_X509_PURPOSE_new(xp_cmp))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); xptable_free(ptmp); return 0; } if (!sk_X509_PURPOSE_push(xptable, ptmp)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); xptable_free(ptmp); return 0; } diff --git a/crypto/x509v3/v3_skey.c b/crypto/x509v3/v3_skey.c index eac7c1d05b..cae776f688 100644 --- a/crypto/x509v3/v3_skey.c +++ b/crypto/x509v3/v3_skey.c @@ -78,7 +78,6 @@ ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, long length; if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } @@ -109,7 +108,6 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } @@ -138,7 +136,6 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, } if (!ASN1_OCTET_STRING_set(oct, pkey_dig, diglen)) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index 7e1ce517ef..9281e305f8 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -96,7 +96,7 @@ static int x509V3_add_len_value(const char *name, const char *value, char *tname = NULL, *tvalue = NULL; int extlist_was_null = *extlist == NULL; if (name && !(tname = OPENSSL_strdup(name))) { - goto malloc_err; + goto err; } if (!omit_value) { // |CONF_VALUE| cannot represent strings with NULs. @@ -106,24 +106,22 @@ static int x509V3_add_len_value(const char *name, const char *value, } tvalue = OPENSSL_strndup(value, value_len); if (tvalue == NULL) { - goto malloc_err; + goto err; } } if (!(vtmp = CONF_VALUE_new())) { - goto malloc_err; + goto err; } if (!*extlist && !(*extlist = sk_CONF_VALUE_new_null())) { - goto malloc_err; + goto err; } vtmp->section = NULL; vtmp->name = tname; vtmp->value = tvalue; if (!sk_CONF_VALUE_push(*extlist, vtmp)) { - goto malloc_err; + goto err; } return 1; -malloc_err: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); err: if (extlist_was_null) { sk_CONF_VALUE_free(*extlist); @@ -186,7 +184,6 @@ static char *bignum_to_string(const BIGNUM *bn) { len = strlen(tmp) + 3; ret = OPENSSL_malloc(len); if (ret == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); OPENSSL_free(tmp); return NULL; } @@ -212,7 +209,6 @@ char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *method, } if (!(bntmp = ASN1_ENUMERATED_to_BN(a, NULL)) || !(strtmp = bignum_to_string(bntmp))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); } BN_free(bntmp); return strtmp; @@ -226,7 +222,6 @@ char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *method, const ASN1_INTEGER *a) { } if (!(bntmp = ASN1_INTEGER_to_BN(a, NULL)) || !(strtmp = bignum_to_string(bntmp))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); } BN_free(bntmp); return strtmp; @@ -366,7 +361,6 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line) { // We are going to modify the line so copy it first linebuf = OPENSSL_strdup(line); if (linebuf == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } state = HDR_NAME; @@ -496,7 +490,6 @@ char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) { return (char *)ret; err: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); CBB_cleanup(&cbb); return NULL; } @@ -540,7 +533,6 @@ unsigned char *x509v3_hex_to_bytes(const char *str, long *len) { err: OPENSSL_free(hexbuf); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; badhex: diff --git a/include/openssl/mem.h b/include/openssl/mem.h index dca7d465be..8da1dd67ed 100644 --- a/include/openssl/mem.h +++ b/include/openssl/mem.h @@ -84,7 +84,8 @@ OPENSSL_EXPORT void *OPENSSL_malloc(size_t size); #endif // !_BORINGSSL_PROHIBIT_OPENSSL_MALLOC // OPENSSL_free does nothing if |ptr| is NULL. Otherwise it zeros out the -// memory allocated at |ptr| and frees it. +// memory allocated at |ptr| and frees it along with the private data. +// It must only be used on on |ptr| values obtained from |OPENSSL_malloc| OPENSSL_EXPORT void OPENSSL_free(void *ptr); #ifndef _BORINGSSL_PROHIBIT_OPENSSL_MALLOC diff --git a/ssl/d1_both.cc b/ssl/d1_both.cc index 9a1567d458..55c92fad8a 100644 --- a/ssl/d1_both.cc +++ b/ssl/d1_both.cc @@ -163,7 +163,6 @@ static UniquePtr dtls1_hm_fragment_new( frag->data = (uint8_t *)OPENSSL_malloc(DTLS1_HM_HEADER_LENGTH + msg_hdr->msg_len); if (frag->data == NULL) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } @@ -174,7 +173,6 @@ static UniquePtr dtls1_hm_fragment_new( !CBB_add_u24(cbb.get(), 0 /* frag_off */) || !CBB_add_u24(cbb.get(), msg_hdr->msg_len) || !CBB_finish(cbb.get(), NULL, NULL)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } @@ -188,7 +186,6 @@ static UniquePtr dtls1_hm_fragment_new( size_t bitmask_len = (msg_hdr->msg_len + 7) / 8; frag->reassembly = (uint8_t *)OPENSSL_malloc(bitmask_len); if (frag->reassembly == NULL) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } OPENSSL_memset(frag->reassembly, 0, bitmask_len); diff --git a/ssl/encrypted_client_hello.cc b/ssl/encrypted_client_hello.cc index e5b04005d2..8d35f18b40 100644 --- a/ssl/encrypted_client_hello.cc +++ b/ssl/encrypted_client_hello.cc @@ -571,7 +571,6 @@ bool ECHServerConfig::SetupContext(EVP_HPKE_CTX *ctx, uint16_t kdf_id, sizeof(kInfoLabel) /* includes trailing NUL */) || !CBB_add_bytes(info_cbb.get(), ech_config_.raw.data(), ech_config_.raw.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -668,7 +667,6 @@ bool ssl_select_ech_config(SSL_HANDSHAKE *hs, Span out_enc, !CBB_add_bytes(info.get(), kInfoLabel, sizeof(kInfoLabel)) || !CBB_add_bytes(info.get(), ech_config.raw.data(), ech_config.raw.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -1036,7 +1034,6 @@ int SSL_ECH_KEYS_add(SSL_ECH_KEYS *configs, int is_retry_config, return 0; } if (!configs->configs.Push(std::move(parsed_config))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } return 1; @@ -1059,14 +1056,12 @@ int SSL_ECH_KEYS_marshal_retry_configs(const SSL_ECH_KEYS *keys, uint8_t **out, CBB child; if (!CBB_init(cbb.get(), 128) || !CBB_add_u16_length_prefixed(cbb.get(), &child)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } for (const auto &config : keys->configs) { if (config->is_retry_config() && !CBB_add_bytes(&child, config->ech_config().raw.data(), config->ech_config().raw.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } } diff --git a/ssl/extensions.cc b/ssl/extensions.cc index 7ac82127b7..0c54c93445 100644 --- a/ssl/extensions.cc +++ b/ssl/extensions.cc @@ -3944,7 +3944,6 @@ static enum ssl_ticket_aead_result_t ssl_decrypt_ticket_with_method( Span ticket) { Array plaintext; if (!plaintext.Init(ticket.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return ssl_ticket_aead_error; } diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc index b9b3f27827..601aec1cb3 100644 --- a/ssl/handshake_client.cc +++ b/ssl/handshake_client.cc @@ -1098,7 +1098,6 @@ static enum ssl_hs_wait_t do_read_server_key_exchange(SSL_HANDSHAKE *hs) { char *raw = nullptr; if (CBS_len(&psk_identity_hint) != 0 && !CBS_strdup(&psk_identity_hint, &raw)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } @@ -1423,7 +1422,6 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { hs->new_session->psk_identity.reset(OPENSSL_strdup(identity)); if (hs->new_session->psk_identity == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return ssl_hs_error; } @@ -1511,7 +1509,6 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { !CBB_add_u16_length_prefixed(pms_cbb.get(), &child) || !CBB_add_bytes(&child, psk, psk_len) || !CBBFinishArray(pms_cbb.get(), &pms)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return ssl_hs_error; } } diff --git a/ssl/handshake_server.cc b/ssl/handshake_server.cc index fa6e9d6e5c..70fe9839e3 100644 --- a/ssl/handshake_server.cc +++ b/ssl/handshake_server.cc @@ -272,7 +272,6 @@ static UniquePtr ssl_parse_client_cipher_list( UniquePtr sk(sk_SSL_CIPHER_new_null()); if (!sk) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } @@ -286,7 +285,6 @@ static UniquePtr ssl_parse_client_cipher_list( const SSL_CIPHER *c = SSL_get_cipher_by_value(cipher_suite); if (c != NULL && !sk_SSL_CIPHER_push(sk.get(), c)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } @@ -1407,7 +1405,6 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { } char *raw = nullptr; if (!CBS_strdup(&psk_identity, &raw)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } @@ -1560,7 +1557,6 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { !CBB_add_u16_length_prefixed(new_premaster.get(), &child) || !CBB_add_bytes(&child, psk, psk_len) || !CBBFinishArray(new_premaster.get(), &premaster_secret)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return ssl_hs_error; } } diff --git a/ssl/internal.h b/ssl/internal.h index 74e7208fb2..b83d29944b 100644 --- a/ssl/internal.h +++ b/ssl/internal.h @@ -195,7 +195,6 @@ template T *New(Args &&... args) { void *t = OPENSSL_malloc(sizeof(T)); if (t == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } return new (t) T(std::forward(args)...); @@ -315,7 +314,6 @@ class Array { } data_ = reinterpret_cast(OPENSSL_malloc(new_size * sizeof(T))); if (data_ == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } size_ = new_size; diff --git a/ssl/s3_both.cc b/ssl/s3_both.cc index 4beb32276c..eb9da0da79 100644 --- a/ssl/s3_both.cc +++ b/ssl/s3_both.cc @@ -439,7 +439,6 @@ static ssl_open_record_t read_v2_client_hello(SSL *ssl, size_t *out_consumed, // No session id. !CBB_add_u8(&hello_body, 0) || !CBB_add_u16_length_prefixed(&hello_body, &cipher_suites)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return ssl_open_record_error; } diff --git a/ssl/ssl_aead_ctx.cc b/ssl/ssl_aead_ctx.cc index 27f0084fbd..25569221bc 100644 --- a/ssl/ssl_aead_ctx.cc +++ b/ssl/ssl_aead_ctx.cc @@ -91,7 +91,6 @@ UniquePtr SSLAEADContext::Create( UniquePtr aead_ctx = MakeUnique(version, is_dtls, cipher); if (!aead_ctx) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } diff --git a/ssl/ssl_asn1.cc b/ssl/ssl_asn1.cc index c25dbd8070..7c702fd5a6 100644 --- a/ssl/ssl_asn1.cc +++ b/ssl/ssl_asn1.cc @@ -223,7 +223,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1_uint64(&child, in->time) || !CBB_add_asn1(&session, &child, kTimeoutTag) || !CBB_add_asn1_uint64(&child, in->timeout)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } @@ -234,7 +233,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kPeerTag) || !CBB_add_bytes(&child, CRYPTO_BUFFER_data(buffer), CRYPTO_BUFFER_len(buffer))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -243,14 +241,12 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, // historically always encoded the sid_ctx. if (!CBB_add_asn1(&session, &child, kSessionIDContextTag) || !CBB_add_asn1_octet_string(&child, in->sid_ctx, in->sid_ctx_length)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } if (in->verify_result != X509_V_OK) { if (!CBB_add_asn1(&session, &child, kVerifyResultTag) || !CBB_add_asn1_uint64(&child, in->verify_result)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -260,7 +256,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1_octet_string(&child, (const uint8_t *)in->psk_identity.get(), strlen(in->psk_identity.get()))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -268,7 +263,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (in->ticket_lifetime_hint > 0) { if (!CBB_add_asn1(&session, &child, kTicketLifetimeHintTag) || !CBB_add_asn1_uint64(&child, in->ticket_lifetime_hint)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -277,7 +271,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kTicketTag) || !CBB_add_asn1_octet_string(&child, in->ticket.data(), in->ticket.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -286,7 +279,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kPeerSHA256Tag) || !CBB_add_asn1_octet_string(&child, in->peer_sha256, sizeof(in->peer_sha256))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -295,7 +287,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kOriginalHandshakeHashTag) || !CBB_add_asn1_octet_string(&child, in->original_handshake_hash, in->original_handshake_hash_len)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -305,7 +296,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1_octet_string( &child, CRYPTO_BUFFER_data(in->signed_cert_timestamp_list.get()), CRYPTO_BUFFER_len(in->signed_cert_timestamp_list.get()))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -315,7 +305,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1_octet_string( &child, CRYPTO_BUFFER_data(in->ocsp_response.get()), CRYPTO_BUFFER_len(in->ocsp_response.get()))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -323,7 +312,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (in->extended_master_secret) { if (!CBB_add_asn1(&session, &child, kExtendedMasterSecretTag) || !CBB_add_asn1_bool(&child, true)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -331,7 +319,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (in->group_id > 0 && (!CBB_add_asn1(&session, &child, kGroupIDTag) || !CBB_add_asn1_uint64(&child, in->group_id))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } @@ -341,14 +328,12 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !in->peer_sha256_valid && sk_CRYPTO_BUFFER_num(in->certs.get()) >= 2) { if (!CBB_add_asn1(&session, &child, kCertChainTag)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(in->certs.get()); i++) { const CRYPTO_BUFFER *buffer = sk_CRYPTO_BUFFER_value(in->certs.get(), i); if (!CBB_add_bytes(&child, CRYPTO_BUFFER_data(buffer), CRYPTO_BUFFER_len(buffer))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -358,7 +343,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kTicketAgeAddTag) || !CBB_add_asn1(&child, &child2, CBS_ASN1_OCTETSTRING) || !CBB_add_u32(&child2, in->ticket_age_add)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -366,7 +350,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!in->is_server) { if (!CBB_add_asn1(&session, &child, kIsServerTag) || !CBB_add_asn1_bool(&child, false)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -374,21 +357,18 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (in->peer_signature_algorithm != 0 && (!CBB_add_asn1(&session, &child, kPeerSignatureAlgorithmTag) || !CBB_add_asn1_uint64(&child, in->peer_signature_algorithm))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } if (in->ticket_max_early_data != 0 && (!CBB_add_asn1(&session, &child, kTicketMaxEarlyDataTag) || !CBB_add_asn1_uint64(&child, in->ticket_max_early_data))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } if (in->timeout != in->auth_timeout && (!CBB_add_asn1(&session, &child, kAuthTimeoutTag) || !CBB_add_asn1_uint64(&child, in->auth_timeout))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } @@ -396,7 +376,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kEarlyALPNTag) || !CBB_add_asn1_octet_string(&child, in->early_alpn.data(), in->early_alpn.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -404,7 +383,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (in->is_quic) { if (!CBB_add_asn1(&session, &child, kIsQuicTag) || !CBB_add_asn1_bool(&child, true)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -413,7 +391,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, if (!CBB_add_asn1(&session, &child, kQuicEarlyDataContextTag) || !CBB_add_asn1_octet_string(&child, in->quic_early_data_context.data(), in->quic_early_data_context.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -426,7 +403,6 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, !CBB_add_asn1(&session, &child, kPeerALPSTag) || !CBB_add_asn1_octet_string(&child, in->peer_application_settings.data(), in->peer_application_settings.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } } @@ -453,7 +429,6 @@ static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, } char *raw = nullptr; if (!CBS_strdup(&value, &raw)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } out->reset(raw); @@ -493,7 +468,6 @@ static int SSL_SESSION_parse_crypto_buffer(CBS *cbs, } out->reset(CRYPTO_BUFFER_new_from_CBS(&value, pool)); if (*out == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } return 1; @@ -712,7 +686,6 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, if (has_peer || has_cert_chain) { ret->certs.reset(sk_CRYPTO_BUFFER_new_null()); if (ret->certs == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } @@ -720,7 +693,6 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, UniquePtr buffer(CRYPTO_BUFFER_new_from_CBS(&peer, pool)); if (!buffer || !PushToStack(ret->certs.get(), std::move(buffer))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } @@ -736,7 +708,6 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, UniquePtr buffer(CRYPTO_BUFFER_new_from_CBS(&cert, pool)); if (buffer == nullptr || !PushToStack(ret->certs.get(), std::move(buffer))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } diff --git a/ssl/ssl_cert.cc b/ssl/ssl_cert.cc index b6f1e61084..ec77381985 100644 --- a/ssl/ssl_cert.cc +++ b/ssl/ssl_cert.cc @@ -365,7 +365,6 @@ bool ssl_parse_cert_chain(uint8_t *out_alert, UniquePtr chain(sk_CRYPTO_BUFFER_new_null()); if (!chain) { *out_alert = SSL_AD_INTERNAL_ERROR; - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -397,7 +396,6 @@ bool ssl_parse_cert_chain(uint8_t *out_alert, if (!buf || !PushToStack(chain.get(), std::move(buf))) { *out_alert = SSL_AD_INTERNAL_ERROR; - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } } @@ -623,7 +621,6 @@ UniquePtr ssl_parse_client_CA_list(SSL *ssl, UniquePtr ret(sk_CRYPTO_BUFFER_new_null()); if (!ret) { *out_alert = SSL_AD_INTERNAL_ERROR; - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } @@ -647,7 +644,6 @@ UniquePtr ssl_parse_client_CA_list(SSL *ssl, if (!buffer || !PushToStack(ret.get(), std::move(buffer))) { *out_alert = SSL_AD_INTERNAL_ERROR; - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index 7c3e7ef8d6..c6e87a6f37 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -162,7 +162,6 @@ class X25519KeyShare : public SSLKeyShare { Array secret; if (!secret.Init(32)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -227,7 +226,6 @@ class CECPQ2KeyShare : public SSLKeyShare { uint8_t *out_alert, Span peer_key) override { Array secret; if (!secret.Init(32 + HRSS_KEY_BYTES)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -265,7 +263,6 @@ class CECPQ2KeyShare : public SSLKeyShare { Array secret; if (!secret.Init(32 + HRSS_KEY_BYTES)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } diff --git a/ssl/ssl_lib.cc b/ssl/ssl_lib.cc index 0f0f5b1c32..86e8eb33e2 100644 --- a/ssl/ssl_lib.cc +++ b/ssl/ssl_lib.cc @@ -2148,7 +2148,6 @@ int SSL_set_tlsext_host_name(SSL *ssl, const char *name) { } ssl->hostname.reset(OPENSSL_strdup(name)); if (ssl->hostname == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } return 1; diff --git a/ssl/ssl_session.cc b/ssl/ssl_session.cc index 885e27d365..5b61ebad40 100644 --- a/ssl/ssl_session.cc +++ b/ssl/ssl_session.cc @@ -221,7 +221,6 @@ UniquePtr SSL_SESSION_dup(SSL_SESSION *session, int dup_flags) { new_session->certs.reset(sk_CRYPTO_BUFFER_deep_copy( session->certs.get(), buf_up_ref, CRYPTO_BUFFER_free)); if (new_session->certs == nullptr) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return nullptr; } } diff --git a/ssl/ssl_x509.cc b/ssl/ssl_x509.cc index c89d4edb5d..e4b3775b31 100644 --- a/ssl/ssl_x509.cc +++ b/ssl/ssl_x509.cc @@ -284,7 +284,6 @@ static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) { if (sk_CRYPTO_BUFFER_num(sess->certs.get()) > 0) { chain.reset(sk_X509_new_null()); if (!chain) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } if (sess->is_server) { @@ -292,7 +291,6 @@ static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) { // |SSL_get_peer_cert_chain|. chain_without_leaf.reset(sk_X509_new_null()); if (!chain_without_leaf) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } } @@ -309,11 +307,9 @@ static bool ssl_crypto_x509_session_cache_objects(SSL_SESSION *sess) { leaf = UpRef(x509); } else if (chain_without_leaf && !PushToStack(chain_without_leaf.get(), UpRef(x509))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } if (!PushToStack(chain.get(), std::move(x509))) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } } @@ -1104,7 +1100,6 @@ static STACK_OF(X509_NAME) * UniquePtr new_cache(sk_X509_NAME_new_null()); if (!new_cache) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return NULL; } diff --git a/ssl/t1_enc.cc b/ssl/t1_enc.cc index 46ebeaa2fa..a985d38bb6 100644 --- a/ssl/t1_enc.cc +++ b/ssl/t1_enc.cc @@ -366,7 +366,6 @@ int SSL_export_keying_material(SSL *ssl, uint8_t *out, size_t out_len, } Array seed; if (!seed.Init(seed_len)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } diff --git a/ssl/tls13_both.cc b/ssl/tls13_both.cc index d7997c7e0b..f67c592a33 100644 --- a/ssl/tls13_both.cc +++ b/ssl/tls13_both.cc @@ -58,13 +58,11 @@ bool tls13_get_cert_verify_signature_input( enum ssl_cert_verify_context_t cert_verify_context) { ScopedCBB cbb; if (!CBB_init(cbb.get(), 64 + 33 + 1 + 2 * EVP_MAX_MD_SIZE)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } for (size_t i = 0; i < 64; i++) { if (!CBB_add_u8(cbb.get(), 0x20)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } } @@ -80,7 +78,6 @@ bool tls13_get_cert_verify_signature_input( static const char kContext[] = "TLS 1.3, Channel ID"; context = kContext; } else { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -88,7 +85,6 @@ bool tls13_get_cert_verify_signature_input( if (!CBB_add_bytes(cbb.get(), reinterpret_cast(context.data()), context.size())) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -97,7 +93,6 @@ bool tls13_get_cert_verify_signature_input( if (!hs->transcript.GetHash(context_hash, &context_hash_len) || !CBB_add_bytes(cbb.get(), context_hash, context_hash_len) || !CBBFinishArray(cbb.get(), out)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -186,7 +181,6 @@ bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg, UniquePtr certs(sk_CRYPTO_BUFFER_new_null()); if (!certs) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } @@ -230,7 +224,6 @@ bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg, if (!buf || !PushToStack(certs.get(), std::move(buf))) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } diff --git a/ssl/tls13_client.cc b/ssl/tls13_client.cc index bd0f820e8c..92e26f22a8 100644 --- a/ssl/tls13_client.cc +++ b/ssl/tls13_client.cc @@ -671,7 +671,6 @@ static enum ssl_hs_wait_t do_read_certificate_request(SSL_HANDSHAKE *hs) { } else { hs->ca_names.reset(sk_CRYPTO_BUFFER_new_null()); if (!hs->ca_names) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } diff --git a/ssl/tls13_enc.cc b/ssl/tls13_enc.cc index 23889bd1c2..ad023ef8eb 100644 --- a/ssl/tls13_enc.cc +++ b/ssl/tls13_enc.cc @@ -111,7 +111,6 @@ static bool hkdf_expand_label(Span out, const EVP_MD *digest, !CBB_add_u8_length_prefixed(cbb.get(), &child) || !CBB_add_bytes(&child, hash.data(), hash.size()) || !CBBFinishArray(cbb.get(), &hkdf_label)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return false; } From ec64d7e01a7ca30957c8bce38f6ad989e0b8ced1 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 10 Feb 2023 16:43:13 -0500 Subject: [PATCH 078/177] Fix a -Wignored-qualifiers warning in trust_token_test.cc The const bool doesn't do anything. While I'm here, make the methods const. Change-Id: Id8c31d5fcda6d8bc244c64b02b1d758e4eff6849 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57185 Auto-Submit: David Benjamin Commit-Queue: Steven Valdez Reviewed-by: Steven Valdez --- crypto/trust_token/trust_token_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/trust_token/trust_token_test.cc b/crypto/trust_token/trust_token_test.cc index 6f952fb302..ae4eb5ce8a 100644 --- a/crypto/trust_token/trust_token_test.cc +++ b/crypto/trust_token/trust_token_test.cc @@ -313,9 +313,9 @@ class TrustTokenProtocolTestBase : public ::testing::Test { return static_cast(7 + i); } - const TRUST_TOKEN_METHOD *method() { return method_; } + const TRUST_TOKEN_METHOD *method() const { return method_; } - const bool use_message() { return use_msg_; } + bool use_message() const { return use_msg_; } protected: void SetupContexts() { From 9c9b2c219fc817940cb31cc0d055c61c5986e058 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 9 Feb 2023 19:22:25 -0500 Subject: [PATCH 079/177] Align the hash-to-curve formulation with draft-16. draft-07 to draft-16 is mostly editorial, but there were a few notable changes: - Empty DST values are forbidden. - The sample implementation for map_to_curve_simple_swu has completely changed. The new formulation has the same performance (if not a smidge faster), and aligning with the spec seems generally useful. - P-384 is now paired with SHA-384, not SHA-512. As this would be a breaking change for the trust tokens code, I've left that in. A follow-up CL will add implementations of draft-16, which is expected to match the final draft. Before: Did 77000 hash-to-curve P384_XMD:SHA-512_SSWU_RO_ operations in 4025677us (19127.2 ops/sec) Did 7156000 hash-to-scalar P384_XMD:SHA-512 operations in 4000385us (1788827.8 ops/sec) After: Did 77000 hash-to-curve P384_XMD:SHA-512_SSWU_RO_ operations in 4009708us (19203.4 ops/sec) [+0.4%] Did 7327000 hash-to-scalar P384_XMD:SHA-512 operations in 4000477us (1831531.6 ops/sec) [+2.4%] Bug: 1414562 Change-Id: Ic3c37061e325250d5d8723fd9aa263930c6023cf Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57146 Auto-Submit: David Benjamin Reviewed-by: Steven Valdez Commit-Queue: Steven Valdez --- crypto/ec_extra/hash_to_curve.c | 232 +++++++++++++++++++------------- crypto/ec_extra/internal.h | 4 + crypto/fipsmodule/ec/ec_test.cc | 6 + 3 files changed, 145 insertions(+), 97 deletions(-) diff --git a/crypto/ec_extra/hash_to_curve.c b/crypto/ec_extra/hash_to_curve.c index fa7ff59097..dca4c24aa1 100644 --- a/crypto/ec_extra/hash_to_curve.c +++ b/crypto/ec_extra/hash_to_curve.c @@ -27,7 +27,7 @@ // This file implements hash-to-curve, as described in -// draft-irtf-cfrg-hash-to-curve-07. +// draft-irtf-cfrg-hash-to-curve-16. // // This hash-to-curve implementation is written generically with the // expectation that we will eventually wish to support other curves. If it @@ -48,11 +48,17 @@ // templates to make specializing more convenient. // expand_message_xmd implements the operation described in section 5.3.1 of -// draft-irtf-cfrg-hash-to-curve-07. It returns one on success and zero on -// allocation failure or if |out_len| was too large. +// draft-irtf-cfrg-hash-to-curve-16. It returns one on success and zero on +// error. static int expand_message_xmd(const EVP_MD *md, uint8_t *out, size_t out_len, const uint8_t *msg, size_t msg_len, const uint8_t *dst, size_t dst_len) { + // See https://github.com/cfrg/draft-irtf-cfrg-hash-to-curve/issues/352 + if (dst_len == 0) { + OPENSSL_PUT_ERROR(EC, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + return 0; + } + int ret = 0; const size_t block_size = EVP_MD_block_size(md); const size_t md_size = EVP_MD_size(md); @@ -132,7 +138,7 @@ static int expand_message_xmd(const EVP_MD *md, uint8_t *out, size_t out_len, // num_bytes_to_derive determines the number of bytes to derive when hashing to // a number modulo |modulus|. See the hash_to_field operation defined in -// section 5.2 of draft-irtf-cfrg-hash-to-curve-07. +// section 5.2 of draft-irtf-cfrg-hash-to-curve-16. static int num_bytes_to_derive(size_t *out, const BIGNUM *modulus, unsigned k) { size_t bits = BN_num_bits(modulus); size_t L = (bits + k + 7) / 8; @@ -165,7 +171,7 @@ static void big_endian_to_words(BN_ULONG *out, size_t num_words, } // hash_to_field implements the operation described in section 5.2 -// of draft-irtf-cfrg-hash-to-curve-07, with count = 2. |k| is the security +// of draft-irtf-cfrg-hash-to-curve-16, with count = 2. |k| is the security // factor. static int hash_to_field2(const EC_GROUP *group, const EVP_MD *md, EC_FELEM *out1, EC_FELEM *out2, const uint8_t *dst, @@ -214,90 +220,126 @@ static inline void mul_A(const EC_GROUP *group, EC_FELEM *out, ec_felem_sub(group, out, in, &tmp); // out = -3*in } -static inline void mul_minus_A(const EC_GROUP *group, EC_FELEM *out, - const EC_FELEM *in) { - assert(group->a_is_minus3); - EC_FELEM tmp; - ec_felem_add(group, &tmp, in, in); // tmp = 2*in - ec_felem_add(group, out, &tmp, in); // out = 3*in -} - -// sgn0_le implements the operation described in section 4.1.2 of -// draft-irtf-cfrg-hash-to-curve-07. -static BN_ULONG sgn0_le(const EC_GROUP *group, const EC_FELEM *a) { +// sgn0 implements the operation described in section 4.1.2 of +// draft-irtf-cfrg-hash-to-curve-16. +static BN_ULONG sgn0(const EC_GROUP *group, const EC_FELEM *a) { uint8_t buf[EC_MAX_BYTES]; size_t len; ec_felem_to_bytes(group, buf, &len, a); return buf[len - 1] & 1; } -// map_to_curve_simple_swu implements the operation described in section 6.6.2 -// of draft-irtf-cfrg-hash-to-curve-07, using the optimization in appendix -// D.2.1. It returns one on success and zero on error. -static int map_to_curve_simple_swu(const EC_GROUP *group, const EC_FELEM *Z, - const BN_ULONG *c1, size_t num_c1, - const EC_FELEM *c2, EC_RAW_POINT *out, - const EC_FELEM *u) { +OPENSSL_UNUSED static int is_3mod4(const EC_GROUP *group) { + return group->field.width > 0 && (group->field.d[0] & 3) == 3; +} + +// sqrt_ratio_3mod4 implements the operation described in appendix F.2.1.2 +// of draft-irtf-cfrg-hash-to-curve-16. +static BN_ULONG sqrt_ratio_3mod4(const EC_GROUP *group, const EC_FELEM *Z, + const BN_ULONG *c1, size_t num_c1, + const EC_FELEM *c2, EC_FELEM *out_y, + const EC_FELEM *u, const EC_FELEM *v) { + assert(is_3mod4(group)); + void (*const felem_mul)(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a, const EC_FELEM *b) = group->meth->felem_mul; void (*const felem_sqr)(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a) = group->meth->felem_sqr; + EC_FELEM tv1, tv2, tv3, y1, y2; + felem_sqr(group, &tv1, v); // 1. tv1 = v^2 + felem_mul(group, &tv2, u, v); // 2. tv2 = u * v + felem_mul(group, &tv1, &tv1, &tv2); // 3. tv1 = tv1 * tv2 + group->meth->felem_exp(group, &y1, &tv1, c1, num_c1); // 4. y1 = tv1^c1 + felem_mul(group, &y1, &y1, &tv2); // 5. y1 = y1 * tv2 + felem_mul(group, &y2, &y1, c2); // 6. y2 = y1 * c2 + felem_sqr(group, &tv3, &y1); // 7. tv3 = y1^2 + felem_mul(group, &tv3, &tv3, v); // 8. tv3 = tv3 * v + + // 9. isQR = tv3 == u + // 10. y = CMOV(y2, y1, isQR) + // 11. return (isQR, y) + // + // Note the specification's CMOV function and our |ec_felem_select| have the + // opposite argument order. + ec_felem_sub(group, &tv1, &tv3, u); + const BN_ULONG isQR = ~ec_felem_non_zero_mask(group, &tv1); + ec_felem_select(group, out_y, isQR, &y1, &y2); + return isQR; +} + +// map_to_curve_simple_swu implements the operation described in section 6.6.2 +// of draft-irtf-cfrg-hash-to-curve-16, using the straight-line implementation +// in appendix F.2. +static void map_to_curve_simple_swu(const EC_GROUP *group, const EC_FELEM *Z, + const BN_ULONG *c1, size_t num_c1, + const EC_FELEM *c2, EC_RAW_POINT *out, + const EC_FELEM *u) { // This function requires the prime be 3 mod 4, and that A = -3. - if (group->field.width == 0 || (group->field.d[0] & 3) != 3 || - !group->a_is_minus3) { - OPENSSL_PUT_ERROR(EC, ERR_R_INTERNAL_ERROR); - return 0; - } + assert(is_3mod4(group)); + assert(group->a_is_minus3); - EC_FELEM tv1, tv2, tv3, tv4, xd, x1n, x2n, tmp, gxd, gx1, y1, y2; - felem_sqr(group, &tv1, u); // tv1 = u^2 - felem_mul(group, &tv3, Z, &tv1); // tv3 = Z * tv1 - felem_sqr(group, &tv2, &tv3); // tv2 = tv3^2 - ec_felem_add(group, &xd, &tv2, &tv3); // xd = tv2 + tv3 - ec_felem_add(group, &x1n, &xd, &group->one); // x1n = xd + 1 - felem_mul(group, &x1n, &x1n, &group->b); // x1n = x1n * B - mul_minus_A(group, &xd, &xd); // xd = -A * xd - BN_ULONG e1 = ec_felem_non_zero_mask(group, &xd); // e1 = xd == 0 [flipped] - mul_A(group, &tmp, Z); - ec_felem_select(group, &xd, e1, &xd, &tmp); // xd = CMOV(xd, Z * A, e1) - felem_sqr(group, &tv2, &xd); // tv2 = xd^2 - felem_mul(group, &gxd, &tv2, &xd); // gxd = tv2 * xd = xd^3 - mul_A(group, &tv2, &tv2); // tv2 = A * tv2 - felem_sqr(group, &gx1, &x1n); // gx1 = x1n^2 - ec_felem_add(group, &gx1, &gx1, &tv2); // gx1 = gx1 + tv2 - felem_mul(group, &gx1, &gx1, &x1n); // gx1 = gx1 * x1n - felem_mul(group, &tv2, &group->b, &gxd); // tv2 = B * gxd - ec_felem_add(group, &gx1, &gx1, &tv2); // gx1 = gx1 + tv2 - felem_sqr(group, &tv4, &gxd); // tv4 = gxd^2 - felem_mul(group, &tv2, &gx1, &gxd); // tv2 = gx1 * gxd - felem_mul(group, &tv4, &tv4, &tv2); // tv4 = tv4 * tv2 - group->meth->felem_exp(group, &y1, &tv4, c1, num_c1); // y1 = tv4^c1 - felem_mul(group, &y1, &y1, &tv2); // y1 = y1 * tv2 - felem_mul(group, &x2n, &tv3, &x1n); // x2n = tv3 * x1n - felem_mul(group, &y2, &y1, c2); // y2 = y1 * c2 - felem_mul(group, &y2, &y2, &tv1); // y2 = y2 * tv1 - felem_mul(group, &y2, &y2, u); // y2 = y2 * u - felem_sqr(group, &tv2, &y1); // tv2 = y1^2 - felem_mul(group, &tv2, &tv2, &gxd); // tv2 = tv2 * gxd - ec_felem_sub(group, &tv3, &tv2, &gx1); - BN_ULONG e2 = - ec_felem_non_zero_mask(group, &tv3); // e2 = tv2 == gx1 [flipped] - ec_felem_select(group, &x1n, e2, &x2n, &x1n); // xn = CMOV(x2n, x1n, e2) - ec_felem_select(group, &y1, e2, &y2, &y1); // y = CMOV(y2, y1, e2) - BN_ULONG sgn0_u = sgn0_le(group, u); - BN_ULONG sgn0_y = sgn0_le(group, &y1); - BN_ULONG e3 = sgn0_u ^ sgn0_y; - e3 = ((BN_ULONG)0) - e3; // e3 = sgn0(u) == sgn0(y) [flipped] - ec_felem_neg(group, &y2, &y1); - ec_felem_select(group, &y1, e3, &y2, &y1); // y = CMOV(-y, y, e3) - - // Appendix D.1 describes how to convert (x1n, xd, y1, 1) to Jacobian - // coordinates. Note yd = 1. Also note that gxd computed above is xd^3. - felem_mul(group, &out->X, &x1n, &xd); // X = xn * xd - felem_mul(group, &out->Y, &y1, &gxd); // Y = yn * gxd = yn * xd^3 - out->Z = xd; // Z = xd - return 1; + void (*const felem_mul)(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a, + const EC_FELEM *b) = group->meth->felem_mul; + void (*const felem_sqr)(const EC_GROUP *, EC_FELEM *r, const EC_FELEM *a) = + group->meth->felem_sqr; + + EC_FELEM tv1, tv2, tv3, tv4, tv5, tv6, x, y, y1; + felem_sqr(group, &tv1, u); // 1. tv1 = u^2 + felem_mul(group, &tv1, Z, &tv1); // 2. tv1 = Z * tv1 + felem_sqr(group, &tv2, &tv1); // 3. tv2 = tv1^2 + ec_felem_add(group, &tv2, &tv2, &tv1); // 4. tv2 = tv2 + tv1 + ec_felem_add(group, &tv3, &tv2, &group->one); // 5. tv3 = tv2 + 1 + felem_mul(group, &tv3, &group->b, &tv3); // 6. tv3 = B * tv3 + + // 7. tv4 = CMOV(Z, -tv2, tv2 != 0) + const BN_ULONG tv2_non_zero = ec_felem_non_zero_mask(group, &tv2); + ec_felem_neg(group, &tv4, &tv2); + ec_felem_select(group, &tv4, tv2_non_zero, &tv4, Z); + + mul_A(group, &tv4, &tv4); // 8. tv4 = A * tv4 + felem_sqr(group, &tv2, &tv3); // 9. tv2 = tv3^2 + felem_sqr(group, &tv6, &tv4); // 10. tv6 = tv4^2 + mul_A(group, &tv5, &tv6); // 11. tv5 = A * tv6 + ec_felem_add(group, &tv2, &tv2, &tv5); // 12. tv2 = tv2 + tv5 + felem_mul(group, &tv2, &tv2, &tv3); // 13. tv2 = tv2 * tv3 + felem_mul(group, &tv6, &tv6, &tv4); // 14. tv6 = tv6 * tv4 + felem_mul(group, &tv5, &group->b, &tv6); // 15. tv5 = B * tv6 + ec_felem_add(group, &tv2, &tv2, &tv5); // 16. tv2 = tv2 + tv5 + felem_mul(group, &x, &tv1, &tv3); // 17. x = tv1 * tv3 + + // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6) + const BN_ULONG is_gx1_square = + sqrt_ratio_3mod4(group, Z, c1, num_c1, c2, &y1, &tv2, &tv6); + + felem_mul(group, &y, &tv1, u); // 19. y = tv1 * u + felem_mul(group, &y, &y, &y1); // 20. y = y * y1 + + // 21. x = CMOV(x, tv3, is_gx1_square) + ec_felem_select(group, &x, is_gx1_square, &tv3, &x); + // 22. y = CMOV(y, y1, is_gx1_square) + ec_felem_select(group, &y, is_gx1_square, &y1, &y); + + // 23. e1 = sgn0(u) == sgn0(y) + BN_ULONG sgn0_u = sgn0(group, u); + BN_ULONG sgn0_y = sgn0(group, &y); + BN_ULONG not_e1 = sgn0_u ^ sgn0_y; + not_e1 = ((BN_ULONG)0) - not_e1; + + // 24. y = CMOV(-y, y, e1) + ec_felem_neg(group, &tv1, &y); + ec_felem_select(group, &y, not_e1, &tv1, &y); + + // 25. x = x / tv4 + // + // Our output is in projective coordinates, so rather than inverting |tv4| + // now, represent (x / tv4, y) as (x * tv4, y * tv4^3, tv4). This is much more + // efficient if the caller will do further computation on the output. (If the + // caller will immediately convert to affine coordinates, it is slightly less + // efficient, but only by a few field multiplications.) + felem_mul(group, &out->X, &x, &tv4); + felem_mul(group, &out->Y, &y, &tv6); + out->Z = tv4; } static int hash_to_curve(const EC_GROUP *group, const EVP_MD *md, @@ -318,10 +360,8 @@ static int hash_to_curve(const EC_GROUP *group, const EVP_MD *md, bn_rshift_words(c1, c1, /*shift=*/2, /*num=*/num_c1); EC_RAW_POINT Q0, Q1; - if (!map_to_curve_simple_swu(group, Z, c1, num_c1, c2, &Q0, &u0) || - !map_to_curve_simple_swu(group, Z, c1, num_c1, c2, &Q1, &u1)) { - return 0; - } + map_to_curve_simple_swu(group, Z, c1, num_c1, c2, &Q0, &u0); + map_to_curve_simple_swu(group, Z, c1, num_c1, c2, &Q1, &u1); group->meth->add(group, out, &Q0, &Q1); // R = Q0 + Q1 // All our curves have cofactor one, so |clear_cofactor| is a no-op. @@ -335,6 +375,19 @@ static int felem_from_u8(const EC_GROUP *group, EC_FELEM *out, uint8_t a) { return ec_felem_from_bytes(group, out, bytes, len); } +// kP384Sqrt12 is sqrt(12) in P-384's field. It was computed as follows in +// python3: +// +// p = 2**384 - 2**128 - 2**96 + 2**32 - 1 +// c2 = pow(12, (p+1)//4, p) +// assert pow(c2, 2, p) == 12 +// ", ".join("0x%02x" % b for b in c2.to_bytes(384//8, 'big')) +static const uint8_t kP384Sqrt12[] = { + 0x2a, 0xcc, 0xb4, 0xa6, 0x56, 0xb0, 0x24, 0x9c, 0x71, 0xf0, 0x50, 0x0e, + 0x83, 0xda, 0x2f, 0xdd, 0x7f, 0x98, 0xe3, 0x83, 0xd6, 0x8b, 0x53, 0x87, + 0x1f, 0x87, 0x2f, 0xcb, 0x9c, 0xcb, 0x80, 0xc5, 0x3c, 0x0d, 0xe1, 0xf8, + 0xa8, 0x0f, 0x7e, 0x19, 0x14, 0xe2, 0xec, 0x69, 0xf5, 0xa6, 0x26, 0xb3}; + int ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( const EC_GROUP *group, EC_RAW_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len) { @@ -344,25 +397,10 @@ int ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( return 0; } - // kSqrt1728 was computed as follows in python3: - // - // p = 2**384 - 2**128 - 2**96 + 2**32 - 1 - // z3 = 12**3 - // c2 = pow(z3, (p+1)//4, p) - // assert z3 == pow(c2, 2, p) - // ", ".join("0x%02x" % b for b in c2.to_bytes(384//8, 'big') - - static const uint8_t kSqrt1728[] = { - 0x01, 0x98, 0x77, 0xcc, 0x10, 0x41, 0xb7, 0x55, 0x57, 0x43, 0xc0, 0xae, - 0x2e, 0x3a, 0x3e, 0x61, 0xfb, 0x2a, 0xaa, 0x2e, 0x0e, 0x87, 0xea, 0x55, - 0x7a, 0x56, 0x3d, 0x8b, 0x59, 0x8a, 0x09, 0x40, 0xd0, 0xa6, 0x97, 0xa9, - 0xe0, 0xb9, 0xe9, 0x2c, 0xfa, 0xa3, 0x14, 0xf5, 0x83, 0xc9, 0xd0, 0x66 - }; - - // Z = -12, c2 = sqrt(1728) + // Z = -12, c2 = sqrt(12) EC_FELEM Z, c2; if (!felem_from_u8(group, &Z, 12) || - !ec_felem_from_bytes(group, &c2, kSqrt1728, sizeof(kSqrt1728))) { + !ec_felem_from_bytes(group, &c2, kP384Sqrt12, sizeof(kP384Sqrt12))) { return 0; } ec_felem_neg(group, &Z, &Z); diff --git a/crypto/ec_extra/internal.h b/crypto/ec_extra/internal.h index 55314ac730..ef93b56ba8 100644 --- a/crypto/ec_extra/internal.h +++ b/crypto/ec_extra/internal.h @@ -36,6 +36,8 @@ extern "C" { // |group| and writes the result to |out|, implementing the // P384_XMD:SHA-512_SSWU_RO_ suite from draft-irtf-cfrg-hash-to-curve-07. It // returns one on success and zero on error. +// +// TODO(https://crbug.com/1414562): Migrate this to the final version. OPENSSL_EXPORT int ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( const EC_GROUP *group, EC_RAW_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len); @@ -44,6 +46,8 @@ OPENSSL_EXPORT int ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( // and writes the result to |out|, using the hash_to_field operation from the // P384_XMD:SHA-512_SSWU_RO_ suite from draft-irtf-cfrg-hash-to-curve-07, but // generating a value modulo the group order rather than a field element. +// +// TODO(https://crbug.com/1414562): Migrate this to the final version. OPENSSL_EXPORT int ec_hash_to_scalar_p384_xmd_sha512_draft07( const EC_GROUP *group, EC_SCALAR *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len); diff --git a/crypto/fipsmodule/ec/ec_test.cc b/crypto/fipsmodule/ec/ec_test.cc index 88665b2e46..bb93e55a8a 100644 --- a/crypto/fipsmodule/ec/ec_test.cc +++ b/crypto/fipsmodule/ec/ec_test.cc @@ -1286,6 +1286,12 @@ TEST(ECTest, HashToCurve) { static const uint8_t kMessage[] = {4, 5, 6, 7}; EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( p224.get(), &p, kDST, sizeof(kDST), kMessage, sizeof(kMessage))); + + // Zero-length DSTs are not allowed. + bssl::UniquePtr p384(EC_GROUP_new_by_curve_name(NID_secp384r1)); + ASSERT_TRUE(p384); + EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( + p384.get(), &p, nullptr, 0, kMessage, sizeof(kMessage))); } TEST(ECTest, HashToScalar) { From 3950d6ce25c263c3d131985edfcd6b0899a7949e Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 9 Feb 2023 19:24:06 -0500 Subject: [PATCH 080/177] Implement P256_XMD:SHA-256_SSWU_RO_ and P384_XMD:SHA-384_SSWU_RO_ Also add public APIs for this, now that the specification is no longer expected to change, and because a project external to the library wishes to use it. For now, I've kept the P-256 version using the generic felem_exp, but we should update that to use the specialized field arithmetic. Trust Tokens will presumably move to this later and, in the meantime, another team wants this. Bug: chromium:1414562 Change-Id: Ie38203b4439ff55659c4fb2070f45d524c55aa2a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57147 Commit-Queue: David Benjamin Reviewed-by: Steven Valdez --- crypto/ec_extra/hash_to_curve.c | 78 +++++++++++++++++++++++ crypto/ec_extra/internal.h | 22 +++++-- crypto/fipsmodule/ec/ec_montgomery.c | 10 +-- crypto/fipsmodule/ec/ec_test.cc | 94 ++++++++++++++++++++++++---- crypto/fipsmodule/ec/internal.h | 11 ++++ crypto/fipsmodule/ec/p256-nistz.c | 4 ++ crypto/fipsmodule/ec/p256.c | 4 ++ include/openssl/ec.h | 25 ++++++++ tool/speed.cc | 26 ++++++-- 9 files changed, 245 insertions(+), 29 deletions(-) diff --git a/crypto/ec_extra/hash_to_curve.c b/crypto/ec_extra/hash_to_curve.c index dca4c24aa1..fecd5356c6 100644 --- a/crypto/ec_extra/hash_to_curve.c +++ b/crypto/ec_extra/hash_to_curve.c @@ -375,6 +375,18 @@ static int felem_from_u8(const EC_GROUP *group, EC_FELEM *out, uint8_t a) { return ec_felem_from_bytes(group, out, bytes, len); } +// kP256Sqrt10 is sqrt(10) in P-256's field. It was computed as follows in +// python3: +// +// p = 2**256 - 2**224 + 2**192 + 2**96 - 1 +// c2 = pow(10, (p+1)//4, p) +// assert pow(c2, 2, p) == 10 +// ", ".join("0x%02x" % b for b in c2.to_bytes(256//8, 'big')) +static const uint8_t kP256Sqrt10[] = { + 0xda, 0x53, 0x8e, 0x3b, 0xe1, 0xd8, 0x9b, 0x99, 0xc9, 0x78, 0xfc, + 0x67, 0x51, 0x80, 0xaa, 0xb2, 0x7b, 0x8d, 0x1f, 0xf8, 0x4c, 0x55, + 0xd5, 0xb6, 0x2c, 0xcd, 0x34, 0x27, 0xe4, 0x33, 0xc4, 0x7f}; + // kP384Sqrt12 is sqrt(12) in P-384's field. It was computed as follows in // python3: // @@ -388,6 +400,72 @@ static const uint8_t kP384Sqrt12[] = { 0x1f, 0x87, 0x2f, 0xcb, 0x9c, 0xcb, 0x80, 0xc5, 0x3c, 0x0d, 0xe1, 0xf8, 0xa8, 0x0f, 0x7e, 0x19, 0x14, 0xe2, 0xec, 0x69, 0xf5, 0xa6, 0x26, 0xb3}; +int ec_hash_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, + EC_RAW_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, + size_t msg_len) { + // See section 8.3 of draft-irtf-cfrg-hash-to-curve-16. + if (EC_GROUP_get_curve_name(group) != NID_X9_62_prime256v1) { + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + return 0; + } + + // Z = -10, c2 = sqrt(10) + EC_FELEM Z, c2; + if (!felem_from_u8(group, &Z, 10) || + !ec_felem_from_bytes(group, &c2, kP256Sqrt10, sizeof(kP256Sqrt10))) { + return 0; + } + ec_felem_neg(group, &Z, &Z); + + return hash_to_curve(group, EVP_sha256(), &Z, &c2, /*k=*/128, out, dst, + dst_len, msg, msg_len); +} + +int EC_hash_to_curve_p256_xmd_sha256_sswu(const EC_GROUP *group, EC_POINT *out, + const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len) { + if (EC_GROUP_cmp(group, out->group, NULL) != 0) { + OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); + return 0; + } + return ec_hash_to_curve_p256_xmd_sha256_sswu(group, &out->raw, dst, dst_len, + msg, msg_len); +} + +int ec_hash_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, + EC_RAW_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, + size_t msg_len) { + // See section 8.3 of draft-irtf-cfrg-hash-to-curve-16. + if (EC_GROUP_get_curve_name(group) != NID_secp384r1) { + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + return 0; + } + + // Z = -12, c2 = sqrt(12) + EC_FELEM Z, c2; + if (!felem_from_u8(group, &Z, 12) || + !ec_felem_from_bytes(group, &c2, kP384Sqrt12, sizeof(kP384Sqrt12))) { + return 0; + } + ec_felem_neg(group, &Z, &Z); + + return hash_to_curve(group, EVP_sha384(), &Z, &c2, /*k=*/192, out, dst, + dst_len, msg, msg_len); +} + +int EC_hash_to_curve_p384_xmd_sha384_sswu(const EC_GROUP *group, EC_POINT *out, + const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len) { + if (EC_GROUP_cmp(group, out->group, NULL) != 0) { + OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); + return 0; + } + return ec_hash_to_curve_p384_xmd_sha384_sswu(group, &out->raw, dst, dst_len, + msg, msg_len); +} + int ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( const EC_GROUP *group, EC_RAW_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len) { diff --git a/crypto/ec_extra/internal.h b/crypto/ec_extra/internal.h index ef93b56ba8..c7f517dee8 100644 --- a/crypto/ec_extra/internal.h +++ b/crypto/ec_extra/internal.h @@ -26,11 +26,23 @@ extern "C" { // Hash-to-curve. // -// The following functions implement primitives from -// draft-irtf-cfrg-hash-to-curve. The |dst| parameter in each function is the -// domain separation tag and must be unique for each protocol and between the -// |hash_to_curve| and |hash_to_scalar| variants. See section 3.1 of the spec -// for additional guidance on this parameter. +// Internal |EC_RAW_POINT| versions of the corresponding public APIs. + +// ec_hash_to_curve_p256_xmd_sha256_sswu hashes |msg| to a point on |group| and +// writes the result to |out|, implementing the P256_XMD:SHA-256_SSWU_RO_ suite +// from draft-irtf-cfrg-hash-to-curve-16. It returns one on success and zero on +// error. +OPENSSL_EXPORT int ec_hash_to_curve_p256_xmd_sha256_sswu( + const EC_GROUP *group, EC_RAW_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, size_t msg_len); + +// ec_hash_to_curve_p384_xmd_sha384_sswu hashes |msg| to a point on |group| and +// writes the result to |out|, implementing the P384_XMD:SHA-384_SSWU_RO_ suite +// from draft-irtf-cfrg-hash-to-curve-16. It returns one on success and zero on +// error. +OPENSSL_EXPORT int ec_hash_to_curve_p384_xmd_sha384_sswu( + const EC_GROUP *group, EC_RAW_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, size_t msg_len); // ec_hash_to_curve_p384_xmd_sha512_sswu_draft07 hashes |msg| to a point on // |group| and writes the result to |out|, implementing the diff --git a/crypto/fipsmodule/ec/ec_montgomery.c b/crypto/fipsmodule/ec/ec_montgomery.c index 21d5d40d98..f458df9c74 100644 --- a/crypto/fipsmodule/ec/ec_montgomery.c +++ b/crypto/fipsmodule/ec/ec_montgomery.c @@ -156,8 +156,8 @@ int ec_GFp_mont_felem_from_bytes(const EC_GROUP *group, EC_FELEM *out, return 1; } -static void ec_GFp_mont_felem_reduce(const EC_GROUP *group, EC_FELEM *out, - const BN_ULONG *words, size_t num) { +void ec_GFp_mont_felem_reduce(const EC_GROUP *group, EC_FELEM *out, + const BN_ULONG *words, size_t num) { // Convert "from" Montgomery form so the value is reduced mod p. bn_from_montgomery_small(out->words, group->field.width, words, num, group->mont); @@ -167,9 +167,9 @@ static void ec_GFp_mont_felem_reduce(const EC_GROUP *group, EC_FELEM *out, ec_GFp_mont_felem_to_montgomery(group, out, out); } -static void ec_GFp_mont_felem_exp(const EC_GROUP *group, EC_FELEM *out, - const EC_FELEM *a, const BN_ULONG *exp, - size_t num_exp) { +void ec_GFp_mont_felem_exp(const EC_GROUP *group, EC_FELEM *out, + const EC_FELEM *a, const BN_ULONG *exp, + size_t num_exp) { bn_mod_exp_mont_small(out->words, a->words, group->field.width, exp, num_exp, group->mont); } diff --git a/crypto/fipsmodule/ec/ec_test.cc b/crypto/fipsmodule/ec/ec_test.cc index bb93e55a8a..571ea58070 100644 --- a/crypto/fipsmodule/ec/ec_test.cc +++ b/crypto/fipsmodule/ec/ec_test.cc @@ -1207,8 +1207,18 @@ TEST(ECTest, DeriveFromSecret) { } TEST(ECTest, HashToCurve) { + auto hash_to_curve_p384_sha512_draft07 = + [](const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, + size_t dst_len, const uint8_t *msg, size_t msg_len) -> int { + if (EC_GROUP_cmp(group, out->group, NULL) != 0) { + return 0; + } + return ec_hash_to_curve_p384_xmd_sha512_sswu_draft07(group, &out->raw, dst, + dst_len, msg, msg_len); + }; + struct HashToCurveTest { - int (*hash_to_curve)(const EC_GROUP *group, EC_RAW_POINT *out, + int (*hash_to_curve)(const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, const uint8_t *msg, size_t msg_len); int curve_nid; @@ -1218,26 +1228,71 @@ TEST(ECTest, HashToCurve) { const char *y_hex; }; static const HashToCurveTest kTests[] = { + // See draft-irtf-cfrg-hash-to-curve-16, appendix J.1.1. + {&EC_hash_to_curve_p256_xmd_sha256_sswu, NID_X9_62_prime256v1, + "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", "", + "2c15230b26dbc6fc9a37051158c95b79656e17a1a920b11394ca91" + "c44247d3e4", + "8a7a74985cc5c776cdfe4b1f19884970453912e9d31528c060be9a" + "b5c43e8415"}, + {&EC_hash_to_curve_p256_xmd_sha256_sswu, NID_X9_62_prime256v1, + "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", "abc", + "0bb8b87485551aa43ed54f009230450b492fead5f1cc91658775da" + "c4a3388a0f", + "5c41b3d0731a27a7b14bc0bf0ccded2d8751f83493404c84a88e71" + "ffd424212e"}, + {&EC_hash_to_curve_p256_xmd_sha256_sswu, NID_X9_62_prime256v1, + "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", "abcdef0123456789", + "65038ac8f2b1def042a5df0b33b1f4eca6bff7cb0f9c6c15268118" + "64e544ed80", + "cad44d40a656e7aff4002a8de287abc8ae0482b5ae825822bb870d" + "6df9b56ca3"}, + {&EC_hash_to_curve_p256_xmd_sha256_sswu, NID_X9_62_prime256v1, + "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", + "q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" + "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" + "qqqqqqqqqqqqqqqqqqqqqqqqq", + "4be61ee205094282ba8a2042bcb48d88dfbb609301c49aa8b07853" + "3dc65a0b5d", + "98f8df449a072c4721d241a3b1236d3caccba603f916ca680f4539" + "d2bfb3c29e"}, + {&EC_hash_to_curve_p256_xmd_sha256_sswu, NID_X9_62_prime256v1, + "QUUX-V01-CS02-with-P256_XMD:SHA-256_SSWU_RO_", + "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "457ae2981f70ca85d8e24c308b14db22f3e3862c5ea0f652ca38b5" + "e49cd64bc5", + "ecb9f0eadc9aeed232dabc53235368c1394c78de05dd96893eefa6" + "2b0f4757dc"}, + // See draft-irtf-cfrg-hash-to-curve-07, appendix G.2.1. - {&ec_hash_to_curve_p384_xmd_sha512_sswu_draft07, NID_secp384r1, + {hash_to_curve_p384_sha512_draft07, NID_secp384r1, "P384_XMD:SHA-512_SSWU_RO_TESTGEN", "", "2fc0b9efdd63a8e43b4db88dc12f03c798f6fd91bccac0c9096185" "4386e58fdc54fc2a01f0f358759054ce1f9b762025", "949b936fabb72cdb02cd7980b86cb6a3adf286658e81301648851d" "b8a49d9bec00ccb57698d559fc5960fa5030a8e54b"}, - {&ec_hash_to_curve_p384_xmd_sha512_sswu_draft07, NID_secp384r1, + {hash_to_curve_p384_sha512_draft07, NID_secp384r1, "P384_XMD:SHA-512_SSWU_RO_TESTGEN", "abc", "4f3338035391e8ce8ce40c974136f0edc97f392ffd44a643338741" "8ed1b8c2603487e1688ec151f048fbc6b2c138c92f", "152b90aef6558be328a3168855fb1906452e7167b0f7c8a56ff9d4" "fa87d6fb522cdf8e409db54418b2c764fd26260757"}, - {&ec_hash_to_curve_p384_xmd_sha512_sswu_draft07, NID_secp384r1, + {hash_to_curve_p384_sha512_draft07, NID_secp384r1, "P384_XMD:SHA-512_SSWU_RO_TESTGEN", "abcdef0123456789", "e9e5d7ac397e123d060ad44301cbc8eb972f6e64ebcff29dcc9b9a" "10357902aace2240c580fec85e5b427d98b4e80703", "916cb8963521ad75105be43cc4148e5a5bbb4fcf107f1577e4f7fa" "3ca58cd786aa76890c8e687d2353393bc16c78ec4d"}, - {&ec_hash_to_curve_p384_xmd_sha512_sswu_draft07, NID_secp384r1, + {hash_to_curve_p384_sha512_draft07, NID_secp384r1, "P384_XMD:SHA-512_SSWU_RO_TESTGEN", "a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" @@ -1264,7 +1319,7 @@ TEST(ECTest, HashToCurve) { bssl::UniquePtr p(EC_POINT_new(group.get())); ASSERT_TRUE(p); ASSERT_TRUE(test.hash_to_curve( - group.get(), &p->raw, reinterpret_cast(test.dst), + group.get(), p.get(), reinterpret_cast(test.dst), strlen(test.dst), reinterpret_cast(test.msg), strlen(test.msg))); @@ -1281,17 +1336,30 @@ TEST(ECTest, HashToCurve) { // hash-to-curve functions should check for the wrong group. bssl::UniquePtr p224(EC_GROUP_new_by_curve_name(NID_secp224r1)); ASSERT_TRUE(p224); - EC_RAW_POINT p; + bssl::UniquePtr p384(EC_GROUP_new_by_curve_name(NID_secp384r1)); + ASSERT_TRUE(p384); + EC_RAW_POINT raw; + bssl::UniquePtr p_p384(EC_POINT_new(p384.get())); + ASSERT_TRUE(p_p384); + bssl::UniquePtr p_p224(EC_POINT_new(p224.get())); + ASSERT_TRUE(p_p224); static const uint8_t kDST[] = {0, 1, 2, 3}; static const uint8_t kMessage[] = {4, 5, 6, 7}; - EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( - p224.get(), &p, kDST, sizeof(kDST), kMessage, sizeof(kMessage))); + EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha384_sswu( + p224.get(), &raw, kDST, sizeof(kDST), kMessage, sizeof(kMessage))); + EXPECT_FALSE(EC_hash_to_curve_p384_xmd_sha384_sswu( + p224.get(), p_p224.get(), kDST, sizeof(kDST), kMessage, + sizeof(kMessage))); + EXPECT_FALSE(EC_hash_to_curve_p384_xmd_sha384_sswu( + p224.get(), p_p384.get(), kDST, sizeof(kDST), kMessage, + sizeof(kMessage))); + EXPECT_FALSE(EC_hash_to_curve_p384_xmd_sha384_sswu( + p384.get(), p_p224.get(), kDST, sizeof(kDST), kMessage, + sizeof(kMessage))); // Zero-length DSTs are not allowed. - bssl::UniquePtr p384(EC_GROUP_new_by_curve_name(NID_secp384r1)); - ASSERT_TRUE(p384); - EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( - p384.get(), &p, nullptr, 0, kMessage, sizeof(kMessage))); + EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha384_sswu( + p384.get(), &raw, nullptr, 0, kMessage, sizeof(kMessage))); } TEST(ECTest, HashToScalar) { diff --git a/crypto/fipsmodule/ec/internal.h b/crypto/fipsmodule/ec/internal.h index 0d535468d0..846431fd8f 100644 --- a/crypto/fipsmodule/ec/internal.h +++ b/crypto/fipsmodule/ec/internal.h @@ -560,6 +560,12 @@ struct ec_method_st { // // This function is used in hash-to-curve and may be NULL in curves not used // with hash-to-curve. + // + // TODO(https://crbug.com/boringssl/567): hash-to-curve uses this as part of + // computing a square root, which is what compressed coordinates ultimately + // needs to avoid |BIGNUM|. Can we unify this a bit? By generalizing to + // arbitrary exponentiation, we also miss an opportunity to use a specialized + // addition chain. void (*felem_exp)(const EC_GROUP *group, EC_FELEM *out, const EC_FELEM *a, const BN_ULONG *exp, size_t num_exp); @@ -650,6 +656,11 @@ void ec_GFp_mont_mul_precomp(const EC_GROUP *group, EC_RAW_POINT *r, const EC_PRECOMP *p0, const EC_SCALAR *scalar0, const EC_PRECOMP *p1, const EC_SCALAR *scalar1, const EC_PRECOMP *p2, const EC_SCALAR *scalar2); +void ec_GFp_mont_felem_reduce(const EC_GROUP *group, EC_FELEM *out, + const BN_ULONG *words, size_t num); +void ec_GFp_mont_felem_exp(const EC_GROUP *group, EC_FELEM *out, + const EC_FELEM *a, const BN_ULONG *exp, + size_t num_exp); // ec_compute_wNAF writes the modified width-(w+1) Non-Adjacent Form (wNAF) of // |scalar| to |out|. |out| must have room for |bits| + 1 elements, each of diff --git a/crypto/fipsmodule/ec/p256-nistz.c b/crypto/fipsmodule/ec/p256-nistz.c index 996c2fe363..c56222b47f 100644 --- a/crypto/fipsmodule/ec/p256-nistz.c +++ b/crypto/fipsmodule/ec/p256-nistz.c @@ -625,6 +625,10 @@ DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistz256_method) { out->felem_sqr = ec_GFp_mont_felem_sqr; out->felem_to_bytes = ec_GFp_mont_felem_to_bytes; out->felem_from_bytes = ec_GFp_mont_felem_from_bytes; + out->felem_reduce = ec_GFp_mont_felem_reduce; + // TODO(davidben): This should use the specialized field arithmetic + // implementation, rather than the generic one. + out->felem_exp = ec_GFp_mont_felem_exp; out->scalar_inv0_montgomery = ecp_nistz256_inv0_mod_ord; out->scalar_to_montgomery_inv_vartime = ecp_nistz256_scalar_to_montgomery_inv_vartime; diff --git a/crypto/fipsmodule/ec/p256.c b/crypto/fipsmodule/ec/p256.c index bbbba948bf..d67f6c08b1 100644 --- a/crypto/fipsmodule/ec/p256.c +++ b/crypto/fipsmodule/ec/p256.c @@ -739,6 +739,10 @@ DEFINE_METHOD_FUNCTION(EC_METHOD, EC_GFp_nistp256_method) { out->felem_sqr = ec_GFp_mont_felem_sqr; out->felem_to_bytes = ec_GFp_mont_felem_to_bytes; out->felem_from_bytes = ec_GFp_mont_felem_from_bytes; + out->felem_reduce = ec_GFp_mont_felem_reduce; + // TODO(davidben): This should use the specialized field arithmetic + // implementation, rather than the generic one. + out->felem_exp = ec_GFp_mont_felem_exp; out->scalar_inv0_montgomery = ec_simple_scalar_inv0_montgomery; out->scalar_to_montgomery_inv_vartime = ec_simple_scalar_to_montgomery_inv_vartime; diff --git a/include/openssl/ec.h b/include/openssl/ec.h index 63f0c6fa3f..dd5259bb84 100644 --- a/include/openssl/ec.h +++ b/include/openssl/ec.h @@ -319,6 +319,31 @@ OPENSSL_EXPORT int EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, BN_CTX *ctx); +// Hash-to-curve. +// +// The following functions implement primitives from +// draft-irtf-cfrg-hash-to-curve-16. The |dst| parameter in each function is the +// domain separation tag and must be unique for each protocol and between the +// |hash_to_curve| and |hash_to_scalar| variants. See section 3.1 of the spec +// for additional guidance on this parameter. + +// EC_hash_to_curve_p256_xmd_sha256_sswu hashes |msg| to a point on |group| and +// writes the result to |out|, implementing the P256_XMD:SHA-256_SSWU_RO_ suite +// from draft-irtf-cfrg-hash-to-curve-16. It returns one on success and zero on +// error. +OPENSSL_EXPORT int EC_hash_to_curve_p256_xmd_sha256_sswu( + const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + +// EC_hash_to_curve_p384_xmd_sha384_sswu hashes |msg| to a point on |group| and +// writes the result to |out|, implementing the P384_XMD:SHA-384_SSWU_RO_ suite +// from draft-irtf-cfrg-hash-to-curve-16. It returns one on success and zero on +// error. +OPENSSL_EXPORT int EC_hash_to_curve_p384_xmd_sha384_sswu( + const EC_GROUP *group, EC_POINT *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len); + + // Deprecated functions. // EC_GROUP_new_curve_GFp creates a new, arbitrary elliptic curve group based diff --git a/tool/speed.cc b/tool/speed.cc index 767e03877b..b40303b212 100644 --- a/tool/speed.cc +++ b/tool/speed.cc @@ -968,24 +968,38 @@ static bool SpeedHashToCurve(const std::string &selected) { TimeResults results; { - EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); - if (group == NULL) { + const EC_GROUP *p256 = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); + if (p256 == NULL) { return false; } if (!TimeFunction(&results, [&]() -> bool { EC_RAW_POINT out; - return ec_hash_to_curve_p384_xmd_sha512_sswu_draft07( - group, &out, kLabel, sizeof(kLabel), input, sizeof(input)); + return ec_hash_to_curve_p256_xmd_sha256_sswu( + p256, &out, kLabel, sizeof(kLabel), input, sizeof(input)); })) { fprintf(stderr, "hash-to-curve failed.\n"); return false; } - results.Print("hash-to-curve P384_XMD:SHA-512_SSWU_RO_"); + results.Print("hash-to-curve P256_XMD:SHA-256_SSWU_RO_"); + + const EC_GROUP *p384 = EC_GROUP_new_by_curve_name(NID_secp384r1); + if (p384 == NULL) { + return false; + } + if (!TimeFunction(&results, [&]() -> bool { + EC_RAW_POINT out; + return ec_hash_to_curve_p384_xmd_sha384_sswu( + p384, &out, kLabel, sizeof(kLabel), input, sizeof(input)); + })) { + fprintf(stderr, "hash-to-curve failed.\n"); + return false; + } + results.Print("hash-to-curve P384_XMD:SHA-384_SSWU_RO_"); if (!TimeFunction(&results, [&]() -> bool { EC_SCALAR out; return ec_hash_to_scalar_p384_xmd_sha512_draft07( - group, &out, kLabel, sizeof(kLabel), input, sizeof(input)); + p384, &out, kLabel, sizeof(kLabel), input, sizeof(input)); })) { fprintf(stderr, "hash-to-scalar failed.\n"); return false; From de12e3cabcb466cdf96c90d9bff0d919af71d561 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Feb 2023 10:36:29 -0500 Subject: [PATCH 081/177] Unify the two copies of bn_add_words and bn_sub_words Compilers are fine at inlining functions nowadays. We can hide the BN_ULLONG vs. manual carry extraction inside an inline function. I've patterned the type signatures intentionally after Clang's builtins, in case we want to use them in the future. (Previously I wrote in https://boringssl-review.googlesource.com/c/boringssl/+/56966 that the builtins weren't good on aarch64. This wasn't quite right. Rather, they were bad on both x86_64 and aarch64 in LLVM 13, but they're fine on both in LLVM 14. My machine's Xcode was just a little old.) Change-Id: I666466dce7a146d5e49e94ff372ea018b610ef34 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57245 Commit-Queue: David Benjamin Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- crypto/fipsmodule/bn/generic.c | 142 ++++++++++----------------------- 1 file changed, 43 insertions(+), 99 deletions(-) diff --git a/crypto/fipsmodule/bn/generic.c b/crypto/fipsmodule/bn/generic.c index bf4971f160..e4f4518e94 100644 --- a/crypto/fipsmodule/bn/generic.c +++ b/crypto/fipsmodule/bn/generic.c @@ -567,145 +567,89 @@ void bn_sqr_comba4(BN_ULONG r[8], const BN_ULONG a[4]) { #if !defined(BN_ADD_ASM) -#ifdef BN_ULLONG -BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, - size_t n) { - BN_ULLONG ll = 0; - - if (n == 0) { - return 0; - } - - while (n & ~3) { - ll += (BN_ULLONG)a[0] + b[0]; - r[0] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[1] + b[1]; - r[1] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[2] + b[2]; - r[2] = (BN_ULONG)ll; - ll >>= BN_BITS2; - ll += (BN_ULLONG)a[3] + b[3]; - r[3] = (BN_ULONG)ll; - ll >>= BN_BITS2; - a += 4; - b += 4; - r += 4; - n -= 4; - } - while (n) { - ll += (BN_ULLONG)a[0] + b[0]; - r[0] = (BN_ULONG)ll; - ll >>= BN_BITS2; - a++; - b++; - r++; - n--; - } - return (BN_ULONG)ll; +// bn_add_with_carry returns |x + y + carry|, and sets |*out_carry| to the +// carry bit. |carry| must be zero or one. +static inline BN_ULONG bn_add_with_carry(BN_ULONG x, BN_ULONG y, BN_ULONG carry, + BN_ULONG *out_carry) { + assert(carry == 0 || carry == 1); +#if defined(BN_ULLONG) + BN_ULLONG ret = carry; + ret += (BN_ULLONG)x + y; + *out_carry = (BN_ULONG)(ret >> BN_BITS2); + return (BN_ULONG)ret; +#else + x += carry; + carry = x < carry; + BN_ULONG ret = x + y; + carry += ret < x; + *out_carry = carry; + return ret; +#endif } -#else // !BN_ULLONG +// bn_sub_with_borrow returns |x - y - borrow|, and sets |*out_borrow| to the +// borrow bit. |borrow| must be zero or one. +static inline BN_ULONG bn_sub_with_borrow(BN_ULONG x, BN_ULONG y, + BN_ULONG borrow, + BN_ULONG *out_borrow) { + assert(borrow == 0 || borrow == 1); + BN_ULONG ret = x - y - borrow; + *out_borrow = (x < y) | ((x == y) & borrow); + return ret; +} BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, size_t n) { - BN_ULONG c, l, t; - if (n == 0) { - return (BN_ULONG)0; + return 0; } - c = 0; + BN_ULONG carry = 0; while (n & ~3) { - t = a[0]; - t += c; - c = (t < c); - l = t + b[0]; - c += (l < t); - r[0] = l; - t = a[1]; - t += c; - c = (t < c); - l = t + b[1]; - c += (l < t); - r[1] = l; - t = a[2]; - t += c; - c = (t < c); - l = t + b[2]; - c += (l < t); - r[2] = l; - t = a[3]; - t += c; - c = (t < c); - l = t + b[3]; - c += (l < t); - r[3] = l; + r[0] = bn_add_with_carry(a[0], b[0], carry, &carry); + r[1] = bn_add_with_carry(a[1], b[1], carry, &carry); + r[2] = bn_add_with_carry(a[2], b[2], carry, &carry); + r[3] = bn_add_with_carry(a[3], b[3], carry, &carry); a += 4; b += 4; r += 4; n -= 4; } while (n) { - t = a[0]; - t += c; - c = (t < c); - l = t + b[0]; - c += (l < t); - r[0] = l; + r[0] = bn_add_with_carry(a[0], b[0], carry, &carry); a++; b++; r++; n--; } - return (BN_ULONG)c; + return carry; } -#endif // !BN_ULLONG - BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, size_t n) { - BN_ULONG t1, t2; - BN_ULONG c = 0; - if (n == 0) { return (BN_ULONG)0; } + BN_ULONG borrow = 0; while (n & ~3) { - t1 = a[0]; - t2 = b[0]; - r[0] = t1 - t2 - c; - c = (t1 < t2) | ((t1 == t2) & c); - t1 = a[1]; - t2 = b[1]; - r[1] = t1 - t2 - c; - c = (t1 < t2) | ((t1 == t2) & c); - t1 = a[2]; - t2 = b[2]; - r[2] = t1 - t2 - c; - c = (t1 < t2) | ((t1 == t2) & c); - t1 = a[3]; - t2 = b[3]; - r[3] = t1 - t2 - c; - c = (t1 < t2) | ((t1 == t2) & c); + r[0] = bn_sub_with_borrow(a[0], b[0], borrow, &borrow); + r[1] = bn_sub_with_borrow(a[1], b[1], borrow, &borrow); + r[2] = bn_sub_with_borrow(a[2], b[2], borrow, &borrow); + r[3] = bn_sub_with_borrow(a[3], b[3], borrow, &borrow); a += 4; b += 4; r += 4; n -= 4; } while (n) { - t1 = a[0]; - t2 = b[0]; - r[0] = t1 - t2 - c; - c = (t1 < t2) | ((t1 == t2) & c); + r[0] = bn_sub_with_borrow(a[0], b[0], borrow, &borrow); a++; b++; r++; n--; } - return c; + return borrow; } #endif // !BN_ADD_ASM From 0e68520eb27b1f37038e9d0772cfee1d015b50c3 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2023 20:06:30 -0500 Subject: [PATCH 082/177] Specify -Iinclude with the crypto target. It's unclear to me whether doing it target-by-target is an improvement in crypto/fipsmodule, but this otherwise does seem a bit tidier. This aligns with CMake's documentation and "modern CMake" which prefers this pattern. Change-Id: I36c81842bff8b36eeaaf5dd3e0695fb45f3376c9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56585 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/CMakeLists.txt | 4 +--- crypto/fipsmodule/CMakeLists.txt | 16 +++++----------- decrepit/CMakeLists.txt | 6 ------ fuzz/CMakeLists.txt | 5 +---- rust/CMakeLists.txt | 12 ++++-------- ssl/CMakeLists.txt | 13 +++---------- ssl/test/CMakeLists.txt | 2 -- tool/CMakeLists.txt | 2 -- util/fipstools/CMakeLists.txt | 3 --- util/fipstools/acvp/modulewrapper/CMakeLists.txt | 4 ---- util/generate_build_files.py | 3 +-- 11 files changed, 15 insertions(+), 55 deletions(-) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 1425ad54da..df3f919690 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_subdirectory(fipsmodule) add_subdirectory(test) @@ -298,7 +296,7 @@ endif() if(OPENSSL_NASM) target_sources(crypto PRIVATE ${CRYPTO_SOURCES_NASM}) endif() -target_include_directories(crypto INTERFACE +target_include_directories(crypto PUBLIC $ $ ) diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt index 66fd44838f..fc2d0dd775 100644 --- a/crypto/fipsmodule/CMakeLists.txt +++ b/crypto/fipsmodule/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../../include) - perlasm(BCM_SOURCES aarch64 aesv8-armv8 aes/asm/aesv8-armx.pl) perlasm(BCM_SOURCES aarch64 aesv8-gcm-armv8 modes/asm/aesv8-gcm-armv8.pl) perlasm(BCM_SOURCES aarch64 armv8-mont bn/asm/armv8-mont.pl) @@ -67,9 +65,8 @@ if(FIPS_DELOCATE) bcm.c ) - add_dependencies(bcm_c_generated_asm global_target) - + target_include_directories(bcm_c_generated_asm PRIVATE ../../include) set_target_properties(bcm_c_generated_asm PROPERTIES COMPILE_OPTIONS "-S") set_target_properties(bcm_c_generated_asm PROPERTIES POSITION_INDEPENDENT_CODE ON) @@ -104,9 +101,7 @@ if(FIPS_DELOCATE) bcm-delocated.S ) - add_dependencies(bcm_hashunset global_target) - set_target_properties(bcm_hashunset PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(bcm_hashunset PROPERTIES LINKER_LANGUAGE C) @@ -131,9 +126,8 @@ if(FIPS_DELOCATE) fips_shared_support.c ) - add_dependencies(fipsmodule global_target) - + target_include_directories(fipsmodule PRIVATE ../../include) set_target_properties(fipsmodule PROPERTIES LINKER_LANGUAGE C) elseif(FIPS_SHARED) if(NOT BUILD_SHARED_LIBS) @@ -147,8 +141,8 @@ elseif(FIPS_SHARED) fips_shared_support.c ) - add_dependencies(fipsmodule global_target) + target_include_directories(fipsmodule PRIVATE ../../include) add_library( bcm_library @@ -158,8 +152,8 @@ elseif(FIPS_SHARED) bcm.c ${BCM_SOURCES_ASM_USED} ) - add_dependencies(bcm_library global_target) + target_include_directories(bcm_library PRIVATE ../../include) add_custom_command( OUTPUT bcm.o @@ -179,6 +173,6 @@ else() fips_shared_support.c ${BCM_SOURCES_ASM_USED} ) - add_dependencies(fipsmodule global_target) + target_include_directories(fipsmodule PRIVATE ../../include) endif() diff --git a/decrepit/CMakeLists.txt b/decrepit/CMakeLists.txt index 2c10f0ee2a..38d6f5da98 100644 --- a/decrepit/CMakeLists.txt +++ b/decrepit/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_library( decrepit @@ -21,9 +19,7 @@ add_library( x509/x509_decrepit.c xts/xts.c ) - add_dependencies(decrepit global_target) - target_link_libraries(decrepit crypto ssl) add_executable( @@ -38,9 +34,7 @@ add_executable( $ ) - add_dependencies(decrepit_test global_target) - target_link_libraries(decrepit_test test_support_lib boringssl_gtest decrepit crypto) add_dependencies(all_tests decrepit_test) diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index 8db1b7e8cb..c6835eb775 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -1,10 +1,7 @@ -include_directories(../include) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-prototypes") - macro(fuzzer name) add_executable(${name} ${name}.cc) add_dependencies(${name} global_target) + target_compile_options(${name} PRIVATE "-Wno-missing-prototypes") target_link_libraries(${name} crypto ${ARGN}) if(LIBFUZZER_FROM_DEPS) set_target_properties(${name} PROPERTIES LINK_FLAGS "-fsanitize=fuzzer-no-link") diff --git a/rust/CMakeLists.txt b/rust/CMakeLists.txt index 9bdec3e586..344d80f5f8 100644 --- a/rust/CMakeLists.txt +++ b/rust/CMakeLists.txt @@ -1,12 +1,8 @@ -# additional interop for things like macros and inlined functions -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) -add_library( - rust_wrapper - STATIC - rust_wrapper.c -) +# Additional interop for things like macros and inlined functions. +add_library(rust_wrapper STATIC rust_wrapper.c) +target_link_libraries(rust_wrapper crypto) -# generate architecture specific wrappers +# Generate architecture-specific wrappers. set(WRAPPER_TARGET ${CMAKE_BINARY_DIR}/rust/src/wrapper_${RUST_BINDINGS}.rs) set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h" -o ${WRAPPER_TARGET} diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index b558be4fdf..ca42579447 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_library( ssl @@ -41,19 +39,16 @@ add_library( tls13_enc.cc tls13_server.cc ) -target_include_directories(ssl INTERFACE - $ - $ -) +# Although libssl also provides headers that require an include directory, the +# flag is already specified by libcrypto, so we omit target_include_directories +# here. install(TARGETS ssl EXPORT OpenSSLTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) set_property(TARGET ssl PROPERTY EXPORT_NAME SSL) - add_dependencies(ssl global_target) - target_link_libraries(ssl crypto) add_executable( @@ -65,8 +60,6 @@ add_executable( $ ) - add_dependencies(ssl_test global_target) - target_link_libraries(ssl_test test_support_lib boringssl_gtest ssl crypto) add_dependencies(all_tests ssl_test) diff --git a/ssl/test/CMakeLists.txt b/ssl/test/CMakeLists.txt index 70bb29e8c2..fa326aaaf6 100644 --- a/ssl/test/CMakeLists.txt +++ b/ssl/test/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../../include) - add_executable( bssl_shim diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index e84d229fd5..9cc7d28337 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_executable( bssl diff --git a/util/fipstools/CMakeLists.txt b/util/fipstools/CMakeLists.txt index 63593838db..87960b479c 100644 --- a/util/fipstools/CMakeLists.txt +++ b/util/fipstools/CMakeLists.txt @@ -1,12 +1,9 @@ -include_directories(../../include) - if(FIPS) add_executable( test_fips test_fips.c ) - add_dependencies(test_fips global_target) target_link_libraries(test_fips crypto) endif() diff --git a/util/fipstools/acvp/modulewrapper/CMakeLists.txt b/util/fipstools/acvp/modulewrapper/CMakeLists.txt index 267f82c37a..45a941d1a3 100644 --- a/util/fipstools/acvp/modulewrapper/CMakeLists.txt +++ b/util/fipstools/acvp/modulewrapper/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../../../../include) - if(FIPS) add_executable( modulewrapper @@ -7,8 +5,6 @@ if(FIPS) main.cc modulewrapper.cc ) - add_dependencies(modulewrapper global_target) - target_link_libraries(modulewrapper crypto) endif() diff --git a/util/generate_build_files.py b/util/generate_build_files.py index faf6d8ab14..aec36bed82 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -487,8 +487,6 @@ def __init__(self): set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) endif() -include_directories(src/include) - ''' def PrintLibrary(self, out, name, files): @@ -543,6 +541,7 @@ def WriteFiles(self, files, asm_outputs): self.PrintLibrary(cmake, 'crypto', files['crypto'] + ['${CRYPTO_SOURCES_ASM_USED}']) + cmake.write('target_include_directories(crypto PUBLIC src/include)\n') self.PrintLibrary(cmake, 'ssl', files['ssl']) self.PrintExe(cmake, 'bssl', files['tool'], ['ssl', 'crypto']) From e5f7266884922dd66fb07a92570102ff2f5d912f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 18:59:45 -0500 Subject: [PATCH 083/177] Don't include custom builds of libc++ in CMake installs Also stick the very verbose default install directory in a variable so we don't have to repeat it everywhere. Change-Id: I1a6a85c4d42d3a6e766e52b2d0ecd8e81c6ed4e3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56607 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- CMakeLists.txt | 32 +++++++++++++++++++++++++++----- crypto/CMakeLists.txt | 6 +----- ssl/CMakeLists.txt | 6 +----- tool/CMakeLists.txt | 2 +- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fa818c953..ced650d71c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,24 @@ enable_language(CXX) include(GNUInstallDirs) +# CMake versions before 3.14 do not have default destination values. Executable +# and library targets that use a default destination should include this +# variable. +if(CMAKE_VERSION VERSION_LESS "3.14") + set(INSTALL_DESTINATION_DEFAULT + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + +# Wrap the CMake install function so we can disable it. +set(INSTALL_ENABLED 1) +function(install_if_enabled) + if(INSTALL_ENABLED) + install(${ARGV}) + endif() +endfunction() + # This is a dummy target which all other targets depend on (manually - see other # CMakeLists.txt files). This gives us a hook to add any targets which need to # run before all other targets. @@ -400,6 +418,12 @@ if(USE_CUSTOM_LIBCXX) message(FATAL_ERROR "USE_CUSTOM_LIBCXX only supported with Clang") endif() + # CMake does not allow installing a library without installing dependencies. + # If we installed libcrypto, we'd have to install our custom libc++, which + # does not make sense. As this is a test-only configuration, disable + # installing. + set(INSTALL_ENABLED 0) + # CMAKE_CXX_FLAGS ends up in the linker flags as well, so use # add_compile_options. There does not appear to be a way to set # language-specific compile-only flags. @@ -433,7 +457,6 @@ if(USE_CUSTOM_LIBCXX) libcxxabi PRIVATE -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ) - install(TARGETS libcxxabi EXPORT OpenSSLTargets) add_library(libcxx ${LIBCXX_SOURCES}) if(ASAN OR MSAN OR TSAN) @@ -458,7 +481,6 @@ if(USE_CUSTOM_LIBCXX) # libc++abi depends on libc++ internal headers. set_property(TARGET libcxx libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/util/bot/libcxx/src") target_link_libraries(libcxx libcxxabi) - install(TARGETS libcxx EXPORT OpenSSLTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() # Add minimal googletest targets. The provided one has many side-effects, and @@ -562,11 +584,11 @@ add_custom_target( DEPENDS all_tests bssl_shim handshaker fips_specific_tests_if_any USES_TERMINAL) -install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install_if_enabled(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(EXPORT OpenSSLTargets +install_if_enabled(EXPORT OpenSSLTargets FILE OpenSSLTargets.cmake NAMESPACE OpenSSL:: DESTINATION lib/cmake/OpenSSL ) -install(FILES cmake/OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) +install_if_enabled(FILES cmake/OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index df3f919690..e4208ac17f 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -300,11 +300,7 @@ target_include_directories(crypto PUBLIC $ $ ) -install(TARGETS crypto EXPORT OpenSSLTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) +install_if_enabled(TARGETS crypto EXPORT OpenSSLTargets ${INSTALL_DESTINATION_DEFAULT}) set_property(TARGET crypto PROPERTY EXPORT_NAME Crypto) if(FIPS_SHARED) diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index ca42579447..beaf61ab2f 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -42,11 +42,7 @@ add_library( # Although libssl also provides headers that require an include directory, the # flag is already specified by libcrypto, so we omit target_include_directories # here. -install(TARGETS ssl EXPORT OpenSSLTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) +install_if_enabled(TARGETS ssl EXPORT OpenSSLTargets ${INSTALL_DESTINATION_DEFAULT}) set_property(TARGET ssl PROPERTY EXPORT_NAME SSL) add_dependencies(ssl global_target) target_link_libraries(ssl crypto) diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index 9cc7d28337..df5d9a7d6e 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -19,6 +19,6 @@ add_executable( tool.cc transport_common.cc ) -install(TARGETS bssl DESTINATION ${CMAKE_INSTALL_BINDIR}) +install_if_enabled(TARGETS bssl DESTINATION ${INSTALL_DESTINATION_DEFAULT}) add_dependencies(bssl global_target) target_link_libraries(bssl ssl crypto) From 8c75ed046f799f1d8b805036b1dea9c5ec0a0fb5 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 5 Feb 2023 13:44:26 -0500 Subject: [PATCH 084/177] Remove global_target from build. This was added with the generated symbol-prefixing header. But it seems to be sufficient for crypto to have a dependency on the generated header, along with some of the stray bits of delocate. It's a little unclear from CMake documentation how these are processed; normally .o files can be built before libraries are built or linked, only the link step depends on. But, empirically, if A links B, and B has a dependency on C, then CMake seems to run C before building any of A. I tested this by making a small project where the generation step slept for three seconds and running with enough parallelism that we'd have tripped. Interestingly, in the Makefile output, the individual object file targets didn't have that dependency, but the target itself did. But this was true on both A and B, so I think that just might not work. Also fix the dependency in the custom target. The old formulation broke when using an absolute path to the symbols file. Change-Id: I2053d44949f907d465da403a5ec69c191740268f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56928 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- CMakeLists.txt | 10 +++------- crypto/CMakeLists.txt | 8 +------- crypto/fipsmodule/CMakeLists.txt | 11 +++++------ crypto/test/CMakeLists.txt | 3 --- decrepit/CMakeLists.txt | 2 -- fuzz/CMakeLists.txt | 1 - ssl/CMakeLists.txt | 2 -- ssl/test/CMakeLists.txt | 6 ------ tool/CMakeLists.txt | 1 - util/fipstools/CMakeLists.txt | 1 - util/fipstools/acvp/modulewrapper/CMakeLists.txt | 1 - 11 files changed, 9 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ced650d71c..31d29317da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,11 +42,6 @@ function(install_if_enabled) endif() endfunction() -# This is a dummy target which all other targets depend on (manually - see other -# CMakeLists.txt files). This gives us a hook to add any targets which need to -# run before all other targets. -add_custom_target(global_target) - if(ANDROID) # Android-NDK CMake files reconfigure the path and so Perl won't be found. # However, ninja will still find them in $PATH if we just name them. @@ -112,7 +107,7 @@ if(BORINGSSL_PREFIX AND BORINGSSL_PREFIX_SYMBOLS) COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/symbol_prefix_include COMMAND ${GO_EXECUTABLE} run ${CMAKE_CURRENT_SOURCE_DIR}/util/make_prefix_headers.go -out ${CMAKE_CURRENT_BINARY_DIR}/symbol_prefix_include ${BORINGSSL_PREFIX_SYMBOLS} DEPENDS util/make_prefix_headers.go - ${CMAKE_BINARY_DIR}/${BORINGSSL_PREFIX_SYMBOLS}) + ${BORINGSSL_PREFIX_SYMBOLS}) # add_dependencies needs a target, not a file, so we add an intermediate # target. @@ -121,9 +116,10 @@ if(BORINGSSL_PREFIX AND BORINGSSL_PREFIX_SYMBOLS) DEPENDS symbol_prefix_include/boringssl_prefix_symbols.h symbol_prefix_include/boringssl_prefix_symbols_asm.h symbol_prefix_include/boringssl_prefix_symbols_nasm.inc) - add_dependencies(global_target boringssl_prefix_symbols) elseif(BORINGSSL_PREFIX OR BORINGSSL_PREFIX_SYMBOLS) message(FATAL_ERROR "Must specify both or neither of BORINGSSL_PREFIX and BORINGSSL_PREFIX_SYMBOLS") +else() + add_custom_target(boringssl_prefix_symbols) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index e4208ac17f..c6a0580902 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -319,7 +319,7 @@ if(FIPS_SHARED) ) endif() -add_dependencies(crypto global_target) +add_dependencies(crypto boringssl_prefix_symbols) if(FIPS_DELOCATE OR FIPS_SHARED) add_dependencies(crypto bcm_o_target) @@ -350,10 +350,7 @@ add_executable( fipsmodule/rand/urandom_test.cc ) - target_link_libraries(urandom_test test_support_lib boringssl_gtest crypto) - -add_dependencies(urandom_test global_target) add_dependencies(all_tests urandom_test) add_executable( @@ -427,8 +424,5 @@ add_executable( $ $ ) - -add_dependencies(crypto_test global_target) - target_link_libraries(crypto_test test_support_lib boringssl_gtest crypto) add_dependencies(all_tests crypto_test) diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt index fc2d0dd775..3858e8b1b3 100644 --- a/crypto/fipsmodule/CMakeLists.txt +++ b/crypto/fipsmodule/CMakeLists.txt @@ -65,7 +65,7 @@ if(FIPS_DELOCATE) bcm.c ) - add_dependencies(bcm_c_generated_asm global_target) + add_dependencies(bcm_c_generated_asm boringssl_prefix_symbols) target_include_directories(bcm_c_generated_asm PRIVATE ../../include) set_target_properties(bcm_c_generated_asm PROPERTIES COMPILE_OPTIONS "-S") set_target_properties(bcm_c_generated_asm PROPERTIES POSITION_INDEPENDENT_CODE ON) @@ -101,7 +101,6 @@ if(FIPS_DELOCATE) bcm-delocated.S ) - add_dependencies(bcm_hashunset global_target) set_target_properties(bcm_hashunset PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(bcm_hashunset PROPERTIES LINKER_LANGUAGE C) @@ -126,7 +125,7 @@ if(FIPS_DELOCATE) fips_shared_support.c ) - add_dependencies(fipsmodule global_target) + add_dependencies(fipsmodule boringssl_prefix_symbols) target_include_directories(fipsmodule PRIVATE ../../include) set_target_properties(fipsmodule PROPERTIES LINKER_LANGUAGE C) elseif(FIPS_SHARED) @@ -141,7 +140,7 @@ elseif(FIPS_SHARED) fips_shared_support.c ) - add_dependencies(fipsmodule global_target) + add_dependencies(fipsmodule boringssl_prefix_symbols) target_include_directories(fipsmodule PRIVATE ../../include) add_library( @@ -152,7 +151,7 @@ elseif(FIPS_SHARED) bcm.c ${BCM_SOURCES_ASM_USED} ) - add_dependencies(bcm_library global_target) + add_dependencies(bcm_library boringssl_prefix_symbols) target_include_directories(bcm_library PRIVATE ../../include) add_custom_command( @@ -173,6 +172,6 @@ else() fips_shared_support.c ${BCM_SOURCES_ASM_USED} ) - add_dependencies(fipsmodule global_target) + add_dependencies(fipsmodule boringssl_prefix_symbols) target_include_directories(fipsmodule PRIVATE ../../include) endif() diff --git a/crypto/test/CMakeLists.txt b/crypto/test/CMakeLists.txt index 939cbb6939..fee46ae96f 100644 --- a/crypto/test/CMakeLists.txt +++ b/crypto/test/CMakeLists.txt @@ -18,7 +18,6 @@ if(WIN32) target_link_libraries(test_support_lib dbghelp) endif() target_link_libraries(test_support_lib boringssl_gtest crypto) -add_dependencies(test_support_lib global_target) add_library( boringssl_gtest_main @@ -27,6 +26,4 @@ add_library( gtest_main.cc ) - -add_dependencies(boringssl_gtest_main global_target) target_link_libraries(boringssl_gtest_main boringssl_gtest crypto test_support_lib) diff --git a/decrepit/CMakeLists.txt b/decrepit/CMakeLists.txt index 38d6f5da98..48b0cf179f 100644 --- a/decrepit/CMakeLists.txt +++ b/decrepit/CMakeLists.txt @@ -19,7 +19,6 @@ add_library( x509/x509_decrepit.c xts/xts.c ) -add_dependencies(decrepit global_target) target_link_libraries(decrepit crypto ssl) add_executable( @@ -34,7 +33,6 @@ add_executable( $ ) -add_dependencies(decrepit_test global_target) target_link_libraries(decrepit_test test_support_lib boringssl_gtest decrepit crypto) add_dependencies(all_tests decrepit_test) diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index c6835eb775..7856f55a5c 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -1,6 +1,5 @@ macro(fuzzer name) add_executable(${name} ${name}.cc) - add_dependencies(${name} global_target) target_compile_options(${name} PRIVATE "-Wno-missing-prototypes") target_link_libraries(${name} crypto ${ARGN}) if(LIBFUZZER_FROM_DEPS) diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index beaf61ab2f..147ab58f42 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -44,7 +44,6 @@ add_library( # here. install_if_enabled(TARGETS ssl EXPORT OpenSSLTargets ${INSTALL_DESTINATION_DEFAULT}) set_property(TARGET ssl PROPERTY EXPORT_NAME SSL) -add_dependencies(ssl global_target) target_link_libraries(ssl crypto) add_executable( @@ -56,6 +55,5 @@ add_executable( $ ) -add_dependencies(ssl_test global_target) target_link_libraries(ssl_test test_support_lib boringssl_gtest ssl crypto) add_dependencies(all_tests ssl_test) diff --git a/ssl/test/CMakeLists.txt b/ssl/test/CMakeLists.txt index fa326aaaf6..110c6833f3 100644 --- a/ssl/test/CMakeLists.txt +++ b/ssl/test/CMakeLists.txt @@ -10,9 +10,6 @@ add_executable( test_config.cc test_state.cc ) - -add_dependencies(bssl_shim global_target) - target_link_libraries(bssl_shim ssl crypto) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") @@ -28,9 +25,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") test_config.cc test_state.cc ) - - add_dependencies(handshaker global_target) - target_link_libraries(handshaker ssl crypto) else() # Declare a dummy target for run_tests to depend on. diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index df5d9a7d6e..5047108898 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -20,5 +20,4 @@ add_executable( transport_common.cc ) install_if_enabled(TARGETS bssl DESTINATION ${INSTALL_DESTINATION_DEFAULT}) -add_dependencies(bssl global_target) target_link_libraries(bssl ssl crypto) diff --git a/util/fipstools/CMakeLists.txt b/util/fipstools/CMakeLists.txt index 87960b479c..87abf0ab1c 100644 --- a/util/fipstools/CMakeLists.txt +++ b/util/fipstools/CMakeLists.txt @@ -4,6 +4,5 @@ if(FIPS) test_fips.c ) - add_dependencies(test_fips global_target) target_link_libraries(test_fips crypto) endif() diff --git a/util/fipstools/acvp/modulewrapper/CMakeLists.txt b/util/fipstools/acvp/modulewrapper/CMakeLists.txt index 45a941d1a3..7938d39003 100644 --- a/util/fipstools/acvp/modulewrapper/CMakeLists.txt +++ b/util/fipstools/acvp/modulewrapper/CMakeLists.txt @@ -5,6 +5,5 @@ if(FIPS) main.cc modulewrapper.cc ) - add_dependencies(modulewrapper global_target) target_link_libraries(modulewrapper crypto) endif() From 503ba98910d9a838a3cc8ab465ba507abcdac2b2 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 14 Feb 2023 11:08:56 -0700 Subject: [PATCH 085/177] Remove proxy certificate support. Nothing uses this, and the code is somewhat decrepit. Instead of fixing it and continuing to maintain it as attack surface, we send this off to the farm where it can run and play all day with the other unused X.509 extensions. Update-note: This removes the proxy certificate extension from the recognized certificate extensions. Previously by default a certificate with a critical proxy certificate extension would have been rejected with "proxy certificate not allowed", but will now be rejected with an unrecognized critical extension error. Fixed: 568 Change-Id: I5f838d69c59517254b4fa83f6e2abe6057fa66c7 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57265 Commit-Queue: Bob Beck Reviewed-by: David Benjamin Auto-Submit: Bob Beck --- crypto/CMakeLists.txt | 2 - crypto/x509/internal.h | 1 - crypto/x509/x509_vfy.c | 40 +----- crypto/x509v3/ext_dat.h | 3 +- crypto/x509v3/v3_pci.c | 275 --------------------------------------- crypto/x509v3/v3_pcia.c | 54 -------- crypto/x509v3/v3_purp.c | 25 +--- include/openssl/x509.h | 2 +- include/openssl/x509v3.h | 15 --- 9 files changed, 4 insertions(+), 413 deletions(-) delete mode 100644 crypto/x509v3/v3_pci.c delete mode 100644 crypto/x509v3/v3_pcia.c diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index c6a0580902..4ae3883a34 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -278,8 +278,6 @@ add_library( x509v3/v3_lib.c x509v3/v3_ncons.c x509v3/v3_ocsp.c - x509v3/v3_pci.c - x509v3/v3_pcia.c x509v3/v3_pcons.c x509v3/v3_pmaps.c x509v3/v3_prn.c diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h index 407dcd7b3e..45c3fcce11 100644 --- a/crypto/x509/internal.h +++ b/crypto/x509/internal.h @@ -147,7 +147,6 @@ struct x509_st { CRYPTO_EX_DATA ex_data; // These contain copies of various extension values long ex_pathlen; - long ex_pcpathlen; uint32_t ex_flags; uint32_t ex_kusage; uint32_t ex_xkusage; diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index 7f3e232730..2f6a38266b 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -543,22 +543,18 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { X509 *x; int proxy_path_length = 0; int purpose; - int allow_proxy_certs; enum { // ca_or_leaf allows either type of certificate so that direct use of // self-signed certificates works. ca_or_leaf, must_be_ca, - must_not_be_ca, } ca_requirement; // CRL path validation if (ctx->parent) { - allow_proxy_certs = 0; purpose = X509_PURPOSE_CRL_SIGN; } else { - allow_proxy_certs = !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS); purpose = ctx->param->purpose; } @@ -578,28 +574,11 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { goto end; } } - if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY)) { - ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED; - ctx->error_depth = i; - ctx->current_cert = x; - ok = ctx->verify_cb(0, ctx); - if (!ok) { - goto end; - } - } switch (ca_requirement) { case ca_or_leaf: ret = 1; break; - case must_not_be_ca: - if (X509_check_ca(x)) { - ret = 0; - ctx->error = X509_V_ERR_INVALID_NON_CA; - } else { - ret = 1; - } - break; case must_be_ca: if (!X509_check_ca(x)) { ret = 0; @@ -649,24 +628,7 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { if (!(x->ex_flags & EXFLAG_SI)) { plen++; } - // If this certificate is a proxy certificate, the next certificate - // must be another proxy certificate or a EE certificate. If not, - // the next certificate must be a CA certificate. - if (x->ex_flags & EXFLAG_PROXY) { - if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) { - ctx->error = X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED; - ctx->error_depth = i; - ctx->current_cert = x; - ok = ctx->verify_cb(0, ctx); - if (!ok) { - goto end; - } - } - proxy_path_length++; - ca_requirement = must_not_be_ca; - } else { - ca_requirement = must_be_ca; - } + ca_requirement = must_be_ca; } ok = 1; end: diff --git a/crypto/x509v3/ext_dat.h b/crypto/x509v3/ext_dat.h index 2491431056..0d32769904 100644 --- a/crypto/x509v3/ext_dat.h +++ b/crypto/x509v3/ext_dat.h @@ -69,7 +69,7 @@ extern const X509V3_EXT_METHOD v3_delta_crl, v3_cpols, v3_crld, v3_freshest_crl; extern const X509V3_EXT_METHOD v3_ocsp_nonce, v3_ocsp_accresp, v3_ocsp_acutoff; extern const X509V3_EXT_METHOD v3_ocsp_crlid, v3_ocsp_nocheck, v3_ocsp_serviceloc; -extern const X509V3_EXT_METHOD v3_crl_hold, v3_pci; +extern const X509V3_EXT_METHOD v3_crl_hold; extern const X509V3_EXT_METHOD v3_policy_mappings, v3_policy_constraints; extern const X509V3_EXT_METHOD v3_name_constraints, v3_inhibit_anyp, v3_idp; extern const X509V3_EXT_METHOD v3_addr, v3_asid; @@ -116,7 +116,6 @@ static const X509V3_EXT_METHOD *const standard_exts[] = { #ifndef OPENSSL_NO_OCSP &v3_crl_hold, #endif - &v3_pci, &v3_name_constraints, &v3_policy_mappings, &v3_inhibit_anyp, diff --git a/crypto/x509v3/v3_pci.c b/crypto/x509v3/v3_pci.c deleted file mode 100644 index f6b380248d..0000000000 --- a/crypto/x509v3/v3_pci.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Contributed to the OpenSSL Project 2004 by Richard Levitte - * (richard@levitte.org) - */ -/* Copyright (c) 2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -#include -#include -#include -#include -#include - -#include "../internal.h" -#include "internal.h" - - -static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out, - int indent); -static void *r2i_pci(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, - const char *str); - -const X509V3_EXT_METHOD v3_pci = { - NID_proxyCertInfo, - 0, - ASN1_ITEM_ref(PROXY_CERT_INFO_EXTENSION), - 0, - 0, - 0, - 0, - 0, - 0, - NULL, - NULL, - i2r_pci, - r2i_pci, - NULL, -}; - -static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out, - int indent) { - const PROXY_CERT_INFO_EXTENSION *pci = ext; - BIO_printf(out, "%*sPath Length Constraint: ", indent, ""); - if (pci->pcPathLengthConstraint) { - i2a_ASN1_INTEGER(out, pci->pcPathLengthConstraint); - } else { - BIO_printf(out, "infinite"); - } - BIO_puts(out, "\n"); - BIO_printf(out, "%*sPolicy Language: ", indent, ""); - i2a_ASN1_OBJECT(out, pci->proxyPolicy->policyLanguage); - BIO_puts(out, "\n"); - if (pci->proxyPolicy->policy && pci->proxyPolicy->policy->data) { - BIO_printf(out, "%*sPolicy Text: %.*s\n", indent, "", - pci->proxyPolicy->policy->length, - pci->proxyPolicy->policy->data); - } - return 1; -} - -static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language, - ASN1_INTEGER **pathlen, - ASN1_OCTET_STRING **policy) { - int free_policy = 0; - - if (strcmp(val->name, "language") == 0) { - if (*language) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED); - X509V3_conf_err(val); - return 0; - } - if (!(*language = OBJ_txt2obj(val->value, 0))) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); - X509V3_conf_err(val); - return 0; - } - } else if (strcmp(val->name, "pathlen") == 0) { - if (*pathlen) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED); - X509V3_conf_err(val); - return 0; - } - if (!X509V3_get_value_int(val, pathlen)) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH); - X509V3_conf_err(val); - return 0; - } - } else if (strcmp(val->name, "policy") == 0) { - unsigned char *tmp_data = NULL; - long val_len; - if (!*policy) { - *policy = ASN1_OCTET_STRING_new(); - if (!*policy) { - X509V3_conf_err(val); - return 0; - } - free_policy = 1; - } - if (strncmp(val->value, "hex:", 4) == 0) { - unsigned char *tmp_data2 = x509v3_hex_to_bytes(val->value + 4, &val_len); - - if (!tmp_data2) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT); - X509V3_conf_err(val); - goto err; - } - - tmp_data = - OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1); - if (tmp_data) { - (*policy)->data = tmp_data; - OPENSSL_memcpy(&(*policy)->data[(*policy)->length], tmp_data2, val_len); - (*policy)->length += val_len; - (*policy)->data[(*policy)->length] = '\0'; - } else { - OPENSSL_free(tmp_data2); - // realloc failure implies the original data space is b0rked - // too! - (*policy)->data = NULL; - (*policy)->length = 0; - X509V3_conf_err(val); - goto err; - } - OPENSSL_free(tmp_data2); - } else if (strncmp(val->value, "text:", 5) == 0) { - val_len = strlen(val->value + 5); - tmp_data = - OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1); - if (tmp_data) { - (*policy)->data = tmp_data; - OPENSSL_memcpy(&(*policy)->data[(*policy)->length], val->value + 5, - val_len); - (*policy)->length += val_len; - (*policy)->data[(*policy)->length] = '\0'; - } else { - // realloc failure implies the original data space is b0rked - // too! - (*policy)->data = NULL; - (*policy)->length = 0; - X509V3_conf_err(val); - goto err; - } - } else { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG); - X509V3_conf_err(val); - goto err; - } - if (!tmp_data) { - X509V3_conf_err(val); - goto err; - } - } - return 1; -err: - if (free_policy) { - ASN1_OCTET_STRING_free(*policy); - *policy = NULL; - } - return 0; -} - -static void *r2i_pci(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, - const char *value) { - PROXY_CERT_INFO_EXTENSION *pci = NULL; - STACK_OF(CONF_VALUE) *vals; - ASN1_OBJECT *language = NULL; - ASN1_INTEGER *pathlen = NULL; - ASN1_OCTET_STRING *policy = NULL; - int nid; - - vals = X509V3_parse_list(value); - for (size_t i = 0; i < sk_CONF_VALUE_num(vals); i++) { - CONF_VALUE *cnf = sk_CONF_VALUE_value(vals, i); - if (!cnf->name || (*cnf->name != '@' && !cnf->value)) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING); - X509V3_conf_err(cnf); - goto err; - } - if (*cnf->name == '@') { - const STACK_OF(CONF_VALUE) *sect = X509V3_get_section(ctx, cnf->name + 1); - if (!sect) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION); - X509V3_conf_err(cnf); - goto err; - } - for (size_t j = 0; j < sk_CONF_VALUE_num(sect); j++) { - if (!process_pci_value(sk_CONF_VALUE_value(sect, j), &language, - &pathlen, &policy)) { - goto err; - } - } - } else { - if (!process_pci_value(cnf, &language, &pathlen, &policy)) { - X509V3_conf_err(cnf); - goto err; - } - } - } - - // Language is mandatory - if (!language) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED); - goto err; - } - nid = OBJ_obj2nid(language); - if ((nid == NID_Independent || nid == NID_id_ppl_inheritAll) && policy) { - OPENSSL_PUT_ERROR(X509V3, - X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY); - goto err; - } - - pci = PROXY_CERT_INFO_EXTENSION_new(); - if (!pci) { - goto err; - } - - pci->proxyPolicy->policyLanguage = language; - language = NULL; - pci->proxyPolicy->policy = policy; - policy = NULL; - pci->pcPathLengthConstraint = pathlen; - pathlen = NULL; - goto end; -err: - if (language) { - ASN1_OBJECT_free(language); - language = NULL; - } - if (pathlen) { - ASN1_INTEGER_free(pathlen); - pathlen = NULL; - } - if (policy) { - ASN1_OCTET_STRING_free(policy); - policy = NULL; - } - if (pci) { - PROXY_CERT_INFO_EXTENSION_free(pci); - pci = NULL; - } -end: - sk_CONF_VALUE_pop_free(vals, X509V3_conf_free); - return pci; -} diff --git a/crypto/x509v3/v3_pcia.c b/crypto/x509v3/v3_pcia.c deleted file mode 100644 index e388eb6ab9..0000000000 --- a/crypto/x509v3/v3_pcia.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Contributed to the OpenSSL Project 2004 by Richard Levitte - * (richard@levitte.org) - */ -/* Copyright (c) 2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include - - -ASN1_SEQUENCE(PROXY_POLICY) = { - ASN1_SIMPLE(PROXY_POLICY, policyLanguage, ASN1_OBJECT), - ASN1_OPT(PROXY_POLICY, policy, ASN1_OCTET_STRING), -} ASN1_SEQUENCE_END(PROXY_POLICY) - -IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_POLICY) - -ASN1_SEQUENCE(PROXY_CERT_INFO_EXTENSION) = { - ASN1_OPT(PROXY_CERT_INFO_EXTENSION, pcPathLengthConstraint, ASN1_INTEGER), - ASN1_SIMPLE(PROXY_CERT_INFO_EXTENSION, proxyPolicy, PROXY_POLICY), -} ASN1_SEQUENCE_END(PROXY_CERT_INFO_EXTENSION) - -IMPLEMENT_ASN1_FUNCTIONS_const(PROXY_CERT_INFO_EXTENSION) diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c index 9f22f1acec..71b2c6d1ca 100644 --- a/crypto/x509v3/v3_purp.c +++ b/crypto/x509v3/v3_purp.c @@ -330,7 +330,6 @@ int X509_supported_extension(const X509_EXTENSION *ex) { NID_certificate_policies, // 89 NID_ext_key_usage, // 126 NID_policy_constraints, // 401 - NID_proxyCertInfo, // 663 NID_name_constraints, // 666 NID_policy_mappings, // 747 NID_inhibit_any_policy // 748 @@ -396,7 +395,6 @@ static int setup_crldp(X509 *x) { int x509v3_cache_extensions(X509 *x) { BASIC_CONSTRAINTS *bs; - PROXY_CERT_INFO_EXTENSION *pci; ASN1_BIT_STRING *usage; ASN1_BIT_STRING *ns; EXTENDED_KEY_USAGE *extusage; @@ -449,23 +447,6 @@ int x509v3_cache_extensions(X509 *x) { } else if (j != -1) { x->ex_flags |= EXFLAG_INVALID; } - // Handle proxy certificates - if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, &j, NULL))) { - if (x->ex_flags & EXFLAG_CA || - X509_get_ext_by_NID(x, NID_subject_alt_name, -1) >= 0 || - X509_get_ext_by_NID(x, NID_issuer_alt_name, -1) >= 0) { - x->ex_flags |= EXFLAG_INVALID; - } - if (pci->pcPathLengthConstraint) { - x->ex_pcpathlen = ASN1_INTEGER_get(pci->pcPathLengthConstraint); - } else { - x->ex_pcpathlen = -1; - } - PROXY_CERT_INFO_EXTENSION_free(pci); - x->ex_flags |= EXFLAG_PROXY; - } else if (j != -1) { - x->ex_flags |= EXFLAG_INVALID; - } // Handle key usage if ((usage = X509_get_ext_d2i(x, NID_key_usage, &j, NULL))) { if (usage->length > 0) { @@ -797,11 +778,7 @@ int X509_check_issued(X509 *issuer, X509 *subject) { } } - if (subject->ex_flags & EXFLAG_PROXY) { - if (ku_reject(issuer, KU_DIGITAL_SIGNATURE)) { - return X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE; - } - } else if (ku_reject(issuer, KU_KEY_CERT_SIGN)) { + if (ku_reject(issuer, KU_KEY_CERT_SIGN)) { return X509_V_ERR_KEYUSAGE_NO_CERTSIGN; } return X509_V_OK; diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 179c5707a4..4141007ede 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -2564,7 +2564,7 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); #define X509_V_FLAG_IGNORE_CRITICAL 0x10 // Does nothing as its functionality has been enabled by default. #define X509_V_FLAG_X509_STRICT 0x00 -// Enable proxy certificate validation +// This flag does nothing as proxy certificate support has been removed. #define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 // Enable policy checking #define X509_V_FLAG_POLICY_CHECK 0x80 diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h index 04b3cb925c..a26e361cd8 100644 --- a/include/openssl/x509v3.h +++ b/include/openssl/x509v3.h @@ -297,20 +297,6 @@ typedef struct POLICY_CONSTRAINTS_st { ASN1_INTEGER *inhibitPolicyMapping; } POLICY_CONSTRAINTS; -// Proxy certificate structures, see RFC 3820 -typedef struct PROXY_POLICY_st { - ASN1_OBJECT *policyLanguage; - ASN1_OCTET_STRING *policy; -} PROXY_POLICY; - -typedef struct PROXY_CERT_INFO_EXTENSION_st { - ASN1_INTEGER *pcPathLengthConstraint; - PROXY_POLICY *proxyPolicy; -} PROXY_CERT_INFO_EXTENSION; - -DECLARE_ASN1_FUNCTIONS_const(PROXY_POLICY) -DECLARE_ASN1_FUNCTIONS_const(PROXY_CERT_INFO_EXTENSION) - struct ISSUING_DIST_POINT_st { DIST_POINT_NAME *distpoint; int onlyuser; @@ -352,7 +338,6 @@ struct ISSUING_DIST_POINT_st { #define EXFLAG_INVALID 0x80 #define EXFLAG_SET 0x100 #define EXFLAG_CRITICAL 0x200 -#define EXFLAG_PROXY 0x400 #define EXFLAG_FRESHEST 0x1000 // Self signed From ca1690e221677cea3fb946f324eb89d846ec53f2 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Feb 2023 16:07:45 -0500 Subject: [PATCH 086/177] Tidy up check_chain_extensions after proxy certificate removal Change-Id: I0b1ba546374aa8b0fe79528f56e19f261536e565 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57305 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509/x509_vfy.c | 73 +++++++++++------------------------------- 1 file changed, 19 insertions(+), 54 deletions(-) diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index 2f6a38266b..fe6c596510 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -539,31 +539,15 @@ static int get_issuer_sk(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) { // purpose static int check_chain_extensions(X509_STORE_CTX *ctx) { - int i, ok = 0, plen = 0; - X509 *x; - int proxy_path_length = 0; - int purpose; + int ok = 0, plen = 0; - enum { - // ca_or_leaf allows either type of certificate so that direct use of - // self-signed certificates works. - ca_or_leaf, - must_be_ca, - } ca_requirement; - - // CRL path validation - if (ctx->parent) { - purpose = X509_PURPOSE_CRL_SIGN; - } else { - purpose = ctx->param->purpose; - } - - ca_requirement = ca_or_leaf; + // If |ctx->parent| is set, this is CRL path validation. + int purpose = + ctx->parent == NULL ? ctx->param->purpose : X509_PURPOSE_CRL_SIGN; // Check all untrusted certificates - for (i = 0; i < ctx->last_untrusted; i++) { - int ret; - x = sk_X509_value(ctx->chain, i); + for (int i = 0; i < ctx->last_untrusted; i++) { + X509 *x = sk_X509_value(ctx->chain, i); if (!(ctx->param->flags & X509_V_FLAG_IGNORE_CRITICAL) && (x->ex_flags & EXFLAG_CRITICAL)) { ctx->error = X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION; @@ -575,24 +559,9 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { } } - switch (ca_requirement) { - case ca_or_leaf: - ret = 1; - break; - case must_be_ca: - if (!X509_check_ca(x)) { - ret = 0; - ctx->error = X509_V_ERR_INVALID_CA; - } else { - ret = 1; - } - break; - default: - // impossible. - ret = 0; - } - - if (ret == 0) { + int must_be_ca = i > 0; + if (must_be_ca && !X509_check_ca(x)) { + ctx->error = X509_V_ERR_INVALID_CA; ctx->error_depth = i; ctx->current_cert = x; ok = ctx->verify_cb(0, ctx); @@ -600,22 +569,19 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { goto end; } } - if (ctx->param->purpose > 0) { - ret = X509_check_purpose(x, purpose, ca_requirement == must_be_ca); - if (ret != 1) { - ret = 0; - ctx->error = X509_V_ERR_INVALID_PURPOSE; - ctx->error_depth = i; - ctx->current_cert = x; - ok = ctx->verify_cb(0, ctx); - if (!ok) { - goto end; - } + if (ctx->param->purpose > 0 && + X509_check_purpose(x, purpose, must_be_ca) != 1) { + ctx->error = X509_V_ERR_INVALID_PURPOSE; + ctx->error_depth = i; + ctx->current_cert = x; + ok = ctx->verify_cb(0, ctx); + if (!ok) { + goto end; } } // Check pathlen if not self issued - if ((i > 1) && !(x->ex_flags & EXFLAG_SI) && (x->ex_pathlen != -1) && - (plen > (x->ex_pathlen + proxy_path_length + 1))) { + if (i > 1 && !(x->ex_flags & EXFLAG_SI) && x->ex_pathlen != -1 && + plen > x->ex_pathlen + 1) { ctx->error = X509_V_ERR_PATH_LENGTH_EXCEEDED; ctx->error_depth = i; ctx->current_cert = x; @@ -628,7 +594,6 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { if (!(x->ex_flags & EXFLAG_SI)) { plen++; } - ca_requirement = must_be_ca; } ok = 1; end: From b8b924caa4619001a3376b8d84e2dc9ce95d7089 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Feb 2023 16:43:50 -0500 Subject: [PATCH 087/177] Use --allowlist-file in bssl-sys bindgen, by default, will bind every random symbol in the libc, which is clearly unreasonable. Now that --allowlist-file exists, we can switch to doing what it should have done from the beginning. This produces a pretty large diff in the bindgen output, but it's all to exclude miscellaneous bits of libc. Change-Id: I9a35fda10ff6f1b82449919f9fcc2ea86ad5b802 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57325 Auto-Submit: David Benjamin Reviewed-by: Alex Gaynor Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- rust/CMakeLists.txt | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/rust/CMakeLists.txt b/rust/CMakeLists.txt index 344d80f5f8..019976bcc1 100644 --- a/rust/CMakeLists.txt +++ b/rust/CMakeLists.txt @@ -12,23 +12,8 @@ set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h" --size_t-is-usize --default-macro-constant-type="signed" --rustified-enum="point_conversion_form_t" - # These are not BoringSSL symbols, they are from glibc - # and are not relevant to the build besides throwing warnings - # about their 'long double' (aka u128) not being FFI safe. - # We block those functions so that the build doesn't - # spam warnings. - # - # https://github.com/rust-lang/rust-bindgen/issues/1549 describes the current problem - # and other folks' solutions. - # - # We will explore migrating to https://github.com/rust-lang/rust-bindgen/pull/2122 - # when it lands - --blocklist-function="strtold" - --blocklist-function="qecvt" - --blocklist-function="qecvt_r" - --blocklist-function="qgcvt" - --blocklist-function="qfcvt" - --blocklist-function="qfcvt_r" + --allowlist-file=".*/include/openssl/.*\\.h" + --allowlist-file=".*/rust_wrapper\\.h" -- # these are LLVM arg passthroughs -I../include # https://doc.rust-lang.org/nightly/rustc/platform-support.html From f30c031f0b42280edce0bfc66ef1f7486b015820 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 10 Feb 2023 16:51:30 -0500 Subject: [PATCH 088/177] Update build tools Change-Id: I5682358b5564dbaa734c5910c11a8274e88ca67a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57186 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- util/bot/DEPS | 10 +++++----- util/bot/update_clang.py | 4 ++-- util/bot/vs_toolchain.py | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/util/bot/DEPS b/util/bot/DEPS index d8f93e0c4f..0bcd2aa9b0 100644 --- a/util/bot/DEPS +++ b/util/bot/DEPS @@ -25,18 +25,18 @@ vars = { # cipd describe PACKAGE_NAME -version latest # infra/3pp/tools/cmake/linux-amd64 - 'cmake_version': 'version:2@3.25.0.chromium.5', + 'cmake_version': 'version:2@3.25.2.chromium.6', # infra/3pp/tools/go/linux-amd64 - 'go_version': 'version:2@1.19.3', + 'go_version': 'version:2@1.20', # Update the following from # https://chromium.googlesource.com/chromium/src/+/main/DEPS 'android_sdk_platform-tools_version': 'RSI3iwryh7URLGRgJHsCvUxj092woTPnKt4pwFcJ6L8C', 'android_ndk_revision': '8388a2be5421311dc75c5f937aae13d821a27f3d', 'libfuzzer_revision': 'debe7d2d1982e540fbd6bd78604bf001753f9e74', - 'libcxx_revision': 'cd0a05047451dfbdef5ba85f97ac4888e432a377', - 'libcxxabi_revision': '1a32724f721e1c3b6c590a07fe4a954344f15e48', - 'ninja_version': 'version:2@1.8.2.chromium.3', + 'libcxx_revision': '7f648d9b44c2876dfc4329256a6c0750e1e77c7f', + 'libcxxabi_revision': 'b74d7716111d7eda5c03cb8f5dfc940e1c2c0030', + 'ninja_version': 'version:2@1.11.1.chromium.6', } deps = { diff --git a/util/bot/update_clang.py b/util/bot/update_clang.py index 0970514093..92ff3ac600 100644 --- a/util/bot/update_clang.py +++ b/util/bot/update_clang.py @@ -28,8 +28,8 @@ # CLANG_REVISION and CLANG_SUB_REVISION determine the build of clang # to use. These should be synced with tools/clang/scripts/update.py in # Chromium. -CLANG_REVISION = 'llvmorg-16-init-10736-ged9638c4' -CLANG_SUB_REVISION = 1 +CLANG_REVISION = 'llvmorg-16-init-17653-g39da55e8' +CLANG_SUB_REVISION = 3 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) diff --git a/util/bot/vs_toolchain.py b/util/bot/vs_toolchain.py index df4637fb6e..07c9febedc 100644 --- a/util/bot/vs_toolchain.py +++ b/util/bot/vs_toolchain.py @@ -68,9 +68,9 @@ def _GetDesiredVsToolchainHashes(version): # libraries. return ['418b3076791776573a815eb298c8aa590307af63'] if version == '2019': - # VS 2019 16.61 with 10.0.20348.0 SDK, 10.0.19041 version of Debuggers + # VS 2019 16.61 with 10.0.20348.0 SDK, 10.0.22621.755 version of Debuggers, # with ARM64 libraries and UWP support. - return ['1023ce2e82'] + return ['0b5ee4d2b1'] raise Exception('Unsupported VS version %s' % version) From 987dff1a9fa953a8c7dffa369d78caae02b8d9ab Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 15 Feb 2023 11:04:01 -0500 Subject: [PATCH 089/177] Make boringssl_gtest_main a STATIC library Prior to 3.12 (which we won't be requiring until July), OBJECT libraries cannot be used with target_link_libraries. That means they cannot pick up INTERFACE_INCLUDE_DIRECTORIES, which makes them pretty unusable in the "modern CMake" style. Just switch it to a static library to unbreak the build in CMake 3.10. For some link ordering reason I don't understand, this also requires explicitly linking boringssl_gtest to libcxx when we USE_CUSTOM_LIBCXX is set. Change-Id: Ia9d8351551f5da060248aa3ca73fe04473bf62aa Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57345 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- CMakeLists.txt | 3 +++ crypto/CMakeLists.txt | 3 +-- crypto/test/CMakeLists.txt | 8 +------- decrepit/CMakeLists.txt | 6 ++---- ssl/CMakeLists.txt | 4 +--- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31d29317da..d99ce4cf8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -482,6 +482,9 @@ endif() # Add minimal googletest targets. The provided one has many side-effects, and # googletest has a very straightforward build. add_library(boringssl_gtest third_party/googletest/src/gtest-all.cc) +if(USE_CUSTOM_LIBCXX) + target_link_libraries(boringssl_gtest libcxx) +endif() target_include_directories( boringssl_gtest PUBLIC third_party/googletest/include diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 4ae3883a34..05a76d89ea 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -420,7 +420,6 @@ add_executable( x509v3/tab_test.cc $ - $ ) -target_link_libraries(crypto_test test_support_lib boringssl_gtest crypto) +target_link_libraries(crypto_test test_support_lib boringssl_gtest_main crypto) add_dependencies(all_tests crypto_test) diff --git a/crypto/test/CMakeLists.txt b/crypto/test/CMakeLists.txt index fee46ae96f..9bfa2ec5a3 100644 --- a/crypto/test/CMakeLists.txt +++ b/crypto/test/CMakeLists.txt @@ -19,11 +19,5 @@ if(WIN32) endif() target_link_libraries(test_support_lib boringssl_gtest crypto) -add_library( - boringssl_gtest_main - - OBJECT - - gtest_main.cc -) +add_library(boringssl_gtest_main STATIC gtest_main.cc) target_link_libraries(boringssl_gtest_main boringssl_gtest crypto test_support_lib) diff --git a/decrepit/CMakeLists.txt b/decrepit/CMakeLists.txt index 48b0cf179f..927882e943 100644 --- a/decrepit/CMakeLists.txt +++ b/decrepit/CMakeLists.txt @@ -30,9 +30,7 @@ add_executable( evp/evp_test.cc ripemd/ripemd_test.cc xts/xts_test.cc - - $ ) -target_link_libraries(decrepit_test test_support_lib boringssl_gtest decrepit - crypto) +target_link_libraries(decrepit_test test_support_lib boringssl_gtest_main + decrepit crypto) add_dependencies(all_tests decrepit_test) diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index 147ab58f42..d8d997e343 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -52,8 +52,6 @@ add_executable( span_test.cc ssl_test.cc ssl_c_test.c - - $ ) -target_link_libraries(ssl_test test_support_lib boringssl_gtest ssl crypto) +target_link_libraries(ssl_test test_support_lib boringssl_gtest_main ssl crypto) add_dependencies(all_tests ssl_test) From 890c201d4ac9c345c304d646365fe077cf2b60c1 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 8 Feb 2023 15:24:47 -0500 Subject: [PATCH 090/177] Make EVP_PKEY opaque. While hiding 'type' isn't such a huge deal, accessing 'pkey' without a type check is very dangerous. The accessors are type-checked and avoid this problem. It also gets us slightly closer to not needing to utter CRYPTO_refcount_t in public headers, as we're currently not quite declaring it right. And it allows us to remove another union: https://boringssl-review.googlesource.com/c/boringssl/+/57106 This matches what upstream did in OpenSSL 1.1.0. Update-Note: Code that reaches into the EVP_PKEY struct will no longer compile, like in OpenSSL. I believe I've fixed all the cases. If I missed any, the fix is to switch code to accessors. EVP_PKEY_id(pkey) for pkey->type is the most common fix. Change-Id: Ibe8d6b6cb8fbd141ea1cef0d02dc1ae3703e9469 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57105 Auto-Submit: David Benjamin Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/evp/internal.h | 19 +++++++++++++++++++ crypto/evp/print.c | 22 +++++++++++----------- crypto/x509/i2d_pr.c | 6 +++--- crypto/x509/x509_req.c | 7 +------ include/openssl/evp.h | 23 ----------------------- ssl/ssl_cert.cc | 4 ++-- ssl/ssl_privkey.cc | 2 +- 7 files changed, 37 insertions(+), 46 deletions(-) diff --git a/crypto/evp/internal.h b/crypto/evp/internal.h index f189d4e698..09f15aef4a 100644 --- a/crypto/evp/internal.h +++ b/crypto/evp/internal.h @@ -128,6 +128,25 @@ struct evp_pkey_asn1_method_st { void (*pkey_free)(EVP_PKEY *pkey); } /* EVP_PKEY_ASN1_METHOD */; +struct evp_pkey_st { + CRYPTO_refcount_t references; + + // type contains one of the EVP_PKEY_* values or NID_undef and determines + // which element (if any) of the |pkey| union is valid. + int type; + + union { + void *ptr; + RSA *rsa; + DSA *dsa; + DH *dh; + EC_KEY *ec; + } pkey; + + // ameth contains a pointer to a method table that contains many ASN.1 + // methods for the key type. + const EVP_PKEY_ASN1_METHOD *ameth; +} /* EVP_PKEY */; #define EVP_PKEY_OP_UNDEFINED 0 #define EVP_PKEY_OP_KEYGEN (1 << 2) diff --git a/crypto/evp/print.c b/crypto/evp/print.c index ed0fb0eeca..925074e5ae 100644 --- a/crypto/evp/print.c +++ b/crypto/evp/print.c @@ -181,11 +181,11 @@ static int do_rsa_print(BIO *out, const RSA *rsa, int off, } static int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_rsa_print(bp, pkey->pkey.rsa, indent, 0); + return do_rsa_print(bp, EVP_PKEY_get0_RSA(pkey), indent, 0); } static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_rsa_print(bp, pkey->pkey.rsa, indent, 1); + return do_rsa_print(bp, EVP_PKEY_get0_RSA(pkey), indent, 1); } @@ -225,15 +225,15 @@ static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype) { } static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 0); + return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 0); } static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 1); + return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 1); } static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 2); + return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 2); } @@ -293,16 +293,16 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype) { } static int eckey_param_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0); + return do_EC_KEY_print(bp, EVP_PKEY_get0_EC_KEY(pkey), indent, 0); } static int eckey_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1); + return do_EC_KEY_print(bp, EVP_PKEY_get0_EC_KEY(pkey), indent, 1); } static int eckey_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2); + return do_EC_KEY_print(bp, EVP_PKEY_get0_EC_KEY(pkey), indent, 2); } @@ -354,7 +354,7 @@ static int print_unsupported(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(pkey->type); + EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); if (method != NULL && method->pub_print != NULL) { return method->pub_print(out, pkey, indent); } @@ -363,7 +363,7 @@ int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(pkey->type); + EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); if (method != NULL && method->priv_print != NULL) { return method->priv_print(out, pkey, indent); } @@ -372,7 +372,7 @@ int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey, int indent, int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx) { - EVP_PKEY_PRINT_METHOD *method = find_method(pkey->type); + EVP_PKEY_PRINT_METHOD *method = find_method(EVP_PKEY_id(pkey)); if (method != NULL && method->param_print != NULL) { return method->param_print(out, pkey, indent); } diff --git a/crypto/x509/i2d_pr.c b/crypto/x509/i2d_pr.c index 1fb69eca4b..e5865a4289 100644 --- a/crypto/x509/i2d_pr.c +++ b/crypto/x509/i2d_pr.c @@ -65,11 +65,11 @@ int i2d_PrivateKey(const EVP_PKEY *a, uint8_t **pp) { switch (EVP_PKEY_id(a)) { case EVP_PKEY_RSA: - return i2d_RSAPrivateKey(a->pkey.rsa, pp); + return i2d_RSAPrivateKey(EVP_PKEY_get0_RSA(a), pp); case EVP_PKEY_EC: - return i2d_ECPrivateKey(a->pkey.ec, pp); + return i2d_ECPrivateKey(EVP_PKEY_get0_EC_KEY(a), pp); case EVP_PKEY_DSA: - return i2d_DSAPrivateKey(a->pkey.dsa, pp); + return i2d_DSAPrivateKey(EVP_PKEY_get0_DSA(a), pp); default: // Although this file is in crypto/x509 for layering reasons, it emits // an error code from ASN1 for OpenSSL compatibility. diff --git a/crypto/x509/x509_req.c b/crypto/x509/x509_req.c index c7829c7be1..8734897fe7 100644 --- a/crypto/x509/x509_req.c +++ b/crypto/x509/x509_req.c @@ -99,15 +99,10 @@ int X509_REQ_check_private_key(X509_REQ *x, EVP_PKEY *k) { OPENSSL_PUT_ERROR(X509, X509_R_KEY_TYPE_MISMATCH); break; case -2: - if (k->type == EVP_PKEY_EC) { + if (EVP_PKEY_id(k) == EVP_PKEY_EC) { OPENSSL_PUT_ERROR(X509, ERR_R_EC_LIB); break; } - if (k->type == EVP_PKEY_DH) { - // No idea - OPENSSL_PUT_ERROR(X509, X509_R_CANT_CHECK_DH_KEY); - break; - } OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_KEY_TYPE); } diff --git a/include/openssl/evp.h b/include/openssl/evp.h index d8bd011236..00ae4f5de4 100644 --- a/include/openssl/evp.h +++ b/include/openssl/evp.h @@ -1056,29 +1056,6 @@ OPENSSL_EXPORT int EVP_PKEY_CTX_set_dsa_paramgen_q_bits(EVP_PKEY_CTX *ctx, ERR_put_error(ERR_LIB_EVP, 0, reason, __FILE__, __LINE__) -// Private structures. - -struct evp_pkey_st { - CRYPTO_refcount_t references; - - // type contains one of the EVP_PKEY_* values or NID_undef and determines - // which element (if any) of the |pkey| union is valid. - int type; - - union { - void *ptr; - RSA *rsa; - DSA *dsa; - DH *dh; - EC_KEY *ec; - } pkey; - - // ameth contains a pointer to a method table that contains many ASN.1 - // methods for the key type. - const EVP_PKEY_ASN1_METHOD *ameth; -} /* EVP_PKEY */; - - #if defined(__cplusplus) } // extern C diff --git a/ssl/ssl_cert.cc b/ssl/ssl_cert.cc index ec77381985..aa46a8bb67 100644 --- a/ssl/ssl_cert.cc +++ b/ssl/ssl_cert.cc @@ -237,14 +237,14 @@ static enum leaf_cert_and_privkey_result_t check_leaf_cert_and_privkey( return leaf_cert_and_privkey_error; } - if (!ssl_is_key_type_supported(pubkey->type)) { + if (!ssl_is_key_type_supported(EVP_PKEY_id(pubkey.get()))) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE); return leaf_cert_and_privkey_error; } // An ECC certificate may be usable for ECDH or ECDSA. We only support ECDSA // certificates, so sanity-check the key usage extension. - if (pubkey->type == EVP_PKEY_EC && + if (EVP_PKEY_id(pubkey.get()) == EVP_PKEY_EC && !ssl_cert_check_key_usage(&cert_cbs, key_usage_digital_signature)) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE); return leaf_cert_and_privkey_error; diff --git a/ssl/ssl_privkey.cc b/ssl/ssl_privkey.cc index 60fda697d7..5a75b5e517 100644 --- a/ssl/ssl_privkey.cc +++ b/ssl/ssl_privkey.cc @@ -77,7 +77,7 @@ bool ssl_is_key_type_supported(int key_type) { } static bool ssl_set_pkey(CERT *cert, EVP_PKEY *pkey) { - if (!ssl_is_key_type_supported(pkey->type)) { + if (!ssl_is_key_type_supported(EVP_PKEY_id(pkey))) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE); return false; } From ffb80509b93c6d9f537f6b3f8136e16bffc8c6cf Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 9 Feb 2023 11:11:36 -0500 Subject: [PATCH 091/177] Replace the union inside EVP_PKEY with void*. The union isn't actually providing type-safety: nothing checks that we access the correct arm of the union, and it has a void* arm anyway. Instead, it's just adding some strict aliasing risk by relying on type-punning: we usually write to the pointer as void*, via EVP_PKEY_assign, but then we read from it as the underlying type. This is allowed in C, but not in C++. And even in C, while that is allowed, if we ever wrote &pkey->pkey.rsa, it would suddenly be a strict aliasing violation. Just use a void*, which means we don't type-pun pointer types against each other. While I'm here, I made the free callbacks for EVP_PKEYs also NULL the pointer. The one caller also NULLs it, so its fine, but some did and some didn't do it, and this seems prudent. Bug: 301 Change-Id: I74c76ed3984527df66f64bb2d397af44f63920bd Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57106 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/evp/evp.c | 14 ++--- crypto/evp/evp_asn1.c | 6 +- crypto/evp/internal.h | 11 +--- crypto/evp/p_dsa_asn1.c | 41 ++++++++----- crypto/evp/p_ec.c | 28 ++++----- crypto/evp/p_ec_asn1.c | 57 +++++++++++-------- crypto/evp/p_ed25519.c | 8 +-- crypto/evp/p_ed25519_asn1.c | 20 +++---- crypto/evp/p_rsa.c | 10 ++-- crypto/evp/p_rsa_asn1.c | 26 ++++++--- crypto/evp/p_x25519.c | 8 +-- crypto/evp/p_x25519_asn1.c | 24 ++++---- .../service_indicator/service_indicator.c | 5 +- 13 files changed, 140 insertions(+), 118 deletions(-) diff --git a/crypto/evp/evp.c b/crypto/evp/evp.c index 39e40fd20c..8383d2e0a9 100644 --- a/crypto/evp/evp.c +++ b/crypto/evp/evp.c @@ -98,7 +98,7 @@ EVP_PKEY *EVP_PKEY_new(void) { static void free_it(EVP_PKEY *pkey) { if (pkey->ameth && pkey->ameth->pkey_free) { pkey->ameth->pkey_free(pkey); - pkey->pkey.ptr = NULL; + pkey->pkey = NULL; pkey->type = EVP_PKEY_NONE; } } @@ -254,7 +254,7 @@ RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey) { OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_RSA_KEY); return NULL; } - return pkey->pkey.rsa; + return pkey->pkey; } RSA *EVP_PKEY_get1_RSA(const EVP_PKEY *pkey) { @@ -282,7 +282,7 @@ DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey) { OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_A_DSA_KEY); return NULL; } - return pkey->pkey.dsa; + return pkey->pkey; } DSA *EVP_PKEY_get1_DSA(const EVP_PKEY *pkey) { @@ -310,7 +310,7 @@ EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey) { OPENSSL_PUT_ERROR(EVP, EVP_R_EXPECTING_AN_EC_KEY_KEY); return NULL; } - return pkey->pkey.ec; + return pkey->pkey; } EC_KEY *EVP_PKEY_get1_EC_KEY(const EVP_PKEY *pkey) { @@ -328,14 +328,14 @@ int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key) { if (!EVP_PKEY_set_type(pkey, type)) { return 0; } - pkey->pkey.ptr = key; + pkey->pkey = key; return key != NULL; } int EVP_PKEY_set_type(EVP_PKEY *pkey, int type) { const EVP_PKEY_ASN1_METHOD *ameth; - if (pkey && pkey->pkey.ptr) { + if (pkey && pkey->pkey) { free_it(pkey); } @@ -447,7 +447,7 @@ int EVP_PKEY_CTX_get_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD **out_md) { void *EVP_PKEY_get0(const EVP_PKEY *pkey) { // Node references, but never calls this function, so for now we return NULL. // If other projects require complete support, call |EVP_PKEY_get0_RSA|, etc., - // rather than reading |pkey->pkey.ptr| directly. This avoids problems if our + // rather than reading |pkey->pkey| directly. This avoids problems if our // internal representation does not match the type the caller expects from // OpenSSL. return NULL; diff --git a/crypto/evp/evp_asn1.c b/crypto/evp/evp_asn1.c index da0998168f..f270c3e773 100644 --- a/crypto/evp/evp_asn1.c +++ b/crypto/evp/evp_asn1.c @@ -336,11 +336,11 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **out, const uint8_t **inp, long len) { int i2d_PublicKey(const EVP_PKEY *key, uint8_t **outp) { switch (key->type) { case EVP_PKEY_RSA: - return i2d_RSAPublicKey(key->pkey.rsa, outp); + return i2d_RSAPublicKey(EVP_PKEY_get0_RSA(key), outp); case EVP_PKEY_DSA: - return i2d_DSAPublicKey(key->pkey.dsa, outp); + return i2d_DSAPublicKey(EVP_PKEY_get0_DSA(key), outp); case EVP_PKEY_EC: - return i2o_ECPublicKey(key->pkey.ec, outp); + return i2o_ECPublicKey(EVP_PKEY_get0_EC_KEY(key), outp); default: OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE); return -1; diff --git a/crypto/evp/internal.h b/crypto/evp/internal.h index 09f15aef4a..71f0f954a4 100644 --- a/crypto/evp/internal.h +++ b/crypto/evp/internal.h @@ -132,16 +132,11 @@ struct evp_pkey_st { CRYPTO_refcount_t references; // type contains one of the EVP_PKEY_* values or NID_undef and determines - // which element (if any) of the |pkey| union is valid. + // the type of |pkey|. int type; - union { - void *ptr; - RSA *rsa; - DSA *dsa; - DH *dh; - EC_KEY *ec; - } pkey; + // pkey contains a pointer to a structure dependent on |type|. + void *pkey; // ameth contains a pointer to a method table that contains many ASN.1 // methods for the key type. diff --git a/crypto/evp/p_dsa_asn1.c b/crypto/evp/p_dsa_asn1.c index cd787dd541..8486e282e1 100644 --- a/crypto/evp/p_dsa_asn1.c +++ b/crypto/evp/p_dsa_asn1.c @@ -102,7 +102,7 @@ static int dsa_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int dsa_pub_encode(CBB *out, const EVP_PKEY *key) { - const DSA *dsa = key->pkey.dsa; + const DSA *dsa = key->pkey; const int has_params = dsa->p != NULL && dsa->q != NULL && dsa->g != NULL; // See RFC 5480, section 2. @@ -171,7 +171,7 @@ static int dsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int dsa_priv_encode(CBB *out, const EVP_PKEY *key) { - const DSA *dsa = key->pkey.dsa; + const DSA *dsa = key->pkey; if (dsa == NULL || dsa->priv_key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); return 0; @@ -196,17 +196,19 @@ static int dsa_priv_encode(CBB *out, const EVP_PKEY *key) { } static int int_dsa_size(const EVP_PKEY *pkey) { - return DSA_size(pkey->pkey.dsa); + const DSA *dsa = pkey->pkey; + return DSA_size(dsa); } static int dsa_bits(const EVP_PKEY *pkey) { - return BN_num_bits(pkey->pkey.dsa->p); + const DSA *dsa = pkey->pkey; + return BN_num_bits(DSA_get0_p(dsa)); } static int dsa_missing_parameters(const EVP_PKEY *pkey) { - DSA *dsa; - dsa = pkey->pkey.dsa; - if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { + const DSA *dsa = pkey->pkey; + if (DSA_get0_p(dsa) == NULL || DSA_get0_q(dsa) == NULL || + DSA_get0_g(dsa) == NULL) { return 1; } return 0; @@ -226,9 +228,11 @@ static int dup_bn_into(BIGNUM **out, BIGNUM *src) { } static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - if (!dup_bn_into(&to->pkey.dsa->p, from->pkey.dsa->p) || - !dup_bn_into(&to->pkey.dsa->q, from->pkey.dsa->q) || - !dup_bn_into(&to->pkey.dsa->g, from->pkey.dsa->g)) { + DSA *to_dsa = to->pkey; + const DSA *from_dsa = from->pkey; + if (!dup_bn_into(&to_dsa->p, from_dsa->p) || + !dup_bn_into(&to_dsa->q, from_dsa->q) || + !dup_bn_into(&to_dsa->g, from_dsa->g)) { return 0; } @@ -236,16 +240,23 @@ static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { } static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { - return BN_cmp(a->pkey.dsa->p, b->pkey.dsa->p) == 0 && - BN_cmp(a->pkey.dsa->q, b->pkey.dsa->q) == 0 && - BN_cmp(a->pkey.dsa->g, b->pkey.dsa->g) == 0; + const DSA *a_dsa = a->pkey; + const DSA *b_dsa = b->pkey; + return BN_cmp(DSA_get0_p(a_dsa), DSA_get0_p(b_dsa)) == 0 && + BN_cmp(DSA_get0_q(a_dsa), DSA_get0_q(b_dsa)) == 0 && + BN_cmp(DSA_get0_g(a_dsa), DSA_get0_g(b_dsa)) == 0; } static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - return BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) == 0; + const DSA *a_dsa = a->pkey; + const DSA *b_dsa = b->pkey; + return BN_cmp(DSA_get0_pub_key(b_dsa), DSA_get0_pub_key(a_dsa)) == 0; } -static void int_dsa_free(EVP_PKEY *pkey) { DSA_free(pkey->pkey.dsa); } +static void int_dsa_free(EVP_PKEY *pkey) { + DSA_free(pkey->pkey); + pkey->pkey = NULL; +} const EVP_PKEY_ASN1_METHOD dsa_asn1_meth = { EVP_PKEY_DSA, diff --git a/crypto/evp/p_ec.c b/crypto/evp/p_ec.c index ddb64a4215..c9f26cb00c 100644 --- a/crypto/evp/p_ec.c +++ b/crypto/evp/p_ec.c @@ -117,9 +117,7 @@ static void pkey_ec_cleanup(EVP_PKEY_CTX *ctx) { static int pkey_ec_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, const uint8_t *tbs, size_t tbslen) { - unsigned int sltmp; - EC_KEY *ec = ctx->pkey->pkey.ec; - + const EC_KEY *ec = ctx->pkey->pkey; if (!sig) { *siglen = ECDSA_size(ec); return 1; @@ -128,6 +126,7 @@ static int pkey_ec_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, return 0; } + unsigned int sltmp; if (!ECDSA_sign(0, tbs, tbslen, sig, &sltmp, ec)) { return 0; } @@ -137,37 +136,32 @@ static int pkey_ec_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, static int pkey_ec_verify(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen, const uint8_t *tbs, size_t tbslen) { - return ECDSA_verify(0, tbs, tbslen, sig, siglen, ctx->pkey->pkey.ec); + const EC_KEY *ec_key = ctx->pkey->pkey; + return ECDSA_verify(0, tbs, tbslen, sig, siglen, ec_key); } static int pkey_ec_derive(EVP_PKEY_CTX *ctx, uint8_t *key, size_t *keylen) { - int ret; - size_t outlen; - const EC_POINT *pubkey = NULL; - EC_KEY *eckey; - if (!ctx->pkey || !ctx->peerkey) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; } - eckey = ctx->pkey->pkey.ec; - + const EC_KEY *eckey = ctx->pkey->pkey; if (!key) { const EC_GROUP *group; group = EC_KEY_get0_group(eckey); *keylen = (EC_GROUP_get_degree(group) + 7) / 8; return 1; } - pubkey = EC_KEY_get0_public_key(ctx->peerkey->pkey.ec); + + const EC_KEY *eckey_peer = ctx->peerkey->pkey; + const EC_POINT *pubkey = EC_KEY_get0_public_key(eckey_peer); // NB: unlike PKCS#3 DH, if *outlen is less than maximum size this is // not an error, the result is truncated. - - outlen = *keylen; - - ret = ECDH_compute_key(key, outlen, pubkey, eckey, 0); + size_t outlen = *keylen; + int ret = ECDH_compute_key(key, outlen, pubkey, eckey, 0); if (ret < 0) { return 0; } @@ -224,7 +218,7 @@ static int pkey_ec_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_PARAMETERS_SET); return 0; } - group = EC_KEY_get0_group(ctx->pkey->pkey.ec); + group = EC_KEY_get0_group(ctx->pkey->pkey); } EC_KEY *ec = EC_KEY_new(); if (ec == NULL || diff --git a/crypto/evp/p_ec_asn1.c b/crypto/evp/p_ec_asn1.c index be51277b83..2659100f2e 100644 --- a/crypto/evp/p_ec_asn1.c +++ b/crypto/evp/p_ec_asn1.c @@ -66,7 +66,7 @@ static int eckey_pub_encode(CBB *out, const EVP_PKEY *key) { - const EC_KEY *ec_key = key->pkey.ec; + const EC_KEY *ec_key = key->pkey; const EC_GROUP *group = EC_KEY_get0_group(ec_key); const EC_POINT *public_key = EC_KEY_get0_public_key(ec_key); @@ -118,11 +118,12 @@ static int eckey_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int eckey_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - int r; - const EC_GROUP *group = EC_KEY_get0_group(b->pkey.ec); - const EC_POINT *pa = EC_KEY_get0_public_key(a->pkey.ec), - *pb = EC_KEY_get0_public_key(b->pkey.ec); - r = EC_POINT_cmp(group, pa, pb, NULL); + const EC_KEY *a_ec = a->pkey; + const EC_KEY *b_ec = b->pkey; + const EC_GROUP *group = EC_KEY_get0_group(b_ec); + const EC_POINT *pa = EC_KEY_get0_public_key(a_ec), + *pb = EC_KEY_get0_public_key(b_ec); + int r = EC_POINT_cmp(group, pa, pb, NULL); if (r == 0) { return 1; } else if (r == 1) { @@ -154,7 +155,7 @@ static int eckey_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int eckey_priv_encode(CBB *out, const EVP_PKEY *key) { - const EC_KEY *ec_key = key->pkey.ec; + const EC_KEY *ec_key = key->pkey; // Omit the redundant copy of the curve name. This contradicts RFC 5915 but // aligns with PKCS #11. SEC 1 only says they may be omitted if known by other @@ -182,7 +183,7 @@ static int eckey_priv_encode(CBB *out, const EVP_PKEY *key) { static int eckey_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, size_t len) { - EC_KEY *ec_key = pkey->pkey.ec; + EC_KEY *ec_key = pkey->pkey; if (ec_key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); return 0; @@ -193,7 +194,7 @@ static int eckey_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, static size_t eckey_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr) { - const EC_KEY *ec_key = pkey->pkey.ec; + const EC_KEY *ec_key = pkey->pkey; if (ec_key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); return 0; @@ -203,11 +204,13 @@ static size_t eckey_get1_tls_encodedpoint(const EVP_PKEY *pkey, } static int int_ec_size(const EVP_PKEY *pkey) { - return ECDSA_size(pkey->pkey.ec); + const EC_KEY *ec_key = pkey->pkey; + return ECDSA_size(ec_key); } static int ec_bits(const EVP_PKEY *pkey) { - const EC_GROUP *group = EC_KEY_get0_group(pkey->pkey.ec); + const EC_KEY *ec_key = pkey->pkey; + const EC_GROUP *group = EC_KEY_get0_group(ec_key); if (group == NULL) { ERR_clear_error(); return 0; @@ -216,34 +219,38 @@ static int ec_bits(const EVP_PKEY *pkey) { } static int ec_missing_parameters(const EVP_PKEY *pkey) { - return pkey->pkey.ec == NULL || EC_KEY_get0_group(pkey->pkey.ec) == NULL; + const EC_KEY *ec_key = pkey->pkey; + return ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL; } static int ec_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - if (from->pkey.ec == NULL) { + const EC_KEY *from_key = from->pkey; + if (from_key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); return 0; } - const EC_GROUP *group = EC_KEY_get0_group(from->pkey.ec); + const EC_GROUP *group = EC_KEY_get0_group(from_key); if (group == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); return 0; } - if (to->pkey.ec == NULL) { - to->pkey.ec = EC_KEY_new(); - if (to->pkey.ec == NULL) { + if (to->pkey == NULL) { + to->pkey = EC_KEY_new(); + if (to->pkey == NULL) { return 0; } } - return EC_KEY_set_group(to->pkey.ec, group); + return EC_KEY_set_group(to->pkey, group); } static int ec_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { - if (a->pkey.ec == NULL || b->pkey.ec == NULL) { + const EC_KEY *a_ec = a->pkey; + const EC_KEY *b_ec = b->pkey; + if (a_ec == NULL || b_ec == NULL) { return -2; } - const EC_GROUP *group_a = EC_KEY_get0_group(a->pkey.ec), - *group_b = EC_KEY_get0_group(b->pkey.ec); + const EC_GROUP *group_a = EC_KEY_get0_group(a_ec), + *group_b = EC_KEY_get0_group(b_ec); if (group_a == NULL || group_b == NULL) { return -2; } @@ -254,10 +261,14 @@ static int ec_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { return 1; } -static void int_ec_free(EVP_PKEY *pkey) { EC_KEY_free(pkey->pkey.ec); } +static void int_ec_free(EVP_PKEY *pkey) { + EC_KEY_free(pkey->pkey); + pkey->pkey = NULL; +} static int eckey_opaque(const EVP_PKEY *pkey) { - return EC_KEY_is_opaque(pkey->pkey.ec); + const EC_KEY *ec_key = pkey->pkey; + return EC_KEY_is_opaque(ec_key); } const EVP_PKEY_ASN1_METHOD ec_asn1_meth = { diff --git a/crypto/evp/p_ed25519.c b/crypto/evp/p_ed25519.c index cd787a1526..647ea05e60 100644 --- a/crypto/evp/p_ed25519.c +++ b/crypto/evp/p_ed25519.c @@ -39,15 +39,15 @@ static int pkey_ed25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { ED25519_keypair(pubkey_unused, key->key); key->has_private = 1; - OPENSSL_free(pkey->pkey.ptr); - pkey->pkey.ptr = key; + OPENSSL_free(pkey->pkey); + pkey->pkey = key; return 1; } static int pkey_ed25519_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, const uint8_t *tbs, size_t tbslen) { - ED25519_KEY *key = ctx->pkey->pkey.ptr; + const ED25519_KEY *key = ctx->pkey->pkey; if (!key->has_private) { OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); return 0; @@ -74,7 +74,7 @@ static int pkey_ed25519_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig, static int pkey_ed25519_verify_message(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen, const uint8_t *tbs, size_t tbslen) { - ED25519_KEY *key = ctx->pkey->pkey.ptr; + const ED25519_KEY *key = ctx->pkey->pkey; if (siglen != 64 || !ED25519_verify(tbs, tbslen, sig, key->key + ED25519_PUBLIC_KEY_OFFSET)) { OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_SIGNATURE); diff --git a/crypto/evp/p_ed25519_asn1.c b/crypto/evp/p_ed25519_asn1.c index c3f88850fe..3b8f27fd65 100644 --- a/crypto/evp/p_ed25519_asn1.c +++ b/crypto/evp/p_ed25519_asn1.c @@ -24,8 +24,8 @@ static void ed25519_free(EVP_PKEY *pkey) { - OPENSSL_free(pkey->pkey.ptr); - pkey->pkey.ptr = NULL; + OPENSSL_free(pkey->pkey); + pkey->pkey = NULL; } static int ed25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { @@ -46,7 +46,7 @@ static int ed25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { key->has_private = 1; ed25519_free(pkey); - pkey->pkey.ptr = key; + pkey->pkey = key; return 1; } @@ -65,13 +65,13 @@ static int ed25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { key->has_private = 0; ed25519_free(pkey); - pkey->pkey.ptr = key; + pkey->pkey = key; return 1; } static int ed25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { - const ED25519_KEY *key = pkey->pkey.ptr; + const ED25519_KEY *key = pkey->pkey; if (!key->has_private) { OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); return 0; @@ -95,7 +95,7 @@ static int ed25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, static int ed25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { - const ED25519_KEY *key = pkey->pkey.ptr; + const ED25519_KEY *key = pkey->pkey; if (out == NULL) { *out_len = 32; return 1; @@ -124,7 +124,7 @@ static int ed25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int ed25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { - const ED25519_KEY *key = pkey->pkey.ptr; + const ED25519_KEY *key = pkey->pkey; // See RFC 8410, section 4. CBB spki, algorithm, oid, key_bitstring; @@ -145,8 +145,8 @@ static int ed25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { } static int ed25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const ED25519_KEY *a_key = a->pkey.ptr; - const ED25519_KEY *b_key = b->pkey.ptr; + const ED25519_KEY *a_key = a->pkey; + const ED25519_KEY *b_key = b->pkey; return OPENSSL_memcmp(a_key->key + ED25519_PUBLIC_KEY_OFFSET, b_key->key + ED25519_PUBLIC_KEY_OFFSET, 32) == 0; } @@ -168,7 +168,7 @@ static int ed25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int ed25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { - ED25519_KEY *key = pkey->pkey.ptr; + const ED25519_KEY *key = pkey->pkey; if (!key->has_private) { OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); return 0; diff --git a/crypto/evp/p_rsa.c b/crypto/evp/p_rsa.c index 7872a922cb..dc224500c2 100644 --- a/crypto/evp/p_rsa.c +++ b/crypto/evp/p_rsa.c @@ -171,7 +171,7 @@ static int setup_tbuf(RSA_PKEY_CTX *ctx, EVP_PKEY_CTX *pk) { static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen, const uint8_t *tbs, size_t tbslen) { RSA_PKEY_CTX *rctx = ctx->data; - RSA *rsa = ctx->pkey->pkey.rsa; + RSA *rsa = ctx->pkey->pkey; const size_t key_len = EVP_PKEY_size(ctx->pkey); if (!sig) { @@ -210,7 +210,7 @@ static int pkey_rsa_verify(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen, const uint8_t *tbs, size_t tbslen) { RSA_PKEY_CTX *rctx = ctx->data; - RSA *rsa = ctx->pkey->pkey.rsa; + RSA *rsa = ctx->pkey->pkey; if (rctx->md) { switch (rctx->pad_mode) { @@ -243,7 +243,7 @@ static int pkey_rsa_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len, const uint8_t *sig, size_t sig_len) { RSA_PKEY_CTX *rctx = ctx->data; - RSA *rsa = ctx->pkey->pkey.rsa; + RSA *rsa = ctx->pkey->pkey; const size_t key_len = EVP_PKEY_size(ctx->pkey); if (out == NULL) { @@ -307,7 +307,7 @@ static int pkey_rsa_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen, const uint8_t *in, size_t inlen) { RSA_PKEY_CTX *rctx = ctx->data; - RSA *rsa = ctx->pkey->pkey.rsa; + RSA *rsa = ctx->pkey->pkey; const size_t key_len = EVP_PKEY_size(ctx->pkey); if (!out) { @@ -339,7 +339,7 @@ static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen, const uint8_t *in, size_t inlen) { RSA_PKEY_CTX *rctx = ctx->data; - RSA *rsa = ctx->pkey->pkey.rsa; + RSA *rsa = ctx->pkey->pkey; const size_t key_len = EVP_PKEY_size(ctx->pkey); if (!out) { diff --git a/crypto/evp/p_rsa_asn1.c b/crypto/evp/p_rsa_asn1.c index cfaf69472f..dd64731be4 100644 --- a/crypto/evp/p_rsa_asn1.c +++ b/crypto/evp/p_rsa_asn1.c @@ -68,6 +68,7 @@ static int rsa_pub_encode(CBB *out, const EVP_PKEY *key) { // See RFC 3279, section 2.3.1. + const RSA *rsa = key->pkey; CBB spki, algorithm, oid, null, key_bitstring; if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) || !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) || @@ -76,7 +77,7 @@ static int rsa_pub_encode(CBB *out, const EVP_PKEY *key) { !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) || !CBB_add_u8(&key_bitstring, 0 /* padding */) || - !RSA_marshal_public_key(&key_bitstring, key->pkey.rsa) || + !RSA_marshal_public_key(&key_bitstring, rsa) || !CBB_flush(out)) { OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); return 0; @@ -109,11 +110,14 @@ static int rsa_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - return BN_cmp(b->pkey.rsa->n, a->pkey.rsa->n) == 0 && - BN_cmp(b->pkey.rsa->e, a->pkey.rsa->e) == 0; + const RSA *a_rsa = a->pkey; + const RSA *b_rsa = b->pkey; + return BN_cmp(RSA_get0_n(b_rsa), RSA_get0_n(a_rsa)) == 0 && + BN_cmp(RSA_get0_e(b_rsa), RSA_get0_e(a_rsa)) == 0; } static int rsa_priv_encode(CBB *out, const EVP_PKEY *key) { + const RSA *rsa = key->pkey; CBB pkcs8, algorithm, oid, null, private_key; if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) || !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) || @@ -122,7 +126,7 @@ static int rsa_priv_encode(CBB *out, const EVP_PKEY *key) { !CBB_add_bytes(&oid, rsa_asn1_meth.oid, rsa_asn1_meth.oid_len) || !CBB_add_asn1(&algorithm, &null, CBS_ASN1_NULL) || !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) || - !RSA_marshal_private_key(&private_key, key->pkey.rsa) || + !RSA_marshal_private_key(&private_key, rsa) || !CBB_flush(out)) { OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR); return 0; @@ -153,18 +157,24 @@ static int rsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int rsa_opaque(const EVP_PKEY *pkey) { - return RSA_is_opaque(pkey->pkey.rsa); + const RSA *rsa = pkey->pkey; + return RSA_is_opaque(rsa); } static int int_rsa_size(const EVP_PKEY *pkey) { - return RSA_size(pkey->pkey.rsa); + const RSA *rsa = pkey->pkey; + return RSA_size(rsa); } static int rsa_bits(const EVP_PKEY *pkey) { - return RSA_bits(pkey->pkey.rsa); + const RSA *rsa = pkey->pkey; + return RSA_bits(rsa); } -static void int_rsa_free(EVP_PKEY *pkey) { RSA_free(pkey->pkey.rsa); } +static void int_rsa_free(EVP_PKEY *pkey) { + RSA_free(pkey->pkey); + pkey->pkey = NULL; +} const EVP_PKEY_ASN1_METHOD rsa_asn1_meth = { EVP_PKEY_RSA, diff --git a/crypto/evp/p_x25519.c b/crypto/evp/p_x25519.c index 75ef6e10a7..6218943e0f 100644 --- a/crypto/evp/p_x25519.c +++ b/crypto/evp/p_x25519.c @@ -38,8 +38,8 @@ static int pkey_x25519_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) { X25519_keypair(key->pub, key->priv); key->has_private = 1; - OPENSSL_free(pkey->pkey.ptr); - pkey->pkey.ptr = key; + OPENSSL_free(pkey->pkey); + pkey->pkey = key; return 1; } @@ -50,8 +50,8 @@ static int pkey_x25519_derive(EVP_PKEY_CTX *ctx, uint8_t *out, return 0; } - const X25519_KEY *our_key = ctx->pkey->pkey.ptr; - const X25519_KEY *peer_key = ctx->peerkey->pkey.ptr; + const X25519_KEY *our_key = ctx->pkey->pkey; + const X25519_KEY *peer_key = ctx->peerkey->pkey; if (our_key == NULL || peer_key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_KEYS_NOT_SET); return 0; diff --git a/crypto/evp/p_x25519_asn1.c b/crypto/evp/p_x25519_asn1.c index 3573f240c3..bf98427c78 100644 --- a/crypto/evp/p_x25519_asn1.c +++ b/crypto/evp/p_x25519_asn1.c @@ -24,8 +24,8 @@ static void x25519_free(EVP_PKEY *pkey) { - OPENSSL_free(pkey->pkey.ptr); - pkey->pkey.ptr = NULL; + OPENSSL_free(pkey->pkey); + pkey->pkey = NULL; } static int x25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { @@ -44,7 +44,7 @@ static int x25519_set_priv_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { key->has_private = 1; x25519_free(pkey); - pkey->pkey.ptr = key; + pkey->pkey = key; return 1; } @@ -63,13 +63,13 @@ static int x25519_set_pub_raw(EVP_PKEY *pkey, const uint8_t *in, size_t len) { key->has_private = 0; x25519_free(pkey); - pkey->pkey.ptr = key; + pkey->pkey = key; return 1; } static int x25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, - size_t *out_len) { - const X25519_KEY *key = pkey->pkey.ptr; + size_t *out_len) { + const X25519_KEY *key = pkey->pkey; if (!key->has_private) { OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); return 0; @@ -92,7 +92,7 @@ static int x25519_get_priv_raw(const EVP_PKEY *pkey, uint8_t *out, static int x25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len) { - const X25519_KEY *key = pkey->pkey.ptr; + const X25519_KEY *key = pkey->pkey; if (out == NULL) { *out_len = 32; return 1; @@ -115,7 +115,7 @@ static int x25519_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, static size_t x25519_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr) { - const X25519_KEY *key = pkey->pkey.ptr; + const X25519_KEY *key = pkey->pkey; if (key == NULL) { OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); return 0; @@ -138,7 +138,7 @@ static int x25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int x25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { - const X25519_KEY *key = pkey->pkey.ptr; + const X25519_KEY *key = pkey->pkey; // See RFC 8410, section 4. CBB spki, algorithm, oid, key_bitstring; @@ -158,8 +158,8 @@ static int x25519_pub_encode(CBB *out, const EVP_PKEY *pkey) { } static int x25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { - const X25519_KEY *a_key = a->pkey.ptr; - const X25519_KEY *b_key = b->pkey.ptr; + const X25519_KEY *a_key = a->pkey; + const X25519_KEY *b_key = b->pkey; return OPENSSL_memcmp(a_key->pub, b_key->pub, 32) == 0; } @@ -180,7 +180,7 @@ static int x25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } static int x25519_priv_encode(CBB *out, const EVP_PKEY *pkey) { - X25519_KEY *key = pkey->pkey.ptr; + const X25519_KEY *key = pkey->pkey; if (!key->has_private) { OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY); return 0; diff --git a/crypto/fipsmodule/service_indicator/service_indicator.c b/crypto/fipsmodule/service_indicator/service_indicator.c index dd38bd74d6..b1ea28e80c 100644 --- a/crypto/fipsmodule/service_indicator/service_indicator.c +++ b/crypto/fipsmodule/service_indicator/service_indicator.c @@ -238,8 +238,9 @@ static void evp_md_ctx_verify_service_indicator(const EVP_MD_CTX *ctx, } } else if (pkey_type == EVP_PKEY_EC) { // Check if the MD type and the elliptic curve are approved. - if (md_ok(md_type) && is_ec_fips_approved(EC_GROUP_get_curve_name( - ctx->pctx->pkey->pkey.ec->group))) { + if (md_ok(md_type) && + is_ec_fips_approved(EC_GROUP_get_curve_name( + EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(ctx->pctx->pkey))))) { FIPS_service_indicator_update_state(); } } From bab2f96e2637acb107fe9b099c58befbca918748 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 16 Feb 2023 17:37:57 -0500 Subject: [PATCH 092/177] Revert go:build ignore lines This convention seems to break with some other tooling we have. Until we figure out how to resolve that, remove the lines. This partially reverts 54b04fdc21d540a6e24f9ddb7ddc3e583518e24f but keeps the fixes to the license header comments. Change-Id: I4f08a9f3daf65d17b4c78ac6f4ac3de234ec3436 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57366 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Commit-Queue: David Benjamin Auto-Submit: David Benjamin --- crypto/err/err_data_generate.go | 2 -- crypto/fipsmodule/bn/bn_test_to_fuzzer.go | 2 -- crypto/fipsmodule/bn/check_bn_tests.go | 2 -- crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go | 2 -- crypto/fipsmodule/ec/make_p256-nistz-tests.go | 2 -- crypto/fipsmodule/ec/make_tables.go | 2 -- crypto/obj/objects.go | 2 -- crypto/x509/test/make_basic_constraints.go | 2 -- crypto/x509/test/make_invalid_extensions.go | 2 -- crypto/x509/test/make_many_constraints.go | 2 -- crypto/x509/test/make_policy_certs.go | 2 -- util/all_tests.go | 2 -- util/check_filenames.go | 2 -- util/check_imported_libraries.go | 2 -- util/check_stack.go | 2 -- util/compare_benchmarks.go | 2 -- util/convert_comments.go | 2 -- util/convert_wycheproof.go | 2 -- util/diff_asm.go | 2 -- util/doc.go | 2 -- util/embed_test_data.go | 2 -- util/fetch_ech_config_list.go | 2 -- util/fipstools/acvp/acvptool/test/check_expected.go | 2 -- util/fipstools/acvp/acvptool/test/trim_vectors.go | 2 -- util/fipstools/break-hash.go | 2 -- util/fipstools/break-kat.go | 2 -- util/godeps.go | 2 -- util/make_errors.go | 2 -- util/make_prefix_headers.go | 2 -- util/read_symbols.go | 2 -- util/run_android_tests.go | 2 -- 31 files changed, 62 deletions(-) diff --git a/crypto/err/err_data_generate.go b/crypto/err/err_data_generate.go index 3e06f00bd0..332b4e15ae 100644 --- a/crypto/err/err_data_generate.go +++ b/crypto/err/err_data_generate.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go index 2915db5f9d..1e48df350d 100644 --- a/crypto/fipsmodule/bn/bn_test_to_fuzzer.go +++ b/crypto/fipsmodule/bn/bn_test_to_fuzzer.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/fipsmodule/bn/check_bn_tests.go b/crypto/fipsmodule/bn/check_bn_tests.go index 032b9e328d..dd1def80d7 100644 --- a/crypto/fipsmodule/bn/check_bn_tests.go +++ b/crypto/fipsmodule/bn/check_bn_tests.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go b/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go index 1d3896aa98..169d226ad1 100644 --- a/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go +++ b/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/fipsmodule/ec/make_p256-nistz-tests.go b/crypto/fipsmodule/ec/make_p256-nistz-tests.go index e10990b30e..04a1a1c874 100644 --- a/crypto/fipsmodule/ec/make_p256-nistz-tests.go +++ b/crypto/fipsmodule/ec/make_p256-nistz-tests.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/fipsmodule/ec/make_tables.go b/crypto/fipsmodule/ec/make_tables.go index ef7ac64f39..7fb9041c68 100644 --- a/crypto/fipsmodule/ec/make_tables.go +++ b/crypto/fipsmodule/ec/make_tables.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/obj/objects.go b/crypto/obj/objects.go index 716adf9486..1b9ded347b 100644 --- a/crypto/obj/objects.go +++ b/crypto/obj/objects.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/crypto/x509/test/make_basic_constraints.go b/crypto/x509/test/make_basic_constraints.go index ea502b4c8d..67f4b913d3 100644 --- a/crypto/x509/test/make_basic_constraints.go +++ b/crypto/x509/test/make_basic_constraints.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // make_basic_constraints.go generates self-signed certificates with the basic // constraints extension. package main diff --git a/crypto/x509/test/make_invalid_extensions.go b/crypto/x509/test/make_invalid_extensions.go index 8287bf8d31..884d933555 100644 --- a/crypto/x509/test/make_invalid_extensions.go +++ b/crypto/x509/test/make_invalid_extensions.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // make_invalid_extensions.go generates a number of certificate chains with // invalid extension encodings. package main diff --git a/crypto/x509/test/make_many_constraints.go b/crypto/x509/test/make_many_constraints.go index 24a5c40717..07f2edc760 100644 --- a/crypto/x509/test/make_many_constraints.go +++ b/crypto/x509/test/make_many_constraints.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // make_many_constraints.go generates test certificates many_constraints.pem, // many_names*.pem, and some_names*.pem for x509_test.cc package main diff --git a/crypto/x509/test/make_policy_certs.go b/crypto/x509/test/make_policy_certs.go index bc944f2def..76be6a08a9 100644 --- a/crypto/x509/test/make_policy_certs.go +++ b/crypto/x509/test/make_policy_certs.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // make_policy_certs.go generates certificates for testing policy handling. package main diff --git a/util/all_tests.go b/util/all_tests.go index c0dceba55e..8d81463e04 100644 --- a/util/all_tests.go +++ b/util/all_tests.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/check_filenames.go b/util/check_filenames.go index 384c19f510..886c3f6091 100644 --- a/util/check_filenames.go +++ b/util/check_filenames.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // check_filenames.go checks that filenames are unique. Some of our consumers do // not support multiple files with the same name in the same build target, even // if they are in different directories. diff --git a/util/check_imported_libraries.go b/util/check_imported_libraries.go index f3803f1c1d..187e51441f 100644 --- a/util/check_imported_libraries.go +++ b/util/check_imported_libraries.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // check_imported_libraries.go checks that each of its arguments only imports // allowed libraries. This is used to avoid accidental dependencies on // libstdc++.so. diff --git a/util/check_stack.go b/util/check_stack.go index ad763e6529..b718ea4aca 100644 --- a/util/check_stack.go +++ b/util/check_stack.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // check_stack.go checks that each of its arguments has a non-executable stack. // See https://www.airs.com/blog/archives/518 for details. package main diff --git a/util/compare_benchmarks.go b/util/compare_benchmarks.go index 05e1b5db0d..d631f832b1 100644 --- a/util/compare_benchmarks.go +++ b/util/compare_benchmarks.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // compare_benchmarks takes the JSON-formatted output of bssl speed and // compares it against a baseline output. package main diff --git a/util/convert_comments.go b/util/convert_comments.go index df9e3d3ae3..917f29c861 100644 --- a/util/convert_comments.go +++ b/util/convert_comments.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/convert_wycheproof.go b/util/convert_wycheproof.go index 809da6f516..a7dfc81805 100644 --- a/util/convert_wycheproof.go +++ b/util/convert_wycheproof.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // convert_wycheproof.go converts Wycheproof test vectors into a format more // easily consumed by BoringSSL. package main diff --git a/util/diff_asm.go b/util/diff_asm.go index 5ac1c04bbd..27c0aa20af 100644 --- a/util/diff_asm.go +++ b/util/diff_asm.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/doc.go b/util/doc.go index 4fb73ca0dc..e7f1b5911f 100644 --- a/util/doc.go +++ b/util/doc.go @@ -1,5 +1,3 @@ -//go:build ignore - // doc generates HTML files from the comments in header files. // // doc expects to be given the path to a JSON file via the --config option. diff --git a/util/embed_test_data.go b/util/embed_test_data.go index ae7135fae4..0a0d1e3f1b 100644 --- a/util/embed_test_data.go +++ b/util/embed_test_data.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // embed_test_data generates a C++ source file which exports a function, // GetTestData, which looks up the specified data files. package main diff --git a/util/fetch_ech_config_list.go b/util/fetch_ech_config_list.go index 732d0d3b8a..8f09e66b1f 100644 --- a/util/fetch_ech_config_list.go +++ b/util/fetch_ech_config_list.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/fipstools/acvp/acvptool/test/check_expected.go b/util/fipstools/acvp/acvptool/test/check_expected.go index 588b8038bd..ccc803850f 100644 --- a/util/fipstools/acvp/acvptool/test/check_expected.go +++ b/util/fipstools/acvp/acvptool/test/check_expected.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/fipstools/acvp/acvptool/test/trim_vectors.go b/util/fipstools/acvp/acvptool/test/trim_vectors.go index 703f75fd20..53e970e028 100644 --- a/util/fipstools/acvp/acvptool/test/trim_vectors.go +++ b/util/fipstools/acvp/acvptool/test/trim_vectors.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // trimvectors takes an ACVP vector set file and discards all but a single test // from each test group. This hope is that this achieves good coverage without // having to check in megabytes worth of JSON files. diff --git a/util/fipstools/break-hash.go b/util/fipstools/break-hash.go index a4ab8083df..e37da75253 100644 --- a/util/fipstools/break-hash.go +++ b/util/fipstools/break-hash.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // break-hash parses an ELF binary containing the FIPS module and corrupts the // first byte of the module. This should cause the integrity check to fail. package main diff --git a/util/fipstools/break-kat.go b/util/fipstools/break-kat.go index ebf5dd703d..6eace5b464 100644 --- a/util/fipstools/break-kat.go +++ b/util/fipstools/break-kat.go @@ -1,5 +1,3 @@ -//go:build - // break-kat corrupts a known-answer-test input in a binary and writes the // corrupted binary to stdout. This is used to demonstrate that the KATs in the // binary notice the error. diff --git a/util/godeps.go b/util/godeps.go index 56be55944f..960faa46be 100644 --- a/util/godeps.go +++ b/util/godeps.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // godeps prints out dependencies of a package in either CMake or Make depfile // format, for incremental rebuilds. // diff --git a/util/make_errors.go b/util/make_errors.go index 0188452587..4e2718b8d9 100644 --- a/util/make_errors.go +++ b/util/make_errors.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( diff --git a/util/make_prefix_headers.go b/util/make_prefix_headers.go index 8787654b5c..b39e4ec7c6 100644 --- a/util/make_prefix_headers.go +++ b/util/make_prefix_headers.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // This program takes a file containing newline-separated symbols, and generates // boringssl_prefix_symbols.h, boringssl_prefix_symbols_asm.h, and // boringssl_prefix_symbols_nasm.inc. These header files can be used to build diff --git a/util/read_symbols.go b/util/read_symbols.go index 69d000282c..96c148ab5a 100644 --- a/util/read_symbols.go +++ b/util/read_symbols.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - // read_symbols scans one or more .a files and, for each object contained in // the .a files, reads the list of symbols in that object file. package main diff --git a/util/run_android_tests.go b/util/run_android_tests.go index 59ddbe75a7..51b20172a3 100644 --- a/util/run_android_tests.go +++ b/util/run_android_tests.go @@ -12,8 +12,6 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -//go:build ignore - package main import ( From badf673c77da61eb88767287f51a57405708e506 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Fri, 17 Feb 2023 09:42:06 -0700 Subject: [PATCH 093/177] Add bbe@ to list of reviewers Change-Id: I7dea47e73cbfbfa48a8924f3a633215c06730b22 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57425 Reviewed-by: Adam Langley Reviewed-by: David Benjamin Commit-Queue: Bob Beck --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e161e8e0d..69dbc20d8e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,8 +37,8 @@ To upload a change, push it to the special `refs/for/master` target: git push origin HEAD:refs/for/master -The output will then give you a link to the change. Add `agl@google.com` and -`davidben@google.com` as reviewers. +The output will then give you a link to the change. Add `agl@google.com`, +`davidben@google.com`, and `bbe@google.com` as reviewers. Pushing a commit with the same Change-Id as an existing change will upload a new version of it. (Use the `git rebase` or `git commit --amend` commands.) From e18ba272d4532659a20904c812207079c4ec2e80 Mon Sep 17 00:00:00 2001 From: Theo Buehler Date: Fri, 17 Feb 2023 13:12:02 +0100 Subject: [PATCH 094/177] Move constants from .text to .rodata on aarch64 This extends the support for execute-only memory in AArch64 assembly and uses adrp and add instead of adr. Change-Id: I388a13ec754e7f179d7a234516f1bb4ff6a5c919 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57446 Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- crypto/fipsmodule/ec/asm/p256-armv8-asm.pl | 72 ++++++++++++++-------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl b/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl index d4e3a7ce93..95dc4c8881 100644 --- a/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl +++ b/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl @@ -56,7 +56,7 @@ $code.=<<___; #include "openssl/arm_arch.h" -.text +.section .rodata .align 5 .Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 @@ -71,6 +71,7 @@ .LordK: .quad 0xccd1c8aaee00bc4f .asciz "ECP_NISTZ256 for ARMv8, CRYPTOGAMS by " +.text // void ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); @@ -86,8 +87,10 @@ ldr $bi,[$bp] // bp[0] ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] bl __ecp_nistz256_mul_mont @@ -109,8 +112,10 @@ ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] bl __ecp_nistz256_sqr_mont @@ -131,8 +136,10 @@ ldp $acc0,$acc1,[$ap] ldp $acc2,$acc3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] bl __ecp_nistz256_div_by_2 @@ -152,8 +159,10 @@ ldp $acc0,$acc1,[$ap] ldp $acc2,$acc3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] mov $t0,$acc0 mov $t1,$acc1 mov $t2,$acc2 @@ -177,8 +186,10 @@ ldp $acc0,$acc1,[$ap] ldp $acc2,$acc3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] mov $t0,$acc0 mov $t1,$acc1 mov $t2,$acc2 @@ -214,8 +225,10 @@ ldp $acc0,$acc1,[$ap] ldp $acc2,$acc3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] bl __ecp_nistz256_sub_from @@ -238,8 +251,10 @@ mov $acc1,xzr mov $acc2,xzr mov $acc3,xzr - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] bl __ecp_nistz256_sub_from @@ -617,9 +632,11 @@ mov $rp_real,$rp ldp $acc2,$acc3,[$ap,#48] mov $ap_real,$ap - ldr $poly1,.Lpoly+8 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] mov $t0,$acc0 - ldr $poly3,.Lpoly+24 + ldr $poly3,[$poly3,#24] mov $t1,$acc1 ldp $a0,$a1,[$ap_real,#64] // forward load for p256_sqr_mont mov $t2,$acc2 @@ -778,8 +795,10 @@ mov $rp_real,$rp mov $ap_real,$ap mov $bp_real,$bp - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] orr $t0,$a0,$a1 orr $t2,$a2,$a3 orr $in2infty,$t0,$t2 @@ -1032,8 +1051,10 @@ mov $rp_real,$rp mov $ap_real,$ap mov $bp_real,$bp - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 + adrp $poly3,:pg_hi21:.Lpoly + add $poly3,$poly3,:lo12:.Lpoly + ldr $poly1,[$poly3,#8] + ldr $poly3,[$poly3,#24] ldp $a0,$a1,[$ap,#64] // in1_z ldp $a2,$a3,[$ap,#64+16] @@ -1184,7 +1205,8 @@ stp $acc2,$acc3,[$rp_real,#$i+16] ___ $code.=<<___ if ($i == 0); - adr $bp_real,.Lone_mont-64 + adrp $bp_real,:pg_hi21:.Lone_mont-64 + add $bp_real,$bp_real,:lo12:.Lone_mont-64 ___ } $code.=<<___; @@ -1235,7 +1257,8 @@ stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr $ordk,.Lord + adrp $ordk,:pg_hi21:.Lord + add $ordk,$ordk,:lo12:.Lord ldr $bi,[$bp] // bp[0] ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] @@ -1378,7 +1401,8 @@ stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr $ordk,.Lord + adrp $ordk,:pg_hi21:.Lord + add $ordk,$ordk,:lo12:.Lord ldp $a0,$a1,[$ap] ldp $a2,$a3,[$ap,#16] From bade46179ea3d729a434b92c2577be18d8a1cc4b Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 21 Feb 2023 12:42:59 -0500 Subject: [PATCH 095/177] Update Go dependencies Ran go get -u all, followed by go mod tidy. Some tools are flagging CVE-2021-43565 and CVE-2022-27191 in some of the Go packages. Our uses of x/crypto are x/net are not impacted by either bug, but update anyway to silence the tools. Change-Id: Ia0e2757625b58d964aedd4217f21b72f293b910b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57485 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: David Benjamin --- go.mod | 8 ++++---- go.sum | 25 ++++++++----------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 5fd27f4a7f..23038f02ce 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,11 @@ module boringssl.googlesource.com/boringssl go 1.19 require ( - golang.org/x/crypto v0.4.0 - golang.org/x/net v0.3.0 + golang.org/x/crypto v0.6.0 + golang.org/x/net v0.7.0 ) require ( - golang.org/x/sys v0.3.0 // indirect - golang.org/x/term v0.3.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect ) diff --git a/go.sum b/go.sum index 26fc6b6750..a97a96075b 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,8 @@ -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.3.0 h1:VWL6FNY2bEEmsGVKabSlHu5Irp34xmMRoqb/9lF9lxk= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From 016de5ae5f50f33dccbf380c386658edc57b971b Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 17 Feb 2023 23:38:34 +0000 Subject: [PATCH 096/177] acvp: fix tests It happened that it used to be possible to run `acvptool` with `-json` and not need a config file. That stopped working as of 02397c7c97 but the test runner needs to be updated accordingly. Change-Id: I54cf0fc7420d18749e93c3d85201ba24d0a59e15 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57465 Commit-Queue: Adam Langley Auto-Submit: Adam Langley Reviewed-by: David Benjamin --- util/fipstools/acvp/acvptool/test/check_expected.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/util/fipstools/acvp/acvptool/test/check_expected.go b/util/fipstools/acvp/acvptool/test/check_expected.go index ccc803850f..2f6c5d939a 100644 --- a/util/fipstools/acvp/acvptool/test/check_expected.go +++ b/util/fipstools/acvp/acvptool/test/check_expected.go @@ -42,6 +42,7 @@ type invocation struct { wrapperPath string inPath string expectedPath string + configPath string } func main() { @@ -85,6 +86,15 @@ func main() { log.Fatal(err) } + configFile, err := os.CreateTemp("", "boringssl-check_expected-config-") + if err != nil { + log.Fatalf("Failed to create temp file for config: %s", err) + } + defer os.Remove(configFile.Name()) + if _, err := configFile.WriteString("{}\n"); err != nil { + log.Fatalf("Failed to write config file: %s", err) + } + work := make(chan invocation, runtime.NumCPU()) var numFailed uint32 @@ -104,6 +114,7 @@ func main() { wrapperPath: wrapper, inPath: test.In, expectedPath: test.Out, + configPath: configFile.Name(), } } @@ -149,7 +160,7 @@ func doTest(test invocation) error { return fmt.Errorf("Failed to decompress %q: %s", test.inPath, err) } - cmd := exec.Command(test.toolPath, "-wrapper", test.wrapperPath, "-json", tempFile.Name()) + cmd := exec.Command(test.toolPath, "-wrapper", test.wrapperPath, "-json", tempFile.Name(), "-config", test.configPath) result, err := cmd.CombinedOutput() if err != nil { os.Stderr.Write(result) From f39826d9f5248ee66e9a32ac0513d81349c969af Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 17 Feb 2023 23:40:02 +0000 Subject: [PATCH 097/177] acvp: write updated tests without `.bz2` suffix Go has a bzip2 decoder but not an encoder (because I only needed a decoder when I wrote the package). Thus when updated ACVP tests are written they aren't compressed. This change removes the `.bz2` suffix from paths when writing updated tests, which makes it easier to compress them. Change-Id: I9de6a1845cdf1cddca2e5d253b97262b023393f6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57466 Auto-Submit: Adam Langley Reviewed-by: David Benjamin --- util/fipstools/acvp/acvptool/test/check_expected.go | 1 + 1 file changed, 1 insertion(+) diff --git a/util/fipstools/acvp/acvptool/test/check_expected.go b/util/fipstools/acvp/acvptool/test/check_expected.go index 2f6c5d939a..c5dc0f670f 100644 --- a/util/fipstools/acvp/acvptool/test/check_expected.go +++ b/util/fipstools/acvp/acvptool/test/check_expected.go @@ -200,6 +200,7 @@ func doTest(test invocation) error { } func writeUpdate(path string, contents []byte) { + path = strings.TrimSuffix(path, ".bz2") if err := os.WriteFile(path, contents, 0644); err != nil { log.Printf("Failed to create missing file %q: %s", path, err) } else { From 583c60bd4bf76d61b2634a58bcda99a92de106cb Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 17 Feb 2023 23:42:42 +0000 Subject: [PATCH 098/177] acvp: update test expectations 1740ff90a7 added an "algorithm" key to the output. The test expectations need to be updated accordingly. Also drops 3DES tests since they were removed from the regcap in 82413455b8. Change-Id: Ibd23f6166111be361511c2f7974348400f7151e2 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57467 Reviewed-by: David Benjamin Auto-Submit: Adam Langley --- .../test/expected/ACVP-AES-CBC-CS3.bz2 | Bin 2448 -> 2483 bytes .../acvptool/test/expected/ACVP-AES-CBC.bz2 | Bin 15654 -> 15718 bytes .../acvptool/test/expected/ACVP-AES-CCM.bz2 | Bin 2796 -> 2831 bytes .../acvptool/test/expected/ACVP-AES-CTR.bz2 | Bin 20595 -> 20629 bytes .../acvptool/test/expected/ACVP-AES-ECB.bz2 | Bin 11286 -> 11337 bytes .../acvptool/test/expected/ACVP-AES-GCM.bz2 | Bin 1404 -> 1429 bytes .../acvptool/test/expected/ACVP-AES-GMAC.bz2 | Bin 6028 -> 6067 bytes .../acvptool/test/expected/ACVP-AES-KW.bz2 | Bin 2377 -> 2409 bytes .../acvptool/test/expected/ACVP-AES-KWP.bz2 | Bin 1873 -> 1906 bytes .../acvptool/test/expected/ACVP-AES-XTS.bz2 | Bin 865 -> 898 bytes .../acvptool/test/expected/ACVP-TDES-CBC.bz2 | Bin 22159 -> 0 bytes .../acvptool/test/expected/ACVP-TDES-ECB.bz2 | Bin 18121 -> 0 bytes .../acvp/acvptool/test/expected/CMAC-AES.bz2 | Bin 698 -> 733 bytes .../acvp/acvptool/test/expected/ECDSA.bz2 | Bin 397 -> 421 bytes .../acvptool/test/expected/HMAC-SHA-1.bz2 | Bin 737 -> 765 bytes .../acvptool/test/expected/HMAC-SHA2-224.bz2 | Bin 709 -> 741 bytes .../acvptool/test/expected/HMAC-SHA2-256.bz2 | Bin 849 -> 882 bytes .../acvptool/test/expected/HMAC-SHA2-384.bz2 | Bin 930 -> 966 bytes .../test/expected/HMAC-SHA2-512-256.bz2 | Bin 559 -> 589 bytes .../acvptool/test/expected/HMAC-SHA2-512.bz2 | Bin 1147 -> 1171 bytes .../acvp/acvptool/test/expected/KDA.bz2 | Bin 796 -> 829 bytes .../acvp/acvptool/test/expected/RSA.bz2 | Bin 694 -> 714 bytes .../acvp/acvptool/test/expected/SHA-1.bz2 | Bin 2562 -> 2577 bytes .../acvp/acvptool/test/expected/SHA2-224.bz2 | Bin 3396 -> 3423 bytes .../acvp/acvptool/test/expected/SHA2-256.bz2 | Bin 3810 -> 3831 bytes .../acvp/acvptool/test/expected/SHA2-384.bz2 | Bin 5483 -> 5489 bytes .../acvp/acvptool/test/expected/SHA2-512.bz2 | Bin 7133 -> 7156 bytes .../acvp/acvptool/test/expected/ctrDRBG.bz2 | Bin 1401 -> 1441 bytes .../acvp/acvptool/test/expected/hmacDRBG.bz2 | Bin 344 -> 366 bytes .../acvptool/test/expected/kdf-components.bz2 | Bin 1075 -> 1107 bytes 30 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 delete mode 100644 util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-ECB.bz2 diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 index 9a6c4c041fcd28cb55b336c5e7e1ca00c5e21401..02d4ddeeb2325db03e87d826261e84c14a38a358 100644 GIT binary patch literal 2483 zcmV;k2~74vT4*^jL0KkKS(OKeuK)`oe}cqRKx9w{|M)wg&k8^1-%0>T5C~uk9|ul6 z0Hr9Y2&qX{J-I3cNI}4<={-~RLFTArXk<1~qd)}5w2Ve+bB48pwB0wTwB0wTQB6%KafCN@1kRbtb z0VHV>1WUN#?S1-ke7rR|VY8>cTlc+^*{@rJ*5S6wEruJRbRMsG0l_7SfO$VA2Py#^ z1R{l%oj`^r2`Fs+fZ9dd$Pd9>gNl*T(889<6HAqz?= zjkQxuqGh?)mVhd=RDR_Bh?}C=$twHxno##Ek1mP@7p_sz-p&DG%=qXuXsoGv$+D`k zZZx})g9LStra2QYMEmehXhTU(bam%>qpn+RRLo)c7a?BE~$192J&3-`59d|2A<`^jQDac(sm#skEe_d$OE zM*lNWUCTcS2M4+?j^au7&0_^n-$%rq1pv_N42+0_o*jHT7^4jc|3|NsFjoC~u-5)D zY*NLQQE%eO)8b?6e#VN`bRcj6c3R=D3MGmEB|f-hab%Wlq& zeqSYi4w>{9r$*3)%fijMD}yB?X`h|4LP)7um!XAn2>CV-Cbt2NkdLl5?^;=duBSFk z=Bkv^bOuzuvC+%YB87Xb#o`kwG;O(0{##6;_7nlh3wcu~Q8URv`3v}eqKDxfV@ z!csw?H#!sB1RX|Cr2g3KPieHS-wug%5Q0HSEcZ1WDd$OSrMcAs+>Fn4r#E9)+DkKP zgHgh=Aero)cwIcAJOx^Al~GLT)MXJo)RevO$W4mnYqg8Yhg)%%Kp4E5cx=_A9#2Lm zNXiF0S-@Vc0~Jg?4i=#Kd)==HID$*#-f?W9r3ZsJrxA_wyG>wK$kx)ZN83D7>qpAi z?pb3Xio^|AE@+9=<4FpN7aV2C5}K8QCo)i5idppQLNLbX+k4YYyYM8*5qf2@yUGw% z6!UeX0tb-3kfyC5oq9TzlJ)Jo*sw?ntHa-w#_?PUE4hg<-1K>ZM(DXxF(+wE!Mpl3CVX#ajL=% z;zSB$D=hm7VkC`pA>Nh~3|t$MJx51M0$J2f5`9qZ?4nzQoV!7r&4Y|&Wek-H>pOM% ze8mCpTBY~uAf!VO5^uZB>3t2T+?FO-f4OB1fpi>T=+< z54F7zr<;+x!snc3A)$V?z(Hrb9(aIBzF8ca8Z)dSIT)Y_ULskGa!82Xmx(%|6-3lY z+L3M~J#B*n?jC(nzOEAWPKSrSTCkfGiIx}!((2Gaw{V0E_JpX zi#TCd#msAvzGr?PXU+K8MG)ll)7sOPvDGxlYKVR4Gbq6+_t0N`FphzslJVGaTWwZy zMyEJZPU>o=9D+cK%C3%G9xyz6pZBZK_cq4b8*FVh+e~e?(;FIWV{L%g*!p1v+h_C9 z+d+Ar5z-+THvo>k#*TNJ4t3G-dJ`1{2ms!`LJf^o9T8b63}G8>l`6o6oppsYm>Q~? z2sv{}jfJ?GrLwWeJveHPqohS9j*`!=S3Hp#q?4qlXqJ}=h0<-fP+3<&wD~u-=Z1Lk+ld%cDPVr#d=+YyiI|mG`l@_ zqIsr7uP?gr^wKF1^+P;v1CVkCGH?GpNknh?m&FvMno0)!~8GB~zOVjv@0oeZ-tCn>i%k)}26krn?=)R>VUF!bQ1~QsCaiN~LAQe2XSS6}ZfYd)cMK<4tl>`i zGd=<6NI{YQy#PH6J@d~l>^?8XYIKyJD;ycrq+?HvJGZ`(&p0%lY?HNJ&Z;fA7<&sb zs0uP-c@RJ|sjag&Wc0FG;>Lq2gkD}OV-Gu3VzPV=a%Ykc{GRrYDsK7!EH$#umEeSewCvqqW^58D5mmXvtl#D~mK-D$tF< zZ9!UastT>rujqVbsg^o20FS#hodvJgh2tnbbIx(V2&F>%?(MJyaUFP!=t!6ul5M6o xF}9NksNg`2V*p1ZpqL1r8BjMe9KP57z()`e*a&GL+)Q8bcO+AV2?vz|ANF+Kx9w{|M&x-jtW1g-%0>T5C~uj{|8%# zg#w90q@)2{U}|=zY}FfqsL7^))Y6(700000Gz3$`zz~$E(82%!GHHk!44x{)L?)B7zw6;FaQ7m000000Fg=QOwyY|pQ?E=Bh-3&n4rjL zXl9<2&u9V{nR2_+iBd>80EPl40w4rH2$%?f5db20y>7XT!U$UunjIr`&{ z>-)bO+-A48?H)cagmA+LCxe$Oa&=2J(sys#0CP!aXb&a@=mc{RiH9IV69kuE5Ckyp zH}OdZjUP=vUvFP#uF{mG=}J;4Nh>6P@C6h>EpcUSXj2;-*$fW*M4VkqVf9m^=O$DleDIcE zpGATH;5QMVkiR=s2gQtBzVcX(oLh}X@t}BOLS0$f>gQ4!rqmd-|&0_^n z-;>;(1pv_RMn*(I&qrR}3{i%Jf5X?p7%Mz_u-<#p*rkgqqTjnGPjeUMm;w+Gfy`ER z^cPRhh$lirvpYyHj?kM~f+3y)-9uGU^4i}Ao;$|JQ+o+YBWI}f=PA>IzgS0^iH||>7QYHbZv-Sye!+2xH3{U z+4 zWiOJXn*|M3!=P74ReQpvK$I9#+9L47ptsq20DJ{Kk2>u~u+=93p={-NG8(s~H4Ops zVaO|m+M8WoH1xDka2E1Bj$dn8C?Shez<_P)lQ1nsX%>y6D`m7kgX%%%m{#%@lo0K; zJ4=J;awzYQcnKceS`Gp?=9E-i*89{IKumjJT;o4ODM7rcp;OK_QYTCYw>trJ;N5|? zSk%8ekPvlNtXjew5(Bb+3tDoMmJ5b_w*r|0$*0um&p^EBM`$!S_a2jbL$N$eO6~CI zmthDb6oSulQNo^dmdab5P#lq%?qeG%qi;~Exgn3jq9BOu9Qa*3ks}9uj*ej6thi|r zJzE={@Psd6oW<@Q^x-c|FxmlnxR!OitvTFuUNcI7akPsB>PRU}Jm7Fvi<@`I;DrT> z=PMBMU?)l*0v_lr-<@@14d#KJc4A$^J;O0`ZXHRBKoP*OYysm4)EsRgQ9|E}mf}$` zjzq>t2~Q~=oZyS8vG$s=Vi~v)WQe^o!MoK6DvEl_*?|MdUr1ASkWRfF%E@^4-RxK- z1y$(t)p5Nbqf**pbyFX<_0DZ#P5}_{Iu)f0v72@2U$0_cg85#tdC(dr zZ_*ENLICOVEEd==;4-(5mAL~t5Gjpj!N-2-Liw?aJoX#}5YbwOZotCigI=grLkyRT zV2h#aMBraHF?qUZ>lasnc_&vLjp2Zt7jX^pY=d{Fan-siN3W_8EiFigdR9s`x+xT# zu7^g!aJPCj*R6+f#`QcE=3;_kU=`_+lr<_9)^_Xi`K1BxTBY;EK}d!mB+lluYvC$* z(xKL^6VW2cVji+o?Lrd}cL{@}+@!96MQe6?Z6yG;)5b7{>sg?DI8Jh8L4!Rv06}NC zJoJD`oU%DIG-p^uaxp*j@XA3RVY9EQP=7Gcr$wh`K(^07R* zB|K6xA{}T9VGZ#k#~rFXQn?~>!v?$*hg2E6Y4x|e3xu3Bb8aj#}be(jxB z)e)B^2hH;?eE*4Gf)|~!g2Bq(E`f`gt6MF+M5PrCx#I>&%k+q#^xB1NCtRx|DJwE)P<)H(%g3f#NZZ(yFe)pB0$6`B=rsx(2r~(l>k|tyqcJjBv zG=T=@B@>t_O{N4h#R2Ko8CrS4JH^(g%I0`@usU~Xk&Z6`h&bZ-cvcNE3PU6pf$D+M zpGRRJmcUa$U58-GoUAUcaCy^i`7-(W3gWM7@K;w1eiFKn@hZWQ)p%Af!}0aYwR{2i9=v7XrhYCxX3# zgfWXoyR^)5l5ny%YRprW9QgGL_7+2sMWW;FL7^)%@ysrctDVdEj^g3$d;#;Tx5$ST1cJ+?`%>@T83By+}HIm zpVk~>uJz4|z=J^OcM~UZfUGgAuJHlBg!6yoEdKqkyq>(B)~A0jC4OmQeZAP?w9+V~ zy>Q%^4LR%k&wm&?FY51nyL&eu{4}gL>W(WL)J=td)l3b|J66=C1oq^ZwgAy?G`AtZLVoJm;#T+*~Ir zJ1UVJSoXXs;YnN@vK|JLs3XTE8<{45>XZ&dI94O^2}AVn!y*+{GJ?B+IICCEzvQ4MK6Q zEn@=E|F^}=PltGRG^`MRnp8^&4 zPRxuQz0G#YxPoax`0Rw+u|9f{%k_Z|XDx6blpI0FaA9u>uj9{~?d5OEcXjlxzrJp^ z*>E@MdhN^8rbL?WK6phXvf8SQCG*s~toN+8I!u(II=5`z{Ni1+mA03SMB=#t{kU4je7|JSfRVqCQQ}qt+Ei5C znx|dAXWp<2e#cV)5t-9L#dlXQ6dx?B$#08qilni=7lfK}xz+RJ-B2w(Ce~ox^*lunAotG4Jb97h{S^Y2F!Hfk@?OAJUPL!`h z8;%-+DGy|I>el-eiH&C#0D&L(*`C2y2Zp0=ZFB+S{PQxdlrbo5f=O#3a4v z7ih#8#HNOlq12XUsI73^Xk3ik8r@10#&I*eo5kXsN$Jl-hE1f}7o_|pDg|AL0Jl580aq1qF!(1x{+5^N_;bBWv?U ztSl?tsw3MLNJW*>iRF*%AB8@$YY`JczaHPsT|yyz-zHw;bNe?T7f?f7k8<;+U1I!) z8tALak?FamM{jV0*+@YA?rFpv$Rm=Fr~32F;4AgZb%?8D;hQ7MoOy~e?eq0^4W-gTG{Fr&J218F zn|xCB+!gxjZ&ItG?#rtx#WCC#!N8nhPGOiIgy?A9HDWT^&H2pLCbN5 zc>ll?zb%-+tHoVh0{zVXIpTmhsEKHJ7Z%4DwE*YMdHjb40XZ8=9fHV`K&|5s8N-bx zAH^KuQRlMI)~-&2y$S7|O~HvK%KkaOPsG|vN!Qr3hg;>NlR8Gr%ho0ao^6L1;t^K%tQ7ku$PNrUXmz!5J>c_|0c zl}x;JiPY^FNp{rA>l?KNf2WlUO?fY}Ui5yi)X#~E`yS~og!64(+LReZJJG&3f{^HS z$XAFjRPzhkeg|Q+cQRT;qU$Zy5b1|SS4SeryZ*g;H22%QgHEps{_2@fYu;ef-}-wx zYugruTcLxn!1}yV&6Uj)T;?vKXvOK13uBv+Ye>T#GwB^TiRJKedEZe8u&qL~U1;I9 zLCug`)_6>1S!)^KU&t0~Mhe5p#wM1dN_`Nr9r|Z^QMhSD6ztpefEsh7SLO)1HE`4) zz5AHR%k0nuVmx1+x~+wt4i0K(h88fb{FCH@J9)QqGw_>#v$6FDCXv}(fageeNNWol z_PI>1Jf}JaHVeaU?o)UB-Gt^+LMoS7GtoYdj5gni_)_~gGj;aGG&ppt&x~8Py31xA z*a<&~?F}-MVmNw^7ZMrZm%{^^CD7=!fy4<5I*R~1lg$rA+?pUKjSiQKac zUe|EPR7h+qQk`R)NJ2bN7A$2!jwjn}OcFX(Ssxj*WS~amw@2SoTJN>^n9W1LbelB+ zx7rnkkZB`%OnSaVO#o%2uk%Ek2iF(v0V8qVqM3xJB$aNH?iyLt9(Ib%#sL#jI-2G; zrO~b42{MR(5}>Vm`*kY~y`&B00l{reP2X*KFA7-8VZMd-T#i9~OPAf|j_9)x{Ke$z z965Sn6GM{GLCfn$8xBM9R;9<&sualt$3wt^Yq^VaYsjtY*FD`&=))c2(U&IAf2JG2 z7cC>0iz43hbtJA(4-Mt>{d&>pJ58ays$&B(6AUovFZ4gEK5ufDca^u5}AroTB$ynd8Sd-)vhm6ATwM25b6NBgROnEWr#e4A@whE5&66(yH@-_#^{U;pxRpZ8 z1}g`w2qjtG$?QvJ>MGJUyl7}n5mvDqiI5XTxrSfVo-0$aM#qTiQgP?N8|845{veo= zn<#E(C+N0BBVv?u$>8xK2-$vMQVN^yB6!ORwtdEaD9(z$ej*8RZ*$sN?13#2_ zHkD{T*_Rp_45}^(StnxUyeE!qM{m)0`gkjYkH?hP6hdEscVl~{`a?5@^#J&xLn_5I zNX2;K5FOjTwew}icMH#H=_ZE0VeMtf_LRd#zbpx#dJH!HxcU(<1OK2I#ERCoNrytI z@^&pxGp2X4!bpnp{E&Hc9&MVTMMm0sBE@OY=tCf_Do+BLKcRehi~BB>Y>!LfvG!+w z+=Sn3{kXbB&d=jePrrW_SzoqBa@5E-nQ3e70&mfg7m8!Eq3a$y^28Eyt0_QL&jHxq zN<5jr0y3e(zUPyf;NuK;T>OTrga&BsUt9NUG{-R_=n(u|WYl)0yA+zBnk5&VD3IA3 z5__AUA!+k?%nF~ZW3eyCKtD@1ug}gi1DaKv>DC#reYXR5U@*u?;_|4Q3nr&ceGnpn zdN!DXg`5>@_TDsf8peHIPbaIJew?PY(vs9p4dM{%{uS{R>z}^R%pVhA59kL&Ps_0$ ze&8nM7f4%Hn&#b0L@{W_adL5yZ!S}eVW4A#p&Q+f-e}6v&8M%peI?+uPJLEUw(Q6V zXZAE6#$$^O<)NEhVs4w3zg9{n5EZXz$34%lAVLJP*-dZm?UTj!d}0|RF{6B5&z5vW zPLXq|>6l>G#k{a9smx+FK>Z&?7-&>FYwVMCu~{%}0@yHxd9ojxvW`3`=6U+Exjl0L z2Dw+;R!E!e7Lu6$WJPlCH;yR`zLZTgu=n`VQkrWh@E6Ec@wwf|hV&(H(ikAIC&{Is zQ&eZru4DhaAfk&)iJ(a_Xgc+6>8&$LVVx)&H7wJH_ORy z>HEncMo_)gxQ2e3veXwPf^iG2xmC4&hPaNi$$lCAQJ%w@$PV{cy8#SNoxqQ@!tx2S z^p4pQ(b(1&pC6>i-X2VV8qzydzXv@BNWvbg!u8L8BOvpJmxm^?ZNH8op%AjgNs@Yr z9e#DjqbqY0?-mB=ZkzSI^9QnUXjKb>`%4Be*9p?6IfmGcD0sl2=%zcSI*j#N8AjpS zdVAo0%-60nnaNmcXJXNJKenLKL@7fvk&nwUlRdyPPRe$j!>|0{Vc%uxr+AlwuOi=` zym|lC#yS*#70#{NwSdQbZzDZ+K<@c;lhtI+UJZS45mkVaQ;NcgwSq`peA|4P=zZEi z{DytdBvI!F)GEm_^unN1Gf_N5OGMkqV$bUWLE(O7`HpscG^pnWT*6vthMnYoE zK+2d}KX-!IJ&{7QuJI_PUR&INA+NFOiQt;^xseIzB;V&AE?{R|^VG$gH{x;>sG)?d zy#A?TRdOoU#CubB8oOBjHeY*_Oe3WR`=J!%@4<1z?K`xK1B6i@X507#S^EacpKyTZ zpaEwSlIf0t95G_1(^QlJtPXzlnX4gqdWNK}|IPU_Q>2mcX6?7La>(?qzL+qI*qAeD z+U))_WB0TaA!mXhwwIVX_U0cNWQs6(3)-=oy}_gPCX+Mj)G_tothC-|sVh$qKWo?9 zOD~)GbYt(t)ud`I4jeCCKwGT6G9ZwZ0W}9X8N%l$KdJ5Vg=S|BdIx&m7HY?e4mE58 zQqpp3X}hSE8fOWN8c*cou~;Zt)@5UbO)m2zm+3=)k8f$@q0aB8?aKCD9tzHk-S#`~ z@(et;dMc=BhZR?)Xp=D2mk%EMH`t8o$W@&GF0Qgqrjb^n#9C<#_e}+L*~B~Up-z`J z>=jmr7$(!wOQo*v9J}2j6tQ4dQey zbn}SdKhC!73Gwh4)LBdzw~g+HVxU*$U%9gRB&Hi#Mdj9nnrzC9B50;Llm%Una>qG# zuL}aE4%Afs<^>W2(Mgjgo()*jvKbmSdnOok@3z7VgSPQ9P~UUx`Ckj$zUT{=xWAZ@ z9LDdN>YjuKzCKfImE4rt8ikJ}72LQYAY@#@EI`G-_B9dKw{h*d)=QYaTMfoc@qLzmEp4jQ19qhyxuq-9* zRO6~h=YVtLzYS*%2XG!(!{h$fWZB0G?E`f%RFwPZmGe*QV=M8X#6y$O4wXy)`7}#$ z&KABa3*m)KV5^BlgNZHl{kPZokaG)?X)z9_T_>3_AS`@luA6fM!Gqsg=U5S~#3%R_ zpnFR4|E*A9slt>WUWxS{C+c=ShYJ$iW^F;)KQ+u2Gdf_hl z>B^mt>HgFc%0NRU6Pa2&-DOA&PujEC`_UexG5M7621nr8|8Zm3qT7lPm6S&{8JNwl z#Sgj`#yr*GfvusQD3e0z4=ow1+qK|QhxXX-!YRy0o!6R0ihlXuk^=F3&@X!vj`lu7 zCCOnL#{#fi=RJTx3rn>wJ7oLgcggd?r7NF#w+msp0c*P?Tp`?bn668mcOq^1~t47%7-I#VI8h5|chB()WC09hYc_tu9tlyYOFY0(_2jl>Fl6 zoo?P9zo81m?5MOlw2Q(F!qpQ(2)v>_T43@A&++tV610czWK5mSCn#sc2+l_ifW$%sr|xJaYg=FKtO%8iq~>UJHGR+&mbYr?HPS zD-Jk2ZSY|K&e%1rOH&|yvS+UA_pp!PN9xNrXkTURfs6s;NzEKS!})##)wxI5I*p~e zC|q)0Ay?~10g>Ks^xo~c7zOd1nmF?f$B^Ag2T;rl*p>qn0mF_YlkJA@YcGm5(4;BA z>H}4lUgJV=pdF+PV?TXIQ)7PfiQF=0?w`D#*C+w%&j65WEpmGTiA zcDjfrUsKhnPzp)bN3&(BpLy#`f$I4dA`h9i(=cThPT-ApHs;HttcWwknw?D7S%>q5D)_;vu;cl845+e9 z_9;#}5@xx*hTG-Isl?MjP(K)1Y?rECcy+S)(aQMQ0y-#IK{v0H+}mOsci+?*<;!}zbvg(_nfO>Jj@>X<3?o^Htq8PpfIxuE&izE%jUTjMKLIz zWWVoQ%#=Lvl5Mfluexhz8pqz%QK9wUR`czmIV1lio|?k6^5ZnXJZ^rQ+H~vSZ?BMp z?GN)NZ{7;^hspY7QK#EkRg@WuIc103;}r+pfR;V-(1y`cHi1E(vx=R;m6*^>37hTW zxI|l2`4t_@;_aJwS``_Yd7(M5n7kI3?uAn^R_E@9{ONCRuC^Q3JJJRJzIxjqi2%D# zgN9R@$?5^{AJl6Nf$S{_KfTuzAW2x``d#uSQGvE zKk+9TBYYd^WzFxuU+;MxC|k@Xvewes7|fu!5qTup6Hx6j2d49{tAn(WFQwkc5?mA` z99^lU)`^!c8ZW3+ndtP;r-`N8{YDK86FJmKx|3?vMg!J{cjq)S0Kr8krsM|!3*9NI z`L8Y!p3+jl=G4g~J${1gHd1*bhG87u--$TdJ6<+H>OJjUmX1lFH6mLu=OwTtc1I*Nq=8{K~Jth^x3to>7W)!_=M0CPPfn^*`wWYV}petA|n$a#m`^8C42E+2VQ3 z%E?#TB}mKFu|u8U`zvJ69C*Li54fdOdy&z~@4Em9qd4}?22MD^2Nk&GX0?-3eZNl5 zUSL=j)_8o5dCu1paB|*Aq}(G~yY*uVi0SOfVko;4K0C<$TzCFET`VTWgM-#~M0OVn zf{UsF2S@v2j5$7yOz|;!;i+6`=HXlSuEx4jd3C(hpcf1{a0ghW&He{3lHSLT&BWig z&VK51Bm%CJ9UN7aWgu`)yIW}8UGwehicy+DCD9ylXc~>%a|f%LY+}yg-g!AjnjJ;e zFHaqa_vPcM$#WyQ7m&{kon)I!;^a{7*B!>DZ1G7QuTAu$T)gj11?=R;CGUQI+P-;6 zOAhel~b%dC~vWA|G~i_DDzjkpTw=B#nGyEYlU zW8vG$1pAfKRKO>PwBC6qTSlwS)}4&7Pb|1aJb$(_b5a9XRboSM)h1kmOrR~5X6xO@3&S(fLLfX#M5A zf{4mcnzbWYLMhiERw!@To?d7HZ{}ko+RwY2irKO;PdXsT&oq=n+ec1NyZ|Li;=uNB z5|7k-XsQU-5=R#TIxjpn`?OaU6`nH zJU5waCQ`h~roAV8%kEgZm0HjSY8EEvu-CLE6D+sbsR^k+-q66ab7F^IE%WMiU|t_w zQCeSN;2HHl&2u~Up~k$7M3&ro=*T3SL$$&KijJuC%g04T#I7BJb>5d!R}FYPyweEg zv-jLevO*uN zA!CPP7MIV)OOrQ5a91*9i*jN_ZC7ZP?B-~pKFwF{FWota($&-8EAFS8Q{Y#>NfXlf z&bPJw5@ZU_cVBJR&weENNcso{GG41Ka|RQG1R8P|;MuKr=Vwjg7^mdAVUykA*rCV( zArJ_;62ON^K; zSh_&=f(?n(H()BBqZsPUUoftfb|d0gSr2O6b--D8nABHxaL#)0=`&H)m`_1adZ(qi z&%(&>mhqg~BwOhU5J_Xs#iC)sQ)en(y^2lG^tDs3czem-=F?D;zlj%Ge%fJ~(e(Se zbqg^55-yZw2Qw>N?Mz74{czcIEE&>`6niMD34XlN%TVZPSu(?IPb^Bm| zcCeN0SI+sOkdD(rsR)B1La>G3sHE8*TY@88lc>KVWRJURC*huM0lqZQiI!B_6==BgJsr&L9Jb2GC0$R zOxIPrd{Q|){a5&{XXkX21QY;kQ>4*5n`E=g=y#-Mvb{w%1^V|8VyNwG-ibVJ;b~?g zA%2+$Kys%3zSL}g0qN$m%&RFJyT-6gcT9>O>0ky{e3D3-FL3SO7eN9uf9WgWOl8g@ zhCLi?i5NjTMLJRoZCPwwyr$dg+C%9Y*yIGT)RP zGR~f^#*%5$(6{mXTtujiIOCAgY++E@p(7$zdl|?3=y<6NV6FIA; ziZk}2d;vEF6Ygg`HOY)DUVs?0C2Q_7u1%T(0}m8ka`LaWcfe)8b>$~{)~;|R2FbjF zu%4>DU>BY=+9)=AaLzK>SwRk;*DtvDDwpf(-d9dU>R&Fl+9tS=NytZF?&?B-xb!K= z0b6?mLo=3`P&|ZIW12~7AT)V{tB1VAJHW&hc7pOhn6xewMIBF^<^8jll`L7cqTO8M zA`JCozxoa?JA;_@ot`YJHdQ+R`7XH<)H(j>>N)27DbdG2NZv~4pzs5Annv?W?x24v z(2>2=e3G&iOsA~{Tj(b8D<@~yO|V+TDIuKwV`f5dN(NTA#;Yx{G3uJw+cBCGJaO3I z&)o63bpA*=%Zw5YwjpZ{Ax;yHPEitVu7ui>*qM5W^y4L&tFF5)_{5DB7H)KY-xB_? zJcdX+WCy(-_Ttv=`3GF3%6bi3Z10}Li?rO6l@1eJwW9rcVcVe9YtcDHvlfrj{S{=L z=!8_B!S;`YU3-9*<3#vnTEZPmW?$z{ZK5&HPO@EEu)lZ~%I3(SBiWZRNV@#C4?0cN zW<7`IfLHo-Un`Z+@G*({>M+1^GRCs(0f#a5k6jKaaT1Z_tLbx@DLaz+9Mxx3e3^d+ zsih?Gi@D7g=5m$lkr}-tg=8&+wp81x0r&!~HlJ89x7n&XNQ*W*qS=@XL=50BMR<}4 z-*GHQkT6{S+B^V?Ht^IgHaepUKLV1kU@Jzr8&09wPT8EB24&)cTIX02o6VaSk^Gor ztrri~jW20X$YcJer#3FxH77j0rEunuCMM{jK#{XD2tB^6^d0Gg9wBKwOm|N#QuN)V zQhJ&{UvH5H&pJxF`a|GT2fDwf6N9{HO{R-} zJeMZQtMC_CA_Q!>&ZQ`x6~?8KDrqK%XEd7ULJ$eITW%pLCD|qoRzsV|XASETQ?o-7 zJ-`$yMdRtU>K0+&645mG<8r?J*5L#1QRgk<4+m?3f|}S+z3IUIGxEj&s{8t|qX&FR z!l$pH-awkS!&TjEzQxl+Wfn|!Z~xV{R6zfzG);vRkd7D_-WjG>T+TYlx8O?@x0=i_ z#eNl7JZ_);`Fg_a&p{(kJTe6#3^6mO5mSdCqM#91B{!~m-RHaS<*=hfE`?lMGIKbz zN%0-l{bgYiK6sQ+>t_##-+?(-MZR}^e!o3(MCUO2l-kUheeWMt%i$hPxZBY}QdD`I z`A?ZfE3I46@RsY{;&m`ULFVM??mkAzmu>CXyr>$`Sp4)rPqY^xBzwYNAXr26!~@k3 zg~C}9A7}cEZ!2nJ*(BeJn6J?qw0pCl}KEh=8f-nN=cLCUf0LR@q>R zYQLUI%@fo0_5m9+1B_Xq6l&$C@esu;XaGliT|t15U1t1bqf_%&+Yf4rDSjpL+Uk2LTf*-a=-k#F!kT+r4iHBZ`Q&mAPZP-B$K$!?auk>&tp=xs|b zcOLj}u8owH?R*~og>5^Cj$iv^K{MsfmX>YNkUVekMR1fJwC;@}SVy>xHs$+piyMtp zj%udHMQuK@@jt9~9^Ly2i9y6eRlS(EgVUNuT-e)Oxs(#{nUvbYD|+-&*-WJQ2nVeq z#I40Dl4foTn>{M>sEo%QHz5hoe}lxU_5pf_YFKWb3kDVtR$3xS6@^BI$-6j)UjwSt z2zQwns*XI{kE`j<#O^zHta|5(`u7a^R@M{J`_ zW?pttPq7JpRpOYX8G`dnUEds%9O_DxvGHqvVE(#!TrLpu;AcKfS17{=)xUWQmFa$b zYwsWR%qLDU`yF$9T$`_Y{;!N*+nonw*=PCwnfK(Le*dwEFX#HLsNtaPSuoh}!8ik< z{jc^{h4@w!SsZFV^V#vB^KCTtHk^?WoLLACl9;*EZsmWn+qf!^w!pBiogU-AOf6sU zQ@`9aJTNLwKMWmg*;7e{qW*rBMQpEe{n3}Dd>X`FjXS99QCq{7jV78;s7>L^kZ|(y z_}~IA%itbo@yr(rC%0uw7y)~!A?*$9L@`OVQ`8CxyBU72A9E*{^fKSGV z3N_;>I6B(b=kVi{m&fT`^>rm6DMz5%(QI|`3D*#BmpVy*18GCpyrUO8e(=2Iui$H$ zvzJ$2wrxb?V-s8mpxdQEW9Dz#F7N!}#|lQ#JRDvxO|JOgSkNfH~~!#lT_yC6Y~^!C#p@ zRz1%c?wIQYJ&u3wUCGr*^9sPCfQ@z`X|p)7p0huB+kQrTu8TOMm=#lTh}M_+udqS0-c(eq1-kuIbd2pr%mt1Z91QEU<}sR$XO#7yK`o9P^DlEhuYN z?N?BP11P{xr`cvX^tLQ>u6NaxXXKm?sGichQJ+r_$(il(!TZqI zQJ1W?rvo7zh}XzVm!(%AOBA4ur`kCLu`%+zPP&xD4MPLRKu?|Q`;G$L!!eV%hb{F~MtK!s?hSSC#$%9XoVu<; zbEt{sebg-()C~PfL7ZK6H8+hTJ*7WtNx&Ar`BRuE24Lf;WpYkpi=)9eyM-_-Qi`dg z7Vz}OFab2UG*G9FFv}>wc=Wm(LfQ$S-|xTk1KF2L3rIZ&+luQl&`r3#~oeP_*w=$PE z&_U4VU)GnVCSBQlO)Sb`5}W6UOt~c%t>NIzA=wT%J`=8xOrqzpaYGlKw_y!*b){pa z@569+lDj?DHA2E>_=QoM1TgsW&vjs#+)tierjGVSU%VM4SJzb9Tne_?u>(USmm)eA zgGUji%K^LcRmOOx}L$-(d49NE8#QkRWmuWm_Y^!{;e2&I@cp_9+h?p z1!-~>3K9W%5%+cX%qIK-)`f!s)Sp?S8>1CNUj2?miRVSWENN{Z1OZB7GP`ss9OLV& z(tP}#KJ(jqKbU&-2N~F!&nbxP(j+V>Sf)-zdZ@3ri)5U=)Xr*7$usu#xu>1F1;yok_g{6R5zYv1vo;24_Rw z@3!N`8(4m#9+tGHnD(*}JP#c#32h>&B;H55sd4GVD8W)}dqNyu08$@hmV_K?w~y?-G*rHsBg; zdaZ=q%sWmNo~MqcL8<&s&(mFz^#ecTTlashC+Wvi0lCF@O3E0?_K*4m4oVS%qv^EH z+FH|Cvu(1;SR#E$G;UCGwr&xigr`LLi*176GP$qdyI)-hUdCbkh_sgd4#1MWs%Hih z+A!-99yzOTi%eKH~a28c8o5>RON|$$0wl zR~JQyCnQ12W~^Q;iIX+PS1uc1B<$xbEG%MgfSvn&KQOPPGJ*yX;KYY>tivefKNj09 zw&Fdt1stA_5$Xmh1bk+3s!TL=#@j3C1e>(YF`+~U)JRl9DNXt_tAAbt<~M+jXBgYfb27IX!0h zf^zqp8`H}^Cf4cc=KJ)HEa;n%#`-Zat0djE3!DnGek@<%04Gf(@WHMJ z)S(LSzFnOS+T=8?=Gj=;>)=!nFgOE>8+N^=k@-nFa@TnZNYt% zxDMI2Wz_DpKm$phB8`P95f{2QOQP%^+BR^VR9EW;OPgIYWf*JG=GJklwUIiwYjqCaSD8U(`sWh!&K@Zt*8XxX{mW*B~$gQ$)R&!)*UQNo*+;| zZBjgy@TPISa~PH+D}^@7y>r<*rsKd6I? zuT6{)_bbBNSwH~OLz7irP|Hzf?J0W1GqkXiKFx>~9dfJL(5QvoqRh(o$wqy zC8f(|6p{6_GgpnB)CDBLY3huzx)Vm3=oHmn5HPA!;~i#0DZTQvMX+C&DX@}yyBDQG z{Mjjt{0y{MuZL|OJ9!2jb9oA9`*3oSc}E4l$tKzQ6)-$HY8B>hyIpELo}8MAI>sF5 z*6SC2pU(6cwtG_h$k^VTAWB?)qzsS0QrHf&kZ2!?K1@kaM(amTl?(IwNt#u{)bnAf zYVjYN4QRS9erLaU^`rvo@tHSxS+4ie(3a;vkLuruUcRKIt*t_xQ*JN1SjhO)@(3Kr zcwptoQaS9wmtliM@&KbS;(X+KKW0lIoih5ZNDOM3WyQJBAAyEFfc) z=Yg?v?#c%w2T)5EKp-iKW}Rk{QoyIl;Yl1IEYRQlIkI-Ip`Y8YC(&@@x}A6O6kxon?)AnL$B>AHZsQqL!_GmZfO zdfQe;6~C$dJZO=nOVe9WuQrLwcMjRJ6|0$4M4w1{LswP@W5yJ=ThWV#f==EBSG5}I z6ShizVE=&T{1 z@h);;H!{xo`VG$<*^^qY6?TK#|BKPMHRf#U;NtWRWHeF10fP;Py74dsF`j zhr~gfP722gvilGl4fP}{`BS-p#OwL~4#=eH6c33zlg} zZoX^?5X&nWAWmSG>P@aLQ7~7PYaiNnT80ibF&g5SwGR;%9GZ=mrpJpV$Yn)6bU4vvUM*Oryj=6v89{gm|v& zghHB}JFTne-buWmseIy3jb@21hKPu_u+C0Tep zGDj1KhH!N_Z|IP&p2+t>HakPV+K^I^Q07xoQ-%iQ()cNNG?)A#)=`cq)KOYt@F7-} zFTllnX~(F3-`Ms8hI=)9q@$bLd+|*D&><+!8Q8XLk9T0dN^7uH>fZ?Z38>ep?wdKK1%K zJTO#$;#`rmGPCmswmaOUxk(}ib)In<>}3-OGSDFX&g7jzclN{@aacCn)MDML=AXJO z1i#^@ls&0~ZDv|q|7BsPN8%5^Fu(gDe;pdV|Msu!|0;`r<&fXgq3pY)oc%?Ie=ENh zs%U+c68VF?RdwIrhLo)38v9tR1)K5!{T65AjwZ99FJzh{6~l6 zki<*Fi#@zV-jl|Y=IEWm`-rq8W#+W7Xyz|Tx~T;mVx$}{rVHiopT;8D=?z)2wD<=J z6MlRviMeerH#fiBy7}@iw7aXf-6!PE$9LHW06Q2opQ0o!g- AG5`Po delta 15534 zcmV;fJW<2udZv1RLRx4!F+o`-Q(0SUJVgLQQh$I%R77M@2LJFNpbiQ@uiq+QPI&e2 zdG~hK?Vk7m0EX{AcT=}_ORJ9ED{al8({kF|dOELIY3{b=yH#!0?VW9_xz;M`ZB(k2 zrS3HC?#}Jq+P5((&38FH-s8^A&b8cbRxP^Qjj3kWYnyj}4%ka;8oO<-ySpac)3)NA z?3vx`y`J`YCu_OVs`Z;qZBJXO4ezG7XqTUAZfhed+;?r)c5Y55Yn5`=?S$@F&DUy& zJ-ylIXLqiuUGDB{ZriTvvuU@tUfb7pySF@MY~J2oY*%(wTY2yb5~hs?gA}Dm(-EKm z8f4G{RXl-zrVyo70{{XIGGK-Tp&DtSG*vyRl-pFq$N&Irpp{Pn04Y+SWMmkDfSMQ* zpQ%)-pfmsg13&-(B~!@L5umD+G{G?#fuV_slL&qNhCl&54pX0Bw4w+faEJ;b1Bii9 z5Go=CT@evg2N40pKyic-2T>3aR7!w=iU5F>0Ra?$1O#)u2p}Mbl2WU>uCH3Fs=Mav zySnc4zW=%L{C^L^@ccYyR$E%oe0BMJyq$ISeU+Wp^NuR`S*|mwjPY|#maQvCmrK9& zuRR4t8d06y|Gc+jiKB4I3M_+Zxz4 zEY{m&Cc$TB;oj$6)&AAji_os_ueR^8!goh?6n9)*#9b8^TvT^a$8p?se|EdOxmDHL z=XJz)T@}Y&$3#`!UB%P7>+ADZbt~$=k1_}ze*brGe}4YkclXNDW@ct@Gcz$tQRZzV zwW9W`%UqkxRJCR=YtkK3s>>5Cfe-}H2!aCQPRUyzGF<{=%(07n4SXYQiod<0DPpAF zJ`|4uv{KwsIF2>m&6~FIe{6QT>2<_nf~)BR<(5E{@DkY1Vb%+Dn;xDNE*bSWS;iPb zXv>OZed+A+?L+TWao8Czm?B)7pHnxY%GTrmDqhs?*81`7o;OxY9 z+^aEk#|~cX{ou=TQdecPGsTW0P=q9tYf+WWH@tg`zZq9_6!XH|+TyFklSSuDPSq&A z%i5TEDhvH(ic!Y;f2XHwnH>uoEiz{MInsKDA!5-dO6hCH9ubVr^&a5QB@@#_riwSj zuv>*kF(yq%xGgf?Q`Ua>o+PxGd|eH#7>pT7Xgqg}UJq)$y$taQVt&2_#@BAG&KNl9 z+?$eeE{0EWkV5VA4LGk@gH+3X%R$!hYzf)e@y>EcRY(%Ue+az2V`${&(b0|czGY)t z+m5*&C%f^wq1)cav8byn5wV!k5JJHaGi}N6K200DK+$KmOL3rL2I1|=M8Vute{k0_ zb$by_s~0?t*`68`m=g-(wMmZC4cl0nk1O#vJc}o`+0DnFT^hn@{H|Uq#hhE8i%N;l z8Z6KxmAUrs1Jt@DlRSZftP-Gy!{^UjLs|&H?G~#IGIQ$(KziD6C$A&y9L!2|q z&AX#yGgOuxBTMy*)9JUw@wJmX5WyhD@1{>BD@*#mSa+AxO5!v0M zgyB0+u;_!(;sVjMJab<+cK*4E`q7d_XBJ{yp@+&P{YN_1`n@ zdpdPT)8y*X>9Z!g zB}9=G+uukbBT-&G@{&xR7UgRxj#pgD9^J&xG0Kr=@0fv0`!+?Wr!)Ry~j3l0=|<=7PR#$x`|%bGZ&b)f5uE^s0pA5dZ$Kom*K8Mn~5-D<9^v!Dc>=3B%5;v4z=s`Sm`4=8zy=} zf1b?D+D@?$`NVgf6K1^MeuTMi6OXu+9n8DKa{n0nwL4FZ+);jC7xT8r;r@c$_4rz+ zO30DZIsF$g-IY^jEvwEPlhIyEk8wyMwWYPjgCCyQ@!e;2fm&WAD+K6Y3`1WjT`$O; z&d83jp}HZ5B-xW+nJl_JSA3sSIs4^fe~~F#V7-de!nW9h@2vZz8;POf215ERTwhls zX73v|_jU1m9=?t_>g76P35@7gBx_N0E&C(M-x9Q(8}tlp;}metd_k4;(*7s*SdRT8 zi-)1-#Gj~zJe;M=8mjXmT){<{ReKqY6lQ-EYrdUir}V>c*}l1`hrUhoGrq z!`b5*OW5RRwKS(WNE6HNi`;tl-wtTgXB{~_l&Z6zt)kx}`0O0+^QR*8Y=VbMhxMA( zCEVD?)W?d`#eaOP{@U}f3n8$`sDZN^^BRwHbVn`ADtw8md%Tncq@{ycAM+H z*vAFajS4Zn@)BYgZafR4^j~_!SB#t6n?hBa;@in_TJjIO7#%uyMtjqE%`@{ud`VKc z)lXtflUs1O!~ISicKE>f_|osHF=rOI&iHO0UsCwbtp3=}^6q5x-@Ws=f4S_~vtQHJ zevC_(Lx+trmc4z6^qiGDV)&EB$IY!GPUfU_x;yRE(bEKMV_9PUXsODsoL@ay*tz1y z>*O}I1eGyYJ>$j==)MOwmVw2ld|%Va+b&nGN)|_?96P1m*v+sntjOEOP(mMq!EZlC zfz0x81TNsmt!^14?+pxGf9|ljI<#ooWUglCCedEzw8Cg{2Q2zLgDZKx+qP3GbA$BW zpMnKUGG9qa3-=PRWR43sfyD7I#iQCf#Fp9Uo=EZH2In-^;k~nz!dUM_?3w%AoTAY; zfW)~%i-SK~lLu{?Il|>>ic3Ltu^(j!=~^K*?;hsF8;KVt&x6`we`L^>Cz5cIrL!LP zQvD6%6w7a`MUE9FD$`y(EEz0ZHiD5C@#wb=q#4;`}(n@BWUN519ze{t*}oZ@en)<~54w>})f z66MPcW8E=4@tc>h`De2gqMq0q;+AbQ3XI$E>XlE$OqO5xFM0Zze~dqSEwjaxK$gwdFnrP7h=8k`CLq`ihA! zoC|K7x^A6Ie?G{+-P;<(3Ew}*H`;y4Ti@(adV7^~IJkorDE-Y0Rd?{Ej@)gT!OIUd zLt;I@r)4SR;WtSJ-2d6fL*{Dhyisu{a=s6TSZQ(W#Pf8gn#Pq(4z(wCEcvz2Ti>_%kb zyJh~mk3$QQByub-5f6S-ILzwsy|Ci&th|!xu`<^;?1_q0jkVaa1wpBvp9 zL3-Mxf1?IA``_;>HdZn=uLegcGW@bIh{9y^oi6`<*s^~AgVNHbZLkIv2gbIg=tjuWFjEsG_~T*Ung~ z8?By8o3f6%*IMdqhSY19>7v#fLlK;1h)))+h^b-eW`^k$5Pg>>YQCzquA*$Z?;RwV zf1W;w_aSt1?3?lB7?XTD{u3D)IjX_ip|pDq5e175q)53@HbZH|AffjD6Pj1%XWP~@ zcgjrWb1|DEryizpy^Afpw;r=<&KviX!$Y`;+b4su!9Kcv$Kn5Ion0xNWYhhn-D$nx zx>M#klpM?PH;F?BIMM7;;Ji~NAm<3me@{K#(`;{<5aH}oxIQ6{(#55xV;1eVm+{du zYcx-j4#&mK&F)tWHE%`f-)?Z;%Da3JD9QxLK$+&X^%3JM~H-qEY zz8ZeYEAom)n0Pji`p;am!Q3KlIQJjX zUxg%1zjS5vW0CITEGm;G@2Xspqs81?MyG#jKWa=B=Dy^itU=<(NS!i5zb2XQHSY9g z;T-W8eIi@JcUQ|(t<)Rr1W)g0fAgI?vkl)`IksmQSQqLzThu&7b#O8axgWL;WUUa} zonuGO!8w7%`)TB`D1zgD+>k~`bF4N^u5emxKkNG|`KDWBKjWFqlcVF8sg`4|-(BsL z%bZZJJ}tuzUKO;OIEI?9`*X=?W_QEe2}FC(o~>4ntJavn&_6Wadsl@sf6fX>_}UM$ zl5Ak~G_K0Gamz#PYrKP^qK%AVo$)2ToRF|$ozb$ekzS7jXzw8wZTe#(NIF z<{ZEKe`N8y`4IG-M?XBL(Z28Md9GT1{9Lbj()_OA%QlZoSrKE?b(Pj&f$x~-iiBC! z^rAV)I?Q@(Nt4DF^5N*mWS_%+yv?ilv^w)tlK>uyeIMv_gow%)G9lO$lQVBw})b%vc7 zqw4NHH^W&%B=-Cvx!NY(lCtKW)Ls*0^heET(ap7<^<^ZT46Ikge~WSIFDs2Q8t(*R z3uD!vK8!Xm1zhwT>#MgWV+=pyvo=&UhbiGSim1hB_qTT8?S-CbuFBCEv!3n2|D~xgNgPO-wRA-l z`IjoyMjQ7;m0OlN5u*b3{fl6djP^*^NB#t`oJI2xvi)M+e-w+3WZtOKY9L<;sWw}p z+r;q;ckU@%?#(#FiCBX@ICN~5rW&@kLnR8*XkiTaco0bU-r2j5F>xMO*BHSi;#@&) zk%}{liQ5?A4a+fd@~PC-<;$IO7MyI`56_=xi$+Y!?(lBD-yuGWd8Ktxi0WnvH{ttz zPg%@-tVPvVf21Bm+skFAtCumuC8eq7QXuJdWHc^O8pTZKBS92!*pkCTl20_8Hcc*4 zP8_iay)_hrQN$*5@Oq?Wv9I~8A>D}SpMX%#f^_dkf zkykv9v$YuA?RhS<+j3L1vWfFGYez99MmW9o;JBICf323sd@1L}U`@mvvWQXm7p5R` zkivS83?x@=Hcu4qWiB#H67*|wr$mI^WK+koc3Vq^ei%C@_(@!|p^1{Sr$?zRjS@f1 zjlWoBWEpl?#5~~PUu}%G8q+aFcn8^4=7NeN1thv$jc-r9G=)`!!4xP;_ zCG%r6(Mw@kIkJjdn8oiMO~a4T%J)i2?ml`+TpF$mjCa^G!COL=7BeO3Uc_1@YdgUQ ze{)xyblvdmYFc`?ghypKyGq5-Y*$R2P5F1e%rPiMlJ%0SQyqh;Hy+E#OBK%Bu2I@1 z)r^p$ylbo|I zo0{y#(~w`2ugjs=Gl6x+qWxl+?|Gq(5aDA27?aKxAYFYntY}u|fk){w!|1aU2|`k- zH>9l|X>mrV@ruEo25RFVUnstEe0o=$ya}DcRSrMVf)0&7A{V9E?k-!mEwi3CoEtJW z&Slhc4{&Vw?M|e*g5wzK-B;-9V^~#_OBXSJuVNt1>KV%vWNpif3qL8PGF;0)v$&nq z9c3W%^4Wu_!9KwazC4SPv|wVQi@9N7#mv!~5VdyyZZEVKu3>CJr_7pZDV0um$qmOl zgC@8u9QS=L$0*C`%}HZqKih#9)SZf7yWOsyg;DwJT+B0QxtTAuC{9AS{w)cnHjz1h zqm;}?+JCczI}7(l>C$voF^W@l;RnN;gLIbfRFU*N)%)i#i%weP+>Fv5-Y;Qvn6VzS zmBqVmao9HbE2$jRdk2_Siwc*Kh|rtcbb`l99I@MchE3bDP_83X6qrOIBkjHn``oQP zmRW-yB!16CZF!4X#A>jw+-Iw^L&sBp)q56pirKcUom$y2QG4}F4bOP?Ad&aU-cAP0 zpn_Mc8M(#eZXwBC)8@n2Z+2o^1vuP& z>if3Mw$PmvH@C!-&EtWQIkyphcj$y)6x31HEy>xs+ETX+KW5rH9Fm(6XEP6*-4r>v zH`d6V>DtV}p)e*@iF>AoL^;HamO=Az$O$f7n!igH+ParH8{}D=G00MX&(2o4-c64E zqi!SE${e;Y=St6)o3d})PdizjFEJ{Tljxh8SJSo(ZttnIV-d`^JNh+5#IALTJUw!1 z{a9LU{F(H&?CNw?G3}hbT4$}X@~27H(>61wxz{99M;eXqQ^;?EY{Bb2is;azA>-_< z4eZkrdp;yVUdBG3cHYu|COk%P#YdZvQK~f*_!_sIi+^FM42>s+-FUP{4*g9XF!%e# z^+p@kCyUV_l`{xiTYjq{UT-|$LdQrW?>|Q~>*2^37>Oohzh$+<2XC^}K!Y9141@L?S2cB1W(D%2&Kz|7TykBr0wq5Hoh?B*UjX$)P4 zZakvJ(%+-ef{tg#4#8nGF=*F)h7pOcq{*TzTf|r4@?>f|8k?JQrOui50}*qlBx8Z6 zRO}vs6X~D2_)?yKVH~mByL8vN_6CYQ;?sDrHg-S~dJ(FXY(If-q|4 zZQ&jpS#6Ggj=MYZY^WN3tJQKabqc>8+b*Q{M6k8e;!6Cw97Hrc*xs+PbI5a~p5$0@ z3RA`-R~{3MlN_5(*kw&IC#MsN!N{n&Vm6YwIMatI?)DZwN74;!`n|}H8Z(3(th~XY zUJXpJrOo*Yi=Z- zeCLN2My;IB&U2C3*sgd^4O~ThL3YT@C&q}AsoU4B4pp46_1{8lqpEXp?>~%~?B|lK zc*h`r-Hbb#$xV7C481pTpg)V=ayf$KjyfeQ77|`Kv;@cR#yav{^DCh)&8R!0zIcnKSteqUFpR>!d46 z(Sw5RNj;v9mmullaM))0+(nLOOe2nRQ>T4@StN|colYFJ#t}ARYZ2&vDy^xeuxzLwWh5%YbTCWz!ucWYRsgwKAeyzkA-kacoX z73P1FMd`}d)`F{?IY);3l_jr!-Xyi(LrCN3xryNsNcKiI%I%|#gFCGi!piB}%rQ`9 zN-s>LoIso&a$;{o_h*g0BAFc7#T1KwTUQ{@FTTRyha%?E-BFQf?^aZtweQoHWs^^d zVIR5ruEeuRM4m?!Y4BO_^ zTBW-UgT<%bdabEptW6%>oVg?Yz+MQ62{0=yX!v)^S)EW zOn8^l3z#6*exU~6BIb$X8XEq8bUSO6EU})qV%d1XJ}$L>__fJFvEwPCvse0SqVp+X zgso(g*c|Z(ELsyp7v`W?F@V#O=NMQjynY#2HPUf*}TN-e#W8{NuE#!w0a+{1~?k=4i(*XGX`ieUjce!Hkv=Qq935 z5HgNLB*EiIXyFDjjibHn%R~5nn;4FfNwZ$?r5+qZ&nfhka<>Ksyl8!m*gf_k=k8#f zQkXZXldfWUj}{=}92WzBW3e#tyykiI~+PgHg@!fu>4< zda_F?1oJV&8TQ~~%1PtC$?pxSX5;U+Gbv&1>RFK%rYx_eiL6zn*7vhoDlb2#@0`nP zsh`A-KYuj{T}=BW8F|Bz zSi|wP$g$+Vh;nUKxsH};(Z)B=5Sd}xBK`4#+#{kGlLBHVFQcj1@eL0XFRoLs1&a zx)7Z!v%#hj6RgR3Z*mM*h7IF=b-jqh4UTWM>ILXKyOz9%`Yjn_|J4`9aIG%1o~ zf9c%D$rZ0G{5oKD9m`Jh+Z&ZVe!O!czB6)ijOR*_WO}3>b$8YX)wp0|IN3~88S^0gB;!3vYWj*v z>n6Q|(s-O58TY~Qw$;@PS9+M%ni@Wxe>bzoSaOnRV~_WBx#i0F4ijQa=ByC!Xqs7}Xwmvb7~ zl6QESqg1(4RGpG^oLr@2uB1bk$m?y32K%2BRSsDPC&ZV6&wDeb%ytga>t)2n5nYtR zQO+YdoC#Lo45@owtUO{&f3yEe~9@S;@92;YP{Nmmd1v z4YJ=nDt^@egqC@sFeN-a0=r+2d1yJ}Ishw2i-88LjOqUDlC!^Dur z;KfDIPO-^7ZZhxEOLfCArWUK%F!#E9EB6kwv~bR^5@be^mUH&1tqonMjpW<9X-oNS zaXFnb8h6COIkf5rjWU14MLu8jj=|)IZ1fjLxO$+sL2q&g_K-r8 zgD=Q=gzc6D*y)z0EK6r&bvtau=IxKGbX!G;_Nlq@cC`tLZc=~thuaqOtcpCoj){z3 z4@?|NH!kaRc@x>`cE*d*B%_SxW~%T$KEoU*NtNtwM!dlpvRq$IBHb%}(Dk7oiZeIvl^EXi87xUky_G*Wz zpBR{5GsGazfuP~V!MkH=(|VS3s*GCH;9J8EXm~X?RXOu4v9W8v4~=Q%%put3V`lc= zTuQPb$YCj%JsqdHb`KkRKJVO`lt6UM@V6d^zX~v zI;!J-e;F&*XIt5Ryujre;IZhYDlSvxlIG1eifohEqb5*&3b(OFjb;-a-3$^bcDWI> zkDRyEZx?@(n7XzXn%O3;7n@+wW`4#9nBdkIm*w_aGRQ&09jy(0L9rB4oY}2BFtEq5 zS22bm>oanVbjA~c$l1PgGE{Vn*xbGs1c|kQdc!?5TV@L_;Mj&lqb?zLk71E71sd;I zPpdG6(?<$xp}p}-;8pXsa?~sy$%`DmERFOuzLI}EEhdX6lxfCnUQL!K9MH2nhPH_| zWSsX+DW2HG7xr@E^Ll>X{IOeJ&rQK-KU|^Mz@B z>NLfZmlT+T2MFW)2z08(aS0{krZ8RZJ$nh%-q2|>!xFbG;dD2gPG)|NQ=(jZ;oF_u z+p3IjmCm6{Wyl(UWbvCWPBEL1%V*XEyxzyLo_gnxe@P)QTnGzH27{b_|f8x z50jcu2Yl2w06u3YN; zhO38hjmIkP#3MiNj-p zr6iBoGxiTe8*l*oGpLNUL3NGg-}ILD2IX9x&|p}?ABio<*y?c{jQE1S z6=??PS|M`7H*{HVt{BC}#riw=>yzm58lz@T4uHz$Yt-`F!Qs)bpC%Yif@{ds~Jg>ZD zq4({C5$GhJ9?yw?AmfYn_0&y0zFDy%u@wf(V0#z&E3`&UG#SM3(9R&E7pO^OJq8sF zx5*i^8*JqAFw;Zm*AA7M`=RGWth-bWM7)VNswnd^9GZXW;KhcWiNjnjINsQ}CpZv$ zm22>K7W%Hi+8HHxS<-q^A$QJ=V>T4s7j#UZwHs|gx*Ul4P|2A*OEda*Uxra^TicHyH|n~ZjE zm5uM05XOJSed>goGLGA#JT}B%DEhGex6`slPRXIuBAqZ$N43~bCAK~? zE`%Vm`h-&luZS^X4Pv7x<|ZiT2WY>ftvISNJr-j)eCh7;L0IoIo7SYB$FyKyc=49h z7(K#UHor~M;h#QfaoT=&OGzEm=xvpv-kUrXTjhV+(4~jR**SBo_VEWxQPoTNMIz%` zPjd&CHT6-$zQT>lUp#8vL~azxxJyEqS012?=uA>WFxBIvi+o#-{=wlhY90&28WjrX zul6^YEtqE-1+-O;^L`%)E-m6XUYMTR-nVU}Vg0QV^LO%%jutv}pR1ogZH{?svg^V~ zg9U%+?PT?7b&*Iz7TH)w-p)B^I_3l*YNU~)dco+i$0EWaQR70PVXInr81==MSf#PE z%Ke);zCVR?S`}Xy(HXYSRtGN{g9E(Xjlr$-;~efJ@XwaVk@RN?Yne2Td7ys^_RzZ7 zq~v;iJ<^(Lz1(P6zcBo@@!}@*TpM<|v($gK(zB~Z9t&rEeH+k~$$BZYYPZZ2CJ}g9 zJM+tN;A$+}f{xp#R7cSY$2Pg<2Ew@8);+{>(E7)%G_Sha#~05jjN6Tu#)`GiF=sR6 z^EOB1sd_T-Rk%RI9Hf#x_Z}4+O}2~2ysN3gb!97T(+Q`HL|XQ|HCuVdVfW8XpEiGc zwo4*RY2UB5QL`qy1PUWQt&;jMZH6f{F~edMy;U18^=zIRj~vG$YCdR&YGZ;^Y(cpy zTeRUWS(sj4r#@puTSSmR#~AOfF4&%wrCKuL*Lrdn#Qhe5$$e>U2efvK-+`0e4os=R zZv5s-oLHMJvloooHajtcq-i?aeKUVFR{8O0kqGywY*&nxVQM@x94(j-!Pu#=+>_Qp z&c~2!@}CA(xYO$NA%^U#YYO=!O&1XDEqtWjh!<|W5JB)EF>(bnV%J8bQ(9N?@(%3#{%D}><2hRxt(a>$VUGE+JB-romy& z9eWeVvCNm*ev?-)A%DAy#_(R{`YO*&B}H5WD4G)6Q>O77b~?nJp2(l5;Tk0B-<`do!BB`o~wu}%$Iw@b#}s6iCmWSNSa#M(tk|vqi5@Ri~D5Q@Yj<^ zXyC>1y&N`a?SZ+Eqgw5*LGGxMQHGzNvOFCq;oU>z=?h)VpoYxUjzav-AmOPUNe*eT zSkG>b=Khg{Yzklt)y3x_S;}hDYYZ!i>O^9;2<;)W{bn6qp5X6=%ycv^EakqyyhgPlj zEwX$>#EJ7?F}&xFaFVoMt~1k+<)%C}#ny`63X(a^ZEs481*3WAr3=zJbV4ygAj4Rf z$yJdQzHobcdzNbNnN6Z*yi1^k6xSZj22i!jntCrRoPVQbU$;0_**A5Rky>{>JAK8| zM@!Sn9NBK76+EtEI*IWH1p6~Ov%=xC;|7TJ7$=_Wv_czx3sgcHLKAtHPMBfdwW+=X z2PNeh8$8da)jd2z7R>wIsp)ay;_P^}X3P?Dv*QAb&SDCtzOJK z(m&FHzkh9v7a^dW)MA%cSu%nTg4rh%c!r$ZYA`xvqd!on&q`Z*N<9kSg&SCl+MK0$ z<(b7cy$B)+1`8X^@u}yQJC~W}Qd=0S^JqNMBg7?1v3s*JaRFV6Wr^hV^ z+p*rln90e?8+hQBtsK*@;nMGWdVBTCiKhFtm47PqJqZm0ve9^xco?*%@{Dn0x7A{_ zw=PN|RtTY9^GBLY$}Jk!4-ssdVupi?H;SUJ-!QxIovGnIMKljqGnS7tfE_YhvD`$gGtf#j%M3Uw0Ek3)RzmnMO z=x(Uh#iesnFz8XPcSPf+?rKVei~0KtXSDOGIa6kh5^nc`nQbOXGk*^-az4?&g!vz; zgVyDG7k3=Rjh%8^F8Scoj%6@(UpGlAK7aCJ<;vaB8%B7DOeYLTg&_=;3_mV0otqNo zV}?rlJ6?VaPuUdp$orx~K+>&P9Nz78VBZe6%H(=|ee_;NMN6qRtG3+dB9zgY8|gG@ z_ep+H0~N26N_Cx>L~I(1S+RuX&KJ#B(GXfPF>WoBZ#A!eW=d$!A*bxK>s&Hv6!r1XuwkiTjttCU@b#;g+U&`>D6Bxq zRo>)iG$(5#DEd41e!VVa&y>@2g@}%+19;unH_JJ$)ALT4m6|WRGaeME^qd%)a|BiJ zz|!X{V{f6Q1xV9R6&F;lyj0wr`hSYp*16a1v?@8ox5#D&!O4x;eND6zLfv;bqIe}PO%}-NSaD53)4IXUL=r)o z^CB9O625RtQ|rQHyBsYtq(5&$ZOz=+g;ZN;X(ws5=&Eb#B<&Y3&$IO!?0=ZuNZT|x zwe%fv(*z)v^zvjwH3oC-ub6yS2kGmPLJyR=b4Opj(zfcbnYGgbS{_Le#Z}NTJGvbX_JBvva)*4b$_U#J`y%>3Dv-* ztF2_Hbj_nW4F2CNJC{^Esl_1W#mb|AR6V$^IFLM z7JFh$KTRcdY=^3(cm{ydrds)-nx7AZ>8L5>KRbxV4ioIK(Tjp!b4GHnbR8O%_=yS?Pj$Xi!NPFY$v zu2UKyO?YEv=S_Dps-u=I#OmD)mL%U4UJhpX>h0L%Qn`;D;Ero86V`Sz@kux5cQ%wl6%J^T7pBhGK7c7`6+Nb^SQk z9JS(Iu}QoQ$A43icr{~s7WRHt4o-+Nb+TspIWaXdziqHH7A(Tsa*#hxJnI;tgOAT% zyWMeELj!bPBgSx#eiV+_{KK;4Y-d5RYB zAqG*>4xSrB`%IAKQ3QHQ(`faOx5RMIxi~Umlb%86Xn%3!*!jkVeI37Dz1?eEhQ-ls z;$JXUV;VX!SnqkOl4+bEmbl1gMl{Z22Q%d4CG(QHWJwz5zEjX+bEwd#v1`UhZ|WA( zydHU6aB>;(uK1W6q?Q;}AHPjeh}gIB+;ZZoMlm+Xv&<3N-|?6W!-dSN^JUGFE1!!Q+L67liU`b*E`Ge zM?K@lacO%wX8LChsLpO^a+vWfaZ4OtjN;WZ?mLIk+o-?i3VvKNm2Q+T? zz3|!A{9C=V)*w?Dy%IzopQg+y%(j>4 zj9Mqv*ppec9MOTxnsqo_Ig>uLs!p}`RezZA#X6QJ3{qBju>URl!3Gq%moldJDB37U zqugzkti87`t$a@u)(T>ChA7ZkixNY3*gM0Jb{!G(n_dp$cLig#m&<(VSXGVeOb{xW zow{80Y*F`OJVT)-3GT?VS(J|qFAR;NJTF9B=lg^j6<-&W(%%%qt2t(25Vhl?(NN)Y zBhtAtCDii83CQM85l*#-np>I5M7HW+Jh|a-x$~hkqq?dgxr<}tCYZ$5D=b_=DLuwF z&E(WMH{T1kVI;XW5YqD}Y|f5a*yc_S<|LCbI~jily{b&oV%u)9oY9g?yI0kSM>hmG zxq7*-j)ri>8}HiW=WJbUHp_A&UqL@sRP)aA#&DV`UwurqQIou56W?g*UM!WWWo|B= zwMJ2*zLg`VtLA%PO*!F)sTFyTWVSeDfxWR^i=eFrd2+mD?TW3C*W~ME^_D}GqH~3G zOq+j-J@a9^#QGb&kGgAiyNkQCwXj%2YR+s|7ULZ$*wgCd_Y~5TZLZ24%*(Pmxv^Sv z>wLYvr@l+&`(f^TknhUZUcyOyXD0c(N6aG~^&yDKb|jWMM02=*T561%JGvZ$YG&2P zEgMwnmnXUQ}t zJtmEjqZHIo=&^YFIyy ze;=*{O8=*No~`h8-FYteVGtviC@x1FPLVkhC=-$nLy5#l=LN*!MI`8=lafL?aOB}Q z3PPOXjw#M15Ohe61C9fo07#&4l5xodl5kMugb~VeQ>7;fcaHJp?&|udUDf2g>$x!!nlu>cEKYr!Y7tOYBevYfaD8`*~XZgN&nII5!MioLgMt@_@XvwXm-)m=hq zbv_wgck8M#^olK?k4Po&lBX!$2nnUEhO_fnVA7Fp>C(;BhF?kJgq1j+W(p~Ehkk3-O&3R<6SKj%%d_73cy7 z#a8k7?kRhEU74_!(18yDusd336gi8G|9WZ=Qg+VY?LeN>uUV);T{XDTofead(JzHq zgyv;&hWN@{VI%E@TDF0Gi``xa2{@}k+Az1^z2;`vYxfwfE=VzoaxQ!<%T< z3dW5<;hgziM!WFk78qHK1YS`Xdads+^FOZd##ud3lPRfZ$2o z{qMQUGC>o=UO1Km{jyo}=5w7hdiL{?V7&Td*%Y|UGlh>e25t|S1Z&btOx4P@Exg84 z&9>5Jg^b2|4fltFW~#i;$oiEtNd5=RaLJjVi|AF~MX|g`Q6TA8G}EYFp2%jYb3ZGx z!2M{>`;22N5DQNjib3ag_^zISycN16Ujl*lQoZy2;Oi6wQ*Cr6%Kl}5t!{U3bv>Ee z$fRvWazAOscKG~o=C0`5a?Gr7PCQdPwLFVsJp&2W66wojVCNaRwqmI#rRWkOvoLn} zr^Y>zI1)I|;Dc!89aIML%dlOH)j;o*s`^&AesQq@6`BTx;o~{1Cxdu+pcc_uNJkg80c$FFP}TCKl6b3{PGXgj~288^VdHae)qEq|BE*a@&fg9Y>yZhp9#) z6ezuH22@Z!F4b}=1*;+v_JeMu+^)Txtu3d7pDdzxZlV@3D^-Y!tAj_;I+paMNlrcM ztcN?sUbw1ePk=^6W*toS8F90Gsmd1{=5-^(xX^--$h;XZt|N%!A{Xw*sHVRp=SQ6E zq@*3_X{PA|;3}MHE-ZoQ1r|ps^0v{KA$)=cs8>5%A;W{QNqoT2m?vGLUUwk1;<+10_}FOJi(_cGpHTzy~Da}*NL85^TR(jdN%7p5Y?wRaI3~MO9T*RYX-)RaI9`1_f1BRaHb)RaI3~MO9T*RYX-)W8sK*M+27(eZnEX z>Hr`*`$l^?HYGICT>ZLdxc5GYo8)Nt)(GX^s?MlwG`RK*Tc+I!ZRv|{s^qv1kgUNG z5%U%rE6(YC2DLukBP>(QCrYyQnkdMs)|MIjP?a6f#yCN2!ukE$LTLVOiyw5`~W+^8vO$=sj|&A zu|FgibzxoNv>ylvmG9nrXt%wlJ6<1+)iHQ_siA9>Se_~I{9-XW>|RE zPtFiqmnk6QUZxowwz5~!N{ywykg9zZVsyh=)e{wgdXSa(nrT%(2$`Z*3Tm@`KBBJ6 zgTFi!JFnnPb-p~9$9=NrHEfkj?~!rq1t^aoAyEl0G<>FqZi3Ol#g6eSax}ZQV4mXdHkb1;oV` zzXSjvAOk{`vSG~^99q~`DD-f<#`f2<=-V9?gIoL&`10hAiYK&3?%V2Ti=lwNP0^QX zA@$@xB=BAYSmzDg*$DshYxcY#i!0p;&|N2hjWu$d>quNgA0MCsv?F z5sWosDqc*rN3_Jd#?m4n3~OsjX{u_M7}r%&bx0<0vVkFU#u|juV#5-;R;E_a37wn( zS=-m`#|3Oq*5v_5MG;#xQ<%j5xF8^}Sj^VHAZew=?}T&74ddMTs*A9`I}HUJ9k{;m zeExBAAL*5=+JYV7@cSXZUQ}d>hr&o`bM__uS2T`F>e~{f@j1?BuY%y6mPv_2FaZJN zV}x`Inf?BM5s~)G-gRtsIB?;cv%3Hg;#`_`j?m~pO zfK-)Kszp$*2*j$WQ5~}2VNT?000ds=+RHoo}Q@MngGxM00f$-$eKs0ZzySn57A9MA*P3lTmd9H zm`popTOJJ*d}M%l=Irs$e&0QtufcQ#VgMotK?ouU0F6~mRZ$)QASPGQ z!i4ybVze3}Xm4g_K=Te{bQ1?dI6+`xF=pW;%%uGth1?|>)g$Oc%P=a8@{)vV;3^-4 zB&;=khI8tW^Ph$r-Vv)`hcEI;;`n*lE#88(DnIP(@nID*yHdmJ;X8uFBdkUd75pUo zRsf}V7E`$Zqnt43jm}F6=T%f(w_5D&W$)@?R<9@?VdeOdsBbQ}tNMpA>0tKpovHc5FlD5#N5Ha8~nMZz|e>3XzQ0)y1n~$HXbYg1SXYv z#pmEjb?a}p&#T{zfd?ou1vx$Y`;T|C_zX0Qe-IwM!w8?(G-uSWH`$l7BqYUHw#|2U zZ%^a2*KJ0PZ04*`0J|9L;@7`eNd>*M1iHxSXWGQM~M7kGYAW_ zeMbc{b764vr$Sa}EQaO-hsnZ8dCjAZ{~9kH@u)`_g;83yy^dcn$(% zQ;NX6Zbba`kELZ z8h%{Z%mEtQz7=bJdLw;69Qy!IB1f~bvun|Z>d4#&edNEyPCcaK7mx28$yA(zwC-Q8OehF_l~fSDCp zkPXC>Nd8{HPpVa-3>Lv9!3a;zmR7q7KYZK`PpB9;{4Boo6FR`IC+=l>I0JMI$3#d8 zjShPgL@8sq zvo@aQwDb$FL?01L6-B74ZBS<5`=Ca?B&6HPR;9<7+Ihy}OyI$o+SGfap)*xoU&r*S zUJ>{j?SkSWLF-{PTOMCJN0nhIn|T-1FI(7itV_?PJ-|!Fas04jZBz}6_KHE)Zg{F% zK)Mr{Bwhsr+$8tS?uPhI4?M}(MHPFB;W^E3D=|BFy0?_(BC#K1W2@b7HXXdmHsrG_ z921XJ&oNJ97|y|j>q%|Pg@EVEwv|$LExx)0iKSHz&S>#Y$hHKGG4Ml}H;0)))zW$= zu62+f%vr8l+&@U@fQw!PQz`R|YU$9;9jH)8iS$dm6hmzeH)E1d8#>KWVOLrquQA<{ zV)vU!G@IuH=ZH_CZR9NHAvZXzdV2v7L(|R;q+TK8UpuUW3ndy?r~-yl7QCSB8#7J}b2PZJC-A*)o2vR@s?c+6nwHm?Hdh9Vd!&m0J3U^Q;$ElLk2-O;i` zDqz^EdwQHKmUND+B5x{P)$J#(1VxymhT?f~>rAq~PWD>CU16R@Q+9p=GAl6L&!LxF zdD@+!anA3OK0A#FDGiL#lY45FBy2-`_3SIprJeLuUeeN!dL1l~Mum%M9 z`NZ@GPTKFN4*i{}l-y8;$SBvU-wyC00{Ua8!GNl&s;a1ps;a80h^nfps=O>L6;)ML zRS{KHRaH?HRaI405mi>wbvvxsLI>ZF5H#dtpQd(e-@fZ zCxJg(U3>;EQ*wm3^u@lW!i%@d>By>fWL<=)_XOI*47eaT!PlR0K!ns7v=VP*1_aQRA3?BA;3E6E~vl@RX#4ac>>9jH*Qg7p~hfR`_ zvXg_TLd#a@A|w7#0Qdo1_iv<=%3JS`knDr$EVBf4q^OW2E}TryFKOxq3dq%jwPdxX zoK^jp_EliTy<4hp%g zd=c^8K^&9DupPEGN8ptU(A=ZjdFR?4;_|@7e9X1Bej)bTx+qkF#`}5cZ+Jk2 zCG0;S{J;#`;Jk$Lh<(OA-mNH!I<0 zA5+;d!OoMcI#M$ceTUY;St^J-hHzbDGYju)xoiu|P|j*VpJIs7&WbM}r`tpX8SNXq z?5z$($j+%9t%p{2{TYPx-aQV34v%)V)O|jYk{`y~H@QSTQ&W2k^<2Hcn0QGI4n1jJ znuy<2=ChG_?(Qm@T={NUS>dX_P#}4nOnP<_r8gWk%ZobozI=Pw1P;T6F(x6h0SodZ yg1}fxNp3KZJw^cnhLWH_u2Uo diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 index 2962c992e80859763730bfccbaf454638157bf3a..967cea857a5b3968136b0f073095a573e451ea90 100644 GIT binary patch delta 19547 zcmV(!K;^&lpaGSk0e?bTXgM)KSte6i8z2f=060|tfMira1W*S5@G78R3P0!H3SeWu z2YYWi^cs>NphZOzsx?{~P-Lx!l}atJ09JyUwYJq&B@`(liUUEbY8q8lDw3;U){V15 zAOHbW1huKQt469#4Jwr(QBVNP)X*9#B-x=rp+Qsy01BWa0e?`E0+_U^1w|DEs;Noi z+;qKwXhKqiRFafc6aiI2s#KvwfE7{-sEU$@q1~fxP?D6QsZtvTgpa z20#D|BB}lWOn)g-lwbfx0004i0000Q4FG5cfJmT8wKkfXrc8~drbdht(hQi&Y8Q`e z3;00*lHqpM`1g@XBftSL1uz951t0}51t0|=1v72{0I>wp5P=&IB!%=60ZW(Vw|(Q$ zzjZ0N!qMxeH&t~&*M(m98y{AJ)ur<9z4vmY2f7iPLVxpX&7@fXFL45*I@;MxErMv2qMXt9tn_A`Q=>b3(kT5~+1^@sRKnJ3l0E@5?3rwO*3Y5B&L&Btx5{rl$ z3)4Dp^5j>k>}7%#o-?iC2xiGrFVUL;OYdo?tar0k$dljJb26dKM0H|uz*w$U~Z@UGVH^4|P5-g4YHJ7kf zL~U%=EoF7*Vm+!Fo2%1t?A%b`V@Va(YP4cJzY5?R>6{pkg*nzLBCF5fq>b+-7#ah( zu(N@nsqF6JJdQ>2Q32i@_zOZ%ZH66yNT3oi349kz+J*^0!yC= z1bd&sMLd6#aRV`bFM$WWnBJJ&fIhhdlQ2~?z`im^M>?}7$v#xW5qr}WWzoPrxE2QB zxLMVCqcS@S5-^IPjw%YOu710Nxa`cpY(bq(S7as1^uDu*^LMTjyJRqdW^4xvug}Ue zctatKo%$E}E&Vm~1$S%=8{Tq?uY!>pe#E7!tZXa*1T!tFaDIWDN2_gmRIh>loi$T^aml}OK~{msU=nj%N4fT|jA zIT}g=hqmE=cL_DeqNktIzsvXXCGO_hus4yjYAxCif+eTJf&CK2DZ3;kb^qPva#UaPn*&oprL6{_?m+=Q)z2qM{@F23uDafa3>yG5TbR%e`*@r2PTtc zqVcqtuW9Ikj_&vn673l%lNt9^(~r*-rhLeBSU%Q&(WYWu!k}h)O@MYCUFqXm23EYp z+remEPgcDMLCcESJ%Et%2o-LvVhbu)Ugo*O(6Ez>FnlP8j>gdER)*7or|8?gY&?9! z_b5!yu)M^A`A@(x7S6yS7QB@K^v%l zlDKM8B&5NwZF!6G7V_u{^P$%C8+~d(SQSEhd(&iB;_GSP)3jxh^muw)#d?ulZUX6O z`R?&3UjKz5@4$s~sO+o%fgxk_hM@WQf`4D65n*t5Odw7EW4fCpY3c(JwW`KRLo_@j zh<`8E|JmtvgDeYF6q88t*$JR&iPUL-1_^kn`k%M9RBr;RQQMF{PZO+Hh{smOZ8zth z8zPY-Fr6eC^Oz8^QxeOkoyyzI);75$68yT5`#%faD-X)4%0DJ}HF>>1AyY00aGh>%m%- z*9c%O5o9&+yao)u8k0sve`s^U7wZFKS+ag7Tfzr9k!3&+xHQslSgG8QZQ}xenl%IX zIA7lzW(_P1{F(#Di}57r)PQAGvV*V!)O&z$=>ZY2*=U@LdHFma1>IR61yYjd&UH9Y zYNJd(V_Wk1=x_y@fDwNLJykr#Qun1I>)Vkre)@#XA=Si!gazl84q;i2 zotNglPOlcoyd~K|(M0dIkXo!BncopLFl^yp`mKDxLp`&bYEsJjB5jjk2o!(1mOHgh z&|VS}{G0F8HUphu3GP$*!g(u$k@HaeqZ(s6v*LQF9T;IZw^N(Ib*4dhH(V z*7l>`a6N8(g!sAU*FpjrTrhtMz4R39NExG%;WBUsT&IADCEQ=DI8bwW>qW38HyA+{ zel2f~B_JAcjddjM;Gg0-0{Mr*fdWEp^0`pp3E2lMos5fxW-r)J(wZX{(P=)uUf)gD z|L|`q73lszY5VAVd?uEl9{TAFlI7=crpSCF^1tutL%Gq5s`bbySYcZ$H<=&q1$~9K zpnL_w+Z0L#))RiCn(2}^&i`zOjo%OUOp@c0yut#fPW zPlEB6$<~FHC#@Kv$#l2j9-mcAzCyC2(|KdiR5j7k3*{TSpGO0qkeLnWb~yn&95Bu> zDiaYpIzppE!Kr79Q871W68j_2$Ha|k8r_q*jp;Dd=XWWoG$+Pb;_`Jl+Tq*nA2h#f zW~6lbI(vVXP^}Mrrw#@3zGCHTa^f!#g@Puf4LH1kGe8WITQ$lijZv^V`F;h~vH-7= z5nNC0my9(> z&v@uzq{-sCa-AtiHe24mSeO_*@3;~~MT$)JbR0m|o3Njnc>Bj>y`=Vx&P*~w=eKrw zFHz46iiQoncF7Nh)&p%7jMZ zGS^!G)LUBI+KJ1W_!h4lOE2w1_aI?WTT>%ex)wEI*y=Cz8F@L8d~$P*K2N8`Jj2{3 zfIrNAqRt*DR|Pz0=ok2WDQP`PUkzF*IEL zNe?23IWQ-iNt0#_C4ca09V^erUyjZWEi+)F+yWWXcDR?SE=1vz13Yp=8ZS@s9(kH> z%8oGu?4P#&v_4$5-b6fGynK>6mZe0OOdNh*8FsvEIkHgOK31b`kBjLUuJsw#xWHT1 zQ91(UQd}vqpUz9g;#uCu(qD$roGI*Dk3=tLynPZpK|A$_uS8@a6h1ZUk7j&~K`Ffs zb*&I&af7j~P%m^#vL`c^`LfUZ)1D*wC^>$os6)gm#R$%_zh%pRXX6slK?sRmZ_u zcbY4WiRp3|uYt$AZ4JgptIl$>Luk392&Dtr7B~%%AR@Dgz%&aqPwNU^b*|L5k%Q!- z&dqtWx-DMmH7I zMIh)$EU7~L4dLqzh0vjev1X-BrG`4R2F=r)^upzI-5~Cqi}zfg1;&sB=dhd=iv@pn zuy;r@17KYQ(pJJnctQbN(EVO|@FxCfA#P!;b_>-HRkl=e`JU@6FO~*PsKlc^w3ko1 z>So=g*u&y|3N3u=tz~?h21ztL7by7uNwf1 zl9;$#*P>>!w)H$cC4zb4uWcc@W%+-^-7Y*9h$TY(Os{~}0OK~k>Y?pM^R}mY9JUW~ zM;<2%0%?iDV{PUKi^D!6vjOsi++qvTHZze3`3f?2x5eURC_CN1%8hu(<^Mdo^BIHHD7PJJNrmH?m+F zGUs}IiGa>8;HwrHf{r0*=;J12L1K%{5sr^mam+Sxizj6+%`?0`X$2Poq!3pZk8UM= zr+K0XpwUth>kQdFZDfeB(yaZv$?1Hld>*WEe4LNYK`Y|6nOkP)F;m3K_Z!(xU4RzA z48(f??$HN-QE}m#E60R&P-%ZLhT}&-?l4(;n0Dh%?<6=a{QL_L7*cN1A>R2tMt+0) zRE_O^H1xVCmacpQ^avl4Yt`QZ{gg?838Vfinr@%sTc@PP<_Gf`2#6pc0{v4zeJF8q zhNXap<*rHB)wN|$NGY-j8109V3vHd58;>F%sR_^!$ohUb8Mr8rwc3Bn6294b_)&fi z)$}RO>Uz5LcaU!?&6#OsBF457f$*TugVn8z(>|dor<-}m16E-BZ;jCiEQU)d zkJCQV!Kak9t=4(GTz)cNy(8yFt90S`X~zInXVO58V7b5|^@RT% zLs&zFGR|jpgjJG~KyjP!0ajGuS81<)Wzq%bJyfq=<-rZ-ftZ1xx+GqRY^na#{b%N( z%Wf2xtOvuJuc^np_!850wP=7W;$9lJY+Ia_x->aplD+kYgsLfMglT`##JgQL(FNUnOo2;%^d?y9 zyC>BzdzzA?r?rH$q4@ZBB@`ZbMW1}8xA7Go~ z03d=9Ax)K1Q`X|0ck)`d(f60nO$?*t`jVt0C1IM6?-|dkR;8D8D^KrdyYb|VxTH3h zeIeDdPoPj$@8i1qr8z`6lkP$Aam15n713{G&nv0u+5em@_4o-gxjst~*hX>tep8Q{(Mc_c6A}ay5hq10-Q1KCbdWSfg*|KOq?tCNh zdnpbTb6102Q6?^`Gb;H!&+7&a#G@&8nMuhr+qb&N9k;W0jEiOQ4)qe1c_e&SG0@K@D3H}t#gd2asEVT^4tA-8 z_Dri{QU-tIg@!`si>i-c!b&+FEGTrq{Lx^iG}R6w((st&<}oK>D>|vrg2~@-9iS4D1Qfv$+o;o5?!zucA8E>+1yI(g`V6Z4V5j+vh zmkhE<_f5KWZCsJwIKRf1qN+aOdL>M|V$fO91yz5JcNp7+4Ng7eI-Jxtk}mSeH9lF2 zqLx3XLf>Fo{F}7)wqf!@f?_L8)!QP>N6}vi6L>t`KWLOJ^<`dgBgL1un;c zgS;{0!1Zar6ubn3dqCY91^Ubmktt&MBc)~(7=o`W0Z`jLRZPw z>ac$s_cxB;?zsZGR?OdU2?}|MJb^N9g$Vmf&B?dY#vgp& z2f*Y)kL2EaJ9v+Y%D+4TN{1)G!-yn`$OlJ7;GFu71%Xm=?UILhg<QV>C(YJTmdc0r*qWwQR|aLe-RyrN zpnLf0<%5}{N!r^OKo(yvvOt2gw{5>rRjb*@_sXFs9odenYD-W@!m>6={ zBI*nJmc+1rfTc>>CV?6{KvPlnqJ)3IShJ8-@!Fp&gK>_p>5I}HFRsc@=M`kukEB^G zERTglHgk+{_1dWiL^=J=9IST?fPupg?-d=B7EZpv|W1EXc;+uJv_W;jz)#h#U= z;4`|?c`>%$^#q>xg0P3Qi+Z!3sLaCxq=qPcW-ndNe1&i`q#EymvTNzB8+txnOX;Jd5NkZ3;1ytN%lQVc$a2qNaK}^j? zpg&HSpmOdTf}uL}R~g?_A1qiCo}|qn19(t12G?P-<&fvaXJ4Pn6IcUb#I8|s=PPb%H8lJ4kUa=+h5!@&^0%RZ=Mks2M z%!_{&D4(LqIs&*%5G0qWTH?CmE7|3i6tYP@D(zK%HGR1Ch0L{|f-UYwkvfQ1hr-x4 zx>A==fIC+<@uH6L2>X6>q{c@e$frQP4KX@n;I$V4{>qw!P+S+m4-dk*ZXNr!(1v+Pcf6X0jH!JK3X&u)J6`Y8h5>r|AT{Q;8o3NA(1V;%!LUHtb$Z~{Ph*oRnt zq@?Td^oa5zgS$}JNVlMc0*2}X+F`I9KAfnE>W+cH6>;}S0Sg|DF41-<7Zp(e+Uy%6 z@%71I%BgaJ@y8Zp)C%oJE(Pl!7;E~IUn7%)8)s*#ykKR}9)eqPi0fhxODCh6gGd0^ zx$Stn5qXk9+E7APQuv8#b!&VaTe|oGu^!%ZdIJJuUCEPsNK2BM5L$GI4|Ho5SEQ{- zCp&)I`7h-aMoJpK`G;Ks{e>x}b9y1X7`D;%wxE+y92I{y$-(&T8B@T)@DhDUpAo-y zQq_@7RO)+sE2(e8+jkM1dBx_iYiin1#KXQAlkI!y7(|4KHW!d^0KVtOa=2U$5gYp_ zT~_J>;pzR;r)1$=C4DpE#gHLPbwUfsHB=-;yb^hcu>3xH|>p9-lDD-PVRJSn|UWvv_NY(1v$?X2Ykb1OFF#g zg5yWCvdXi4L2Qat4!h$qE;s_&euwG&!0z5voqvB`)=4o0NSwY%UR7JSU~ap2tBuVG z@`6~y*`x+4pt|N(5Y+y=tp$*;MjG{Y@No$zxokny2vbXAJo=MlD@rGl#m=xzs`y1$ z_y=NCmzY_`tm0M>pB)&5v}~rrZprkd$%)iS@PGl9Bta*S$re8u{3^*?_l7KDZ_h>( z5A}a+Z!+wQKBCF+TAoDPRPFnF6Oy*kmTVBfVfnGK?H##q5T-4c{B3=2$*O-qYsb#S zfvHg`=91~M-$%jg&wzNeHL?27S$lH98qPf_Oi+@DrQ6pZvVv082pPqw#tK@MQV?=> zTJ%JdfFLq?EYbKQ*#w6;5?vTtF1#EvO|^gSBF9$`Pz1e(6{wqsot+1#h9xBy)T#B8 zVTsj&`N*Li{i%Row+u#efOkh&n4x1Y$x3dGwB-G{0 zD_N;tk%=^ZRfKk$jLxl$>jt?N;INuWAh(`)mQY8e6^$V^>LFA zc{uoYr6)=$Zh7o9hewEMz?l|I^I1%~uRu}}2r~S*o6^Z*wp*mtl6_iUu93pYqPP^_ zT-ESMZXk%U_SF%sa0CFp6V3q=o)LdTG!9w8xg8{E;Bt8hFdu<6wL`Spt*P;A>rH21poOwUuai;dX?#qaxav zY?lN>l(g^}A7QVR3CqB$Zf3EOJx*W6;zIiOz&UjefS77I$We%{i^lruzXgA+h72H3 z$YO%EX(Ep2tm>24a`_?h3Fz{7wFaI~DHGWKD+;->IOUZ%!lHOOm5C&J#FMNG2dK33 zmZH0CaPCw`NdTir5=NvhCV3hak4?!Zl6I~Zf!PrvlDqSge^=C)Ks8o>`Zx*aid!3^5-_jT^Ue@rx<; zg$u)N>Fs$Hu$0iPsu)B)z`3OTaa4WdK4JiZysR%fk|(N)?!q%cYp?N66h|$hI!!aU zWBP;uPMCQkFfx93^K;WoHvt-Pd_eF)lXE5!b|0F;J*m! z4fhVN>{HS3X>8WZQjw`OyszI5V~Fd<1gDa=7yQ*`mhNlH8RHznNBs;aB&alOxm zF5s(%4QG>%qbQlgsaqi7b_v2{t;IT71rxIAdFgmFu8WhiAxwXks~cLj1JN?D-RJPR zqeP`FL@~;RZn(3|-l*$Ng*;}5AOsxBNYdx*Oyv_8uoD2fs|H7OJ$dg<(!0xD65<-o z@x3XWxcRB&4qbY!6MYMh=Nf1(e1o9wD8w{izK=SqthTaV@)u6XQ5rM6iq&J7bZ3>C z$5vlj+j0-s4UK;;^Gyrwx znQa}*fcL8{B_voV4b2@|uJkw~DB4oPVJ6b~F5;`{T0DQdB?5u8yg(oeL0oraH!dG{ zt}3Tm3D3bqkoq9Br8R5hl^P5atchVGDyuS{Bv3$(05-nOw_936e2b&XOz8zLW1+Q0 zSAucFEeoCk>~&be@7PHSsJ=qp7RF7b3o0wSzXJyDRr-Xbs4F;5*Fjh!Bpkv+RYaJ0 zB>Q4#hNpkjs`ZJP=(tLR3m9QSYg(i<;RbscH)(8V-&)1@lbc)jG&xF!GX8mNo$|vU z8rYiETS-HRCUJE7rU#`5Z-FYpG15tC;(@aB$T^gog-T5%G zNUD9BceI|7#CMyr)TZYHp8+`w(Tfm3#|S@KamarXjn)OskELkHUXLx6?!2xc%x+&Aq54+^;WzCXG&RvsiCGZWPlBFZH} zagArMn7Zh1V8e^t8r+<&E|pZlYSkTcS$s+ zG$b}T-E<%cCK}DEfV~RCQm4;xPi=o_9RkU&_Dgv|foc$fDu-yvVvy(B^bJ?xg>YEu znrmd!4ROVdc1~gT z5>H2(Gm)mV#GrM?K*>@_SV_|^Q0n3#X|h;zwkJL)CiPHL#e|?BHu6mH<1)=w#hwA! zu&7#08AnhIBk*1#&7<79yUe6PgR5btxrF#TPLG1HBgoMX=~Fv5l}(D8Jjatc0H!2m zV_OqW&9Cc}@Pj$gxF}uGctn50^3F|C$AOG;8heHZ7i?u4+)V2Wz>9Ienu%uM0$JbI zqbMV{=F+*s$}Db*C!|iX8MP3KS-J&UeVkROj>Zh{Q7Jz~&eXL0Kn1y=?{Ev&}v4tFXOxrgT6~ z8&3K@(?Oe-;68 z9d!CLN6|6_NAK+??a0Wp*tpo`LGxpjoTIM@N6Vz~NRiRl%t}s7%T_ zIELnIYHZ73%v!{8Vmy;YcqQm?*YI>eLIj;EY=wGcI|~Z-7#_i-J8@>LLt>>ItjecG zMQ_?cK%9ZdySG=fBgH608rX;EDngzlGm-sA#}uc{1cxw-gLA=4oi5T0biloLttHcF zHDa*!v)yQO;JkmNmo0JVpriv1Y_QbLX$zgPnm=HpyRIxSQ`Kjzie@hr8_X0QZoAB# zl0Pua6dZP}$U!H07uFYTl#4aN!U#R=t9q{q1YU(8igHqxaeCmgET%>7u^GHn_Sq*AU@O8@5m}S!sb& zxq+FDd24ng4@5QrX$Y!+?li3Ohpbhqt0U$%QgYx8vg!#Sz=H+uwdewiSNUM?CWjJhVKn*#GN?BzdB@@}cPe*!ELM@W+P7$w*fh@QK)<%noT@03bvM%pO ziWAg`&MrQa^kbn!?ehA6fUVM+s6{J<&q9U36vql?D-4jbKClcq#oSPBt8X$yzwr3EA7gbnOL<|KoUJFDvJ!IZ>L16Pt(C#D7-e; zBQgN$Y~FxKBy2&QI0Bodd2q6}&3yn6ZH%F$+KBV{!z!6AEQU@y+8KNR+bf2}(Ww!o zn=e%xX6Qta9t>L#6?oDFa;J;XBzj7>Qt)!}RFh3CV1Ep?@|U_c3RshwPM$3Dc3>RpCwe#JukF4ZI=__JJmUt{o zVdTc`Jb$dJ4WcBgjV-9ix3iH3%M&_{e=vjIh^LbVZMZQToQrXt%~_>7Szi8rSP zm~wpByDezdOD9b*+?+_{5PI{}H;v`BAVG9+=p@P{2N0QP4yV)>P6i@aL2*3tms4va zJp={R*zkL{t1V5g#fZZx-e(feUiVF~`QEQM2!Hv1C!qvdqL3+R)!{YQ&I(7p6yOim zjC!*mu1x@oYDTl08ny{1B9fzY>$u05M8;8z9Uh^}CsAf-Tms78@)H)ovz9`5#;jz) z1s&KFR326~rL}-UY8J+q*NAnn-rG1QYTs#&NW!2lqh3L=vJJ&Eat!ZCjM>vkqeddw z=zlQt4zCI1I$92+yebwZs?qxsp!G6ww7KXq`(kShP3}F#Regy7Ufe2~h|4t;IO!q= z<9Ms`WF_-3!6oEe0tC}$ZY{wc`|f!umXu$5eF0bnXAJDHgmhGIfg@I1&XxpzHUz?~ zI$>v4*^RXiiB!*S4kAV9#BeIJ`fvkwb$@)xNTF(H8%gzfRg2l&eyuY_L*2Kl60KTc z@G-!Vfk^w?DqBEFwVw6X`^41&fKPkp_4`fNuLIXMsp#7eHQNY_Zl)W?CS+>5NpS3A za{?~xOv7ILbVa~#!BX&vHDH<{P@IQIA;c}-A+JE|Y@j@zzJ4hMlh+AtIAd5dEq}H8 znY8NOZ1v#iZNXIr!fk8FG^rz#2R?M>oc8`n+3?v4nOv>GXsRwP)L(ejXu75B-&!qD zRk=Bcq@wF1VX6A9^e$DQWG*LR7iV~8ru`t@=p3myUk&v~s}E~*<@I)aKgvo4?Yf5=uYDUAAOMc>$Gp)!5#- z_hf@&I6iG04Ly*7e-6r_z4#3iJ1As{f~RJuK_w_e{LjyH?1UQiI#u|s&tu|_>B3o_Kbf7Tu_M0FiWl{H1s=EZ8o z<9$d-OuUXT3AR9X^6`j0%q9C_g(I6umcz#_S4^|#X7CH?@L+e4RWPH?j9{Zc2sISh z9#V_oNcJC|xy^uSbc*PKHJjqkQUlk}V#UGYb(3Jnz;MCmwe%~!R|GC(Vh7Su`Sk^LkpIL2*h!OeI2BStYbEj!VLWxShZtb zTJKt)MPfanZ3I$YEJo7knVJPUO;b>+H6RTE@lC6axkk9o(bVqceR|;s9BoTwDr^z~ zRLUIY^X=$pHrU%3*xO@lV;XE=HrNkz2sE1*18t3`>C^n7z|;E|v_QPOfERC3(a(OA zf7N!JGbTI6A8QnvYONlZ&T~T|);Q8qilkQrn#x&s{>awy(rCU<8d2^b5UNt`@&Mja z1&m^fpI3HKPRP#5EyQ4wk2TT+UJjMgA!Y5*?b+Y8MTSAR6T$F#R zbI5a8T$QXD*ONuymakA~ih$%;&{L)Ie`VlP*0P~79Hb8K;@rjM(NG?97sgWL;t1!u zn<&x7&oC_b;0un-1$3>JlOIY|ttWR0Y77>@gI?fQdje~cXkRX0bsIq)_nkZgc!Vsn zw}->7V>aq|i+`0u`%JE07WckUp-S3ka>Z`8*(lJbMPW-(Vd=e|UIA z)J-R~@MSNm{!FouNVt;tWsgBeLtEuwP9K26Cs z6}lCAdjNnK(Dt3HTVnLjv7ZvbTz_UjMIG-*1bIe=w;-2ZDfv2K79T?n2Fd*@HGbe-k$qH?&>V zHLm<@N=VHD2YL?X$-e7&JwZlFGR(HSD(vkioV1QRA6ejCLn8R$TskNTrjXZgAe(qh zWX;7{9VdL^?!lHvn}h3DRG191pn;cwyU|uN#a%jI(I3I|O#dnMguNocnzMF+u7=8P-vcD z6zp9d+>`c5T5?eeNS6kd<+p5TvWs(LxQ+8CY*t?Suj^d|4Rot7e;~jw&{R9@^nGBD zc&YU$N2h)D2yj*~TTlS2#uVaqEETs@+2~Bi40d5AQ%p2~hE@1Xy0Y=DBRANb#!T6A zB@BciJ;jvpE>-xP$Z{3>pmq73D-v^r;x0&t1+DX3HMXKwu!(nz>)Xz z#m(QhKSU84zXnNH=PD3`+Dp?{H{Y87p{Ss_1no*@L4mGvf4v=x;;FZ0l;zcrbt&6NxL3O5gIKOn*r5!zS}IEjVWd1lN_DkU7-8;@ zGrIO&S$no~i6+(VFrsmYea6#(Wu2K;M_bVdjShlIcmcJQ+cOo1bc-^azM1p#XnQVIMo>uP@Yjcxb;*~b2 zu?qy;vaFIlG^}D8sa{sX%Ljxqu!0-Y1wpTVsr-RMNf@mB=KQ|~=`uk{->Akl@n5UV zJCY1}Mf2{_Xie<-oQ&x`C%Ng!-(K}mpAQoT$SdaYNz!t(cr>X~tEkm@-^p*VxF-3b z6zYS{j5b!FZ+P& zhC`FlI46ILGbhw(Rmb2%wBqU4qe<*mgRID4%gE3MD3;i2XICR#B=_MTqNl&PN*i)%cc1Z6Ba;6PEJ6o>bo1Bz{U`!gt(t^ErosoQ} z2uyo9%D%jH9eDz|wrWk}0hOh?JDEZtm8dT&`VN)O8gmG^WH@Z-n@^HdFC7CtH{Y}qu2wtB4LoDCp3}*1zRhnXKG|)(>_`@h{ImD>aeY%^$a9zi!4uA z0`{lLwN&Y)<$wqm@H6|2J{}U3)put3M=HR?0)BX8XNdL*%lZITjS@HOOM6(svF_L$ zFK|h(Nrfs$9`C7n@BmI@P!N|2mOSGjk`#Z6#1pi-CE&rJPfBU#UCxUbv(yI`Il!}8 z<)XZvg?2Pi8186}^8kn;sv1$By;(v|r} zZv|4E)QI_fe7P^B3>3gXHO;dN$CkDom?|DjipP;u2&sk?BSR{n1!eUKA4(YGr7TpB zlCpM_&{>OIl(wPlP~S+GcthLF3de3~T2^%FMX38~Aq*#D;eDyIzO>%Q=5;s2b=|{- zERDe>7ljZ>Yjd%Haa-Vm(^|zgc6$uyPBC)fy#eIheJ5ngS?9?`!5O<#7a4`@E^fsaPP;};#j}0h+JsBGU zxnWADf`9I{Ks^L01hI6U3NqKwlG3V#&CyG?bYAuMIXm4)jsX=7U2c=Mg;uW;fCem5 zKQHa7Z*$!4?8K%lT2-b+i>Zz2gsS!SvpvIKg>bg^w;sSY)J&_p1;V&8d#572E?fAq zMWb#}!XU00ObXgM!imA_gjbY)GGCa2)eE7PfhwiVE|A2_~sy}`Awg*bV(c-~of zSAP!Lt=&LLbvQdi0!)I!{I2mxjpVNfuQ3w*Cw*x?+JXFEd0Xiv1HMt*7xpFXSxWMO4Hk(B9J_=#tZRFza$q}19$MvCJY zg)D(C%A-vQZ70pJ7y)QXnkTE)hhv>VnNDH^>V_1frT2H12+(v>_KHpoNz{OXg=HP-;RMhIDfMejJbhFz&5w;>9KHw+F~mKUSn7 zj3=xq@Y!Lcx@?0q8pidwhX-KKs{7O~Myftx<}T$B0I?b&ikp(x>_yg=Ly!lyD$(VCq2;qBF4lq7I3pQe|(A-r_Jt6E}dDj@FR{l4+%QXOdv8RxQFJ-FS)7q6BcQvjf^X zb=pMC%dIm_>)oWo#^o}{_b2X8RM2HTk5nYzyE)@k)iUSEfsm&!TS&z9lDY;xkPSd2 z#p7}*9R`S7O?Guxl~*~jD-qPrToq3)=EEGJD&urkbdToMoEE4{8G!qq|q5w^l^U_rNcm=aLQ+d@d0@xJ@ zA!{6G15;CGNd%1jrB58t=zcBTw91kLPjE%Tk8Si(SuHCFfA!FVNEv`|*RK6uhTEeiw8GYNMVG_6 z&0}meyiBvuGx6d@4Wff$U+JOQgWBH{ZI7`ovd7!!R(JE^bzM2IOT`#lUKv|J7Q+HN z2znp|8EKv-lfv&6ob4a2 ze{0e~Jvyvx0nI9;-h=IM*w6j*Ls~5}2=Rreebzca-jo#^hAr2#<LB~Zw=#hJ2RM~}4FH+~Z$~< zD4EjR<)2mrR9b`j5T`?Hw3Is3xH(35N5+fbb71iHm>r)zq6qs1(Mq#YJhJAU_e3n z4xwXjCw~HeUc-g>&^tF&gu^KrG;|xNwq+jgFziVUEsJ!OQ08OyS4Jl@#(K!5{Dcn; zv4CRy3TK{MV+4H@ZcL{lCqA?{MI}(USVNF3WT4TnF8EigRu0PSugofk^t=BEguRoHi@FahV-))U)TOKo3{ zrmfR>*zA{+Xh^^;MtlS}xSIrW&us>GdS9KpPSi%I8d>k5+#0S|f<}R|$#-0RQ8tHS zSATz;8tqsfN&z@cQp^|fBG~oQXtb4hgm#V)RV^&QRhgfBce7Gab+yP_-O)R36;{OhJMUT7tEAIGR0S`O zp0jH0H&oyTJfeL@=wrouq`1sUf#w1(!d7&Zl7v@#2^4DUo8EQoIR#2&mO%x&?|vQ;VF)g^`Qsy47_uV05LT zez=*#XnLf-lm10te^$1JIO7h|BDwrv4W}AQy6LWYV|3bD^yB-|S}$fVWAwccx1X#B z4ZI@SVuK-Cd#J%xc(&?VkY2YUjE$1BonW6#tvF8cz{SSq5F4+x680LE`QotPUXNt7%UbWRCQUxXbk!i7sn!TMg)Xhm%PmRk#<)$?Zn9_)V%g^1(Z;l+hN2uyt_gLo% zdQI+=l2=dy4JlAVP|7?~4MpwT=F zSbMa13mYRbx_3T|yOln!o|?gyNNDt2gN&eeAGx)$e>R`4v%_PBzmhwA_tR0 z$p`{VG#Q0*ori_ERZws!9&4Lc@-%Ycs(TNCkhCC*rq2WP3qo$-kCAMt$`d>fVy&+% zm-?(?-PJMHXKWgH4W~y@OgK=S=b0T|8*!X#)x3H&mD6y+0gnnbDbGPildzof$<7cSh4F*NB{_2qRG>>+%>~V^Ns#X23Yvk-qDOGhwiK_Z zs4FfHqJO8cy1DfPf$0mNCTm##v_j7!9GhhpZ-zYp7I&?;R3So$ zH@Ba3wa^4Y6Ra#Bg`Su?$W%6`6a&e0UXjFqu_xIsFBM;RtPDxS29od0RS6PCv+1T* zdCcL;h#mDzcSsDIJUj26jO$W>eZDQQXlr>taz&si?;Ro0O}$Y%c=!PBP$Cr$hMfe1 zT#DT00jUx6WIF|BBq@E%;gg-T28qLLsDRpO2gVwh3~_|R_PA;7?Ugr1(|Ia+$+yaX z!Gr?k+_v;O@bMjfwjmYoKazpuj*RO|sG#mc0nN}X`-z+Ky_aA;CLKmayRO#hO{FNqqHpppcqL@~P%_A~J4nd#(oe$se`rI`upe zw)Cc}yj_B@rXuZC@U&bq&#AC{R#u~Q9d&1v@ug((%eeTY36sjIn)W>OrRR9V zR(a`2DKtq2`#-jruxo#;&(mGUu5F-uCq}X-X~nu267rFrscRo63*~9j?i}m6@d+zR zmqxhaG&6fbH{0PS9@VOQcvJ}~TSC8oJ53$7Ue)_Zd?@V9K_M(S;bzjp1*KU2+}DP# zGoQrjJuDL)DeOI~UZmkIdEvBYMR(NbAQ7M@dn@k=il5IRFlgS*sF zkT;ligq9kuQOZWwZMdUT%xg#~$eIS2p^KeL%;J$zr_gOzx@OhXHgMM#+@qwo=EhFNn-Ed2rm&uYzg^1_Y_v?`J}0 zn6*TDvnB*4{TBW@iIPTdPENv~=|C|$BHcq%z_)axXd+=qYJqX_P$@<~d5k2c`+E*j zIOM#E0^rTSp*_-1rrBXTA`4q&!ux4ZL*?9&>Z{7~aD>2&zj~XWd)nY|ipq$U1o7=} z5e!?l_ZNBDVq_Q1J?f(Xn?_}M&bP8R0a3PtaDyhN+qj@fH`^zTKOOtfp8oS^1Uvk zkLRK;*Ijl4mumQF+abA~5D*!&irw$Xr-^v;dO{%Tn(L5Sg;Yo;G#@5?(b&!U=UE| zb5K>+%PeWGz6`%2d&Qb$7I@`MFrF03u#9;C7v-IYQJeMl;4+77_MCQruu$Q`->QHv zBgW>4LYOU}+HE%4V@P060j0fMira1W*S5@Bp9=3O}dc3SeWO z2YYw9NL3$ZQ(9D1QYyPyNv)cgRM?l>bjod(n5|Z{OID?-NU6|nR$C>k+EUomqavzW zX|C9=*<~HZB@>tnY6V)Ob~3Kk)k+FTss_dY1wsH#nXH=upns|=l&?Xd$QY!kiWI6) z3ROVzZZLZ}E-uSP1AyJ344$?Rk& zO(h0epxLNGL;@RV^lo5nFjr<*Y?7%+HH9yNs(*rDOj4?!s(Oro007fMr+@&dN>QPL z42=L9Vk)2H(|=DW#HkUqm;wM~7$T|u08A-LsK5xo0063cWSX9gDxd%W000pwG(!og zH1$0;p{AN6KpB+QpIx7dS_4H%z*!pzSMA=JHN@;N43!^oESfuOuN_}*`NJ08x-1-3Z6~LmEFPM9gT71LWwabPl zG^iXghC|dn$-$AcF6VGvA?37V_P04EMy&Lg2T|bRE6|?iibc#266Yn?3ps5rY{v0R zlnKYN#;&>0?@brEXF_@hC#s|;R{FY@@NBGuB!6_EsybWyp6P}}lDpw;&iRAN156U} zzj(l6u5fTkF!@p#e4y>`Uh4_jj#P}e*TH1$niBh_!b}lIKnbIWRxx9fss2vdbV94O*KT%f2o5V6!Ip z34aB`MUlV;vi1tdjhe-*uDt9;vmr5adTu?NiX04SBD&31j7OK@TmyYGgdzf7hKh)) z^Y|$vd&x!yfbJ|T;Akp)JGgBDk9;&hcZWU#(3BfthhP#Y1dKvo1=9ARf>1dF#xFaD zbdyEVNu>44w{dvdciP{Z#dVaQH3;6+oOtge+KY z0yMa_GBcKnF;-n11KWXMZVQE-SDG^;u(2Zusu<#+s;cMfxI2!_%m&06)YW!ET(3*( zIFCOC%J*!B5G>7r;Z^zhMsEmYF_XT9{sq6Lzc5#Jz`?nS8K&YFpe_upB*R8tyT*x3 zXK5Qjw_-S6zqO(-FdoxU-N`08u+^VJNj$EM!4H-rPb1uZ#FUdON*!mY-eUq+M~+b} zo3(Z!$}EANNIZA!Hj$B9_TfdUFC_3fWa3`SLzNDi6AvQ}#`n^p$yQc21QJ;!3pttE z)bomyfdmvuRt?uUAIJhh3`feUmhH2;v2li>t$@RyoscIYfJMAZ>)3F`x zAqI7oWn;m-pEsmFf`z3+;%W@dO{J}c9m~m7Esry`z?^w#hsOkn9sVVoPKzvGv-60!S=R|GZJop4Ea^5HUZdmcc+ccSsXP+EjSdWxYOXj1oT~nY7BU85$l2K@bz%rUB;3%&q73&!`Cc^xQbC@&xm#d{KU9FPWE^zFYy;=L-2xz)(4DHJ%h7YOs;$ zp|n_Mo4|t``es86*cQb2>nEoSKXUuubdbJ!We>S{g={brD*nJ`5J-n)|~& zag9p>!}oNOEM@>bGfU8A0PMdo2DSi1Xf74w&rKSf4GX%mJ_@BJ&(3u?P->%0K4V+* z`RMP-cosh66v}@*xCpla+GbjR9%s48N2%rc;p=~FcY+wmo)|tKo?D!`8H$~g^ggFY zjAKs7Lu zh$E)@Y_qKlsxagT59jrM*qMqkVUJe}tA(W#lHXb%Ixl83t3D^HfzgJ46MJNFyMlj+1_TKSx60*1fG1=evUV~q6_~$aKT2qf zTScV$`MW}|+x~{ok34^n7B^j~yh{rpIkhNcl?@l-iXq^Rw0?flrPh?+yca^lV}{P) z>mP8mY_+um;4T%=8OIX(1kK&=Q!SP=)#%z%vF@uKBaP{zgK{@A4_Nz==R~A^-_Iwk zIu}r@<7=-QGxGR)IynEh_93Lo9a*@!+&W0`9W#h1@QaxSa zpsyg8T4vAZKi<4lqw7M-lh%w-AbP%DjMkM@=^ud&!d6Q$V`Ux zI~;(X4j5+`6$yx)9U)Pn;Mbg1b_g>#L#r#%80$Psi;mH{sNr?I^Z|*fG$+Pb;_`Jl z+Tq*nA2h#fW~6k}^ml(G8Co9uP8Rzqv|7zo zg+c@vw(iRzsyX3&q{)%D0!Id}qW*7n<(h-2(c+~eo8`vjjR?^gAWPk@bXhRogCk9^ zS9blkg}6d+dfk8NM5w{X%gVUHUJ}}r4OkG?43ZXgQCPG_UvbS))*J;wGPLS-g)N;V zsmtFg5gUlhU2FqUZEJICCoXH?TD)y6zqJqCfrUkFOpRLTSpLMa)otWx(+UA!HcdW-X} zHB4e?x%!eGMG$gePd1a2V+dCFXmcYd4 zB+hMx!kV&)&=)F_;Z2PHIWHH9XL}z>e+{EIrK}c8!@yo8fcgSJ!*#*kLuy%ZKHlH?b z^AlD;LGyGdciWm_Wd?6n`+-a|2g8QtUPd(wI~p$#b!~buYc-wVvc;8J7?e*=ACD+^ z+}9J$lt+8TgksGZ>-h?QCOZompCCM)w(D>BnP8`kNU9^Il8S<<6z{D4J*@y#bzJ6h zNGvMmwZ2f|K`8wb`5${u4w1^}VtX(4L z$DBMRERGa#>9UNLY}9(ZhoL8?Uku6`V^310Bi;xGfFO?5p$5}`V($|j*Q?c3vyri( zWM_~2td4|sjJVAx#4(?*AeO1VxW84$!C7~jO^=EaD6JM@&oi!2sNeG7}p~s3al2~?24Q}NLLTY;?$T5p&=cl zQNBko%GVZ}RR@pdd7g`f4ivJIu^WJBa(K`%?cxK3EtnmDGf_^p0}*E@Ujx(Lu`pSC z)H^$@iTAST_>r%#bAY^jO=6eBQZcx$qA3L+8Dl6H;BOCDY%YZiEsHfOZ7ea>pf+xu zU{tnys{Ez8lu_MuoHsgRHGzi$&Uj6}!rdUq4S-_;I7{>baC!WTPTe%qUOoGKW4VN} z*e_H)R@qU1%jSEmu)bIsHlq@Z_R?KG>!A|%k7Eys^eDCSuCC^?_QE4Q(Stux{nDk55c}vgUbjcg}DK> zQaTsvWqby(2N|{ZRS#-6owYmA<*<8@7|$3`6HHEj6B}&^At3crNg#0Pzpy5SqJ@@ZntdQpE;%V)*t^P8rR86i zF!rxZuwsq}UiZ!<7lQ}1fO0dPB@mD*P4reCc~}~~HVP2p{2;H-#44s>qW7319UiRX zm~7*J7Ea1tnrC==(h4pGNFc5+9^6X#PV+<&L87E1))}&T+Q|`NrCIjxC#CYG@OrVu z@^U_M311bo%G)D{xZcWg>;Sd^W+T`Kc8ELm7akd+ym&`d29p?WG&jX>fUDHQ zw;FeOA;E9w;8=jdlXj5~_sQ=f1gF}>ZC%rUPD3X|ufEV7aRcH+@^eGG=_K$vSpKIL zDqBmnEh**22I83rh#(*bc49YS38~DGd<>ly}{8GYmQ=XE_@dOOHBm1fMevXNtEbCu(DCfSt6H!Dr#XDDp^D_}GpvdImerU%GW2-|*o?Kn>sHmSb3?ISj z*2U?cP?XcnyyO9^Fnzbi=!6z!N1k*EpJ`yz%39XvIIDe=*bygx{SGqsl6-)M-vtmt zzpfXH;`9~?GgqX68o_gbMe7OvIEJu?3T2$m>jR zp6A+vN1rk~^CEqU(GdF{IU-XLs%`;t9EuwZWQsr&&{~qUs|5~!Wwhgd67JvQnO?vNv$b8YX|F)e^g}fFB2!ENZck^YFB4PBP+nQLAx>lC7zW0$JlTl?YPZWV@o%yT=8{L>=&S4jh_7>rQ)S~@)SzT zumZz5;|(bQvVhsuPJ|Xt`-dEHq^}c{&$7j~BPjDa_ScyTw)HZO`NpsLf<%)*z|0$zG3 zb(tR8s2mlR=(thA$G3VXnrU#7w62NUNhp3EICi`Hj9~5T@Hg z6vDt$2Fwh;xhD5TjGulpmA&0b%8|`cS0M~$R6i0pjh}qeQ-tnMt$ToFr=anFsCUhF zW4j9!0F53MJ>NhC*wHBV<@#LR?(=w}AZsUhv{bCxOjG#I1u7h$gNG1F6_5^&i@`bi zjs<~IaqUh+ctHk zxGkhy30!nOx)W5&s^HAGTfKyTR1bd+u2?ymG@Y%ngaKvp>m&#(OLp7p3blJUXA2(k zqKR8FM=_Q8;0FB0uJ$6f)uAS{mQ5_>_{(*-Y+{&qVjZ?29{E2{8TRM8qEL>r4J+V)8Sg+tx~*D8Wb~$dUczU8FHL6< z^33NZ1Z6JVp9_~dTvk;@#$}Rfu#l{MvEa@9CpHj1n%TeHebv8cD=LKXN#}v#xk@_0aB9x2;$noXkN#EV;~UxrNhoUa;WX426yIYC}4MuA&gWi&G!2 zK&px3(P}kQTNhWS)!%9buty)d<(t~R9qMpLC7&dP3Y(MS_b0JM+J$D)WZnoQU~$nj zN92_yM7nIzRg5H)^cY12eOs|OjFUbYGJn%n4Ol`0*qce9G-_9o+*(%siQb~P!*vdh z%0&VSskp%=X7H@wHdHc#nVOA2eL7-+%eZa|gzM2+c(0`2j!2Xn2CA>nHBO@%mE#{xcb)2WyCR6x z^=3l#i7%**;X%L?AppuTLsXVzSbwQR{T4~k6~bVFB)v-471t47&n&Q|l1b@TYOC?9 z?Z>PxWvu)WZ*nw=)Iz*I7QwaBl)8ig+PSxl6nBV6+w+|!GC2lCItA!yiPIkyz@3FB zX$*Evm{YJ-d#^+Vb({`bOBt3GNzHRIYcg&^A-Fvs6+m^HJV#fs?#iT?aDQ$`wb&Os zsGii{kf}P74?h*z(|32PRbw_g-5&ORi_!-eI2!`+R3{0yUjzjCM&kXfY;gf0lJyEM zMc88=13O*$?uOt5fbp>ou&Pc^ugB6O$chf_Lt!G`f)olHs1Ip|z;Ojy z?vMf&JsMr2>`*Q$q5-wnHX7pVfxv`8Cg|Ih zNfxrVM_wUsLd=MC>z;Th?MNp(e%jNmKtt)kMP~FZPnA9wJ0g0p<>x$=*4piuF}&hw z!pdE(B~o417W9t6y9YZMX};1*e*w}jQ-GnMNwSHgZJFup(G*O@r!PGeURf0F>9hCG z*`d4&j0wyw*Y|19!T027iHfOM-bzS|2Sz*{%V6;lU)fs>*XbLW^aoa*lZ9}V^v{bH zK!q{Y2rnSjP?J|`Hcl$FLH#fTyq46`EbL~LUuHdG2(f1jG()d-NS zI%PKHHAZd@b)&S5_3Jj!?6mZ9CqV|$3m4I$N^Oc#kYjh?Q7n5sg*{1q}*%W8Yn?yi7 zPvO{ZcIf*(-Mon!)q6Q4f5Z_Ya`_>7Rc_sZy6xVsH#8^831bgtkPsqyHHfSssr`3a z3n5;NHR|o);u24C*n_BZIQAUWMYg(qRtUHusC$e}PuC?4Jdx)T)q!ld{*MB%B_9WO3Oe@JF%<4say8 zFtlBGIAoh^+(nMAe<9%-iySLaHxD~H4^IqAN-e2V>n6h!s{`{0xwBTL0ou47m@Ul(!8fB|Tcq^&|?*4VI}| zbSN#8fSUE*D*BH_-M7U!jkGzC@lg$A;YXa*mzUP+QA5ec!@VgwQA=~rVWc`dLrw(9 zvS*sgWz~8DkcdH-<;32WOBJ%+Caja{()DzX7EKkvruycufdMFzo~Hv^>o_t%!sV>1L&poWCA}E-vY}$QA{?csfXMp|e5g)d1ygf1 zjEU-V{V+8@uRu#L(+Vqy#hj-&tqRP~gG^e+-5vk!M8EH!8|x>k1nq-;4`G zkE={2r1FtHkK(Yan-h*%Q;aGngQ-}ON32OYz_5CYPdREUw#N?TM0Ah}G=U^)LgHtU zp;+{oPB`Og;bh8ro9|o4qY_%yGmS+`_ zv}m87D-50*$(wC#YW#kO7K_2rAZUPlpLk6@0vD_1~9 zkK~P0!IL#1Ndr2}Qj>up6eET1+-HHwBaez-BvpWA7aW~6#k~+Vz6@ zMU%K8On)s_HnnUAqGe&b&*5`MiAq?AW0eZsac7ymQP!Obc+Cz#2sxCIrO&Z5luTm4 zOakhx86D8|=e;*d?=5soh-){-^rmv-=BJc7b?UTD^e#V~X`s3C4uiO(5YdAAJnF8p z+R1y!T{|H}XwLF0RgPiNo>preS$%75$Uk5|1c z+WR)$ZD|eiE{`cQq!hi5i2k2=2C@e&PohTbwVej+FxFX>flqj!9d?u~sIKn(3>&#u z>JpZqtl>Ld1z?Dfa|sP*BXZ%R?TMZmpMO%T)+T47;VKX;VTB2;YLL@}8SG%)rLmuV zYZu;5ZEv}u%2Y9z=a$Jz&QYbs1;aJ*Pf>J6pPSOqW);Di95dAGI@%(53{y4r*Oj}k zC9z;?E_%9Yh;ZwpRLncROe~TrpJtuyC!}#5=Ipg8xxnYZPD1oz#1JvU57wM=1b?G- zfpa73$LMaPG?!SIX@lZ=-garY!!o4jqfV0usBp8HHzphaJx%LoDmUrbHXatn*FP~tr5+1m50XsNfy^=- zEe5x1fJc@4EWPc`NF(mYPqd6LDJW2;#WDJ!8V}gAWY+2wPiwcFL!IX6X!aoJ#EZRNGtGvoY7&^8ZYnV@iwCMON0z8cn z?v*pMc~sb`qs)0TkP2c(RyDCS?ArdhPY5%e8-j)17lcecS%1l@Snx59Lr-wP;_Zy1 zdx@Q4coA+l=Av1+0G4<4sLBZK`LwQZvWpv{iRlxpO09@&A1yMU)x@J}6}K6Q(ELa? zDyoco+k54>J-s^fZxK*xDYupPw`4{eltoC3da3O7N#tbCqkW4Zs6*hxKv>2GwHu-! z-v;AD`#Tj1fq%*&Z>DJLIW4B8mAS6#IZM8y2dy(SKPhJ~RVh^)7*#2>LN4d6d!=3& zMyG_!$w?9FuEO=&nb83_Z9FdqFuuunV;yFT2QLceeU*hXj+>qT^wafGj%r+-1QS3z%-7rAe{rO493Sjd5d z^|mxtS5i1pyx`6o|@oHM2S*yWE zN4vn`R+D=u4u5K?epMY}II$i{qP!CHIBWPiARz)yl{P}XR6U1>dkha?(jB<7Rw1!c zj#gz;qawHMAfQe_;l~ti!jrV^!)5uSY~f78E)CBGE_Ay{G1CI| z-n5rZpw)`Q*3WgJ&w}!jT(!rdf{+Y3vcpp~q%L;GXn*~Jj_$ay!B175vMHFnRBtd) zdAjd1c1ZlgFi>&YvmpeX1_wo)wD2M8edvaRa8BoTTPf+@*LTayZ)Pwp_-foPi- z!hAeEV8i!OEz$+Q2!dUpUpJDeler`d0UI0sJaYL(=o3%7CS5joedx!NyeS-iJmJ$6TKMmbTq!X{%$`kQB_;+lPuR*c(NRX>Uhph2sX}|4>P#Jq z$*UOk+n5^mb3_0MalKAnIiu#i60|!M_immcYDWWu&2=Xip9(@Vayzd(pWB*y73!){ zur3y(0Ui)`Ko+OvQ2@^f+=(jGj;^4Nnx7p zzD77K6$g|NxUOW86-u)oJr?Utkmm2NL1PgbJq0bu5+&0`eTZ#wbZf35!kjm3pklJq z0;h8WF#6E8%19oFYy#2|RorP=uK+GlCOf{H@b)YM~Ua7d;9W08=GdLYz+6?o~Np5wN*e8Jt``T45e?=qE#p9;H?y1 z8*7o70ChHRKqL}2AkLftP18KMSzBhlfCx6mP||HgdHms(OqN3@9qkOh0Bx1SV(8R} z(#@BuowS8BSr8m+5I+Jek!P!nB#kuLuhkL*l@xT7RxDtD_F7U6aByPl!n>jIB`L|g ziq}zU4gn-YD(|YQkW&{!3_}%_a}7lnxM!%%mbAPgjSJq%lYdKvirm=ldu9>Q`Hekr z>*)Cn5#NJCQmH+w4du(M3CT3034OVGS_l<@HD%GV-sS@Z+8`ZluGcozVG?76uo62g z1r;w*;`Ww*PE7k`Nh;$@YBDYCDmTE9t1ahC0zVr9 zVOAY5v#V^z+K1v*GuwlRk$N#43atK4045B7){8$8r^-6xJE=FbMJyx#!dD>e0h&-r&LbrU`jnNp^dQTdAuoYr? zFz8oOLd>M9GtIjZU>e{|GonP$C5TI=A;E_*L%Bi|P8z!h=7QGGkbPp)z&kDMTk@)Z zTVJW0POaw8UJi!b6;Ny@*1UsCk~uJQ=T2$QZ^=788zECGmAEYxMa8;{?;5QaRK1(( zy`h3HCovS1U1V%EKUKbk%Cszn#OxyM?-hEiC>y;4l_v|~zNqzK?QWdDuGBM$%Qt$3 zvl-|uLg|yF*)`VRVwA(Dy47uu2=p0`ewiV)StCSJsWAhxiCd;+p@fX%Digq zZ(RGbL9rYkHjW0K$UuLGWl-My28o@NGDN{svs0jwlp=m-=el-64SJnB=J#HOc3==> zdYJb01vs{7_dQKJ9H>;LZqD9m)J=z~BOzMV7BQijFnPU~$RML+a}NSNZ6;d}9JO6C&z+mVFQ>tQz@*EEAlSwVGysE9 zO_Aj&z66h9`Rkn62A4>#h!b7@JP#v~d9rS<1Cp_(eg$9y4lcEJK@#Br> zT$sF#@Sw9&tuH<8Po+@+gA6vtiMrYm-#W!wyV_OYliLhqUk#=s%yU^su4!k^$BA6Q zjVa8>Zn&-&2HQb-U>1ICY*39(h3E241y{qCoo~Soh@-NCM0B&yyyHA00a}XlWwvr* z2bVDf1)hH>NmZrJ*r@3&&0W&3l+uRe^0u-S?|{;tT@a{-jh|AUD^p2;Q~^K{SB9Yh z*BfQ~+WRPduI(N+g2QwiGoT<>u+YC@3HhXP$?{x8!Nz*M<>;jgyjzMozR|IM>rwk} zy$NW~hz5s_y%Q;%N-ziNM?C0BCIb~*QwX6)Aj*Ffy6*6K!C@Nl{F3Yva8{w^ZhV|c zu$oEgv@UtWYcbgfq`X*-rO`7q3Ur#Lp;T%>8Ux~-sq!64HkIz# zuVsImw`{`m%6WwJ?|VZ_FzKyAq%Y)~U25;tZ%G`@u℘$J{_6RHfVG0lcIO7{wJn zuI!?nk)4uTh`}WuYorLg9V?_l%iE#bv%hMK41;mWldh34q#YQl`Z_GRDE_I>AhUR~ivRl80xsA=F!d(baj>pT!GtqvlInu|# zacTsSK1)F+(zaSmeJNJ7o!lj;Fk1o*Yj92M^iLc}He0n()nKz#vF0-pQ#w~zk#`K2 zO2sG{@|!)tWO4hk@qI*NDTlYY)U>U%uPlJBPFdh;A0v-4XMqd81D8$?2%kjKGTVQ{ z30XC%>KFuii85-x!CKaO3bSjtb$#9*L=NZ3zO*-B9c;uH%1ViC6P7XZZb`7M(5utf z1OUc|wC!5k7p8rT_?8Oe_GAQ6-t>S+lxS;m33cM1m#S5!G;t)X;3OXQ@)N zp-_yC6Vq1g3S#BK#hQ;+eFpTN(I9tTjOtWRK}`+67o|{E!T>EEy$44xoeGU2mdL~9pW z_#a0WETA;1SHYaBM18Yi7@U8>w*QEEuq!=^4S`&G4brXRp%P$C;_&t3l;<++4x@UE z+O0f14{iWt*GOEM3P}k>of$7|#kDfDBq{HC5N)(3YM@jF9z4+DflTTR6U+jgi=*3; ze#r|?N+C%S;L_Z-?Tsg5etd``zIE-H^Wu+s66PyWoiyg zL|3;aD1?#w+Hfz{thv@Ih_zrtJiRHFPF`F=e>FX4<%op>oQxgSRW#2Ghm++vCo*Xf z1=2?|#a=SB;_26;N$ggGtjJ)?$j}!%Hi*n6sY!vnhV!UYn%r2?bZ1_z@S5y8lRh~Z ze~eV?gSc`n51gKOS;jjru(i_QjrCTj7af<^Hqo%0tTs{Xj#`1Z+CwrOop`(Lqc!p_ zKA1!h1~-`z`fE?tbE~^T6uB}KT&3$89IL2XpHxBv(*?W9!Lf)67fAS&52Xw?1g{5j zrVTwiTdvu{~f5+MknZsnbi#01hp{R^}LJ;FKlxnOAx~f0_dj z2-bB)XMT86pd?AWinG63+*?i+mv+fvhYcfjAo-SgH+@UbfC6(GfP}bIvF8~Kkfc^1 zou$z)1`P^@E~aJOX*v_fqgsXR-_|_73?6S8{NRqe{Xv?Jv&Xr61peP+3o?gEkQadRv?8iNvuZ`X1wWR zE-=yego$#uN0s;ebX7HFVBZ6~yDwO7=N6X{o$$cnbrUC)3ZJ1s>f3>je!BFyK zRy>NJMNBZE8W~jpD=(->`cTImDPp92m6NoACz#&l^IHgG4uui$5Qg&tvD#LZojOr! zKH3MJK&&VmW-PC)_p!NIP4L}!aN$cMa7jhsL=sxu>|h*L_#m{_u@NWCZct)aRUaKf1z+G-SA;A(L(V`LwNG!)RrMend++xOq;I-;YsS-x)x=S zps;@hgLz*qvOLc-2iM3L3vPB2#_4iU@I`O9N8w1#Q0Y?i`c)EbNS#gA!}qD4o4Vej zTN@gNhS+Kb35^BD&Wt)MhP84j-a7115L75r9GP9qgxm=})|R)pe^yZUPnrtG3~nP- zXqBMmV%7F&2%!_bub8iu#1T*K@~0Z5b;v{Xz8394)0$2^G@<%A@%6zn{V0Wi?zKQY z1Stfube;+_*U*yF_oZ`mmhItNg8Q7E?xV*5iiWPYN!voJSBXFa7AYSu+f?4?x!u`` zOjxw5Op6y&8`B9@f9vgLdxpOX;ce}1J%DYfnOAlTg>Yo|PDOZJx8lVXjk!n}leu<5 zJENN58cQ!_9XO$#E@77=62q8=gzB;Om?l=~Do@FVQ=@g#wZT^0~De;h4M&q{_`U6y#IY`(gs zklsG7Z$?>L^_qL1CM;C+{s_crWG^D%+=9t-17}-XlG;!o2QJ4GLZ<>@+f}=$2`;Ax zXkbZ@SYMVRe5&BS0SnAkuoJ%MQLC^HU2r7n8>4aHart41`lo1h02{N*Pra-MVAXr) z2ct_?&PHz9e`TxI6(lBZ&6>^3CmFzh5}ldrF|@;U2V$ep<;3_aauyfaaRBCtODBP$ zwk;JqUVRAFB7|$|kfg_c>;p1ky=aq^^Hgwn=Gto8HSe@-$Kjg;e3$U%qnqPw>tlp+ zMV##m6`?-Tks0}@GJN{58IgsQ?nYCkW8x*AIZ{2%`jSW0@VvsXNT)k7qbb*iQG^@M z#ic}88c9bEM47lr;k)J)tD(|dR+23<_!z}ob@JpG6)sZ)*! zt6S#VZEK>RA7>U~QI{|%_y*Sf-8L=|drU=U%P@h`Famo!rBkNnfah1~Y$Zon9*Ypo z2C=b~_0k*bfFd5gJ304zp`Vy5J^fBO-2rI6%CEzjCP1m%Pt*91vuU3jlm z9pqZY*bAF=0`)&(KydczuSyl&OheXz(}Hl6%@-Po_(uxg0+E_(Fx8SOQzcYtiJOF8 zEb_2=>K*V!6E}dDj@FR{l4+%QXO0|g5$(M1Y@8y-uHYCpxt^^JDeVzeRMm;5_3qMP zO5<{wWBZftPgKxlJ&#l*-@7^ERnYR{jQx&<4Lc^J^^&><7bc*uyTWmO0Ryc6tR22o7(XDEX}T{Dm(=Rli)xje_w)0O~+|# z&dR{uKyIR5DXJEb<+n1^?mhmA-8ge7rWiqunj+kER6-Z+Zjioh~(9;|a&F@ZJS46I=0N7wB z3gKZ^Z>`lYy=_^iV|ANLeK&GPY7I&+s3SO)+v((Lw}@?LC?7ivhr|s*j|2m@0qIO* zM_5ce#I7P%ru`lPAE!{n6NFNyBQ%K8l&Y+xh73f+eF6396{GG&gLu%Dlbu2`f7Pk6RGWGFj_Da)ZOp11Jh6bhi0t)qxcj zp#Fp@(Aw=K4z(^0QJvB8qWB!xJUyl3Y2 z2Ei12H(1F7DH$|$8>qHr9`7*hNewNFbd^x%W9+VsPI#OPGpGeIiG7?DDB)yG^4l0A z=$mq7IT1Pap}Hw5g~Gxdfny~GkAbuayV~B!R^Li>jU^Q!a|0jO-&K*r$%!4ODj;{B$st+qJfgb6ATYuvzJ(;t-zg z8uAokl-itMoG?Mgyc`3yxQ=vPD~p<(B869B-kiV(pJP~0ZCx$3e04Q$o5sgvyqiKs z0b(=YA-%-dBbIw;GrQ9H+qCTfCVa51eC*y?xK8v0`EtcKSSnsD%D`@a{@~YY!17QD z!fKXazmXQluA4=qtHdL;aDugzp&n%Q`JijPjJ+obKgPa?6Hv>2!i*&FZ?>V?I*+8P z6wa!2=#A7cT?wNz%{sW4C#ku_E6m4>rFoiCYaREj>($a}psE6w$In@{c6+E#;CetV zl4Bv_z0zD}B*60l7hyV8O36aBMU3~mB7||A7j!&XzBH0r0fZK>Xj7$4#9&{I0#N;L zL|H>L%pH5KkCe!9R+7aj$E-<6yKvv>NLI9hJ)g!*2+-n4rj3p6W1F zUM;$oq!+Eoqa$Rj=U6AxD^3%y^1S;gjsq27L(Y2P1Ka@_4S zAeB1@X0K;WH8WCGQ{!^bd1;M9CN!cTGV|`_x5o}$qSIs^Yn)!_O6sG|w*Cwj3MuzEbHu#OUW`6TcIU|MjPo>qkD7@JxfBWLLDBC@#E(^Iq(Jg$c_9EvX1$m<2iRCU zgEHjcex{YeplK!h0wq!hHh}-hV zc$PGE6vKrH&Uum5;kOyay<5klSzR{_5E$^IQk?V@c}}Y#yu`dS%#nV7XH~Su1>vF? zPOS0-?402N=wBE-VpEqe)k*}lywF_Q)R_+MFsY~w7ih{D`I&1d3AHC74 zMhz%f;So-p)v4lZy#uQk8wnrOB#s}-}3lt)80i?V06+%Rjtomt{o^v>Iq6d9b9nu3P z&kpvMsd&fw0Q*TsGo<0COln8}Gp{GG0))BTSe=M1{gnO}a zK~3kK&lKR?x%fDXN9p30hF}RjutUy|I<&*;+Y{VO^wuV8Q`%?pt~tczBM# zTM&x(pUFV-M@Ds})KGUJfad5HeaMsl}jHod1@1uZH(hw%dX$W_*VL6LUvyo9S^fO$xUzTMA zFbdA$Z{6w&%UN80tBdY%Z|dQ(u$mI~&P7_{Fz z7BK5jC6V7vO)?S=!!6xcEpNezUUI`a7>3}8@Owv`^8J&OI7=IU0|_^k@58TfO!r`{ zDTupOd@UCYv+8Ug6_zlI0Mu=)wII#^zdvu!&U5fMl^>m*3;Vd3Lf3zF$_)|$ci&v8 zcxL}?5G&ouu#cjfN#trIwd36!8j4xK^*xX;6lb+O+lgBcoMdeD$J4M_uP))EIvNCU zU8_{~@Td|}wuOFwcA7hEy{q<+_)*!If| zfFvSS`8&+IyeJe@o70XNSnQ!~}+7>FRYD33F69p2(Q9>KDNpoQ$K;pughK8|;P5Kbqx$3IZGC5m%Ha)OqBaP-Kn+r*1(pg_o)ri1g5qH<)&WmKv>5#sbrA zcwbJGl1)s1_r!Rf#m=Q>aY(Mj2Aiq18Zm55%**jKLQXSxK(Ty&TV({tm@Y(F8d=~# z9F#`c34BP0c?zVY!j5Ba9Gb&c0(SXoJ%Xyk(yH;sKDB&@dQ!o+sWl)HhU#z|AkOy+ z@IB1R57p5&$fYq~r+Q27YU`80$SaFGFO(DAz6q!t z7!s#{YrUNbnqt)v>dcrBoAg`w>Ly7Uy*WDye@X#~(H80&o&~$58$lBaOZrL(55mVe z91ep=SKHW>v&lvZvQRGkEIlOpZI%PRq{H)aZ$qc8i%o6Ly03 zn{LG+SwIE*Vc0;=ads2UC&cPN+T=M|OUu+TRK^8p#}pD$6P=wZIA*-ru%-op=6%w* z3Q!P#)RJ%?5r<2boNiQ1Ck8Y&M#)2ZH}GexjSbBjHD zb)XHMZ=D7CJY8v^bAXKDF3{^h|{9VZu K;X*+IDe3r~WVMq3 diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 index 13f52fdd7bcfd2475761b3968d16a412c4f9a2c3..28f8e2008305eef2f81381fc10dc26938683f787 100644 GIT binary patch literal 11337 zcmV-PEVk1^T4*^jL0KkKS#p{DmH;!S|A1svL}X9~|L{7XPYOTp-zs1_{vG$GWT!J4?ObiHM%rsR#m>$h+eyUkn{3-%R$Z>{-EQr>y4i9&S~|AZ zO4nV^)OTHW+pcJK+nim}w{^DFw;bjzr QwC+}JuYET@-%Pu^Yin9;wMgu%oyNG^ zHaoRlw=V9s>s`8cYOdS6X?IO=)m<1C*PM5@YQ4=nZl3r9p(-*4gA}DG0000000gRS zG&I5$Qjbs!fN79u4K&07p$sBvBU9A!n>5snhSUu`5C^H{1gd&rG#V8uKmY&+fB*p} zs-!A^EnB z;d0w=#;R3aDz0@`I;)>bv2K-DN~@*Ct8{E@YPr>`D%H8wt18vHUQVl8+OFMATWZ^T z`&O%7TWzhbevdn^%j5C6J`PElq4@V=)|+_u&X_#bclzDEO)Dg+?VMpd-v+X@P<3Hd zN|oj^#~b*MFT}#HGpOq=E$)*Ei)se86))9AqWa!>oOTrkeKxe*hA3`jR*X8QYKdz- zv_nQ63(on+#FX>5zeOXs&)Z&SD7IR@da*4Py}hHW*iPmm+5UH#b;WaOZ1J_+^LTgE zChZznonm7CmA+xwo)+=NY-yJM!bl-Ybxcb$RnddvbaGETxReT)fT=kI< zA|c2D&=~+`W<(4a$wbRCHYBH8i7ZJ*A{n%jM6!}fl1WPxl0_CQmSv@;ib*K3rX@2; zV$C!}q?Rb9ER`kPxSA-E#S?dNaV$|plu02)7E=_P6%s`y6jGE)M98G3MJ8!xM98r+ z*xnsgf7Yv&)va%-TUXz2xs8&>(Tdhhu@=R&R*PuWajL0St;Ln7t7Brts}?rY)~;S^ zssY|!&v6kJ{h4-a%Xan4Y#gE@A|aWY9o@ttv#U`aO6dnDXm?UdAZVJ@5daGS03Zm` zamUNjO^D{`v#N%l0t}g}zqO^+#GWR}r0)XY4QWOwPoA&_>(K{Nq%gZslh)n&I_2K9CAzC{QFn7M8TMxo*KsAiD~l?hFr-9O>}IyrS`kk#OVYu zgyO81EqXjEidb?g3ApMx>oDXLJPLF|3_c`*tooCRY8d5|VFt&JYPmPN`A(9Ga&*5@ z)1;-wEOjihcumBKVzFqTEQg3xe>)7DK!05@<~A{^_!0hcZGM zzG)`QZf@Lc2q8s@^>m|OPRp1=<_bSkosX1Ex>Y6%)bi_PyYIf}qM0AQ7{S;FFme!a zNISYJhLZzaX=oJ5g)&IFo~2QCptNI!N{}%{ROmy->jah%W!AI94eLVX zg*JqA*ksqYMGltnp{U8x)e`Whl&=vb`EtY+I3wxth#2vQ7Do!B6fMpX^cNX6PUEHs zlbh3(iQ0OE+6hn+@?g;?SLC9PWTAy6`SG$;%Y)pxucO8cct=7D^717NDI?g?qbhku zedVD}=zHw9OZe=bQq(}jaL3C}Ch%m@4@8%2?8#mc$RzKYcN(KOHntqyXynXynK|MP z4+fM%jFV-l9&TC7F2pU;Tx~H+;S6BW87L%Z``)dThDOyF>=V;l7Q-FkNwSPgmlQ|v zx+EtJ_8+h< zPs|K+@bs9pQhoTDaqusm4I1f|$vydr+!AS@pP;r>+?Y3GVwNc5?=(61a3MMrFodt; z8ct~G2Yy@`B;GF>*^8a0hQGoWAJjhmJ)vJ_P9Cm*J{5cMT_U8qYA|NwrvD3;UjK2k zv61(pur`bi+HiFpY;Ja9{5{ej69*bMcY6IwlFfgZY!Td=I`C<8<0+!(PWI+tM`0dIT=ZHJ2(B-Z%I6PIe zbKg7_(H5@&>A>pC{YVVbswelVfubP_3MjM%ZRb{BM{F-#str~IjXI!&eeK-ua10(Y^e{W z`b&c-%4?z{g9(H+Vh+=u6uBgp;o%hovCiSgAbcC(>m%{)@mMjM{kuzwla7EOfGGwD%P>v} z%sphv9Le;TV)4SY-He}d;)>#Q_|}xf@ZU{kiwA30G9}-RKiHYSm27b^P|qc{djsw= zS`Og|`9=M6!Ar>_QcmcV?GcXD5~E^k>lYrsAGS!uoHkIr7W+RDEHR4x`MOB+b{+I= zY-o{%{U3^XjcEq;RGmCRSTyM(xxQluPYTRkOR`wOCY($`cb(jWZo<<1D{?(YGI5$Q zn)rKE`pG!lz{)YNqdNLe#Mj&~J_!8!B8p-+qRQ*D5%O$-he6Hi+xywgSdtsOD{460 zKIO*yWxL;<4`Y;cr%zOoD2Jw8u4KucZFP?P>Su))$s4$O3mVz!iu__0uw=sMxeT`N z;K5@od>+VJM*jd6v>j+$dGicW<) z`U`6rOqwWYH5M#M(*2~a2xSf#sbZ50G=2t7tvvm8xP%V-Ld|DUOAq1pc=47iipmy0 z2EMRtb2xZ20h((RoOA^AD`NxTDW)8V-+=B&s#(E}E74hq7 z%b?^K7w21wH%#!fYr850G;$6bV-@v$!xk%skityj+jFFyQv^#K;W4E*$T4#?`5>0& zDB{*cGHE+yFVr+c;wYk>B}(law5gF?%N88V;;bSVx0l56M~__$kAeH)h!fGm2{xn~ zHk&#zlOfNaMSX#b7$V24ciEFdKPMy6Ly8gp6_SDfxgae z&Asd2kG+dRGzc_4+oW>mPLAbAJhH;f$#Jvu3}>H&oHBlJzV_~H{1IS`ekF*q9Hwr5 zSgVn=A=M3Ouygb1#vG90vFr1EIOm<@_}lPtjxeVvxc0Md*j%lYQ$+p4^pUub z&&)9g?6$=)v6CCYzY+9W$cF|x{x9kKd25Z>9HzIlc%PHXApQCwJXu>83%POU zGBLBnosN<|O>3Ox_{2>(`G`@;EHI=P$zzzwBtsSF-rn5%QdnWd-_{(dxjte`u{Jbo zVy6Y|=k<6f_tmU^4ms12W*FQiwuD^#I548gkh{@QpFyh%M=>U2^bhTUKZMo8@Ssu12!y5+6nNdtT7H;lCE+zZ`1W%M&`02z}G?Uk*3SiDk>{N z!nHNswm$`0hr{lwzjZ}#QjK?5yKNlytLH*VTxSX-Ez8};SxxFd2A47~uHeA$P z*td6bti05SPfl?f;%U2!re?$kYk)R zaq>8@TushKJW`q{@VEH}%O{5vlEyhg7QmGj@ySfN5OlzZad|h9GgutJsD3%_dl%?D66a7+5@QtiiDKd} zjqkKk598OdGivggBe~$`0{Ej6WV>yTBeWhQd(+paQ|&$vIo`OrF`V))TtZpusNHAj z3OUiFaYZ?x?v9;9e;j|6^gXv(fgaYUb}ZVf6f2ROjo}R)Iqwe_9>R4_bV2IQL2^Vn zEMvJnvU1y#v{JOOp3@kl8aIp+vZl=(b0mny%&B7tDT_;{MjL{ZAn%g|m9GjRP+YH( zC8oy2Ns;^RiDPz6nTRr6Qg`i-V&#P{K1{WU^1!J>=X*F&q$+-d`MyNiWg8H1;dZ|x zMPQ1c#;Ck5Aln`azj}6uE88@VL;C!Ww5Um=&sr!-^9|kog9Yt;p@BmhQ`@5>LBc&p z9LRKX`TMY3fp*?a=EFe3?&U-@Nj}-q;yDWh=9?IbiEp`0v&GRiCh%R5Vm-iAsaaSsmc*4pv$REBvUi19q-9)0Awwo(tm z9*%6$;=LHvN{>g*e!#>R;i99#Xg5!K$0_ktb?~HXS0|krHTpEK=#u2wd)9y*VSDVrK}|tyN(~En1;sR%@6v zJ@zf!gLi6cOTmON<_F7n9&*H$hE?BOq&#Lmvxqma%iIn`7=K>HiyY>*Rcz&k6yp^o z%92oaao}-u!rXQmja~#C*Lm^@som}%nHPqrz@~@$hbV$gok$dvVwl>%j7JR%rW8yj z=uM7rfm^*`O19~r>{W(9w;!f4R(yxyk({2bwf zv3&IHIUb|OLoJf|aau6J;u-u|vCP^LUMm_@E?9!h#|;hCto=whdi3sL?hiU z3R1V$K}(DFjfi^Vn<-40J4Zc9JY~r-Vhd6>;$pS6M;`hWI%xBqAGAG+bYhIREd`*c z#VmY;p0)|WpPQwtdC`*B+`ybA&_{GqFf~TK*3dT~hxN$Luu0+l0azTd*>{4&z7X}O zLc)0Vj145Qo@C!S!Ya0=9JyoAH($z&B^iU-L`klU6PY?-QreFYYC9Rq9f~1dQ;1bg z8W_g}9H>zp{(lzLK$e?Xx*>6ktku)8T8C~UFt&=kVMy;SHQB`89?`$khoiXsGWTqH zjp+yjk%Ffz~pqJN%V+$ z+6aT1(S4TH)bU~t8kHiAkDk%CLz9)=%ON_*@K2D3Gw-uSbrjneS-}JjafK|1lfdzD z3beCc=F#0%4#$r0uQo?zj=TzZOJ)vPUg~b`_>On4fzIhq75JCA_zb2`7j!P?BI38o z#!o>|F>klwB+;>ce3>rvE{91jB#K5#-@gI&h(*oZO(%Z}8@f8)h`JgXjnmhPR5Cw^ z5W_6(EB5`Wkp&wa!6r|oSi9vqUqbE}xhBV*)v3dn*uQL#k6xBM+pZHv;r{NKx0Bf5 z-pR{2{^4xbJ@^kMRH>uhICvmp)M4Q?Mn@#CS;d5s<&KUwhcS%7-jZ?ha*PkL9t;D<3(i5bh^n{Qrx+jkGGN_Lx%{;nadfH34UJXgi}u`hKW8p%0W?dEqG-FnkuoI9-1C{Yn`nZI>M-oIvF;pO7LW)HR98~ z8+oyk#rjmc-M(mE;A6*ow5y#($qdI%_^IPbXWcE4?0Um0-wr-#V}cGz)VazoMl;zf z!50Ibsl$g1mMZ&dZ^=R$n=8OGB8r(s8cz9?Ag{BxLikRB21j=Vj$py9Xui=CXkat z6H#^21-v^j!_wI2u)NY2P5sCyedt}d=6fU?8=Gt%GD)K!H99Ye&ot^}+KuuKP@X*G z6JiW>O`&r@rifFT?%<*n?~x%gK}4xF!z<(VhcEQ(qeqUow>N|&gfwvAq~SK^7LX(I znNu}4xiT~HPgKVI#fI)pF%Wk;Lqnq*&kI8rF}&R6F-n{G;Dd@upixDYCk!ms_bOQk z$T}h_8erz4j{P~OZM(ulLd~*tfg1mMJdHhE}V>= zBNsc*Xy}7>OjH&<;p`~n-t+S-HJ?0PPIN?PzVEI3xNW@ck#e6Vw5M%`}4 zaHe=8+{L8Q5!x{(kmfhiW=^-a7lFK0PunVqgE~zZ;Pdn)RTwuUW8@Zh2#CBUKBp*Y z*?2AW=k&$yhlYY|XxXlHeFE^420L;MYK@!)Zs}WKwlV{x$ePia6&Bz~#w{ z4^}zeoy}ywgvpe$9>vz#I_B=<8h0ILtSF>G4|RnuDZ3A@7!=vDc@p~|$ zYTrrMBW!oE!W`M7kV(6Y_1$b)80i~{Ie1bl&9p}+JP`9WA^lFsxGbcMW|DA4*Vhs| z_DvZWt$4E@+1Z$#bb;Wt#!+@GzanLgk|ghNCl3-S=gEU5H8_M=-B`ywK||=yeB$j* z1zSF=KdxAgH(mtrgcdM6#J6~Ow>;2vMeNn>*Bb*Ukdesd@^ry|9NC+6jI1dp%uwG| z7CV~{Re|Br%CX0?HzevRN)2o5L7<~T7ITE?5s4#3i0gJx#96>AjeK|N5G?e#c;(^9wHA2b?YT*_;g*!R*rO3v4P7SGFg%2$*~_e z`bypvoGZ>)HwEvuqch{9JXlLmlx2(r3Zxn%gqy)`Tv3s9R!NJCjzQyC85qufNh3s@ zZ21H(ZQ&}77#r&jd+grL2bQQPNH$hTDGlKFN6B|Elwz|`FBdjTqX^EdzK!p`&DXtZ zy2gKn8M47v^G>5n`q5h+M4lA`XE?ckvymi&AG?%x{Hidg3c4H+rDq)bHbcCcXUA!h z4q(7w(Pe@TVXtuMgJP6X)5krTAi={%iD3jU!8mb=Hvy@Owc8F1Ty!1NO(TCfW%4x^zMB69%^57c_Z9;o5~E zQjC-)bF;Q{f(KZB5O;cbJaUB`xz-4PC=Ngn6Bh8QD7#iye=qO<|DCn=Ek3 zQywlw%RuFZ$|5ct)Ocs5fjg4HHLaW;7i^rZMzE*DHDM$dg5AN-j-LQ*2D0*ydcWY)LG)$)f0RcZuQB=5{c~ z`kO8&ZF4_cCv#PpD~~bd<-2haW`k zq+OWQ7=_8yxsC|_<4C5wC6~&Uib)hrLYf>b<)%e#{msKm?&keN1K4jx81(}!HLhY)ViNXWK!>9cL_`RI=!tCFJiPqoes1f-kiuY@7F0m$ z?&pQeJK7GKw@ik^`VG-1N8qMjg&WdNYQkP^q6#i(>)i|#$4qhy91z0JaD@p!A_)&9 zVRWXx&B-)uyc;`$-+P-lQMNBU7WjiQkINkk?CaoD1M}YA%nZ{55_onY=FgS;+1wVN zx?EzDhJ@MFgFKv=xbk+$h&DW8JjP2*ib#hG=beN?9{w2GkD`SoqF~WRV51iI2Vo2K zY%rnH80_a|lD2gv%xu9KT$G_E1^aQ#=VA~g5zlbQ&rJ!4F@nNVs61G?%bhS_(B}@G zB3!;7f)PjA;j4VPlO{G%$S`SnylCf1E2?D>i$)BHC77teqc{75Z|@q<&P@%sTi=fp9u(#DS|@>!Qn6AFNS-^fO{Bn~0NqFhg0@nOu^LO+R&W(+i3 zLC!_o(V-?8vabkd-8y4XYe!-KQKAa`-QmH@D> zT|MA)rp3NqmMdC3^VluU8#d;Rn^Y`y2Yz>a!94}*n$@~F(i%!HEj<^8N#O~`$j{ut za!JV~DTgT6OnoPsNijya>rybZSMfX7NW68dt!H}oZ)!!~?&}g{fvLkrC|c2S2&T$7 zg~lYG7W{mnC5|Xj(XerT$fkr4%_YeodO>0Ag1~UGV`iTO)};s9!Lu5ZlNvB?$SBtm z3loRkMYuSohNrqlsV6R`$19WDq2Y)$=WLW?c1sRoXT>4HhUL_^ZI^fy-&b>>qzZLeq>xO%H>OsG`~03 z*Mt%|ol*Q&2#%0V)Y$D8vzS*hG-p(>hpQrAM(L_!W8#~SFS`$SE;_N@rBulDLymXE zZ)64u%blkuJ1F5xi8`eSP0gHyvXm+6@{GDMJg7WP>L^1dYRYJ29AA;Xy%0GPEZ&Qp za|b5uSqA#{^5!~}>^-36tSNB=TQET5lx(7!jH6yiF6EI;i3hk?)y|C;B$58|DAZuN zMHS+V9WLhKJI9jZp5AE}ETonqO_d^+AfuWnmhXy!Xz2rF#<)fBCr%hl5uK3{*m`|g zwWEi7MT{v&XML);l{8;YAz{s(Fe%fFb;tK-qC_Ebd$R(OOV<>EtZnjK>>bf1P^g}G z^bmB|s31X@>UNEkaS6d=LUI0*G*8%km8CZ#MHG0rxZ%q8ZVwxrLEcl&5hp_A%o#R@ zhq+2RbAV>EDFt-Bt~lbn%FVh>*igg9Z1TP#fUW2c9RAH5KQgvge-kk&AVYM}_= z<;wd6X$(OH?BspVWODX%daP*inIukCi{|dk_z*=0G+uB(^Ni;wX)cu{)=dg<*xO?4 zZ05>1amb?MjOOK~w&VCx{ITd$*faIbm?X25Tu6t6qSh_CUng#=(`h2v)&+8T*zU0p zxznmVP1=J|6)QCG6&vHws#Sm%lMN1oo7*4pe z&S;L@&uE+N%vt9LtCVA=ggkjLQs`IRkui!gJ}ToL7+CQL8;TdTa>RGePkLOaIGw+! zju(h8k~%-O#TP3h_U0?nMkdCz&m1==xW{yCj!F|WiFPVFRRTmWk-d>4k!9`(v6Dvf zTH2Rml;X@AJ(1pqy1{Jy0-4S<)NFh}*XrQOvGj*qms55xF{!wu7c7(5I4P`eU24Z@ zk=c%pnb+MrLl()AD~Mkts>KR1c-VO`E*^Bp2+)^|W8Uc;rxoq$`3Nj65BH>Hu>~Fb zpCE*rAbcYdWaSw$a>c7BesgB_WR{TTzP>%1UiJ0HeQL@OA=~ENs}eB zl_mBg-Onam+9b@W;hc^gqt7wiU+B@R;fEZw89g>OaLH1yvJD#w z!L0C_O}8T#83smk+WAhKD3+2?+7G8KJ@|pwM(=DDlVz??5` z(%iQP(iVqtOBv=1@(XxkX#^H3X5mdR{ND|S2mzW@;qqAJk`&|V~$ zBZldJC2>8oi4)|V3~vhBXDO$k&5KmqT{J?^jLtoa*qyC2yLe;$2mfp-5K=r zM~jQX+Hc4v>Mof<%Q3dwUoIuC0 zR>V`$P(RkJAL`Mc*v3^kQ_rs$tt(w11Zy0gmV>= zrg*tDXofb5WangZ{(+4R_HcCx7_^s?%tIcz-9L+&9tT1d4IJT{^hh<)7+h>}R6@u_ zIHv{^$C$Y&k(U_d3Q@h{0?PY1Ww#!MBSQFH>in{`re?=|<%BHix0^-gak3J-i!u6M z;#I>oJhgWh;%)bdGffqzdUNBJhdL$=3G>{!gWe)?V}tU(q!Xs;s7Npu=EUM@OQ%c{ zEar@gYq~9?@dH)Nk|>pA*ySn@d4Uo>(Ij?E;DO%`VAzXmcbAVIEG&%qB8d47nJXfp zP%w;KlS964g%lZNA_ZE6rngQr0p_8WF2$-?6smb{86{m0%JP|3a&Ojtp=n-Dycbltop z^)Z5kf``o@xFU2w{2b}E#!1>kR*I$;)0!P4I5%=?3xycm(_@(wZ>lY$|}gEj1t^B!{|QES** zAnCZAp(YOIE0Lq0b}}{%pGf9o=qRzX(l5(%McNDfqosX^8vh{}&q*v;UzdzQV#bcT zpxu(lh*cDM23Ob9b7E&F_Z6G#aj_pCbU30|f{w`jSui#1=0?$zy^G`Q(^TOYj9RKW z1)F(cay?sum^HUM*x|G@8#-RbjT%CzlwO;uZ00GEIoKpzj(m5fq-ZEnaNi_zrvz($6JWnn2|ZYg0yp8>3h0k9zC03ZqVD{8t^4Hwg^MyNT&k*1WaO{)=G zR;>D>mpdWKt7%V4SyM*&am5_V8$TVfn29A!$r==Za|ot}8O|zP&VF($iGfV(@$K2v z(7#yh=eEA~A#+YzjcuU0B=;j^ZS9-=x}$lr5DRvlZH?hEqlT=6nj%6Nhnu2Jn1 zotD^_te%r%aF{FRFIybqj$GNZ-sBr0j#?0Eo+B^LbE@OXH!#~cL878`Q3tQF+Vz}w zzUfFX=%u}$;_7L7iCom&!f|%{lLEQ95zBA7HTB$x;gmXX@#hUd=NyB+NF>p#@rfpL z^CGMoFgj+ic?#3)eWnK?%xh&AxgPFEB#`N|+mbWfkWj62CCpyqp+&NS(vn+hIpIqj(BkNM$>}`j zRI02U7++0}9v)7K8}D3c)@*%S`uC+$_(?2K!dPR3ZFKZt^Y=OBXt{x$gGfrT5H=fe zCQNj{6!Qp1i83S+B4Fv#l8qZm>1&Pd_a<^PL4EE@9B3O_I%w#I@%59$2XmWBc#|JV zV@;J9jFZjmMyZv?il3qKYoqkh!MBp{bUAWtbE0HUPsla5I_C-`NUn}8y5d6kV=+Y> z`zH$e&YUFcEzmAY@rcGqlVq^OF~dU^cHxHdJ+@kLlcVrM$6T)8fl|u2IJ>e8U~Hj2 zsUs4~ZoN5E0UAy0a^@h?R{aKyWRaAs8or@2IOO}cdlQ?Qgnsh#LX&>6);K+sDr-3R z*Tv6o(fEKL=VSX#b^s6reMiu8|8xc%a9o2y5ds9lVFF8^Kaj_bs;>FG9e2mJu9o>i z0s;U700aO41O$Kp0000000000fB*m(1ONm8gpdFL0Du4h000620ss&I00000004jh z000%sa`$yd@|6G&tAgMK_8}L^THs6pK&R+`*ZzON73-?I>eaa7s^a5qmep_4|Ha&q LP81{@rhg@XHvhe@ literal 11286 zcmV+xEa}riT4*^jL0KkKSziHPF90)}e}H6EL}X9~|L`E74hlc7-zs1_?;bhfC`md>aKk%#ky5pDz29ntHK- z_QF}Ceaoy}?;_qb!_1>B(ei0W7vv45;Ypt=PT8MCs%Ozd$-z?D=q6XX@YMS(~+Uv9Xox)-X*fA$gAJz99wkvv1Xz{fxgpnRagp6;X}jF_TQ^OUqC<7ZDE6~cV|o*)y3wwc zwLLeH8!l>!(4ulOW!3TB*R-2Uow%~6J@)y=bhBpYJYvrDZur+`O028n>+JD!vlBl8i(%X(WkdB$XtRmMJ8PELkkeOHCA# zQDaO>W|GC4Xo*QIQA$}VN=+0=Vu`=5E+vX6l8GcJqRL{EVxmZ-qKZ<9D47(L$fV6I z$e9)r>Z+^qx8lahV`#-|CfJK&+ABr0YPi)@t5)L5)K#&uV%3WqYHL^D z_*GK9m#^El+3m{=46iA&TmDsnALBxlmeXqpivgO z|B73u_!6`aYpa$z<*xCvVqnWf9I2rtF1{#a?)*j#(-4>#xXUDN+8y&aIC}Ua+sD#T zM(v{Fokg@B60rg)xnHq;IFeQLY*S0WU#vLNQ2dg{YaBWxPX#L^e3to7aCS1aa{V?p zdOdeZtO?FE*A28OUN$9(meyF0PmE{ci(!0UInfZfV@iaVv0SSgAhXVXqDEs`GCCT@ zX(r2VZrr>GAw`MxbfaIrk&GzD3O`q!kBlxIQDzGv=FZCZ-#&CJkK!BT%w*r5d??)c!*_XiqB0?O$iyPSnoZv8;``+Z7u;N6Tr8h)TWiEGy(v6c4Ibj>a z4x<+}lER%Yv%XdMQ#6fb9$MF&j_VLD%&Fc@=21*lVl^_Re=WZ9&2imU7l!)}*clJ2 znmP1(O)dPC_?xk5E#|?aT{C=<->yYqgI8{U1YmoN!;<|$@u6ks3bzh@%ae1 zV4{wG!kRp14cEzrEA5isg&5}kKYvZZZe(*t(f^-|TE7VkW%m|4f!N~b_%VA|{7jYC zIhYd#^hnp!16XS*QAEEFbjATBgoF~ zdgt-P$4=zEWI{}o&`ICt^2L7)7Z8dl$hI6(+!~CCA(lTK!9w8h=XHu0whNO7inefj z=5o4h?Z?QPv)pq7@VKO%67{Ky_87y}S*hYLbEe1EKcX2vMC978=6;IUPdHE0}o zFT!}a79_#Z%iPYiJlx?259^{%+{6*n4n8kKop0jOiDRXcKU}Ow42w{DJmfA#K*9IxJkV-a6=wYamtE=n9$BpYya6`;N_KeXFCBl(7IIYca=j?mUyISWG3NF%HXP|Aq zOF7s<{!xEm@KW+e)RVd;dqc-*$x`t(^^6T)kJ}`P@1;)?A&C8Krza(y z6L2tv|7-EgwxTR2rgl-`QA13SS&HPz)5WiG>^;#*AlC)QM(47{57sgEV75x1x@d-K zU0P11kI8>-TS8nyK78xxKNDYYfuMiQq3ElRy%ttonD6Du(oS6H`$zpc)tK>3$Sj|9 zXg@|q{Ni(;yK+`O>eHu?k!Yu;Tue!W9NT97`0QhcjBLMf6LREm_SSzOxRxAjL7`I@ zufhe*G59|aXg?s{>*Ba5$*b^Oi5cL$n;Zx!{|a%3PgmVCRddEkZlZ`^a8U?8ZE>Kv zU$kO2_HqshqBVm96fJVx>0#`2eli@sQ<8oZq?hN|Ocx+`YnI)e1S~&?W5wIg*=wIYYTId<;|gkUu4Sd8Pu$otqL(d@bp>jX11ky zV+dHep{ZuT#bDcuen(GSLxbFNwz5SY4IwEJD@=5Qwj{+t&K0M*FT%`U+quKJ zdw6>K;+HV6l^PVu4|t;tbe0opXd1p$i~Ex~42;eQ%Q_l4RuS**aq|{SrwSLw|TuKRKhq3Et0)^zOwT zqGrl`^3tcq5imfsdzv`MGe$wRPDk%O>{sHyMfZ~}Ui%-fbQr(dIpK$Ld}0VJkWYAb zgkd+4^}mqn4Oghg$~ikac$HWq#SC>mUXvdcaa3~FHQC5oE2cRjAc4)YFtnb?oTu3f z6vuZ(`e5I9MXwRU!kN{LNy>2%RC6S5MxN7G%NdRvJ(Qdhc8fI>+*6!c61lSjY-4@D zOqwL=9D}CrV-D|*?2b#0u?RWB#>61XmOGU=RWWG&F8w}cN}3#P{HWp^ljeynqH1K$ z#$FBEPvGFk8ZUGBaN$O~c_hzPGN)Mn8YEF<$YH3b&z#kTACV?s^NswGC2Uy$*mq@EDM z4$%7$R%+n3N;?NImbra+m$3Wa-X=%5rSNtbVmgFi^`N?ys?m#PG+mmYs-oN2#%_l; zCWan&^{z!=<_MTG!aQLni&(DCF?vN_&(fwwIfH$oouyMq^o?ocsjpI;_nTi)FXLEy z{FfZy%!Q)Q7J(lFQ{-ngLo%W4B_5Lmpv82_;@u*)KezPj0(KlEaIit3p4OXWgoKLd z=(~D+*R!6wX9>&b^&SjE>ZC^`z0Nqp{xDB+gL}6QFuJ*te-G*mSl(FPhsfrMCar`U z6)mS2!wDnk;=6BUhfXMySaT|3i<%b(+Ol|M3!519VGcIQCn2nC?fl&-Ujdey- zVhCFTS<5Z6Ltd5d+(Z23#w;@y7)pYzI*gqE4VFeyb|>?HV88HVQfT4|nIzo73eI>r z!FO$ZIv+>Tv%@Dv>-h~q>f%_*V^c#Hh?fatB6~u{D9ts_8M&$qsl1&+!X#pL&xp9< zTg6v)Y{Pi-sqbAi^PQ*A=K|NJi7;DR(dB(X;zzYTYISMLXqyohFylM*bZD`(%*>pZ z`(Y<&O_>lwx(d-nTyKuQ$od}5D+S)xmwlGrro@-Yr*S-3(bJyr&w;EbROdt*tizZj zL!Ofq=JI*j{B!IU`3-aBU#QsXr<}0n$mpjF>|szrl(@-RTo6YKn-tD)F-G6T#5aM> z{D~KZC`5=GzUYclr5VNyj#!HHnL@%BEINz35#)g{BdameO=TsFr?(?MCDQ17_V&7FzxJd{?ef)k2PqaE7vdG{R9}Ze*DX=iZNJ%)Z~tLM9tSoh|LT!R7EOFN@5I; zZH;b}K3nbY5HWFjDcv^~dLiP}*hZ%&=Y@}xB9Z2c^^BU(+4Yb?4sqn(a zq?8)$GmI{-E(W=JHHQ#mUFXOqr+C1EWL_Gg1vEF@IYW|c>Nuq=8-j14VAlsO@LX0| z*s^5dqVa<<^p_i2ql1a0H-Wl`jh)5G;hyth$@IU~$R8_`3#BD4+osc`&pPd9ShfVJ&nKnr%pq)*Rbu1yFA`T8@G|FmxuCU`?u1RDr zCeb}{fr+U7I~l5r6~A#7h-$)brnL3Rab}R;Y+^20k}+~j>P(@r_(r~B1sL*cT@bv% zfMd;CDhyz1aOi~KvD3_8!P+_MN#hPldXQF;w-)G?LC3a6UYR{&3rCA7?AZw&J9RFk zt4#aKNnu^ z=cwM0z}dCXMa~k&4@acm4j%gt;Y(z)v08NqI6(*F2FwmijPMnyAjx`&EQE|>r5aD9 zL(O*`&TB?CTUb-Yhd63fdNwwDMO_X?ZBAas;moPOSX__qo=K}<;th?kr5z!R347nr z5@fk%^EPrl``lvZDo#OYacgK+RKejFI5@Uvu}^=<$9mE+-B|Iz$nJh3<_{Ll%sJS= zoB1{==q3%8`Mh6-h7;_#=CdXsWP!wj#xicb_!^N6IZh^%zlty29lxFMhKt3)Z<{0G>rn}3vfpFZe{*cl zqE-f-5S=?PBF}yIhc;_Qkinu0K`gl>!Nw5TUi*H2(7!dhwlY3PSt!>148t2(`n*RA z-Kd)ua9ozlQ6`2u5P02ObKW?3G(ejhI#)H3i7VD&T_nL{qZjbRMqKYnIN3Qw4dpX( zMu(AxoG}LJCoBoP7AtUZ$JGmVIlGwZj@tTM){7lFY3@6q>}YKDRKaVSgF4brNvETE zQ8=jmh!o##vjF@r;{rM!AZ?3omF^9k>(lg$$uVP;W5W)4Z^te`uyIGp7%QSx$}^my zim^r~Bf^}gFp*&o7uS<~EJ(d7AW~>!M+GZpoQD$@Cydo=PplmiH>Td?Q9W|8vN4`M zjLo!?hTrTLL@dDm7?>EZoW*Q*Hd+ViCp{Xs*15}j9$z!c-3@fk)g92w5IB^FRin^e zcqP_oP4ex{=Z9)XeJGihy)Mv+cKls}q7Fd_nW5p@`aqe6^NCVh@fX?*v~Or9Pucqm zuawB@a>j4?{Q5JTRFj5DJ{{8#AlVr>VMUrVXxkI6med;OYeo*-RTASNlWLT#=1N0e z5~az_A%eyzo;%}zZW6L=@l@BG6?9TJvWoFM?)Y0XyQ1X}As4-yCULS33S^_JW1m^c z9=s-nYmRvi95`U8kG)fVR2XB!vAolCe9mjqrVii5%F}mah9N}rVs!Wrg^=U$=;lUt z%V&2%j%-}9M&g;|wu~FqAjU^|sl6RE`{4yD!BR-Q43V)OE?=}Mx)`w!5%(Ney#>v& zf`-_}Dhe_^?s78Q&CGQsiy|9yGh-9i5GM^*B{FKbaHJ5(WWQU*cym--?@bCxM#WX? z!k!>g$X)tqy|tLxvE?jx*-q-_F5h+u9ke4j;?~7DCwPo_$p(q~`((F>&otIDRg3(C z8xzNva%?#r6KG)2DWTNnySFHHJLE@9j!`O2aLxRFgChLWaD&BUx|6#MYQ!BN!R5R3 zTz%1bub#u9ocMBis~bZZ+?OVti96Ds6oJ=9@xrm9#rKOGrRawK929YhG7K=%$FU{6 zjKUXFu298js4Qi966drl8iNK4lJJ}mW;8~aR~_^tk}gXJHpCOlmpQ1C;g2kkqL5m& z!t7etc=|GB`nHpnl(pX9S|yD0&Zlv1 zF`fOxCk^hB$G6XLhlv#ZCegHD_I!BS5491Xa^};2ObTnp#W5mM9yo8A5J?UkAiqAL zq_WOYqU(O5)F zaEyJnHeM)v3-ibPFz$zm>FbbWja9eO+B{&zG1D$e3UcWrEG(0y8+nmQ)gyS<;R}>; zju>%_680LbbG<3k!)#X_YNxMet`51oIioJ)w5Em_h$7cqDRECQ+TjA5HZLAqW0^WR zv5suMLS||>V`3C5*NDwvt48$^$;Smftx_MEWJhf&^ICZqZ`7DxzU9_S>Y~SUVXB~KWMZswl`qITmPkVC^dWp3G$5>SjRIVQ8WhJ^Ky8^fNARs<)s`<) zCwqa;6>4~k9LVd7^c?fZ`Lqybj`at~hW^<-Gc$92^;K&PAI5GBeB#uY!L*x1k}DR^9LnNs4DM$7#r3T6#wkp&?cr_b1-9r8%xoMCQX z=`RKJdpj;kg9>P!!PZjOIlLORP=fH`loXv;Ox;B%5z;=mXR3NctKi4m>Cpy!Mh#W| z9MS6u!?fx;r4Dejyp@cdEEI-%XsL|o@!kkIg12`vXyLQT;xa(j^$Z}FfeKUzJYn(k z1Yf4JsUIU@^WF(Z4tFDpcwr72Wp+F#w$CbEQP+1t$}*zlv3l%Xv?EOH&aov(up!-j zR69bLqC_}hcL$3au$nShzEKfjjX#UED~a7rIh<%tZ@58JIB|&Qwp>lPh0T1dIZ9nD zdqNB+XufoC*UTY;!zl*jt?+0Hu$xx-RIHQ7t_!jWg3@I5iTT*~jpX3`5$<^O*_?rt z(av|;C}HwRCTVh5VaPHu&b`kOMlXoQFD4|N9v>QzVx;zDXc$qsZkJ z8mM?Z*+bqS+M2Z#ZHlpy&N?D#S$3!;Mu{RWeT577mA5Z|_K=H<1!z@(ZW>pBu{=Sk)TI3YHS${P|sL=z1L zCfc#Dvg8^ld=z#?``n|3%8|XI&5n=d=B`jPoa&eq>`c3gGkS(Rczuxkv#NdNXf4mE zu?E+Jizin`IanITXzh^@ym*K8%$AuhF=L{?YgVzWuY@M%V37`PIR=Rq2{UhWeU~vw zV`2pnvbd~T^2J|{WsH!hq@Z-MT5FGc=u?9D@Cj}JQ(hd?= zx@CI>%KNTJ*3P4Gh+;tf&ZBj;5#nqvZrkZ(*mhNGF)B*p2ozBqJ?D&#w8 zJjhgoH95={44QikG;8e*c=`Um3t61t%fYwYXU3#|4<-T^i6yI>4ZPGsu@qqlf_S)d z2Rt~b94L|bZd~&)hlvvLdmi&5`XJuSwQqeUws*EK#u7=nX8V{!1sZs{H!x7;A<5Dd zJDT8PKF?=HT$1Fx!Lq`ubEmCGa&jROCjQk+m_f;Wmb(v*3w*d>7)U}6NWMF<{B+?p zf=y=`&(Lw4>pAQff@G!1LkMGqdR}~0B$~;ka~0?)oRV!v8@VOtMTuysom(97GD1wW zNv_8_Np7@ovOwB0DU-f`txS(Se(u&U1#7^<9itJGl0f2|IxU6ui4f_eE?4rfx}jRK zTt*c&oi;VF^r(qPo_ghZ!)Dycv#f%Ug{<+{(U=CTkr$&S3Y#R>({y8_jnh`@IGLx= zqYUJZq%lUiN78!oNfc|0wI#)){6~9q!(*4l(;3WrtBAGv`?0nh(45FX(qdrHqRKt8 zAmzv-qWQ9f3Ua}+iNULWa>NQK|9gjuJM{>4E@FZN5OaBBa~rXqVNMMjJGIdzDi$u{ zU{WQkcwQVVK|gMe$KEv7GH^#XpN*1qjumzKOxY$o z*UyC(IgHW#BoQ4Tn=!HV7OR(MFlsTHR8z?!+a~FnUt`{zk2kvyXDmBt?$sE;^ilRi zoYsy7j^AW?&MOjhl+Ox6OPs*RR@cEM4^OZrAZ_+k@x4mPVaJ=`fh=Ul)=#w}nHOd^ zsWf*aoQJrmU*}(2IO=V#GU(zVa>9ei#*CRHVoBVKedB}}a@RqNDejjeMF_VxY|q}d z1d)vrNj@ZEjbv!Ob@*UI%(HY|p+Xv>P0?`;8#w05j`*i0j*ed>YlGqh>B15R&c}D_ zwKlDNXyM+`VicpZzSUq#nlYvju*S}iDbtrLhc{lKd({~AWWi!7WW6BOO}+~qgSjL` zJ$$^Aa^xKu1O**x)h7u%V{BZ4-Ot+=4gA@1V+S@_WRt^|o*du0;Mk~~9p>645;R*T zaAc%3Gn0X`SWV4*&nHYiFH7fPoy~DDX!7iW$4#LabQ!2Zj~UjC)fNr#d_@3bunjY|G+|Y+c zHrp|=j=V_Cj{->T~MZ&K~ACL7r4f6uF0h`UP~CHBes#;U#=xy zNx88HGe1~~e7m5MLm`vCxx-VB39pkzKIu{OX$UIlN(Hz=oHB>oJDT;SP%h@fpv(M0Q+9x2NlnSVyCB1z;NzXajyYdsl4Nm_i&>7Fq??oT?RAk!r82@3vzknm8Yu29Mm9Nf z7Qx6Ib0>=v1r;WYxj$fz4^(xBgJi{L*cG>0PqQP8jyK!@Pr;1{cd|y{;GYQ}6pb>O zlZK9C1}5E8rYK^IeQCoJDe;pXN*CH8318KNw7s4Aq``@!KdFG`cy+S6<0f;6mj=#*%mAmkb>Tdq;D z!qjh2d+#IoV?tOCe~Ud#!zr)A}g6&jSGLY5%3rPaG0<68xBi{kg>VUnuJXp~#^`~Cj_4(y^T(C6-r z-yY%J8Tq!Ugf~~x{Th8-b9lkxY;aE@T(-p(3PEgH{~WQhJzJPH)2Fm>(P)BLqRT8~ zLsDrR!`4c*DML4h`3)HEAKn;(*rhmxm@Vz_a|Rgkp${5j-&vqSbK3W{JWb3*7`S-c z5{`uX()8lkt?<)&RUG7)H{`LgY-_}bK_-%sOB`Kr=0_l0#_3Wx%2j*CPdYmGg~{Gx z27AZ1a!D9$VW_g}tU*U)&d*hZ!E!H?Q=#C+kmp+or5Q{OqQiy^6nJ8XLSnIgWai6{ zJ2C3xk}+2p>Zyg{%$qPjIk+%d)}mw_sWrLbl(Etb9s0$tY6P5)XxSyKEg3R1{X>}D z-8g|Bg0>=_dULx>3q;-qgO@#)JV2W-*5Uq1qca9?Rdlc=3VFaLgeR4$F6v{Rc0S;}~BV zIwc_1P6D`9xN=EY>z|y zhRl_bP^T^>%o1p3&Cux5h`c>huP0!4rHvS_;>FFFDt;V{%K5n*6FgB06pnR1U8`_b zwJG|LflKXNzahrRzefl>e(pY3etj3rk%{?C_6xjvxSmE;QWhzUK zM@6}1ypN+9O;NY;!-8bTFHj(xDGTo?tC?L8c(CKs65c4ki9059yxh}`(h4ZoMi_xg z@7K7aTEcM3W2>UjLip&>LfXtEYF&*}nlr)588W9BQhRh8(*DN&w7cX(lz8`faYi&$65zrKbBbj4 zv})&1cQSB6dMMR_j}>xk$3BDES9VB6ldg2PxwAgt#&G0F)OiLjgh{~=<=oACBmHyC zWJ)cI3qzeY^OPimxq9R1=iPjlgJ;q)m-)&pZ1jur;Ng1Uy*NSIX2owrF`dDoh8BwT zFfhjmvY~#-WJD^8JcZS@^x%{`(JP9 zDQQyJI#7)IV;VbVg94j;m0IaGA5u`bAcII%5{uJyH_l$JiO#ttoZy#V#tPjO?1l1$sue?aZXg51E~ZG2nyhfPQ{4f#218ULIKR(4I4J+Quq~qawoUR zQuzBrXLT@Eh(~V-+R&pI*q$-0@MEWONKwIxG)VIiMTIx_bUpQ(r&hKvRRugV74n`O zb*vP7MCWC;CO4DNP@E$M{wha<8XL5NB>8NT+7{e2)Jcaehu)+;@xr1Z$($MA~hD;Vxa8RyJePZJ4 z$ofMCH%>cb*^@%p;W)_^gSO5^^*ND-3MBNgr>8Vw{C!afd?U_v%@ z#>bovkFO3Ir zgr)IAeL@cyxdyOTCPj_aU7X#0tl)l`=;sKW4$g-hg*nkOCnMx4z0V!b84~`2!z@@! ztd%#8ogSMU?Hb7Box0%z1h+0cWO+7B5NZw%K$(sW9$eXrb1G2%E_kOVvCyA3Fr;D9 z;|eyedTe-O&4KO0EGSm)?sUPJHF=)doW`&D;UUG-|*aaD0~w##a_zW9r| MBAh5lFMzL?fOQqP!2kdN diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 index d50948dac19ffc4c9702d97b5f83d6d9afb6d8d4..a3d9b5239e74299a78c806d545211e72d85b55c0 100644 GIT binary patch literal 1429 zcmV;G1#0?2T4*^jL0KkKS*~Ol>i`L||A0hPKmbq&fAA`zNeVyb-wI#`Umq`TpH&n9 zR(qVHlXPLBrhpm%4FCYhXdSjrV}*)H1d?HBY~L5Y{(|z5(G*F zN(4#-PE`vF5F|qhAQnO-B2&}VnE^#A5D~FdA4_7` zB81S1xDh7kyJ`uh&d4QPFhj;cum*qzfCj)806OZ?ghWLml!6GO6ddq{C<{VN+r6#Z z$4l_8txgwPRyOVEp1lVZ=)H7fhp36)3SF%7k(aV;iffR?@hT-VsWJzM(5^_AWD&eL z+q-D`h9jIyxX3MDs>;s+B5AT61F(>2s4ffyqhT6kAsu*WdXTe3nPRaij|y`qCTW_> z1L~o;8)KVQPAiKgZLMpZoN|cCn(tSaq7^04wz%jVh6(j(fM34DU_ofM`A}sDFe}uw zgN29D*7u{L0ha2UVh~iTVnbEDoq2EEy^PlN9$Z$CpBwvk+2=65L$WROmMJ=9l+Kj6 z@H^XO-57Ks(|S%m-P21r1bJO%2+sQ1NyWTH%)~72@d;{}HqppI=uuu8fQ{Ogk*r=K zFx9UBrBWuD1vmWhf|T$=XK2(5~Et^ z_JmBJGe_$*R0^K2ee0j`gwM7MYS9ev{QKfa#+9y_6R%5SE zf?CW@_?2tKdYe!aS%-T~?_E!9YqNq4j}y*Cu%d8I$dOOjkINUNR6$cD^qXzqErr`f zr(QxvD3)@{Y-V!YaB}lk7uw5hCYm&xFiIv2$e#^gLSXhIt!jf2J&yj(+0>yZ-P$J> zOVNQr?2licdqLrrbKRYg5U4DA2_$@#Tki*O&>YM zcdfF}cw1$3t0NqBD2kgHvAB%GQU$Jjn;qV4OEAW#oGLt=*P*oYg8kP!#+=z`PlJQH zWnBg>4QkU9g_?7KLT%mXQ(nU&h^i`zD5@$VtW_07Sgy8=6bOPMB0aujiSa%*sF&{% zHt)361>KS@Oma{jh z$pMT^3YcZjt^Dz%&t{jRXV) zSEknyLq|Te<3a=ibpE^NzB}2c9>`I4e7d64YRhilQ!GQt!$8N}C@x^~o2e;--4GY0&ymQ^U>l~x%}Q0do;|a6 zY-SRR8fXm=RK=00008srshUJ^H97nqpuAXwys~ z69Qsr6rcbA01|4DYMDK$JwrjXngBFt2$d!Rn<&Yqm?H=VH7gWHxprIVK{yDIM5IKd zM5ILLfU#r}MkPQkLL@}5$I9VR6u|&TXsA4QP1BXQQ?8AyAxGB zDQe%V91JyM*&Om=D0w>GUBrl52IfCB&rKpX%X*B6qiswyI)Dk3Pw2euHU0cc6jcdu0|Y`1Q0 zju}?!@6z2lgr`r|K`ej;5@Yr8vu{n!^hXl4F*sm3mxMZJdjp{p=;`|`9QpgUw^1yd zW(?7zA*#0@PzK0CVGbk)R2h{4DL|8UArt7;_|tq*CT>tlLE*~6!Y$Hb>8&-_4o|vg zzZ(MWId^%Hd>4C&p7nBwK}AT|vx%&B)OtvC9Pg~#NDBP#lUGoa0>c)NX=U_nj9JkD z%Z!}42r4z}0Cbwc`D@u*2%VGpZCW)RK6`c8%(3)_#COqGllsFR% zhTDXQW4<&5x~@Bf>z$@i;5USF?FRe1L0Oj8+40ajsT#9g07Cqnz-h$H)!DiQwMpHx z-KqkQMQ&FHx~7QBk#z>+!s!ToGn{;;-U{mY9TJtqvzWK(=Sv9mDve4{M4zb9 zQ&S!6)!$=+{4^8sx+1@uHjMAsrDy9rP7yUNHFHSGC{zKFB*uy}6NYV$KIfdwlgJ*; zY+Gff)po(>6S zb9+F;8_#w&IuKne`NbeSljD7PaxfI*aL#M(LrUqaaY7n+X~~NAx@br5c-fPbu2OuX zvpfg$7`ve<0+Rq^ugKuAUdj#C>;~+@V=!dyEWGSoiw<i6a^Jqp$F;_0vquJ2sShmtF^>x(PZC4Z8dX7 z2?mX9Ml;D8G=f7w%xz6C8fF(Y%$u3&*Hs3D7YX$ZCKU2iB_?*yqQPK$Tkl}7E3Cq8 z7XVrnzPE!7?tpt*pN1COf_wt$7!^Z+qwws#5lUE!D7er>>^ZgIX*+1k)@dvNIijsf zI*KMamM=qHtlOG&qi@1Bv$w|8t?;qQazRH~qA(7mF~#-YT%V0tEFHTk4w&zPu64T4 zh>~u&?r2_fRtpCm{`Lz6gLVr8!;e~@Sg#o#ij17RBo*g!xr`P-dH3XhwO|*Dao6 z_SbN^K@*-!of7QmmH-AJX&6E>5)hG)k*HGi5jG1ziD0Nz;_gVN K3KAVAz80VeE|Spz diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 index 0ca163ba9cdb4cbca8e942104d0e37ee3c9bad84..1d97836d809ce11ddc19b7e2457b588098b13af2 100644 GIT binary patch literal 6067 zcmaKsRa6^{lf`MF6c526NPwWlp%iy_3GN<>Yw_YxCG z|J^-j-}YhV-21yT5A!lI#xP-CX(MJ`qgP!{>S(GW|AfjxrO>o6|G8u@(ZrGbxrt** zQ;0?(C^{e$9287yyx8vO=6)#aLZYY^o4_&9(|D}krp(nwN@cBgDe)8MEDQ>1chrkn zAJUV5_k!e7fjKLk{XL#KJ{lTkID6qX4|Z9V){7#vIW$c5gdCNsV;8Wvf;t)++Dm3i zs$_wjisP_YDl{s5GfWl_3|0gTq!m8EC( z`5}KXBZ&_fWSC``8JI=LLfMSbidbPU)5~!5|DzF(FGGuq{zn(#pdn!YW0U?9{rA+% z=;VLdFMEzwCO&YBj1EZ@wvrAB6Ft$trKFWc|1XLBKdPjajHQ*%K*5S5jKfY87wsUf zgvCIxPofntDo?Ixkg3t1Utk;}Y_pcpzsVWnTk1Ns|Jm-C=IX!XZwr%H0|DOOUB zk0`SyajoyawU)EAY;zRA?1F7;^ILFQcfgL3ZSjqbf!yRdUS|2`)*dF;aasGHRXZ^M z98c5nEJT(3bP}};RY2GM-awSVb#Tm1AzExhH-Ppifd<&@(bU2UTS>x_C}Mb>^Wsq^ zJlK-17AH>&LsLsfTWbM#^Cc|~J7FnKQ8ZCp3=+tLKYMg78@+Cp_j~1dt)b9DVjRMJ ztqe(2Q-&lfT)1?)ue44BVZ3&tt+G_G&(UP2AY?~%@PbOyUQaY5VS=1EqcoZ}-j6!vQmKX}eBB~|RI{$R zbb#Dl-)b{aLq0)@Qlz%fUA_U^2bWGrq4bTe)d($ZA{F}fz3Ro{yc6|0$DCBr*R?79 z_Ug`5%$)b-m9?YpCd}-Eg!N12W*E+4nG{*0)cHqk^VrCDY$+ZEby-EFOB|3}lQaaPA!qhrWu-aQyz*j!%N_~#l8Fr6} z(+<>7ZOA|R+N+wgE^tAdtvS9bcZGU>0C);%$Hxzxawdn{u}q9kHlHD{2IpI-?$$0R z3XgnzlRz|BRCX&CO=-t9v0gYpd?*!|T8x+E z%ssmwsApZ4=L3t^u??jVUEkH`W2(%qCgVu9L?bN~W|#Z<=Z9_DDt$PfLGo97)7vaB+OALkaO5_2Hg{A^)~i|Jv)vv)BDF6v&{=O=}~>{ar&7$M}<|P zq5@=N@%?7-n)WPvxavFe+=xTYqDjKgrCwaK`Iu!u9UEPs%P86H^7#|IAB;u6Jibfn-TK*5>I&LE^~{BkAa5YPz`d1n0} zvh(XfyHx%?+sXI04$Cy1WJY(Q9yc}_I9D}|u$a}eV6tGsH=^U^a<;dOUE!Bx=&2yt z*v3YXD-$T*FxmWFK+`fof|W$xf_>7Rz+^aSGaU>=yUrRNj(F2o@HJ9EP`;b_mYPlL z`Rs*nqJxp?7}Xh%oR@M?Ic3yK>sOvlp$=QeQ&PH+iCyJbTzbz=|0pwV-)ZL@Rq4Es zEH9TJqG+m!)#q$fGB_mxHuM9I+x>~#Gl6`1e(`vIv5l!o`!_gMu9PHVc>$whZ11y- z#7c@54KKLyQ95R0dn-YWQ)pVX9pKg@^NsgUY4Kra#Jvme*0F;ky*AqM$t%WsYAOFNEM@>%*@Agc1rwk6_ zuYZ?v%#SeTuEorLj^iuayGi)|jrbE@CcZ*v-GQYI9%_9YXUYvPDzM(|Oo>87Y3(d! zFqZbIC$Vmypry4LfZl!7uypIr=6|C$rAaOMmLT-lKPCWSL@i*d%zl1lZ*Om{O>llX zH3r1>9=fg1Eu`E^%)@d|TMm`JCuD(hrU>0grSKRCc|>B!VeizPl_DfOZM((d?&Z$Z zI{Z8l*9aY$a&J{F0}+iyj^>arQvoqDa~R;<{T4FRs9u7p^bjpz7q#u=^2Poicmb(v zE&+bAQewIhc$q%92SxQvaw=c+86YpGcm`Q8Vjyyt`Uupz(#V3(ymHn!46>jV&t>B! z;SK3$zh1LeyP*=fc0meX5~H1yFG>v$+XSLS+BT*{%){JV9*$?&aM{@KDdaM6Z!54! zx@AmF=j$X5(#j)^FM6|_Ev@^&Th#==oU$I)i=zV3J=n}$r(K4XA`A&|NnS~8Q*aSU z2kO14C+Xx5%M>UmeAf}dyMmg@xEYRK*68!n5=pH%jn4gUg{3o4=yQHYkj*{aR0f#1 z-Fs2;R*;GBO1-dRdCBOo8E>fOc|yggB#TfK^Ru%3L5?6vPqL^<4Nf>|cuGx8%g%^1 zN@W5{f(5=(MYELc=bF3G1R_W?9JQfEvLzAQ3QQEV5CKaIf@eLQDc_JMF=p^?Yi=T1 z{+>7ZX4-4|YP6UdLMfu{_Oo(9o7-O!_bc5DMYDE~N zPE%pHd1WKbPC$}d<$Jj2;q7wd=ilen`6*a#qwEegm*I)jkyN*sO;-h|P_Vla4-a>D zRfH@th=U~^GyCm0kH_yFKou{)CQ?L<@jK*5D40@Pu|JXei6XAVgC$(9){+RlL~k}i z))Cy6b}@~lIG(!c_Vzp93?iOy_Mwr9$SR-sQdu~c+p+9#z_+uo+#^%NizYPKLQx>e z@ZI*oqSv^fHo7CdqqCBcV)Q&lP5n2$IMu67x;WBF?aFgfU}VP7%(zID2{1jbYvGq4 z!Xdr~*xiIP?rm*ZYyxZFL!$<@7(!WPb}W282wvWd*vWT$002po-aX=SCPLrdF$2s@ z`ECgznQ#X%%MS^ED}Bq{!1u##;Dp+vm8V6Y?W0)tqClpb$6oOzBn2+YdsN-AV%ExU z$DOe{xicSb+y0!-b+WQ!Fh|7k^iYW+C-p9J#LwQ#C zOb6ToJJ*EbCe<^=;RxpZTcf^WWJ1O1AUu8Dsb1N5L?EwxRkK|&A=}; ztTqD-{T%?YWzDsRu7f%Ue&e1wf4E;){@KIJxV~Eu3Z7awz8%zzMHrEujURz%n^|U% zc&|xYFWCC&M#nFULN@)$iCAT4FX<-cHR#vRe*1Ru&b&-?zbw|mGsXCwh zN2E@WiSq>M$TA+emnp|_Qhm?b_GkTuUL9s1t$_mCc^7JQwZfQ;v@16erY$UUOJ^zm+&NQiFyu^X)_HU+c%pC@pG6OAdssL4c81HLfT~ z%#}wfI`m@Wk;%6vsMep2<~}!GwW>s3O5-s?c?<>W&;oQ znZnwe@P_CI*1mM*8x-~;Kl4e9&o1M^p;roVo?n_P++M?(Crm%Qa<=o834z^*!0*_1 z-0meShaKfu1O5JOQoV{a6_)$ahIXYPCSLnv{ssNUSLnHWi&T#Q!$E|IcXQ=oGJ^MH7DdccJ3xeq3I5K|Im#qghc!VeF?reucDu z;TmV_4z|&H*^z3QL?qb=feZosD6u>P!$o7pBUm=aba4GATla5S%F zbF=!6;d&i5ypN?&&IUyOsOu^gE+c^_mn#)rI_XylTa3o&$I#f}-k=jk;l8eOv@Y<3 z-i`xQ&s($JPBkJ#s$bYAkpJ_iK`Y`=eS&$NecFKSfkA+Y7r*C~3=VwyCaUCludeyQ z^bj&py*oQHUE)OPMSPyS^7Wb69Ir}1T%pYC3tga!UNMAwRE>YzA@iW5IB{F+FBB^1 zyg#tgLl-kl^W!PoV_zfc462JQQk=V*SRdKe)5@EG>M+Y6rcay ziYZ1}`Ay6ILn2ZT{m_e7_;Gy^JWDQ$G%8YV{eX}$o-&buI$+f-)r|0vUF$K{rz<*M zZh?bOZXKvOksVlTNIsguvW#z%xY)Hfks^ysQqHF&HBf{z(`{mHQO zzqUW@D%k4)ZX;Ry_p)%!faWn=E^|rXLFp6Ha7AvMTpSv%o)pr39{c)=Q$vd$0J=3UGOF59in^i zMJq$WUFMtgum4_s(@}-NhgGX5p?tlZeOt6npgU&n`Rk~*FXJhkvuaKB&DYEwyfBX>N8taa7ckiC;|BHXanOW~ZQY)1QpkeAY>jE{^ee#dnK<_LFGz6!cH!Jzfr3NVOX$ewa!O}U}s z&}6z7bt76YUuBi6gOYK!#BUr^8)r79Ux-6J);K=8UsXiAeqWSQ*V146k$h`WMT{O^Ky)YT_iB_6&741K zKFfJ=#Wsse(Us4GsFa{nK&11ism0PQx3ig&M}DRKfwPS~?!|j%-&F&dO$1t)8O6hWUmL8h;UYCr%KLQuq zlhGkRPnBh%3n(Ias5V4TX937WBCjGRfKQ?;^-YUpF6|p5k-X9f$tzN=MXh9#Zx~W) zXBED_z8@Td9WWeRF9-sf+z*!qZwF+>FZu3peI84H^$>7j%?bcxMw7&) zuw_dNGRtGGh&B8TpWiP7(vVMwkQ%n-8oa(45kZt((4mSu;}d} zZ;x*L;!Lj*#B!jah}!p{e%i0DFS#hgr)>dQHmoZby5yxx#Bc5i7;e%Tsrqk(RrDMK zgvnm}c-yEjnk-Fnn}U_;59*21DtTJewu{Z|;rzPy>I$A;!M}cZe7VGZmUxu-y@lE9 zb@MlbIWR(N@fzKPEMbH_mcYV17UIeY*fV-A4;g zelf38(Qbx##PHft6^Ys3EUbe42B6kXT=A&9Y^9uTo4l+JYiC>~Y$J}Hjt@h_*CBwl pD>nN^p1dF+Zo%r|{thTUN{R!75WT_>oBd-pPO>c{MYdlj@Ly6dejxw= literal 6028 zcmZ8hWmFS@x2Gf}Mo1$dA|c&1sY#8J2I=k`4T9i+QIl>NF&gP^r9`@09G#)%3^5Y{zYTtYY@IEStqn${D46t zlZb&mA0~PZsp9nW`~hFqLmGg6g>9PH_R2q18Mx#+X`47Df5ls#Fbzs=Y~XD6^Brz6 z^jHw_0O+8ztQ=!hkztOs{21)4Wq&a6Rm&Zb;f0tOeE@z-)tA!wxM3I=_$A>5bX1zN z96c{E*ugk#j`?&L4*v{H!u+>c0B|07QvEX%q7g499|qj6?tZRANin1t3H}a_1lJm4 z6gyyrA@T|J;hg`$sYQfX(6Il(VH{Yg`Ts*@|Hb}ceK-dp9Vnj=`)0z(LDfdiF0zP| zkQ`pbp(@YzZ{P?H`F{%j|EX{UD;a`Ikzb3_n^N~B6*1|we<^;%cMv60bU|$5^mKEH zdld5c;p}wW{J93+QO7bghoRr(1~ta&T=*w7JdNZ7*-@gTi;EQ7gzQp|cfxtWWr1V~ zW!BAt+oN{un)4E-y%_}>h3v@tyl8Ha;%LoCS^w(OPXrUQ(_DeJI;OXf>&ZKN1<*;+ z8RN&@JtL{#DD~?mzerQB&4w>duf$3WejM-?)c-Lu$(4xlX4~+ewQF;0Z6*|yEKX~E{|MNaf4NIM9N@uIdy zkSq1=XGy|BiR2a6-`NyW*g8vFy1%+~^ex;RVx}%y8Vf|n9ET88T=DE-PI8@cW1N*R zky>qCj*56~&v#EZ_d8=uTtQp!VDh`plx!H*ZX-|^?x6*3LxNYL?1es^ zPMgua0k+97rk0fqFNTS8Jj0lyWlK_HYfyV(h?$mcfkB6X6RX0ivIk?!Lry->#tzUO~CzM$k?_#&E@+zsz$`9@|W0 z+MvlexXyWPs|smMk>H86$aXxJ;I;JT(8mH?n@f@2*m_ zl&=oc4IUwHQS1uWC}&l`{fH#7DdVcFKOOaJA00jphnZ((wVu#LBZZd+WLnuH-+Kqv zn{k{%hatzi$)+}Q`hb3-samtI2GtSL7(=<(P$yp6K|B5XbU3m9*d4RU83!r`v6f1M z2&Z8&$`OzDI6l7MdZwQ`_o41*xitm&%CVAN-a&v9)VC4XdinJ9>AcD7tQTrsa}c#d z%MkpX3%hVUN5xeS}oTr0Q_FX(}bqEhC8zxonSX&u7 zGXM@E7)ULz#C+|hs2h=ir(XMGRHIO323_4+#7`f>_mT--jc_(+f^qePNUe!OM5Kdp ztlnsIk(-wUGc%HjX`TQX<*8G{9L+oQ1?4=o1w2^-bW-^4c~_`+OKbb=w(arg^!4!2 zf8i>BEb?c!vuq+CPZs)xJY8hJbVrEKVm2;KML3kc54EI>q@l8We*strN4w+<((ZSvE$F5DA` zS&wkQQ$g$#cVdY;r3wcCwIKI_;(qDpTa{LYTPrffkB_w;2+m(jeLjt^JNBmZTxL9B zPXoPOI|{IM^6A#~mXJ24M9h4VJ;COCm|fJMz<$t;*o`mei+H3Qly7VTdTe^sp| z#tC*y64&$09yA*_E#;oWB2Q+Z%yURHuA$u}!Q#sJSHnuh+R|*62+MGK&iMqKPY)^z zUB9ameU1Y00Aw02;3ujp=|e%so~FRIE^q9*Tt92737%84XO7-%`y;Eowf+r!kmg!@ zvuAIDW8e9U@@j-ok;!?2Pq>OcUr4@cTWr7K6tU;~SKLL_V^Wc=;Wq^tGE4nOpA|j_ zIM;r{fQW9{1Jk&em30APYn+_bBWSBfOC^ioNtQzoB=eEU;#%Q2sM?KhNi1rJX*0Gl zaAQuau7#Ll?l6nx?Dm7ka~vX4(W*&C8BQ{bAH>X!yho%wQ~+%<3@U)EuAtsqvTs%j zw@u27rp=aVBCVmBE@Zc|Ai7I32FRr8;gv9Rp^eFgJHx74#9<9hfGMhh=3tvWI^iPw zr)Aqac4pK5ub5wYD?Vd_lO+d|$)3q?d7KlrnH}X-W~nHM|Iv7|Un3fpnmT{JHr>nI zhqNXcejaOF)73@CH(4;%lvrTIlMuBn$C?J^#H%hP&y!Z#2h3!?!t?^fJqL$hS2x+` z=-O%0evg&ff-0|kP4MvLWq!;C`%7l(z)QnIfcX_L3%5weeNH(kNnc5Fz%}J`)Rf3i z_}sMJsDr^M4Q5m{gK}t~Xh=N{(&BJqTa)Wc#JY9ygMKo~4?2HlJBF@OJH%{GbS4&% z138}s_Ib-SV$K9-?;l6`3Jhd^q>AdKC7i8oG8S(=W!f%E{V97QX7cop1?t;$eyMj& zZo->l`NdFgp%?88^0azew`DnlunrJi4ed+ef1O@ZAy;o2%=V0R&^Q?gd@=p`3A?Bk z^Sv^~V9Opil|_o6k+F9Xjv~SDu5)s7lzwRo_xtjjT6M-ov z9r>~GgwctWNy8S=DlxFYm}LL=k!Hi}AHj7U5I3I!GFC0kP=dSxVDYo~CTA}GP0_P)--M^N$Kt1or7)}2X_3~kJscb z>EQhurGB>2ireF-r=wR%pK?miJrJtH&G_pI2Pi(H5e zbti6~%w|3Cx_5`KGb(n_oOyU?WL?K>;~8n_rcCYqTg!MRKNBPV@Blhm(DST46EY1` zy2gzc!28U?Iys_K`OKjkxhRc~>Mhtobf?kz%wEcZf&y!G4hy52j^D2~r=8~Fm_u(O z4%F56Zt)6=LXtEn@ur(aLoUkZKMz$qze`ch{D~D7_|h5eBjxyV-g;cJrStXM^6{uS z*ZW>dL2#jihR4Ht0B}Q8(sWcvzBVmA_GdL=rBv9prN<*!8U#PoYjg~toMHSRbe%Qy zLUQXE@2Q4_+bLD^bcmrAK!yZ|Uglx9)Zr$In}wI6Nhh@sA4IW*h}8a{Jhp39?9 z^l8dOh0T~PPHwscSsj?L{afBwD-y+8#KtctoLun9G=|BGk7LifVJr|;rgGD$ao_(%8;OL$#qEd0H*E=turQ~Yd1 zFj`7+lYKraOL^n{OLaTh413+&vbzQCZ%N@>T9I55L}odB6FCQuI4aJZoYzp^b%rH9l=RmeOA8<=rpo zW>vKmm2sUlHmmL<{(fAdnK?KIQp}eXj-};$ZF>=D+PGCYKJJJ*aK7A~y;<qAFlkF1@;(@hwru};lQl$Q#LJk|cKE}*ByMzZ+v=!E` z)(Yr^YfDl6V;I14%5@(p6}B)^bw-H3PZ zoq1b0ekD0-XP1}zTHiA+okH5Lx%Uof!{6Oy1}}A;-&_r3#4$Uy;Rlt$aeR8NsP|KT z(4koAA#A@6g+2zDN~N?$(zBcc`ear}9$(;W zF!WEtM2Dstrk?xk%@T`W-4t{18P)SGtZPW?0F%&leLLYdU%rJscabj{AF*~(6%s~# z{LP}(&UKW(8BZ|*QP0E@67gv9Rxv-y6?M$4@z?uk!fjm(^JM!!qP!|h0if?1ayb&V zu1!IQ8Q3_$_HBDF=Z}QR?!I92Z8Z{e$k<14dA0Ndc!_m;zEe}XA$vVfB798_vE=U3 zj2isP6nr&J+?GINaz6c9c*pU}BuF8;G_bTAgH{c-6|7O ze~@A+`X@@K*#NnTj&n?YY1rooJ)Y{%z=tsBa^9q*ckVHpLbmVbPEAH-r@!E7^U;0H zSm{VN6c}?a_R!yd8IvW(<6gSR*F_vxfBpKY?rGMh9Hx*-FA?X4%<`LvU>ojz;94Oq z`#_e}BEeTk&D@SI>@n^K6zh*#19b2G8A?N5Nzn5iNnpjj$8?H|)h4aHTK20po$-+L zEBS1v#(?2T;b5E9Z?BS&cZ=O1NK5v!82ro4ngL_4@`~De@fF9$`0Ppn%Z=x* z^fXW-Yj1H7wQk<%N{wbOO^7CrL zub%)rb1f#W0MQdApQEx)%%#eR2nd=$V7%j=|HdZUwDB%-X)fV)$ zJ{GBSG#-??wpbU7zeLyMs)`;dv)^vb4`w}c1;%8JR#jz{4HcV8d*PDb0XcVGYfcv) z5~UAc1%?nrZS6Eu#2m&2n)#arY>-8Vx+9ea6lYhuTZ3Da5gnZe7A$b}1A!_!6z`+5 zgmp8;P}P_`WI5%p6j~f#*sjRGggi45vssW%A~Q~Xt?o(ORTIZ;hr;NOA@r%sNddCo zLeth}aWP7KZ8UFLb^Cs=IvCw?-p9tpF?zzCV<*%R6C$)ci=ntufIx~7`yZsWxmtIV z1f0#F!oRuluUG9RS}>PyCK3s+B^#K*96Gk+g&P_3Y}94E{rY?~jPnnx)pvqQt$faP z-|i|1^sQL9cuS19_VrD?N}$>AY!Lr6&tILi8}~>q`r3`Lb!@Fqk&A=joXGk|;04m- z?n+kE%kXh~0yXAIfk1%C$AIW3{el=~LZ2oxT#V|5`RA0}1U<uOi;qk-q9Ya zMSDY5C+Af1NgrWKm7C!@H>Aq2clOZizU9xz!3%WU$Ty)kPvLS%o{Es|{OL5BIsb@o@PATSYa~|Vv1)BEg_t-kP4$W|P zAePUY&cWPbs@@q>9sTn@R(n%5X3!k06gCn=-+=1FEV=c>HCP6#83KC$%iC>OUr= zQ=UHywVAPhZADr&NdNa&_qUy%+w))8W)io59>LeRh_ZaVbb32e@2V> zHj{UAvSB54vq2*LjMpXQHagSj#yN{}=NVF@@+d{#o<*aF7AH2Id~9w)+Tm?rlg3=u z{lN#L6D*0J6u46|&*IWH=u^tz$ctM$;SL#onVTdG-dU% zEkHJlR(8*1FBiftZsLYBeK$eFjxT$dbu*`^g2(>jiw?TXKBK`bJwyK7VX!}tK!t6pb#sTW9VvjDNc%K7if26D6# zmRb)}>H;^TGr#C+djo_HK-6E=``!5eK0ZcjhJ)lIRdB-PNOjJ5H(?$KmXZ6~%Kri$ C%dGJL diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 index 276c35df490f2627ead3f646e2b82d5b09507036..2904141837d1629af46786505a30bca8f70222ab 100644 GIT binary patch literal 2409 zcmV-v36}OkT4*^jL0KkKS&T(UzyJx@e}F_(Kmbq%|L`iPPl`Y1-wI#~-vjRX>Zlnl zjZ%~pm2W-oRTb)uRhv8rnq)N75LG`^0iXZ?&;qBE69A%=3`T$e13(M_13&;|&;S5v z2&$j>03k}6fB*mh04kpKCYpH~nm_{+KmY&%5|V8usp+SwqbcOmDe7boNwqR$dSs~d zWugikvPk6T_bf&H3c*`NaSGxU{ncY2l0mdq(O9icyl5(~NT7zaP%P2CoxQeV*W2S^ zhWd7R+ca&TN#%AF!!OHUVyC*{74`L?9%!$)0TrpbcquVy>!`qra^gxi!K%AUXvsSZRkaV?-;JlNZf>QqhbU9qOll!&9DUr^Lf?INazhNo7vB^3)Oo-Et zLvu>F!d#kkIBRHy5_HL|V7=j^j)8&!t4rZ;Fr``ffXZO)YK)+FkSf6B$@Vmh2V55f z@9nA!y?te%X1{FMEPBzd&BKmPN*myE{JPXAj;1cfk#meo&%B>0InHQ?bDY`7+T@3w{ZSo{)Sz`RHzSB{Nn< zEkf{YdzZzGwZNnh4*D|(4q(0-UG@*9Wka^=+BYvF@eLq#v>-cR*uHSy%L{6~byQD$ zW)Nyqk27Jm1F|D=Tz7tp!j7ctm_EnFZDs5ziZ(;*1SwRAS36O6!|2g8iFsY6X+o#pidd$9G>`SzkG!?wRY&xS(mq=w^nu3~c}Rw9Oi zyYmZ!sX$CqH)Wa7N(cyG7CqP`1u(W+vwatcgYdz zhfXEu3R}VAHGyuz9buO$^i5crOTKjI=rcgU0IfJ%$CB`2HQkn&$+OFKf&e5Y5{aYn zM(uCC7nB=x`*_%iNShwoRqUYB^FtE1v0;FVt%;{c0Ae;Qx|g?!pC7BRbiLdzMx{-5 zrp$JIsDEn6;!`VWjc-$g zZ^4os5s+~!2CLS|sblCxAmS<1NlsI%(4|gY9#PhVeiRwN;@WUZ`&(k*qtP0M#$u~5 z>O(yL5}OBv!tj2SIUaaDK-i8o@lO;mC4v4pmv_LRa+ad2!ijCgL%T78(zBIt(}dgc z7QW5n#8+FVv!js%VUF+!bUYqn3$!|xSaKmt#91E)s+B3dR z@uC-fQNqnfF|VAQsRtK!Wr-X;%7x}VKJlnl5$ilo?4wNi+rp$V_9$UWy6#vm!htYg zCZ8H!(1H22Gj$LWxK%Z%8_}{<&JmzJ_aUTEtivM?GM-4Hoa1maC@BV`bW&-?v2_9} zI9p@xZXJud;qq6NHm@T1@@CE3GArpYCK!(>FxkVP;)MAEYFPtv2}l4mbuRbBJsqL3 zjFL$tl1U^agpx@ll1U^c%2G)rl1qK9SI!)al=SxQ062bye>;xL_i59oyJc?KZG^Oj zg{v)ioGL}A+_QlwECfha@@8UGTpV(>0z%N0q1pySuH0mdEKGTO5gd5hiVnc7_RDu< zCS}E{2WiW`8?7`9h*&}eLSI=7b$fO%nF~b!H_kMfsKqSpC&p&ZTZbRW^6HGy2&nt} zdh4onfN6yu9li=6hq_Bv9)B1!R8+QF4}~Y}Giqri;F-iKSgjPu(i;O!S4iyORWTk47nA4X$^bHk%b7GZ(n;S95b( zhR0xu(K)%w)^O2;HdF#lfyZ|{a8n-bx+i%ZIp0}Z!XZyB4}p5$GGyj~8lI2}FrW`* zD0P&B&FCH(q*C9ueL$R#OGQj+cA>1;;FJGJ9! zS31v1$q&4;1$uniW1g(_OEnl~31re}^RtUY!!&hH{Ca0=!4BIGAas(j+^yAx?*<@+ zv=oF$<5Ys7HG=Urv2T-_6PSkADMAiR%|cmx*E`o|cDH49ZY*4CK~IjGi~yQD-Eoxh z%Jpl%`>wj5&G}w^!(nccaJC@P1-i(&V^!jgp2^qNYYMK4k@XkD3G;)X^cx_P$P(9m zVzfKlHDxY@WDO0wwFLWD?bvHh-$B5ob6wi7Bk926bUZrciB}L>*ie+IizP*qGKQT1 zSB~J|ThF^+UtM+PCb@}lDeI4IxY#pIsowx9)v~fW+;|@V?|=YEL!(edOmt<=Fw=ue zjuz3WsGAXR>3xX&^kLdO2LTJC)S%A{$oAtruAwoT*~II bGE0ha<-}K*tb(x@f$%Qmig2MJ7>bdAiRGJB literal 2377 zcmV-P3AXk^T4*^jL0KkKSz)XpL;wlQe}F_(Kmbq%|L_2yP6|J#-wI#~zXN%8*4m0B zNTPz0Zf8I_G)%?7(J~B;396o>O#?sx3?iz3kJ@fB*(eVRK(J&F|G-(*w9y3)riVw*nQ|{d zSSwLm#cvh+Sz{oQL8z@oVzxH+3M#sh1UUkMcMq#G&g=PS>v7#S`rkM6o>T9Js%p!( zJ*uAzsw?dP{Gz`A1Xib_v0^Fb73d1kJdYlTyNySN?mV~e@9)R68ICyPjyT%ZwXJMJ zOhMAFSybBJQ{1ggxlpCu)+pDV_jg)d%U*oK{$Eep)6plLMRyo+X)mMsVBv7*s<;Don1Xr zkpeFeosUnbG>z%ts29+`+!I^wg_x5LIXe9V zr_WHJ;8LT^IRY(Tq=iC;MW8|RdfVQ4Tit|&A!-rT6FnM?by;O69%qMiXjVDs5D{Sqny)&`%r`o;aXCPm862tNHA+xHhz514hRPg$ zBdXUe8W{|xMZlMiC%HU)GQ_oqOL7f8* zF^i3l>Mkm4paHGBV)4*s1CzYZ2~ZG$`)MOBbvR0KJViRf1FRE@x*ly5hz-H}A#u=D z?D@hv4vkWD2xM4=U+>ie_>Ec~;gKV|4UfjsUNkSf5T4cet}!~@QDBDxetJ)I(*{S1 z5uL3*X5+N!d-prXfs~&4-$+4~1j&cJ<7)3Hnr6zz`{o|VDMfLSA=;=5Cw}$4Lzr-= za_XpWs&hI?^hxrVn0Zfh+x5ooLwa=TfocI5`BK&nt+Ul74;lB*cY7u1?jt^hSTr0~&W3+Fr%M+Mh1n<4Dh0V0aQ z_}?XEN~~ODS?dp36n+$_cZLpz`R5^|#7#*=nd4n1yNmByY69jrb4x~WXKmYrOmi4c z0ZlhFFf?2VVL;e9^4?I`x5>`v?m%K zn6@s58OYGfqCR2H3uMxSaSIzaC2K4m@>b!Om0vp7jKPZno>YeKS$;#j5W|OR1ETlH zW^D5;F0}9q73i*JJ3d)OJh)3&rn9WwIaFLAoYUx&bRa_jBa8!FS*%-$g)QUBg_;z+ z3|>pl3gz!{HxoDo>Cz<*zg2|$BhE+rkI5bd=%qKjr1aYz|+1_<@vM?>&E0)asGLYzY z%pa6aa|Tbvb{*V$o#-hP_axT}y&i=56ny|iDe={7PtA?n9a zt;4&sl3N%}D;J(GcybRJ*p^vz=_(Dg2WiKg8xx^mc-<@ROoM#5cbH}eN+@`<3&D~@ zt`>|VouLJA&D1mohfT3pOW0uDz{MP*!?ae8izftRoheIiET|ch%dnl8q-X}Vf+by| z5v?oZ)spJRoNDo7ywWri6Rn3p5db!{_kMl%;b_u2_YnsNhFd<3FAshB$7#T z2U67F0DAfg^vuf)_H5b1jj-cei*coC4gMRjr+%1ruuaDV1amL+R2S)vYYR%I4qw5y z!6gl=a*?w@=%BYqM0RMLR7el9Q2p;rP=~2A##p+plO!t(h)6MnG0rLIZ8BtcRLKV( z?|E9_PBG_Jy@-u&$Ta(2_c0Mv&lCK7`SRhLi0pxdEkI@*-il3gTT6 zvbJu*iB#*+d^@qlNC>>oi!oKzcc^_3H#$IE+mom2>xL-EPed@ar4ejm%*t(1iV``d z*$FHf4=DU4sLu43C=hr=4Ntn6d3drE7~(8v+`i5$a{LLJi7eJ?rT~ zeB3QF75eI<2Y5}lX?P16IG}Z>K!kRwo7qLS>QVS-T|Fe=Q`N2Rndz%RODZ;NI>ET6 zaL-4KRl^(UN@B*(=>$cU*2K+sDw-yWXznQ|k5&&>WVHt&#uZhN8?NIO zV=FS$!^^`xcDZ2a(xqAfc%3Y0blE=hu3!J>&zJvYr^d@A1<^i^JCT?!sin|N_%Ef9 zQ}&6mnvs>BS6Kr6Vc>laOldMm!@kUCn2t-{TLBdcDn48>ZsL1(%O{h8uqR5r?P7tw zoDLobM)p*3GbS1vBc?)ix#F`}!_ehwyPKM(z9Ybhy43}BW(h6wE7ToEr_-xk8{(CG zS{;vr_&b0AjCNNRdtb7rIfI`LY+!`!$qNMY39aU&TFE&_-q?4swYkGs)(@x>S)gE3_?)#HWJ8r~G!eV)Yk=@0zZX}{ zCwtEaI268`DA~+P8yCV;ghXCp;6L6V!i4S_@K(h-^}%1~wFQ1jjz}4+s6n>^NX8M6 vjF6HSh+U*q`VkeW_*SB|)~>r?Nr6v(zXHD^vI@js+5Z=EML1B9VXPrUWyEUR diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 index 69129bc2339ca65031194a10c16a86959a872927..9714e6db2d271fb15a0eaa58a2ba190ac97db18a 100644 GIT binary patch literal 1906 zcmV-&2aWhbT4*^jL0KkKS)O*b$p8nBe}F_(Kmbq%|L`iPPl`Y1-wI#|e+9ilArVj@ zx!CD0wIwhjm`$J*4^SH^SYW}jMUI?RBfdsE17dZlGfJMy*x^i zN014Cs{up>5Em%}6KH8x2&@FbNTkvM0=)tf?Gi$&eR*f-;~z7Xemzx{IZ9k7Erau!5%Y`Y@}Axbs%9@VU2Zp=sq3tB6RIVM}t`(h0;P_@(H2WL#?{X4u~ z9h6#LO+OO*DRYw(Os$CkNvd2L>X5-6%;}g>21PfxXp#NtS<_Y*0n z)M|I?^at!7)cf{$dEDtAs)zY8E5vxAT^bpe1@?OC?KRGjuT9U)c#z~yKDvT{V%D8* zuJ9Ska@omwyuT&G*+!?p7!G*RI`0R`XJ8$b-<^*!nZ^{@pQ}p2qw_Wx_H3&DRtSqr z-Y}B7wiOgHM`ZaNN_fz9mZ+v~S4w_gA%i@KDdxi@qqCAaP#ysFCr8v230P`3CuY%M z!JO!3mMeZbC=Z!azUp3F3}{^itqo6B+YT^#@yZ7pZszu=sy&Ym(3p`4ol9+?_TIEr zb~mBk>5|@0h{7H{qL~;wG&0;nZ08mkk%QHzi@in`7AJ>&w=;^~RkvqKpxxb{kfVId z9>PpOhPwC6A`9l}E194>)NXTcz2u?wYDG8dE$e)hAxMiWU1Fg_HXfylYZC<@jn5tu zY%QjYxzr774D}Q`2U&8p-$42^nC+w4Vdw>bVIG>qmq2`_@k+3}jNC}W%EpaOa+6S9 zlm+9rV_ZUL7>Xn~j=CbO+^VbB{EJ@0D#|_b* zLdzaD1wPfOl&WyeR9cCF{n2hy~C_=19YLrZx+mkQb9EFMsZkV zB+<(S+@TqxS>tK9A{QcnWU1bjZ(OokV5wdVDe28<;~iRQZbjG<-oO?Jle%+;8u4W8`r2*rTi@-|$D?)SD7FrFbFRql2j z(o7IRl-V!vu@!M^**gt&~ zqS)I@sVcTvX4|)J5<+-Vti2BX3>!_h+ikYnY;BFU$HEY8w%cyKG>|XTH86+oP9hht zm<3yR1K|o#r?Mw3^91FBnb?O+D|rltmFImHsxiZHFRrI|+RG4q=7btt7X~Gti(LoQ zZwxnbJTycp+&J%SImInvTs;Y#Tk)k9Xp&PI3)N-zNWPxpy|JBb!^x_IE;_q(8RNV0 z=}lirmo`98Hm$P8@b_bUJY&}qHcxP%lc^mo(X*F@Lc%G| z^pl#N2Tr7o6Rg)N!$6r^IEpTt=5WSVQuomrI1uRGA}|s(Bai_mY|Nz}uKEQ8aMt!u zlIH62>#AGa8982(5NevkZur}m*dx;2h%q^(jLS?5maAZrEuB_X_<#e^_iVZq<_eLX z979WSJD768-c6=mieYuL!cMF~K(w-YAQVAI9Cu?Kld?Ou&N1B^Hb{eJ?YFfsA<5(j zPINbAs3?3DD+2NuL%I$~Ad^t#PdPG-R3(nvCk4*%<{X+UCZil#JH#+E&_hvf2q&no z6jR(|d+tsxf1g}xUq@OuC~X(yd- znqjY!*6Dn!k=m0{ON_XsIutnrqPEijj0E5n;=2(T3YI=2{j_(6VWjdht z=5Xq9%JJ|PBj6d~YPuZSLSs(ngs4@w?|D6W=ga{$4VBL$Hq5De<{uH4eaYy@Adcze z2Gp94SEG%W?*V>Uk>Fa`d-LcrM=5YVcY$Jty37mzkO6cZA{#`ug6u$yiMHEpZH+e+ sl~Uo&X1e|A0hPKmbq%|L_2yP6|J#-wI#|Uj>l>pa21z z0FsedBA$#BBScM8F+c!l8faBh{{RHil28Lc001$N$Y?YgGy$Lip@uRU4F-cofHVL! zFvde6pwMX027m^J2$d$%ZB*V=ex|3jP3V(kk4QApwv@Rrh7kpIJD%>`jf$MWU=09m z0kj9w;DaJXpd|ocHx;}9LBs@JD5J9d`S9s2x9)mVzS7A`Q^x)Hsnpv9^?+?adWgVi zJVA*74In%K8w0@4f~NDx-Ip!g{59b@Y}{rmo%oab0jD&fHRZ7SHlWj|fy^uPus!-<1i2nzugh7U?grXJ zFD0rqqvZ!r^?cWO3Sx1OHZ$nW*RiavSU zFmC&7Y+pMx{NI&Ba-7>5_3eST0(c%Q-Mds(A4kV%PNYJ2$&F|}$F3D-4sdSilO9h|gg$;KrbZ7< z47Q=ScUBpZgYSv+FfBEj$?nZ{%;gt^Ti~G(S69JsFikTfs7u5MAEUFPJnW_}PM-^> zNqUfpwx#CF1y8khF(%kSYPvmR)={T@BexsPT?L7G`4qR_b?*pg%fme)I>0_dTn|}2 z!th?~Ig$>M@Eisa>99$72eiK_Ru<#85-{?y!&9EpatqRcy6x!Zp)?Fd5*$aJ5ms_l zRqO2-zJ^tlewPp)luxiDBP=Iq^z2=r#b;H{mmc9%dT5Zc<*&TRMtpW0y)NPeaHlkN z(K``r7R`RfZ`d6$dk~>>2aHwo!JGcz6ILi$S3UMmg?kn?4X8IrxJkV9gnUEpV*n%waP#LLD>fpoY~F^Dp2 z!)0P?>_x=Kek1aw>xNVffD7xsf>?a`J**`nz|l-@d(`VqIk1CaxFKAO9lj3-QgAD{ zy6J9qFNFs^7FyTNB_C3us#l4P$#?kOAq!jLoK_K5X$T9};4R7#nl>L>jdCH9C#O4*o?PcR-_%kaa83oYNBwrRN2>EGMN6CFV0YL}#x_Iq}W zE?Q3)Io2~G7CexHUck8uw~1``An7!?ov@NsQM9N8M-7$})$K+B6?P@;XZs9x+(BL=%&%7%qbI%r7lCPcnY~h?;#44;G6mH1{wXaja7E~PY zcU514uS)~KB<-1$qxs)}ppG27C+xYpyt?w2E)1Nri3l}Kfo}b4m#{~r%n)L8Oc|D# z7cNzTNVj~>&H1^`eT&HKVAG(&Rn1}=?CGrLw_wxWQ!^rycxged;2TgN6~8+G2E+le zZ@#xDWi4fhv`Xj{Y@D&0)F?T-z=iXmK8euOXfXGK@|-#2 zWu;wPh9a^<^fQI`CWM{GUgSCbbVeJD9i{07E{oz9CY6V+yv7=Z$sRsQOJKh)VJ~)G zJI;Zu)3iraAcn4>vzvT_kPV40`fXJ+Ro?A3NqJ>Pa*yD3+iidZFr>AfTCxbQ6Gxb> zGX^yt0>tjMqMguzk|}LoL=39o1I}k951UeRY=XpijoyWg1DaCn+FXk$;zzwV=(+uT z<>fx){H;fJUZm+tyB@QB3_Mb^i(Cd)jf&lLJFYrx0k!?1{xXw00Te(000qF@R$TdsL*84&}a<+0AZn^001-q0001z zNs2UTWXYN`n1PY%WWr?AVnqpAD>9bfl120k5C?<80PuK215b4%Aejjii4u8K*)_EI zr3%gM)1$bctWh&kIfUu}1O|myO0TA^d4NPh@vizRNIt{1#cY+GT#!Ajiy|8VBAI z6sx4rcVQeWo#_EO*>YOTX7)|6T&l4}oh*V?&YosxHLeuAz^Iv1%bPR-f)??v`bj1( z;!MwYpmt{KR;zB^HZd1L+YeV?1rhjvB3g1X*o{Xi5W)o>yxW|BrtFWT$##~NbuT){ zb-VAd>ops98eQc3`+FX8cU?b8*e_fP>oYWZu9|KL5FK+6E4AP+5V?HjxHWPqq@YAP z967#oK_E|2s+h95oy@TTa8w_{ooSfQNXG*043rdBVL?>fRuFCwZz5E4k}$NONn``K zwxVuR>9$eJlw4hzZ*JE+1qf@~y|z3Qr2}ZGd8d+Nv<7gFYgP=~Lxx5WgB(sA81Irg z5W~$G%dlkIEM45#vez;fa)fckQ&PTi#Jn(Fm4YVPjOC*;H)i&|wzT4Jpi3>z z6rm{4>*ct)cYIz%L`AEQzO}S|ihQ3tatfyaH}D$=M!iN@>BA()6l?XuyE5!-=JMGl z92-a25Fx|~h`pag+UpH^Ubo{-T(fnM*}`!agbHMpRD-xKkGZrK#F}Vk>ttw%?{TET zP3uHx*R3&}wz3m4Xpz<|4EW`+7Qxtr??*H`ZPaZ(Fb=b#i&Ct^w&-bA1{P7Cj{>qzRJbk-r%ng$Ah;&I=!Q6gQE8?jw%@7*wN+=)aD>3BfFkG!*e zIIAn&Z9M5pBX4O>MAKSK_Y3SPI?@r~Fj9z79P8ymI2HHKH|B_G!EivbOMfp}nln8c zwRugybs~H01Kc6?2e1%-ukZZ<1qz`-Zi3=+551YmhNTlTclqHz;50B%20moy&_586rCley`u3l1Ugy*X zdcL)^-a2BzSE3FP^5b5av&wsniaB|KQ8K5OHfRF`E#qDEl1yF1nV#`L?9JA#R^7U6 zVlIQW9be#*&j)g?JX+mUUiP^ci&;wYBugPyUF#p zvF9gs)AXH!^}w#PGe@fFrr?1A*D(USUIOt8m(FX0S0b891Vf?2o98qV1oaxJiz}Jj z%Mcd@LHsG!nT+&|a4yivK}BX16-~uq2H^(sB}X|U3rYl*Ks$?SCgnbxWgNLh#o3nj z?Q^hDhP}JnW5G&LHj0;;c_uqRX9(uCV9m5RWMK#~#Nok?`6HnWJkgxH22HZX-OYwXbymTs^c zI8GwaflQLBkaq>q_cnsqlT8fV*%~4{+-WdVdeIs+>r7`Ytc1*(Bz21eJ~?a!uy!Fk z(ajE{nYm{^kwaktl(^F9;Yh_m*#`6=i#^r=2N8ZS5)ORLfX@Sa)Mhu?hY| z+sAoDY5E_vS%P3N#i;Z{_PVMrWgZxwOUA=*`gOc7%8vj&vCWuQBZ^GE$#^ r76v1-(^?IsM3k*Y@t~Oj9WgPvnJ}j?#2W^ diff --git a/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 b/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 deleted file mode 100644 index 4c2832c549bba24f87cccf009cfef1581049e18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22159 zcmV(!K;^$eT4*^jL0KkKS+WW4TmX8Re}F`EL_kmm|L`E74hlc7-zs2kzB@P#43l6o zP%B2f0000001qF1>6rO4G-zq2iz>?{Ygw_1TFke19hkIg*LJSM6wnP}GHsQoJ5cFq zvA1I!t%ll7X|cCi$Y;suUVD0BFzv001QQRHi~|H1dI_N2ondPyo<)pp{Pn04hl-=+UIWATR;p*|*0n zRo!{rySLNtx+{3=HM#3@*5$3soo;&E^||p@+jDKLT&lHYR<_%fR;|wO>bmyY*4npi zw%cmoUahNYpF^*I`H!>V>0j#7tLcA>;~&|WbE)miS9{o2-jUrdQqtGg1EgB#il=upb=4-nZYh&nn9qx(oRP<7 zv+FHHkq$b(becs%1eaRHCu+rn$#3Rh^3OQp=Zb zS2uI3oe|^4B*d3aNrm=!u*DoFPUY-bthDyElrJ(0mtDEZ&@-`p*{%!3Ixdc5Jf2r@ z=^9!NneiOyTBlg{=1WfI=cFet#>QGUpGhdCj&BfLMvUy1iu04Jy}r55w7z1^==zZQ zv`fHA!-AXHTE0gjkY=A$S-N~%bKR#=icP4SRiRnl+@%O#A#nL6V z=8iYi(e^8}x4uL0TuxKN-%g`S-*zXGs|9Dt1o~?@f=$WyM;);_$HN?xT*j-iP_vHb z4V!n1M|p#Aq-NbVxaBu$_jvm#j)ugJq}*JVvZE!LtrK-O%gqh6pY`dY`>OWswb zzTM=fYWz#@cDtsVsawR0K^ra&%7<4->+G+DQ+cRfJi{49VRulA&19kV_`2NGD4wpp z$>FP7M^bzkO;q_hf}r&wiQ{g}RW?*|O$xFgD>pVvEwqofPtkYO;naI~;yG*Ty0)Xb zQ(|M(ik!mKtzPso3$GEY>hWiBa7^JhDc3szc&i-RM;i6K-yn6Lr+JfhXwzpMN25=h z-t6;Ns(2%9Qmx%=>>aB%mTrlv3F{Kx2|COy;d-3jsHEx*C6{pHd&s-nX?u{x3TvG1 z?v}1MT)oq4H>BfiD`Z*Cjz*nUg!USw+~+CDb=I@SD5Z%is(ql}V>DS$9q83+=ci|4 z^%6#}C1uKa)`da_pry{Y9<+H{Znklm&YrmBM8?{zXu`MQ6O=?Q>I;Rt)W-&tmz=R{HO6-U=)B>6eso z&Gov{hjYH35QoN#yz0oZ8N;=uH6{LYM z6uQH;Nb((s3u5JB00am!)!2<#)v!rwt#BA{*rW^GBd!nU={wU~~S z>@~r(#KbWGHZg6FVnC1pC7R`wc9`2f;)jIrJThx;n`wX!Hq%B}UP9E@O}3WSJrE!R zF^JP9^APVwZx1_02~Hku1#&! zn>o`Rt+)Vy9JqGTTS3dI4jQ(QAPzRd1yukz2Fm5sYo(QS3pZi~g{}hYEyMr-#S6D> zt=8)00^XPdTajxVX3zoCA#K+L)@iCXSau;Udr$!lc_2ZS>uS3juWf9ga_Hg!LhdjI z+FNkYnyu|^2G&eP%7x0R#EW)?HUd}cUp#-(7+mArp9ms+6+lZ+zQGeE-@(`3?ZtTHaHo2U3Oi1 z%0Lx}^8*#y(AivVw0WDD^=AFN5@=bg;kH(~VS^lU-PR3*th5`csT>3f;oATYMB1&Z z6}5XqXLHS)U4qQE=paBg(p|1WWXf5LId$DBHncR!rLCBN2HIN-Ce@l{0yaI^1)0{c zk+!yqUeQYB#|LedyFy#qv@if222gPl4gfmfsSUBML7Ph}d#M08QefEAXaPc!HWMA! zX=NxlfE*c`^PWdYOauTl*uyR$*xu2q;s5{uaN06z6wHLW+pPisZqmBfE4gml5CPX) zHF#_tfYjSyNo#Dv*+2=Kp{=_@3P6ECWdo_B$X;c@07F}rIcR|bk(sKIuH7u4`L?%~ z+taeP)x3WlXx7wf*sWSBv8uS$wX&+UZZfJW+ZAfXR$F_#ZDn|0Z;fu>XK#OhyXf}) zU4355rKTaTa_u+A-+k~OXanQ#zWFVTe&0op_z};O`V(xypWUmM7>QycpT7~`H_zEx zt0||^zHM2rjC#S_t?Qd?JKy=qD30NKqAi^1@iQRUvGk`C5jN7a`oU(i!f}l}TW}rL z9h#;pgoh}?a+)HXv?nDwse())3MA|XkG5b)9-vkP^f!*AR$Ep{c=<9yDr#uV9&e&J zK;m87oI~+&Y>Rg~F&)6~-*NOS2Zf>24<2$vz0E+B8)Rt{)?v65OjJMMf3n;ly?#D; zA_|Oy^9_UI{!y^WaTq$h+eQ-9bbgl}62$bo0~Z*G%4W3f(Zj;*NasVO+CV|*ec&sR z$27*-ht0za44%2J9Que-Y$}7V2@TU4yIL+0S8hd_a?n3!8X1Ntja%~9?%I9hHK>Wb z0*vR2#&|Imu3BqfQjYdiLvtH3@2*wErxxbQ#qS*ZI15a!tCkUkB%W_WnuFhNq0rtGyc@&OVsv4~Ii$9^0uE6C)q;tj#_IlS z;8_*zrVDEXw&;!&8S_I?!Q%_>n&`1+J*c3(Mh_xhuy(?jn-Sa`8tC5_ae}#71Y0n8 z92K|IHNJ)(44xUd&COV*G=N?9^gJ9$x~)fs#N@E*`>G6h!RTZ_#Hb1(iI=_$3%p%G zf2)xcZX}Kf7e(lS7(;3>MlLjIVhga6$?|KkAqTkhVXNK^<&MW2rx+El7dMk3fwg(qqj0-n$bcjCQUEXv8IsFfx41>IC|b* z3!L`Iyug<=$}=g~4m^XE6c|u~*e8~D4em$K^?oVPRza%g6wl{?tM^!7Leq>E9e7;j zgnQ<>W;fvAr2BfSJ+Qu%2()63*SXMHp`}_)>|jz%trzi)p*3_udM@pUn8H~yczzZT zVf$Am1h&0U%Mv5D65~pIVLHtU8{c_?98F3$#8n-E34Jb@Es>eY`TJ^~K$nwZ1%#(@ zKD@5(FS(l=C72q)KX`cZ)nM)$hv}{LItz&VP=}u1AGaZ^)23kqZ3?mu{DJIB84-Pb z*nZbrDT7;sCt0!C;b%nW7L~|E(Ie@mZp@mwrvr0Jpb zFyL|=klWL&&v>I!cr5j1!3?e8P%BjxMITnTP?CyGsmLPX_pXo=PH?J>q@@}?Z;MA% z+#6KyGK|krDpIQq%7r|LpTq;;`}q6m|H*ZVeo6wZe}5fjUw_|$KaPJK`~Bo&lyuG@ zNS>JQKb4(p#W8>4-}K2F8tA{`s-e;Pgtj-dJevp}%^FU#!3BEXd_KTK`#mr5jXYWt zY(obNst#OpD9N*V680+y`|-1jf!v!-AEizG!#K{r9peY!p>8ULIyQpnX_9g*ZinTU zGUy|<{0%mGOB=KZx(f)pa-rYUyAfY%l2qy;+4r18ME(7rp2&E1LEnbqmKqJQz7cn~@40@psnS_)o|oXG_1|#Hhv(BD&D& z1-({ZY##`^53C_fsB{>zT^v3eutoi~XbodwtF^NC$XcYc2)fLMb|OcF**tkc!c*!5 zzL9*6l|D`QIzT*LT~LIvqB5(^v6;GU7(-JKCJ4N-58`zg!MZey!hOyn!&7=_hD!7i&G7mij>u6c@;MB$Lv~e)P zyYwBd+COK zm@k~H^JfewX8zv2oCFd6d<7IXgJvn`qZSzBbB_8!GKaan$lGh0g=e|G7|#oSP>@DB zKI5Seb>8{vj6&@iK6H!~NnBeyQ3w9ccR8T*e^$d8VC~N0dh^=#kPwTzwk7-*8 zmqa;_dm_0VdTMcbL1SFiuDnMBW45k4P4bR5!hHW{2eJ!p<6`jc+(3A)jkj&nXJM6J zy@?D=s4dg(2~2J8i@@f5lC4<9*mk{i=;B&7rq0$$n`NqYaAir zF~Nx{&!)iQrHEr9@X?cTiXKVEiTa|IuA60f+mD#EYdcxg*7)1cObOdcc2GrT-wC;D zprblG&_=4yO{m`fBO@v^?$VnX(CfU=oE_JLj=v*^9h;5NWA4FR$kAAQieV^?a7{~; zB_TDxn9$XX!&CI7lO%?rxw#~D+wbiKHpO9;CJ#V|buter0>$QtA>GVnT8@k19@rCO zVKc3LV@GJ$q|mlGYg0n}M%o#Jr6I?wIJw zM8u{|9C@;WQrCnSt;z22IvT0WhguOpxKV79n;Z>X9QBQ=y06HO7?dfG==T=ELIzW$ zGZz(J4LeJtWyil9@#A2npG;faFE&Ps*2z~4Gem1GSCTDPyT#Xvde$Q{&lN8&@fPAx z@lOOfc%+(@iEqD<1K|7i%py9*3~BqCZ+gFf;P$_@h7unbe?FZ&e*^V@oe`L)n+7U zA7c8ICxyEB_G3uF;Tq=}?1`VkwV}_WWzJyRZ{}#{^G5j3MjzXU&uuwD+MrFj@$DnY3fcCn^@NtEMfUd_)srN=}0pg`L9Q-wPN6B*4NUu@il|Q zCAMZcv7oY~vi+vxnL?jCLa?fdZ=&WO1OssR4G@%NCDo1{&X3(BXzYR9)c4b^>taT_ zb=RZ`h=aTv8S9Nlb80tP0VH%&qx3xF4N^)2M;D!}i&_LVt;ZMI#kmV_JiVsg1W9h~ zs3iuLnZ`O}aYM!h2X3_T2px~LJMtP&M2qUUpMu1*IQ{t_F7N!BkJjSmOUOw02% zeY;Yty`pu3*zUP9KamCF=-#*cbU7Xl#ZaM0Mx`_}R2W8tQ^tk!RzmF!J2Pqt@MwaU zM*l^Jy+6}1J0~E!`9LpfKTxa^D_fcy4lF>Ow?aVOLBos|6`0O0sCYIE5Nx;R#rp_h z*C>daGkoht>6T%P3raKX%o~9sfqI7rbtU^Ye3N4|L-j6;8#$L0heIr2gll2DM@6(r zwQhZ$t@96sdqCqXwS3yy4>(rvmLA(@NnZ6)6|(o2Pj}zuy7P9DzMir0mQ4Q?Y;W=F z^55keOZN!};ouUvSfh~o>5KUehN)z*7Zk=jG^+K?ZT2wBOM8e}8uROc(~>Uqb2xuY zh(Y5=pK|+S-3TeV4I-h9_)O9+(tK7?zam4rHvgB9WFkxXi&0O)~ zOclSid^pR&hK&*T3Or-oZ4G~##!2Ckt%b=s7`hqJO+(YHZfm^Vksl>&$mV#vAeqNQ4M3kw zr;LMmw!l}`H*fOZYa=W>kX423KJH(m+1(}2A|zvqc(`8ct!itg4q+{8R57bk8TSEj zDotj`hgd5=L0D~HXh=&@m6GrxTyyTgBB0m33JcL;vZ*gts5FOfwSK`(3R>rJCQBMR zI`GdAQPKHiil^2>G^eS1uc?8=cqQ?-cDos{PF9U!iu^Vt5kc`6fL->L{)=En%i474 za@h;>=oilxp!x;aH-3=t(S5YrdF*=OGbq+?qieQ_MEQjvjGGDCAbdnbK6aZ;Awr@V zqap~MGby%B8om+f$+dEIuIX>i!B(vq+02CZd~t?D5L{k?jOCUHr=f^^W_&*OLq{hT z(vJ;J&jh^DdWTepgsCDG-5qLa5?)W-0q}iaw>+N0poV5&%NUpKXN>;~W6`+p3&o$l zaeYAs9^wWdcgUh**%*(}uKH@}VZN04>?LzW&qnaPxw6lL0uUsT#SBJ_sF>gK}|4ywl)=0Y5grqAfwcE&Ew(-MGy? zj8oKAzO?+DOqbLqI^6POmUUEtD$rL-w!#H)gn5Opv&rW$;M*xgQet;lR0&B^pb@2v z@Qgs!wm^aIJP%?VX~lF{UA*zdZUqLXs&a}ZTa0eq zD16QlD%DjNw1GGBcy~g4P2^4e0&@$HFSd)Vim>P(^YDcZ0wW*1FC*FxUSE9fJS!&l z*I#H7wgQBf{8%^_lC;3hHa`RsQZy;BYa_?c3-`P%<26rgFS;Xq(&R=;u^6;4pJ?fF zAt|N@V{~hVV`CiGxHTIZGHU!fbn6LFW}7OaY16`Fa{n|pL>9{?Wu4^JBWNL92}yI^@>;pGJwHI=5BqXrI?uUb1~&W zQ@=gN(+LWf9&S!l2SU)FbaV*lo6usu2_2ntn)j@1N>Pawdq!?3NwrPtEyk88u;|}H zWx6;syVSPA*79#VleVW)EehWr!g=6k9OD#21?!Gyd<|YUtK!%(dtK|x3|<{uj`l{j zcXC~v*7`Z#ll^GDXVeXEk~xOO7pj^Y^)ph$0jE;+h=4O&t2G zq7{Heufti7%8~YMh+okT5TEB*z%#O42%=O=UWyEQ!ySObwLB8{v5HVZ30QH@(QEpM zNi=J(GOU@?eD>*y-WaNfgvjSJ?uC)N(}L!-3pzVNTvqW>F;s7gIUDs^SVyBRSnyrY z$K>#0?A&uWXJrU)CFrq}rm;lBvkHAb1UPz;W5c(rg+lJ?@E;I!>~P$XB^t2>;7Qxj27prcw46x3_SJQh z(EHtZ{<7vUV&%zVayL4ALq8l@bG?3?GDi0or$PKUBSIfZ+LnUnj%hpbgDeV$!vrpj zL_F&{(SfrSJB83=y3Us^C|GlI`%0u10W4P)d%aL|uRTt=$F;>)VYYNx)jLaeEM|?c zaJhW!FAPgw^;N2|xjg0XbHa`HCJABF<>TlZF>~U2cO}*ySXNh2MS&sZWtjy-^>y+u zb=+AJ-o)T*ax48f;dvMLYs7|2z{-Uqyx{lfLL5PZQQq=GW24%mK0Ab&*5_jM!8@Ur zdtlGNn;X?Ly2EWoyUgg#sO?rzEI$gVIo^He(*{W^e`piPnUoMJT!pd^4_Lkx3~7z3 zr4Mc1wyfBLMv$Es`#)IE49Ak&%)=mw5;C2|oKfhT?tvl&7n)X=ZMc_Sq>bM|O zH%Z-{1qd1nc;sj-TOt~L?sh>`5KdnNi{qnsc9&UBUVwEPRv0bKUNJ#mhP@?XuLrhK zUC&C1@;z&WjI43VVy6%cQ#W1|)DfW9RME%2L=%C0B5{Z7`O2&$wosDnj`);I4c-Z` zV!48_YY7euV2R$;Znk>+AM4Ov{;a|KnDh;tcwDyIPE!i&j^cANLrxvj8z>XQW|Q)# za9P|PW$Rm(a`iC```vYo(=;m@%2O;zab{F5Y(|I}Iqz&D;Hb?9uy28kFG7uEg~DiA z$z1}u*$(bO{k=YF#jGs~F|xpX4*I3x#NTke83BO>4iGu(1JJ{Gsf3Iy#Qz@E-lM>~KaGRj9rbTvQ9Ye^6{1K$?#*CLq=hf&?v|GMo(7o(Ky@)ZEo74{bou+?4-ObTyZ$N}|=Wha&6=B+Q z6}}TUu^)C7u}afx46Qlp(A`F_9*2A;xEya{h`|uh&x+0b0{1n6u-kU9-4EYV#6B%U z4g^C^hz`4MY)He}v#zu166w)}z}PYa4)^El$a>^@$D(^q!w0twsstJZg|pdoZ#!Mx zecKPhtp&nJ5S7cn(Tu^dlFkh%k(iXl-q_ViLKjJP@c!R5%xMZFx$K_NycWsroIGI0 zOufmf+Q@I?`bcAC=FcD(byKQ+rnsayIx0nuESTw@&4vsZ9j?B!EnItiU$?z>+>uAG z)cneNfQ9$7Utr4|Abrq`5v_|EGG4lWyfXwJt6UP@KAxS?fNAa(?@Qa5W(^AB*lu&X zat{n=LPpqJ+;ZDUtk{iU(aB?Drvr&l> zfee$7K>|rM2Y|KL9=&dyGF6UN z`&|;FMzg>{Y&8^u(HN_d$g|0ovWs1#II75+YsGE`SqKc0D(u8a1WA`? zRa5CAT9`MM53wO+y_+a0C{|Bk`ay$&=;;xg4y%bSthw9}cVa9GyUADiY)f;PEGTv& zvRxEQarZ*M3n;yQRC5D9ZIRG?qV}|MC$jcBzh9~2!k8nT zk*ctL?M_^bOe~kqT!uo^bRNk-3Hi@$n?e^4JPpnxim-es6|2~Ps=5$RY$>vi z*Q3!*(dvjE$)~1%Z=F`=w-kSGyUbTq2&F@)utf(^* zW4kWLFSfn16Sie~)B;HyI&R|&rb5`?Qu?|c28!cFu@_vaUWp8#hX#zPLLLZW;9hja zT3U!tle;8KrwLNp=a1@dq9rxR4}5d2u^rzrhQb9?kCA)8%3T^uxuWh;J1>nE626lfjG#tP?(0@t02M-xUP?M@<>;{1pw9Lw}h6T3`UOo_B2 z#|V71StA$kQmJLA;yoe;bVx{%3E<7D5EMaKVY@IfZ8BB2fFKto5s|DRvD zcr4FCg@l$MAvB&G2uqI=+0mEHn4@tetul~`)l}w~bH0EuSdUs|MsGyE(WIj9Av!i! zg}Pn513vejv_ZNT-zSZsCak#I26^7~)L$4TtYDn=ZER%&8;TZO9bU_e6cf9NO|^{O zu%yjLH_%aKuGZKS2+qJX1{&L;AaaW5-q^avSAcy)sk{a&Lnn)?1tz_ zw-Vg!8M)@{Cm^}I!Or}dIAZ485+J7szD0w!cnfqk(ZmuuG3JFIcfnEX*LzcR3t-OZXm>E}_9M%c zxbN0|9p;mjj)fJaXAPzyP#rwIg88|*8sF8UtZ|_;ULn7r9uU5BOEd@|t|wU@`2GxI zt+K)+>@;Yrr^?xs=4>?IFkE^|vpb+(p|lcWa69DJq8JUDaBOqU+Zy^kI?Cobh3{f{ zzaB`JGGzIv+t^%?qr#12n@utXTs&$79(Ff9e%5s$u!oc9ejwLhMjR+6pDl9(oblqp zlrCzj9M1|D0;7{hjv3E5UmrHe-#*4=AxyalS!l zyWaA*xh6%4n!Qmigvdk*Su?Qlcw}N3=3PrFWfaHOM425J$;X{*$ZhycXn(_PgiM$t zC~Sio7mZ9q$?QXAjCTsvJ?3C?aEJQ8&NrYXoX2Y<~#2=xj!QYlf~$j z=h2gU6+SvC(f-}ezff8w;BUI(FK5~suXa2_teTr4>!HcV38K$qNj1Vp(uy8hlnS%I z)nWOiFL)rM7SkEftgb>k#`>2nF1RgkB#Rch`{!6%?T^byoCpJ9z$qYU(UX?xaB%4h zr0`#Qq2c!;#9HqD+8}S3XA_{>M|rook;V3qP>#0P;_S=nfdnup!8*$fm z)x{Ua4iYY9&BMvsVu%#6l`!b8&-04{B$(0BNjP3k^m60rP4aCU*^y0%D2wAJY~_Y6 zMvjlh`z9wMUCwHn`5F2iCP(Cox?Gv_xQ&u|QhP?eqdP*iTBR6-^N>LN3bU+^O@xPD zYAch(clh5Ez583<{;VE}-5B;6iIMvkgHUtA90z>r&WalgZG<;7_kU$Udc>~QudxUC z8tbpI;p<4PP&boQ1TEe(b2=bkiM8X*nS-r(^{X7{!JME?K>mapuTnD3v@ON@BzbF4 zmMrCGfvn0(4{J9oeCND0^70sdFn=b$RsLF@ehDXqW);TuDbHmbn{XX`bNf#4VAol& zn*2XDK+oS`zUj#(1SH5jaoZaC8qd{sqE5k;Zl1TU)H==0YPvNe$Bh<6B06EakkHi4 zLV}jD+SunrSh6!}E&IQ5b{)f?Mr|C22E+vs_WHq)hF+4-N$U3Gi8I%Xu-=Y zyWgG>5vB`D!W?ree^HBb;R7(v~(XWmt;$2(UHqCZ4EBy)E7I~9K9KS zP}7`4M`=aZc@v&8a*)(lcswiVFHW@7Z2V&;ej~POh@J!>MwtOr@_El^BeQxq7DJAs zux>r;Bw&TG>iL4jqTne|t1cS!L%tr1jSLGCB)ePaE=J=6gBp$w=*2*}xVYDA!oFN! zVhP6s=%;Fl;$uugB}`NhVp2DHbt)QSj~2BWCN!*5Z+BOS`{Qu+n{8vVEvqxSO%#j1 z0>d)IO_ia$95c*zQwCBU>RzQo#63u6N>rp;WsM(8l|1K2sWRzYN8vv}=+}Gk)<^8$ z;UiuYK}t*Rw`Ffy8IjUFacrTfb%CQ3(g;;ztz zJsFKjNgHC~mugouKwZ#g>2Dp`IhW|CJabmwy~}j`^*Jv5 zAW|FLWU}baba0cDVGHGB?{luFb(7OPvrw|SmhPHGw>j-3wM7{c7q>7sy;GFo4Oy3& z7`eeth&M0GU%2JWTzr`!oSfl??GAW}Z+N{vD0jirs)T1*9Di>*7XbtoG|)*7+3RpE zq{u~i_9FHn1x)K#tqjdbyWaB9npn8WCe(DC#KVo`wuPYiDtrahLW5v4evhga_e%Ji`v7e!}E8p zIP2B5<#iu9=IynyOP4Ko^oicoY{CRd6IeTz;Jw5h()VRSf(&RmJJ8vR?v90h*S^?Txl1c-^9ndL{8Ni&4{6MU9t|U9@N46Ffj=_U4gKS-aBOS0_^mf6N)7X{U zn^`Pun~Fv+V#7`P z7-9q<*s837(aD)G6r1M@+Zzi8EkZ(sNvH%>U~)y~5EVEi~)avWGO zz;~_V9Hh@10}8r<-#ozZjcwdH`0L9On5QFGuIgQ5$CDNmS?D;>&#R-b`XTK{ZAFg_ z-uY!OW+6Q!qtb!XruI4u3Uor=vHja4KQVTq#9BG6@1`_$^sBs&PqH1EVYXAf6m*Fm z5rnyHCH)>OMUKA>J$vlFD{y^pK3IwR62VSAV~`4 zXeos~S(zK0UolEY5H#z1*8PhIG0>r*jxBfLSg^y>(Y=CQBy`Q69!CC1;`>?EhDhqI z7J?S$)lW;)OL)+=mUiPosVeo*i3yM9DA$esPsfc2y31{?Zi#}Kt}<>kkP6X>G)FV0 zX?16bCYN&hG1U-;9;4(SuVjTMP^iRJGtik3j7tVI6+)Nv-nFsi?L`4O&ClnedC`v^ z3i(ODXW|$gl%`nCUA~hk zj82xKHL2%(*UXPvwF|KT=NAV%!%^X>#|F+{Y9T`pdhR7+gzLQO$UZMH9SpI}gR!rw zQ^T4H92NC%6;pH;^+Lo9DfrF^M}Y_y)Ad6kEJ*{1Qio{i28{*DC#S7-0-r$0n!$rg zByi2LU>tX-(4AZV`E(yHqV2heu6A< zD-~;if*x_M$Y@OlPprse@~p>PPGyd7fUSkryjVTfWD-@th`hCp?2(6_r+Hz8LysG` z)a(;&adnaqyPZL3J+ist&W=24J-}3>*Ws~FsJ0_8gSDSSwfCLu>eU!J+*3R>PULqP z?L}Q7eS4Pr2r_JAnH2DswXr*ahc~M9C6~1_*qC?WIN>E^ORG@}d~F(?^kg!NF}J2#Z2H?8eO;+~O84eP^i9=w0hrI=;@{)ZDh1#YNHA zW+IH!xUNYGpGog-Q}r-y&r5b*ZIu%ZM}&+QzK~%xzq^_{)>MMAXL}Xp2s)iC;J;E- z==53|*_GS~*7_CK6S}$L_!u~_<);uwQ`f~$CDPWjyI?`$vwOq7wRhqTuvnTHaKWSs z*fHbETPP93P^V{d+BzxAln!39^^w>}p@@<;K~K_)meFkP1e>-(GEmxknKTu%C9XFo zj&DbKhkfyWf^Nz?QKAGHo)-`G9NCO_Ujh_F66b{$48&MW9YGq4BwlMtQ-NjpXuR)< z-3C(EM!q*46MhUQx>DzETPD;g1vEN7nVEuQ+Wl41BF0a3?<`b!C`Gp~xV=I??rTVH zVWO1r!L7j}rtRk+Xf6aNdEHN%sWqi5*^A4-xNp72nNk`79PEm-hC##{g1RAHUZ&E* zK~s`#x{7@u0`nuT3^yzOnZyrFfS z-E4tgdraNLnY>#PI3b~GUAN)`%`=aClc^@P?GHId9{#Z-9^wv7j>*x;bcFi)$y_~&lp969=+a!O zd$i_+Ev0V_glP3Dj*1=NhxQ|cTj(OHhJp?v2TFy7;6D7dj|rN@S;rc^cyGmFO2v5+ z{Q~o20)+ZL&^LTBg2cGZTd|>Tm&3!is>MRiZ$h5(kFo8U6aw4$WV~!1)a|=iTw~RZ z+>JR!4ml(f3f}H`3N#)HZ>}qQ4Dsr=-Ra)QIZ3wXHEN2zm#(V-D?pO%G}g`~L| zH>yM}90nQ2vepXeGosZn&c^sS1QYOy)2P1c!T2~*L7`(qWH;2QTlFQv*J)Du zo3&g?P2Ts%O(nRV47bKvbOVJvBeF4I+c2QKceU%$-tea>y+C+K|WZd5`|+$HLhUHiMbDE z4G7ODaLOODNc!D`l8a;#2vD8`gVcw+nD^Nej2kVnbR75Qy@>nCF$2ByZFjIj%Gs~M zTOOq(GT9`c<@K{IwDO6re8j_Cj))%LTBmk2J>LtI-As<|^(otdYr&sI4oRc$BlBfr zB@X{^L5jWwLiO{E+#Gq8*j#ZED3GgLoce)+VbFC)t)B_VXPzUe^LhGJ4j99}d4~mf ziu=%+(Xzn%dhAIQxND#$cF>qW-*?05=vLR4=Rb9V0k2bH_S$`8cC`!Xkugtlx*lYc zVXAp!chahJ|in|vVn&{|x8kS{GylR{i&{4tPpfM8Ca`@dtMVPR=8v+1K z7K3MfQ?W!@K#M(1n)0*GXqSpWlop&f)KsYS;ps(kbV>4NIEInt%+Pkdp~T_~9Ym5V z*N*`Wh!aCL5X31C6BPNuOtyu$Ul9Y{3K`&HZAFLZPJ0jHqv`Y?l^L!`{lAf8vHTxjv@MNoL=*%u4(gqp~uW_Oz&RZ0` z13h?y#vK=t%E23Rf)m^lMZXH;WnL2vjE$J#LGp!7cx9f&$>mzx&$wLhtE~ArIzvh; z+6LD{fpy-Uu4jjyBuZN7s%h6kp3Rz13xQdjKLXr{9G+={YR0hhr<5FV@7ZITpnL>F zf&+{P+=szL)6=S(dzqo`T=-6fdJzx3 z*AiEyk77NcW=1X5hO@B;21`NI&u@vup2lfcPde zV|h6ZppLPqjIkA)XAh~}wKtoQD6xkiDc(uAK0F6`o!r5mom1R^ zy1_vhUg0EWZH4UBaJj_OJ`-zIxMa1eF(QOl%Ti@&P!~nmIS@P3CkLMIleCC;1&hx; zU2lP9QcP^789tAssZV9t`^(*t4qK_(WcTk0?b8Mg?D+*++1C2i(+t}wTK!wtM zZy|HyS=U1Q1&!(U>Im;blC(RAI4n;`R<^@5Xqg{(>;ywlf#PORx3DOpZ%7P?oI_x< zQRWb_diQ}|k31wS$R@=7%{1>@anP#ask`B_g_xSUGCxd0-SbzRTr4lY>O& zjE}LQf&xQ?p5uw!0tvgf8I3u!1ezY}8EbY3;2Df8e(2{Sp|C}oL|EzwV15xGke!Nk zpn*q6uB{_CHRtO3l|j6*@8=yg6d)6hO6vsGn#j;45JuZ+^tcV5bi%ho**!w;rgUh7sQ^EEBjr#R?xDh|lR_fjC$UEOEgRwEg(%OY_1q!FGA1u-4y6 zb0hJ%_MLV;AF?hMvW??q_=TQ?VjTNI#@9)u@L}p}>T9@PF7x*ULA=-MW{f#&X_3m6 zM=3309dN?0ZU=feX*;5p2d&mmlY~o6sqI+aYEyg1n&A!EIDTKvtU#I0oV=&Yz<@(^ zU#9fEM$0}jVATYu=$aANK?MTS)Fg<$s?yhiai?3-B(#iQaGzggi7fVP5a~HFDfeB? z*I=6kPG>eE`qh*Bv; zEn!XNz2x8}s zL5o5|k96&zVuJ64H*WY*SiN?c(-3xkKf0&uDIiqML$@4~UyF_-OSGV1o5-2C`#K*C zb5MujyJ2iWGn1(h`WHEv5L`7m5d#3DBJo? z_Oa2gRA6WH{d~H~Q9xhC?2*8Q(6j~;U7b9FI0Cx}6IqIC>F!b22OL zspM@7S?%L${Ka6=JEsk(rxJ@{O4SJj$wTu4Y{D4A3Zp;S${P-wToW!$DCi)RPewr? z=)4VJLm1}-Fu1Uu_f@oji0#ey*6V^W=*|{?N}RiWSJZQzAhD$7_swxY#6%lBE+H=N zS6p^{rwGNiNJC`YsHZ3e#}T3D;wl;SVzsd|TnA0jQmmYvrU7*pis>MohSO>#Z7&tZJ!kK%wPO-wok|sE$J#SbqB{KO0mHpoiO&qqdH6~K@)iJYgGI(R7fUrIWpRbX(+C@eZnlKE@LRBmAYpd z*U6x;mC&v^g8Nz%s*&6K7p+{z4I-!(d{udng=R z7&+Wt{Q|IHmtw-Oq84Z0cTq`-GFzdI$$NN2jY1%r z)S|H|6OHt2J!D?~&I+N7I$P(MAZrM!Ull5$1FmmtYr$g|S zTCm>VaRVFlf;0m>%Q7p>tDyCe{OT&XRsGow;cd-~wBE2+c^tu`z?Iti8cbKC$Ac%Y zm?H}HvP~PNy_z?0+ILq+XLqa5BvhHP^4PscBvs^@+eZgII|Q;*?Xh=L$`f@7R>oPk zsoaOI2`w5LAV-gp0w>THOY*_yP=7q-^dySdR!#N!QEgG%c=JfE-$tDL zVFtCDH&G$$g$8~a4Mo`*b3#SV@rjz_Ptwg1t%pm%hknUxiKVK>$tK$H_XdkNK3c-=hG>})q# z1#dz6N?b;qE^?~Eq7Om|P}x6B}7%nb0Qk%CQOPZ-1waYxYGmaI5BZ5*htxYg19tyyt9i5SeS&`L%WY` z+&m#Ja965}Zzsk+L^0;}eqPhZ0tHQv1r;qxThm}PwKQSTlc9<8%`7Fxt~@8wH`iCv zWRV|#A~EAUF1H!7SjSl|Q>cPT4WjaO)A=KOwsN0dXwtU}D4uMqs8$4 zEI=c|osF|?gpk>}u*O^wtMC^OY&FU8q!(4>)2TW=Uxn9kdii~?NqCQE#W18x$)3Y% zu5f_#+s1Z93f-$K4T%#eIxXVvhlX>9%Z5yP6rj2!Z{+7@qsB$nwN0}I$&;77>ojkK zY@Up70d;wm;MzWiRN(`sCav1dD zySL|C)4`CJ(NAa*NNjjc&Nm`?4W1m$m`S$c=o*PlNZ7I9opKXf-N}O8mrRPilGU^s zV$K*IHPG?!ffm=&OZSko1UTI88$*1m&UMe{52jePFT7wH3-K_hzCsPdzSm-5ZEVou zTZ%0ei-(aaG!s=9P#>J`ro}7@5;hzo5I!}>6x?q^!VO>(LiioNh>?kclJUTaJ zgeSqXq&IJEVCQ&mzTi2P5bO(G`%Ag4xgOG0%A)+kUpf?Yqe{ljXn(v>*v-(+I&Vd& z-V9)P$x&`${84GKQg24YQcoy|FAZZmD8392vePand5O@T9&dwkNN=G7;__%n=C`Oha_T2^yywTm^>2r`Us$gBfx5dQPEk zdo!Zi%NWVjwjYbkgRndIPXT9M0PR=XC^GyIk#$Gk0=fkQa>GNkpc&Y2-Fr@h?5H=gj zUi|{S-N~@+`ok!%l>U*ONZH}@!(NJ|qSw-hn^ujeyCz-0IP>yt?vkA|bcQvy!fe(*nCie*%DX3L%h!kb{iL-6QWVlO%0+uu;G>9n}qS=U`HsqlP3h|QWW`e%kisQrpZK;_}8w;wRR!F}q`-AG`+bs}njoOZ(Ij z7bd8Z1Mj@}_~N^GnyK)HwjM=?S3I=icY=%-!8+7RQ|D0odNE8ZPIH1FaBkmv5JCr2 zZ3CfSmOIOqJTj3PKqEG{p-<#NGY7{NbUGc-o>1g#gTfSqz{f0&mc@GqZr2BN5v6%O z>!ll29?E1Fv3T^tqFi%+Aj8C#94+`h6!iwc^-$kZNW+9I24pZs3%SB)3ErxWX@S$= z(?-IDt}PR2HNRVPttqfyi2s`Ri!I#qaG2dA43(7Wn&4nYvZn%MKos+rMo*X z7hSXPU1Nxl;#JYw6x-6dk}ft=ADkX2Uv@1(PL{%6RQG#a!1PU2lmEv1~wLz!W z-1X@Sd+0tRM8pPOcvCcXZP+uT5si^TnmyhUXKeFU!f{^_j$guYa;+|Lk<`{|;$(PZ z(>${x@TPm%(_nV8i;>An*0PbUESu)U?^hj;k;0Vbp5?mBd)R_`hzkxSkqXp_bWXsN zQcc~>>piVriLbYN;TkO-Bq~%@Z<(oA$f|u5`OP7>PZLJT8^uAlRcX!EZor7k8blyu z@?;3fj{bErhC@)r5RM)H`d0uI)7+8XH9sa-ZRkvX@1^DE=M}hn3_zwswPTOl650`( zlfo%0pw;EvJegx0oi4OCo;fph%FEI$;N_3aG)` z;J%fM9y7CLqWB`QgJTeM^l-xT;Uix9*`mYcNuiD3$9_jPYKU>N+HbmUGi0}j9Lc>D zC*HV(sF~FF6A*YqcFB7uj>6J?N`-{s*o{VKMPcwdVGb^+SzBuZ$l!erm_d=xVmtV_ zL`IQ~hsxrp@7*3^b9MImPwcFyxT1jIyeo(ZvUjzU8^LRF6Uv^k_HPqemr1-nO7Lcl zn#z)f<_5bzCk28WnhKs>^v3Ol-nw6Y=;-wVJY3ZvY6{*=7v&VeyMKXM2=5%y|u2zX+ z6|O3qv^wn&ea5Ef_u0E<=Z9<8F0vDE8nE+vSsR=^7YmR}=}_Iax3@tYj`ug>dA7Y! zq2{NkQQfmyW?+%Ahn#ZPs6Pp%!}}MG4RAF%VUF~L&5gG`;2Ejq0$EfLWPY=jW+t_%olE=M&rAYMXOU%EiDXvPLIWdoh`8} zB3CZbLfFB}F^{pss{n^NzluCJu~?rqc`F!KMT4Fy}AMC>@_Wv9s#W zM!S&;;(QktMh?)yP&?<|1^TOJV;kPVq}Zb&4)Th&F_eh}>A)n_1AFkwtcacL_~M5k z>P&DkF6{ai7MFa?Vwpp(sy9cFEN@FQYh65Cen5VWZ^2#0&~IykHa*x5^QA3_L)gs+ z5^2zN3EcGbkkYL;H#@=5pJ3QAs6h77dL$r9Tu^8OH`E&7=2vDQmJ(kgwHzceCx;wE%H7l-kXWj;h^|Wkui5gao9UVWkz7aU7)DuHvr{x$= z!Hda%&g{9@f|0F$AA;gX4=6o|3Z#PiEkewVg(GzcBi@<%!Ykg@ZJ5SeHJBV@l_Eta z4xfZRtHZl6?|&Ti^P}4}EyBh%>D3^)GL3Uwk1+M)K^_Wf{Oh5skr<2RcZzO8Y%Igk zjChCHhjJEc1=I=4gH=~GcvIguJM+xzsYD+n_mmBC%NpGz{=Wu}Siz}AP7cUvvCllb zk0)TlX0N&vTjk>CO+N%uB z3Nl_p_-dDmLRdw?i#*k>N7fzIk(AyELTXmqR%fx-sHc>Wxs=yFk?!CPYyx=X52l z4V0)Ahuz|K$UC`rjY;9!7An?Mu&6G=3FKy;K~#&v2Y8+l@pyFxyMzwEN7; zK`)}AT*qe5!`t}|49>T#R7@Sz^cqbZ3-r-KOYO%XUEb;<<SYoxv562Hj((zdCnJ?NE&AdYl)wBl|= zASQi-9KNN|Q<$l7V_WO`i(WCy)ItVI2ryv}Wq?`*UsyQuU$B!-O8S-GeKSGD>X1>U z$RnuUeQuCv5MDUF3%`udnsyivq&SX^7mXI{>4I_2LqNSzNYhofTbpD-G&njYqR>E4 zqXkp_pzu;Cl<^=z=~%HDhk^wg5~z+iC_zs#C$uzp;vqp0O9Zle!R#_7#0{`sPh*g> zm76sMF^28p`=@o;eZb5;g-;4vvB8ZkoQAWTygsq2c~{QWWz@+ZAlyMiD3RP|3WdV@l2c$m) z&`yI54mKVr^)<*GJ`k1?(2jc)6YX>@-F3nO*e&0n3W*g3#6XJIc2xq#)?ccFJq$8}*9c$tPoWK|3TmQey}(-*@y-ssXTo*d0DEO^3s8BJzdW#%Q?Z^bCqJb7=#MJWtu^8B+J57Fh7akAfVkJ%T4m8#En z##V4>^e}FF;jx=U!2YdHi3ss#A!DK?|V>e$Ysk07SgkOBQo7mIKYYdbhhG3q8G2smW#&_Rg#5EzA zA9_pfpJxdDNPitvhofGcXvm3PvdXS5GeW0vz*vAlOLy%a&|GY0(`0xkX*QhlYBX>S z*p&!2oCFOVPLhywFN-85<%0XGB+b+dxaLo(K^Gr4!mYKpL|+GSuYy~|Y??d?TFH^2 zp}2LSYaMb`=RMB462j=mtrRA7E#)Baj(fsctS3@zL^=0>^8y39`kSh1&$k3iI*_gx zX0j*FQ(bhP-DW)y7fmh-uB$RV(5<_lu@;L9B8 zk?=l`+}M2Monk|4y*DMm_2fdDAe zW{O~C14P0zO3DG4jERhq5J;jj7+8!YFhQm!6vPS|N+S@nFs8^;A(E6#!3Bhq8wmuA z3@nnAR7@cZ%nK-j6emXL_-(vq*5`88qW)_%R z7Ft|wbwz3{qZL`LEzWSeEHJHxX4KWYuy!adwqmGevUScaWubdCrl)yXVy5n26vs<3GEpA%exz^{c&s(1gwQg;-Ta{LNHA%?9TuIy0#9IuLP8I`&+8(QZQ? z2i|R zik)iIqWcSVlfJssZ+Z=8R-8RMt$1>dDs;P}j>w2xJ zaGSAibK-8b@#(}Mez=LE;A=kmH`?85yA=AvEm3x<;)b@@-8w?#R9`!GT&>*p_G#yr zEz750WjwjmQTb`^`$~%G0c})lxQ{2=nTFnW5*v!s&{N7qJ{nOBr7d!&ba%TqCxXzn zeAQ*r=#3dU4uTVQjPV5At>y)Oc1kT%v9B8UnzrYxiCL~~rncUV*Gd?UW%xbesC(tG zBJR$~xQ*7W?3h#XG+K(XE_tPmuJJhbM$?rOwthtJ?FwRbv8v==7Sc(dCGER?=Qkk8sXMq>(yu#MghtAz zSb8;{z8_CzuC3#oKQmqKMZ|QS<*3`Qz1-BowpNv&Y<~GxYMh+d9C-0s^N)E8ER0ak)o!0 z?S(Yyf(IB9-WKhiR;N+A>y2YT&FL-9CM6!&)bQzE%F^|lUg`5KP&Sp6^t9z1eQ~-+ zd|f-0XpH+axKz7IgA#5zy`MM|8cUf{ThOS|*nYaR7V3K3I1;lH+lxkfjhti>ofb zHHLBBL(y?!bGd{uWPr9EL$Hw7YTc0-)dFcCQ)GnO5zvu^VaW)Nh~0-0bVU$~LIEb- zXizOdV-c2NLnfRS=+M>;+7mM!N{%|vyv2(fJmxl&LlQz#?OP7Ru+A*v5=*uWXBjxM zDzqCwjy5fd6i`ivHqKxRvqh~GkZ9*NGzNxt9@$Js7@8XyE2A0#xy8Ey7;wytG%zW; za5-FUgZ0?)oOtB72;(7SagnfCqQhrxvy(v(;Y+tPRxJx1Y8`So7#Xm++oMJk6QFgG zHzKjZSQOY(87hc}2WePi8e^&)u7=C%?W5SJ%iVoO^_ zHzqkVgw$fgoKb=%!xCz8sKa83fT19Q)Na;Ywt<5pMUxg6j03H)v~?ya zaY&fcjTq}r=p2&@SQMOi+q-LfcHVx9s<&^$ZHkSoZM7P;7S`7dZB|unYT=tyQB`AB zs#|#WwUzeYUuxa{9eh4tXOD-6b$>!xrW+VB4~*K@uol<=SS*;Ve=9{F;61HAe$lh( z0*2xwmwur+r;2u&u`%6W+Rnqjw0C^}T2t|@nhq%hqY4cArwJEw>MrzWG%fE%Dmk~% ze1s+3;KLb_QovVX4Kp<1(;0yYJG3+O75~z~_&s}?#tb_~Muq9QweDSN?uIG~N-_M* zlQ|SyA)^D{G->}I7&bNe`zh2zyGuXX5iHh0wma4x7;|_gP2_tU<<`2~kgR6{^J50K zL#{gejY!@W+BABby~#*5Z!rd#-HjX_xAv1HYdiab=iT?6N8r>bLQZLF=)E`?hTG-1 zlH*cu@Na0Jk4v!V65vK5uZ1vx=Gb{M|2va;#T*v=(5z|VDear;{WdYgAK}>`=*?Iw zhPFFuZg6t6Ct)`xxF#U(yPc+4Rl8JASfoV6EAueax3Gtdo-sY0F(u~&mlW_e(*GAI ziiOy_Galq<>B0|&AA&STgMf@aE6G9YsY&-y2b0ofRxC<&Yr!&EDAIKD*m^n_m?&*! z#T{smhA5|~*1Pa*_c?(Jo_lFtc&jWji>UiYED#;~2S<5($A}-|`MJ0khnJ+7Dt-}= z8zSLRL>xXBVjmk)Epaa-KWIvnQN$3%+RYK;lLtyZHhf^I=KdgK6AdYm=f?}oM4hwb zT>Lpt80>^*UiW*=5FsOSMv^mQ&4N{DR3e6v(hE$ZAB)oVhHha^VVT%K(o~Ni(&Gmb z!Z>|Bd^OVtQt-VKEO29e)(@@YJ067^HZqMK;Eggjt`QjDcP}D%E9W;U-4o>rcoGOM zmJ%ekv9SdaLYIa%iWq}^?cJ>LU3!EFoN)Nb=(R_-C*&cg+F`WEG5FtO8e56iQ{i5A zTtv(=4zI`k`|%t~zhZYJFN9H?*M17NrT0u-=yiwwvub&cN;D*Y%vq!_J%^TxD z?mZE>9~&mF@_6eBaeP8Ke;N(3vCEejkBl4?*+U#uy7LAMTIJ*JNV)fORa!F;@i)`h z_73Zkp}=dK*x!mf+F^s7H@B5zvELg6pxy@hLl3uf&?-P{;xrrZdl(gH zKytoRgOGcNO2aW5W)oUGxYm&w5y~$@9U9)h!w}V*aOr$a`*=e5ng^G2gPIvhxq2bh zG+e;%4Lm_Cdf2yox{ry5sA>jtmb3PO9E%ppC!1jp1=v&~^)TsdPG(T(N((eH0S$UW z4GdbFq;lACDB30la-j)E2(t7KXJ|JC`bwdXG$*t)CH#;gIG3OkFtYWo{fO(od{vkf zCdVILQwK|l^XRNiTWZINPZ#jec&opBw}+@0&@wgzj{>LcA`zqti%eW=R19MMoC4id zAJ*dGII7Ta+!)d$3P}Sc(C-b9xjHrs-0?*UVDd%Samk7(oF5W&9GV=adokew3`VA0 zlz9%+&lSksAqj%3pHX$CXDo|Im@M6U+JH!i?A5HDskQ41X#~PK66|J(nB_}M%T&!I zj>!(PRW*@mf3O9D-`n`Le{(gMBK+QCA@JV@oEL3&h{<|@<3Sw9>=FN8pHOAJgJIuo z&H?D=|4i;VGbL1Wy`QP##8#9#i$Px)<%(`?U~PIoq$R=4m>cVrp|Oc7RuEHI>YpD8 z`4jPf!W-41hc0YRjiYB-5@h&KUd!-F5fThMehj`9G$>GUR6G2nNsuAG;84+u_@0O% zLVS3wdlIF^azy`;KS~#dqm#4od-RipNe3MMR;m6mvN`U%cWl3u^5NPT_WxS_hEwZjIOzAr^WdJywf(&}6+ zD<=g|@3DmUxFjEgUJVSKwf4buCtMJHWfRT$zEi0CcGRzCy+MLQ39nIIzXC!egc7f} zlN*N3Usk+C&W@N{@Z>Kme49QyhuYl32p$0%0VCi-3gN1G@^0QfII4;1Xp5{YOYaAQ z@ulv3IY9;pj^2ayiX7u!@K+EiF7qm^-Mr?`v6AGM!P8tgPb!ZCZ%0K_!;i!xwog6> zHel5u|9n;!OydH^6EO5p&i7(dxA|3Dh1Td?YmQ(;qfR?}?ckBbo(jK*Y3YfCHbu$= zKL|F?55QpruFkqI-m@c)V{?3g=O$3ZmOQYpiwlTQEh0*zqTn%WhrWjJgK&`&E9$`5 zGsb<>Rc^AuxH*FuP~TOtx+ z4&RzgJ_^SyC@l(827KtT>^osY1B~2c4F+1}FzauMxR#wkb7lNpTvFp^?R#P$h7OVx zF(8?(%#m-LTiph|hjDvJv8|S@jdU7S=;lhINxK!Tt6ya82W)im;NuV{Z6?Re*9xSy z3^e~F@VDNL_u)-{Vu;=NLf3c;8+nM`vRXtVG0rLr%}h&^pW1=oq6CJC=xq$53DdQe zE|Oe4IR(=g*|Q=a6vhlvP7aEwC8$B#7;@(=a6=>JYgx+pxd$i+OuD1o&bDqrMXh$0D_ zi4F620)Ei-M2@co*f5j0y;#!SySZW-bSPt!hWBW#pq}f@;E@b; za)Ixq?}UxK4&K-Nxey2?cXR`DsZ`nZ(iDKMssiCXFRkEJVC(>6I~4Qu|6es(2g3aHG?tZcp~eJ z@$}4cJIY!B;)V|5>K{v{Dwr59I2j~*o9PsNLF`xvFAImH@-IQER^)LsI#l8=1(&=I z19$HD7xZe>r|-iA3kEdsHNf&{{44Op*NpJUyfH##at6B^9KnKfMaJtXoDCihnGFp{ zlX=_-(0&sm@S^dZT5bJsH5)ayrWXu?iaFSapW|{rKYV`iC#Q z5cLLe(cb7)qF3U$23-^uM8G-`bE(;In#hd4r;zSrVDDaZ9AQ1Nn(<6f)#BkVxq$@-b`-th`1TjA;gZ+Uo#@f_!|fw4 z+Y{}AlysO>JKxc#w?`Z2&XKo9TJtRR@MkKW50{*eIAR5nAhs+qM2@FS3~jz5Z01iL zJ2twLh`fA?ES?y_PIzO(jP%NBzDeeHTub6jUR<9UyWrhhqDFfrZ#2e1Bz8kP>pk$} ze3c~}(>k^T=Ig$L9Nf=la%0M+P9tMx))_j4vZ20Sl#TuCsDFhR(H|NR zjp#BR1$t0LDZ_sC0}AJxft~0`?&_&vq0;<4?Wn# ze=ESU2QLs=R5t9;J+|b%j1oYfH^vZJ3^b~zl;FX#GiRqvd0GZh4F$aI$2@S@9C_D8 zZrKF#nWI7(n~i10$(jBm4iJP9#~k=fkwrB+i%#(9!_&*8p%484EEd1==>%gxh5iKL z$wMx2MlSsL(fk*jkU99A&M<=6kv166VF316=%es3-BcO97V+;XGx+P8`K(a#`l(_j zQOv5gE=xnFMYs|eYeYxCL2xF*r6@q6!d;S0VCL;@Zh+JBhLeK&p|rb)oj*nt2?c@y zudZWp0>Sn>C(|>@q=SQ0keiXzN<1dZiWXZTHmjhd6g05{)@uYX(Qv2*1`&Fp$V=SV zi!P3tcgximioWclhV=_g#>h%)Gp3C>D`Z8Um|dN>ey+K1a~zTQ=^RX{6jtMk8_6?w>9}XB*^@gpX z580z*PIERGfg@H;Z&L6fgg`8rI`EIviNh7GukD1vp-nvuMWfQ z;Kag6=c|lkhA_#D@`c&qGk20U*2FgA>sFjblQ!uVHSn*W`y%7UuT2Ydb<>^qZ8hF8Nw$m ziN@fyL>fUAxWz7g)I73HSl;pA90crj_8&_Zu%hkc_4P>DOEnMN8ZKpUGzNWSVT96o z97hJnJuffA)-na$i$K!p;(>JaBonwK{lPv+B5l2O8pFkh{~BTKb7+1@V>sH-w?P8aT2e z8Zc6o*71EnD6-xv8{tkH`U5=#__#SC`xur$i*WC~Iwe<_ph!Wf5M0f#!I^fGxL*(_ z+-tR~;SJjJV*S5}t$cQTeR3gY?hBlPvezgnjNi{b!A`T@WpeOw5ll5uC%K!kr~1Bo z?W%>dR|{yP!3VH7?BG%B*tx)hKF4W2hoZ}Q@7K$5W3QosN2)=KAbo)fC21gX+;;(b zSR9RX0_xA&-N>1PUe-r(Sv%63NxqlgseU055TZuZQeP~1k;w7U%bGM`eF@`uGG12{ zxG|=KR@qq*Ve~q%IwTlzYeWwp#J?o2922uL8bA|G=$W|5-97fF#T}Xd65l(GY%l>D50RC}=)2 zZ2g57?JNn=<0HkWzwOj~J$}CTx<3!HvtY(2?=042-1UWd1_je#%qNzjfx*7_1M3P8P#m|+6lRBPo-JIt7El*?A%lc<>g4G+;*@{vVr;=@! zRSpKW+jYc3Y+BI7pBirZEGG30JB9P#nvms35>_gxW<;->c@Xmt3Cl>Zkb_@pV+Z*5rU zi~LW;ZtwA%PkiW$#(e7FdM3j1ioyuEe04*P5hH__%nCsL zxG@BVAUfE=5~N)ad<4}=Ij@YXyHI19=6iA3t168tP;2VWW({!>hWJgxl0iPU9aCKq z^$=)Kejv^FLPeRl$x(PLWLyp~zie7w;ADw{!$aX{U3eKGsuTOVk{%(L38n}^rsV<# z8)fy29uWdVg&h(&8)7vUnD+R&u}g?&WnfP4K?aPNICCVJ7`~Sm@F)7h^#fy5OO zNJf}crxH{K-##LVcWXop&=O;SlL)^y*3S6m@M7V~y0%*HWiZcAwA}cCVCUtn#gg!Q0 zp<{#ma9v?$20ax>Jr0Q!YSF?bJNHtfDKP=CWfidRqt&L1u`oNNp_~_oB+BE9v9b7T zPs2DOn6U|NQVQp?lixOevL2PtfPY#Ud#$~u^-8yuUNoTrhnJ(BM z*)Iips$>Pm?l+%Bl|ERZ(9|#+9fBMV@%Ez&}8z+ zDQQVhaxh?mQQqu9tnf;WjSWwM-Hr2koPS{cY%udC42R+c>G}sYN*FvqxJOtMw}#dp z5KS8>@tbfkU&d{WsE}-!zGUFIAz@KOy%dqdqYn~8y$WcA7{fnB6wHmmFD4dneaMwH zdV$5d^Ld&5?|AW(BB`@MF=?LWcBmVBpAQJx8<1~Z?RFVU31d%Y!d#jX=1GWBj&W^A zellVO<-~ozM&dr6RHym&`Z-J_CGSN&RT=6d#J*FSdL>#hk-Kh$&G-_@u$UM|M!d>6 z9@wa66)rqXDV1~@b`)Npt?3&<8_qa?pxJV6JuA>~e2L`EUrpTa367DltPHJla{1}y z9oW$05J-cFE%A2nlt}W0(AmtM7~Repz1NIfk*bPoCJg*&L&tjxX64U`^+gmyqqCn8 z^xUTt15q0eIuD{pH5{gyoy@tBR(K6Pi4)Qb1fe)qvq+rxs840u4Voo6T`+H2`L}~d zqpWv?mmXfDNh{6v8%LIR@TFjeOQkcS8+qF{WwVvt;ht**q9l$8;ob^9@IhZz zB6>WK?lu!wu$636R2bMmbOa*C$A-ipdbnfIKTH%CP<6%;UdXx;J~SPH+2t2*qQ3MB z4iGL+%fhlJtspGgJ8;$`kI2A|FVCW?XU097&hB1@D(jVE3r<14(sw|_Ce41I21VPb zAyHh7rEa|937m?XeJ%EOsL~-uy<+Y9!u*xslj?p&5qM}MuuMNtrc>BX3|-l_=(klm zVd28<0vzUY2bz-2viGS7{aA^#-kPw9WyslFm{=(I(`k(w!Ey;UaFdEp6E|FEX}1_Q zD~`gt6@`|nwF&|(>EX)&j677cr&g!T+t#m~(o4$gF}E+7xlGzsDQyn4gfTo!DulF$ zPAVn>YNXUba6W2=O=~sid!G&QPT#&R`pP2?Ihb+~LPx7==8MRYMII6={|o)7TLnnw zj!x({4cu&x^y`MR&3l6e8}{Zv{gX2u+cPZhOqJaa+}5eW-V8c`NP@6*>vDkL$)$c? zTXEEEsL@o)Lj>BN*{9t!?yL}=Th4=>4UgOEo(>B-^_E ze?lDxj-Qq+P*oZaV~`wN#^7Vb0&8pU#4UtL2M{*?*eH@7+XS(me+k~il8QPf^~@1C zIUO47xUPldNf57?omD7l5KxM25kEjD5a7iSCNr!Bkvr7CIbA5{TfRg@M!xmPKS7h=P*MA3E$I$3)UcSu>zkS0sl_=w0zib z<6k45_H(P8kJEZEv@7qfa%s(uGoXqtJbZUY!~_mQMe3;wg9O9~5I6{DK_Gl;77i>D zT?88tFd!x~!$m1jYiGg19vm7?$su}hHU?5eU4=;u&^Rt@2B|gOP4UP_Cpp5G=Yj94 zhv7EBgJ-0LG4vLs*LFNI0r;Zc3_#cJZG-NNAmi0ge*PlZ!La^$S4bp$;G7}APpYx_ zgQaJX}Aw*W2qmiw%im>Xu7#XkP=QZuLS9{?wEKGyindYP7()lkk3#}(3 z-W{;Id6Vjxbi{DVr?nY_$@6-U@Y*k$uec>9ftFezIZG?kR=z&Z9KB)u5N+re(*n*H zX2FI>NkR!Eb)IAkDtyt`0sG|iPa+0_c@z}Sd#3Wo)k&HPk=OfTen5pNR+$B)3_M>U z5U0W%)l2DhaOK9n42{Kv)sm|dYT&vsU4$fMr`Uzu>7r~Qd07y@2gt*p56&1E;jx2J zrjDB1ZZgKlM&Yd-9q7ELfbQtS2Zbd`(5H!~?vVB5)uzjG$>!QJ678EL=!ptUhVIzd z*u~54+UBzWxkqO)6hIFzPRTs7q7nugsHc%EM8bI^#}QKw&)_2V_!6Y(loV<3`UAbRPy@L}A}$S%%H)!{Sjo~a7L+nCPYH%I{@l~^d*2;i1UI~rf0D{llSTG7JvAi-mz&PDNs77dyzv{tXNCfOLdBaq%T z6%4$3hzR7g1I8WZq1cpM+IhN}W;EBw_be}*b+x1lEI?pl^V}WH$0B-J)%&{~(@==< zgl53$dNjgHJ8sW!jG?p1@r2J%R)Xsu+m-R!k5DTyaC!!9XL-g8Qe$Zc&~710{&Yv$ zt4^6Pbvt2+gzIcxOs3IJ{?^zvOi4gs);26sZgABmyCXu7GR&xvlQe1x`;*0X-u7Jj znB0+>#B)2y*LLzMv%hB4swPG{d^~$*YT_757DO&#x=DPFt)boU%GjX@+8xUa zJzZ!>v`C{!>kV>M**DodZ!8#SnqoTm=aHr{uR`AiQsz*e-t7Os4&2YXkxwI^VeE!t5}a4U4vCT>&C>t&rH#*7Xx$c zL(FGBFz4XUClSEn@21Lj7BnAAEL;ulixHF@p&TY1&YoI=vic|MIui&wTvCLsDHqYP zwE8hnG11yg$fd^1+^S+XFXJZ48;KqYnv-O&o=8LUXwi24BL&nr6zAp4&L1>! z(b8vtP4yrYJT&U#$9`{cQ*KGxnPw9~1&eXXG?Vr?q>*B%Ak<)uTzfKO=*q|6o$$QS@^P-t~! zKiuXW*MDId^{H|+IbLeu*LnEHfn%h0>>XY}6Ht>MkuSr-hSrA+P+F4sF?}(e52285 zi7{uz{CxQ{!sJJ=dOCUbxw?tRxg-;MmP{cSgd<-oLSQNp&|)OKz=YS(c)T^B*|PLe z7!@*AvP4C)jOn4UAts5m6L=yKMQo2@xFJPhAxaZDk?Asnl=I_-$^h+`7EDX( zpWA!viW<|Niq25Vl<3C8+$=&uurB1lKa>}_Vdacw!*pKSZk_hW*{qPlkbL*zCShaZC=>(cd6RFu(NuDqs z4mJ>YgT-hvER|y3JLv8FDvP32PtK{ijX^bpp7z4F@wYgK5$6)ab2nRX$$?;8afL6Q3k0*cagPPIPwE=P1CtDuGrN2A=$a$cxv z#^faqn8vZqdamFmQEK-}6|fys^X)IOMyJnC>pkv3ptwus@glueP53(ZJKsdfvp;-? zXX9KrE~I`UD-7leja-Y_=-JVs%*77~$0!>6eqte*60_e-pjr#XXz`ijuwPL*)T+T?D9Rp*J?rmpB*dEpk8XjW^a0)yp-rR*A@s~=g zV^=z=kdF3<3}8p$5zFqD2@YG9aS1MHyd%PBSALRkLuW@cX4=Xu3nW3qBBzL<=W52^ z!|amhN987kZctXJ8TKZ4n- zh#s@gmx;v=9wTMS39#*(+|GnTj>R-x}7+=5$arDJ1z95YT7Ff92Tmq^C9zqb^v|91&Gy0P~>jxs<6PTjv}<|E4;CZxbInh?sHze+ zl>ydE1`T^tfV5f^3%>$>pv~`0f;+#TVdxmuO2K>8qpGr5r0%UhIZfDqn^!Vpz4sgI z&d_Za8yXWvH+VcP8POw)GbfLTeq_L}XTmgaqvM1MO`P%5w<~sWQSzp(;-IHm1lu!c z^3Acp&v1s11E5R6EPDDAIHX%mS+A4b+OyAvxn^ud7JOmYHynGpRhy_5)ZFi$e4kYg zNQ2(VVespSAG*+7EEqL`7DD`q?sc5ks^wP9Q$WJ8vTLTw^hx4|BSu_vV#bf7FksD2*rvA=+onQFiMed{OCOM*&FxCy@`vHaN`>I8w`+-EH3hlqgP?w z&_^|Bx7}Q<y;GkmhAp2_wdyPa%gX~)(EE&pn4w{`~0>R;UhcUD!zC~MHZkg5iFJ?*|>3A{_ zJf^1JPLpx0fvchKD*Hwk1gUD070QOVITRxHDbtC_)iN~- z?tPk^7{{Q3FrL}=vjuRy^=8h!5zO@a(J7KYa1$ z`DT8EZ3xiL3NgWAcTjm^KK1xL{KakG3>T{!rI#umkz*QG0UjXMe8Ft7`TNj%`(1v@QDnGa^LH0d9yQnJ^h=v!|nJtuG=22hm${(Oq65D%_gRR8Fy<; zH=mqa(Y>CLR^O(YvpTF^bCXw24XWDKH^46!V~LiqfiG1q>|nJQhNRR5dm!+M69R_S zC;Eb&_*j8r#mJYdE)Na#7Z^QW%BrgLaM3=g6B-y?V4S*$_k$#Eg+!z_+!%h^X3JwZ z@;&dTw`2@K7_1C^1>*-8An;@BR3jsqv4NmyCsv1p0bFCj&WqfTdI% z0hWLmcG(XiH&2AL5K3*#4@-SG&K?4B6e3rAN7=1M1N zIW}T1in+s@OOjnv@T5$bL@K+Pq zPbohFr-7dmX%T(47p_?5%A`I~UDehKlj$iq0K4LE8@B`qHCtJtDG)i z;LCg%rd*xB8;2NfbaEc#`h(sLgbxLe#Zhi0)O!p$I}yQo)puKeZl9Xv#&uHS##Mbf zGk2je6f@%d6z)fn#(FR?#tiz1lGoH>a?o2?GvHC^+=?;ll?BkFx#MSu<=2NFo-;Vs z2X%9jVlQf3I~OPWUDQ^-BRKs|OnSBR3PUBT5J)P9INf(+!%r|X$9&&@bs5zU)O0v} z7Vn8-nndwE;#o$#UzekyPaOeZvK)<;m!0C6DPKcF6`%m{Pf$|*t1gI zETL4SM)chqFHZZDAp2=4uDuC@1WphT-L}OAp+NNXeit%(VoM7nxRK)rOxs3F=)`9A zJ=}Di6n_tLNWoo#UA8K*gw&#kfkMw19x|4R*eN5;J)YMU9v>i4J+{QY;wWI$IYro@ z6v#DEQd85DzZGv8&s+t|ovr1!590uKD~cuo9oo_N=9CdaO1mF&<3~z6Pb7l-A5lLTqcS;zXW71R z%fbv9F_Lg_+h%Qyl&`CtAd|$Eqb7`9CAegwo^WA|Y=vXti=sgSaDCEv7}#tLL|k-vLW|kFXD!++|0?miI;pMCQJ^;P7+nH zP=y;07|(4+Iy8}?V+QpVqz%Pv=1#eFs7fdEZ))8xSl;1AQ;lT~^&OGyov>kvAk!|w zTaKH!5FRAxZ(1XGP(cXDJ9RIz6p5XF_tUR#r92~=U{-aWpLZ7p_CnvYa;t!`Ost<$ zxEI5FI*J{kZ=#9~#}jBm4ntP_pC&SUW)M#U1z^IsT@^Qfg`QxRX!h9bzBjXYCkCR@ zHN`&Yh_tRzyBy?iN%Tu*k=eu;*>ZY(U&m*rZMhc=CaZ4LTo7@`6;^51(j;)0BY>n1LN~#`(B`BN+xNEqkji#p!q&17O67nT-quyz4j8#a*5B5bAKaSkjP9 z(dyR`qk_IIo8Z;8*c5HRQKZ^6ubESLRwGr-u(?l(g+YxCIM~>gc8l2vqRsfqpe71U z^IR691lZ6qDC_5O3=Xact#`yxz74%_azhY(j;|uSMKZAAb}%e-=av$Ww&@NW^xhNk z>$tH=(MtHM^^&7^VgB%BC?*3c?6nMThl|YS`!+4oI=Z5sJpk9XHlq5^18nK6_1V%>?Xr5CQ&L9%Y|K;(1%Zr4UBk7Rfa_9LA9@rMhHnjA%F^ zu_MA{fe>~DNmIdfE;JMpQ0(S$FpT`@utj%r8^K9W(yhr9J=)w%v@p+=-52h3%AmJ)-iZXCxCjE<@7-MC|>40$VQ!FZQT^{yIE9Y~R zLZ^&dCvih{u203t7^hR@%z6cB-1j*;htb%N4mu_GH&>1J$19!c5xA0*x+rq$Uv53i z%gqi%HN>-!FsPBsMQ0OLXuv+CkpV{?F&Y}AH=E|@6Xuv<8PDp?SYKkU3hb?<0AW%fu4g7BQ~KDpe^^lAedhsO&xKIxVGOJ z4r`1cq$>#>La#BgFH5EL3zmGaReIX5yk;zgxF_5WOZ>_0cftD6@qB&}jWLYI^YUZ) zX;{o8`CjAQN8z@{L&nNZM112kDP=?NN28N%LH%gFjknCaH=W zjB1fAh_A-dOUely^bXIcrQ^Dv4^)}h5JEW$CGNmb0X;}YP*Rvxe%-q_ZyLXL%Y)4| z<;H*^ufck2Lve*r6^z8M;UL_&{H;Scaa0ssdI;tzM*VK-Fg(Dtii4WI!V=+8OzE5ggeP=_V5zC*e1w zOU)`7AdDHp{3`H^u_B&4Amna*R(MP~@khnQI46Ga+#1U5g9hkIkfAN{_!tG32t~m{ zJKMr2o^jBIc!GB>1~}z{q=2Z%K|~DRPqKVRgb0E#zdf4%4FEbj}Z|U5-)S#N_UgEolbrZsc?A$=h&5 zh8d;dX64Zyfk~E#dr+h#*fEvh)UVEKVuDz>vV~^_tF=^9+OJv0uVMub@I&k?C~#E@ zP7`K_p*e^c)!rzKXN2sCtXrVQYe9xYff+L{nVm z29jULLqobw7sBfl+8LSIRhnBu?*ker_>Yeo(3Zvpl0_iCirKPBUI-Q%$)G6k_e>b( z(z8pd!D*o$>p=AI%%|5bYuquHTs2dXTFfoqL?XN{oG5iKhmsw}JBO34c!{bx-Bt^4 zDt07OZ|N~37BPl_g%PdO^=tiVZrutL z7|(bT^M$kzFCCfa>^CFHy=S}IdY;WI#s$lc0&u+|=wedi6qz_O@(;0ShOdT+8@~)M zZ@nO=#RU&@V&^&W;YpHE+MgaYL?uA0J3HHSi~Mi6+;od%Hx?&jr^z9prfC&+7~itf z@30?1SHvG-b|fzSCL6qttI)0yKRG;XtB{QB5FyMIVgZ7vKq4-t)*FJWz{H%< zS>e&9Y)g+QYgxd`%=lww#`9%I5XluBY+QwgfeATfNLi7kp{{6Nm)V8sv%;Dn(u!ow zm!|G;xp5wI!y8D1NOh%(@k5ZL5aZw@Fjxkyz`%uuQ3e?5nMp1oyd~Dhrjs;W)WIR{ zkYaq5#x=%Fog;;Xj}zC5{p`(2zN;k?uN>LQAaU*5gM|{Fj^Oatam{|6bHR)sIYFU00?R5Q7jdkHgf+DA+A8+Nu^$pN9~3VR3&gRpXlshdY=Vr6 zYm#VN`md-&-nve7F(!6iD>DTzhnzCyT2e5dnqhw*C)WkLhyxh>Y$#P$U z8MYr)ruxDJ$Sm1D2|6ttw})!bPO-~~ru;sjAopQBBSJ}rU|_2REvR!8g^x(Da8W!u zNv1jq-X2t;^m!Dw(Y`HSy#qLQg3!=23`)J=-y_1hRmx3hFK}(x)Mi|VF|@r3R1w4{ z*>Xa*Jj($1ER;XAPC*%;%=undR2%X`Ma8pZwq7r0VlWY{zS|st{pR0F6NJ73xx5o!N zxG#Z(RW2aTbm+twFvxh>(^*O`F0U|zYFG$KwzNV=MuQU~T9IE3r4-_J+-TTAsMMgMFk-D7E8jur zhRArrMdZU^eJaX_Q-18X9U?E6c}awXF?b`je;_f$MSc+ES3*N0bdr6C=JL}wqO{PC zQcrjiEGmm0SoFH?o`QtIL8UNnu0D2Al1qG-FT?pmK?^KTWGXAkhrel3W^6QN269BC%LaQ zj|Q=za+JfWgzw*fG@qt4}Q>FF+fR*Ta1(mll#bYy#sgs`Insi9&xR@pG)7c+TfQnLuS zWVtkC{4CaXGSorCel|hMwcxLqYm{rbl1w%6$6$Ez22%1DoE>J zI9&HWWCf5Nxxpr2)OTZTKF>E|b)imfC+V~n*}9Wv`xEGV>U9WD{*UMZ{v|)a0@f@a z%J>lv=lpaks(&^=h5kQ(LiF0d=4~UazLlCZRVw835j7vqxQ;-n0%4<(645m@$>FI$ zXJ==bs(Y-5TpbZeyqCKV4YBpmM{nkM{$?{*6MA8MjYGnRx->QlEQg0+AU~UKHBId0 z!aY?{n0~@5kfl?dwDfgPYtND(@u!{dFMWr`4~%bl)ONul(rh9S$Zb)JDA^w+gZ0l| z-=?uV9W|*KD99s<Mr$?MZvr4@Cw-9?{RWwDl0(VIQN2^~xYPGig2 z;RqbPgcDW|kr%aIuYz!5GRVK6q=C!rj@HILwhvvIcEWquMs4lU1Gq5^)knuMV(tuB zv*NDI4l$7)I|FFH4o%hh=*`M#I$(EaFv=+I;cVy~#tddi_sES_o- zBVfj9heB}s;d?cuGGvnTwH?zZ0 zvJl~a9yWYYLVKo_6v8%fj=9(;7zuW}OdYYn{9iSp^9IABR{Aa`x6w$1 z2f?sIs(GOm!Q^Z3t?yp4P((8gMmXLFP_wFp;RJ;gr}Yt|QVazHK5YaMs}k_DRiS}T ziyub)ed|6EMB^bQ!cS;Fb|`nYa`I8VxFDCM&^0`X@V-uhTb3|k7T#L9?=#VBJ@*GN zcfjr@EO0yh>cQc0;^0+ zu8Sr~IPAu_W|--h@rJm<95P~@#O$cNChqTYG*N?E&HPbDpw(oEL#B1c(z7%6>88dZ zRPdhRC>PqnXFIJ8h7^dQC_V3Uv6WziE_H=972!-85J;hVE$A4H2hJ7Z3PZ4nuE_a} zHy8KZ8-2-qO}mzTs_7i*ew8{Dn8=+VlJa!#1Tb)mY5Fz1ItkpG9N{=Sot*Y?UP&@` zBxxb~C_Q+Kx2k-zDjsg&_g9kvJM2UW=MlU*TH_ZgurcyRu#h)-A{`rxqtrR911(sQ znA|Xyfht zQZsMHYo!~qe{C2uGC(75p9Sn>h4TDEg&wW08D&Uo)V%j3Ko^}p-tU1O=skimNs!lS zVaw|1aj+i}|mJ>9@}=zrqwNT&)C2yiSrK!_AAtpET3 diff --git a/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 b/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 index c97faded8328ccf72ed4cb934020eb7f7e759d58..f80e50213f9e8e5c519e0ab113aa1d1c380f5033 100644 GIT binary patch literal 733 zcmV<30wVoFT4*^jL0KkKS>oG4!~h0`e}F_(Kmbq%|L`iJP6|Kg-wHqj95Z$emhAze zX*Q)djRhko>W!oUpa23R1jwG6DXJKThCl!r0jc_+lO{mO000^^0iZ;wHbFi9o?R;WED`W6;6g^HDI6x>?`i(nLz#p@oc6L`)9Y>Yj3|6 zL2#n?TyCS%XB?fBX@*bWfI!}ShF-9CMjW?7P64!fpjS(g-?rJ|EYK%x@N9cr_clWa zlm`kT;x7)e(8bq@n&X))J@HxxmY@V#lbnlHE(cNQI0Rk;pyiCAVGA2cs}b}!V5>vQ zm2FVxqL9qDEh7;Z)@cn@G9n@(A~D9^>Bb(cvB3`8WgRz^%d|%Z8o~uwKx@LlYWv-$ z=J8@}5|b`8YF9wm@s~|2uNm9kH?3N-eSfz%NK3G&TWDq<`0qyRtw03cu>06>9&0DwT5oM-?H4G&C8 zp;oAF1jZ#!^oS0=(X&ktZXL~xZ`Z$8TaSPsH0SBeK{^ZI5EGSI+_OI5yloOW$2nUn z1pqEw^GUF-227mZBd`L17-^NmqPfw?wzq!}LV_D`>ZVxi%PDTGGtlsXAV`bre%a>x z3(=Z&g2FaecZz}m>pL%?*gz2<bG8b~)p_r#jPYr+d*&*8BDX9+2926p`hahqi<+ zJnr6h)tvd0&;(TSn1*TqG{^?0>Y5Z9GBf~a15AJdB}s%vC!h@>h|@qB zq^uQ7%uX)b%nAnpLIM>66oM3j9@VJ?kzmvzP$2{>F2V??7{Ng|A|ZokKIV(CPG-(l zbClP1{aID9#}xU2g#N# z2$;&}2QrNUk??g9YYq<+RJ&d&UB@LfUKQpFcYLxGh;zds=QHMcJKprxA$gN3A|fIp zDc5gE+OAV;*$;EtUyb58dEWL>s>Bq`8CkA1P3~Euz2uY9GEJ+cWTZyU*m&ukt&P1e zy=zs=UpU&HgGX{RXqtm!tinBF`*m49bF?SJ6)05jep=QH)1*ixJ z0JXRG%t!$M004o&fB^yr00IF3?vzO+k&^%==2|TjIdKFx@iT4PGwGvNjTc7h(ueF2 z6t_)5x(mP{7RWyZs(OQ#D3(tg-rP+=04SXE49ME2l}A^-`@nz|o^sDt)M0R~FE{}J z5D*z%BwFICY{KY%8q5PQ49H4sqSVNVWP8>PlUH&-h|quwEAC!{tN?@vTA^_~Q&j71 zG@ gt5vqU2`nh-e^5iPAs`_X53~GT$rRy2K%aX0AOqqt9{>OV diff --git a/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 b/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 index 7ee11ad6971884c35fc6da5600fb24a498d649a5..aa5c7030a3ee4186c883e563ef54c33342f6516f 100644 GIT binary patch literal 421 zcmV;W0b2e-T4*^jL0KkKS##|sTmS@Me}F_(Kmbq%|L`uLP6{vQ-wHqh{8%suYNOO= z>Yy`IH8N;4!Wf2wK$P_;%3w*L0MG!?0ieS}O#n0i8UO*1&=jRfh}6PjX_1i7(W65~ znt4rP8(SHM&Cj0oj8nK+Eke>QBKr$?T1BbL&#+Lq#ICrO_hVDDJ$$DJ7mLTi7o98? ztD)2^V7fvsB}XDP0=X4Z9dk@Kw}&21W8k4AmJ;?-000dc(MhpUFfgtg&>01=eZg>I z*&}{A=bbB-SK1t|5Lc-4o)VM&1=ffp9k4jG5~YNjvsAwvh^@`ZDnk>Zav@tOX024* zyB$~3uxXTBq_qVYGMPnKoiGqZbH`!gcojCEG4LY7#3C?=ry$D;D6wD>uwdH<29HfH z{?U8;ZZ4A^Qhvp-UGvI+5oi}a>=~7rJUga=dnW};Cp4M`;LA+txLJ~UzuTrwbFHnz zINIwr?Qh&)mVs`Va5TxuE0A2}S}L=p7gWHxS@52#ShbwjGhYPEH|B?%Z(^6@p z^(IgN(9i$?2{kD)o|DRYo}kgAO&S0LAc~|k$)<)(gF`^bGyoK(AXC(6dPkHR8352T zDYZe)-f!sb)ngRy77Jjti&(zG)GcDz;p*OqUUe1OQEJxg&OVcOo4@Xh!j=nPA$r&@ zA!#_cF|r0>e)YDUICX2gE9)pEl6qA^5=kJ^T~#iik_d>5BZ+{J4`JzrU|48yD#^}t z!ctEIIg1EwJnK9My7Z!xCM4dQy><#aNMBEweoB<-ZK{+jKId zTxigOj4`T3Sy@Q}UCD;?>U@Z?WJF>jnueI7i!6kj;hkY2H*5lSY?*V1+#&iF@qH)u ze$i+yzL+yBGI;k*1?eMHU`f$0Am2&}5k7uM5){Bjk`T=2&9?q`v=>Q-k*-duT|(eh rrB-r9%49Eu>$VGF!rXdz diff --git a/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 b/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 index c1ae2ad5aed9d71560bdb840b5c331f91883903e..a95786d50600fe457170555979c042d562d5adb8 100644 GIT binary patch literal 765 zcmVnAAN$05lkAX`lvx13&;W8U%_)B8CaH%56+WMvXLR zGf5;QEGunS*J(mQxDde+1X2j35fDWnia`-F%_IPh)FhFlNJSTD;b}{|e)?j_-=>Ns z3M#V@m$wEBljOz40y&8iSFvjW5Yz$~Uc5CV7Ur_;yR=wFNN~5;~%#&#gCMk0uODg$bjE6He_!+Vc$p?I2({@ zrb9D#VIc!I6Z5_i*wYP3<`WZ*sxS`jn;FM^ER>W=y2ZRRc09d4Yl+@NA{)1Ron4N5 zjM^6~sY}hf*+oF3Yk91LSk}6rc+7CCbwR5m!vp4m1O!K|;o%Ex*aAFa!C|G|`Nzh3 zc|+VpuK21`S6Pc#IU?K+F5c`1a}1SmY#K<_r3jhzB=R_B((^WA!X2zw)2Yku`Z*QV zHkz>Mi^$(8$Z*mylPzk^6b9L=0tM>tS25-C#fwDV30m$U*Fn%<6Z!tXU(fe% z!y{v3ZLzdA&5(m_jkY#bs%8a{&>{;e0D_8v(zPaeTA0Y2vkZcnz_Pl=irnu4sQjw{ zgVOgeQ^u`E?mQt}LN2(LX1ZzIG1)clX3N5;m9jh==v8Yju71Gt<0g#B z>KU-ocEJO)hlmFHO}h8Vu9 v1a%!*3s5GWG$U}pMn|lOA~@-g+(>l8pd+XuutP{VpW^OFrwS4a&9V#t-AGtF literal 737 zcmV<70v`QBT4*^jL0KkKSsu*FF8~BXe}F_(Kmbq%|L_2y4hlb~-wHqj95n!&X#`Ws z8Z^)VXaE2JMLjgr0t88@JwN~e7z0fW8Zj9F&;g->MFA5`o|MxQA*NFyr>M_LP!bk} z>i+(uQVw8-2$&*3i2^1FkRm{dmZ%^EU3UNE+BJ<06GLOSXQ zMaBdMG8UPh{G-XWVN5KcCrWoAP2W>KJl6A5>;8z~$v z54cOrX$?SiW6;cVx?Yn6trCdDR~dCb`w| za9WaMi~~L2bjGoO%}t#_uYhp@5#vzKbkeK^3L>FV!fRXGMfhnl)4Zm(iAlwhUbPL# zuES}jvVmBF^v1@alYG`rlvd2qq+wSnyVYq1Rjnf|g)OUOq*FLtt|5*sBWs@BgGYK6 z+W@+8on6I;z<8 z%^C@NRtmlbD^5cI904aXdnX)%ys(9%N|?g6p37Uv5p3P_cf6~r*%Uhd7WE84-?5lQkL8Wdx8)Q*2c1AC7H1%>dQ~ZaQ9B={)+7DFgsg+F>;+=xe zY}$=z=e8KnG$WbnSP}K0$&%i8nDo=P&A^W1yIHjYY2t)*8U%7A2$nLK+{k_D_6Y6> TY!K29lm0H`ig2MIJ(-kV4oyna diff --git a/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 b/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 index 33756def3e3335f8d7d87a084710020c0ea839a3..c8ab1f9cd83fcad1e5ca3f03794ac12b0a06d43a 100644 GIT binary patch literal 741 zcmV2^CDlMvX>l zXxU7SsL`g424y0Ig@rAuao$XjUI<`_0w)Ac2!JARMBs=Tq>=zeWF(QWNJQFn@Uw*W z_;GgK?Z+&c3971H{en^mv>f^5OOgb15+YpE+yXLf0Sqo%Hl!A7)!SwEU#^KtQk52z z(=`KN;1B>XjFH_~aooO@HO_HH?aq34$=jy3wVxM7BTF#CmAYtqCf+=@#~j?(O{(;W z2lBHSpc>+$yn&r@3~%h5@7Ci%OqaCx!0oT zFPp*iAU?=x5#hke0Z^tG2eG=7Uy6g&>ZW{~4-jPsZ~>0#Hea6lOzBBQq5lb{W zuQY59Id{^rKoQuT7bP~>)r)z`MyV{M^$xQUCdar*&vjkIw9k{vf=`RTV|Qokcl=9d|@@a?!rCf;I$LQS(g>*AUl49 zcE-p8fWUgNB;oc7i6xl5WxPNX4L3BL&BWaA$vCKFKNJ9<2tP2H3cP6I=NxHC4uIm- zI$)Nq+)D=9jxGvbx=aX`@!)lYA=AnGLRGH;!fx>EN>BtQZ;lS;)et}ZOh z(eP1gXJ9wpj;D)KYGX1Dv`P$u-uOm$0<^MIdL=z+g_H}R7!&wLZ1Jqz&agVh>B!c@KpVuHB7C?FyOhbp@1n=Ts5Wa)bcH^`nwRa~(|tMf?#BZ-|n6~L0kD)=nhV^}TY z3w>LWGrLlK0TL@9F6a)kW zsvmp?BoYZEf?x?E#DtOwBoY=f8WNzT4tM~ezX0l_mDyd^T*ZrZ$%DtnU6{LCqx%4$ zB6@tDt$mH+ZmF%F>?7n*4^c*}L$!Lq4(FmvHi!a&0GhBaT6hktlEu!sk3ai=ss@H9!5 diff --git a/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 b/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 index 43688c8c356af92463b53dff283023e7f115c433..109083539b051b746f0883121f4a9cc9aa40e840 100644 GIT binary patch literal 882 zcmV-&1C9JbT4*^jL0KkKS)tfW^8f^n|A0hPKmbq%|L`c{4hlc#-wIFzo*r=YhFCq| z)Ib7czy!bm0G@&=;WRLUB{Trg000D3^zktoXi5Q~XaE2Kr>YYZRQ*p>(`qz4rh)2c zXah`wDMLX)=!~9I(9|*qs5A^pQAdrD4V<=l}8xMHDw-B;ayo3__g zRaI4Z7Fk^p5I}|)K&f(xo~E={>Wi^5eAC6*%W{Nm@t&+H8{rHjR~?taRd+>YYo@Yw z`sohc_kBLd>E=t#n?c1N3w(2a>5~O z-Y{Shz=&WbZdXf1b3C~Hivr{(=JGGv=Ue~xkS8=)BIVA&o5nzmHP-yhX7dm=I zJ)we_$9Q-+)OettJEl56Y!DSB+9KWqy!6$+0`W=A8x1fg@dB6C$We@rn)&GR69LDY7{X53C%P zM9oo4g!m#K^6XzrMNwkVU;)`F^cD5Gx!s+3;q7Sj|}k66r@ zI2T-%<9a<>fk6h2c6sKZjzp#`rHQhML1NUWE;xY!;$rF;y6OZ%`psAaJp@9569=Zu z=w<>mIoV-N6|O-P)h~h$Y$T1c=$zP+P^6XBiHn-cKEnKJl-};u8q1EPHt8@kJSWxG zo-tkOb|ZHl!{Yo9qaJ<(A;q zZ+3|&%9Oro@V&{&%E?3Tgz!Ls1P(weS%44`0w9C*Sn>{V>9`IY_Z(}hDATJ{ez%M< z<-&Min@x@XfE@x@*Soddl7=#?p5E&#_HnaO6QFa0m{y$0q~(aEi&8cDjr~CDtv>0kBO1u5l{wR!B6<0tCJ`0N5WdL1M`h$n;|S;IdR> zx`mzEk31(Ds6P_Cmvt=)1e}cQXiz#M=L~_h=L%bKW34UnHFKN@Qu5KHs}+rm+DK~q zL36mP6i%x(v}AMP3rcj+F3t`d$8gAxjMTc@T&}G1{`=xbC1cRj2~xDgcq$RKVlAfE bRb9>VpUE7Esv@L4-$L$4rwS4k_~=%kgR_Oj diff --git a/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 b/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 index f6c074d1fa8201d07becfba796d8d772b22bfdd1..5b445a5ae10946ed17c3dc88e1c67f014d5e1b73 100644 GIT binary patch literal 966 zcmV;%13COcT4*^jL0KkKS?(&E(f|a!|A0hPKmbq%|L`c{4hlc#-wIFz{toD%85vkG z(9=K-00w{nWHb#-NrOg&lhgnJ001JYf8sDELR8dfWc2_502pX#pay^gKmalt1d2?U zsLd4p2Bw~c9!8<+HldG7T7-p_TUGDKu^{FMV2J`E2#6v;h=L*rk$loX2=PKm8-#>e z_%J9|A?8i$@R<4gevBD|ZBgZmqj-*{{oO zCppe^R7}Q1$r8rRs(+AXtk2> z>(;a~hQ!CVW}f{spm2R=feIAfTLufTq5KKk!H*Pz{;ZD3xtNHcMk^TTa&z2dF}qkz zsDc?GVy3XWWS@o3?H&7h`cB;1DVkmpdSgK$6{dc_yfW=i>3d^iZLzdA&M<>*jkY#Z8JQSE zaFN%bBh#U<^D(ZyyY2W7zu^AV1ThDHRQG%RZPv@@!Zs__vMjLm_<(x@lb@@$vC2`Z z7TyoQ?=>5UWK;6=rIxvj%bbisKpFVvS(wA1fdsHY!H;rEv8~0mkO#0g6O94x=X$0q zXYI2q-^In5Xx>TSuirH zmOTo$q-KOvjcko23O7rvtz082sXAN;>dr?KOZUJL@sP=$w%~WQJhIR2P)BjoL3#w! oxd`Sk5uxuS2$j*aZbUwE`2=?aHVA14=>LnkBAh5lcNI&Z0s$?J|!#ub;|pNp+w65T}je01gLC1@eFNXsEuC*gCu%fD|O zT z5jQ+zdLr3-(=3(nYzr(se}Eo?laG&WW0Vy_yF>6h$$i8&RQ#XKNy9i>l(hxMyeep zW~^^`$m=ZMz@?V0gQCA9n;5`B)Akml;C5u_usYl;n2al$HVK4U&D=>a{;)XwVmz6$ zBi}_YTk7k2wA0(3Bz0Cj@02A<*AdB3jmr^jcD+@5v!P1l%ANc&jb>&`W>5D>0t3!RFE?B20Xgy8rRE_+Y`su}F z+_9AjFzKdiTk*lpq~>hXJ6+8PnvgY=6?PiBoL@~20UoP`q^g2IE>$o+*R*I|!!o5UDIvIPU1e6uZJ^c_DCmv=H+*>^u83=Do_QFQ^p81f8rv?Ua zwNz+(WK%c7GVaJSnMziO4FlsWgD0KU#(i4_<`)fS`$9dCqLy^8Tc}Nid_jkB8bAPq zrx~ra29`CF(ZR`TqbffTY&DXP>rvx@1!tuDjAq6dW%{ukNaoI5Aq-|0X#zRpNhD>O bsgV*W<%cA3Mj;pndHycsig2MJ5H%8VlP3X$ literal 559 zcmV+~0?_?JT4*^jL0KkKS$HL$;Q#{Ne}F_(Kmbq%|L_2y4hlb~-wHqiJZ6V&a5Vuj zF)$?2plHwl15uMBBPo?bLuCK}05v^OnV>WT(7*r$&?1y&8Ba|{nr#gx)W~RPGbxz_ zF)M4!0+4+Xgl3G9k~2m~$r+btQ4z5fZ$W9@tBw2UzKq$aIp>zE0O#(9)CaT>$7RY9f`iS4x|L;6nc2RR8(oQvaN?GUaZyvoB~>j0 zkF||a_feB5$jaIop%UkSPGzd=j+}Xk>VJhjVTR4ndCrC*$g8f zX=yWYMG>lpE&j*|rDD7AzD?7%svYs(f}Qu%2(c;N(ZtjGC@FJQ>SSPkDL_Z6HoVH& zQ56V@sr9)pipy%^cFBpjrc^hJ0sM-95Lu(UMS5;1k1q==@1&-!GK)pPz}SymNG3~J xl*q>)&XpsP6=*hyLl%q3g&ky(m9m);GLG2xM* diff --git a/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 b/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 index f0ab7d6c52fe7d72f33899a08a48d7d74bcf048b..3e467241868f1c10c3fde30eead299f3d11f3ce3 100644 GIT binary patch literal 1171 zcmV;E1Z?|4T4*^jL0KkKS%Zvma{vV_e}F_(Kmbq%|L`c{4hlc#-wIF!{tjpW2G{|D zCYlrPxR7oHFhqe71Vj-aL_rY*NXbNy0x%&Y zjRHb0aMQoQxx?Md;+r-`1nyT>S?0tgeHCDGYm*BQBcPEqXkn}bLr@4|p=Z>PdSl6# zZcMv#)|90wT;v`-_9%h!2DRfXsBCEjov|H&u|% zgo0u$bKa|fVy2TI^biQXhebd^O5sdkv>p}5_@zh>fIMtIWAUS_!M(_Pi7aZC!Q zBKO?8((RsZN*++U_*3LA6S|X2 zq)hSL=bLJi1JRW53vISREr{#5NM&&>G^l7TXvI_P((0zT3xQqYuGm;Wol|}5d+w$( z#(e2Q6GI^DsJm*-$V&ZRPTb z-s7Oyrq{(Au#ROTx05|+yO|=-&sYv+W26)7>n*=SJZeW}wbd^HI8bIf9q$*#kmW8E;!af3v2Z8p#@6E?S{XL-#*o3@s9gyGJe|0rs^nTq|D^=|RCy8F#((6FVYdJm^*h!R-$^ zVTD_eEJe+MXKvOkUu4d*MzOo$3apY|V^vi{EF{FT6vqQR&|eM1*u#p`vYK-kj#ld! z{y}{SSk|?{m!^1=yV=L?5059z0%_QU lZWsu}_7Vh2$joj;I@{C{*bvwuq#sB4yOJrwgoGSpi1cduST4*^jL0KkKS*tR|l>h}Fe}F_(Kmbq%|L_2y4hlb~-wIF!-Uu{NO3uIx zBA!eLX`x7?BR~Ke0xF;3Ow%JxDglw8001!Bo|zy_C#mQOfI|s`0BND4Mk62^05mX2 zq{*QgjB0wCc_y1vA(KOCDMp5p1({;AzVd{F*bu=I1Vj-KM1c_mL=htCf&fO4Nh1Uy z6miEZ$~f|J_@4doflU=%EBpkkMA}C-8c-wnNRSwSk4ykV4W;-b95rj%mdmofsm^nq zSryk*M%dWc(-~x;PPJ_Z>12vx;fv9w+if@Vt^3Dx;Te_Vf|D@#wV?h&T9@`D#5B6V zYVYr;GI$d*72m1P84nn-saWJd3h-vZ-vUW^2KFjEiE=Vw$x2wjWXz$l~ZYoyBHn}nn0nn z#wDQ{;+!%#lC{tzDKTL~^(i>MHVC4cTvafzfjSVu~s4K#<-4j}-g0yyCevx#Sz<>> zg(=L799! zgpOGPIAD1B;dC{-nia$78Rb95^NhGLnfCRxrrjYZ-Q5+(090G>;q$kV+!1zDQ zH5>=+v}83x4EwVw*}He|OpVSOunTVAOQ#Jb!pd1_ypEDa7_#titEhl5?Un6?TfHQJ zco}4da1l8PjOGQ%tx#s~fjGSi(XYS*z%2^~a74+D=X{lN@`IZs&^Qghp8z}yMRc21 zB$xs2Chl7*PY$qv;Fesw*0=|q5ir{_DFWd1cFeHCC0q$&uRvMTwF?)u?>Q?ZYPLd& zayraTF^mn^Nr^5PYe3&}6}vcg6~!>@mOZM*@vJKS;am%(OwPvdhIqZIwP^l>-_JY& z1q4o1#$`LC4q+Y;AV%73`n;H@AC)i;3My}ex!IQM-P$gCk#}6#?<=OQIjZHH+_B#S z!23h&4gh!`KlB8V9jAE@Jo@yg5!`iYFF=}hp&1PVHxUFz*vM`~J7?Gt+z{9yq#Y0O NcO+AV2@10;Sx_D#6BYmf diff --git a/util/fipstools/acvp/acvptool/test/expected/KDA.bz2 b/util/fipstools/acvp/acvptool/test/expected/KDA.bz2 index c55f60203c6bcf255b50ccb6cb705e681aaa2fec..aabc63b3519bd8025ab61307bd326a4f5b1eb82d 100644 GIT binary patch literal 829 zcmV-D1H$}5T4*^jL0KkKS(O-hDgXpRe}F_(Kmbq&|L`ZM&Kf`O-wIFzULNzw7kizq zFx5}c2-13JPf#?-4FCWDBA$ay7)?bZ5vGg+Fh&AkMK+l-F$k0xOpP%x5rCN(iRz=& zcqz3q8Zt5rLq>xTVFD#c+M85rY*T5Jc&2HorU~UVG#;Lkh@*XEYs7e)|K52a=TPIUT!?83^*yDQ!XdJX6XJ1GXODLC9QSXm(*Z0a{$NGTZH4p1g0 zvs`vnQ60#Zw2g(PSY@P_0U&jfq6w|6dz}GNt{FVN?E^$CysHikJQN9vK|Nb_RVvn# zvc<3xXnc}XSg!dL11zFlNFE&JJ7kz0nC=o21Mk-9KZ;gCG|&~PZD^} z5#}Ql8zPtzQRdaL!OJFg)HKjE48LFR_5A;Nh6r`W$S{zQk&uv(kmmHX8_gDD`3iH` z1)-k6m`{2QK!r;@*U)N03X`>DW1|r+tGMN?q?Lw=SrsG1Gz2>4H5b0QnF>Z{i$alp zpoEtaYN0v?TB=NWusY2aVq4%E1MH4vN;+dq0(j^FpiDFdqG}YGtklk_4og?Xu012c#OAT3pkm*ZYG#`K!leV?%<8{l0GVdvS`-APWHVCYOhue;{{nIZkP;|xAI02}P81|1 HMjlFl(s5`y literal 796 zcmV+%1LOQcT4*^jL0KkKS*;^wH~<7Xe}F_(Kmbq&|L_B#&Kf_j-wIFzJ{_FPXJ%Fi zsrd|(4K$jjMhFc6GyoA)|0#*+r};_ho}>T(00050p{7P5B1VG{G5`%SXk$Y|Kn6oV z00004N|g4JeyC*7o7BnbOdgxX8~dpT+EvkUYE+nv#P&`+UAB?qubKu)+O040H}zXcBc9XI%R zS8i8_4NX=ib4aV*x!qFjf_7NOfiynqmz!5Fxu81j6Dv^g z=2T5u1<87&E1=Utg`k<`IEzVc^9D4?vb)e~dZn)NqcrJ41{pP!#bYrA%109-$s;yV z6Gy9~6I->)%a?b#aE7OxC2qQHCRnwwM6B20vrW?zc;1oeImM@hQx!`+8u&Oe*`7F% zkdWK_KL79FfJ3OIG8jlmNXSS?NNuznkHwX|Q;QH!3`%0!aW{rGqnlI9SUh#QXe8(C z6x*+Tw+$^4%9WiP+%yD{_G^t=_Hm5b&XP3@_pyo6MOaMMVQRvMSlIzyjPxsd0Fcin z%G$NdVpt9PkP;LU5mw+@hO|>Vq&-&etY)>2SIS`_Ch3XYm@*x$jEN5*2VrOC&2*0= zn@ZKqn8O7F#U6=i6ol3xF~|>qW*P$3#axTtI%EI@50b<1w&3S$G0gS4oeuqkip^>% z+o1Y-G@^7D3EWrgPrc+b6x3ltWtGTo+hQj3hTQRjg;VX18m>` diff --git a/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 b/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 index bf22ce55dbe4dab4db73168c97fd14154f54bdc9..2e5e8b1581161af2c67c9a41403c390a6c50755b 100644 GIT binary patch literal 714 zcmV;*0yX_YT4*^jL0KkKS+XY#5daZ4|A0hPKmbq%|L`E7UJ5Vg-wIFz-g?hG0QN6v z44Qcpf9k3L0000014g3_B_^N%00006pQ@WxPyhe`0001qN;Hqv4^RUql=KiiL(~R< zr7BH5O(suK=#8nMGzNgvPbr|F;m?_K@$Tei34CH%66J|&iED{{VqB3eaV}SG!AdTW zRTkk99M|=BU4KJca?2G2e-uU_u2-kk63mHjM7104yl)cQx2w;)*{eQ{I)vf?Oc4Y@ zFhB{#Fck?vC`bTMl2D9e7^j1s4c*?K7Vhrto4dB#Y_{8N-J7=E)12n>Z!Nakw(joj z-QBj`tF>Fja0T;o9oBA*fPR3Mhvr{9I(A~Wm31jp%*@I`8}e4*`kvlgJ{gk}JJia| z@AT*R4RID=pPdNy0N`I?9bJ+jxcL$m5uokUsnjd3)pnObxI0y=npeBKRYf~txbAEY z0O=MSd~nGY6C@3RqY)EX&SI2Vmdgyn!X2A%KHoaEuUj8kr|?&_s1%@!JV zY{J4IhKFIJy>9Z>V5hRf5e<$SAh3w7J3m(&sh#tjS;*F0%DcphNhOU=8+#yC7Ka;x z;y1WcR<&|k_5leIGFo06dWcGr)?St>Gb<)Fq>{>$Zt(0vc8DS%;fCDK^Ag7t;av*W zln7ZMODv_LB0ME=-}0Xkl1Ru%LIx28AYlR!Mi3zb2ouA}$QVF`3?c|X!UP}~Kw+3n zF_B~$9LOWV??B!hl;cq!ED%Qg3hHyhN&AU&#J-1t{GwW-T~0Y>WI$n%lOZG`L=4FZ z0vX@(IU-$#%96u$lT=H;8qY(cGD+k9;$flNr$Ob?XAT_1>HKPmaWdJiNw!kk66&Qb wN|ts}E#@L#eD|GX(j}$1o3z+wT*j{+9x*O4EXbA#cR%9pNT&)C7DVBKAef9nHUIzs literal 694 zcmV;n0!jTsT4*^jL0KkKSu&t9kpK}d|A0hPKmbq%|L_2yP6{ul-wIFz-tx~p0EfMy zjGmbjf9k3L000008Z{VcC`bSR000_(s%=#xKmY-t000wJN_s;>Kmq8Q0001`DNIb0 zBg!AD13&-`l-*JeZWj)o{-$7;!X=R{u`QJ*WhaW06((gS&6aeLO#~xKl4HrumYybk z9==5<*(M51-iVi)pTWz-P&D(D2&U1OUmfLMxcXxK~?%QtF+O6WaPCGVZ zz|GOH56}|O{LANFopD>rx|FJBW@R9a`D<`}Z*MLi49SU|>Sbnlx^w&nxQj4P&V+kF za4)GHosuB9`4ScppzYJK)GMy)?p+4p?N+X7UheHx6zzuNzpyw1q*!tB!z5TtkTwR4 zL``Qoicw};EHeuTc5T4}uy>f&=DE&ulZNUsO}e|gs+6-dSZUd_3kZT59fpqeyUSUE zp34kGHaKX4!XmWn{hV&5cg}HVBUy7Q?-D5_mNhtS?15BT9BvDU-r-GJ)yZqv1SCYs zX?ShwAu3B*dRVB;teDo4ODavf!?6k4Ac%v88*@9%OB_>$WF&babP_r`Io!!IWX_q` z{{Aw3*bE>-1`z}xVFD0F5FrBy6UoWQ7(j#!A_zdj1RxkdVVF!a48{`-7@~gG?#AIK zcBLj-t^S9~OW9K468Rs)^+dFZa&*fwV>2@>%!HW*HKJOXM7z#J+Y;MxCmr2p cW!7o_=iw6R63mHVCuROFQ6Re}F_(L_kmm|L`E-4hlc#-zs1WpBijDl}SjD z3ZMX|c60$iiLEXOspRqrf@)-FdI&TC00^porUby0s-LQ000000z-SEs0BNAm4FG5& zs(-KvrcG4!A^-pY01O6z&;SOS4FJ#vfh0zzP|2kprj4UdQzKK*G9zi_Dh2G3jjYPt zx03J}f@I0W5JQOsG7?h+3Sfaj`=Sy6MW7%@Xn`ql>u)`+J}lTvi(%!h-jOZTsk=Lp zhJO9hEtZ$1EO#^JCpfK&K>bLzrnAx4p}-#6HLFjhR3VFX?j=i&PaCHN6WNEbFo zHUS?Ym4INv1H~bDG6W2zycjTD+xC7u-+*n=zl0C#@vIofXU@;daFJqo(T4vAHpI@;pfA z%sA??bjxUM_$zqbr(ve}j6p0z;q^DJVDN|{(7{`JPfr$C*D7BOlD#LaS5xKir_kxg zz?*4Tw5in|FS#$BDOQpy#?ATo%jf+C0z2%W`Yrd0F>sliWkC#0GUug*H{cf(&`ka< z<=sL0u6ssz>gK?A79HcR__eJSiPX!9v~B|Xm?YNmMXYGtw&QLKqW?(AXXhshg@AQbooj@+0Xq3S#=%2!y(Zn+U^R1;aI=^l(*#UMy#&IcQ4#M7+E zPS)rKU)_Hj#j-7Wk-PG=wF#f&>-5Q&oFsnLI)rd~ow?#vG)>2&OzBrojXdTDaW@$O z$JZQOdSer6Va3<*Q_{W!XN9Wt5Md>x8oV3=%ImZg6*wDP+dD8OUdn$d2=^rGF+I6i=ml>4^L{SQ1`}7m!`m(r;w)iCSBWk66L(FJP9poO?)7S?`10cHFYi9qG$%< z+#K~dE1C6|a3PAkOW`v*#PAOmZ5gH-^Gd-UWe0(CKy32o>rRRv21(}<_q#O_hTPIk z889EiXIXj%tdAoH>cIyW>)nG z?t4(q9B7jcj14uvV75%qrG*%0sndudg)i(i&5k#9`%t-4?&%)bZq(71kPo;G z%vCD-+_0u%NE0ea;y_`paZfv#B%8_bEZ0bPzM&!Rx42bV)SR~Aiz@Mtpjn7AP`f9| z_l1_FDqW&_VY*e*p}prLg7U0$)hyr!YODRNJBnwHdofv zR~%l(2@`Z_o7ugMcFTC3hCb$Xk7Q74n;v7i_jeuOwYkRoHexv`FFOO?{ZyK=l$#N8 zUh=BkI32W?h6oUcm@r^*T+zP@lwUpDZtm9yvNzsEESG0XqP`ss&rzwvCUOYyv`QBF z2-t_cxzrtgg_a+1NKM_AOU!u(iIK}`UaH4YJIq)Vhrp{v#P2{*!VMvfmnL*8a6qGu zg}qLp)tYY7v1ZJBkV(Lsi|8b%WIsAYI_m+}^e2=#c8k*47+{j+r;hlmVLgi3E`#f4 zSw*)WVx6{%HX8%IK}S;QJf!RT1tPU`&aY)mhr)%lZR0uf?@g)7ub?H>zH_+bj^PY&C(ez_t zWmQsi?De2f30exl;llw8*Uu-*Sx(;?2e*us8yAOtIyvS?S}Qv>R*`JL;)_vFffX5$ z8%W8st85mm^*9fYc#IF#;;p7?x-HBa1UJ_!FeM8y*S5n`GkdnVjjPq3AbW(IVVxko zt6bVYThWb$CmXHDr>oQTnf-ISXzobOJ+-Z-u|E<_Leb(6OwmK#Fl(nvueP`9zAmn6 zSxHbpmaCiFWBB};uvedAgU^siw!ExEQ+La%1T2{N0?kGJ&;q#66RRa zS*KZjA~D4FU<70iFAzliuigu$I1SM$x3{KI-D>LI2c?U%LLtg3&0^y3toZNLASVjL z(nmQVY8<*cU`>qb$4D_Et9ew*+Z1#KUuR)SX~1P`&n&)rc8$&6`|{?uI!ZKE7C76g z+uxrm)4v@mj-%qYk$Y|UJ1`uG?%?@0ANa#S&a&($by~KXN z2}5z`$DL8=ieT1WogoV)#g4lTX9%nq{FQJpz+6sSHulpjgpUmH3VYs`D3mhWFO7qg z%|iq|)?MU+CZY0m)ThXy8D9)8IG5Plc0K zFCPiwS6_>DlaD2Hrwz&|<3&6$ETN+SR?t{j{{Nu*0Q&y_K(xp)QxJL4=773({v$zx zzq=~JXYjIQ;>(S}Q<4=`TkWD6V0DcgToA%Lao72X&XPOOv~C7e(f0CC<6%>`L;{5! zh|Q!|<|o*bPlM1yuBPt%xJM5QiraZijgeV6J9f)iB(es$M>7J2Ia30tcv%2hIb-II9BRs)88z zTxC^qzfeW>ec22+@tuhvTQSTqj2elQ2cGcDh$}cwFpO%7B9=sn^fD_dsabUHTBw|* zzTaWn#$+;5;cBkOjn+z3U7EpB6A_9HX9aOt zj?)FK`(*S7y}kA0Vi!FzFl5PNkTI@t904cOP)X2Gin6|?Y;bWcRLvx|BNfr(t#h{| z<524@TeW|m-k>K~4S=MQlWmrKxrePl6Hg*!^vN{=jY<)@Z|A&nZ2z!^2G nfWfJ@kVbdDC^J|-zMowTOo0M-9oZlkGwfZ-6yZWZ&cJu17V6(` literal 2562 zcmV+d3jOs$T4*^jL0KkKSxqsh9smk+e}F_(L_kmm|L`E74hlb~-zs1We;Prd&>q^T z007V)=15gEJ?w3c2&uN3X{n~rBqIVam`0fm2&#U-ObJSe10VnZ0;-?-VqrAJDglw8 z0006ipXsL38kp5jP#GEk001xpO&Sd`0002U0VF_!NK?uW&k5mb-};($sW@o&c_k9Ka5?%h87o#`lLOAM}Z z5@+j_3d2*OKJ1>flXE-8%p(%*@b#mn>dvvbF?I4hNai?k)ne(E z*Dc43c-^ONQ+!4smM(jqruEDo5d>NoD{o2Z;>!BvOYTW4(t7y1pDap!4ubd-Z7TMa zI=mI|%jZf}q>8b#e>nU90s$T5Ao*`4MIwbMUT!7?isN;tp%eH8NSX=0u34(Z8)r`z zLi;(e9(Mz2)+ukCEEBnx6K=;tH#3CR@kOj?!)z_N$3_0JlFlPJT;_f$4C>$)h6;w6 z%%|-51RPI*SnM+#+UHT>W>UJwT)G&HQm~u%8%X$K-(rv_S-n9`2*lIRd#Se;126b* z<9N1s*Qpy_MGY9D^t7x(n$ASkq8C_vgBwoZ_{iIq={G!8ij`uo)eYA`mCbg-NFMRuf0wA58b3 zN#?#4?=ZR@PE7R8xwyA0;uLzpyDVcj=)YHmLDGLfp_FSrm!yLk!6(W>u0jmW2a*d7 ziabs_c0QD6wn^p8-I&R98+?Gg&F!!hh{E^P1p(39JHBM8!3Tsdq~_hh&1=H4mZjj# z^#kYNRSO;a86dt`k(u8Euq!SVn60{T$;NojI#Oyq(mQ~jmZ8AR(%|;Si4P~ezj$fELS?S_;Kr&?tXvZS zotFy)VD~6w;PeV3iMSa?%X-O02)#zk6?pI`p6-wk)Om&#sx#0RWh8nn3o7SoVp&f< z-Mcn9?R>G)GrHNjKP=5Uind!8VLmdbvGfZuIVB6SV?Os8YEq@z zC#D;vT{`8*tF$jF$5MC*E{MbowWds@;+;|A{d#Q8G+`994kRI;1U6UJ)K>z%jNub^ zl+Enk#=B*|W&_U?JoDifO;QHD?t2;Cp=@*PY~hIdQeJjB-u+aXvXq+<3ccl3xCnOA zUKk^R4=`ZB{9N8&xTO|8?YDPmdD-RkVwOv@rQR>Op}FccIApws{N^Luuo&Rj{7LY?ndxvn-<6Ut*oM ziZ&Yqy-p*kbe>Xm{TxWJ8fg{}Z=sjXadYjij_Q@_TX&vK5H*3IJ{?e)u~)LtP|{b2 zx{=Zmjsj3o&XdfE6&67zgW7h!odrh$%aSQ4;U2vzo5uPZ-r$d-Cik9Hrp9yT9CX3ItpP&eszquTcQ?Kv#8n?3gcncoiZz#baMd9o$Z5s*I^i7UmWp( zO^ZoiU&OWLIxCKZzpY#`9y#O&$dFdvlk5^O%BE>lB_(p!<~g9CQV7CB*v%3IEdutd zhYqMXu~&}Zq_cgFqUN45ROL>Occ4|yjU~ZPHx3bu?u9l{c{OLi3#M0gQrZRpIS8In zL5LyTUp3p6f<<7*V6m->w$B)_PDexQNr^3mr(4_FJw-%lU-Zxx;m|A)-$JX;xrg5`?9UWKZTPg7DB_t zIW8)y-)#`n1FUHLa6<^~$6w|nI!`yDXu=s&N88CmjfGC#5OE4S5t~S^IG<@Ir#p%7 zMx#8z8M@f)RX7(V6dsV~i>^AFx9tafE=3?;tHS9#;<&G+IG{X*ugoPWus~MG@O5N$ zWz4|DNncWU6cYr9Kx?dnLb(f*Xn~H_so?9XT_m{0MoQ9MNl7$vIJ+Vo==g%}ba}`S zM}ClnPA4w8qYhxMW?t1W+?uLUeAISjJ?sQ?sE-CB4-EWP1;14UG48)5RdT;rMfH8z z3^?(f@f7HXhrc$IoCZ6FY=NDDdu2*vM^NEHC7dXQjgXPCf#HC>V0N|AinA=xB$FU! z(K-i52S#g64?#KDs#^COY2aRMAC(@;s!P>Qm?rECu|EmX}Uwj&kM`>m4>Nlq7JGO^zMlGTB; zWnw$ugzvTW?p+U=rU*d3G#HsINyvoZo_YU$ZZsIb0}vTC>&RqqB1YHODU8z}Z;y`# YW`Kb^j_i;N_J76PkxmpO6HICcfZoT;t^fc4 diff --git a/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 b/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 index 20d0a9080ab03ce99ce51fa4742f25941333d0ad..a2dca779f7f816ca5d680fc9ed4aea2afd315209 100644 GIT binary patch literal 3423 zcmV-l4WRNuT4*^jL0KkKSq>>Fo&XGce}F_(L_kmm|L`E-4hlc#-zs1apDmr<@s(R` zg=&RUR1ImNtyX}gy4Aok(9n}ZTWvfMPfQa{7^GBfL(%{qpc(*0RR6#M3Q{1@00004 zRNhK#(N9w+s2d5WGynhuRa5`dObMpcs)PZ62xKuaF@Vq-007fLpc(+sB9b&Ik?4;^ zY3PF{fHW9tSUI4(B$VZBLv9+%HV{mtq^5HwPC$&|RHP7T1R0%mqJSl!AeuxLi~V(e z0%m7n>)Lv!zvn!wdwXwgE3x)7^!Cq6smYUuHxts_w>rQ*l#X!$EWlwm7%sw)7L>`k z0zz&Q>3zU~lp7&Y-2iTdUEzgFcft>n8zDs@qgX(9z1r{4UqB$yqcp8-tlnp;h}9Y* z${@LtCp%O~nvlt*#%8!O+RR4#P6Zm)(V(0vpkzA6P+Q{X#H3I4L@k?9qO-WIO$2drN}_*utTxOep73r z-Qp|p3#anymyvDPXMHJcnfB&aExy7$ZQp?jb?5g8!=#A^!o3zytX%IwBn8cgB|J6^ zOzI8R_IU?wQcf4+PTD)E-s5U|P_BH9kv}xo`qG?x^_&3eF4=W;ixEkTU=Tn`4 z>n*VqFetwZm0x+ki_h2Kl~!08CJDR(@3Gciv#e=@z)!hTnT$7@gf^L)iSYPw7tYb! z${oi6cUUN#&=Cr>VOr=1sbO5}t!4rkbp*;5 zkG58RwKG*p%rB_JHrn7J8fss6hn>*vo}V78=?mPMVVw@Y%QR=Zh%e~ zrOTz|l1nfa;P}!_G*TzZiN^r(ts|X4o$87X!`?1BYt?1&?!zkd=}jcF&V(@X%f67e zv8mo)ad>JT6z1<0dr6@>8gQ`Z87E}z9KI}D90(QCY_o3Nj0{p`+PWpZ%7+c+yhM41pseW&Rg7<&)3-L#e} zSJIFs(|X%%yGbr?Wz=Q!Pf%DlR$K~X`JKq`quz4^F_Prw#f4i&Me! ziZ3#*PuMHG(K=2c0SJ@*It%Vh__172mEs+kGVEDx8%}&@2&QOpIy5S{Hzw#9q-469Mj(X_?6|InoT)JNH8p8m(#D3R$Cc!y=S_TQD^Dp^gAbt4%cp0lx;P^ z5ZzAdaoS{g0{!b_!ZaDeQt3qF2Q)?RD#6Sd=Fr}=O!~tVp`7l+y}x0f80dp00z%`q zqLjH7LtLZfCG!*pIM)&(=HS_Bu}-ZcL8!P+VaoVry>l_9>%hNd8#6#7HCyxOcdwz_ zh1ZXU#=fx{36B+T-GYvmb~yQv&FD~zk=*VyJ;Og@3(!$`fo9U<6}Nfk;HlL;Ynr;C z&E2tsCwW?iO+m46Y`DskXph=Vq^|kx>L}Wt6E~i8G>3)6j&%Gg6mUZesCL^u(Q-2` z4J9Z<0@cy_F#J52|)#?vgwtwWNgcm0z1+JJler*pH3TG`9XAU?DAdy8ihr6%T;BsS@{txp>P2hfnU#2!!~ zzKd&YMBir8$h@K5CYs|e$SL)gs@>X)gd+Es&q9DKq0P>z?m)hoVJh&ri`UB>-OyNz zh)U!6V~JACbZZIQtq;N9Kq)maJ3B%#w5_o5X62vl+0yLR$ir^h!@A@%@1G zzK8S;g40zUIoz{jLs6l~E#Tm^mXPPLD9z?^S~r~>Rx%(bu8L(-z`XtPZ&OvErXlq1 z;QFA~io4aZ_h=^!g=Mb`dV3L&7~Cr3Y0{|VC%-X1Fi9Vs~XUcQFM!=M8;WPPf2b!w?VVRoD)0j z6}^j_6>Y*O(lc-+kB_}xlp~6lSc56AokdW9(NS(Vxx+z5MYHm~g9|Asz@@%=FE4bp z)Lw_UZ|V@rm@|}sk*Ml+DBY&wMGHKHY1Poqvm>q1E|jlO4234UevE9%s7-ve>8mEr z$=?{0ys8wAp9=&+4lX9-efD`oMATqa84zg=U1nU_2{+0Y=`C$JubNu}gs*J;-%-o8 zv#D?}z@}4;1IQ#=j+%&`Jf7*pml_Ud6j8gDWAnkuk2}?ZJ_d7ikZC=2nHKlT1m6&a zg_~|(W0!Y+;K~TnwmM&v!+l5!FHM-YZ{$d68R&d@wShwgdZDiCcGLDNNxZt_BE`eEB4$f!Cdw{Tdo$I4EmACMbqY*9> zNa{{}eKr*(A9}r}aBa=-^eQoPryEj{^Mnz?PB@P#d+cOtRjNZ}i{+G%L$=l9qv_G6 zZaD{sIM$|a`zEl`uN^GkoHw;4FEprGY~iXV2rI!viGOk~d5AoTrzgreGJ53gK0 z#!WZajd%29_cUY1<6}yj^FWqPscWBJ$^LNnbRL)o16Lr|ja~{lefV9pA*&yFaq*Vx z%gb?(MctlQZRVmV{hCHkk-T=mZh-GB`bdJvVn8P=BZM)KTy7R7nl;6O?@=(w3z}}= zfmQG`P7E#D`LS&AD5RYnEW`y?WS&agGjgGVl9Lid>hP3n9+dlG-l{9QAy~-B%DLGJ z@NWxCHx(H-Yf~@0QEGLb1lfbKuV+>uTcBm;^{XMpg) Bmi7Pu literal 3396 zcmV-K4ZHF}T4*^jL0KkKSt!pxkpK*E|A0hPL_kmm|L`E74hlb~-zs1aeUYL=7cFKn6e>00sbQqd}%1000>PB#=N&q>P@X(A0V(L7-zPLN&3f*Cb>~ zOFT#L7>NP|BN8NB2vKB`AP5uz0*Q3u5CSBU0UMABKX11FLWqfB@b4cCdwfyVzF#eB z1#~|oPfwHdtButpvOuO*VQY#5$VaL`NiY{p=|W^OfsEkEX~cxs6#aaH14t>^B$qZx zE`gj<1Bwm|kdVvI5MaRHjrSM45GUQLN{P;fxV^VE%}Z>n2g3|EQ22W~PsO}MMtx`6 z;EPHd;kVu=v?rK|J`5>&Hhp+01?^ZFdV{$8!w_5l%1_Uj)XR zHYuwSl02LVcF>auDG|_K9A8(xgLR~AuC58Tf&x?W(6T*03&>#(Sj{YP!m$~svFvn8 zmy(nR@c$NZ-Y`?UhvoAKo4j$+C!8#s=MtL5uS|T?!vgw7K2+O=lYb81=q&hBfpdje zQ0S7h%U81cAN*FHnn87H-Wd7e&~;A%Bc8(vVqN*hmnW+!=i(R0^9u1o+UFy82`jC9 z+SY1U$sU(`>>VdI*F<5$M028@ir_d`TF6m><%g4^m`n`%ju-1U^fdBlukk12SLDWZ zt{>22F=)DY?`MzKI5)oCQ%NmHIjQObUk8Nck!N`c;8BWrHSF&$KslSXT;B@D9zre9 zhNQ-?Ib26aqvqe8xJ7*Y{Xl7ZETp=mPT&lG5Z(3h?;JR|l_GTv3sF{c^QymgB@sCT zBqMIYX2&lS@-p81_95Fyuja}dW@grX0{{@_Os@RIk&Ht1hW>;05x|g4~YI2=ap+)K{y`B(B-s+I`)Y zS0j5;I?1LZ?r85+0SgUVt~uz9OMorEpxKmP z?YmUs=g{S}^}muMq*@f)K^oM!eh^Tfqbg=Sb6-gCYz*+bdFq;>d<%$wJdE{u;@~-- z(&&Fyd2fWKpMYj6(n{CB9;t<2J!Rx2hcZimlx@jL-8k6QMKb&tCyMkos3{@fumaQZ zng*KDZkOKK1e{J;d-!|?mZed&5uKz7Pv1}m~3I{mwuXhFf#EhCM(hA5*e9J1~6B<@kHz_yJ@~t31=| zqQb}PW2nam;mjPlN=VKkonH(UtIUe(+}Qw_Cuh6j?#~p=2dO-5Cf+Rr&aE8rjLJdv z0sTBqRqwtXW5$`f(yH~%VM-Ce-^^kT(5atCsi-?`;_KmV3@v}Y9{SUG4}+uMdoh!2 zp{qW{s#0+9)Sg1FWl%Ugoz){5(^Mz4nkVVq^K}$VVD1i7gerJr(_3fbVobnm80G1_ zpCgnbJUO@{D}hS|ijhQf_=6?0z@g22#)oSj)H*5l;CSG)V9^iEi#u!==dPqNe5Wbj zP)X-=6{^H-HU=%fa)l3$@f7?UpylMh@v6->{)(})-A;q>P$(zY&OBPrHrRdV&u%?7>#F?e z#G3iJYVA&~&g1io)t{)A7#?z}{%r&)mYiZnLkOy+FDdrU84Ay_>B&;n4k*pKPUPpl zYH4{k=%jz2KS9W1r9%0Qp9c^aK)y^inlFdBdVp9cLM9uH+w77=LK20k+?up0^TBoH zHyQfoJk#dHDj{Y#4HMV(B78}HCf61|N_wvw6!s=+(bYr)AU_Br-A85Ro(N`Mp*0kv zf^m$)#i9jApxSrQ!bTvxV|%1Z#y%_+I?)hCuE+~mBeqp?e-5fy0I3( za?Z*kk>w4_rAK|KJ!e}_9HqP-e_cpE#LYj*@w!>Z_oV0UV>FR65wXZPjZg^7gT#e z;^8@~He%89P7cAYHKY%Le1DvwdfSf~YOEr=pI^|#G8#e-B`Vlka-n%XTTUjyqlgR3 zH;z?nn7M2gk)YQ()t{a_ynrnA>Q+wfc<{r8%hf98!)8E*rnoEMTi9*RQT6m$&Moa- z4~vz%I?{>Z1__Af1SyXz7FqH9<=&4{S%%Myn*nig-YcSxgnmzU3dHKBN07Nwk$WZS z%t!B&=8!)Er?)SVvfLX8Y*93H)0*fnGdzy;?sKj3KD4wUc!^OC*W+!^4~ASaHj7v5 zap=2^opoA=6px6ACslF5C6GM_PgC9~zq868Tv~uyazBF_>)cD_UY@c*;RE=g2vkwm?faxa%h;UAep?I^P(PsPOo!Od&(;wPKs^OSNtLOP9!Pr={3A zG8W@p>eel`1l^(2GQbJ7R`;FhEASuRPH|qe@GTRjaSA`^YE#QZsnZzQWwp~ZX+R|S zHTiz`4ELEDU9lXoIAgT4)6<>#FMqjw`WqN~n4>=bf3DI)bH7m^SP2|%G(5+oZzdbX zs~v8hj~xnQMLFUd%h+7G>39)~csQ8VH`~A|^S95(-W8b%V7OJ)b>l)nB^JBr%QGT|DY8m3ZtUlq999b2h2NU&Q@LCo zSxSbL22~TsS>smwMm#)KRi8UAluKAQL}qdWU^?VwjS*_JV;xnWwClhDtsUm?Hhwyg zx0$AbbI0>6N>lPQn+^RV^icx! zemr{wivzZa!=sdEx=r?AhAw54-lPP|tT1?rnukqBB7sQ6U9Frf$*4g%+?zK6_pFxl zt4Seh7(efT=mW3gpglOTPdVJN*KOUTiz*sJMa{HIpJwks=xshhW+a|qT9{L-HoQr2 zP4!n3E9k5fUP(m|Xw;y;oU@{)E{fVF+8T&$Vmux!v3$$*OUde$qoYSFz!1NF!WAp7 z6=?R%`oqj?v2PgGZWm%;+h0%JI7@&Xs`H^;$!S87^*65A9X z|1^C1C#(Uoo%N}#qD+}8J#7pRotGx9jj$vOP3glzHEjSGDLyIXgk-e46#M2%MA?wB zcLkO-B{tEj#E-S=Hq15RSX$(ujhmhDE?x@6SztUTsV$4d2{EQ1WU#($?QpqlMxa*~ z#FA`r%(^?s9!C0uDA*@Rji?zolB=jor)tO@(*Z?eIk6N^d`0?IF^0G`@~y zBbP-$;+Hk3!7hpy;TH=_wD@8aJClAX6!Ul)Gl?zrU4E&57&-i?DfFdMwxWw&K`LgZ zhr+m3R)^E3Yas1Q$kt~%5H8t_Oh;ifN6h@P%k!N^V-?t5117C;86D&ZQtM+d%`ogb a_UdG22osz+%#aJ{{}*yaI8cx%&p(mDFLzb| diff --git a/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 b/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 index 5c99dafb754e55c9a160a6eb93b67537dd79b6cd..b21ae00a172b07e4da861e1bd8fe7ab921bca1a7 100644 GIT binary patch delta 3816 zcmVCljMp;rV|RR8t?G-9dgN?;Ly000qG{{R9?RSisy zphk?0ni^@L6&@7y15*j;Js?e~lSYjh7)4LOOh8nC(8vLQpay_oGzNeGG|*@UfHVmt z6Df!z(^03S+KfQZ&|@Uh3@T<-W3+zZh>##cF(O6C0Y!)c1pq*zTO=d^ihw|kVg#RV zt9&kP{_?twk@)t9z($~sZpC(b?gtRA;x|0mp++)jCX56$78a-{6HUuy*i6ek5lAuq z;c9LW&}FB8|CjRqegFV66)c1ro9u9MkbgsEjN&_fS=8^Ol#2Xm7wC#3=vn{I>XjtrZ} zuG_QVCl5kCEaBdBDp!D2!U>wmLda&2u3_HZ$ECY}>D|VjWb)~`Bi`(_+XNFnQ_Erl zcejy=sGH^G$2J!oi)G*_=tP3^hb21FtOO@G3^ht20aJ>;)fseq5Z+43T;uc^`G?e` zJKNn^TrkA6-80nNT+PehE%eV=MO_Uob23Wi6?u+y9NIhxBP3ajM&Nrpz>~g;5%P+R zuC{T1J7*a3Xn}7!3@{EzB`f_mwIbS6}xsB zA3n>1;&Qq=c!)rfZ7NSR+5W_;a`2}#e+*0#gEatFWCzl z=?z5vengY?9F&aQGGz*#iFVa%fkHLN57z9LH)TB&N{9A&+2!c<5%dv`mlxPJ+Cw>i zY?D{n1#a7co3`O;ZExMbzpA0&Cx$h<6@LRs3Btq;0faJ77mRai#bK}&N}Y^oX#}WU0R9p2=DNJX0Q-d6ne%!U=_uv+WLOGIoX%$ zm{v?~=iHKK+Ds;Y+p$!3;HkgU-AoJ-5nsNRUgUnCn7v3#`3>(Zc$0qv7=OT@U=&Ej zd$r%q-sqRK;Y#tO7V#6-9!ehdr#Z7i(Tealo4sCXn%%+W7Sk#a&l(B~OBG{kFiu_P zN>d(<7&>@;@eMQ}c_N8Qs8)e-iccxg0Bhoq~}&zb0q4b*aMU`;(x zE5q`>{hebcFk^6lz?1cm(SH?r94u?_h+MpeVsa8m;acpG`Jw+M{fi=cj+2Bb?HzL2 z>^@k4(~xr;^5X**hw}dqxCWp1_qAo7$5)3KrUi;+B>gIit;#qn@kPgoecXxK z6GTCn6TeCqhMUT^!g<3lIux2IEH@X;?xxvAAnaZvsL0yv_U-u{zke8RRQg(px(owi zp;$kIldS#qt%HXqPYDKs;`hGwCX@)tsXx>tO2mkN81IB8MI_MEMQ3KHR$i5B;a(im zCa>(_s#k1`?vq)+vk%Ni*CH}H`_{2*F&%lak)-_sRJ%grU zbh$#EluTxt$Oj=V>>fwFEH3iYacu2|f;6&F46`8uKAxlu?-HlsbWQ~qlQ0D%fA$xf zMdE}PDML~~sFpim55P&i0ZFTx1lg}}!SqiRNWHb-!t)u~q;ps!D+$Cc=_eJ>hroW^ z-wGA-kHXDzVfK*b2>nE`Yr4Li>i5er;lou)F!}lU9(|>+Sv3k&i+l+q(At!^bc4XZ zT312aK_WAl9KrnD_n&4h6rW~^e;j9^hU6m>xg^;%n^wfJ2DwnH%IN@ml;4|aeIU$s zF91Ves$4L~2i~cg9^Pa;^b_BkJ?qN=;q^oHN_aMwhWzE8iwY~d9N!u5oxAhYi+;cx z8pZ^M)`kJg^KVtNDfz1#o(Pub&}+?qaqE#$E$z8z8`p&~S&IzT>)|7Bf2svfALFbd zK+-Gm8I54&a*lJ~kL~L0OEmD7!fT8Pv&QtBt+%3T3I0E}Xi9?Kzdwf!I8O* zEPh@2DxEc3YZFeNQ+6{ef3VjZnZi6sX-E`>%YBef$i+4^2Z5q4;?XEJFuRkY8Lfeq z;m;HfE1P?uXZdOAn6{nAsI5HPK(ww@GTop$SeQ4}E(cYk6KZ`1Yr(893;bxzi7^5M3OX$Aefl2p>dc;4Akf z7c{<`Wa{@_#5(eT-!W$~7qscUk$;ffE{UMiS5?M&9(vwlam-L0ZH(541G54SddAJ8 z*V8b==G+ice?5)ttRg{wZZqSaVH!{nkJapV49EwCaQ#Nlw>O-#(UG`UEa99$}r<#RAZ2ZD$Y8hBM45v8W0rZz_jR1&rz zOu*HWQyz-5{J+KHT*wnef4$=34O>>)T8(;=!+>>o*3dWB zXtY@$D6dM)sr)mQEjG&;zGPJ$*di-@n9% z6E<-E50Y*Hjlj;V1d7Cv{Zi-7Yk0Pz+@=?ey!ee3FGg`;YrG; z-o<+1e`1qUL)C)|I8my5 zfTm80gPv<8hmyh6U0oE-`PTCS`$L=#x5(v<^AWc=j$?`{8_WBCA6bEGNY$ot=LlQ* z+sQr?^#w~#Z)5mU4^m|~h5)f^g3$%vJ$KAZu9uNeX)UHRGs)e^D{VG?oT{SN72O=a2blnS>^C_U{ zloZz^y#Zci`PG3p0KLoN^z0bZR1dbM?|uekcj^1$85tq@frV4eGEeg=@;xgKf7g<) zuC-gGufQ(jzgmyO!4N%h z2#ZP)^XS;8-ffYIc9AbqCt3iwE!Lq1KBq>!Bv#;IjNxC+RgGG4t4O4Hf3nhF7t=xP z7s6wIDOR5iiKUrQQF$l9Ya%rvSj!wNoenp5-Si>$NmIRE`25@+17*8SKZJN>d}~fY%ZeCe)qE{%{htjr{8wx!>i}dbSDiAesm_D-LD{UVN4VhD3-@t z5@{;Lq^`ZeJAJLW4samIs;|Vj-5u?SMB}A~lS$0GPuATS#M=}7e+@|5{mb;JYJXsV z55V_?3)MykwAZgrP7Q_QdpE9m={h#o#VCZIRU^n>6$uvg`hp&G-U#*H3gpVe1w%Zx zA)SLC3V^I1y=^g=L|FIEQz7fvI?ko~VwNX!=vMOxrk|kd>E#S{Dq@_2FU58dL1d&p z0jE2QBafm54%^a1f4){|bm$0VjUSJF>>K*J?0+a?FE*CJw!dy`yHt_j-z>_= z()a={YiOZehXy>0N?RUwAp+@$#Lr1MrDpaG@X~(=&KQg+^}x literal 3810 zcmV<84ju7AT4*^jL0KkKSpx>H$^Z>;e}F_(L_kmm|L`E74hlb~-zs1ce?1oDwpz5% zG$s^arvlX}^s(7sZ>zN8UO=L z05Ahh8VxZ30077WDyjeA1T@sC44N?jXbg=4qfHqA0D3?G002oKB=DwFCXF>bquP+r z(9>z4DRhsg zxIZx+NgZvAZ2I?uh-=F~&R0S=H|5 zGq5Sy1Vr2+TdLT5K2E6O)2`I+k&CqZy!mCjMmxZyiJpsplplA#pOj|%JMNsI>DlLO z1|cFa%GV`3)^A$MF{eWjISGZPTR8^P6!t*&|!dg zAe66@s$)7^jF+dF3i~7e3G|dW&waV$EL`H@0($d#SAt;;>>Zi=hs)oM+1}GYi0llu zetJ$BA=@!a-YMX(+f^6sxD&F&qwdjnKxi(}WC5hYb2zGjgpH;l=J5GKEgW zy|r54P>pf}^}8j_*-xTrQ2x$#d3rrWeFS5r#q1kxA)K~JtM);3JxO14;fr;<^j6hF zz)ujlHccJ?tger$0tgbxSh&Ygt-Wmzj2@n#L-h9PBm(0Yt^S8d>lJNMni0C`&N}Y^ zo@W|ruU4XbLOR~OP#~En^$c?Wt*u5^PhFhs%lf7jlN;WB$tHcI!e{#IRUNz)H}USK z1_-a;OE0{S>G_MP34bBGmN+Bv&3A2(*LPMBX~tpK2~8rja?Pz|GZ%qAz$lT5?`yv| zyU{Oc;Y#C3E%6i99!ez$!e1hop=V*M)eTsx(=aq9X)aw1?OdFN8&EKU*j!CIQkeQQ zVCmuah-sk%k|>m_g=iNTr1G5*2J*D2M?BqrYe@Q3I!d}3^Ex8~bsU=*6HinM@cCbU z&sfRK7~CK*B>iMGMO=;+HTXm>T!vzD5=p|f?2-AQ|0VktMD-mf2vf9m%Vu^`jKRWi zQW&J(Lpb1d<;V_~uB2$MqnfjO$$|XHc5$ca_o~(bqZpvEQ)x&38Em(3GdLM zd^FsvY$u)>dC;WMNnz>is`c}+ETbkh??{sAEey&|?nqxQK3puF{ z!NbXu;ULglUw7R}r2;Z)PxT2Bu_7PFJHitpl4xn7v$IqyFG{uWuZJ}JjUs8P6EtqX z=pL~mh0*YvmPcCrTRo>%X$?gZFmXA#e9=7Nh?d7k&_y(D4Oa^vp$nLNJ=rfUSLb{8 z(hy{OL|cdP?sFH-$<9;}rILVUnFtZ|`j9i+N}q-3oC+^3(+!nT&a2x zD-Hc94I>Ar7{m2kN6PPbk?{Kqn?>S;7b!zhK&X~Ium`|NzJR3F_(5qKen5dZpLtt( zu%)x-hkGxF;wx!fQ=wVKbMWvVZf^<|`A6YqxiI@ka|C{(ST)^Vob`9hF~f$cl40}t z{Eypu^^;JgNVnigA46(V;nEL*ezdPa+d(2Tm>j|U-h0op7K%^VqDL9fLvj&`UP(4h zCe^VlL9Z$ma=JhsxD5{iwxH5;UjOV1y3L2tRg_tE8;U6!OHTEdGC+y^?MS{I7?wQ#st~peJ1N|(KQ7B zAKP+$_&rt5KhuI}LEaNRk$zvpVFpic$w*UiSnC7@}ag z{Um;5?=8}Z{3WDPuA5tywQD;;qRB-mx%k}KUwn%9Uk*!)pw2(m(g|gZ9eH}rKJyiJ zs%_!WPdlT~6t;^I>aNp6cG;t5Z0?Z#nj)ovB^$QtJgoWVe|$#~doC{f9+BXcYpZg7 zbGjb98d!ZP5R=reGw4T&A+>@8bc259pGpfs7p!aO&vI^#ualG0dDL|b9pW~HodMlP zj#gY-y0{tgk;K*Ixg89hvIW@lPZ~jM6Wz= zgVvAtvF!p4-uUO@g3wIAt-g-xMd$*%O*<(b`L_fVk7Iq6gh(&jjQHo6MwA32^>#b?K3&!e`7dY| zyb^{=rlcfT7dHj>oH=nU>$31rh(Py(P+0AqPHtDr-RJc3>8Y+?6krS++*U=*_s)3q)L%>C3`uH zowfTXk^wD`$Bv%Y8SgYI?*x7NnbTO91A;;bA5usG)W%p!m<)$p$rR*7qFjwEW(1)I zU}$N{!b@;EWz6?cE32j zu$=CCJ~i0$I?9Btb>-ud-0>H@K|x}JV|lESI0+Q>jU=4dRW9>+_AE2|t)>SwWcwMbdtzQY(v!XN&`>!kaYIl+ zj%CMCd-CUmE&1D$cu%M*T62Am!jO8CDQ{?Q3KTE}i(U&v7kul#F*3SdMM0#tn9R?U z-tsvYZM$o1OZ5Jus`*jibbZqkw{f3}AY@qy^z3hq2G+L>J_D6X_`xg-$dq1A;f+G> zG{;%#=g61db0VcE?TUFG8G*fFN49`dJJ<^wW2+~yF-$qq0us&%GG@s({J zm4|DRujLK?U^~mq=}B@U701uX%YZ{#<-AFBXqkj0N8t{=@frc}Me>GM$X~wN0k>blqd|yom zV7?O@@|9`$Y)vf6ii?tXEo4TdJ@d5T{bFA}*4Bi!i6%5Pt+w>%V7E-ME#6H=R11#* z!= z2de;HOW1W2=Zs7XW!m(=^h|1z`KFrZWhO9{lAp9eW2^>R+ZQVs}1;ZebMD=sLQ2Lmf((ry$GXy9l7NQXT=P zJBuTaq6H4yq=|W1p-xyECfpk?RcvDQF$3t(vsLLSLrZ2wXNPU5{q|lp{R^7ab9Emm zdI=9zVJrpNF(MmE{<9n@%InDOp1^Z;jl)o$NFGEn8ug_+LCBp%V|q$8b)Ai|gYkSL zjfXo3OBl$u_47N;dys*AYB3@_Nkn{~rka0!XlgNAoIqsNS&WQ`5ZLTvA(}(HJA8ID YH3SLH9Og&``#<9DNT&)C0ASVGK*}>ikpKVy diff --git a/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 b/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 index d22e81c6ec1383286cef7a7a1c1e77a649517b45..e3c8b1b35b6601f76865f7f1eb0310b48314520d 100644 GIT binary patch literal 5489 zcmV-%6^`mcT4*^jL0KkKS*HUCs{j#J|A0hPL_kmm|L`E-4hlc#-zs1kpFZr}!h~N+ z8TWHavsF26#@lItYL#pXmc|1>psjT1`|Nf1*@}g7=-XZ0-o4LF9a6igyV%{HZ-OeP z{+L4nNl~Bx0001rr}zL8RH>i_fB*mjDt-VXB~=3;Xa*nwrkJXy{s5RwQm8a!003!_ z0x9J6GAF6&CQt^^GzLHb1d<5UWj!?>nvFb!W{_xTF_e(1WGrcBROPsS@raNhLNOvm z$si)YlmP;OAW<%z2>>FH5F+scPxZO3)$O3Su8Kw%dlA!M0$bg0 z_TxA>#}vTCOoC0m-BK*{#vqcY@2eK?%FI;M>}yHJFC7Ccn_{y*e_dRCd`d-FO$6CV z^T0+Ogph2C^W5D+(6qHD;fKUx{w?r(UqHuStOlo=@e{IbBW!}w$JQ4}2e!nj(0zV7 zKq;d%-V59(yf|!8!LCa6nK>&tT|0+7`oz1gYYGs=)w5dEde+QjWcxoJL7w2sx<-zi zEY`N=$lA^iWxdejiA&3}0}43OgzhRG-y9MX(D_in&R%^d(YuFou^u~?;dk7x54K%4 z@@Ob83C`|#!p%Qo-`zwB64~Nc4y!}?oHKcCixvTXdO}A>rR?I~%Mm1xE77(W{FyEvfg*SK36Pz2%GZ{FCz){(TiBhTo z_#A%ZM7PCoCYiN}j3YcW#gV)0Sm42+_v13&MnR+WMnFj{`hiBu#goOc2ok zyH_uZKr7l0RV+TT`|KvJi{>A8fakk*r-AIMlkb*qjvB?$fpT9XT2AFhcydBInqqcy zUb-__86zVD??(vyg~G9%swedl=xc3j2RYki$#ih$Rt~uA`LYOKh=b1ItC{hD&rG_|_rlz^ALp5@A zh`npoJVR4Tofmcpj%}b>OfLZ9HX{rq+5P3*=Xw?xudk^vE`7wc#s~5ne#Flyk2ylEHxMSzYe9vIGYS**9j#eiOFZ<8Fmb%>c zR+7VUdvLt#7##h7bUF+w`u6yz#yRlxYu#;IijRq&>MrZO+ummC|^5RxyU*dj}3d}hs)m0B_XVb})!oOIJ$sw~q za?oqLmY02YcjyCCmd4K}j62iq;Tq1QrFz=XVU0z-E>LAX+Jk*wL)1nsnXAg9gQ&qG zfPv2z{w+@pLp`~?W9s%aIf5NfD9TpPRvT`-GL6@aSg*Sx z;SU62lcI2ZwVw;?l*dDeb{I4H?F!}7gQ1NT%jK1uhPSt|VqtAXmw-!5ZutbB`QG8`6GfJ&TDDvPXJy-fo&FE#rlP#X;xS?yDsW^JM7N zH*zCyh|0rT96!4goRuMzugG1-F7y<9}KM17GYJ!E7kD3hju zO1thwLOWau$^*!*mtpv_G8iVr*bfRFEkREsxWgsfw9h zvbBBdDIl{m5i`Wy@%pz&WF6LpHgsFT&qk^2dkzUV)DJ>|Z-x<>gpEoqv$di|b=B@` zY%dTFr3NXxnV}8pj<3>3tQt}T!hRhpb4)`(LbwJBGb}!bxnVqv4Y-sn)*11Y-vM|} zJtc3&SLltbByJ6e5~_^~=Y(?fN|`6xY8?-I*d`j%(_^fF%g|w>P}M4tVy)7DEO-SG zw9N_A)+{u-5dM!@i3Lkn(g8N02pL8T!|em+fR4KBV4=%RjcZ;m0*q2GF8S`u20BHW zC}zhkZ)%zYsdW<~R4f;>&6hOD>B<^@Sp$U7U@D66KH(XS6QCyb(MJ1dDFcCk$ixM$ zA`R$YKr`8eXa?0yA<_Ld!&IRXE%{-d&XW%!Sb7SYyjVh|rm74@=3R0YbiLNlVXcGb zvU{{6>6fAIS^!?cXzss=G#jd94AY+J282^Rph%mL*=jpU30HB1h>|OKCx+ygdGqea z3r|KY&c7!C@zcV47<1khdC9K=q-g!%*gAGvZo1QHNza?6a#nos9IbL>csfbHYNoA|ma-*dMGTQqC9jMuyKxS~S zxZF_$q=HI1@g)#{D2(*Di^p%obJ3mK?AAmz#5VUmtA0~4oz`=HZ5||DeKq)x6LPKt zP%Jqjq+U~A)tXUF>%1Hi>)89VWF38wSgL|qHa>seQ^Dhz@dGpl7p6pZ_xm`bI3v?Q5sBFlx zjmASFfZ)d6p#^VUCHk)Q4%akA$^m%EOty0Uhu@u45h{jYJ}o!F*%vujwH@m{9X38!xkO}%KgdYj_T%2-{33siL`$lZ|H zq3P}Ulj$Z6$YiVcc__m7Z={@_zEY}PKT#hQH7{sPYzYAT#JDQk#~AIxg6cgqlqDYE z-wamV17Wp~U_zhH47d-l&vZNjXUtjc-1scFl92Ttv62gfwTB!DM~<~c?ep27E$kF3 z$#mG5kDlxu6de4Zr9JG_#lg_L`5PC>&`XBX-akkYYmoDsO+Is;UUlEiX;FH6)0juu zh4t(r%kPLDbV6n^?P4=)TH+gk!3Sc1>)uhM47_bS8;0I=V-Zc)M8I*=I%37b6vpM* zZt_%Z{+R5L_Uf{gE!SAHvCF^|1^bsz8=qQn$ecsjBqq#$_Ndmh)!}AYxI7D@zMk2j zE2hb2ChV2gb+5~Zod)KEq>%LqxZ6OBQmCQ|?DenexuvxPHe05`U7=5cvP9aInxX%^7b8LHI9c5xjM3Cur73)cUIs zC7OzUZ^!TVOEfb?#O-y+g%Qx(pVG{wP?B; z98_9Ck}9NCIAyk4elJfPN!o3WBz5!N8+V(^-mBole(k6i_1{=Bd6(Rn@~3PwUT%cP zUN^jRdnJBBD3~Dfhg^B-@1t?H9uPUhr<8S}JJba1L`W92he5|li`Q-Dr{^fU?A$4) zntAk z&y%Wc?z|(olEx|J~BbAABQOp z9FOBrffsfQbEhq)=QfFdB|G7!#%_-8hWQkQ_7Pu?#Nc);#d&RJ(sG2>(m!3-yu@b} z9|MPXW}eUyM=eAQj1r>)HPCjQS^XzNC+R0m5XN;ucKito%0TkVNIWWhx8PpiUDA@; zhWAXbRR<$J;)nyq(2dA##nEDM;X!UwVc2yTzVwmh=qp{IC2^G{4oe3m*dS*Y$5mTz z0*|gShIa1g#@wSoA`noVzNz{8uyMDbAP5#HH{!LMtxjAJ%P|?|WD}9=&W|51&1xC= zXm0)tA$V~`v6L;vQLVitM5;`heRfF&RqKKDLyBhmM1b}vmqYSFyjWK%Jd2iujHh5k zmMOnW3M(;Amgp?m9_&4E%qBR)PVsGy94~jK1we{}RHSfIKi}~S5cgpK_c8&EmExd5POzfJhdIatDnM2_TJd&Rn;+3^()gBhHhfF9!_h;Ax;?znnqXLgi#_W6E-Q$x__(K4M9(rb0P#uH zWnyTHQrYCulwOO}R3quft(cVtl54d^nHJk~gF8a12E$CkmWU{6kgT@6p;gZv1Q2Ad zvLq5_qEEM8*6-RQy@+}jBC+{>=I-WVwE*^0UJ()b{I|x>V*q{Q6LEOvO7dX`ifqwq znD-l5PjvH2QMnPw)DYLH=1azNs%mwXa-jPd32|xjLqXh+9CH62`1D%Zd)6a;`9 zgmu=yr+~T^e`(0dUaC;yT)G*XX|>@DN4^QQ47hd@WQ&c0Je{%$)gdkcKNFZXq#CJ< zMxnA19kJ7P?qRp*x7<+J16JfQRaOphUPI3?*rDE=_0NmECHQBK! z^Gn;+$1=hTxr4_O0@g*K^xrQ1EQ$u~`}DKs@Y5Hgc9$>9iRVMLPg6!~+ld`MvMtq5 zcm*?fjM(nZ^|KI^w3wE@+A{8B%-08-IfT+=2XxNA0v$4MN!sqxZOQ%A3xo0`MdKU1 z;Rj+7#p9msQ&wr*{KJRltw_KoNJJu>BB9Ij8y~j`U_BIN^*?IhE=wTs%Xhqt^=Gyd z*IVKeD8ub~m6OuDlTt?0B_hzpMWa#0afc(46SHLN9-9fJxfHgxR66@57=2_Yr9DdR zjS$*xm>XziX8!(4Kgzz3OP)TEm~dkn(8&c+yaLZT(NTqg?)?XXyRv{sl#YAGSfUBO zDe2eos!^Qs>PBb|uTo*Ybvd;8!`ti+dqIGcyJ};S_e|9!a!iyMmLW~XtlK443pwE6 z0*vTMj2t~h(lH5;%6kS5(Z9ZZ*B= z4~rVH&`Ld&-W?04OwDXWzyYmvv8{`ZSGa|8QK^VRrKW9iH975>5ImpHDYk5UL}{U> zyXnN`+61n~U~2h@P0M3lU{z>^_u@;X-e6S@cq%_bN}pIBQij66m^d1ch= z*DAM)GIWP7QsI>({yj718&&dc&a@W|$_u0s+yPkAYa&gbKg#a~nz3{hFE22D!9 nV6ChoM?17eahhS)bnDQ>$PgzubD1C)Bm7;-6yZWboD3qYhT@dg literal 5483 zcmV-x6_n~iT4*^jL0KkKS)if36#x-Te}F_(L_kmm|L`E74hlb~-zs1ke=WZI-+Xkp z8h2eT?v>ePEq2`6+jVVScV!14yHlIEc6Q^g&gWIrmFo-J)^oU*K)XuKq1w)=(|0?z zb6aJKKP(f|N75lJ?sG;Kzj15Z(-Y5>p~l+2uvjwQ|6 zY%IWnN|h@zNiakJBrYFh|mAtEkWHnKDDCPnCf++e6qi zT3#QBo{yI8o*2gN@y60uQy>My^M`25m5hCoFP9R;tMWl)a%RSTlcmpna? z$CYs*Ay?)qsL~1}{Rv-ekS8Ipq^=t@hvsm+)ut<60{P_$9Uo4QxtzA-*HrxNdm9Oy z7Q^XLS*E=`t6txg_H*7UI2?)u>;lOjb@6Z5J+6k7?Excx&8vn$;RSvfHE|AD`e8V{ zso#dwzQ^BT*>>J@(fkDYz1!DE1ETnV|3IS9VHM{RQ#c6fHJmEjbVW~NgPPn7 zUqnd8m7x~fR*WIG4`~*+QW^JEj3S$q;|E4c9g0WUkHK>?+-88gT|^i+cHk)XA5RKf z*bV~@QX)%nSPM}SuJ6KUjtW3`5D1|jI?Kf1>VRD;tlq|e9C%Fpd~zX@Nz5-*5-_%H zVN~CNYpN^$aaY~67pRhMls?MzG;%mj-+!Ay@71PpZ7AYiqOAeI+px83Fv9O__LVJ~ ztlw%Q3P?B(1s#=E51!5mQSP~WD21k%lF(e_TdEh++QgYpP60rx~vuHRpP!JQW zFFp}qQSw9-7{O_Muv3~Sv6yYgz5 zg~kN!AJ)y#=haw0i;3!7TE|vg@F1bx^v!+Qs`LCY$13yJ?U!_*56Awx$Z-l&E&x9S^Td0sqX#d3fZ>uJ5&)jpdBmZhBDLC&adJNY=heOYCexhBX%LIYE_At_}RWhq#SgB1VKZ;~+SqfPuxW zeJvbKPzer?ir=(_)e&E-H%o(=Iagk)D$1BN+iS8}dFPN_R~Dfd-XEtjBI<~tx~_?< z>*}*8Mnh$)TFqM?dyFq8Q4G)htYY3(*Wf^X#JU)1 z;#pI-i+Qj>@@d4`7sHQUfRQC%u4HRt4wW4$9N-q_#G(AY$W(0!{W;F3Pa7|e_U>mo zHSw)$HMt8H(zj73)MP!i1S@o-CIpWoNJ3<)N7_6U?9z09S{UndXCj=7UqMMB_iMjb z<0VntYqwMaT1z-3zYa}pk)EMC76o*3atX(13y&Z}-VNrcUlfKPT#(60Wz)HmFm|>Q zWYtAaj{G!3!swVey%)CvjD9$XjU5RN&?BMLFL=RY-rQb&IlHZQ(_76Z2#OC2a~%ZY zvZvcijfD4~SaEZZOhoTke4J*(T26vs_;alDq3+u_CqHt?sRQdlCR0`;8h&1_gkyr; znnd041T!jAs)DFg2b0!b0>4|vfC_R#d?oJD>nie!eKu!Gi2k7@KQb~D6j9qiCFV}W z!aHOM(gV=1i)^|yDk_nThwil9+H(^EBLs~$W$-i5kdlyjrcK1%VQsc9@a+!gauREL zy&ei8ArdP*&MutK3gvxUu7N5r0bTijQHjAUww$_ldr zm@#=>)mJiUlA7r8VupGH$|b{|mLszx1NAs4Nf)fO+Mz_P>@uDVZxkb>HCw^x74`<3 zMr*G5HYnU25G7R`9aWK6aF2|$c$yuJ-O(W9OHWHQfu*M~=#%PU4d_vJ3*>$QGh8A+ zG4%?JrVKwvVfcpWx#|UTkR~mngR;C73=%ATV^JzgPfM8Htx)UHXrY)LG{dfuhKf7% z1}=Se&^sxHcJP5fn|!xXDr|azg~8Vrm;U1$(* zaecsNq#N*$uIkk-KD~qHI8}_`VDENK$ReDiS$x3Ir)_U`I;<7m1Zr^aZGy$jgbS(O zaEj(%g}Um9_aShzAEX`zl`;lu-pL1oEuRo5O~`O?*?akxj9YB4OElk>+N zfYi~c?R5(zGOsSP(Te^;ESGy`j6D}T%DFJ^bbTJWMw!$$ISFN@?S;EZvp9gnSyt(| zq6t9+7dEXS5PqacuyjYIO`=h+d%4@iGbFPm?zJNPN~sl1>ilGto7DOz;MwA#8-Xqg z7XX4jLQI+?k&5dxo08i|=VK7Ax3hhE(M_PUJk^axpl7jm2I2<<^b)pLC8%L{-pi2| zz9J(8RN0+aUBA|tsHA&s@y^_urbo@|W{R#oV<6_fmGSo47|lXqb=a=C9x?_*3ZT>5 zsh|yu?OhZW^cRkDL@MOY`6ys4v-L{5AngIDGrw=u*N3ug}2tLWz87?og}^+R%wnB&SrWEHo}j$}w| zZh248E6lf4n(p-^!m}%2oSuB8GPr$`Jt=8jz>a4GfPP;kiY{qAvgnwy4#b>~pR_ZD z=PAK#mWON|3+4q&2FF&Z9RVWM_4Z}_74En!3hmk04Xrqo^Nu)9RC;YQZqO*@{H>CL}Iltu{0 z(e2ajf~nkU^6BmaUqR9caS5%vAd4`lq6+NukJ+e|r35xwma<%tPeVZSYR&=SDO|R= zWWeF3rcVA3lgWOnro(+a4?dk*Fw+Ljp}2zu1_6Cw!*n-?(5#C_>CGseBT*j7@4kQo z>*^~0-~0X=bCD0i)M+r`F?`}4!`B2>O>y(+N*3fM4@jp{mq?;1zUyDO>@XSQjrR!- zLTRIxLlI0_mQi8!yBco=N0c^iwXIf5yu6FkS{6;alH%P}valhZ87u1_&Eb<`K7C0Epge*HG^YNaa{MLJj?HR!jep+Esh?!m#>fX`RcMM(2t1z zZt^bXN(aYTIc?>k13tBwH`XqkB~-)+yQ>rp6!g6!A;n2fiDX^z+)|CYb}$AwOUUlA z9WBR3dCbYQU<>E())jY-!<*dfgLyi7>WE@v-WnU$QN@_gxDBKzfw+Xo*RVKv0Et|~*C zc-$c~-a+MUC9xeRs=e}8c3f&^*=Atnu8f}{bl~8iJC31fI^9N;r8mc~w=cb8M2qLa z1kA)<_ykeQ5d!&QQeZ~74$+Gr6L`t-BMlJ7F+p=WD-0H+)~BK5GJfoS274vlEitTf z-ZIZB4#oRL--T(Me79V*!Cx@wn69BHm=p%p>-4oUCk%_B zAyw{Ji^Ga84Iz6~M*W^8M7vF^e>)`ts>^}MhZKpjMEKMObs^(&XP})!XcqPa3?A4# zdeEC;MA28#-tGj7@m;%bhG7sm&l3RRRLiC(KfR5Jfw@RYGc}^%fJJw_@Lel((I>cX z>^+g{taF-W;_HI-2{&&T_n!{u8ycw(8n>3-zdjRoZJb<=lWR+P)*G%Rb`}7xH}-(*1d%fShC32bK%OHr?&(|pKv6CWNN zuwu&x5%r)2n!32hp>8om0WgHvTbeO#9*_{m0ZrToD{V~ui>PMY%3@S)u*q6a}Nr-a0hyRc{! zy>r`UsqqJ*!*YD<-YutlXzO>ZLOw_o3|gIp@_pNE z=E;j;Ea6fr-Gu`OScfBLP{u?{gtcN0{r4i1mrlw8sTm%EJ+EN}c}PqI_zD_W#y(}% zv|;rOMB!n(ZnI$*UB#yRl-24k=Mpy>d!qF_x?m38#6UrkKp;8^80S<}nOTOuU}QR$22A5xhKf%TixhK}|P-4p}o`>2oDApuX7zvG~p2tx1|M z!M1)Utzzz(S>7s-%_nQ*m=^=s2XjJmLnv!?*2;vz^!XWj-ftjsPN6B!Ghr2ctH@jL zGR%zPkGsvTlOb-Sa7M8M0Is7W(3iAeb`pUCqEwbY8wsX46*rr1INjP;F5!}~)UD1H znPU48QT#i5@75H&`FSNK9Z51l0*!oBH6~Z+lk%^5JhHIv{0@Zf+<=a!iZ_eaf(M=G z*v8^RlRSRh9MC=QVS_v?vi@QGeFxM*fW2$oZ90F!6G~!b=8#bBG%}g(zB4*9t^HpxFuvR-uZbr;^nfbFrK2IfK-cJuFpoW2p&No{SP%2;+5Pe zxqgFX7!`-a&OMx{^YHEWFHOdsP$toO!VpmH$ZBiqN}*7sPexT)^My(ljHgGCX%Ii hX`*c+Eh(pV{l+FhgGv;nC=bd0F64@Ep&>y-cq+zGY5V{H diff --git a/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 b/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 index c130659eba7a56117e768f8b5838b3324d20a093..2bbc71624bcf62dab04c3b8c604411212fc808b2 100644 GIT binary patch literal 7156 zcmV=WX((vCIevn%gt59^%a}5X73+ucu(J-8(j!OUA3TSh6$gHD=y` zp^W7GDsAzsXtQB9*&IX-%vLnJwmykuxfQMOOw!t!mFEV6piE4%Dgy}cDDORbZYoth z)3fQIBFr{z2J*03z4X>Cp6N4r^B&B;{kYHEn7=RYwM~Cu>=W4=a6iDxAP|fbQY_P& z+A92-Aien+9w)@xZ<_2lnm<1ELr_2(oQ3&F7)ZIkb<|BzjvZO&=*SKf+(76h96E)pmAhig#2uirNv z`nHh}F31?JNE~^IccLL2`h^<-o2H~}PC2Z&KW^(Vv0ky5u1Wd_YBpzw-p>cG zsrCJ+>Da}g&+M{qRVaSP*LKDjuB^iLD|v*uZt>xOMa`D}Nn8QN#@N=1Szkv}j*>Mfj}SaXeqQ(Zj` zK|=5_VSG+ai;uK6>yqpO^XDinqxmJ5GTAS0vVd_{$Pzw^*!;0bU&)4 z`{sX6KZclgXxNbYm&!>G&{iEw6`n@Eg=@9A%Rxl0v_*+wpwmz)(Dnp>zAO5H6)faiN`Sla|ThP$@8 z+Y6r2;bO;fW@)dc#Axf$tShVpvG-QsRmtm86Lfh6pDs{O7#xY4OvY*$o5||7N*C^? zk@Lhk>AwZ_-Tqrx%ZIb>oC~gjxw9Lt+x8TlW(IBWEW0B831yaFG{FljwpP zqKs;B+uAW2%y@H$Q+z<6iTNPf9_#3;C(UgiEaL}w$^17))chi8RouQ{P$}}_E-Wq_ z%2m}qo+gqZ_5`@m&C`@c)!KRQ0@StD7b56ZB-`-h}8*Gg{`YlBlIvaAy`LJ?9PP zLx)X0d5()FN&-}9Up?b4Rq8P2@pofrWQ+7}W^-w)gy9RIkj+uKbR`hLXEuSITi$4K zGkHOy9b(`&!vNG}bz9`ln>~U)r)VY_z~RoIPC^yim!J3z5j|)fraTIm<&5nnR5*g9(R9FgvWFNEmtmpJdg_T=AM%!>{o-d1sTK;e zL%rL{-xq=9=s^_;M`0q!H6$O^f1kg}9?2u9>l*QX_rGLA?6_xHK8d1%lEl!|58K{e zJVZp8sP@siB&GK2nz47|bY4G4wcv0PEb8LNctf-y2`y}Fb(ATkhxANM@d!nc1Ydxl3C`bW|nIq6Nn1Q>nU@)7> zj}3G#En1o#q&PW1@k^dQ$v@?~4;|K7yPzCa+EkH20}}-evt^$bzBSzQ*fr9;(~*uH z&9f{(i-@sXG8&`c+?l&yk4xLlr=^;%sFL~38sYg53Gsz5$p$q0p zJ#Z~`)h+SUkm5tgQExkobp?2QfzRHwlIR8MZPSz^rRH#|C`OB6f?8O2F&>krOR*4T zuL%K|tM&fxbF-q;^24{OK7VgIEX=Rv8gktIygMZQLx{~jo3d?82=b82%vE**0^aVnNp8z?c|~&;r&)o) zSJNDsz}>m9F8DXwBurW1^tz4G*L{_ZKCZ#2Tt?|f?DVw4$TH}JuhZ7IPKQ^gg_0ti zl3+bq^fDKT(GYgqLgma5YG=XAnAuNoH9@YUiwUIAjh%8F@rC(M<5rBbkXU8uS13=H z;lkecW&JNfs+TNkst=^*H)9lcAUS18LK)C?4pny<0zu|7Ku3Utsd>!dIWG42)SG8) zXA0V$T}01Sku67zXVbWZ4biAk;LhO&?4KVioFTi9j=ajLf-?>nJa#go1(k|;<6kJX zDd{STXFjM_;j1;U9LV8)+&$eQa6Y*dGJo2bLD24iLG>EO^B`%kHlTcKV66p0cy6rZ$j z12{rd7n!KtezMZ_HW1g2+)@TFmS7~OBx^RrP#qnlf!z;Xnkl8URxbDjZ^`n&l^@e& zoMF3#sW^+WkfnV499gep!K>%XLGioMI(61>m9DA_fgXXe`dn)4GGAOYkD$cSk48eT z>&#w4w3C|L&ldpCG_+KzXRB^Fxw_~QbfZ_2#zF>;oaYoeFQNm}34M2<)l(lh{t(wU zeJ9(G)Zbep7%pY}72>om)x;X`o&tN_X9Ih*!`d8vz3Gg~YXA*wePg(F(9G;=_FfUhAZz^7a z&>uJ=J#w%gVpCeBU4<9G^XdfAbsot1TS`OP${^>18&+p*a{lGE2kZ)xj-_~CZFELM zPm-~SG{JGIpThf~${ajqO-9Sas>&v_h`l6gWe(;7y0|k1=DrZ`Ft>98BTLuWv@E#mld}b7FmNv3 z)@X44`JEr;sNXM%RHK+Jpw?T+xc^_H?E>7{J9L?YSPWsQ^~IHGiI%|Ey9do=AlM9- z8E~H7OHu)g*<_T(KTg^`Yc9+YluCPK9kS?waNMB#o|kdXC@r_wlPT45ZJekaWW2}8 z(b#$kebKDRq_@n#+?yIf(2RJ7=DypAcQ!%+P4Y0^s1pp2g*{Lk96q6#Phf=@JS_Gb z2v}>(k+PU=M+~4m@gl|e^Ll`L7f)7eU9mzH<8n2WmbX_=V^|4pdn1l^8CgzO7p34tb@aix7ixuR+G|!9E2Af z`s=Q0Z5BF#LzFMdz?8v2$I_NkiMvM7Yk4^da%qmEl)hI^fW20_S8a7aCD~*H=F4ZS2tV zFWWy+^S42I%evzDrC@Qy@DW7sAg#S)hGumudn^!p*E%gRqe6>CVj+r$10^@o!{ExT zSu+Ey^Pf(y3bJ1s)a`BZxV=(}p6NGPVLJ>#H#~Um3(_6~f2_BPEYNA~cph_%DJQ2} z>BG#d4dzfcO9N572hBWGn;Qd94H!u0lJ04B*R)5M1kqniCP>Fl*yjS-ytNdb#y*7v zGJ@7=O|+RL2}R)Z4mmu-71xsZ%3h(!{EstEjX_$yvva{uhFkdP*uUL(`B~jM=c8_`(_xv zR?iP0?|n(_JW$=B<<5GZYBGD@9(j_sLH{^|mW9b}4-D?Al&S~>a!7HM!=KV+UL1>v z3ghoKNJDxxi1ACI#-0T?vtjtqZLUl4#LX&#ZpC+eubX^vI8Mi0#qf;WFRixC7tD<70Ev>W$0KE2 zAb%;r6G)cln>p-ba@&f}0t2WwUEp`A`C38kTYT|{mSR})cC&7;ky?No0G+WC(e@-b}8k3*4Ktq?);8>&+UWMXyB&pjoZXUr-O8XO!-mDw?9NrcfBHHW|9(UM6 z?Zb@*9pbN*AA1TNI`DIOS85D93VbYE7*R0PHpeP`Eu@l@Wl~^%4m^}Fr-AdiVoK@` z^{vlP-+=+sMH+pc4K(in>lv<90W6migJ56ikH@(}xw$k%tp@zaD?`Qc`y0$WJj*j5 zNT4Y&0qF&nYrXg_6`wEGm>m=7;7Vf<7OSQ%Q)G#E0 z%@5K#4#wg`+r)72;1dnBVdQ%5$6L0h#_3$wG6VX745TbijdDL#s$-xjBY>da*W4@l z<*4*r$-KiyKJCjYlWej@nzxeAl5I;Vmfi*Tq?Vu`#rMLo!!G zWkyN!$}#V)N^;r7u_%DWwb@F37T#q0(N(`*xip9jxl|pB9U&hChpplg-q7hu=4b|xs<1jM2!-L$ zD1Umg6+575BdEwmima*@`l5YO}^#@^yxxr{qyxHmSIGtrD>w zAw6ynB0;YicS$=f;`&WCHNbr|HmYXk-RFW5X%r#}Fc#ux07B-*-s`P*L_*%*gg}1X z^o(kEG}DDBVnq*;uniy9X!j*hPFC3f=lNd*kjh`{?G>Ei=10eba7S zQtZzww^-|QjtWWDuByS%5hm;8RS|3#129csHQi!Fy+chNgS?!gNjl}|C(l>Z zi0xu2mrjB3V0j3;0sPu*-ryE-!eApW7L%Y|TqnXJd+J)#F-ryZ*1K=uYM_n9$Rsw-0ZbQ9b)0UwX?}t#L1zH2+w9rl9D3ta z?rvBZ;IFybHx0HgAWGPdxW4$o6=5wwInJ7D;ocs`mzTYJxhO!=PCjVD@HZ!%Nlh6} z0pMa(($MJ$m3iqIoN zX8R(NITffcw$X^UCG>!Y)2c%a*oT0ns}3NJhkXgPKrgeI5{bY~)9vd7E(={YiG6tw zRNO$HwL@Ztx>*@2fhXA6)e#L! ztK{@b84=xw2+lB3y__MjzH^wr31N)^NKV|LB;zrUv2K@atk=VXooMsyeuI=7(N0}< zmxad$nO16thfq9g&l^RUO&4Md9bi%^@2x3C(tUE*$GhK!yaNJ(HDHh#yh6iV8y;W9 z{jP_SVyeM}rN2)7*(@qMV1csR{vUuq7ZMhS$*S4T_)3nM(I-bCxKi3i$IisQHl$ki zO16?K;!Jo+zCdyhy$P?`z?nRmu-prDR(8h14`=8#u$=7#OHvr3(=PSU6X#qLe+5oKneE(9L3r_6^;|b8%!>4+(ERPYy%%oB`z8UlP;>$8ncJ<)i|j}*;bm)cU`!inA+{( z0-<^VGzl&!^1OUVcW<)D9v^AAM7V9aBzVoY>1OsR%wmF39yf5v_WZj!VC%838#C86 zV5XvWl_hp9z`9Ywl{FeVg57X%GNYVyF~&v*KS2XILHSbEyAGSeQEzHU0`VU$?WhSM z8q_kA><&)UIWv}Eh-<@3~3qFv1h1eutL1 z#hq)oJ_msxR4ZCQbqEPVg~cv5RtCr#o(8_*97;IT3gU#>JQu*6{jcl5689mo>~v2? zp!kWIEIWs*Zgv+A-h&K_Ec&{Z7%+2W!$C&mcMi(}ufyx-jrOr)Ik;W=$Epk{QJh2Z zI_SOQB^Zi{7D zyfy5aTvi9#naqHygtXJhFzOt=uU5{3;jFed< z-2XUzzXA6UOwCjpaXkMej&gpg`i<=%MY}3}bNmU{YkwcYvX6L~cw`0c=BHnxZ${cH zJ+yGxG=4_~AlJc;S8L%OICa`WNm_D4R!>IT*UBza_K4B&RqFEbEytU4pOtmmxju`` zqxL_s%g*^==?u!f*=0{yA7ze?S$V`Ju30*Jns;a?nuV}ntrJvOj?f!SgA}KcoG0me zJ=W=IGm)<)YT$jrS6dL8Erj;rgYPlck+-;B-HI`i88Z=(>Wdhh{9#=x8C!dm!5ccQ zm}{A6^Q&g}lmsq)Tv93#8_VZmQ}ZTC36Th|m>$LboY<83cAm=Dgyz|>k~ry2Al+A4 znoJfabR0Zq?Cd-|ZHGt_oXg#oa^dkstupRH;_y72wQJT{D(7DLAR23$k~gTAU88Gu zqqp(1<%k!9L%E#b#o6>NC#(rS3*RM3gz(yr5nS|?dn!R4J;w{kx80WULFT`X6J#{; zb(&|c+FrGWL6~4U938n=cr%^SpqTh32$i+E%x=>Bxdeeql#MufpH-0dGgl{;`CY}c z-oUav5&Q3K3;#2=fj`9@vOJ(h)-;k(Co)+Ms{p%n}-h$PcAk}aq4`< qO4BN4NL}_l}qn)m$9m3%)wUFG**vxc4Y|`#@VLU zR)Lp1MO6R9z?x#E6b%gk000$J`~U?hRXs)s!7(rh$%07}O;hzxO(CACwAxKglxP8n zXhl!J6HH2~X`!d605W6-fz6FfjMO6m85k4L34kRK(x>EML}+LL02(vWl0>qi7$}s} zynleB5FkOAVVp9c0zeQIK!HG-FTc^JgC?D8U<>pPQ8);g z;L~MoNFj)n2%yJR1aV@O0#e<3(Mtoyo65^7<7(ex;dOzgQ7p&l`9t7*`Q#8_68K~Y z<{cn}j}Xm(1j~Lv!HK&m>TPcX3G~;cbwuV)mEA4Qd+^3OF~RPkUv+rOgsh*x;7>9( z9*$Lkg-zj4eA0dj?|}TlLddRwi$jMu59I+H8WF!!n}axh;w|@2JhQhH?Wn!Vo^MDb zxIC?rc~_O~PePTD!W+GWiB>o;u)6qLHk1{UTgTHWbfS*Vnc=IgJ94T^!rsw9oTkPW zkcRn}SgA~N0soXgNhIQQV~vv@-b$eHB4mxE1a%TB=D(yK^#2A|IFaxb zY*#2r-NK>f))|)D0D2flQ)mc}R#j1>f_*Lo1U&No;V$%+_HGjb494tabWenC$yYqQ zi|Qt=iL|236<%w$q94C$@Al#AllQR+KU}NF*7;5!z#z}U0OGQ1R_3^hzxLq<=hW*H zUMs5Ul*=-S2qCRq>tL%tfct~pBO9J~BSMT*?`iR1P_Tr`DuU+?191B?Bu-smTWBbL6S*$yFxn6w^f48pn&cvg!R#83Kvs`@;bq+Gtwc&(W_?j)8A4Nrh~m}PrwEqsRBz^4=zn))fof4Y9FN%`*9ZM zn6qlPg|O`yYIgO7C6L$+U#b7_KPr<2B4@vFpY-fN{z_~8T>Y7~^kHMFbJy!ZR!hfd z$2(T@*#-j8xQnLj@2l&FXdH8%KZS1MT!llCKWlzGe*mf87uNmq-oCc5A_a8f^L%lp zhlXhp0KcRSZ_2w90YFcyL%#j0o3XTMwNa=R*9@1^CB-TZq6O>kb!@gbVX^I~=e4@% zmnKj?KKH#-3P)y(FDWz^(v1CRT|A@nEtc%oL-KuqoaVER;<5M^)yMTbh)FOgig(G_ z#+cP`T3JHZl%!+;;-aWoHw4Bchq>UbgNmgSW~>2Ojxq^>&s?prf=$@(Bwb2_bowW} z{;JuQW;(%}FCI%Bt_D=Ac=9#}$Rz@x^Vg4#M93?hj@Wmrg)uaG8^Pgt6ezTqmXe#& zG|6zv5jrh%E~IZN*Wdx`YR}b=4w&EaQO3hxXX8y4;Id05(4KLO9P#i$>g-(sc4L008e4$B$s^y#g^p` zk?%1J5$YddBZKO&VJFuKV&N5M3%PCe#;SB7{&v)nis4YV7HNH-BTCu#;GR%3KMd`R zq32k;Fat!^5OnNa`Q0&(i0&ur9sq?`nVT2Shn+22UY&O7m~Hu6qT7O0G9;8two{Nz z+gxkgDD!-4TIjV&Pjp~s*!WNLrSR|$p6*R4fq@y1G$06p{3=B}IfWL;s zXq5#6kZ=V!UtEwe(bey!H+Z{{FqNda5(CpX#jVgo$ZOq;vw@X1dNz-`cX&zBKoV2W ziV2J1NBd_l(@8Z_)4%tx+}d~RbP~}5Z>$i zV*OLD6%;{Jxm{xgH-5aW@$!1@#=9R9Ke^FJ=|JK zT^u<6QH=^{YqKl0eh~v|#lfl=eg=3V^~_p9P$IwwA8D_$;vDaNkzhTgLGGQw=s?pV zXK%?1nQ6@=M7)9Q0_V84tn_E1)oCvhg%A#F+w0M@)~nE~w{L7qPbo;;K);~|MXNB% z(Jo9aaIWcm6#~~8cVU#&2IC8Wkj-)1mL(9tXIO!*&d(S!2Vewshs1z ziY#$0mRA)Bzi4%zqnyWei^1(6k?D#!?b8eINN+Adh%4QA3a)%ns*chSq0K!W||4i*OU|zm&Y=>n^GN(;TD|nQQJ5n z1<*!G+`9*m;zwcq!*UkBHB5DOB-)u2TW`rpdhQi(Y``z3h|04n<2ZZG4I$%06by5E zA7RIvroTUbgZ03azR*t(?)U5mzPfc}g4c-`2pc^1AHQogG_1_d9$&IajNt2Y7?DSR z7hbKk`x(OgZ%28-qdpyR&uUV&=ITE6V>mmOG-|oCMxDC)y~B<2dwqH%%Yy8NnKD8N z+aIzG<9zFS_q*LrquyK0YA;VEQ$@}E4^aYH;y8B-s`B`~6>$6$u9lNXMpSOzVQ|rg zD{O&p%3}>Go1=F?IKITXB7z1c3mj(LKP>!f+w2u+qkO9K8>Xx^?BWCHfhr4#CriwdcP&nG}C!Sh%y-uM! z?ikT0>$)^9Wg_T%2p6`U`M>jfV z$9h}WQuQrP)Y8UH(95N9Zc+2QEikeSwjnF&%39;0@~rf>L{g-f56d?Ug=FZ6KF085 zxq=TSY%3-`DRdrCY~)hHX)Ez^n1?)Jena|dNtSiX47~`%{M6B+_2t!l4L-y=g(O7t zV6g>IJe5a-v}EKx*XB=D&vlR_9%Ez#Xb_b%YiOL8-N1gX+FPPaKChP%FKfnYQM@ki za?r)3suX~uaD#Rat&`r6?!V=t1!0)f3fswT zp>p91FTrHAR&c9qu>=Bfd#fve!y|K;NXYhKgy89M$!Ju3C9uONZ&AOfb8#!;3V?H$kmzeH+H0 z-(quJ7;!U5vF%OgBGk){_}YB7+YA#`>xRbm315^|`J{vqvwIV+iv-4(5!Apl%`Fru zh@`e0OxSId;`&3H+kPO1$02e>VdRKFFAI@j=1nqBoNxd(W75?)1%Xq7*Jwmb z$3I?AQx#~Zw*LFKx5x|jrvuIO@$6uXcoPTO5j`C!X5H8&OyS_yy!B+`>ePmtJ3(5^ z*?8hBx{~*@aSs8bkO@v4QHtbmrAyxYl!pE3EmfCAWe!JKlshdaKJ z{0(eBM2^X12O{9dyA=b>Ru7XzRHY5tl)i1hObhIzI(AOG)2wGEl!L|zOETCk?*gD$ z*_kYwrII3`nniIg2++ydj0HTDFy)Ke5WG=Z%m;lhT}AM+@Ta%ZWfIg*0zQXMv5Mvrw{jjJ#0Oe8{k zQ0lp)E^#Thxc_H|FCeLoA;}-sp)u6-GlT><;XSq-v?1lcDbw9K_G!`&f$Jeo4$!(X zji(hd97tXdvOLRmBjmDSa@}c6wkMxb=T*cW%|R{dAGFDFj}s$0b_rRLY{_J`jKJ8J z7D14VeM56yx`=l+LIF$EVX9Cj866bfKwMz&24Od%958rU&YK8OTg;KNm|r6XP-1~* z$^t6&MK&_t@Yd%A2v^PM=2BbkUOs$Z3RG>rlw+zY6o}PoQ+Q79EHxFDAz9sv#@?G= zm)!426s7hF#&jCu6=hQSm6x zc-B3P@C@Uq>t-~*=dh^_=_D9lQoUqPi?s0um z!AS-1nayZP+xp895j#zLP7rsMHZ3t@!9|gv4_X;GK*ek*cdlm=2)t9+#brCgJq^pK zc9z*aNg@8S<^5jz+fA1OEg}H!djDj(RyB!jf`KS%ImcWo1+AQV(lsCJPds>;3uK7&_HT;Qzfvv za;qls?$hzBmlqn!w^ejjZrq@?(ki)cTkWE^on9J6S1F;=iwl%M_NN3*B3|2VtJXI! zWOHl~9YMP91Ma8JSq9qE_e?crAxh&W@}~U+TR;K_g)o<8q&%CQmk4uPIjSDQPP1;o zk;^Yvq#<7JI!v{4&i!eZ-l8~aP$Ro%b`jUGSMcYd0mDO9f)m-R%KjqRMje-DdeUMy z0%}mFOWqGT|bF&_-xT+~QnuR^9z?lO{=a2&%9pU)yOC>>l@Oo1-K<)~+*5!`w zewctqm0t}}ztQ1(sj|i7$TIe)NoOe2@!oh-wj_Nv3(S;I5!h=r&f|3_VOSyUJdy~p zvy{#bn=C~*bS(B!eXxH3_ofnldlhUOX?bVl2BnT2sA&RY^Wr8)q}(t_`ohx1wQ|7W zy59ssW=&cjeAW&i!Rv~Lpi`2p>S6Blqh5zMg@y>m%mmk;UXZ&{$AO2`t7?z#!iP_m z73$_wSKs`xozfa&2zo7)c> zc7XY;)hd9LOVr?83;Eyistjr>2+Zd^zn0@hR-9eSiWFViL>T~nQeXq|1{V3>EHM?I za`7}eDZ;^}$1y!SFeUpQpzcd6yjq`7FXkeQ>lqcX%hmh0%Pd|B{@0qcoV#U z7Jxv=%#2}e2Ua)DjcH3Jdd|_!S2VJ^ZVGBZ5j9QMJRYXG_*AYrAP{;D>8y zlHb#FyA)G6o%66CK*%vT%g6CUPq{&G=Ja7RUMU*$x@c#G+q!Mg_gp04q}rAf!8T-J z?DDpzv$GZIO|@_w6Tja#SHp%?aW+XVPpCajK|g#S9}|vLMp@$blWrrFwgSyi#zc0< z7;jgE4tDDpNcUZ(u0km{uOU2p`{ zN5>rwZzj7kUw0K*SjfB%H0d-zK&ZN+L}I_L)$fFh->Pe3AZxYwUkSq{#a60v)d?`a zE9GC11hC9WUj$BCgFVuVT3PC2ng7#nWq*Ljtoe0+%wI6gBdnVsr-_G z!JlTx8X4jlJ^CU~iFk7cFIaWJ6hhP@#pc#>`IWJkT5H>RO^EE(&N5tM0v9PJksRa* zxw`z71Q&vtk}Y!RW(lK*nUUa2BxPS5>f+>13UxKbuczrVWuODPmOp*#_ZW`fo0kd2 zNXt1&#$qMWOqHf@%w{hHDbtxFvw_!J*gWv>;741?kjVOgO=3xK1_`NIlmd6_?+;UY zAJ5y#Cw?1F7U2IOro>LEdaU00uwuv={= zt-K2|54f1+!(0JA!Ot@p%hVoEY#CY$I0eo>RvwYZ*&L^pP`*-et=3n|CC96AE~y;Z zZkTZq`P2?u9IQ>dGqsGTZ)vXJodd*_`{9M4_RUgCcx5OLLsOH*;NES|xrQa$u^51j zO6W!QBY7~gObzZ<*YX&t)N>pOmhRZkJ(UXWgJIm6Qpz$8v4w42azI|*)Y{i=kvg9Y ztgC1}Ri%EI6|L2OC6U4PWG#)m0>y6LalbI~6bYsZ*dn^#b-bJDqR*>xjYM+cuzVrW zh#>2>Wqv`#b`KjFR=MQQfwC^%4EMsj9h+V;-%?>K!}HL6b&&#pa)(8Y$=qL62fUch zglNq-B-);IriV&L3!d)`5+8W^J=b&<&{w6ex-gzoO07EAy=B`4eJf_Cj$yegH;xLo*~9pVIgR)XkYgNX|4-uV{w{ zDyvuGU~52e3ELDToMt-r6z5c^t6CNpv~3-2u25lE2dRv(&X(R-gjJVkWbsa`~o zWv*lj&NbeG0&YUYs_DA-sHiGKA%q>bh%9Yj^6=@H=Oad z_s4OkccD#C3-J&#&m)YBZNEEJ{G;FeNu}(hwu+vAUP%N4I8khW&thG z?qi6od9t^_uWzqShu3;RXiNelDFwkp3H`poR%NKIEy}{ znuHHS%O9t^9?F=#UYRx=8s@H6o=Sycx1`C_ose%_?+!5G8jpk7IR+d%Ip(qB}= z?>&7o!vN*4%#f^l*bG|4poD9PcOOnsAe9JBR6&TiLxD^deEX(c5AM-5q%}o7icUux z^q;znL5MK>&N{}jt4TlxmZGqr1_&HH*I7Y~ovOOtDvdp7zv2kATQ-9gDUd51CUrH3 zOx?G0ST)xLIya76tBmt5X8DUb)A>kmF~!(LiO$xt_nwE@tHK1~dBd6o%Xu!GDmP|d z;iKku`c{NfiE`jd)pEKOdeEWmJaQ##x)2+mCPmkoG4Z3SrOj9^tevSzU5m6b)O4v$ zM$X{7oE!|KqS(kSO?<`9K2{ezPIVUO<#0**-9q3CJN#d4xIqZc@X8LHa(&2hXD!hX zuz;9URQ36F@oJ?mgd-HFc8{Ig-;%L%!|qg*t8=)X)R2EozpO`WK=*=&)a7(OkxC7T z4rJ&u1v<1yf}!kiK*BDDEOEdCBGRun=X7Uk3r*R1(n~&vrpnc>Y{)+biasdTH$<@v zO+*Y7!LDdM0BCd`Z&4e^719nm zvJtv1os@O;h2$5r$Q1#WR5$6a4y|X-#T!;8^;b|@c|gVbjIdc3c>Q915Y5O;ZZ}k} zoo6!U_6dp+H@PR^ZvL>-kO~0ZOX)xbN&u+8#%b>Wq{T6%4BBWFES&m=LKoAk;4%5z&!vwHb?=rHKIO;LJ_me{u!&n=lKvPrrBp#1*>^bkZu%bz>X zH^Rm^KTQ2!YIqOUROa?R!gGFKx7is-G?{Q@1?s1hZ;>@)O&r_z4jV^@XyBwCZU?Ek z{5EvVyG@c3O_m9c+UZr?I{#*l8@q*jOTfo;k#z+X?LX z-<}nsZm>}1DbA6vx?bIRF@hK~5sz8|kQ9D!?4gkAdC%rieoF}=1cB=E&Pt)&PG)cd+SV& zbd&1vpWye&bRk|gv(#5UB^jnMo+jiCGWni69h`u*+w-FfeE_p5mqC%@8P_`&=4m$ TbD1C)$^I_nig2MInVo@7hl!!k diff --git a/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 b/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 index c3bd2a170b08cfe26ce8706696c12b88972e0c25..60da2b2bd047541b92670ec02cd8559f58d25f26 100644 GIT binary patch literal 1441 zcmV;S1z!3>T4*^jL0KkKS&DgVS^xude}F_(Kmbq%|L_!`9tuC_-wI#`KQDHf08k5A zRHEB(H8h%fqsf=`EfpaokJNnBOB%A;;a}9%E%+eM4!P`@krJ7Bx4Dx!0(G&d9C^h(gsp>)QD$2 zcDOq=+DlmFujoeUE)mR)nROOyX(}NE>iFJhzd;k81~gV2HdbtDxNV$wqnxoPNCP5X z3@Jk$1+%K>i0OJA^fVdFwOlttw?3&E@B`P2> zF7#`DuA-iGynVUg$Y%=~Je%x3NmraknXnl5g`a%%bI+dUpi2ZIxZyKWpfLE{PG1Yuhl@%bHatBY8_yJH2(l|X<1G&O zMB@*63Tu0ufM*PB=+;12dXxe*>nWTvvR?5swsSTHvhuyej1ek0=PpK7r8_gROU5vq zcs@>>19KXb)0hQfZp@Kfo9?bGj9@**-4v&Bw+s`IjS%c|`F?Mly~Ta@^II_!3&NFe z4&ls{BD|m$_D-U5JG@E|sh9SMraOh_5V24&sPj};0jc*d8wsU|rSJz0&K|{0gqwG> z3Ykz*!A4Qo3sag@ciMQ28N&~EUN*e*ltqeARNgSgmQ;zPU5jq5hL}!iak#l>8k(?~EeVp9jJ|*@} z*<%`^wjA^rCtp#xlg7^LiqSs|IH6%SR6NZybL@kH378hx3Dp};jWZI8#zQN%s*tHT z91dMFI2P?JPff<8n_y|{Dun8}qqq`DEd7@yOtI_}7;@T!off-jkT?s~?hM>ayl5py zc$vE%z02(v>o`DkGUY9mp3pHfHO}JBdZwW?lcgb+nPaf*V1g&Z!2IX?*$9Xb&*i|y z?Zh*e5IAud<%?^ERN78=Z)*8_o=2IgQzeu%?kCfn1J&!zR%Nz^gL%C+cZ#U=37nZt z_Be*-TWUEjfimFvd(uWb;|_P_`Ihp-(R$qhwER#cV}g%vOq!n38LYsYe9)1*Fd zPX|!W^@fpkI3+U>#4g6lGr8QyNF{h?3PsyYV^9_ z00t(}+np<3n~YMK_=M!N@iTPLLzP0JV#2Oa9c(`RfEL(%S2c<}V)Fqqg0G{`S1saT z@<7OeB4uTl8>KQ;9R`AB!~i4hwt5xGB|_>)EY^2zHj5$aquD6iVv9Fg3pk&>5+(BZ zL9N=;=Qv$;15h5`(SrkT34{rdJPzsf6jlQ?|^H zwq#AKE=4m!K{9}ZwR000Jos(MWg0i?|*pajzbX{I3+Q~v-0Qj`op00D`NWHK5J28{q{ z0BB&8DTFl1O*~Nak3*j?&pc^W z_96YjQ4?9+U!0a*gj--sybaG2-{e6Od7pu52q^jG^@9;%dce|B^RJaEj>k%c!$+Nnr>j zug3Y|djv}O9MPO`-JR(1xO+}6$E!r0APkATfr=HB7Ot&*2eskP4F)QuR*xuilj=Qw zKz?{@mQHMo&o*sF93z<|K6KSRB8!WXmJ%s-gIVnFJ7=}yT)u_EwTe^Y%w?(ZzG&6n zKy&RCYv)UPs$M^(aL{gB;$%4ecD}siyS6ABayx3tf>t0@2rXzWgtCDw5Q^i(&5D4- z@u@3lzOo+|6fD^I{5~D;iZjGr8Q1Zb2j2*sVfUd;cim77;my`L&>41^0yyg_)Mcc% zN!O<{pldHHe38N>hZS2RD$V;;iQA#$K` zVfU0*fwBGD&&KxVcN_!B2{EF`;%{3>8Fs+K!mh(WEsklCe@UcZ>M;EF@$C8Xu#1$S zvA!_Ji?T%WBLm3)FmP$pSWBbUSxyxUVGvP6JoLVI0Xr3&HsKIOi9+B&>wzg$IDrHq z6TnDhMtJq96? zcOc+`W(Dm5Ji}@5<1r|#bTYenRE0^v;CpeAz`g8Pn>QSiZ$RVcW(nq3hujiLEcY%- zouhC}VOrQ4fmxNyfn+AqC|+{z*|0t4GGJ#1|k2Lae)WfC{ zFr+Zi40Gr`2BHuLTcC)63RxWlnL&?tfoE-1j^q;?2s*Qm&;ZU0Mqb4j|pwqE~y8~3*VAQ8dH6I_6O-Oegy8)KLivuF_ za;%jRg|}{Ki)vb>s4WP%BNm!VO&^j=ci9XAzji^|<*`Do;is6y0{bc>^9g@<- z(3B|2fW{S{7l&4!4bY)xJI4~4FAC0zb7T^TzHw>X))}{Q zn&J-JkSAFiJYuDAu*pT~kvGoU72*>mCy%NVlc3aBO1DytJD~@)S21L2n)ji&<`^AR zI}ALl$kpb6+Nf&~=lH?6TP9+FsJ5Z(Dh7q%@Ol(|VG))ib?wwO1yEGve~Y;yoG3^L HR6#rdsOFrc diff --git a/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 b/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 index 286ba0cf0e642124a1aa8ea5811b7fc0f24ca3fc..530a813a02ad5805354e25c4a92c8eeedcd0f804 100644 GIT binary patch literal 366 zcmV-!0g?VfT4*^jL0KkKS=g5@4*&qte}F_(Kmbq&|L_-}o(ezb-wH4RI>mvhrm5-y zq3Sg9nKn&B)X->X27#(!Jx!*QQ^^lhFbxwxdXG@k0V0(0Xs4+0Pf4IO2GRfqn-rlS z%BIy>;Aq-1L`ae%M3s)}P$Y1qE|DPTZ6C~sP$HZsl;aTKLN60i=LIlasRWKm8l4A_I18a|mE{#ww^{V@em$$V%7~w3iWY^Y zfH71fP?_u`w~feSO5EwG4kbPm9oCPO?JqPRh@Bizax0DRO}E*BiMY88)?H1etR{QD zcivU7d=Ghy42TmvW5#DeSmB#DQd#u_Q0lnWlTNj;VQcUpNRqNtlOX0p9JiT`kJ$eg Maz!{$kl2?l4^mH~g#Z8m literal 344 zcmV-e0jK^#T4*^jL0KkKS@iLjRR93V|A0hPKmbq&|L_x_jtW1g-wH4RI>mu1n?(kL zY8xneWd@o600UI?C#khPCaLVEr|OJMX#m{aeCAJpID8X0okZ^E9cs$+rBYoa-WIh*DuShe13qRw14A3QrQy zk%)LP8$^kcfiz673m*&6p9@SR1mSg+=%`f3*n@u_->OQNMjuKN0X>Cw8DmP3%a!)R z4~Yd@s!%0B@+L8d;w7TUGo10owB6Hg21g?FG2&l4j=Utj58`G_W7SjKmY=||A0hPKmbq%|L_o?4hlc--zrc9o;Px;VN=C5EL&Rh zdteJ6g9agX#pluQ%7h+<1Y9{wuLoPYn!D$k(?8t-<}4zg8=nAX(T{1G#O!`Mi_7Zy;OM#0}Fw03l91?!P75wvA05k=RHinYyvCAGhI9US7bbcC&>A*o3! z4r-akaV!;b2W1)L*euW%WV}9*VA^!;tC*&Sn@c_JQyv$6%+%+>VW)%7IwJ*k$+ zCLPNW2AT_x0LpEn&Go|5f*jU)b&I3ZNx*5ERv@)!WsOO^)d20`GPN=@t)X6}>3}U}J=!r4%+at|o?7I2$^v z;uzag!5-E?pqR^Sji_S+E7T119s|auK7qgXDk|(@m^f0_TqhmDmg2hQg`Rb_aJ{g# z!sFSjC#{6xG3x4EK*vH}mlBbz!N5#Vh+kH2lBldMoV>~xt_WQo!d8vDKoUApj=D9} z%MVPHkc5WaMeikFQhnhJzK0E{a}KWFch44fLl1N6I!$iKr(XRZ)jnf-)k~7T!dpDbAz0IaDO{76gT$sV=ccVFh_ts0yuP(Ol)m)RWe67#XIt7XE-Au!r6r z#uuQ;bq05EXOL4sN0ZG*%(j_nAfS*dbkbDPz}_ty$`IBH0}*Qm0`L?MC8&$S6+U5B Z0~{Um?ivE9Ds(@^+>uTcBsYk3&;SHE0i*x` literal 1075 zcmV-31kC$FT4*^jL0KkKS--o-W&i@S|A0hPKmbq%|L_o?4hlc7-zrc9ej(LGP}!7f z2&wrE8eoYup!EO%&4a#SX^H9^P-7_oM9iTm)6{Bl1qXwH!0>Pm2bW9;2vPu;AR}?Q^|hGp$8C}W zycejVu*NSg&{6ejMF-zIGp0Y+AZ!_`@ z@YXlM;XEkR=e09%#fduh(A>})LJ+Exw5vcea= z6gZsmY%`-sFPjqa7>uPtD7^H+R=KbQwzu}U@(`^zBURu>ldf4LDKwDH@QF-;9NmU)t$cwF|GtBD*lSL1tC`6To{%4LKT4&~HArh?aiWj5jW zJksNW9MbyBR&=54s8^vA(A%=k2oPFfIsm!edbRnft=1WRSfz_l6MI~%k-IHT2u{OQ z2g9PIMqUUS240q9GngEdtO>%d>^A`nde=;}1<8efTjyCAolAR~4uS29r0Ln=>d#;; zq2@9zO{@c%SryBmt1cPEGOD84_;K6(Ipa$o)c`#)$=S9=V>!k04fG2|S171tas*;`i)t%c4eb`&}OYz-FG^7p+| zSDQj!tz|=6C^EQ+M{|d>xhYP2`WPP?GMvhhtv`SWTpVKjJ1QQc`#R*v$z>WJCj683 z=?uRIrqn&@)!WW*rJaz&-3xa5kC3ZMaE2MU^;W`tm#7g+6xE2-2kVbtC!z8HcUKQg z^BB<-XVv1o~tr6TL{KGx;@w38X*%V_&lM8?}RW%W<9ci!;?=1BU_a&VD5_=_P!C! z3OS@BbLgdN>>UTu9aYLOZ3KMF!a|~O1|J~`?U77t-G1$vorrOEZWOVP7oQY4)ciBj zVLqtR6LhEwnL>?lozb0T2ENGD`H7~DEG0dNaTphc-@vR78_a=( Date: Wed, 22 Feb 2023 11:48:54 -0500 Subject: [PATCH 099/177] Fix Android tests with new recipe changes After https://chromium-review.googlesource.com/c/chromium/tools/build/+/4277422, the old ANDROID_NATIVE_API_LEVEL values are no longer in CMakeCache.txt. Change-Id: If0c724081ef99bf3bc2e714fe84b6d16925bd116 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57507 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- BUILDING.md | 2 +- util/run_android_tests.go | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index b1ccf458d5..bedba3c3cb 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -96,8 +96,8 @@ Unpack the Android NDK somewhere and export `ANDROID_NDK` to point to the directory. Then make a build directory as above and run CMake like this: cmake -DANDROID_ABI=armeabi-v7a \ + -DANDROID_PLATFORM=android-19 \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ - -DANDROID_NATIVE_API_LEVEL=16 \ -GNinja .. Once you've run that, Ninja should produce Android-compatible binaries. You diff --git a/util/run_android_tests.go b/util/run_android_tests.go index 51b20172a3..67a13e7e41 100644 --- a/util/run_android_tests.go +++ b/util/run_android_tests.go @@ -231,13 +231,14 @@ func detectOptionsFromCMake() error { fmt.Printf("Detected ABI %q from CMakeCache.txt.\n", *abi) } if *apiLevel == 0 { - apiLevelStr, ok := cmakeVars["ANDROID_NATIVE_API_LEVEL"] + apiLevelStr, ok := cmakeVars["ANDROID_PLATFORM"] if !ok { - return errors.New("ANDROID_NATIVE_API_LEVEL not found in CMakeCache.txt") + return errors.New("ANDROID_PLATFORM not found in CMakeCache.txt") } + apiLevelStr = strings.TrimPrefix(apiLevelStr, "android-") var err error if *apiLevel, err = strconv.Atoi(apiLevelStr); err != nil { - return fmt.Errorf("error parsing ANDROID_NATIVE_API_LEVEL: %s", err) + return fmt.Errorf("error parsing ANDROID_PLATFORM: %s", err) } fmt.Printf("Detected API level %d from CMakeCache.txt.\n", *apiLevel) } From 7c860a4f8e0ddd33bed326dfa7903c9c2ba12433 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 13 Feb 2023 09:49:26 -0500 Subject: [PATCH 100/177] Gracefully handle DSA objects with missing fields OpenSSL's APIs are full of empty objects that aren't captured in the type system. A DSA object may represent any of nothing, a group, a public key, or a private key. Since the type system doesn't capture this, better to check which type we've got and NULL-check the fields we need for the operation. Change-Id: I32b09ebaad58fcb2a0bfc9ad56d381f95099bf7b Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57225 Reviewed-by: Adam Langley Auto-Submit: David Benjamin Commit-Queue: David Benjamin --- crypto/dsa/dsa.c | 19 ++++++++++++++----- crypto/dsa/dsa_test.cc | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/crypto/dsa/dsa.c b/crypto/dsa/dsa.c index 4d9b1f01ed..0418e09887 100644 --- a/crypto/dsa/dsa.c +++ b/crypto/dsa/dsa.c @@ -592,6 +592,11 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { return NULL; } + if (dsa->priv_key == NULL) { + OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); + return NULL; + } + BIGNUM *kinv = NULL, *r = NULL, *s = NULL; BIGNUM m; BIGNUM xr; @@ -687,6 +692,11 @@ int DSA_do_check_signature(int *out_valid, const uint8_t *digest, return 0; } + if (dsa->pub_key == NULL) { + OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); + return 0; + } + int ret = 0; BIGNUM u1, u2, t1; BN_init(&u1); @@ -842,6 +852,10 @@ static size_t der_len_len(size_t len) { } int DSA_size(const DSA *dsa) { + if (dsa->q == NULL) { + return 0; + } + size_t order_len = BN_num_bytes(dsa->q); // Compute the maximum length of an |order_len| byte integer. Defensively // assume that the leading 0x00 is included. @@ -864,11 +878,6 @@ int DSA_size(const DSA *dsa) { static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx, BIGNUM **out_kinv, BIGNUM **out_r) { - if (!dsa->p || !dsa->q || !dsa->g) { - OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); - return 0; - } - int ret = 0; BIGNUM k; BN_init(&k); diff --git a/crypto/dsa/dsa_test.cc b/crypto/dsa/dsa_test.cc index dc1956eba0..878e67db6f 100644 --- a/crypto/dsa/dsa_test.cc +++ b/crypto/dsa/dsa_test.cc @@ -169,7 +169,7 @@ static const uint8_t fips_sig_bad_r[] = { 0xdc, 0xd8, 0xc8, }; -static bssl::UniquePtr GetFIPSDSA(void) { +static bssl::UniquePtr GetFIPSDSAGroup(void) { bssl::UniquePtr dsa(DSA_new()); if (!dsa) { return nullptr; @@ -184,6 +184,14 @@ static bssl::UniquePtr GetFIPSDSA(void) { p.release(); q.release(); g.release(); + return dsa; +} + +static bssl::UniquePtr GetFIPSDSA(void) { + bssl::UniquePtr dsa = GetFIPSDSAGroup(); + if (!dsa) { + return nullptr; + } bssl::UniquePtr pub_key(BN_bin2bn(fips_y, sizeof(fips_y), nullptr)); bssl::UniquePtr priv_key(BN_bin2bn(fips_x, sizeof(fips_x), nullptr)); if (!pub_key || !priv_key || @@ -259,3 +267,35 @@ TEST(DSATest, InvalidGroup) { EXPECT_EQ(ERR_LIB_DSA, ERR_GET_LIB(err)); EXPECT_EQ(DSA_R_INVALID_PARAMETERS, ERR_GET_REASON(err)); } + +// Signing and verifying should cleanly fail when the DSA object is empty. +TEST(DSATest, MissingParameters) { + bssl::UniquePtr dsa(DSA_new()); + ASSERT_TRUE(dsa); + EXPECT_EQ(-1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig, + sizeof(fips_sig), dsa.get())); + + std::vector sig(DSA_size(dsa.get())); + unsigned sig_len; + EXPECT_FALSE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), + &sig_len, dsa.get())); +} + +// Verifying should cleanly fail when the public key is missing. +TEST(DSATest, MissingPublic) { + bssl::UniquePtr dsa = GetFIPSDSAGroup(); + ASSERT_TRUE(dsa); + EXPECT_EQ(-1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig, + sizeof(fips_sig), dsa.get())); +} + +// Signing should cleanly fail when the private key is missing. +TEST(DSATest, MissingPrivate) { + bssl::UniquePtr dsa = GetFIPSDSAGroup(); + ASSERT_TRUE(dsa); + + std::vector sig(DSA_size(dsa.get())); + unsigned sig_len; + EXPECT_FALSE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), + &sig_len, dsa.get())); +} From aa8d3b5a53ecff9befb7b0edcbbe56bb94dd3ae0 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 11 Feb 2023 09:51:23 -0500 Subject: [PATCH 101/177] Reject zero ECDSA keys in EC_KEY_set_private_key We already reject values that are out of bounds. Also we were using the wrong error, so fix that. Zero should additionally be rejected, otherwise, when signing an all-zero digest (impossible unless your system signs untrusted, pre-hashed inputs), ECDSA can infinite loop. Thanks to Guido Vranken who reported an analogous issue with DSA in https://github.com/openssl/openssl/issues/20268 When EC_KEYs are obtained through the parser, this CL is a no-op. The corresponding public key is the point at infinity, which we'll reject at both parse time and in EC_KEY_check_key. But as EC_KEY runs into OpenSSL's usual API design flaw (mutable, field-by-field setters over constructor functions for immutable objects), we should reject this in EC_KEY_set_private_key too. Update-Note: Systems that manually construct an EC_KEY (i.e. not from parsing), and either omit the public key or don't call EC_KEY_check_key will start rejecting the zero private key. If such a system *also* signs untrusted digests, this fixes an infinite loop in ECDSA. Change-Id: I3cc9cd2cc59eb6d16826beab3db71d66b23e83ff Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57226 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- crypto/evp/evp_tests.txt | 10 ++++++++++ crypto/fipsmodule/ec/ec_key.c | 5 +++-- crypto/fipsmodule/ec/ec_test.cc | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crypto/evp/evp_tests.txt b/crypto/evp/evp_tests.txt index 7fe2bced70..b86b2aa547 100644 --- a/crypto/evp/evp_tests.txt +++ b/crypto/evp/evp_tests.txt @@ -104,6 +104,16 @@ PrivateKey = P-256-ExplicitParameters-CofactorTwo Input = 308201610201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020102046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 Error = UNKNOWN_GROUP +# A zero ECDSA key, with the optional public key encoded. +PrivateKey = P-256-Zero +Input = 3047020100301306072a8648ce3d020106082a8648ce3d030107042d302b02010104200000000000000000000000000000000000000000000000000000000000000000a10403020000 +Error = INVALID_PRIVATE_KEY + +# A zero ECDSA key, with the optional public key omitted. +PrivateKey = P-256-Zero-NoPublic +Input = 3041020100301306072a8648ce3d020106082a8648ce3d0301070427302502010104200000000000000000000000000000000000000000000000000000000000000000 +Error = INVALID_PRIVATE_KEY + # The public half of the same key encoded as a PublicKey. PublicKey = P-256-SPKI Type = EC diff --git a/crypto/fipsmodule/ec/ec_key.c b/crypto/fipsmodule/ec/ec_key.c index f391a61c7b..e427e3c5df 100644 --- a/crypto/fipsmodule/ec/ec_key.c +++ b/crypto/fipsmodule/ec/ec_key.c @@ -244,8 +244,9 @@ int EC_KEY_set_private_key(EC_KEY *key, const BIGNUM *priv_key) { if (scalar == NULL) { return 0; } - if (!ec_bignum_to_scalar(key->group, &scalar->scalar, priv_key)) { - OPENSSL_PUT_ERROR(EC, EC_R_WRONG_ORDER); + if (!ec_bignum_to_scalar(key->group, &scalar->scalar, priv_key) || + ec_scalar_is_zero(key->group, &scalar->scalar)) { + OPENSSL_PUT_ERROR(EC, EC_R_INVALID_PRIVATE_KEY); ec_wrapped_scalar_free(scalar); return 0; } diff --git a/crypto/fipsmodule/ec/ec_test.cc b/crypto/fipsmodule/ec/ec_test.cc index 571ea58070..9ccc54b72b 100644 --- a/crypto/fipsmodule/ec/ec_test.cc +++ b/crypto/fipsmodule/ec/ec_test.cc @@ -856,6 +856,11 @@ TEST_P(ECCurveTest, SetInvalidPrivateKey) { EXPECT_FALSE(EC_KEY_set_private_key(key.get(), bn.get())) << "Unexpectedly set a key of the group order."; ERR_clear_error(); + + BN_zero(bn.get()); + EXPECT_FALSE(EC_KEY_set_private_key(key.get(), bn.get())) + << "Unexpectedly set a key of 0"; + ERR_clear_error(); } TEST_P(ECCurveTest, IgnoreOct2PointReturnValue) { From 85a1e2e01c440953834fd739162bca8d25d0311c Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 29 Jul 2022 18:12:37 +0000 Subject: [PATCH 102/177] Revert "Revert "Fetch entropy from a system daemon in FIPS mode on Android."" This reverts commit 8ce0e1c14e48109773f1e94e5f8b020aa1e24dc5. The original commit didn't work on Android because: a) urandom_test didn't handle the fact that Android requires getrandom() and will never fall back to /dev/urandom. b) Android may open files in /dev/__properties__ which confused urandom_test. The original change is patchset 1 so the differences build on that. Change-Id: Ib840ec20d60cb28d126d3d09271b18fbd9ec1371 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/53705 Reviewed-by: David Benjamin Commit-Queue: Adam Langley Auto-Submit: Adam Langley --- crypto/fipsmodule/rand/rand.c | 6 - crypto/fipsmodule/rand/urandom_test.cc | 504 ++++++++++++++++++++++--- crypto/rand_extra/passive.c | 128 ++++++- 3 files changed, 568 insertions(+), 70 deletions(-) diff --git a/crypto/fipsmodule/rand/rand.c b/crypto/fipsmodule/rand/rand.c index 41754c6fbc..0ead1822ca 100644 --- a/crypto/fipsmodule/rand/rand.c +++ b/crypto/fipsmodule/rand/rand.c @@ -169,12 +169,6 @@ void CRYPTO_get_seed_entropy(uint8_t *out_entropy, size_t out_entropy_len, } else { CRYPTO_sysrand_for_seed(out_entropy, out_entropy_len); } - - if (boringssl_fips_break_test("CRNG")) { - // This breaks the "continuous random number generator test" defined in FIPS - // 140-2, section 4.9.2, and implemented in |rand_get_seed|. - OPENSSL_memset(out_entropy, 0, out_entropy_len); - } } // In passive entropy mode, entropy is supplied from outside of the module via diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index 13ac610460..c3f82407d5 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -15,18 +15,24 @@ #include #include +#include #include #include -#include "internal.h" #include "getrandom_fillin.h" +#include "internal.h" -#if defined(OPENSSL_X86_64) && !defined(BORINGSSL_SHARED_LIBRARY) && \ - !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE) && defined(USE_NR_getrandom) +#if (defined(OPENSSL_X86_64) || defined(OPENSSL_AARCH64)) && \ + !defined(BORINGSSL_SHARED_LIBRARY) && \ + defined(OPENSSL_URANDOM) && defined(USE_NR_getrandom) +#include #include #include +#include #include +#include +#include #include #include "fork_detect.h" @@ -35,6 +41,23 @@ #define PTRACE_O_EXITKILL (1 << 20) #endif +#if defined(OPENSSL_ANDROID) +static const bool kIsAndroid = true; +#else +static const bool kIsAndroid = false; +#endif + +#if defined(BORINGSSL_FIPS) +static const bool kIsFIPS = true; +#else +static const bool kIsFIPS = false; +#endif + +static const bool kUsesDaemon = kIsFIPS && kIsAndroid; + +// kDaemonWriteLength is the number of bytes that the entropy daemon writes. +static const size_t kDaemonWriteLength = 496; + // This test can be run with $OPENSSL_ia32cap=~0x4000000000000000 in order to // simulate the absence of RDRAND of machines that have it. @@ -45,6 +68,10 @@ struct Event { kGetRandom, kOpen, kUrandomRead, + kSocket, + kConnect, + kSocketRead, + kSocketClose, kAbort, }; @@ -53,8 +80,7 @@ struct Event { bool operator==(const Event &other) const { return type == other.type && length == other.length && flags == other.flags && - ((filename == nullptr && other.filename == nullptr) || - strcmp(filename, other.filename) == 0); + filename == other.filename; } static Event GetRandom(size_t length, unsigned flags) { @@ -64,7 +90,7 @@ struct Event { return e; } - static Event Open(const char *filename) { + static Event Open(const std::string &filename) { Event e(Syscall::kOpen); e.filename = filename; return e; @@ -76,6 +102,27 @@ struct Event { return e; } + static Event Socket() { + Event e(Syscall::kSocket); + return e; + } + + static Event Connect() { + Event e(Syscall::kConnect); + return e; + } + + static Event SocketRead(size_t length) { + Event e(Syscall::kSocketRead); + e.length = length; + return e; + } + + static Event SocketClose() { + Event e(Syscall::kSocketClose); + return e; + } + static Event Abort() { Event e(Syscall::kAbort); return e; @@ -90,13 +137,26 @@ struct Event { break; case Syscall::kOpen: - snprintf(buf, sizeof(buf), "open(%s, _)", filename); + snprintf(buf, sizeof(buf), "open(%s, _)", filename.c_str()); break; case Syscall::kUrandomRead: snprintf(buf, sizeof(buf), "read(urandom_fd, _, %zu)", length); break; + case Syscall::kSocket: + return "socket(UNIX, STREAM, _)"; + + case Syscall::kConnect: + return "connect(sock, _, _)"; + + case Syscall::kSocketRead: + snprintf(buf, sizeof(buf), "read(sock_fd, _, %zu)", length); + break; + + case Syscall::kSocketClose: + return "close(sock)"; + case Syscall::kAbort: return "abort()"; } @@ -107,7 +167,7 @@ struct Event { const Syscall type; size_t length = 0; unsigned flags = 0; - const char *filename = nullptr; + std::string filename; }; static std::string ToString(const std::vector &trace) { @@ -134,7 +194,224 @@ static const unsigned GETRANDOM_NOT_READY = 4; static const unsigned GETRANDOM_ERROR = 8; // Reading from /dev/urandom gives |EINVAL|. static const unsigned URANDOM_ERROR = 16; -static const unsigned NEXT_FLAG = 32; +static const unsigned SOCKET_ERROR = 32; +static const unsigned CONNECT_ERROR = 64; +static const unsigned SOCKET_READ_ERROR = 128; +static const unsigned SOCKET_READ_SHORT = 256; +static const unsigned NEXT_FLAG = 512; + +// regs_read fetches the registers of |child_pid| and writes them to |out_regs|. +// That structure will contain at least the following members: +// syscall: the syscall number, if registers were read just before entering +// one. +// args[0..2]: syscall arguments, if registers were read just before +// entering one. +// ret: the syscall return value, if registers were read just after finishing +// one. +// +// This call returns true on success and false otherwise. +static bool regs_read(struct regs *out_regs, int child_pid); + +// regs_set_ret sets the return value of the system call that |child_pid| has +// just finished, to |ret|. It returns true on success and false otherwise. +static bool regs_set_ret(int child_pid, int ret); + +// regs_break_syscall causes the system call that |child_pid| is about to enter +// to fail to run. +static bool regs_break_syscall(int child_pid, const struct regs *orig_regs); + +#if defined(OPENSSL_X86_64) + +struct regs { + uintptr_t syscall; + uintptr_t args[3]; + uintptr_t ret; + struct user_regs_struct regs; +}; + +static bool regs_read(struct regs *out_regs, int child_pid) { + if (ptrace(PTRACE_GETREGS, child_pid, nullptr, &out_regs->regs) != 0) { + return false; + } + + out_regs->syscall = out_regs->regs.orig_rax; + out_regs->ret = out_regs->regs.rax; + out_regs->args[0] = out_regs->regs.rdi; + out_regs->args[1] = out_regs->regs.rsi; + out_regs->args[2] = out_regs->regs.rdx; + return true; +} + +static bool regs_set_ret(int child_pid, int ret) { + struct regs regs; + if (!regs_read(®s, child_pid)) { + return false; + } + regs.regs.rax = ret; + return ptrace(PTRACE_SETREGS, child_pid, nullptr, ®s.regs) == 0; +} + +static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { + // Replacing the syscall number with -1 doesn't work on AArch64 thus we set + // the first argument to -1, which suffices to break the syscalls that we care + // about here. + struct user_regs_struct regs; + memcpy(®s, &orig_regs->regs, sizeof(regs)); + regs.rdi = -1; + return ptrace(PTRACE_SETREGS, child_pid, nullptr, ®s) == 0; +} + +#elif defined(OPENSSL_AARCH64) + +struct regs { + uintptr_t syscall; + uintptr_t args[3]; + uintptr_t ret; + uint64_t regs[9]; +}; + +static bool regs_read(struct regs *out_regs, int child_pid) { + struct iovec io; + io.iov_base = out_regs->regs; + io.iov_len = sizeof(out_regs->regs); + if (ptrace(PTRACE_GETREGSET, child_pid, NT_PRSTATUS, &io) != 0) { + return false; + } + + out_regs->syscall = out_regs->regs[8]; + out_regs->ret = out_regs->regs[0]; + out_regs->args[0] = out_regs->regs[0]; + out_regs->args[1] = out_regs->regs[1]; + out_regs->args[2] = out_regs->regs[2]; + + return true; +} + +static bool regs_set(int child_pid, const struct regs *new_regs) { + struct iovec io; + io.iov_base = (void *) new_regs->regs; + io.iov_len = sizeof(new_regs->regs); + return ptrace(PTRACE_SETREGSET, child_pid, NT_PRSTATUS, &io) == 0; +} + +static bool regs_set_ret(int child_pid, int ret) { + struct regs regs; + if (!regs_read(®s, child_pid)) { + return false; + } + regs.regs[0] = ret; + return regs_set(child_pid, ®s); +} + +static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { + // Replacing the syscall number with -1 doesn't work on AArch64 thus we set + // the first argument to -1, which suffices to break the syscalls that we care + // about here. + struct regs copy = *orig_regs; + copy.regs[0] = -1; + return regs_set(child_pid, orig_regs); +} + +#endif + +// SyscallResult is like std::optional. +// TODO: use std::optional when we can use C++17. +class SyscallResult { + public: + SyscallResult &operator=(int value) { + has_value_ = true; + value_ = value; + return *this; + } + + int value() const { + if (!has_value_) { + abort(); + } + return value_; + } + + bool has_value() const { return has_value_; } + + private: + bool has_value_ = false; + int value_ = 0; +}; + +// memcpy_to_remote copies |n| bytes from |in_src| in the local address space, +// to |dest| in the address space of |child_pid|. +static void memcpy_to_remote(int child_pid, uint64_t dest, const void *in_src, + size_t n) { + const uint8_t *src = reinterpret_cast(in_src); + + // ptrace always works with ill-defined "words", which appear to be 64-bit + // on 64-bit systems. +#if !defined(OPENSSL_64_BIT) +#error "This code probably doesn't work" +#endif + + while (n) { + const uintptr_t aligned_addr = dest & ~7; + const uintptr_t offset = dest - aligned_addr; + const size_t space = 8 - offset; + size_t todo = n; + if (todo > space) { + todo = space; + } + + uint64_t word; + if (offset == 0 && todo == 8) { + word = CRYPTO_load_u64_le(src); + } else { + uint8_t bytes[8]; + CRYPTO_store_u64_le( + bytes, ptrace(PTRACE_PEEKDATA, child_pid, + reinterpret_cast(aligned_addr), nullptr)); + memcpy(&bytes[offset], src, todo); + word = CRYPTO_load_u64_le(bytes); + } + + ASSERT_EQ(0, ptrace(PTRACE_POKEDATA, child_pid, + reinterpret_cast(aligned_addr), + reinterpret_cast(word))); + + src += todo; + n -= todo; + dest += todo; + } +} + +static uint8_t get_byte_from_remote(int child_pid, uint64_t ptr) { + // ptrace always works with ill-defined "words", which appear to be 64-bit + // on 64-bit systems. +#if !defined(OPENSSL_64_BIT) +#error "This code probably doesn't work" +#endif + + const uintptr_t aligned_addr = ptr & ~7; + const uintptr_t offset = ptr - aligned_addr; + + uint64_t word = ptrace(PTRACE_PEEKDATA, child_pid, + reinterpret_cast(aligned_addr), 0); + uint8_t bytes[8]; + CRYPTO_store_u64_le(bytes, word); + return bytes[offset]; +} + +static std::string get_string_from_remote(int child_pid, uint64_t ptr) { + std::string ret; + + for (;;) { + const uint8_t byte = get_byte_from_remote(child_pid, ptr); + if (byte == 0) { + break; + } + ret.push_back((char)byte); + ptr++; + } + + return ret; +} // GetTrace runs |thunk| in a forked process and observes the resulting system // calls using ptrace. It simulates a variety of failures based on the contents @@ -173,6 +450,10 @@ static void GetTrace(std::vector *out_trace, unsigned flags, // process, if it opens it. int urandom_fd = -1; + // sock_fd tracks the file descriptor number for the socket to the entropy + // daemon, if one is opened. + int sock_fd = -1; + for (;;) { // Advance the child to the next system call. ASSERT_EQ(0, ptrace(PTRACE_SYSCALL, child_pid, 0, 0)); @@ -187,64 +468,120 @@ static void GetTrace(std::vector *out_trace, unsigned flags, // Otherwise the only valid ptrace event is a system call stop. ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == (SIGTRAP | 0x80)); - struct user_regs_struct regs; - ASSERT_EQ(0, ptrace(PTRACE_GETREGS, child_pid, nullptr, ®s)); - const auto syscall_number = regs.orig_rax; + struct regs regs; + ASSERT_TRUE(regs_read(®s, child_pid)); bool is_opening_urandom = false; - // inject_error is zero to indicate that the system call should run + bool is_socket_call = false; + bool is_socket_read = false; + uint64_t socket_read_bytes = 0; + // force_result is unset to indicate that the system call should run // normally. Otherwise it's, e.g. -EINVAL, to indicate that the system call - // should not run and that error should be injected on return. - int inject_error = 0; + // should not run and that the given value should be injected on return. + SyscallResult force_result; - switch (syscall_number) { + switch (regs.syscall) { case __NR_getrandom: if (flags & NO_GETRANDOM) { - inject_error = -ENOSYS; + force_result = -ENOSYS; } else if (flags & GETRANDOM_ERROR) { - inject_error = -EINVAL; + force_result = -EINVAL; } else if (flags & GETRANDOM_NOT_READY) { - if (regs.rdx & GRND_NONBLOCK) { - inject_error = -EAGAIN; + if (regs.args[2] & GRND_NONBLOCK) { + force_result = -EAGAIN; } } out_trace->push_back( - Event::GetRandom(/*length=*/regs.rsi, /*flags=*/regs.rdx)); + Event::GetRandom(/*length=*/regs.args[1], /*flags=*/regs.args[2])); break; case __NR_openat: - case __NR_open: { - // It's assumed that any arguments to open(2) are constants in read-only - // memory and thus the pointer in the child's context will also be a - // valid pointer in our address space. - const char *filename = reinterpret_cast( - (syscall_number == __NR_openat) ? regs.rsi : regs.rdi); - out_trace->push_back(Event::Open(filename)); - is_opening_urandom = strcmp(filename, "/dev/urandom") == 0; +#if defined(OPENSSL_X86_64) + case __NR_open: +#endif + { + uintptr_t filename_ptr = + (regs.syscall == __NR_openat) ? regs.args[1] : regs.args[0]; + const std::string filename = get_string_from_remote(child_pid, filename_ptr); + if (filename.find("/dev/__properties__/") == 0) { + // Android may try opening these files as part of SELinux support. + // They are ignored here. + } else { + out_trace->push_back(Event::Open(filename)); + } + is_opening_urandom = (filename == "/dev/urandom"); if (is_opening_urandom && (flags & NO_URANDOM)) { - inject_error = -ENOENT; + force_result = -ENOENT; } break; } case __NR_read: { - const int read_fd = regs.rdi; + const int read_fd = regs.args[0]; if (urandom_fd >= 0 && urandom_fd == read_fd) { - out_trace->push_back(Event::UrandomRead(/*length=*/regs.rdx)); + out_trace->push_back(Event::UrandomRead(/*length=*/regs.args[2])); if (flags & URANDOM_ERROR) { - inject_error = -EINVAL; + force_result = -EINVAL; + } + } else if (sock_fd >= 0 && sock_fd == read_fd) { + uint64_t length = regs.args[2]; + out_trace->push_back(Event::SocketRead(length)); + if (flags & SOCKET_READ_ERROR) { + force_result = -EINVAL; + } else { + is_socket_read = true; + socket_read_bytes = length; + + if (flags & SOCKET_READ_SHORT) { + ASSERT_GT(socket_read_bytes, 0u); + socket_read_bytes--; + flags &= ~SOCKET_READ_SHORT; + } + } + } + break; + } + + case __NR_close: { + if (sock_fd >= 0 && static_cast(regs.args[0]) == sock_fd) { + out_trace->push_back(Event::SocketClose()); + sock_fd = -1; + } + break; + } + + case __NR_socket: { + const int family = regs.args[0]; + const int type = regs.args[1]; + if (family == AF_UNIX && type == SOCK_STREAM) { + out_trace->push_back(Event::Socket()); + is_socket_call = true; + if (flags & SOCKET_ERROR) { + force_result = -EINVAL; + } + } + break; + } + + case __NR_connect: { + const int connect_fd = regs.args[0]; + if (sock_fd >= 0 && connect_fd == sock_fd) { + out_trace->push_back(Event::Connect()); + if (flags & CONNECT_ERROR) { + force_result = -EINVAL; + } else { + // The test system might not have an entropy daemon running so + // inject a success result. + force_result = 0; } } + break; } } - if (inject_error) { - // Replace the system call number with -1 to cause the kernel to ignore - // the call. The -ENOSYS will be replaced later with the value of - // |inject_error|. - regs.orig_rax = -1; - ASSERT_EQ(0, ptrace(PTRACE_SETREGS, child_pid, nullptr, ®s)); + if (force_result.has_value()) { + ASSERT_TRUE(regs_break_syscall(child_pid, ®s)); } ASSERT_EQ(0, ptrace(PTRACE_SYSCALL, child_pid, 0, 0)); @@ -261,15 +598,26 @@ static void GetTrace(std::vector *out_trace, unsigned flags, // and know that these events happen in pairs. ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == (SIGTRAP | 0x80)); - if (inject_error) { - if (inject_error != -ENOSYS) { - ASSERT_EQ(0, ptrace(PTRACE_GETREGS, child_pid, nullptr, ®s)); - regs.rax = inject_error; - ASSERT_EQ(0, ptrace(PTRACE_SETREGS, child_pid, nullptr, ®s)); - } + if (force_result.has_value()) { + ASSERT_TRUE(regs_set_ret(child_pid, force_result.value())); } else if (is_opening_urandom) { - ASSERT_EQ(0, ptrace(PTRACE_GETREGS, child_pid, nullptr, ®s)); - urandom_fd = regs.rax; + ASSERT_TRUE(regs_read(®s, child_pid)); + urandom_fd = regs.ret; + } else if (is_socket_call) { + ASSERT_TRUE(regs_read(®s, child_pid)); + sock_fd = regs.ret; + } else if (is_socket_read) { + // Simulate a response from the entropy daemon since it might not be + // running on the current system. + uint8_t entropy[kDaemonWriteLength]; + ASSERT_LE(socket_read_bytes, sizeof(entropy)); + + for (size_t i = 0; i < sizeof(entropy); i++) { + entropy[i] = i & 0xff; + } + memcpy_to_remote(child_pid, regs.args[1], entropy, socket_read_bytes); + + ASSERT_TRUE(regs_set_ret(child_pid, socket_read_bytes)); } } } @@ -281,22 +629,43 @@ static void TestFunction() { RAND_bytes(&byte, sizeof(byte)); } -static bool have_fork_detection() { - return CRYPTO_get_fork_generation() != 0; +static bool have_fork_detection() { return CRYPTO_get_fork_generation() != 0; } + +static bool AppendDaemonEvents(std::vector *events, unsigned flags) { + events->push_back(Event::Socket()); + if (flags & SOCKET_ERROR) { + return false; + } + + bool ret = false; + events->push_back(Event::Connect()); + if (flags & CONNECT_ERROR) { + goto out; + } + + events->push_back(Event::SocketRead(kDaemonWriteLength)); + if (flags & SOCKET_READ_ERROR) { + goto out; + } + + if (flags & SOCKET_READ_SHORT) { + events->push_back(Event::SocketRead(1)); + } + + ret = true; + +out: + events->push_back(Event::SocketClose()); + return ret; } // TestFunctionPRNGModel is a model of how the urandom.c code will behave when // |TestFunction| is run. It should return the same trace of events that // |GetTrace| will observe the real code making. static std::vector TestFunctionPRNGModel(unsigned flags) { -#if defined(BORINGSSL_FIPS) - static const bool is_fips = true; -#else - static const bool is_fips = false; -#endif - std::vector ret; bool getrandom_ready = false; + const bool used_daemon = kUsesDaemon && AppendDaemonEvents(&ret, flags); // Probe for getrandom support ret.push_back(Event::GetRandom(1, GRND_NONBLOCK)); @@ -304,7 +673,7 @@ static std::vector TestFunctionPRNGModel(unsigned flags) { std::function sysrand; if (flags & NO_GETRANDOM) { - if (is_fips) { + if (kIsFIPS) { // FIPS builds require getrandom. ret.push_back(Event::Abort()); return ret; @@ -349,13 +718,15 @@ static std::vector TestFunctionPRNGModel(unsigned flags) { }; } - const size_t kSeedLength = CTR_DRBG_ENTROPY_LEN * (is_fips ? 10 : 1); + const size_t kSeedLength = CTR_DRBG_ENTROPY_LEN * (kIsFIPS ? 10 : 1); const size_t kAdditionalDataLength = 32; if (!have_rdrand()) { if ((!have_fork_detection() && !sysrand(true, kAdditionalDataLength)) || // Initialise CRNGT. - !sysrand(true, kSeedLength + (is_fips ? 16 : 0)) || + (!used_daemon && !sysrand(true, kSeedLength + (kIsFIPS ? 16 : 0))) || + // Personalisation draw if the daemon was used. + (used_daemon && !sysrand(false, CTR_DRBG_ENTROPY_LEN)) || // Second entropy draw. (!have_fork_detection() && !sysrand(true, kAdditionalDataLength))) { return ret; @@ -368,7 +739,7 @@ static std::vector TestFunctionPRNGModel(unsigned flags) { // Opportuntistic entropy draw in FIPS mode because RDRAND was used. // In non-FIPS mode it's just drawn from |CRYPTO_sysrand| in a blocking // way. - !sysrand(!is_fips, CTR_DRBG_ENTROPY_LEN) || + !sysrand(!kIsFIPS, CTR_DRBG_ENTROPY_LEN) || // Second entropy draw's additional data. (!have_fast_rdrand() && !have_fork_detection() && !sysrand(false, kAdditionalDataLength))) { @@ -410,11 +781,22 @@ TEST(URandomTest, Test) { SCOPED_TRACE(buf); for (unsigned flags = 0; flags < NEXT_FLAG; flags++) { + if (!kUsesDaemon && (flags & (SOCKET_ERROR | CONNECT_ERROR | + SOCKET_READ_ERROR | SOCKET_READ_SHORT))) { + // These cases are meaningless unless the code will try to use the entropy + // daemon. + continue; + } + TRACE_FLAG(NO_GETRANDOM); TRACE_FLAG(NO_URANDOM); TRACE_FLAG(GETRANDOM_NOT_READY); TRACE_FLAG(GETRANDOM_ERROR); TRACE_FLAG(URANDOM_ERROR); + TRACE_FLAG(SOCKET_ERROR); + TRACE_FLAG(CONNECT_ERROR); + TRACE_FLAG(SOCKET_READ_ERROR); + TRACE_FLAG(SOCKET_READ_SHORT); const std::vector expected_trace = TestFunctionPRNGModel(flags); CheckInvariants(expected_trace); @@ -445,5 +827,5 @@ int main(int argc, char **argv) { return 0; } -#endif // X86_64 && !SHARED_LIBRARY && !UNSAFE_DETERMINISTIC_MODE && - // USE_NR_getrandom +#endif // (X86_64 || AARCH64) && !SHARED_LIBRARY && + // !UNSAFE_DETERMINISTIC_MODE && USE_NR_getrandom diff --git a/crypto/rand_extra/passive.c b/crypto/rand_extra/passive.c index f27803b63e..c54e2e8a9b 100644 --- a/crypto/rand_extra/passive.c +++ b/crypto/rand_extra/passive.c @@ -15,21 +15,143 @@ #include #include "../fipsmodule/rand/internal.h" +#include "../internal.h" #if defined(BORINGSSL_FIPS) +#define ENTROPY_READ_LEN \ + (/* last_block size */ 16 + CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD) + +#if defined(OPENSSL_ANDROID) + +#include +#include +#include +#include +#include +#include + +// socket_history_t enumerates whether the entropy daemon should be contacted +// for a given entropy request. Values other than socket_not_yet_attempted are +// sticky so if the first attempt to read from the daemon fails it's assumed +// that the daemon is not present and no more attempts will be made. If the +// first attempt is successful then attempts will be made forever more. +enum socket_history_t { + // initial value, no connections to the entropy daemon have been made yet. + socket_not_yet_attempted = 0, + // reading from the entropy daemon was successful + socket_success, + // reading from the entropy daemon failed. + socket_failed, +}; + +static _Atomic enum socket_history_t g_socket_history = + socket_not_yet_attempted; + +// DAEMON_RESPONSE_LEN is the number of bytes that the entropy daemon replies +// with. +#define DAEMON_RESPONSE_LEN 496 + +static_assert(ENTROPY_READ_LEN == DAEMON_RESPONSE_LEN, + "entropy daemon response length mismatch"); + +static int get_seed_from_daemon(uint8_t *out_entropy, size_t out_entropy_len) { + // |RAND_need_entropy| should never call this function for more than + // |DAEMON_RESPONSE_LEN| bytes. + if (out_entropy_len > DAEMON_RESPONSE_LEN) { + abort(); + } + + const enum socket_history_t socket_history = atomic_load(&g_socket_history); + if (socket_history == socket_failed) { + return 0; + } + + int ret = 0; + const int sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) { + goto out; + } + + struct sockaddr_un sun; + memset(&sun, 0, sizeof(sun)); + sun.sun_family = AF_UNIX; + static const char kSocketPath[] = "/dev/socket/prng_seeder"; + static_assert(sizeof(kSocketPath) <= UNIX_PATH_MAX, + "kSocketPath too long"); + OPENSSL_memcpy(sun.sun_path, kSocketPath, sizeof(kSocketPath)); + + if (connect(sock, (struct sockaddr *)&sun, sizeof(sun))) { + goto out; + } + + uint8_t buffer[DAEMON_RESPONSE_LEN]; + size_t done = 0; + while (done < sizeof(buffer)) { + ssize_t n; + do { + n = read(sock, buffer + done, sizeof(buffer) - done); + } while (n == -1 && errno == EINTR); + + if (n < 1) { + goto out; + } + done += n; + } + + if (done != DAEMON_RESPONSE_LEN) { + // The daemon should always write |DAEMON_RESPONSE_LEN| bytes on every + // connection. + goto out; + } + + assert(out_entropy_len <= DAEMON_RESPONSE_LEN); + OPENSSL_memcpy(out_entropy, buffer, out_entropy_len); + ret = 1; + +out: + if (socket_history == socket_not_yet_attempted) { + enum socket_history_t expected = socket_history; + // If another thread has already updated |g_socket_history| then we defer + // to their value. + atomic_compare_exchange_strong(&g_socket_history, &expected, + (ret == 0) ? socket_failed : socket_success); + } + + close(sock); + return ret; +} + +#else + +static int get_seed_from_daemon(uint8_t *out_entropy, size_t out_entropy_len) { + return 0; +} + +#endif // OPENSSL_ANDROID + // RAND_need_entropy is called by the FIPS module when it has blocked because of // a lack of entropy. This signal is used as an indication to feed it more. void RAND_need_entropy(size_t bytes_needed) { - uint8_t buf[/* last_block size */ 16 + - CTR_DRBG_ENTROPY_LEN * BORINGSSL_FIPS_OVERREAD]; + uint8_t buf[ENTROPY_READ_LEN]; size_t todo = sizeof(buf); if (todo > bytes_needed) { todo = bytes_needed; } int want_additional_input; - CRYPTO_get_seed_entropy(buf, todo, &want_additional_input); + if (get_seed_from_daemon(buf, todo)) { + want_additional_input = 1; + } else { + CRYPTO_get_seed_entropy(buf, todo, &want_additional_input); + } + + if (boringssl_fips_break_test("CRNG")) { + // This breaks the "continuous random number generator test" defined in FIPS + // 140-2, section 4.9.2, and implemented in |rand_get_seed|. + OPENSSL_memset(buf, 0, todo); + } + RAND_load_entropy(buf, todo, want_additional_input); } From 788bf74188fd091b7e67f1ff4a5258bec653b1ea Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 13 Feb 2023 15:00:09 -0500 Subject: [PATCH 103/177] Add more DSA consistency checks. DSA private keys cannot be zero. If they are, trying to sign an all zeros digest loops forever. Thanks to Guido Vranken who reported this in https://github.com/openssl/openssl/issues/20268 Along the way, because OpenSSL's bad API design made constructing DSA objects such a mess, just move all the consistency checks to dsa_check_parameters (now dsa_check_key) so it is consistently checked everywhere. Ideally we'd get a better handle on DSA state, like we hope to do for RSA state (though not there yet), so checks only happen once. But we consider DSA deprecated so it's not worth putting much effort into it. Update-Note: Some invalid DSA keys will be rejected by the parser and at use. Nothing should be using DSA anymore. Change-Id: I25d3faf145a85389c47abdd9db8e9b0056b37d8a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57227 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- crypto/dsa/dsa.c | 4 ++-- crypto/dsa/dsa_asn1.c | 44 +++++++++++++++++++++++++++++++++------- crypto/dsa/dsa_test.cc | 13 ++++++++++++ crypto/dsa/internal.h | 6 +++--- crypto/evp/evp_tests.txt | 5 +++++ crypto/evp/p_dsa_asn1.c | 23 ++++++++++++--------- 6 files changed, 73 insertions(+), 22 deletions(-) diff --git a/crypto/dsa/dsa.c b/crypto/dsa/dsa.c index 0418e09887..9f7bba7d7f 100644 --- a/crypto/dsa/dsa.c +++ b/crypto/dsa/dsa.c @@ -588,7 +588,7 @@ static int mod_mul_consttime(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, } DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { - if (!dsa_check_parameters(dsa)) { + if (!dsa_check_key(dsa)) { return NULL; } @@ -688,7 +688,7 @@ int DSA_do_verify(const uint8_t *digest, size_t digest_len, DSA_SIG *sig, int DSA_do_check_signature(int *out_valid, const uint8_t *digest, size_t digest_len, DSA_SIG *sig, const DSA *dsa) { *out_valid = 0; - if (!dsa_check_parameters(dsa)) { + if (!dsa_check_key(dsa)) { return 0; } diff --git a/crypto/dsa/dsa_asn1.c b/crypto/dsa/dsa_asn1.c index 3f3bd48866..1985bb4f6f 100644 --- a/crypto/dsa/dsa_asn1.c +++ b/crypto/dsa/dsa_asn1.c @@ -70,15 +70,25 @@ // This function is in dsa_asn1.c rather than dsa.c because it is reachable from // |EVP_PKEY| parsers. This makes it easier for the static linker to drop most // of the DSA implementation. -int dsa_check_parameters(const DSA *dsa) { +int dsa_check_key(const DSA *dsa) { if (!dsa->p || !dsa->q || !dsa->g) { OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); return 0; } - // Reject invalid parameters. In particular, signing will infinite loop if |g| - // is zero. - if (BN_is_zero(dsa->p) || BN_is_zero(dsa->q) || BN_is_zero(dsa->g)) { + // Fully checking for invalid DSA groups is expensive, so security and + // correctness of the signature scheme depend on how |dsa| was computed. I.e. + // we leave "assurance of domain parameter validity" from FIPS 186-4 to the + // caller. However, we check bounds on all values to avoid DoS vectors even + // when domain parameters are invalid. In particular, signing will infinite + // loop if |g| is zero. + if (BN_is_negative(dsa->p) || BN_is_negative(dsa->q) || BN_is_zero(dsa->p) || + BN_is_zero(dsa->q) || !BN_is_odd(dsa->p) || !BN_is_odd(dsa->q) || + // |q| must be a prime divisor of |p - 1|, which implies |q < p|. + BN_cmp(dsa->q, dsa->p) >= 0 || + // |g| is in the multiplicative group of |p|. + BN_is_negative(dsa->g) || BN_is_zero(dsa->g) || + BN_cmp(dsa->g, dsa->p) >= 0) { OPENSSL_PUT_ERROR(DSA, DSA_R_INVALID_PARAMETERS); return 0; } @@ -97,6 +107,25 @@ int dsa_check_parameters(const DSA *dsa) { return 0; } + if (dsa->pub_key != NULL) { + // The public key is also in the multiplicative group of |p|. + if (BN_is_negative(dsa->pub_key) || BN_is_zero(dsa->pub_key) || + BN_cmp(dsa->pub_key, dsa->p) >= 0) { + OPENSSL_PUT_ERROR(DSA, DSA_R_INVALID_PARAMETERS); + return 0; + } + } + + if (dsa->priv_key != NULL) { + // The private key is a non-zero element of the scalar field, determined by + // |q|. + if (BN_is_negative(dsa->priv_key) || BN_is_zero(dsa->priv_key) || + BN_cmp(dsa->priv_key, dsa->q) >= 0) { + OPENSSL_PUT_ERROR(DSA, DSA_R_INVALID_PARAMETERS); + return 0; + } + } + return 1; } @@ -162,7 +191,7 @@ DSA *DSA_parse_public_key(CBS *cbs) { OPENSSL_PUT_ERROR(DSA, DSA_R_DECODE_ERROR); goto err; } - if (!dsa_check_parameters(ret)) { + if (!dsa_check_key(ret)) { goto err; } return ret; @@ -200,7 +229,7 @@ DSA *DSA_parse_parameters(CBS *cbs) { OPENSSL_PUT_ERROR(DSA, DSA_R_DECODE_ERROR); goto err; } - if (!dsa_check_parameters(ret)) { + if (!dsa_check_key(ret)) { goto err; } return ret; @@ -251,9 +280,10 @@ DSA *DSA_parse_private_key(CBS *cbs) { OPENSSL_PUT_ERROR(DSA, DSA_R_DECODE_ERROR); goto err; } - if (!dsa_check_parameters(ret)) { + if (!dsa_check_key(ret)) { goto err; } + return ret; err: diff --git a/crypto/dsa/dsa_test.cc b/crypto/dsa/dsa_test.cc index 878e67db6f..a4b6dfa122 100644 --- a/crypto/dsa/dsa_test.cc +++ b/crypto/dsa/dsa_test.cc @@ -299,3 +299,16 @@ TEST(DSATest, MissingPrivate) { EXPECT_FALSE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), &sig_len, dsa.get())); } + +// A zero private key is invalid and can cause signing to loop forever. +TEST(DSATest, ZeroPrivateKey) { + bssl::UniquePtr dsa = GetFIPSDSA(); + ASSERT_TRUE(dsa); + BN_zero(dsa->priv_key); + + static const uint8_t kZeroDigest[32] = {0}; + std::vector sig(DSA_size(dsa.get())); + unsigned sig_len; + EXPECT_FALSE(DSA_sign(0, kZeroDigest, sizeof(kZeroDigest), sig.data(), + &sig_len, dsa.get())); +} diff --git a/crypto/dsa/internal.h b/crypto/dsa/internal.h index 2d86edb2dc..560ae7f333 100644 --- a/crypto/dsa/internal.h +++ b/crypto/dsa/internal.h @@ -22,9 +22,9 @@ extern "C" { #endif -// dsa_check_parameters checks that |dsa|'s group is within DoS bounds. It -// returns one on success and zero on error. -int dsa_check_parameters(const DSA *dsa); +// dsa_check_key performs cheap self-checks on |dsa|, and ensures it is within +// DoS bounds. It returns one on success and zero on error. +int dsa_check_key(const DSA *dsa); #if defined(__cplusplus) diff --git a/crypto/evp/evp_tests.txt b/crypto/evp/evp_tests.txt index b86b2aa547..238a602eb1 100644 --- a/crypto/evp/evp_tests.txt +++ b/crypto/evp/evp_tests.txt @@ -138,6 +138,11 @@ Input = 308202650201003082023906072a8648ce3804013082022c02820101009e12fab3de1221 ExpectNoRawPrivate ExpectNoRawPublic +# An invalid zero DSA private key. +PrivateKey = DSA-1024-Zero +Input = 308202450201003082023906072a8648ce3804013082022c02820101009e12fab3de12213501dd82aa10ca2d101d2d4ebfef4d2a3f8daa0fe0cedad8d6af85616aa2f3252c0a2b5a6db09e6f14900e0ddb8311876dd8f9669525f99ed65949e184d5064793271169a228680b95ec12f59a8e20b21f2b58eb2a2012d35bde2ee351822fe8f32d0a330565dcce5c672b7259c14b2433d0b5b2ca2b2db0ab626e8f13f47fe0345d904e7294bb038e9ce21a9e580b83356278706cfe768436c69de149ccff98b4aab8cb4f6385c9f102ce59346eaeef27e0ad222d53d6e89cc8cde5776dd00057b03f2d88ab3cedbafd7b585f0b7f7835e17a3728bbf25ea62572f245dc111f3ce39cb6ffacc31b0a2790e7bde90224ea9b09315362af3d2b022100f381dcf53ebf724f8b2e5ca82c010fb4b5eda9358d0fd88ed278589488b54fc3028201000c402a725dcc3a62e02bf4cf43cd17f4a493591220223669cf4193edab423ad08dfb552e308a6a57a5ffbc7cd0fb2087f81f8df0cb08ab2133287d2b6968714a94f633c940845a48a3e16708dde761cc6a8eab2d84db21b6ea5b07681493cc9c31fbc368b243f6ddf8c932a8b4038f44e7b15ca876344a147859f2b43b39458668ad5e0a1a9a669546dd2812e3b3617a0aef99d58e3bb4cc87fd94225e01d2dcc469a77268146c51918f18e8b4d70aa1f0c7623bcc52cf3731d38641b2d2830b7eecb2f09552ff137d046e494e7f33c3590002b16d1b97d936fda28f90c3ed3ca35338168ac16f77c3c57adc2e8f7c6c2256e41a5f65450590dbb5bcf06d66610403020100 +Error = INVALID_PARAMETERS + # A DSA public key. PublicKey = DSA-1024-SPKI Type = DSA diff --git a/crypto/evp/p_dsa_asn1.c b/crypto/evp/p_dsa_asn1.c index 8486e282e1..fe0421081d 100644 --- a/crypto/evp/p_dsa_asn1.c +++ b/crypto/evp/p_dsa_asn1.c @@ -61,6 +61,7 @@ #include #include +#include "../dsa/internal.h" #include "internal.h" @@ -136,25 +137,27 @@ static int dsa_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) { } dsa->priv_key = BN_new(); - dsa->pub_key = BN_new(); - if (dsa->priv_key == NULL || dsa->pub_key == NULL) { + if (dsa->priv_key == NULL) { goto err; } - - // Decode the key. To avoid DoS attacks when importing private keys, we bound - // |dsa->priv_key| against |dsa->q|, which itself bound by - // |DSA_parse_parameters|. (We cannot call |BN_num_bits| on |dsa->priv_key|. - // That would leak a secret bit width.) if (!BN_parse_asn1_unsigned(key, dsa->priv_key) || - CBS_len(key) != 0 || - BN_cmp(dsa->priv_key, dsa->q) >= 0) { + CBS_len(key) != 0) { + OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); + goto err; + } + + // To avoid DoS attacks when importing private keys, check bounds on |dsa|. + // This bounds |dsa->priv_key| against |dsa->q| and bounds |dsa->q|'s bit + // width. + if (!dsa_check_key(dsa)) { OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR); goto err; } // Calculate the public key. ctx = BN_CTX_new(); - if (ctx == NULL || + dsa->pub_key = BN_new(); + if (ctx == NULL || dsa->pub_key == NULL || !BN_mod_exp_mont_consttime(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx, NULL)) { goto err; From 474ddf8ba95f30e69acea37d76b3e671d89381c3 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 11 Feb 2023 10:13:32 -0500 Subject: [PATCH 104/177] Cap the number of ECDSA and DSA sign iterations. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the parameters are incorrect, all assumptions of (EC)DSA fly out the window, including whether the retry loop actually terminates. While ECDSA is broadly used with fixed, named groups, DSA was catastrophically mis-specified with arbitrary parameters being the default and only mode. Cap the number of retries in DSA_do_sign so invalid DSA groups cannot infinite loop, e.g. if the "generator" is really nilpotent. This also caps the iteration count for ECDSA. We do, sadly, support arbitrary curves via EC_GROUP_new_curve_GFp, to help Conscrypt remain compatible with a badly-designed Java API. After https://boringssl-review.googlesource.com/c/boringssl/+/51925, we documented that untrusted parameters are not supported and may produce garbage outputs, but we did not document that infinite loops are possible. I don't have an example where an invalid curve breaks ECDSA, but as it breaks all preconditions, I cannot be confident it doesn't exist, so just cap the iterations. Thanks to Hanno Böck who originally reported an infinite loop on invalid DSA groups. While that variation did not affect BoringSSL, it inspired us to find other invalid groups which did. Thanks also to Guido Vranken who found, in https://github.com/openssl/openssl/issues/20268, an infinite loop when the private key is zero. That was fixed in the preceding CL, as it impacts valid groups too, but the infinite loop is ultimately in the same place, so this change also would have mitigated the loop. Update-Note: If signing starts failing with ECDSA_R_INVALID_ITERATIONS, something went horribly wrong because it should not be possible with real curves. (Needing even one retry has probability 2^-256 or so.) Change-Id: If8fb0157055d3d8cb180fe4f27ea7eb349ec2738 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57228 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- crypto/dsa/dsa.c | 14 ++++++++++++++ crypto/dsa/dsa_test.cc | 24 ++++++++++++++++++++++++ crypto/err/dsa.errordata | 1 + crypto/err/ecdsa.errordata | 1 + crypto/fipsmodule/ecdsa/ecdsa.c | 12 ++++++++++++ include/openssl/dsa.h | 1 + include/openssl/ecdsa.h | 1 + 7 files changed, 54 insertions(+) diff --git a/crypto/dsa/dsa.c b/crypto/dsa/dsa.c index 9f7bba7d7f..8be01b9f61 100644 --- a/crypto/dsa/dsa.c +++ b/crypto/dsa/dsa.c @@ -614,6 +614,14 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { goto err; } + // Cap iterations so that invalid parameters do not infinite loop. This does + // not impact valid parameters because the probability of requiring even one + // retry is negligible, let alone 32. Unfortunately, DSA was mis-specified, so + // invalid parameters are reachable from most callers handling untrusted + // private keys. (The |dsa_check_key| call above is not sufficient. Checking + // whether arbitrary paremeters form a valid DSA group is expensive.) + static const int kMaxIterations = 32; + int iters = 0; redo: if (!dsa_sign_setup(dsa, ctx, &kinv, &r)) { goto err; @@ -653,8 +661,14 @@ DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) { // Redo if r or s is zero as required by FIPS 186-3: this is // very unlikely. if (BN_is_zero(r) || BN_is_zero(s)) { + iters++; + if (iters > kMaxIterations) { + OPENSSL_PUT_ERROR(DSA, DSA_R_TOO_MANY_ITERATIONS); + goto err; + } goto redo; } + ret = DSA_SIG_new(); if (ret == NULL) { goto err; diff --git a/crypto/dsa/dsa_test.cc b/crypto/dsa/dsa_test.cc index a4b6dfa122..cc02782a36 100644 --- a/crypto/dsa/dsa_test.cc +++ b/crypto/dsa/dsa_test.cc @@ -69,6 +69,7 @@ #include #include #include +#include #include #include "../test/test_util.h" @@ -312,3 +313,26 @@ TEST(DSATest, ZeroPrivateKey) { EXPECT_FALSE(DSA_sign(0, kZeroDigest, sizeof(kZeroDigest), sig.data(), &sig_len, dsa.get())); } + +// If the "field" is actually a ring and the "generator" of the multiplicative +// subgroup is actually nilpotent with low degree, DSA signing never completes. +// Test that we give up in the infinite loop. +TEST(DSATest, NilpotentGenerator) { + static const char kPEM[] = R"( +-----BEGIN DSA PRIVATE KEY----- +MGECAQACFQHH+MnFXh4NNlZiV/zUVb5a5ib3kwIVAOP8ZOKvDwabKzEr/moq3y1z +E3vJAhUAl/2Ylx9fWbzHdh1URsc/c6IM/TECAQECFCsjU4AZRcuks45g1NMOUeCB +Epvg +-----END DSA PRIVATE KEY----- +)"; + bssl::UniquePtr bio(BIO_new_mem_buf(kPEM, sizeof(kPEM))); + ASSERT_TRUE(bio); + bssl::UniquePtr dsa( + PEM_read_bio_DSAPrivateKey(bio.get(), nullptr, nullptr, nullptr)); + ASSERT_TRUE(dsa); + + std::vector sig(DSA_size(dsa.get())); + unsigned sig_len; + EXPECT_FALSE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), + &sig_len, dsa.get())); +} diff --git a/crypto/err/dsa.errordata b/crypto/err/dsa.errordata index 1cf5206d86..4a4b5862df 100644 --- a/crypto/err/dsa.errordata +++ b/crypto/err/dsa.errordata @@ -6,3 +6,4 @@ DSA,107,INVALID_PARAMETERS DSA,101,MISSING_PARAMETERS DSA,102,MODULUS_TOO_LARGE DSA,103,NEED_NEW_SETUP_VALUES +DSA,108,TOO_MANY_ITERATIONS diff --git a/crypto/err/ecdsa.errordata b/crypto/err/ecdsa.errordata index 58ba591fab..b1c60d4505 100644 --- a/crypto/err/ecdsa.errordata +++ b/crypto/err/ecdsa.errordata @@ -4,3 +4,4 @@ ECDSA,101,MISSING_PARAMETERS ECDSA,102,NEED_NEW_SETUP_VALUES ECDSA,103,NOT_IMPLEMENTED ECDSA,104,RANDOM_NUMBER_GENERATION_FAILED +ECDSA,106,TOO_MANY_ITERATIONS diff --git a/crypto/fipsmodule/ecdsa/ecdsa.c b/crypto/fipsmodule/ecdsa/ecdsa.c index 95b367f13c..4cd95bb272 100644 --- a/crypto/fipsmodule/ecdsa/ecdsa.c +++ b/crypto/fipsmodule/ecdsa/ecdsa.c @@ -333,7 +333,13 @@ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len, SHA512_Update(&sha, digest, digest_len); SHA512_Final(additional_data, &sha); + // Cap iterations so callers who supply invalid values as custom groups do not + // infinite loop. This does not impact valid parameters (e.g. those covered by + // FIPS) because the probability of requiring even one retry is negligible, + // let alone 32. + static const int kMaxIterations = 32; ECDSA_SIG *ret = NULL; + int iters = 0; for (;;) { EC_SCALAR k; if (!ec_random_nonzero_scalar(group, &k, additional_data)) { @@ -346,6 +352,12 @@ ECDSA_SIG *ECDSA_do_sign(const uint8_t *digest, size_t digest_len, if (ret != NULL || !retry) { goto out; } + + iters++; + if (iters > kMaxIterations) { + OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_TOO_MANY_ITERATIONS); + goto out; + } } out: diff --git a/include/openssl/dsa.h b/include/openssl/dsa.h index 7f10e54902..30afd43834 100644 --- a/include/openssl/dsa.h +++ b/include/openssl/dsa.h @@ -442,5 +442,6 @@ BSSL_NAMESPACE_END #define DSA_R_DECODE_ERROR 105 #define DSA_R_ENCODE_ERROR 106 #define DSA_R_INVALID_PARAMETERS 107 +#define DSA_R_TOO_MANY_ITERATIONS 108 #endif // OPENSSL_HEADER_DSA_H diff --git a/include/openssl/ecdsa.h b/include/openssl/ecdsa.h index bc0dba5624..56be1547f5 100644 --- a/include/openssl/ecdsa.h +++ b/include/openssl/ecdsa.h @@ -232,5 +232,6 @@ BSSL_NAMESPACE_END #define ECDSA_R_NOT_IMPLEMENTED 103 #define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED 104 #define ECDSA_R_ENCODE_ERROR 105 +#define ECDSA_R_TOO_MANY_ITERATIONS 106 #endif // OPENSSL_HEADER_ECDSA_H From 3cd7faadc982ca6c33c05a0ba8030f43bde80707 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Thu, 23 Feb 2023 00:23:27 +0000 Subject: [PATCH 105/177] Tweak urandom_test for Android devices without getrandom. Some Android devices in our builder pool are so old that they lack getrandom. This change attempts to make them happy. Change-Id: I5eea04f1b1dc599852e3b8448ad829bea05b9fe9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57527 Reviewed-by: David Benjamin Commit-Queue: Adam Langley Auto-Submit: Adam Langley --- crypto/fipsmodule/rand/urandom_test.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index c3f82407d5..b1732cf15f 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -36,6 +36,7 @@ #include #include "fork_detect.h" +#include "getrandom_fillin.h" #if !defined(PTRACE_O_EXITKILL) #define PTRACE_O_EXITKILL (1 << 20) @@ -776,6 +777,12 @@ static void CheckInvariants(const std::vector &events) { TEST(URandomTest, Test) { char buf[256]; + // Some Android systems lack getrandom. + uint8_t scratch[1]; + const bool has_getrandom = + (syscall(__NR_getrandom, scratch, sizeof(scratch), GRND_NONBLOCK) != -1 || + errno != ENOSYS); + #define TRACE_FLAG(flag) \ snprintf(buf, sizeof(buf), #flag ": %d", (flags & flag) != 0); \ SCOPED_TRACE(buf); @@ -788,6 +795,10 @@ TEST(URandomTest, Test) { continue; } + if (!has_getrandom && !(flags & NO_GETRANDOM)) { + continue; + } + TRACE_FLAG(NO_GETRANDOM); TRACE_FLAG(NO_URANDOM); TRACE_FLAG(GETRANDOM_NOT_READY); From 7864b1489f742cece5cf0344a03275de75a9b43f Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Thu, 16 Feb 2023 16:44:34 -0800 Subject: [PATCH 106/177] Start a Kyber implementation with basic Keccak code. Change-Id: I8e9a0b83453e44bdecab017144596bd3d61898ac Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57385 Reviewed-by: David Benjamin Commit-Queue: Adam Langley --- crypto/CMakeLists.txt | 2 + crypto/kyber/internal.h | 61 + crypto/kyber/keccak.c | 205 +++ crypto/kyber/keccak_tests.txt | 3071 +++++++++++++++++++++++++++++++++ crypto/kyber/kyber_test.cc | 66 + sources.cmake | 1 + 6 files changed, 3406 insertions(+) create mode 100644 crypto/kyber/internal.h create mode 100644 crypto/kyber/keccak.c create mode 100644 crypto/kyber/keccak_tests.txt create mode 100644 crypto/kyber/kyber_test.cc diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 05a76d89ea..f917b79ebd 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -171,6 +171,7 @@ add_library( hkdf/hkdf.c hpke/hpke.c hrss/hrss.c + kyber/keccak.c lhash/lhash.c mem.c obj/obj.c @@ -398,6 +399,7 @@ add_executable( hmac_extra/hmac_test.cc hrss/hrss_test.cc impl_dispatch_test.cc + kyber/kyber_test.cc lhash/lhash_test.cc obj/obj_test.cc pem/pem_test.cc diff --git a/crypto/kyber/internal.h b/crypto/kyber/internal.h new file mode 100644 index 0000000000..6761d551a4 --- /dev/null +++ b/crypto/kyber/internal.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#ifndef OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H +#define OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + + +struct BORINGSSL_keccak_st { + uint64_t state[25]; + size_t rate_bytes; + size_t offset; +}; + +enum boringssl_keccak_config_t { + boringssl_sha3_256, + boringssl_sha3_512, + boringssl_shake128, + boringssl_shake256, +}; + +// BORINGSSL_keccak hashes |in_len| bytes from |in| and writes |out_len| bytes +// of output to |out|. If the |config| specifies a fixed-output function, like +// SHA3-256, then |out_len| must be the correct length for that function. +OPENSSL_EXPORT void BORINGSSL_keccak(uint8_t *out, size_t out_len, + const uint8_t *in, size_t in_len, + enum boringssl_keccak_config_t config); + +// BORINGSSL_keccak_init absorbs |in_len| bytes from |in| and sets up |ctx| for +// squeezing. The |config| must specify a SHAKE variant, otherwise callers +// should use |BORINGSSL_keccak|. +OPENSSL_EXPORT void BORINGSSL_keccak_init( + struct BORINGSSL_keccak_st *ctx, const uint8_t *in, size_t in_len, + enum boringssl_keccak_config_t config); + +// BORINGSSL_keccak_squeeze writes |out_len| bytes to |out| from |ctx|. +OPENSSL_EXPORT void BORINGSSL_keccak_squeeze( + struct BORINGSSL_keccak_st *ctx, uint8_t *out, size_t out_len); + + +#if defined(__cplusplus) +} +#endif + +#endif // OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H diff --git a/crypto/kyber/keccak.c b/crypto/kyber/keccak.c new file mode 100644 index 0000000000..099b6eb17a --- /dev/null +++ b/crypto/kyber/keccak.c @@ -0,0 +1,205 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include + +#include +#include + +#include "../internal.h" +#include "./internal.h" + + +// keccak_f implements the Keccak-1600 permutation as described at +// https://keccak.team/keccak_specs_summary.html. Each lane is represented as a +// 64-bit value and the 5×5 lanes are stored as an array in row-major order. +static void keccak_f(uint64_t state[25]) { + static const int kNumRounds = 24; + for (int round = 0; round < kNumRounds; round++) { + // θ step + uint64_t c[5]; + for (int x = 0; x < 5; x++) { + c[x] = state[x] ^ state[x + 5] ^ state[x + 10] ^ state[x + 15] ^ + state[x + 20]; + } + + for (int x = 0; x < 5; x++) { + const uint64_t d = c[(x + 4) % 5] ^ CRYPTO_rotl_u64(c[(x + 1) % 5], 1); + for (int y = 0; y < 5; y++) { + state[y * 5 + x] ^= d; + } + } + + // ρ and π steps. + // + // These steps involve a mapping of the state matrix. Each input point, + // (x,y), is rotated and written to the point (y, 2x + 3y). In the Keccak + // pseudo-code a separate array is used because an in-place operation would + // overwrite some values that are subsequently needed. However, the mapping + // forms a trail through 24 of the 25 values so we can do it in place with + // only a single temporary variable. + // + // Start with (1, 0). The value here will be mapped and end up at (0, 2). + // That value will end up at (2, 1), then (1, 2), and so on. After 24 + // steps, 24 of the 25 values have been hit (as this mapping is injective) + // and the sequence will repeat. All that remains is to handle the element + // at (0, 0), but the rotation for that element is zero, and it goes to (0, + // 0), so we can ignore it. + int pi_x = 1, pi_y = 0; + uint64_t prev_value = state[1]; + int pi_rot = 1; + for (int i = 1; i < 25; i++) { + const int out_x = pi_y; + const int out_y = (2 * pi_x + 3 * pi_y) % 5; + const int index = out_y * 5 + out_x; + const uint64_t t = state[index]; + state[index] = CRYPTO_rotl_u64(prev_value, pi_rot); + pi_rot = (pi_rot + i + 1) % 64; + prev_value = t; + pi_x = out_x; + pi_y = out_y; + } + + // χ step + for (int y = 0; y < 5; y++) { + const int row_index = 5 * y; + const uint64_t orig_x0 = state[row_index]; + const uint64_t orig_x1 = state[row_index + 1]; + state[row_index] ^= ~orig_x1 & state[row_index + 2]; + state[row_index + 1] ^= ~state[row_index + 2] & state[row_index + 3]; + state[row_index + 2] ^= ~state[row_index + 3] & state[row_index + 4]; + state[row_index + 3] ^= ~state[row_index + 4] & orig_x0; + state[row_index + 4] ^= ~orig_x0 & orig_x1; + } + + // ι step + // + // From https://keccak.team/files/Keccak-reference-3.0.pdf, section + // 1.2, the round constants are based on the output of a LFSR. Thus, as + // suggested in the appendix of of + // https://keccak.team/keccak_specs_summary.html, the values are + // simply encoded here. + static const uint64_t kRoundConstants[24] = { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008, + }; + + state[0] ^= kRoundConstants[round]; + } +} + +static void keccak_init(struct BORINGSSL_keccak_st *ctx, + size_t *out_required_out_len, const uint8_t *in, + size_t in_len, enum boringssl_keccak_config_t config) { + size_t capacity_bytes; + uint8_t terminator; + switch (config) { + case boringssl_sha3_256: + capacity_bytes = 512 / 8; + *out_required_out_len = 32; + terminator = 0x06; + break; + case boringssl_sha3_512: + capacity_bytes = 1024 / 8; + *out_required_out_len = 64; + terminator = 0x06; + break; + case boringssl_shake128: + capacity_bytes = 256 / 8; + *out_required_out_len = 0; + terminator = 0x1f; + break; + case boringssl_shake256: + capacity_bytes = 512 / 8; + *out_required_out_len = 0; + terminator = 0x1f; + break; + default: + abort(); + } + + OPENSSL_memset(ctx, 0, sizeof(*ctx)); + ctx->rate_bytes = 200 - capacity_bytes; + assert(ctx->rate_bytes % 8 == 0); + const size_t rate_words = ctx->rate_bytes / 8; + + while (in_len >= ctx->rate_bytes) { + for (size_t i = 0; i < rate_words; i++) { + ctx->state[i] ^= CRYPTO_load_u64_le(in + 8 * i); + } + keccak_f(ctx->state); + in += ctx->rate_bytes; + in_len -= ctx->rate_bytes; + } + + // XOR the final block. Accessing |ctx->state| as a |uint8_t*| is allowed by + // strict aliasing because we require |uint8_t| to be a character type. + uint8_t *state_bytes = (uint8_t *)ctx->state; + assert(in_len < ctx->rate_bytes); + for (size_t i = 0; i < in_len; i++) { + state_bytes[i] ^= in[i]; + } + state_bytes[in_len] ^= terminator; + state_bytes[ctx->rate_bytes - 1] ^= 0x80; + keccak_f(ctx->state); +} + +void BORINGSSL_keccak(uint8_t *out, size_t out_len, const uint8_t *in, + size_t in_len, enum boringssl_keccak_config_t config) { + struct BORINGSSL_keccak_st ctx; + size_t required_out_len; + keccak_init(&ctx, &required_out_len, in, in_len, config); + if (required_out_len != 0 && out_len != required_out_len) { + abort(); + } + BORINGSSL_keccak_squeeze(&ctx, out, out_len); +} + +void BORINGSSL_keccak_init(struct BORINGSSL_keccak_st *ctx, const uint8_t *in, + size_t in_len, + enum boringssl_keccak_config_t config) { + size_t required_out_len; + keccak_init(ctx, &required_out_len, in, in_len, config); + if (required_out_len != 0) { + abort(); + } +} + +void BORINGSSL_keccak_squeeze(struct BORINGSSL_keccak_st *ctx, uint8_t *out, + size_t out_len) { + // Accessing |ctx->state| as a |uint8_t*| is allowed by strict aliasing + // because we require |uint8_t| to be a character type. + const uint8_t *state_bytes = (const uint8_t *)ctx->state; + while (out_len) { + size_t remaining = ctx->rate_bytes - ctx->offset; + size_t todo = out_len; + if (todo > remaining) { + todo = remaining; + } + OPENSSL_memcpy(out, &state_bytes[ctx->offset], todo); + out += todo; + out_len -= todo; + ctx->offset += todo; + if (ctx->offset == ctx->rate_bytes) { + keccak_f(ctx->state); + ctx->offset = 0; + } + } +} diff --git a/crypto/kyber/keccak_tests.txt b/crypto/kyber/keccak_tests.txt new file mode 100644 index 0000000000..c13aeb3d79 --- /dev/null +++ b/crypto/kyber/keccak_tests.txt @@ -0,0 +1,3071 @@ +Input: +SHA3-256: a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a +SHA3-512: a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26 +SHAKE-128: 7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef263cb1eea988004b93103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc873c23dc62b8d260169afa2f75ab916a58d974918835d25e6a435085b2badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea17cda7cfad765f5623474d368ccca8af0007cd9f5e4c849f167a580b14aabdefaee7eef47cb0fca9767be1fda69419dfb927e9df07348b196691abaeb580b32def58538b8d23f87732ea63b02b4fa0f4873360e2841928cd60dd4cee8cc0d4c922a96188d032675c8ac850933c7aff1533b94c834adbb69c6115bad4692d8619f90b0cdf8a7b9c264029ac185b70b83f2801f2f4b3f70c593ea3aeeb613a7f1b1de33fd75081f592305f2e4526edc09631b10958f464d889f31ba010250fda7f1368ec2967fc84ef2ae9aff268e0b1700affc6820b523a3d917135f2dff2ee06bfe72b3124721d4a26c04e53a75e30e73a7a9c4a95d91c55d495e9f51dd0b5e9d83c6d5e8ce803aa62b8d654db53d09b8dcff273cdfeb573fad8bcd45578bec2e770d01efde86e721a3f7c6cce275dabe6e2143f1af18da7efddc4c7b70b5e345db93cc936bea323491ccb38a388f546a9ff00dd4e1300b9b2153d2041d205b443e41b45a653f2a5c4492c1add544512dda2529833462b71a41a45be97290b6f +SHAKE-256: 46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122109e3b1fdd943b6aec468a2d621a7c06c6a957c62b54dafc3be87567d677231395f6147293b68ceab7a9e0c58d864e8efde4e1b9a46cbe854713672f5caaae314ed9083dab4b099f8e300f01b8650f1f4b1d8fcf3f3cb53fb8e9eb2ea203bdc970f50ae55428a91f7f53ac266b28419c3778a15fd248d339ede785fb7f5a1aaa96d313eacc890936c173cdcd0fab882c45755feb3aed96d477ff96390bf9a66d1368b208e21f7c10d04a3dbd4e360633e5db4b602601c14cea737db3dcf722632cc77851cbdde2aaf0a33a07b373445df490cc8fc1e4160ff118378f11f0477de055a81a9eda57a4a2cfb0c83929d310912f729ec6cfa36c6ac6a75837143045d791cc85eff5b21932f23861bcf23a52b5da67eaf7baae0f5fb1369db78f3ac45f8c4ac5671d85735cdddb09d2b1e34a1fc066ff4a162cb263d6541274ae2fcc865f618abe27c124cd8b074ccd516301b91875824d09958f341ef274bdab0bae316339894304e35877b0c28a9b1fd166c796b9cc258a064a8f57e27f2a + +Input: 33 +SHA3-256: 1bf0b26eb2090599dd68cbb42c86a674cb07ab7adc103ad3ccdf521bb79056b9 +SHA3-512: 73fb266a903f956a9034d52c2d2793c37fddc32077898f5d871173da1d646fb80bbc21a0522390b75d3bcc88bd78960bdb73be323ad5fc5b3a16089992957d3a +SHAKE-128: 0a7fddc22e37eaf05b744459f6129fd1c97cb501aaf497ecb6d5d9b1cfadcbf5c16f4e2ca3f6f0d5e02a0a73d266d2ae0541395f5094b7bd6ee75e9610a5609a88991ebf24555644d9e62ad7284dffa9ca9d6f9e913c4024131bb401c795c7a241da8db9eb403185e29d0639c0c09b46a27cf06f886485cfc2019a930840cbdb48cf9bd8f53e5aa349487a79b904cd18b2721dc1b31a31ab5443e2aa7c02a1dfc8fb439c0838e68753218d2d1eaf4cc1af4ec3e42339612a7dffe12be85affd9f167cddafe96b921a9d50382f6cc91ebb843508ba58910e2cd4352fea695b874ed9bb2d207f2ee33e938566492ade9edca7993a09633f248465b6f9a80984284f6f898406deaa74c83dfeeb99e268f372748bc3ff1953974c81a4a804e06baf8b705b6d93b01721713af41c852daf16a935cc4f0767b77c9c28ce1296c2da0ef5e285b0fb38819183428bc702b26b0ae0030df070e49acc40438baa50888a14f54a8a13f7f6bcd3ff14544afe61ddcbeaf118681a7b43c965f969c04deb4d8e860f083d8659a62e1155e21d114dd7741aaeeb8b781bc7f95256c7f1915e29670082ae9a59825d21fd26e06ac8f3e4f60b1dbd8cd59ff196291412cde99f4efe383f32f235010be4109c8aaa2dce3086ad4562a8bbbeb26de4f6056a801991e10580860f193d3c07eb3920599cce1aa162a3000a18c13379ef90590d6e0260799 +SHAKE-256: 08946cd494a2c00b0e9321af0c225309e9d1b9d14ce8eeb4ed5182031c3f29b0708cd8a24edee1ceaf383c20bf625dcdbce94504416cead3bcdb65572207b36678097a1f5c88491efa2392f470046290da06ee5370964dbfc80f1aeb4881d5611dd6c87d28e151749402027148d428407db197af35fe83b42190689455acb39c9fa8fc9e361ea33a264ecd92b82e7c991eb2de0bb583ad92b3670733e5005200b64afa3fe8f49f44262b349a9be799f949736846f90cb7fafccba6ab1e2b29f6bdf885e7772aea1ca6a2c971c9c8b464fc17a06f44c916c56597d92e3882f82661fbef6f046b737d51a3801aa074ad1f2b67c16ae2f629cd542b9da8b27699a1fddd0f4d239ec93e74e7491802e5a7f4f271c85ff95722f665131f84de26e9f63a3d7abdbf284e9e644559fbb76017c6b136f907eb3155b18bd42f8cf49899660098738b85ae2d259da369030a22256eec14a9f68f74a20927753679dcd296bc28227e380271b56a9b8d799ad6d344c76e40ce174e457e44d74b878159b43b3654fc6c464f25ec6590e4da4f5a6f191c066ddf4d9e93c215c10fc83082e71e6c1f4e5bdf466aba05328d68943cd1f1a6643302457cffdbe168ed1af88cbb0b762d048f8bfb31bd788d8db02ba68e544ba6d2cf587bcff7f28e44c0812123d4ad62747f9c024559f5c120741fc5032f101241a55662b225d9098f5d92e9853f0b + +Input: ffe6 +SHA3-256: ad581974ff7b0df546160c70c4386752ce54299e543b3ac95b0f3062a2aefa75 +SHA3-512: 0920fe4bcad9346fed8ed00e5e03f7e6366f725ea35b60459b5f59e09765571950e2903ea88613f481c7170a3a172ee2541433842ed25a1b9d19c662990dd251 +SHAKE-128: 918511e7f7475a759bfee28d0d39ba918ad101233993b382ff4c0b85ce90161712776a52f57e1fc8374fe677cdca50c56a80f30d47389ab4f1c95bfef80ccbf916bb12b9e02a2ac68dc10f834018822522468a5f88accbc6e5a99dc775853643acab45347c91ea650c13a72755dcbe08b916eef30499e1744cc0257a15ac6691c7b02fdf29c94b8f5a9a49d2381bd95b168a840a3c262b9ab0d455ce576b111e326473c3f2b51aadd589eb2c44195f99bca88e49d9f4c8c133072c1a3f615d13d6d0a4dd4d56511630540af1bd86c0ccb65eeb88e81b15904650b9a1e4c4c9849d7b78dbf006241ab334be7fc5172de1341001cd4138933551f87db3264c2c41e1977cc03be143541440fff9d778bf673d70eb9b383be3fb8b01559ef9343291180fe0585533db847217ab28be3559da19b5ddfd85e9898601458851ebc950532521bf03c97298e192caa657d2f60ef8676607f6a9baf5b30126d755f2058742daed9100d303060dca8a9ca4fb44066b6cbd14fd3280f4060bd2282b510ccf59f51202e8e5f635fb4609ab1ebf3b46a6c3791650a74386e62228f755eced0301bce93aea26d5dadfab9648a3989a9f058b4798570fce8709b3340f958fa348e2366cc011edcbc0e37188853c7caa34ce2d51129541cc9ae3eb9e8bb3cfcffc052078c3dcae11f68aa69b9eb52794faad71d2ccf97d1b45aa8156ef2005d98187 +SHAKE-256: a08da3fb5cfb640b24137e3d2835379a5ceae0635591c74228e524cdb7da37e56b70f040cde146699805b8bbafc4f20cf3f54d21ba5a19cf76613c343449747a22952efcd12aab67defbb2182a5cfd6cf4a1ce4a1e8ab0225191b72515142d70b2a2d5f351a2cdc23e68655ad6ae981a5c9f01634d6e438477eec4b9b0a69f7da98afea221fcfdd8f7bac47c0ebe6a510802332bffebead87a4ea4d842fe86be1216c14658645a097876dfee6eb9c1aa3b02809cd3de3abffb2611e8ad7f0df783c458ac02a52b493df113edd9f4a6a42a15135eaa6574e4a85d295edc2409fbdc4f97550290660cb49c23840327c22b0109fbb1b317845b19b6362d90348c05d3cc94da54cb0833a29ec71696f20a6aa6f9b0d7dba50508485b81c4c68e1bc2d6f30e6afb243ccff3664e4aad130aec4b4792d94f9899a581acd0fd1f52d949b0ec555e19c2bbed480178684c8ee196a87d475c41acd0d68e05d0d3cadbc9fd7e48ea14f506a0f6819944d75875eaf8b1f2cdb4f0d995ae33fdc159ca298be2e147ce3f5370a2d9636b5700c7296ce5bff266b1ce897cbeba4fb7980200bfcee8dd7eae98328fee41656e4a3cf6d675d4f3193707bedcbe74bd2f50805f715b04453b1ab38baba5b371c46c2c4b6eee5fd07504b8c6b1c156a62aa66903abd65261a810f34dfcbeb316178c947b2801445cccfcd4d91e3b710d56894396518d + +Input: 11a654 +SHA3-256: cadf843ed7a78e23f2efe6ebfc781f9b5580bd73689746c3f0f0156a1a6e1755 +SHA3-512: f3790f001ff50078300d72db9eb86412a85f86ee474854c83b7a4ebd10bc51fa461ad8e1797e9c2047657d35b94925f408fcd30662e82450ebcb2952c5309174 +SHAKE-128: 5e8c78ab6668b98083e2ddf60ca1fa9201060ea0c5ab8ea7d7e983c0f4e8f0eb39cedb030a177978758c4f0c505f5a47ddcb4e1760b9e438814e367c4ee0ba8334009dc211d92cac3d9dc96f4e1165dfd72c46c1d8072e02b02ad0be8fc35f74cd0a8d11b4341fcad8bbc30a6e7a4ca970f834f9d4270bd322906e71a4710b0c1b830f238e735db61ae7685811027b640639c168200da500b0d0ed083fc1335136b438c8774cb2799e368e5f3a45dfb25c6e9f48cc29529211a127838252ffd9d11b2431dc4571daf2f5447439fab6f11a061f5bf8c1406c11373b9cfcb6ba0b9cea8744d50dade323500951cd27acc03210ab1c394bc5872501c57a7c11e2f9421c8f4a2b5b11484276c08f85bb09445598e2749425450be45fd27f30a39922f7ad8af5edda3535b829ea0a194c1c29922d72cc1851aa7494324205cd165d23cc073dcc31b0f4cb55c034d9d792048ea3a063a84a6cedcd277aeb5c364b8356582b5f1497f32b06f3b19e13debf321fc04be12c0983c49824f919ebfc0d73d2ae723ba57023f0eaa737630d2f2bb917d1c4eb880a87609e2449998231a75dfd5ffee2fc9e60991d476d0bb47552d8706a8c0a09483b32805a455e18b1fe32fc29f084add155eac67b0a0fe9667f80da3aafddc0edbb84c6519c7bc1ed6d10b6cb3e6dfed6a4a818a31955449395ae4fc83bab0d53607c138508391c52b67b12 +SHAKE-256: 1f85405fa99fae5332e040268ea598580218bdaf799cec847159b9cac0b0a7dec3c71d5a2da14c10794b8c9948fc20af66fefcbe038b4f7ec71451948ff393854f80d28642ceb1535220e091d862e821c9b4e4bda6c6c8355672a4bc01b5e87b81a17f14d460207bdeebd6af4fd9ce66caa0245fbb414e3454d83dc22ecbc8efb3d5547f21835cb42c507442fc852a50a10ed7b791a8297036d4204d226957beca62cc461b297c620baabee036c715f0f0756c85c22a372a08c1479c801532c86d85836362b9ccd03754dd9f060b471a01102cf69488bb893beca104063db22fd60a9bef63fa847b10a14e1e9c9ad83224e3eb33a5573fa1f68dba8fb0a10707263439b2fd84c9bd69798aaf208eac2bf2d7f82ff2df47f9aed97ba94f7efc18b5eff9c1e891a78c6b42d9f7dbd5c9ef409cc25af7dc2d354343136741857321d5fb92cc6f52edd0ce6a7257adca5b88167e2021cf837d1d4461e5d6156658b8884ae87fad04ff7905f89720947ece55912b1633203ce874694a29a21bd29678d1d13c70240e5476ae103bead724f65e734f9bd9e23175ae4432968424d52ec95b75593703964a665106ad1dfd25eb5f47441303cb1f882e229024a73c93642a9acac84026d2c28ee861659584cc4342c31224b6b2ab006a3e021e25b1cda9bdac6445f8ba77bf1bfe0363ce6fe5fc8eee4558c221aa290a8dc3735d80500f2e + +Input: 9fc87b9c +SHA3-256: d6bc044f3c040762bfd6714b272aa6b0f592f6f5a8438418807f66def7f8667c +SHA3-512: f7e9e5f13338d81148e5b38856e23c3de659e149cf2563dbfb862835994a553741845e03c39b2b2042a95edb7e8e03c773496cc86c489918fe43bc37605e791d +SHAKE-128: 0cadb697b8cc098f18bb95bda4bda04d8c73c26ad25c1373d348d663cf7d162eaaff6515990c7251a7fd21d2ad82d5c45ab5c8d0fa876910216c8da909328aa2b30ad73c49a5c3a88c5a24a5b521b27b112e9d5dfa2f476e88804e27756078a98f1cb22568b3a3dc76f42602814d2ff363c932d000fd5625f160d5eb38570df81674f19b2cb0e04a88f92ed559d0bb439f2e1eaaa6650e70eb234f00426e580e0e8de5bc5aaa6e54729354e95775b39445f54462cbf4dc35b2a2d0421ad1f17a9b02bb6c11bd4745a8c2511aff4027b12eef7da3924e266b3566efc2de97d47d88f6381d3b8c0d93535d2ee5972e2d508227ea9e443bf74f088c4d8d7ea13cef854e28e50ec712287bef78721e18eca806379dd09a743ae9656df5e844af9eb58fde125c33d3fcc07e54a761fd784c62e9557a8b60111773616d2342f35bc1c9c2327630c438431daf46e233fcb0a4e88e553b1d36c8363b3c833b055a3573778a0731fa9ee54ba3a19acb76efbbba062f9aee539a3db1753ade94368fa9197b52bbd61abd01fab0841a43129034bcc56d1152191cb28afdbc44ee62a17bbbd55216348d33ac6de7880c63be0430ec181d4972cb23685b734f409fefc6b9496501cf5b783412ffdb10d481f9b7865f49b56616fe22c69976315fb1368184e375b8debb8ddbe55d9df717d62c564e167ba6d06b9f010a0c07d172b3b2147621c2 +SHAKE-256: 8248a3121c02a23f36df9e1c64b2844e57b5b5fba28b2c35d2f33045be874badce70360c1752a27a6d895e48e8003f60f12c2aa68d2ce53e2ba900e190c13f158c17fe3a292efce04cc82627f4bd8d48f61fea209c42cdc88e1b6caf114a3272b471a9dbd1a58546da3d85f33fe9ac53312ff5c7bfd02c79e2914ca0f781efaa2459955b0535eed461cfc62347afc2f0e223f59a21c1861da0eb3ac39af381c8b6f18d40c366b23f0172066c3c5737078d0cb87fb4982deb3054e4671556b5c172c892cd8845fe9d1e15f2b88668a532aeff5c777d89cccfe2a1f3aced536cfed22cf840fc77f918e9b431ae7430e371cc5e73ddf0faf86c3dcdfebc80a42eb7d044a4c6b12d02a4baf46d67f7b5aa6670525e673231c245e7e3804679c5f9be3db4dfca93942d54c124436be80f0165938adc339657b23f0f6e0dba9de2d07bda3ca8195282c183b8bd250963f59b62b53676a85098b39e8bae576567f14835ee125ee1efd0d136707ec5c3c28db9539e6a1244c581784e39dcd7638e548c55dbadb980b41cc18ab053c32bca5e00de8b5eb5a8e4c17a896a894ab195958e2fde195153b7db73bae4d42a0780b9924786769f1be6e2b1d8ebb3b3429257251e373a351f651e7a06f6601557216c2f0d8c9d5af81aedcc7cd4157de5a572ba7a66aab87dc1f58d4340f5fc8c285e58ad6053f334313e9e7a85bd631dfea7473c + +Input: 7c518d2209 +SHA3-256: 71398643fc90d0a8deaaa35af60e66db8ce8a26dfe29127c28b2a863cf0a6055 +SHA3-512: bda63ca97373b6552963805f07480e31879773ff7f242c14ee893f908970ab66724c21574d856e30e66eb6c58e5466a95c2c5985fd5a9689641f987f48361ef7 +SHAKE-128: 41b0c62b7b258ed91fd9859b087145baae04fab0d3d8fc646f6d678cf7ab1de223908737bae96b44c8d293c87ed14c48e4e053cf135e55d4d46db250594ba9ca69fe7ab013cd51be3cf94099e7f68409eea430193f4068047ad8d4e7864959f62a402d56deff2471e5a271ece7c426785f6e8b69e8818d571c1c7a5a642db1e88daae203943f956caa6579fc0efdd8e53d53ef78c455b153809d510152a79b5e29e402a2795fd662694ef1eebd3b3ad4b153275a5556b5cbcc7811277b9ab940eaa1357b721e6eda70bec722ba3951388a9b153f07221c72297352c514d02879a598358b79facfcbc8f62c4bb95aec328eb504dd98f1081dd2179528290909548bd277da6f595195324b63022ddab667ae1e371097d973998a008a6a170a9ea733e4822194ca02ee964827691533215ca1892357cef581edd330e666fadce00c543f0e1fb1022664132d5b7ea5f10ee7c3784999d32a1aac9853324a1bb52aad18ddd49856462978037744d6468bfec992d66bd27055ed8b5043bee51bb3a1271bb7478d31cf3c0d61ef56fa50153f75aae6807d4b73b1d3d23e639e6d538a6b9b22daa4bc1f297eed37c7de4a597cdb3f2ee437e42e9aca0298e3f78f2e79d7324b8d1a5d642d98bd223bfffa8244c930bd2b5e945e4e3ff5e1620586f201f343c1c1f3329ff5addc2d3e10bc4fbd83e0bddbc98bf8feab260e94c56273d9bb +SHAKE-256: 7d891923450f519128d72794d8fb529f50868ceaf17b160e311b173ce72d1b05617c374c2373d40499d27b724707931553eb945f3e5c60689c0e18a1623477ca48652b59b7fb8a13b3c8fafc4cbb95243370380c475c5b4ab88a780ccb137ed02111917b50915bcf68dc702d86403659fbbae0448a18651a34b85b49ca02e3752e0cdb0c256d8507d072548119742540e983ad4551be9ec158ecf1787a20c54af359df4e04e12e9cdfc33d43286203f361725fff83af5727e4a8d4a566664a4efc77a39ff6d3ee9bd3b99d8066dae0be2789682d9d161fe89c78b48b83ca174c1daa291d54f715d8ee7a34917cf4438b707495eb358b76fffe91dd3cbaa2c16121cb0a9031ac55476ac75b30220adfa913d5aaf3a827744f7faa99643bbf854eb69b21257e17d42c692fdb87fe1657789886db2383d6a3474c882b619dc94ac203f851436ba1d46b765fffba01e5cd8946ccf2cbaa8241f7ef6a550e71b79a94dabb6b5d3d92accefc4d6553f81bed9a226bffca001ce246ba5bdbd1c41fa663f6ee72252700b0d9758211be5bf1846b875692b304d507879de451a21ecd2b3cb20185a6b278f2b5bbfd6444712cf3dc295c70638a04f3ab6190e815551d1e58d83a6e35bf3fed2520ec98ba4a7fbdfaf0eaa2c3da6d9df83234f8999458d4f153e236cc586b249debc27302a8e9a16861ce2304562483036d0d4a8c58285a28 + +Input: 8227c838da3e +SHA3-256: d88ae623fcac9fe12649827898db33731ab7bf20b9934888ef9bea3bb5d9c27f +SHA3-512: 305d3788da885cc771a52af3ed3929f03645ee11ffd275eed8d375004ab8073eec30feae99dde05454de1dc3748935359de710463e38f2565bfa5854779fb7b0 +SHAKE-128: 3c3a2163bca02a9b2b928c8c178013a16c019f7ac840e075029656c9e2bea08737735113f7171cf416a4f9768e1fee7b1b6d0906157709cb6eb17d93559e39ba33f09bfc8439cb7851ac89cdbdc69d984389783342e1d5b474480786dff485607d0c941c52f52e8988d95f3402dc6ac4e72755221ae06b5301e373d3c8bf58209fa710a53fc2627d7cd62e12eff1acf71aaf6ceba466aede52997bfe8f232635088975391d1a58cfb8944cb8606ddcc8be054cdc3a42b9303e4ad69d8098b78bf3216ea57062590a826326b87eb5962d0923acd72fd4585d0eca49fa8b9fbcee97dac0ae988fe28de40ff670cbfc888cede4b666d89ee0b791a2fb75a01971867c139c85ed68e0f7ffbd3e990439bb335c01eb9ef28d6e8d11f0f7f04246bfd40590026e7f9dfe0c7f2ac3ec288f9afbd0aeb7b36b3544e27e591daaf643f04e6d4983286444c948b6ebffd7646cc0f17537339a8e71e7ebe7c181ca9ea36055dcc82e9e54e614d04b980887b4323a28afb2952e0c51e2b2b6c9d08cdf41c39b57b1c3a62177efeb524e9487279b5760efcf2046588b549faddcde9162892421f02a15b59375750197b839b897a6559d29d786db5ee5ed4c698a1b70b8e25304ae5c0162b7a4adb5c23771df1e719230b7bef8292753dfa0b2712447fb070075a77e889a6e49bdaa59f2495ead0d5792b8240f8c968223f49e0041c66305b9bc +SHAKE-256: 4221abaa92641871e69e5da3f2df48f8780e29577f03465caa2c4f3438ba170326bd57e1a3ac429710eb6eed5ad425cfd14c10b87ecdfd80b3dc059dfa00547ac4a377d2d3c1b8488c0ca438c88f00b9899002229c809c29aa61d3d7a42c777c53b31fbffc1184481e555645b6fc92a1755c30af25a206b13529606931eda8d96cf34de3e1341aa68fda7238455e5e999db5f5d9ccb2a02058ccdcd2426a3808d57c7f2da74c579738dc9f4b30dc70be4018cf8eed1680fb9b02f11b1d943afd7fd9d2b14093c5c661bee9735bcd33588f6656d6a2db3673ada616ff6c75906c23606947cd984d6fdba218a59bfe0976cc6e142beafef8af7b8e4c377182b4e930a279cf02060bb5af95eefb3296a259952a7fcfa9a6a27a4a97b1509d7598f464e63a13c3658e33d193af77dc98f96cda99a7e22c82f555e58d479ccff946471aeb7af02a18106ea665cc1b7922498087133d6c28ae1f4b8425a70a645bf755b6dd0392e0d66048ae43f5ba3f7c487732250f1ea4fb7ff7b52e780ae400699d4f9a0b0d90f58e2371e497639cec5138fae155aef6d16002e52699b7ac188905ddf094bb3519cc658466782c6a54cdb53e7faf003de015dffa7d822068bbd19119a294c1653f1a30d03046d9d9975c607c00e842c9683882d93b0799cdc45985bf4e05e23e86b3f7b1d23095dbb44108ff23aebde09995f142a22d703ef5d899 + +Input: 4f662296b11190 +SHA3-256: 71d13f441503986a93836b2382cca09dc5fd79243163b8cc546fae1f0e7a2b49 +SHA3-512: 8db9bdab35e5c755ed9d269b6c8785ecd15bb6d6175453111d34bc27326ed07d4fcf28b28f18d5b0f50197f5a9c243014527dd40bd5bf9a19629e65899e9ad1e +SHAKE-128: 1334c0fde66ad64a381e7b7f4654be757680d78814d751f1e444c2a3c9141ef6ff5b29e61c07f2a206d904bd67cd2637a7f6f475dd83434709939b8c6e5c94814a29eaa1eca4af7abaad9249f7afc06954b098cfbb3f8e87acf500e89a27e1db6221c51af783b2ade8a979ad093bfb6c75615f15c0db4a5de178a82eed2e4a289a3b5042246ed9deb55a84ea54a8ead119a8ee6ab3e5b350e7a2321bd4d5ad7a3858fbad294b1aabaa384e238f273399981ec6794d2db723111653800ba3f2b5e1bf3715b76e740066f0fd5c6bbb4f64c20ecc7e74716e296c81668cc47b6b5f3020f4475a4f9a669c9e279170b2bac0ffaf987d9929c3d7b2ed39c79c95479b12d77c27479951e299350f7ba9c0262a14bbe42ee4da408ef0abdeb129f4d59404cd290e32084f8827d05116165c685af9057c1eef166163f40b6f6b1edd4d8042b87d1e8b374a67d187a1b624caf1e883875e58d6acbe03c5b7a9afb7f01908eee831f7cf9dbebfea4846db2a7af020399cb2f199122e55c151ebfe1fbdfefc657a9ec5ac155ac52cb13df096c46e60ec12557dfd8fd74615073b9e436626f22a3b5b8247f0b7a8672bdd86cdf7e0fc4fa7e018a734f3dfa71b09c3e7702b4e942f5bdfe051f9fd90a7940df05ed388a53bdf68a5467eb03e373b76754903f0d33df84c51e71ee6d0eb46809d4a6afc2a84e7f3513593f23dd908073611fc6e +SHAKE-256: 30be161d2a53a1726311cc87056eaa95051d545bbae46d537b8f7e31feb04ef9baca4a94c46ae583d5ddf2b6c0ca4894df1ca1d529280e4347e426681dbf2a323a0d46357c3cdb5c384dd72a794966cd29a9d7cb71c4141d9042fdf40ba7c594e9700004e7066a9eeec6642b79f6259e8e60f259b10ce2c7425ae8a862b2832278602cda8c9523ad2ab92d837ea2c8355e1758c6a1bd4979170befc8496d122683e7d2f818e119a561f1320dba7c5edfdaf3fc18205c568f0037a454b8b0fa9ffce0b3c597c8349d9b596a9846c43f4dae226dea0190d2ed8816a12a07f07c24a6f893cdf90cf23926b2ad9d6d2e8f5c71d248bc07ffd5c8437fb2524667f42166c7bcb5a18dace4aef5c6a0e7b6586d1609c102c3932662c884549c5af31c06e27d98674df45ce58e242bb580f522a594a9b1027e0d7b7f2696b8e666fa3ee1ca94cc449da57ea3a373edf7db4e508e66407a47ae0e778f9a90747673b6cd0bc8c187c26c2a777e6fb98a24717e7bfe12729245b1d16fd555f5228fb8710b04f3d70f8ef95885efc2ec997351533a5915634e7b975be56a689d8ef1385781407c5d8c250c676a0129d5073098e9f6b8f1676dc51b6c6799eecf9df58c69c44e062696ce992e78c00fd541f114101be231262d154130e3bf98b9509c59b50ac9c40f8b608eaeba7c8d7334613f58cf59957622478bd4d2c0c5fb796d5fd83d02 + +Input: fae2503b2539e4ef +SHA3-256: accfa4d9e87975dc9484f59c4f74c2d6ddb85c6eef7be26c00deb5f6c0387b75 +SHA3-512: 126643570019138a7c9a74ca9696dab0ba7aad00a988df4b0c281ae5ab318c19ceb0a7260c764d3268c81ffb655d84771051f086e3e785d1f53452011af0e357 +SHAKE-128: 130212b6ef03ddf21acc384a8bc12ccf9e75acac27610eaff19ff0195cf6ce1bb9695fc2475e88d7639abe222b85fbcfc7e744934a34057956934b1e5751431313df7b255e816504df399a345bf87a49be2059dd6223a51d38745d7c9875d4fd1c3528121f8a0544fdd00f04f81ddb7d243db21c6093f471a77390882bad02021b497e7214aaf38e962ad58b20d3c24165951e44c3080148419f96eaea7e890ffe1760b4655af6c05aef3b619ea3c9e8ded69e65f95e3b5776335064bee0120c8190e98973a084326cab4bca1ace3789729ab97421c894934d0821277ef6a868e1ba590e0b0c15f838b0494b7cb5c9b1002bb93664e37321a1ce6d549895160084f7a3bbc8a46374abd4f2a7ba75c055130f0d4a403c91449e6bb3e022ea35ef6b97df54963938b2394b50954237d8b93a5153a919b7de8e731f197c9f8532c26ce238660bcdebbd9021473e31761afe37f7f3e4de3a039300ff197ebe31c8d52390f56dab1a3b54783397920f883b2cd6e0a9955dd7d75ec0e59b92e914e283af0306490cb5c137ee7c3bb35b0cad5324a7674a6ab025cf2ab4bee85564454a0ac3777c135eb9ca537cc84194db103395fb20730c981706183d40fc3235f59953ffdcac579bd42ccf590fa1c9ced5a425ca1cfe9eade0575d37f2c4a1a7aca781847f9e76692bbc7e0b9c4f1939689c50c64a3fb176306cd11647a5a7fd5020 +SHAKE-256: fc41fc848ad550fc33f77b678dea5ca0965f0e59f8cbb77d3d8dfa1ba113b50495034dda20436eb00c26f403a2d087ab170142316dfc89484c7a43d8b68779da248fcf1402a69005154d0ca3deac843ee2c3d6eccd14739a61b6eb031805c4d7e37f0282711f0ffa5d59a924493e57bb1573821e88b32f0078e4dcc2117f887425cf5684326a2b331927c3a1925cbe615238cff89c299a83d9c17fff0dd11d12dd50711562ef5e08b03d131e1d920acbea6658446f1aafdc774dc4caf8e5d9176ece53d5c09b93b9e3ea344d5b6ac593e734619c30126ce237c904285ace9f17244053cbe2017e3a79f4778f46168fb7d05f46d103c0d6358220337e1e3077e15b474a07a17f6a75855edd410623f6af4dadfc6b5c336c1e45c0acebe61b95ca42227e09d8768bb78f0f1ff7ab2803a7e25c8876dbbc6c45300a861e27c0093bd0a83e2d494615ccf5958f3c68d8f97d35438c9adbf873048c61c6d183ec0cccce2301d7cc1a17c245373cd6bc177e1557534e3b55e85c3e925c7608cebf4d06f4525ee5aaa20fa628b0e3338188efca66969131efd7577d88fe9715ffb019edaae83ce7702dc81c68a7bab54c2c147838feece6c2991bbcd7f718d96aa1b180a16984cb1d71cf48c0c635ce4b386679922d0c0846a846d1fb66b99b36b1a6a0a60b7ae87b73f4a7f4e2ab28f1f691c6a255ef336bede975946ff510a73ed943 + +Input: 36ec9190843bde0cfd +SHA3-256: 5510a8c5cc5fe00fa20382d78cf48bb194493bf1bb82e2e836b4e4546ce1edac +SHA3-512: 10eb990bdc39846694a126c3383a4564b197adbbb84feff1ec53af2feefde24292ef84882647929915b9f50c52cae0c9a1b076f2901a494a099855603efc3bfe +SHAKE-128: 8d84aba1072f69c1752ad15123726fc207cace0bcb454d227651b5d6165f784fabbd96b13ce202e0fb923959f378d8af2c1c27f4d7c7742550c4cf9a23df86fe04198ad88520597fe86fab4e60487eaa2aff8effd2c801bd5cb13d9796ba81dab607f129676c196c9fe9f9a1c5a933403d175b21cd5c72ccb9d50f5f26d6c590bd12254e4764da7d8031cde0f93d5fb63e311a7c846ff0a414ae38e92422caa96887cad74261eb0bcd2bc678d5fb78d8ac017b7932ba2d7cc57cf44e688ab4a34b17cfc3bea1f0820b8664c98061ad49e75319c5107ff8c68288495744994a84593ae974fffeaa532f1811d75a374480b7337cb099c232846a24525b4ecbd7e0dff2912371e0ef413af74b9586dd0f091087c7ebb17e9e5e910f79f619881f171763456b006032b86ecf8795289814d3380457daaff22c2507298ccb05c8312459a78130aab1fd476bf6e39470178b5055578f0042b2b0f70590abfefd191ddce4fc99976606080bf0326601b5ecb0555d59d670ddaa248893e5a628070e791102e3c6abca0a60b4f0735a51ee7b9df1fc6e0033074cdaaf2399e8939a8265440a340b0868de27131e3128e8344c19cbd580fdba781f30b916750809dd43d4418c5bfb179908d10d7530eb77a1c844d4b7de0adba12bbafc93593ef64940a923b9a440f26ebf43a1cdcb91b5f75445463f62f8db4b6a0691e93ec719c80aadb6 +SHAKE-256: 8a7d7a8367ed699ee74fd1ac4d1950cefec733e02c3d3bc90a11fcc0fed37db4c1ff92b28cdbaeaa4db1155320b88ab64a3e4b741014dbf3a820fe5488f2639d49c209952e9d6952174c5ac2a2df0204e8686912be4b5c50c5ca1cdb3b6a1116738882c749a5eec78a758ed113d32a9124e29ca0b6450069fc1a9c5ace62350bb3902926060b3e3742b837b9fb944a0961816543a5abb880c9b0a3203f02c1c09a5f5db5ded3989df4b4834c6e188de5361b8d2d16a4816518a654a6a85665bcc7ed1ab3c5fddba195ce7c39ac58168b1f3e9bc9886ae269e1edd6a2391cf2babcd755947544092432957c6956381d7d854da1a1be589415fb1a5d7970a620a6849831c6ccf1c86e8dc5082a0d6f8573c2bfb54ea5418af5048c573dae47eeb9103075198d17a36f418c3d605ff078ef85539c1898f46e1982e2a880f2d0c7760becbb54c231436a1a50983bfb3b7bc2223a0df901469576bd7bbeb2f318ef5575e230863928fffebe1c37b83cc861c5aef03bf1ac2f1ce03ee0a0e29c4bf20bc51a623247b0633e950b62d52119c9e52c0911d5974fc462a8f8b35eef65e623bc87354e16e1b67cd32e8e7743db45a8ce00cfb227e2eba8718847627e4d1d614a51b7ef205a3f40a5b5bee5e0f0427482abdc8a10c121617d2d3a94e2f2701347058724b5efe28dd320b1cf098d5f20b8716acebc186016c2731f21da4487aa + +Input: 11c1adb3bbf568e78273 +SHA3-256: a08841f8bcff9b3b1fd889a949ea20bbe48b13e4c770ce18e544ce3dc6ba21dd +SHA3-512: 345a95b8628db509e6fa8657db263c5d6313dd034ac42fcb2b7a7401df8843e0b7028c10aa39360fc92ef47ed2c8402c14a8135b8c70ae5b585418807fd9e895 +SHAKE-128: b8359b57c2229241fd25c3ffc8255250a117279b08f213fac689445d1f798e7fe3bac3c783c56679090b085031d97dd7417c0260d289d04fe74614d9e3eb5dec6b14e8ab314145de44a445ff0b8d60c25d03e9a426284c66151c7d03846e29ff07e0180c0696f121bb3d6f0d677abfdec59dff379b485151e6ed915e4edd0add374e741a0dd449a405c07782953e9928fe1121135c6edc3e23d42f98b5afffb9f3eb6b3265dfe7bc36be7162b9db1219391575d654ebc196e292b25872c44a87251d40a9e1a48ec9c520cbeb745cbe6d908545a112a3155dfbd12e556f2a636b8ff61e92f26145ed20904445891a8d9bebdd1425e58f0d2bad30137c3efd4454c54587093aaf5f5700deba8e7d7d1f90fa5b0204fa2e62dad742106a118021bfd4508f1476ec98c42b6747aa1a052f47cb1fb3890b70376cf9059069f0b5eb9227664bab422cd98904c4ee30d21c2432c198d9c5901ea605215e7ec3202d1587f0f09deb8adfc6b4fb7a65177aac0850e00ddeb258254da34759afab0fcb365dec73bc39c81e5ef32f5c9e8e017967df4958f9aa9dc592583b7614cc6431587f69c1ae749cae12111e2fd11cd92846e61fa0c1bba2402305ab6c56b088cb67569b6347f01e6b67e6f16c8bfd1fee595dd08eca56cfcf48182e22a0d51b1e7a6522c0497ca10b0e0a922dd0d312622657652de54d369f47e9088320b5ceb651ce +SHAKE-256: ac206334849f388c40f75d118928a802dd2917c8bc6f477c075e600be4d102d1682c8ca2f66e2de01f64499432a1539e94be68a7e055ae4c31fd9dd9f7ce6c2455b10fa40c9f4b785540fae35507641335c01babd9f4ea3dd59eb1113325a8d8607aa53da35dcc0199a6f4d085c778d37991c8571a38733265e2af335f249d583aab3d6a9f84d60d6deaf1a0c35fec92d5d521cc791dca72c31d907dc3f7a41dbfd1abf96757d7ff791340dcbc45724d35271171f35d10dd4457546980cd101b274413c81c20075a7f9b7a70b821733c33b20ae2a3ad8755b8b0f3f4c0df9f804f58750d8309ecf751d4dc9eee69c610abcb3761dd28f5ef609c84ffa20f47bd5540dc7409b163c582f593d9b21c85ea30dd304bb500380c9346588ea91bbec0003b313908480db0fde4bc181df09373a7b4b7ad8053a9dbc908bd84dc5f44d518b1f47d6ceddd703dfb4356e6dcbf07a1a480604eea40ebd909796340759ccf4757237e98cb8fa33fe7ffdd31b7ad23ea773984fd297455267aa82a6ac5d34e00933ace84f02d1e5d97293f0f5ec2ab9e5d3b3efbc7cb4a984db7333ed3dbb200bdebc3a4fc09a3540913f1ddbbda354ee151cce1ec77c8a71d97a0ba960c844f6d161793d2ae2f58304d49f2c17f1daab6a76e163c921d7323beca1223053c853762b8c0f93ff6681f35442690b88687a235a0c2e46f4597f7796b97693fc7 + +Input: 043f0c672734757d22899b +SHA3-256: 309a1cbee401a477764f1c96f91540e22043ff9d74f6a89c760b2c68a19e86c1 +SHA3-512: 08100dc4126f7c1498b1b9b8e1ab03c4b93152c00cb451310a6be8dd4bd95d7b5249a56634fe37904ec014d2420379d609a1deca380a9d03685597dd24374eff +SHAKE-128: f8278126ea82044f9d2057e2b5667d2dc110898bf65146159c11d29d636ff0d9c6bb47fcdba5076f7e9e501c007c27333714ab470a5de3445836995fb2040c9264bfe7efb041a2632f5943e064512364ff63e16f0fef097331fdebfaa84146a29488ff0cbe48ed6d77316b8efb9d3cbdde38f08772c925cbb064862b228927c8a2d86ee37db1450e85f841b55e6ab398ec25f4acf5969d6f487348e1a501cb51a1c31110193e5c555ca99245ea79ea882c7d2337b2014eb690e1fadba57d8be61920f7b6dc19498ec0a0519781cb50328100ba340488af7b810081bccce6a835b322a8d94c5e19f826d7955ab1faf4b21ebad46e91392f1954db6a25e3bbd2cd93f03a186d1e2f658886f508ec7a29fde9dfc83b562b16d97131b544e3551b2978d9b83cfa4debc1970c593b69ebb66efbd3d24f5e4355b3e2a64fc717b9ff033414c8da2675e751774fc39f1b38158326d91c53099c66d5b15d69b22ff68bf44858d00ed43d0d2142790ffc50ba5297c5f1216c44c7d5aed53cec685730771c6403dfdc1126be77676d91565877fcc40c1926217ed45383bc6ec956d108ee74f922f8809d248de7ea4ff35a022f94d9d59d3de13288137e1949f3cbf609af06a4e64e88bcd51c0c7f27cfaf8773bf7079bb803e0df0978a90743fa7c65fc1d9130b463e8f1cb32dafb4e1330b669ba34ebd7fe6eb40f1af2e379d8b18a91ce4 +SHAKE-256: b288b308fb32711a26c8e803ba7493ebbf1b74a9925232bfab56f40488658c1fcf5e331942ed380f5a7fee75993274fbbb09f806988af7ecec9740da23e6bca66d3765cb401889c82c2e0e2d16bdcbc334208a9bc0ee5a7bda1b4c7990b324e022caf05b598f116b52cb09e59a429c1b76f6b0a2b529b87e9abe98099e736dbd6e318bfacc030dd68fa993754877969f7da3e55f3774fabd2b3cd1a515ac6f01baf8ad57804f72eb2b55d5c1356000cd77df039024b6e9cc4bab52d4c01440a6ba89ce95dbadc5af743bf032e08b6aa30423e65da56d93fa145981863203b06a7a4abcaa62517d920e72b8573afd6815e2765339a9ff01d64abfad24d5ee18ad326565400026bb4f14af8be3b312ac6ae42889428b82de8a531a8b183e7add6366c1526d6a473b1aeb44a893854cb9dc5ac3345a125eb3203b6affcd22dcfff04d8c702cf9f44dd97144272eff2354deca3c0f8292618b3b0da43e30d7d337a28ffcd7f191ef0953b1fefd29de0c64e0f19d07b5079d86469bda5ce5be776ec11f87315826e7622c5a0b3f0e8a2409855bf0b5ebac7afdbf4375d476a4f68d790122df80f16f07f01737f95828ef9b562d3ecdf6cf5ce812eb8becc4ac78f7e1bb50f77c80e17965eef5d13dd2b2cd51319c29ffb7ef8bb17319a0f62b3bb52fa89e7fda397f2d831ca9d2881319b8421181ea5d251d42703ca1346845c9eee5 + +Input: db9e5816e1f35ce7b33e6cac +SHA3-256: 53b707ed1ac627cc458384fdb40fc138abaf4d817e87622c355550ab26bac330 +SHA3-512: 303d3aec5c1f7231c0e55801064b36a5704b415cc5fc652168b3ad2bdf8f21798479f6fa7927b5a897706c88d67522fe9254c95db10a69cfd82947f39873d1b0 +SHAKE-128: 045c70d2735a302ec9ee594f8d4757267914249ebd3e0d6d349aee0f7a0e8b2a6d13729e0e6a629ad3e3c00171dd6d3d9d59418005791161338fa995c7ac9cc2639ec27d985bdb074d64c703af04207fe72bc57972da2ee9b81eaa71c278467e9bfad32ae9eea648069264ee04fe14ab98c08ad79acdea8baed2543a0ddce05a0d0117c00000d09fa2ce37f0c10a496cad6bdc858a019ceb10d8e4df7f1059daadcef7acce15ac3c54223aad1fd4ed401aaa93041059c6ecaf88abf16f7a0dbdfd0f0d39e0191d3c48fdd6208c481d177e9c429f87fece2436e55c034b2777716fa69e08eaf305d3150e114e1b18c3fbd281ca444f024ed09351882e917585b8d5bc7a70d914d954704f58d1d8d68e459671e22d5f53c7c09357dad1cfe5f76fb6fab8f9a7cee950e0c46ecf879f5a7064f5f58ce324c8d54979a3ba7ae0b389bf228fad7453c680427072e4cc499ec59516d51a52a2d1aa6bc1975bf6a01d9f331eb5589a2cf8ac51a8d252988791bb80a384885ba99e73687428b75244447648d9a0f2b879bb729ec1cf5e477bf51a763eceaa7f5a83c2d831e216d268edea3381c224cd2f59d2cddda4f17f3b1ec2c9385347ff412ac9c8a83f08c5a3852bb02aca4cec85a4d05b48d12736dc83d9baaf5ff18c386c1b47423df60f807c02bc544496d1579f365a085e5b6df6590a5c40e350987412c33846031d10ebddfe +SHAKE-256: 4b90ecd04c70c519861ac01ee4f2ec22443273d6d8ccc49b8b63ff5a7c3824dad9d3b046f783f8b9fa87c1bff3371f80f306e95652f89de91d3ca7e0f5c11d397b3acba2327a7677bf81ec8b5dfb1d7950be9494a0d829707152ecf123eb4338cb4b8fb2c172393d13f25aee9a50fe106055aa996bcb61d249ccbfffced3dc5d1ab84274e8a51849c79b0552432712832e3e0b9b3d791b1460f75a390658935695837e27fa87a6842b37333f490733f256a4d2631ce94ab3224832495dcb36a5f3cafe0152865cbd464a1b3efd05862484437845decadd55cb5a431e846c5f6041f21b734902e675c46fa9a0ec6d39e8d90692ac02b1d6fde8471add624f4b26ba5b46a15fe453bbb0d4bc4c9a8ad9c990cdb4ba8803967985518125e41e178879ac3d5a2dca80dcab74a209b4bb6cbd7d4d71a7d2432fbb739027b2223ec31602070db1c7501f6a9cf0f4a9eeccfa4da9324457911334442eb7da8557a4ac6a97cbe7debc339fe99807724a6ce78abf5f9e7a9c3b38a9817b43bbf3952e353b9a0ce82e8fed9b0ed5db8a8734352fd72d6e017f6bd838db7c78a09c40c1c902ff15e5d6db094e106e8d7691b16319e06550c608a78592dd1228993a84902baa9d96f6e0e52a0d86681e346098fd2f8cae94efd77b55cfe328984547c2cae42b8ec843732d70bf0fad10dc9d30fcba98fde7454bc3c78db0b7de1b9558c44817 + +Input: bb47364ecd0647d77e397730fe +SHA3-256: 6f71194df501afccddac9bcb408c774d7041ec29861cd2d1e4ded3f079dab513 +SHA3-512: 484b51509d8d63974c80cb3592cf6db3be77ef9a8ef97f9fe39b5e2db0def4ddf5ecae22f0784f6f768c4fcee3fd858e36ac93f56a9d4a92bc2f07cea6d50cb1 +SHAKE-128: 297910584ea4e6e3b6eedca785d817f88e95aa71eb7902a86e55fabfecc445fdab4cdd067ff36b68a7fba7572aa2b1e23f724efb63fbe0f0e433ec60755da0faa1860f127b40f77bf7fedb5295a38c75e7397c1f8b67fdb98bf2c82ea147092a31a968403c9a8669d5e1273fef400f326b66c9d0257cf2c42168b031cb716d4a94b15c1fe1694ecbceab12e8b0c5b9fb4e2dc96d808a30b9e6c7ea8c164076331d7dc668f0fd5e5184d6a5cafa5e181618debb0a99de1ad988e5d59ebd8769474a1b702a44bb422541df91bc0cd6fcc186ab6b19bbe5a408fbde50a0330c6d10f00940ea80694a1a52b80c25cba15fcdbe64b1f26c277d6ded1b1122839979fe84c2f8d37d65adf7bdc0f95a49e837e19241769a28fa378ee291e26d92b50d6332a451e0790db8d44abc632712792a0777a99e219c5508a1ea43bb7442badb63d0299a956f87c5eabddbed30c57dc20bd3643bd8cf2bd2c09d1d5e5cb47c6d5b972a968c069705fc23812193b8d7a9eead3e6add5297ef262c7e2a1899dbc8af325d78374428277eff5a7639d53ea7dd78bcfcd6e6ba0ee678152da8c177a98b3f36283f2c41dc10b118a218b78c4cc975868e29b37347132cb324be9f84f7b24acdc53078da0eb7edf3a415d87d6c0b11cceca8b1df87d44c231c7c4e265d3811426f1c1b40ce97770c35d9a277c027fdbb1bf774487cf022b717fc4a4c7ef0 +SHAKE-256: d313f55a9518697d46c97a725d26c23e3a740eeca5f168b871885da9a6beb576209ff5fc61442e0b3c90173f88fb1e6ab9305aac1a54849f16fd289b5661dcfd3b91ff966a2951608fb63a220cefb7f4bc5eef965f8c30135c5a0e4eb17f40f3abd18c9067394bc06ab6cc9898eb2b9cd68085af9432cc29dac718ad885f129510f415201841d6774d01aa1a15f870c494816ab4e13f386ad94a279408af09f5b73dfc687902bbad653d375ae2da8ff9c375ac7a8ea6ab9bcaa10d85bcda53c73834d4401fe5186b562d003595007decd722cd6894b18e3efa426c260d6452670ff9428299aa702f3d31e9a336e147414cdf1c85522651c3dd0fdcb126e56dca18f2445af4e123322c0beb9b8e186e67ebb3c00cc657aa31e23b6e1e73ffd3596396cc0a682ab5c8d33239a3a7d82ee90fdcfcf56c4fddb53089e5dde57bfe16991e5211e50eed627092ed4984f266c2b6d04aa4668ce7843ec63482dbb4e66ea2c0369d765dda72a97efacc51f6bf7dfd5b3347e421f373ab4d02eefda9081a1e9978c31bc940c92cc29244d17d4f050362fabbc3f98959efdeec3f3f9c18396f4a3cda066be65646923ca6374a77f6ef0cf85e3dcc06473f40506d5ed99e09672aa2bd7d3e71d05f5b116ceb0b2e2221b05ba9665cb7fc77432e1af426bb9cb75847a2a57b0085858336aa13e2b41d340820ba6fde5571504d60781894c46b + +Input: 7eb6e8745e9cff4a1c7332094427 +SHA3-256: 97adfeadbc7bb16decb0fc209162e47515b79adf087cd2b6d01d71ff60cd97eb +SHA3-512: d54f9b028d2be866cdefd057d8984c0bd93b7a0ac566648f74535073a1a1e92d60ccfa2c4813f3411ff90cce61eb0986f193bf0fa909e0276ad8c5b53bf3e318 +SHAKE-128: 53e08f0d4a9345e4fa1ea520eca1874b6d7b9f8001bc0af52b7f1459d5198abee61af86987aaa44a8ec9708c45b04f2e7286197aa06442f42e9746f2647542cb9efa645647ee60a5117385128c576e6402da9c9b4366db80a9175829d4d20e15ac20b718144599e921dcb29bd22cbef35782ca5c38bb2c75331cf58e5b6c7cd84a6e3dc4ae5eaee913c3a54c2ec167ea90b80086fc2911918dfa82eeb1d419151f1cd74264671f07c7afde17e528fd5be717ea68b491b30611121fa31402d02fbc9443ae854a7a2e54891f0783095451816c7d5593dec07d5009bea6a9796a1b085df7bbdb594e7ac390aad4abe837a2fea3220f5a72d6371d32117709ec35e8c65e2aba23f772eaa4dd8a338ff9765b8ec6054d9bfc7b8647dda23e7d3b4f82addf176bf5dcdba454d21c7a8f154db73c55461e1269ef3e515566bdbe339f0f14ba6a50f06737a620df4d8c7302cd18d102d5805fdeafbd44a99b6f8f4d529b6ff224bf268103c844054e52d08222b8e47902ce0d4dbe0f5b9997521fc22bcb203ea57bef5c2958ff0975af3756b6ae160efe5ffbe6c69da8996b95764db5fe38e514e41459ba9755f8dd5a28282c7487ee745967a0dc60c6f6361d2159063acd7fd4b0542494df23c176f338b7935271d04db4d89434c66a5e0d88087f89d07348f48c95c674392d8f0b90d5c6e32b646411d50875ba1a8f3c8262da797736 +SHAKE-256: 42fb58bdca40152b48b7190adbf376ecf36cdb0a9c10e37ec9985efffcd7bb59e5b0878a18155aa83b77c57db5faf9b59e8092b28358609f4a75a4ca8bb3e74034e5811d2d9fefd15efa5377b5b6150a437e5f84bbba6a38e5ab847003e38abb20b50713f424ad39fbaa513b0afa868a4b5a9ba0466cb1e60cc8904ffe6db3f2c5013f65f9a5df6bfcf9cf27665ab2ddb5221e6dd5e6febb37a773923e299fffd1f7bf3c8b6b60ed1451960faab2cce19b04363a4a530dae067ce29de407922acd9783f8f4719112ab03213245939e061da90ff2a418f964fa21eecba047186f0b4ce847e954607c5ced0fd4de775d0fe342b462b90938cea33869ec6a3058d9d62530118fefe297cab2a02165214b78f605ca2c266ccf128e753cef351d94a514f34dcfe79604f7d53443f7e16c1a54d5d719ec32595f3b152f3004ffd31131a337d85a41bd46b8beb045c9f63693771f0296a16034dc55aa9ec8f3c27ffa4dda533f8588254191814109a3eeb2cd329dbf49500f4973b51d54ec289cacfa9255f909112552531076a0ce1b5c54990379d79d902361287edd05f41698080bceba2e98fbfc1c885240287ce2222b23eb2518b966dcd91e1be7a617a8539bcb05185e12b7106e86e0d996126063168750a6042c576f397b80561b734018c2b680a391e58af440fcf970d61f7824048e46dcff005825196db2f5493ecdf7b7a976 + +Input: 9bac4256ebde5d24b0a6466684a420 +SHA3-256: 58ab4a7101e87c05d5c55186655f3f596e4144f13ed36e3d971db59015f87bb6 +SHA3-512: 975e3348410e4f29f93d117129f7ec24a3f8fe94fcf526cdfd1dd6bff4f28d3bced4d79b8b0736358c7b0fe62e30395ebcba53cd0161b213d101bfde1273999b +SHAKE-128: 1be7e622342d6adc2ddf7fd5c06250738fda066ae9175df5e4859e659ae249ffea84bd73d54fafb877719b1bdf2f87629547c456c1e5e03372de0f1e72e65a253480ea5c137e2461f792e2960c2c84124bef91cad6585b51e0f4b07d2f4d60710b64f430f14380152d73f46e238965af06aaf3938668befa8346364c295823c591d11c9257892a096630d59c0da031a1a2eab39950791a7c364634dda3840c2088701e618bb88e43d5c3238aaa5f96a3c3637059ba47a0e13bb67ba0e706c8893f2b9fe71d279f3e7537bebc121bfae5a8bab31050fc423b48410487d2599e52dcab7196e839cc941900d11d5f11777950c5bb72b10a6ad87cea33b85130f79bae2c86f742bd61e8d77bbe8fb0054c0d194f72d88d9483785988a0a67f5d442376852f0575de83184817941df23101807a5f712bcbc470c65639652475518529b65aaf91bea1e6896af759a66a29fcc59aea7b90dccbda2813c5580a8a08c11af23cb8cb9d41b60636706328e019de64a4ff23a463969734b45245889c160929a01f66863bb944ca335c28afcbde60d736a95ae0661b76a1c55906c780bbb3379248e1bb62c7d2dde67faf1be6efd458a6409abeac88910efc5886a2a964bc5b05203d9548056ae877b2c6ca60b00489de851e66e6a4fdb71a938486fd324a4723b2161970463ab84394547c134b6e45b0d4b8715d601d7d14f02b6dc38baa3c +SHAKE-256: ecd9b35410ddc2744bfc21688fcbad9e3fe779e31c6192440bfe64b5ae3b4ddb8d4cf2f6e960908a1f7427bd9d0c000e20d5528e827b472c8b3fb8b62779f43f86f985752677f7f85945e83c8db5affce156538d2547cb423fd041aa2259289ac4e40e5f50c273941b941269eb00397dec8257c6bc462d2d9c2613f6f1461f4550a443081b6e12c5165c70c3fef045357fdf67404b0ae5672bea5e01b8f40627f8967a6df058fbf88227c5ab6c7ace3fd23b0259e6f3ad8379874d17d7493332e8cfa3db8943d24925a06518ab1fe262a4827f02d6544d133d23164b729f595522997afdc1335060a69c47104483b01e2e0a37c00dba1aaef67b93c0f1a732600e7f4544b802456913ff23811a6e976e909d3ebeb3085a0530ac5110394381c37c9bfdd96dc77d143760a48cb45e64da6d05df12b605a16aebd95ca6ccf3e4b9badf292333144f5d2663889993e395e5ca12d10e7ae8cd9af1dcce6bf438b374251371293c36bb2b1e47e8b11bda7287fadc1f5c464e020874ca8b6992b4cc6b08b2e91f01820aba11220f857edb1a2734f2f85141bf34f4e25b437f6448219970c8c0c0f8a6e508335b4990228cc0e47cd7cf6e3d2a4544b389f1ae2f02e25c16cd1d347de5434f1339e95b62a075d8fedbfcbf0c038925ef2ea3f1d6beff8b1f9c7019d611adedeeabc749739c531f4cdba4d97427876b3a0b03f4460cb911 + +Input: a91c3e7119b43d7c675548a37357e246 +SHA3-256: f6bc15a3d2343b19ce5fdd7214ca50bc1f0a31d5e66585accb90712941b4530b +SHA3-512: c5f432de1d18b6c7ba4480acce9a2c62a6ff1ede15704404be3bd8dae9bc0578721030eace6e25ea24910bf9f5a7a3600e9c03ec3f3c795646dccc8333108234 +SHAKE-128: 34c109a8b5915ebac04d5281a103a7bc02d587955f0bc602b12903f74fa44c0d34d51f6a2fd9d02d30c1a648293da70443f9b7f5658bdf9d694986f9a546aa7f1fc6b4e79aebf9f8c3ced78c4386c5d0241b0a55ab497b74ce824e2eb168b5c5a6ca74d6efcfcb2cc34f008c34b1ee3c8b2735d9ef3dfb6148b1be5eedaaebe90b631300ee74878187271f3f7284cd88c1c3921abb87e3b749e3c136fadbb98730a7679b80b9e622223df2aa5a7c0adb9191a44e196ca67cb6a134c70b267e6334e081544e0de4b57d807ea02c10bb30896e7e77dc02660e380253fac4924a9720c6b3fc3f13aa15818c61d18d947f9ff94d424729de7e81e280752eef1456dc77499f18756d940548319d0d1c0601b99f4f759477fa9cb5695f23d82532bb04a2a30a05039fd5d8765048a8f9b6a69d10957d8f4484995f9212a89214fb10323a0ae880dc2a2c20eafb3bb1eeeca16167415f774c8d0b95ec0df79c61603d077b6276aa22e22fc64c0909d334e77c16912a4259affb5186be9ee7a1d91756313a695b6c319a753510de6580bb453ed983e35455b954044c77db682c36bbb45e9907502c72d04172f88b9baaae0d21fc8339619268e9fd630eab66372284f3a25944c9784874a974028847276532b4fb60996b6c5da75daef90cfcd9ba14144878d21c66f9faa55b8e3850968e692fbddbaeb830f9b3d12e0d7cf8e9f71ba083 +SHAKE-256: 7940cb003352278e463f3d5e71c16676cb6058841c896106507df5f5050ed17b00c3470184f4611c9209130c4a52e2d976c6d6629a5e3ee4384dd6aebe513996741f9cda5ec2057b87092c57f475f5f830d741e7a28b7f2d00fe603bcd91ca0f8d40c8f23979e7d583f618c139424d3cf35466ab1e50e74aa9969eb8a48d5bda63e47fecaf3febd07dfb57c5da23f7951fe6907292fd1562f5ae187797303cc854e7906e9a7083901b81606548ca2a873156728a851fc608e0221524c2840acb6dd38424e0ddfbec08975fd0a268069d6193012337af24bc2e7bd736f172ed1a69f23a447132efbf3d8d1370d5d4d4f24994c47f2a57e0fa3ce755a2465f7e2b25e355114aa9f31ca22feef39bf9e760e53dd720c62aee59e6917059646f25279f71816f3146ba7e1582add728e0a20fbd13a2278e591e0c819a7410fc624b1848250b18e7c33df06a579b9ecc7a945731a44f4cf4eda1cdb5e873049768467932ac7cffb14c4ee1ebd2b5f504ea73a6912e840460ad278632fea968b02f66ecfd11a9dd6246972d310815c499c361248810b5dd92973a79fd3ef964d2c17f6670451c7033b80b7934c47c18a2be566485e887ad39e730c9e7327687f95bb63b858dd1e9876b23ec94e0d3f5f447074975ae9ddd9d27a6b9715bec670961c3d24a23f84abd002cfe51a59df1d7516c656fe9dbb108f6fff2c07d8b1079e23981 + +Input: bc3f62cf3df0b82025ac38e112eda280db +SHA3-256: d489ca1938887440617093bda8560f8b27b4d7147c0018d8ba7aecd93901f338 +SHA3-512: 1f7870a61f6191b12cad832c1aebb60b86e52d1cd124eb181d1782822b68d4fab7d9ef83eeb24b2e4b84475fec7c4cb1c4dffbd920ad8441444cab5f78e47902 +SHAKE-128: cb524f5155f7925864a4a4e6fff28a262dafafea56307a840e9af96899a62916d2b4906b106930d2abd1de46bfca3ede61167888f1e1b09bd3b3f1558b9b47d05e3ae5fb77be3d373d24e5db14aa1b93dcbfb1cdeab883ce59f22cd81b09f55dc253ff26210d2113ede3d3c42fc70ebc87fab5c9ac9a4ba4db8361cc836f51ebfa91f01b4239ecf62021cdc999c711d4be623ce2bb53a544b9ebbe4ec02ee031b9ef714a5bb5552eccedd984f55afdcb0d882632a24d73300d0d375af9212b4d21a7dbd9b059350bb94df0fd50d8ef9f12a6058027fa92aec0c919a03eec3c872379f6c52679920ee3d367f2f97522e4e618e8ba37ecaa69619577b1d18836b61af66577adfa30aca67fa2d60e8a16ecc6c07399d0725c8b278206cca343ea6210e04ec5e7cf60345ca7cfc4e763ee83f4442e542ebdcafa6d66b742acc0f75b3f63d4a6cf5c8e69677aaad2e50a36da6cb208880f49228de3d1e6df53a33b30715cf41d0e7b882b64516b13561dc3b9debbe6d60d61dd96e8134f7b6975860369eed0e52cb48a89ddba19673933506fec060e4c13ed176234da417450a04bc76209056f68cc8991d07c26a1f5c0c5c37bed42d4f20ff8b37c8fe5a4cf22c0f7305d61ee37d4aa3546c87208ee48f087bb519025b9117c91d75e1ae61aa0676143696414d6747a5fe9b9da0c410f62171b4e31c37239e58c0a33f56706903549 +SHAKE-256: 8fcff21ddc3e69121ae466654467c50e11b0ec3c7b72db7c43d6a494cc6ca571cbfdeb6056bfe2ac8d98772928ab49e67a3c3c122c72084ecc01c8df2e9183ffb61bc57bc3e860ac3fc3f020abe302f3a331cb663b3fb4e4960f7b9c1c9bdda91b72b9ab5212c4dc71676ccb6584c636b7ad1a30e3e1fd12c4b22c07ac464bf81ebfc55f8104da87944009442e5e6acbad5a8747ce98b10b5891531c2c6c858cdc49dd42cf6d5aa2aaf0ed2a7d3e9ce8e414d1cf5bf7462b0cf10fed0dc42ecb8de2367aaf65bddda1583d137cb7a431e1ef10cce07257d6b1aa3ab00bc47e78a17c4580624a6438a1c707fc56944c5d75421898891f857dbfa1c3c26ae65724df288da4ece1046766f90adeabb2ae4a1d31863b852bd1e61bea62c247dec1225f73ad4ccfedc79a9a909b3add048969e07b0df037b5cb631e1f1c7bd316dfb4bd9bf46b25f0adb6aa91dd75f8170e269211f959a7fe1fed4a18ec0ddbcc059539c1c0822d2dfc1add48b5a9991eccbd8586d6d4dd2306bb700e7ec6d37cc17f51d5ab383dd8e8133daf834da687d69aefcd2089083756f40233d26f13517a54a1366d36b3975ff2e9cd916e07614393810dc74399abf75032fc70cc79d22ac194283f78262a79fba5c37aba72c1258467c1aca7ab3bafe340c9d514b15eb06fe8439c9e4a936a398c6bbe92803735c4025a3ceb80d7bc224d82c42008c9d4b1 + +Input: 5d47df1fd0f97013d9a187ba4de0a0fb5a7a +SHA3-256: 44eeb88166a6e0d752d9137fb1f0a784a372ed1f0915681e28917d5470100d26 +SHA3-512: 140fd0a4cff59059c118b9c980427e10af7d447f6613ad09d48379626713e6f07738a4226975b13b850c58c67c3d0bb70634bca18b7a94f63fddd7c4de3e8e42 +SHAKE-128: 14e2b17b6de7d9385e8243b3831ae1cb5279473c3012aae5b93d60ebee2c9cc564ea74d25524ad013942f4f72930f151363d4f50cd7f1af697f610d583523dfaef8efdf24ad86e7bc6d7530e6ee0b91948c7ed46285dd4ddec0fc4e5a288913c563cccbd1cbe8e65a28f7b4bb84831103e055eeab58f56cae49f3039f2199b6e5e668455bf93356c3574279176312744556fc9709c0e40b8cba8074bcdafc4a017d0dc63642b04c50a6660ba15e1d65759d21f1cd6721551d011fac95470e39d1892586b13e211df6a0b2e93d342c4362546ebb826867dcefd84c8f7e1cc8833160a91604b6b676fc838848dee885b1dddf167d2c2ce08d340f60946050de2a2a10e48eac1331de749d3d706c88089a7dc4d6243b2752cd13064d20be6d742b0effccd606d1247809ff8adf9767ab017b609350dfe11be6f4914e56bc55971cf6696225c606d0d8f803bef2b5526b5664b4d1973eb3d88ca65de08cfe90adbaa5f60ef9216a82718c86c6f098c7b96634b479fa90ed20a7baeee929d064c7c5489f4eec8189ebb88239dcf9c44928d75b38f51d4fbbd1dde9eddb26a599ec25719e2648bf86b67645fd345dccb162d3727a3465f9d31d54010c4e8820a4c11a4133561e9217e49c6eb21b227b1b7bb89ec654e1a185326aef75e3630ddcd0b173e95ad6ede8c5076bd2cb8ac2582fcccbd0a4209f8c70b1c1124bc980e3aae93 +SHAKE-256: 9ec46fe1a17dd8b7fc7be6ee1b6666b9e6967140fa342ad4b27c2564b0841f0115b6416f95702f0c18303f2fc5c94ee51a3a2a74a63e7d91616a9a48dc86cc92afd55b7afb66b1237704a0238745a5ce2a49f18b424e4cccc9f90e879d0230acc7d6ebffd6b34e77f041d34625382265b4246e27cc48fd82e3b0644583a9e3498ec1f64fa007ba8b2eaed66a3402eaad5517487e538e76a7da3ae22b1f0d339c220f071d4d345453f03b4514760ae99b3c079146a100f8252aff84b2330066dde7dc4fdcc66cbdfd27352511879696b075deccc0e3be814074546d109ac293b7fcb1cc67ea30fe50d8061aacb6d0e149c589da145bbdaf0f0f68c3844b78a1bc7481aaebd49bff0c3e97ad9c7a8fc7adfe12dcfcdeddd3f47b96b562c4d549fc5e8764db5a28f56afea623fbe4445731caa4f13a6faaff8057791baab9fcf9768e55b7c46bc9669c2fe86da5463c690ea33bd2205de9ad6c045033c4cbe26d7e31e0298c2530a2bc38c3861835346abc0140a708e2dce9a5a5c5ed9bd1c78b37863018cdd2a52a6b765bdfbf17398dc1d92459e361195d13383f2522921c694049f4db70639350709fd0b56e8cfb27d146675dccc891c794b7b29156acb9f3174fbb8efa9ee4ea13331058a46a977d235581ee3e7a8c6037f28211a7f6b9a3deb1d82595887360841856cb90982c63a700adfad8bbc5169f796e8b355e98aa56 + +Input: 189dc113c516af57290ebe6b2b74789d400701 +SHA3-256: fc01db7a65f9b323227da499d956c28cbbc69fa5533d9d1242644f24ea692030 +SHA3-512: ddf459e459e60f8846f20d3b4139f4e599a4d9838c6e8ea10eafb9fa04adf3aa6a82f3a6519a14ed2ad151599f853d385d48c1e586ca4c0a4bbcfe4c2a1fb23b +SHAKE-128: 16d28cdc53b6071b2d63c7a13e52139166e1f49ff582e07ad3707a06e77ecd400258dc833a3c49534df462ef51f705f7c9454fbd4c34beae0a7fcbb504c97a09b030052808800be67569d8a1917ace4bc00735bb0d19f83ad4a19eddeef99e39a7de6c013aa7cd2ade2a900821f2eb0cc06bd0de41a75970c718fca3c5ef0c654c7bc834946595bca3c769390875e7ab1afaf0f0bf83b8fec127e4b142e471d40d72964edf301512effaf0ee068523eaf847edbd77cc32cb786fcfb103b2fd019ea834c7fb55513ea38b962ca8286645f5feac74dfcc39f4adbabbe7df8391fcabb6ed7f31a91bc7191b2c7c9a53c7379385bef027a5afd817b952103efbadf374f8f6a965da5c987d6a279f5e507e468e6edd9fdb1ab4e9b69ecfba47fcc5e9f4550473e7edc8a8afbf89eda6df5bfde259b8348d4ca4ab0e84d38935bf4330b7b2c6ebc63dfd74cfd4ecd58f03f4ed26d413d422807dfdf7aebbd6f61d317e06f35a2141f7bf33abd96d52114a70b0d1f44b25a1efd84590546f5bc7760a63bbe2bf30310d5ae9ea6f5b490469af5da2105c507c4dfafd182c11ed1b0a6c572c27ce0bab7fe1a8d7619a8efe7d8cf0e95732d658a89ad63005a58bfa945a2d32a813e741f73d4d58ccc90c5a54ae39ba6e3cb5baa2dcdf231c5a2e3205b3cdec7aec1c2d661c54c3f335d08e7a8a5fad985fabb88c7793867ca83287368532 +SHAKE-256: 281b0436f2ab52c8073906ac430e0cd1f5f53cf55f0be90a5f20575ab3950e42947c8cec7b4ab802629205c3e1bc3e165135524edca7214efb80e9fcf931d27c0394d405260007513e486c026d124d592c55e2cb7e89cb975819fbab86b1b2f13e96256d3f71eda88631c172b0e5af215a9dc8348b698d136b48c46ce17c6ec693713f38b9716399bce28a60bc5119dc9671386436dd7940d418c60be132377bcd5aa1ca96e12e3b6c49a992a6b8f0a0aede893cd4a41f9ea8ca3c33023946653c3f25e986c91070c6afd56c2ba22b16242a562426eb98cee9ce6659ada5662977ed149db1586d49f7c61c2d723f4ca71aacadfbb7ab190ea322cf5793a2c539248cb2849df97e366b8d919af16be6a9f0ac4d8ac1268dc7886f53d5a09a370d93159259bd33ad8df60aef7043be934660b4123bdfb4314a880b878bdfafffe3b87dd519f99817538d47cc76cfce5864839d8cb4e02f0ff3e6c3bfc84c6cddbf2d97f61da42192487879aeb4d526e2283833313145db0f78654bc3744ceab4dde23b3ddeb556f6e07d0b3bffd8f6af7fceecbac6e8ff928c8cb77cf5980dce3c79d8f7697de1ca2c75e2c3cd2aae37b6358818f26820f8a60c211a2c4824321eaa6e62b4ed350df94086beb76b6e7d8b2fff4a6e0ff5911091153d7759b292ea537d3126599bf411fdc4d42e503f285ea3802cd14ef7dfb12bc7fb52fcbf7286 + +Input: 2b478a1b167d15db075fc7fc02b62f83ed4a8aea +SHA3-256: 88ef8b9cf6f91458c2ae0d9e55e69a97ee29b8308495590b0cfeec709f103b00 +SHA3-512: 771d6d0967b1043982df3d73e33bb7ba8b518f960ef1356c13db41e6a068495740ac94ebb9f025685d30a6ed49a3b2a4a9447a1c7a024efa753cebb726933d13 +SHAKE-128: 8069654eb46da19674a38d14569ea4d513ae27e8787e87317a1293a3f81eb39443388595c7fae7b3a0b7320e37c72154a46e5fa861a312c74fe25a7d9f4efd248096849b97551af785c71fa1bf6c15e72c3042523a956b3700068dcb4e85f6a4d955e0ab3ebc3d2719773a8ea101e36b37a255d754d0547068eb60523a0efb22bb279b3e5dd603a078c8e14534e2fbfe87d1269226d3d3a2e41ac56e08254043ced4708a1a6743389246a00b083862f555903dbb6cbacee01d6758b336089645a4ba10fa99f16157c1e40e36b78f6cb4cf37c6362fc256937e57aa8f29b6b6cc4bc941856cb4993307d76cb81e83393dee7fc7856368fca66697ae7a983bc644a0468b1a5903b95e20d6dc776ec6f105e44b5737b0a39cc6b398e4845af103bb9230e73e6c5df24f3e6e951bd753353d1f2d21388ffc1d47f4a295f78d8458e90f86099185fbff1112c523cd53232f9a7cbd263669bfb0f2d675447b3b3160cda41167f6d8e5be37746c2ca2896304dab7a40a6953a593876efcd4e1f496781d803db8f6e169522d4be125070507fe8a055218290b2cb1412e93834989e5dae53bb112de3882e0619e9c2fb935f1c38b17bb9067888e2c94368c4b490caf9b68334752db8d22114c325b231914f0f1f3a4194480d54801bb491d55709ae6a1d203eb0e86a9856162929aa838bedf1e36b45fb287489a5e06058af92e38a271d8 +SHAKE-256: f911e154504fad5e4c3380645cbae088dd31dd7dee06a362af362c669f69364acc161f63a0cacbbeef35e14b8b3e08ba327e91e46ea29ac8c2e587e18398981eae787d4aed81c58ed55066bd2cae2d73f23bac22525c2506ffd69d12c446f4d4bdc54aa5b77517e746b14a406796cddad60cf1fb38fc7bc1236c3cdeb514a44764d473e597c18ce817379634997dfb66b929b32c93aef84d3221b3f757279d2d07b7400aa6f718adc4c80e15ccacbfc41baf29c0a3fd9012d26ac2c7c402e8108e32dc158598c6ff3572e35071a64b7fc942adcb37c21d48f5cb2911331cf1bfad23c0c552d7a7a4c5e1da44a5d44b0407179fb43144b04752203d9f495a62412756176c8b1a0264894919c3c375a6050912f1f5db124ce85d5e2a1848b64e5b7caa6d5ef6859dc36ce8f566f99d7300177ed0c1857b7c11aaf6422e4e81d96e549616ca116be39eaef20aec3ddddcf7e674f6cdadc92caae566c6e623ca5258b0d7b96c933130f15d4e4bfb4b73bc6ac2845caee190d0958d2960aff26aa692b4fd766d710e453ea5df09802141f3eb8541a230d81b5cd995a34f6d7801f0455e337bcda591a5566fcd10f71a13802ad416e2bcf65eb2b5f4f89131460a77cd95d9b43e3b793bfb249c020c936a182ddcc7b15f1080d54b260551ddd70da63021a6b14aeaad6a5a50d28d464cd89cc316d8360f9632930e72a65d50a6f7e518 + +Input: ea3b01340dcc414761cf572fa65cfc3bbd4f7998b8 +SHA3-256: 912ed6e91a3eed4c16e029a17d6246dcb11937ee435d022717b7a72a28ac25dd +SHA3-512: 769b8cb47b210b263cba11c48e1c0262f258a498d38e4170d9472b4d95dbf9386b243e0b1be4201162782e80be6a9b73d6cd177681a46f987b6a4309b0819520 +SHAKE-128: 1d52e4ff7b1bf5df0f4155dc34cba89e47e48e9d21d03462b21ac34cffba48c5ca1fa42ba58927d19d766adef6508154a00ff5d4064aecc2c54f511f17a4582a46eb9778413181937175f1432dd0fa5c1ddfa58e10161d8dd21b9402ef5f09859d11bbb8d79f710fc873a6ca2f8c92b3bb3ff7fa0d114f23c0f665f37fc1f96b2fc04b5a1b84827b618953186c07f4997db3ebc86024bb0677bf6f720800381550b098ff857affc1e9a68681963ef148786b6874d2122a1dfb82d49f597be27a081a3336f9dff2a27c6372a42bed7be69d576eb97f87f4138aaa863fef2c26a69c06ca3fe9993910b8f72cdf877631febeb78d4f98bf78e3fdc344234b3e58180e20c9cb23c5d99975a1e73842f322e13565f1e88035860540424b7d27dd944330fbc7ee622fa2be53f68613984f4f22d5dbd7c2a23de05ec4842c5a668721bb87332dd9e585ac25eedaeee89c299ea7fcb1eb12bccbb2fd79aa4067fac613a52be2230990a75f97b078944e6552fd5f5a30b4103d81af458a37f59fe256dcb3f08b8772910169f7dc0e6edf5e0408447db862b4c0ee3ddd068a245d8cf45625cbb123edd13eac979d1258476726aaec4e543860ffa70866857a3a8d2aa0c6bed35dd636e146b0f1ca255ee284be3768fdeee4f1e7636aef0765ef23084bf1a940c4acd17b6082e480ed4c6c6f07eafee7b2756ed53793f888aa87a991678e5b +SHAKE-256: ed0ba9c308166bda24f7855508dfe81a2187e2fbb51d4ee003061f90e42e06f4c732476031637d7a7585d33459f65e79284cf8523c31f245b7d7a24dd612e1615ca74e9ecb6a74856e622dc89c98a92207ebd3585341425f355b2b325e5b2889fa2f0ba90ded9c1094064ae01b6390c17381ba915db408a328459a5bac63402d84642b964301affd2b82170fd2e3c27b2a49bb5693dca2af0b82a9c7a37bbd847dec88f6bfce0138c2d2bb07a0addd2bb8f73f7001d84769da86ecc0e3374881f27e1cf5d2315172fc60450defec0d12eec9493073fa089b3bd7e584c463f2cd97ddd8a5490394e8e68063811b45050b2a1aae1b40678e508d9e5af47cab880526a4e587f08a630729a26bf944e7201043da5cf7ba6e7f1a9f677f3e141f8933e81a6a13a163ee45c0158afcaeb39b060b7faba9c01df3c3a19484693a348c706f81c35d263b253531c469ca94d8e1570e06f0c4ff97e33fd116d4c596a0b7110586ee3dd23995c8668622d78d2ff63fce8e1c08179ac43668e622604b555773b6df4bd148b435dcb206f4ccb242c976b6cba242198738cd4d7c36f0a8fa41c723c1866c5293ee86a77e64bc7e4f266344c047fb8d4042c11b359b8df4d9663d34ce4cfa944a8a347c8432b047d3c4ca9a4b7f2e1eeb11f686a8a2220e0833660ab449b38f72f8f2fd647be6e0fa4c87ded6a49c8206a9a2718084fcf246890f + +Input: 03eff8768d8e35efa08606a346916a334ff3cab22724 +SHA3-256: 67a80739c6eb039dc27c633aac8f35400f226137176622dcbd89f355040b9e9a +SHA3-512: e27642f7fc370e8b9d9cac21ef89b9483209ef885228edd00bd51b277432e9e7896fddea4870d7c9faaadfe85d42c7bc08185962f8c4e9edc40c8b7d336d042a +SHAKE-128: 092d5e3d7506ddc42886fade9e8b4f7c27f71259e60329d1950bc0f85f259061d1672303a15465f0df65f8497c8852704214de2a2c31d687e7a0292305e4649b6c1a013a7f29b22fe98d38c2adc513198c44eede75d43db3d69fa181a4e689f38be52263367159a11ae863619d553466010d5ad65466e58fd100fca0cf6f6ad2a07371452a50e262c011302be9d68b21ad5cef188da94491397849f238eeb58850c4ebf9eb0cb6040698e74b544a4bbe527e36f8e00b81e1b3b83834bea349bfd88ab43b93b84d1e98bcc944cfddd6010b753b563c2c298afc54cb863291e969581fd00257321aec56dfd59beba88e1075dbc4f9bc463a437b7acafffb3be06f78dc1991f5857da132fbc9b0c96fd95035b4c7f372c99e68dc7e92cafe3eb6a5ca17bc8c208ba87aafdbb019721ffe3dc2002f52b3b2a2eb1a18dcb57c789dc35f291cea513f792579918a95dcd009d9e454ff5af9ae1304334bd052259e024001deef0fb798fd65132d61a011237a270aba9417cc96d6643ad32ee727ebfef56d5bc664eba3bdf058f9d74d642ff9bc5061f7701eb8372811ca0f1ad836e678bf0af2c62ce3194a3f8e004f28c3c848787b0f0e0a42ae8781a4db5de6f21857d3e3129205b4a7bd609f570a7a0a50afd7f5696f883e1bf5a9e25ffe1858ae81e58ad79be7d90909841cc0f12341d9b24a65056ef39c6415176fe950c7db2662 +SHAKE-256: ea349979a8da595a625568c35024c29b4a3e76b063dcd9af23cd7d3539eb586e0944f51d6a15a196ce9e3279895b316e37e1052cd8b734fc47826eedabd7b5f9402ecef7ee513e9512a229fc2c54321406cd5d178465c35fc59e6d85b01c85262de6e8d38945d8643e3cec9fe7f2c699480939edadfe731132bfde06c88d90cd68c0a69bcbf52fb2a172ca7f0b0e9ab073d547ed6913c21221e12b6a8e81b7d74f6afaee368eeef9aa4ca6401e613c6df82faaccc4661233490a8710cc084c663c7e51821987c8e7c8a482a912f67e66eff1bfbde23e04c55c1658ce15ca873ada17391ae4ada75f82d81ac78f136a63445261f9a79165bcc16393c7799adf4a0c75d66a046d7ce1d042da701ae5be7cd272f77ed01050eab3d349645b9c201082dfd3f5f653a485128a293b78ffa5804f992fb53b8ed899f10a7b5e01d0f83e065ba3ecd6f9784df4658c7929b71385790038e07d2a64b873cda68af11eeaa846e9234408bf21c0f144f8c0f34db703187b9b9222041a6f2303517c6ea24d10670142f3441ea93f62d7f655a4f4219aa8a3fb49df9947238f3fff71a111e53282d9c834e6d9393f9c8656b9b4bc93621639cf544f957b441f6cba327c36e099c2b15383485c29eeec1d7a1c1677da0a5a31a0e4ecd640f34974dfd4f661f137df6d47bb37673bc0e4acebff55bc799625dc78f0da91b1865761c753c2dea002 + +Input: 2046da183873fb9bb52cfd5138d64ee479a6561141997f +SHA3-256: e916ff6591c5e9af44bdf1cdf4fb075d75792061aa4f79cab7a1560ade447403 +SHA3-512: 28863ea7228f9ee25a6db7d89db6183edbd3d6c2bb3a5e54182a73bf32fdaf377c3f844deb2beff3ee7e737f266ebf8d854b26bc0c758d01be7e0e9936931fe8 +SHAKE-128: 792228ec594e3685110bc17dc494b68e17a5b23827465048dfe83f30ad8373f0bd3f8a00fb0cd3b43ebe5008d987d78d1d1c21b43eef6b766619ec219d5e134923e2cd1acf462e5396a94ef9a86a073ac17faa2a72a223be96c387213b4038c6cb460ca8bb421d76e6874068924b09a2243d41e73f6e703560151f43b8451d6d804befedec46b72a41204ff92f1fab2c1dd8780bc24e9e6953b3384d9dbc591974bd4b226d3b4f2af50d6a5e1810c36d32c1126a972352da088007e026c8b7927c59483a61f3ab3ac3ed38068d195b078113b59000eb5204740378c864fa8aea7d6fe65cb944c34f980caae8e619cf707a7c28aefb4c2804e3bb841cfba599754072d1d8b2fdc5d89b1b97a0f753d71b10aec1fdf18701d6f470ed843dd1c0ba8f2152a4305194924bfb610393acc8d65493fb1a6e1db19c52d4dda5ee465968c4e028e0320f09baa683f17ebaa95130aaebdad2a18432435417a7d113888a6ca62474b4117d8e6d52764a3165ff70c6151076c79a65a51ec93211cac08ac32c7f1da4df3f5e41c3f556acc9b8c50158b15b1fe8035cda97b80473fc8cafee21a708fdba4eb67d826cac0d3187379ef8703172f6b511220c07e22f97711e157c12e2cd3feae397512460a4de0c95b275d3fd46ecbcd7ec6fbe1020422ed9d71ba12bea7e2c357cf7c2166d963635259bb8838c20fb4806f2141accb35a6ea36d +SHAKE-256: 986060e94c0c34299bab9217083820267cb1d26e20e6d0276d746d2608817dd179a11831b4e5857e4a99c971dd31c8cc69038645679cc05f96ae34dca1650367aabada4eb3eb046b87ec261dd317f7a2ac9851a7b7e0dfbcbe663c88718ea6248a0be3b6ae7b92c7561dda7d29303a7a10c1e49fb1321e1e812669aecbc390d3f05b2edae96c8a98cbfdaa045c790a8b4223abea50361982549e3e5acf05c8a141183a941ed55d742fe7c45a9d69aec0e7998c2047648ac8ae919e9fcaec18616fd2b1f82cfa9cf885f6e2be405d5f1edbfb688b55a123ab45540a006a3fbf138ffda74bc26c67e98b0b6db2f286a1170fe50bf3f870fa4df1b0f12a18132e503c351a471a4ee8871a685f4ae121a037e6b7a073f0e0bba39cb13cfca9e8823e7245ad0440601139563502c7c787887e09caf2883f40cb9fb316fec50999fc6772f370228a68d91163ef436ca6fa7673653b91c743766cef8ecbea2ebd2d8988f21b6748756bb00c094a08db8eadc30f687a91bb424f11c64d7ca58bb56eb2ba636ce493bd2bab8ab285cb459cd040a77ca0b72546c5da4d466b24abfa62ff3c6b65e0bb2d8174f2038d0145302b190a6cbe7386364dcdf6aa971871c23d4216af369bb26d83a32b6460857d3438d6a169047dabe3edfad7677be1f2b7fd82fecef9d7969c32956dce673281ece315757f0c4e9a5ac81ae9c4bcfcb67c884403 + +Input: 4e7afc0d05e09895c03643e17342c55096c4b0b093cbf41b +SHA3-256: abcbb82310cc801e5882001f11ad9516c726ef67242bd761c3f029605333ca9a +SHA3-512: 2604063998c7e2669bf33bf47ddda0fe697ead4ff9cbe7bcad411569cedaceb2ab1cd09cd63a6deab26c157e6294a9492e96c1d716b79197887121ea6aa1d00a +SHAKE-128: 9e1aa6debe9e3e12f8f89a7ad69be4b679f57eff4dc6691ca18d48cecc535045ba5ea2622633b158eb2dad673274e444f4461125b99435968821052521fe57f3f7af2ec62f252747283b914e3af2e1362342c40c7174205a8805be0203bfe852a74631b51265c9ce1b09c9a40f07422a4e6d3f82e8bb17dc98c793adf54493fc6e40b60d68f90abeda3f388968e3b7eb5e4d8745f806ca9283045581e9b78e5b4d7a1bb25bf38438921c446c2f598e48a5646591eb0b09dba5a51daf779277e25f0ca960c42999e20a5e5993d875580c374440bb1c7f019ef236a602ef68105d5ceefbdda214c062a06d6f646292fca0ea5cf806f0640b8d081f90b236da9689dc3699f8dd9ad065fc87a147aef57ea34b7fa239da51d4df281a85c88a74116512a6b02350f264afc0d978be13e971c028cce3781001a80a8cf6260e2e66d66a5b67c7e6924fe9c3ef43f74376175c8109d28c6ab1ef89d004ac811f88aab67b648dae5cb814aff1c6ca96fc002fb7cb33e483812400cc72fb9d75df1fa60b6856c2ec4457c09244c1ea8d4d5145e32d3a20631961431210d35fe9e57b31e2690cfc440d46cc9018cb8de27da74c7c89043e8ceeb5f05e1ff54138c664e507954fec5413852310435cb64433824a342cbe3d5f5bc7c5ff8a0a19be89d4193c8ae6908184887ed999cbd854c50b2410694999fe10a07bc283019149522cfc83f9 +SHAKE-256: 07e32c3debaf29b22abae2765409770c8f0120cb07314aaacbd6a913d5639bee56ba5731bcfc91ff0d2e9980678b5652d85c04efe93c8ff9437b1a780d7d21e4d26f1ccda2c9d32a40e63bca23d6c51241c515f6b1be1ea0627b64a1b8951109ed409b707e79d7cb7238d324c90ec26f6ac9166a1a839cbcb23212ceb127fe4dbd96aa49814976c22d1cfdf1dffe60d6a621887d6514c3e9fbb17e1c458da20322917caaa3f1af7fcbadea78b9a3f5cc25dc32aa07fd13536f7b7d7c476bc279346ec198bd9023a799472524789b3a98d8b2a12f621d932b158ace68c73e54a877ed15dd7271aac2a825ccfdd90be73290bb2e2e266cf2feaee1968555d2085587e52e2b14b5b012e0dfa5bb580549c350aacc4ce7dac6cf71e32440e168f5ac35c9718117d18218f860865d1c8fc62606887121a0212abb23727dc0a041a6e79bcb2c1f58240b277f58576a84fe7271a16cc4f6655327b5b11fc8f6feba9d8b0cf08a6eada0d5556dea55dea6a89bdab8bc5b9909f70b9631ad7816ea3f3e076d049421b6f120dfd3ca12f0c6ff55396f56e901f59fd259957008cfa73c4a4b2023795776e99a4194ecaa0db47903ad9374b46530d82085b96a5ae683c814238c59a8af958963547190e536e8197e1d71a9e1a2322a5d1cb3ef4ff7db51dc12f91cf05e6ef33864bcdeb3285dc56c017981f85bee0d2fbf7667ab031e6a900c + +Input: 0dc319d9ac96a391c6862369bc918fdfb08f67e2cd8324f099 +SHA3-256: de0c3cef50531a1d20bdae04dd82bc6377073d1e770b5cec9dcc7be62ebfbb9a +SHA3-512: 21b90e766e86341c43c9f2b4541b71e66d9cce2306b4f3e7b0b5780ade02d1a711be77eb6554f0bd358d6767ea0929d619b777011bfc591b0c9e91201180c406 +SHAKE-128: 229b77134727ef1ab4abfcdc0db57928e1780bd493dc1343c738baacd5484f294a98582494f46d770b43018b80ef8e70dc278eb9a4f138e1947d3ffb3040109cd12288f12bb211825c55fba549859f9f17081c132f2cca8ffeeb65c91f8ef75bf283203bf753c113a069f431288c4307ba98aafa86c8ec3962a4a3c14d44a21c7ab7b3327fc684077e498724a8ff033fd3a09bf0d2feb38251c206df21e07eaff050c482827f500cc69e4154feaf93d4bdb5ffe1b77e4d2b4286cac1f382fdcc84f924903f9d973e3f59ac87f56c39ef9e59af6ac3b7c54e827c3637d537ee891ed0887579874f15e0bac1e5e1da6c47b2f5fb36957a0fe91c6bc749f9859a8568a80f5d15f7c4b0229c3362cd86595d26d9bdcaf1ede6a2637398835f33e557f45a396ef2ab7aa80aadae2e241cc769429cb195c389c34f85bd43d7aa055b1d05579e2fcbe848df1d7f084b8ee895953f3f0f703bdbc58110483d12b092a59ab4faffc123baa460b1e985a494cf2c75e72d37afc56a0d28b6e9df09459c2c9036d4ece4b4f0d449f42d5ee3ef3cfff132274c5e860bcf9e25b628cfd34d0074c67cffe2f231bdec8e2a090a0a68c2f44dc29c85d1e47cb20a8e7ce5257d9398780a7733e0e62813d77186a32876a43db85d93e310c714f1e56bb6020a6d208f0602b69f8791aee42e6d7bd986095588e56989c2619f524b62fe669e6f736966 +SHAKE-256: 02b5c47eea0b809686c5b5f1fffc9543736ca0b169cd64e0c5f17eda795f0704dbbcb12ecb66f50f3fcd50fd94a3f79ffbc776dbe4288180e2296ab2b041a201109923e1b441fa60d7ec4c2cf56575ef6b2ba1b16a7d996f02d2abcf3ab416fbe2122b5fc698888d47dc3d33be304997201bf7b7bb497b87e12bf9d3efb04612a0a12de221525c93d6701d602b8ca0209f2f3d77d3926696cec2fb0118fab3216e6746d28ecaafc1b8c8d69124a4db9d2bce0a03dba443e708f443e9a9918c134fb617a0237db59a2b7b1ba86ce573f58c901f2aa549476746fd681f123ff3ebbc564a9caf5728612c52f52dbbc1c9589a93e9161226249973d42befc9849e8c774e72b5466ebbd4cb5f88f89a1c944a73612c959974bfabae7d34ca7d891c5c1386cc617d14e45d05ae8a9aff2856aff537e27272b165ead9c5f2f932266638bdfcb2e44788e64d11e56421fb4528e401c21bafa90562ff7e57ca660f918d3fa61613973c9c58f0b02a0b86a910710a1b10adca16f8e9815840370f84d408f7251de1923630710f92c7752ca4dc60153fc24564bf22c3b4aa51068895e7480a101ab4e6e944bf2e6191fdc28d1d5b8c90a4abdbf6b0165cc4185c1378688367dbf240d18a63204174a276c6921e2eece6d51496c3444560fbe812d8d1df7590bda36942ccac2ff0b8f13c91c7a7decae255981214463188ad9df0aac82272fd + +Input: 8e5a21913069202ddd1db028143c455d22d0a7146ae1f0319bd9 +SHA3-256: 9ab79dd9d96007b8ab1e8193cf55974b04e8fa665d9bdd304b33a70bb7b59127 +SHA3-512: 1a6f6e794f8bc989df9326bceaf9b34770c1c00ccd9879023f60a72662c21fea849c3023db22ebfa4ee4c731d8e5c8ff8e74c976ef94ef5767dbd424107c88b9 +SHAKE-128: 5fedcad6e307439586222b40f49a08ed83115057f0afa1adf3621ace8f5325e06695a4506a49ec97ace3b77a89ff69a3fe116c5dac95d43c150ac594f6ef7503dde32e747beb48149326f5592a708d729740cd74b54e20f730c622319d0910b0d679e274774b1880b117417f0feb11d6584f38f2cabd992170e24cebc955c8eec10f55e79a37706a9957e004a667b272e0f4f80a187cb1c63b279129d7b63ac1aba4db6b3b262e05e42f179f35400a34d11cf6aa5c9ee029e392c00931388d3f6ed7d716baadaafce5e8ff27dc500683407fdf603501e0a4a697cf8d465bcf1a95a639de3461555c4473f33800712e9142221f2f68d77bd871b012161f235ae6d216967d7d0ed30fd0a65fd1276cf953630687fa52d161e43d833a3af71df0bd073c63d3fe480f1934a2116f039fe952404ae3e6d7b6795d24c848e331eef3bc4859b9b899980fd78e8e8e5e239c6221a82cbb8eadb18f3d3a45efb439ede14fdab36c4b67489ad151d2766b1b9d288ebc956735787c1b1db65ad7c697d09db802f5218d2801363bf1a7dd97a7b636359928c0ba7f0aef3df536f81a6669965b0478ee1e3ead37f18c7c740419a6a761c89ea716f647b6d962c7f070ffaad6ae99e5a41d3f7e2157e3049be674b8f7b5b84154ce895735f92fdb5e2603e1e95ea38249745d8f7e0bbaa438804ef46579826c8f49e21511602d0b334bba5aa64b +SHAKE-256: 2e94d95b8a8b0fac681ffd50746b91de654ef8763b7b60111f7822527ae4f9d19fb4c54a3f3982ff62c398a138625dd11b27802e161bcf0c8137cec630ddf5a47f9f4cc4b07a117398fb28f8ff40ce58dc0e1afb8e5d4c97bc452fb432406a0e0f352be770e4b1e6de1422898c9ce39363e22c49c215b7368b39286c5e75d11604d20af5e4e12afb1c24f4faf4f76492793d7e4e72ba916795d686115e8238bc41380c484ad073f753fe21f8575204fa9971e70976cb7bab7f4af9339b1b149873a4630a5aad4706c0315072729f0e25305df21561395b94a5bd4020927864e2931199d2db4f4d161f72910b69d4b598bbee34e26646ca1ad0b23f0e769021fd4f9006e7594f92aa8a7a5649bffbe3763421c3fb923e4e7aa2f845f7b7a97f1589405cb33f062dd198579ffbb52d0977ac152affbd74a35ec8d99c41fd069aeb0c5b9407677381e65d0d4c843edfa1c039e18036007d34ccff5f18e8ef3dbf0705357efdd0b6c8f5d1e245edfbcd2a6adca161d01955fe4845b2bd340f743afcb98af90925ff0968f82b3161904fc54df691227815b7f4a522852d1ac1f0458d0d81e470d8d5d0a0a93754ec6dc4be72890b10cf12e14f5e2fd5a8bbb4259d1fb30b7e32c1f40f5dec1c1cf3082e850d8e965695d6099d23f0086ebcb33be20755ef66422558abd25a3982e444610dd8439cd41bc361a4ed534405935f02ecb2 + +Input: 5fdba563608c12748eeba272d8de349426e52c3be893e4965b3004 +SHA3-256: 54699ad1647da340b66fc3a04c3be7f34e538ea819b57f4987d469f2b90bee84 +SHA3-512: b8fca907b4fb8e724d4dcadd166813522866c6ecad2745ec580bae4cabc6ba272291fec2da3e4df3ce2edfef4463e566c207c644eaea5aada42b3c9eb4e81fc7 +SHAKE-128: bf96272205b208e3967d99a5aece30def712575548df530c14e46aa82f49a7c660947a97dfd13dde44301d72b273546d05c17dc970a2b68b7297def20b93eb3c0aeedf912c0f4cb7bec330ba0c39186ece341eac8846cd870bd872ef04ead4a1a53585569cea3563b3d09bec288516dfd028404f996cb59ae04529c5a69b9de783440ef91e9539391d7fa09d79c0e33815f31ec3f27609a46c783935fa407293906e282452e5b0720a73186f1ed71421558fe8396ac325b80ec28ff5138b9eafbb590e9b5cb0573df2c39d4332e9d151519017d320b96fbca32e7561a8d28e7385d28320d29e85265c8ab1229ea6118a3e47aa8fea9468a4c87761f7157492c373ce3b3e405c536519e3321fa7bcad21e57cb3bef52f7092078a8c84008dbd92274dc17bc5f79d8a12fbbffa968b3ba4489944a94591f005792776ee57d6f28f7248ccd16c92e3fed7810ea3a40aa241579bb59f10ac2d96bdc5abc2af554261b887c6c853d596f3667b4c861d33b0d55e2a462f4c791814d6d3a97a23477f67a274c00e06835980869a29ebe0644fc00dffc4fe43e8f977161fc2a461d071fca2283d071222858685174c3814ce30b8dbbd18e36f15b22895208515ed5f25b443d74d4f1b191787a3277e8cb71096933cdae475a78bfa711a1343db22f1c0ed9ece088daf35f349aa0d65b9f6cbff203a55ad8b5d7f12032bc013f8e73967ed +SHAKE-256: 22da597be4a76adb8a1818a5e916cb10a65f103aeb194569eccfc3297bb82822fab958202559d157f38a2942be666a51eb0f74303b0d8d6bae8949d4cb1bb0d247dc6cd0a2584fe3ee85589678a5bf14414e4980a069f6551062738eb75ac568cd083777262fa563deeab4f75234aa6804ccc888b4373dcc1336b67db3b32a51b283e7b037e5b749e25cf49bb3dfee1f75af76317b0dd60c8ea785e05a2f477739f2a0e082e9374688b6dfaba29c44252e00f93f47f4297c858f220721a00b783f5fa8d4d8de39122825a9a01888c285f54a0dc54e02b50a77b4ee4f54a8472dc1497326d2b43c00c8a4de4574915c2937cbc9bb7957e32a9a0e7c1fe8f03d81a2374580fcd70a3a83c8f28409dfb2a4b749ad221c16cdda00eead1230ac0ab7cdd5311b5f3ba717232b9b62c03dfd1a928263b7f424ad4e8c9d4b8e4921e85814d4cec98a9786f422695067b47860d941312129a97b4dcbfc3dd43d83fc484b4fca6e53b7ec49e7ca5355470bc429e91b035526b97b27bfaf7889d38e09a9618389131e5ed3b41c29e0c67323ca9f912e9f6ceb25cd1b2d42fbdd71d1bcfc7dcf92aa50860960d80602fdf9e458d7112271fe0ae049529a1323f496cc62f6e5168461f33319fb50a4fe3029ba0ee2a619bb5a344050d49e71531d79d5ac10f53f2086881afc7fd496bdfb75a8e5a7a7cfae034ebe8f4a41e3facff03110e5de + +Input: 21005bac451d9afc964972ff66bd4128bff16e906b35457c5238e1b4 +SHA3-256: 39eda830533b9970760737c1ff84dd82bb0a553a45550c1def9381c7b9412e83 +SHA3-512: 444cae26b016422e89345938aeada69effceddc9429d53e8699c6d27e307f0e6718ee54cd8cc01b7d40aba1381883ac22c6a7f85c3fa120f066c1dbfe9fa86f1 +SHAKE-128: 26d6fd4817751f625d03d2a9341d5bb6e965b300f8f4ed665597655f8fc5d592e5821c1bdd4e8e42fa43852cde3592fdb511237a3662d76f78c4ef1878842c17caed8fe72948431a5fcfb535be25a28f21ee97caed6e9a7fe487deca37a40e5c6a1b01cfeb4da864dac364863f3d7b71c287d6b9c7d8ca2e9594c0c8ff755a709b729530db88836cc846adf800358c953438ee4d7e013553e16878813c7b36fdc80c1ec559cd5e5d4bc240f66c4a51dccd1a35fd58ffdde5500b4f02fc41dfc9af65d27bdf43f1aa0a0ed11ee1e14623d4d8d9ba0ed86df33fc8319f897b3e2c313fbce96905979942f2570f1fa48af8d669535af6ec303a328d2e28ec940298b2b40559221f7771627e188abc991b0976f894891da1b5eb1662a75cc27cdecf085bca4482c052d4fe4f189bdd619c12ef0aa2194dd043fe3389e43792a68f5ca87e18edc805a5cb460d1209551c06c9aa5c8a609b5e969a50d66319077aceca29939e839864bb1e07af34bab26ad21e36cf44d51bcf459638fa92a2165a8b8b2a1d9547c0ec459fffee65a50ac221bd94eb32f94923848110c1febaeaf5c9f83e21c6b6db842dab1ff800b28a87af6438c2321119490c18cf1d57d723cf47d429d510ea21cc8488c906570257dade9eda09cde5741f2da86f4ca4f58a112c0f418453d68b5fe1491783f181d8b2d1f997cf28d5261da689bc6a21d4e846b2e0 +SHAKE-256: 74dbedf9c64aed6f22990f8472e1c99e3336a20836b5cb3596ade1943bba158d1427ff107ac8a578fafadde93541e88ff79c50a1bb468a2f31e48b08b1dab3ca9a6d517b7988a5e9d553cd653aabe7da9d0bdddfc925c980705799ca9698d027162547299d256a42f11b63ff41902bf8ae747cd530404ffae8efcef6f92e8f600fb2e56c29966d6063cf9993bcbc877211991c9f0844582901ff8bbc7502e4e2c1718efb31148955b84f86af1bd82efd9a2c1b8bbce6e346552faabdaf727cdbe48362dd04de7f6751a1149d3b14e7c4bfb2825a42703a128a1b330cdfbeba8f249e4c61630cf081049220e8e0e6f6c8ade1057e6469d6ab6a29be0fa8130a026d6bb1be7492fb5c0f55226985fd073b1d0c4975b87ad6fe5b829e285a61dc4a55c9cf9c22a1e452046f6a4e1768a518b1ead08cf2960570bdf5c3d87ec0b3da65a5233cf09d844a3a5b36512a97a65fd8d7f0a9367c5eaad1a34a7b6d82551a44dec51ae04ba9d74071819062e829a983477e0ae2a47ebd2d0113f7e30a63c411df89e06cdf135b050dbf6cd765bd22038121cad24a7c06f5433b749389f91b2c4b98fa80877715f60fc9682b681475eaea2726d9be7880e6af5b38c53af6c4876a4d1beec684663202e2a12ba9d8d1594b745a591cb8c242385de19710d48fd8b1191219b9ab04911f28470b6ac3333b558cb6a10b56ce679b38a952a3116e + +Input: 4864ee08579b78e11ce9c39a5d834e6f1286d541f5aae515c1bec39a7b +SHA3-256: 92983df41874e898ce89437bb4a0a3358e2c6989babf1d1a12d1a9ff8358afc3 +SHA3-512: dd21b44a9e5cd0e25325e1b20739ac953f12da16751d5d9482947a25e9c71a0f772130797f69f531978450d1f766b72732fcd12b22f90e71d07656cd9748a766 +SHAKE-128: 93d2273ddd77c2886466ff91b62e491bd80d2b22d1aabb0b4554c8fc63cdefa3102b84a44ae99e60a3c556632bf6f2c454bf6c69fc696f0076a65ccc252ca0fe14751b9779c44bb46f83dc49fedb7ab51a69f7f58661a942d16235a1fb0576ac6e776df6c57f224b8f91a95e343d84f8deff43c4d7263dd2c44724142604998c65c25cfe666343d75ece79af73c1fdb88d7114abc9a62a4a636b07b69ab8d83894397683801e6fb1b0c06adab13b883c5a6d225a034371bf28622e945bfc64036375dab8597cf5d7566a64a367e9e7362acf5324864ad1ca930492d1df862bf9434a14c977815ad8e658f3cb7d06c0f0faecd2ab01727edfd6fdaab6ef3bec620a768e33f74663e96f1aa420c8bbb47e0bad3626dee4264bc18cf83e31ca683ed4ba112414f5e4c4b4d2dec8b48a47e4eb1094313b53b0cc03406003fd04a6104160dd07334a98f60f1872775447627c12fa194783c25c9353bc49c9b5d6a872368d829d461e75aaef59e408f4817116d042aba1bfb035e75018e29264134d2e09b3e0f0be00f12228bb01642fbe607762af0126810e764beb97fe4b7915899251602feebf76f5e9df24ba9b0a5465a8b94dc788629655a5b38c7275548f61b2a0add819cf3c11ea1112d5b2b5668e375b04efc7d733c1022c42f16c863b4c9a6f6bec119f7bcf30963d5b3a1ea8a936cf5230bf1bffb75fb93753dac8d4387b +SHAKE-256: e9e35283c8e01f2b4719247ee1559de3d79a7c9aa806239f8ef9f306e225704901152a23c5d5636d4492e4a0597f716efa2347ec678a08346597c910381741f7e1ee1d31814948636175126379f2efe0d3afb3dd897df0d0de32a0d9bd13f31b86220c8c57a3ee5dd7e1d741899a57c5485bd7a3785e9fb44eedaadf5bd61adada805fa348bffc487cc188194fd08d00517db609c5c20fd43007b65ae8a2bbb91342e6c53f7db2457b01859173884ac30aee4e4145ffc7ad48f3bca8e448ed8947c66d863df1e46f554fabdbf22b59167579dc20ca7daedaff8409c7c1b157a7523c9de8be4b0367475f26ba4018bb8554c28afd9e7aae901d23188993d0f76706e9470eaddfc039169f0e52941fe1c9764709c80a887374f9db19f00844e7deb8035a47ce0cd3d6b6fe0b3fc27d9e15d9ae64299114a3f18eb5605e88fff7450f17400f29968a640d8da4c9c63e3e6aed7453a28f574553d86a28a12d65ab3292adc48812a8b4312b996b0af7ee055ab002618b8ce33142828181fa69205e12f35f7c3276d0cbd4398729700b6a141f6575c51453b09ec13abec4b141bf7b1df9261bafcb9cd319e9bba899445a5d82f09e3f1f5fd41497537d534c3bcd7684c5488af7e29fb1d5db3db12a7298bbe0396e6c255309d0feda66728fb5d241c344fe2d73b61ac68b0a74fa983c9a31a1504e5627bce52dcd2cf4cd7d13c89a58 + +Input: 01aa4958d39bb9d00ab7800a81f99baa348181548e338b3e9a9b4d20cf07 +SHA3-256: 4df05bc94300199c4327e5e70c8eac44125bbf43175255c5434bce6553b42d89 +SHA3-512: fd459d25d4a5fb1bbb803413c88b3f4973f4ddb63e6806a73f9c5d52b3a64a2cee3c1b528a79b4ce1627d82cc81cd0a7876413779f74209612e1430bf7aa3483 +SHAKE-128: 582b756f5e1c3b499fc795897ccc392f110645fec4a2f1c5b462d5c91358321c97002f50091c08c0000901bf39768137eebdce84ffae5e4c4af56c93603e86fbfd2320f050520d0ed1b06a5c6fc6896eb22e10875804b428353291f4236c3924effbc5b77fb2cc96e55cb58546655ed658adbbf72527b726beab53ba6556c70c76d32d213ee58471c11414893115cbe9b21d9ce8b8f7d435df760b2b0c156bbfa9dde991fbab57cd842366661d17a77d2136058de9ab4ac8a6a6a769501c4cfb923f59eee7c97202009267b59407e7fb004b1bfcce1eb44bb5366d1fc44015ed5e889ffe4623383046025901ee8628b32dcd59efe4147e06c2d7b4209287f6acf09ec7bc18cb8e8793f28ac40baad522c27d14e4b2fe7fed22dc8ee6646beab751e1403490cd43fedd2e630e9b302b6db46311e29cb0e5acf4ff92bd7436ef79e0c84e5ec1b7932851c1096f307fe005c7766c6dc0928c0b106bff6526c76a05425925d4046b7bb747b107acde81dfd8a9b1963d8010cea4dcca888cbd68de54d557c3d64a46725e69613f85e3c8a0f140cf4f56e1da6253b3c08c89de8202a5aca73306823b067407b2a9d42108aece95352786a5ba5d26394a79e19f2647e060b10306db24f0d29c518a58d2ae102766ed36b798a6b8e2ec20bb839c0bbbad9e9f5f6c86148dcd25a8f15b1b486967de06aa1725401b22b9d3902b32c8e643 +SHAKE-256: 33f6559bc75f2891dc44530bcd793ae36852602c507a6d9df7db36be56d1b45fe15e6af912a4aa9cfa3a661fb5e52a75d571bbba2f7038fc499a55a84bc53aae96997431a7ee62256b811347dc8b5540fbed64e8c3ae93f761d80a73ffffdaa03e7ac1dce88b1cac4f3754bee0cf23b4f1b7477da3aea813a6c22ba9413cc0a4686209e451c28e71ff29ec5f796802c13b4fe78c64d0fc85b9784c92e331503d582671dcf3efd2704df2fc9e08f4c36b68bb3b1137d6cba9d67296547c9d7722d6e92beb83f651011731d785ac41f4845883360bb7e96542b138a21b109d66f59bcb959d7f3d41e59dc468149a2f9208fcb8d34066675e7f13e3363f9e60770ba1df6eaf2e3bbc812a4300f3bdce8c7c5cbd6720642974e39a3ca1a6c4d1390d6c37e6a31d90ed6ffd6e6b77de2a8bdc7df9373fe54e7ad79e82fcf5296d3eb3d1ea640c9246b3d177150f1c79e44f8c842b98713329fcd512cac1180765b3a75b30199c7edfb079f90ad180b303e996ccc138d4307a023cb04d8e69b653298cc310e09503c60929aa319334775d7e34f0f96c34dcf05bbafc123d71c389ed0c5984524822836a6cdad4145e2a52a795a6926a13fdadd2047e803bdeab92c0b017bfc10b290b4c22dfc638f9e120be274678032ebde6f010145dc6b37dfd8ce33755c90ed0c4224422e3ad8f06878d10a29a6a8a8e975cf2f81f5e3d31241ccd + +Input: 30066460fe3e141746cc61e728fa0f72b103d10b690044ce4bd3ad4f9d5572 +SHA3-256: f29cb96f81ff684d9a964f4396754c8a137e36eea5850c9b9faa346746d7d8d7 +SHA3-512: 552d35d6bbab94d0f1149e920b2c4e664a7265843386a8ecfb16a1ef1859967cdd4869435f6a42a992c1a32f5a5533ec9e4881263cd3f997f28eb639c27c281e +SHAKE-128: d66ca38196b2d09b784008adf9423e63b64146564a62832e06cddfc13a28b2dea2f6db634c4d0d1fe6fb3924dd588e7ee3af85d71177af7a20a90cf5a80c075307cfc10cbd17c6e1cae5658d351540e2f722a14214896874c85a341297bea8e2e86dd5c94d197efe751b01a6a33316c294cd0b7e947c269f706ec6438610a1333b927f76dc9b01a8e88e7027235287446ba4bd7e952c0803993a2588e8002b678b6b547b50cc92d8d7e50a9d13e9c9537bfd85755216fa33c2b769dab7795fe10222f64afa6ab4696957871cf14fc397194dd199332dd17acd1987db6c1f22778fcf3e569e7e02e4c6a72bc1a7804287947092201cc0df05812e0d89608055082c77edcfeaacef63ce2a09021639e2b1abbedb7d0e2982731b45053dba70d736f597327402cacac3bcb18575901d322a78f49b75c3941655858c26ed526ffca575e4006a98b426f54f96d5d49ce77c092dc93f35be2f0be1d22fa7cc5e0dad08ae4c8bc1f52a74bffc7037269a42f3ca0ed67b6a631ba90caa8583520bffd675a3b7dbfb6d90423ec9a2281ca9f46019882a34b1ae0fb3fe926ac4af17d014d7e54d19150d1fc4fca5eeadd57d36f82aad50943151380d309b7f0bb0c7b73d2ff5ae09174c037fdbb2478aeed678724f6d105d9e95ba8b6e625300a415ac124d834583c427b2e847417053bb60fd0ea99c5ed7cd12cd2aab55268d1e4c30e070 +SHAKE-256: bae5f0d6fd4e3f9f243bfb799745e80f58b75205d049cbe40d13664979b8a2b343ae8dc78ebb10e77c9c133d6ba1989dcf08973621789f110750585dec6cbbd8c3051b949a323786c05b3be8e6fb8f6cd836335460cc88962d04e4e6a271b67e3dec0da0dd54865426ae32ae4104d05a37d35ab08fc047a032403c790c146668aa4f46a00974e06ae9205df10e26f73e9d903c96ebc657c1baa62f52587e201b1247f152b1ac34ccdfd5977ab0e69760ec34bc6590eb8381d721b7a78ad059edbe1ebada3735a70c6e4acbaec11892f998083ba17b273d457d8bc1210f25a0add04df61780336990ad3ab3ace0dadb0a87a7cb3b16cdb1b7868b0a2cab833cc23c315fd42174e722e9d38ccc3db54c71cc65ef3faeaeab082cd33a7d9e9a9e8faef3ee6140bb672051af9209851629c3f3b2f351cd688c95538fd1e5cca8f86c23f0c3dab34c95fc2a510fde43744bd075c38b75237c9fb51bf3260d2182583773f4d2a51e27d58ecc7dddce01ecfd9c891c729c4220926c8acca749a73daa7a5bdb7fe137a9e91b2c55de1d9527aa3cf8587335c61c2a6871a62c22008a6831d4eba4e6ed3f6d5529530b8633d8c7888d28bb4f64f11fc1decaf9cc02a9b1795917d89aa9d7a7406efb12be2988614174d66e6a840c96e881808703b6d2194e685bc3358992ef7a14962c6ce9080c2843a99cd47bf15efdfa2aa6c3d13a253c + +Input: 3baaef4694b244d3e6bdfd5c37fc8b3905369c60fb0f930bc11c9ea374b1b5a4 +SHA3-256: 8155e0ca922f5d5a64dc70cd951b8e665327ee9c12b7ec433ca830ac8bba58ef +SHA3-512: 407ccf40e6da04d40e4afa36913bc5e2727367a31bec25ea9cc0bac3bd2423ed139abb882d69f070f8b78f3cbfb1f4335b480ad802a1197b62332f701067b30a +SHAKE-128: b66be8559de5345f79350f813b737da008a76c9028aa030bc285e4cbbe2691a098f0261113038fa567a5ad38a6c234fdf00dee6903a292b3e8ad95cade62768985a3655423b44020c51a31505b76afd509aa51a2b7c55c729e9baf1cd2a9f1a0763def0ad46b3e4a733f36040d1b80158cdc77ea2441659373ebeb900466dcc2bbc8404cca499c899f1cdfe81b6969e4c0ee4555f5009293f3a65cc37f98faa69171445e625947e60363115e4f3857f0c1a5bf39a4ebf61278cff04acf03242688dfa889a35a66afb4383dc36b5a52172d57104e7d5f51ad5d46be84501be7abad3302ccb0796fae9421967097d40b71a3a24a7b1b03569460fceea4904f25ed7801c0b1eac292806902b887beea84546c86998743b3c8c124bb6cc249b1a6dc516cb802e358cdd51a106abeffe3b34fddb8962caafd759792a7c9abe8658994e9e8ac8ca1287fe1b9b12d8f49f7ea03ed4d1fb2c2dca62016e4ba5caac452a93a51b9874e0f9c9a94ba80d10d34045051a98e3b0b56dd383b10e91a95f1d0673cb3a78807ae7beeed3fcb45fb4d3ce96d0ab0ec84a0b9c7a9b1247d4ecd9eef08a009f6f54ac7148a31dd93a1852c5b1e54286e4fffc6010681d95ce58afda9c7391887f002f5ce5f1eb64f093a28841f6ecc5463f35a9cd2dd7e5f61391864484b6fa2d62c6eed8b9641370e944e646720c1789937fda2f87b4c03c729152c +SHAKE-256: c38ee443ab657a90f927827f8eb0a53cdf2be2e20b490af6babbec8335e1b24f5b973804fb3bb777666f56a4588acda942e1c7846b006334c46dba7b6ca2fbe234e0efd1a74d80030e1c1cb84a6c351951273925a4122671ff0afb0be51f9f615ddf5d090b8e6a99c9b37b8223e40864412983b91f96253a6d651be3beda5edb1f0053c8044b2bd71514d9be24322f84436db047437a72124b2afaca7ba284f2c9401c485bbf1408e6b98e5a1f4fd42e967d825b529d445381fcf657e82d1b05ff765280b04856c91c53776f6c83fb88134f6fbc61bec41d6d56158b804b59ff9ca2151dd184182facbe0e43d24d17a6977ac632f5557b5653a0e7e2ae7a5025b1d9f70d1b01bcae9092cfda1614d0d8ddb088d1d572bf5edec8b10522e499ec3a49699738078d640656147f1331caf7a263cf4086931ac8248cc715c6d602027acbc9977332d038f26c733c5cc6c07c6af9cd200105e3561cf69d4c4d4247f3638462780e999da919d9cbe4c3f45abfd57809e9336a884f079e7f8ec38b3707f78b5eb1f4122482637fd976933d6a0f92e82ee2a35d02b17498cfa5b090877f0badc39de4e858bb3cf1eb32a5815aac1459fdea1dddf43fc70bd0ce1cdb0697416f2ee3c506420979c1180d13305d1f1ac98c919f8bef5165149a7a4eb9ea2a149d923e8500cc52f4a50a74dbd671438e0e864ea812132d3e7040d057ff5937 + +Input: 2f9e99ce29d4597fa0fdbdf7c383e790f60088c2f660c97ae5fdd8475f98b79e5a +SHA3-256: d48b8d6763781da35eca0740540f7bc7abd1acc169e5849de8869d330df91b13 +SHA3-512: 6c39b8b25e9f82f36e3123244ebca307be7c0f8ded8cdefee1e91408aa19b55b2d31fdee033dfc685865cf25f4330ceb836f9f7ffc48d68d3899b63a71b35b2f +SHAKE-128: 861b9d463405dc3a76d2295d94858d5a59cc36f9b636a7b6572a4302f002d13ea6b6d4ae91dfc04fee9bb27d14f1ec3e444ae5b6a41eba1a12f61e6c4f97f7e773c314cc882f74d72548b4091cc622ea1ef677937c87801b6ad7dc07fd422b35f2cf0efc12e75dd0c291e74049a6d0bee35091dc8fbbd1858cd5aa71eb171d1f7a7b6b8e660aa467452d1da4e250c4b0b1f23b4ea12eefb2bc4960d9826e61be7194a49314c5eb426e83023d212555226503d6fe371d0a3c718d713ec6ef599ba749423285dc69a7c01b9883b435723ce9bb1d22c0059bb507fe3a1630513c33000c99fe917e653247a1e4329ddf05266e8be858ca128721425aab6555dc840f6b29b9e5886247a66645af06739fa737d404ba7fd41807f360de125cd496efbeb087d40acf52d65ee745fd231afc2f79f0557293e960a1d97b1a0b138343c7dc9abc6bf6c2873775585ace3192c025f96caa9bb1531672d1562e30be3276d0491321d82ac1c5590e5bf114d5c6dc92722690c3490093a210d0e7dfeadf8a41617632a3e728064c7b22785fc0483ba4bb20c633ec964d5b9267bec51ca70fcea65b7b25bbf58579a833413e993b7ba466d9bd04ee3a411cde85b1801d96f37a0c9aa900a35630a266d8a1c604949f98ebe57ebce69d65288323ed684bb1885255dc04c5ce2b77dad448a3e1183fc6595d85b1714570a2ffe9f98ca320e7308eb5 +SHAKE-256: 23158da1cc6b70244350f7ec3c3a3605eefad2cf85b7b8d7f47b8ae4317ccc0acbb82c7a66a9be86ec1d720b5183b031d015788d64cba5602f18f309e1462ee5548e4f7936913f7e5aae21df9b7a11bd96d3b54526b17790f417790363d896f3ea6eecd264189ec6d5bd562ce90e51948c0ab4fcc9663fd22326707fa1c5799a96b8cacba9c6d65441428936bf523b29c2bea01eb93fc65f236eb310d3ce6073934beedd6a7bd065b193a21eeb5f206ff77d42da520f2470bd9699d5195de1f6f2e863f3274fe9bb5b21dc4be8af79d55d9854f45f51b91199bef28921f4555e81e672dc9023f2662852b8f9e0042890b7e6160354ea756f02269a286ba7c3935c18ad79c7711063a9bc91a046e496cb0383c26fda249853c3e995dee89947838aca4d1f65238b7675ff4db7b318db107eb09da4add22931600ad3a036ffde18077cfdeb3498e5e2ca614729267276b879a1b593dab8016b725dc0f708b83b4c96de0fd43da8384f53defa3b27fa551bad7e8feb5815ab00f8ddae7979b0a9d83b0d48324fc2769fd073f551325fdf4aa82faf72db484b7e1f38c7880e73572a6272b0a35b18b14be0ea756ccfb5e03a014ac54513596d0fe5377ebf033ae8a9e1f92afd228f6f7969922917390b72b6ab58559790b5293f9eaab58445bbf2a1099467ff2e7815eb8fc615ec7d2eed0634f6a418e9f413f3aff8856f5a915bf4 + +Input: 44d71697eeaf1e246b7f6913ba918dc13a1d47badc8a34c2cd3b979cb5d02e20b6bb +SHA3-256: d6b804de67c52bee73936e37eefbb986e89da3a2b4ce740cbf2621e137feb5b9 +SHA3-512: 8e6acec231e23eb621fdd6df9300c625f4e4bc781761b03073c88c38a874db3c825976bd095b5d7d533afe2f4666f47a3254f933bfc7947d81d9c512300e86a2 +SHAKE-128: 7dd23d0115e6e0ba813f6b573a37158b9fefa6c7c27a80ee6e1d1af376aa0745c1a5856f6ff7f363b9223976c72e14868197e15d1e1618e0f700c47448686ce61a06546d761e25b484ab2f8c848eccc40ed7fe6b04dd2ec3194806235ec46195f46af35279a3c965f32f23a450dc2e6c5f903cbd7fa72b92030fb30a78cef123b4d0a3f0b0c7f1fe4de29ed6e3b49772ac8626bf4f29404ba0b62d3127c6b610a20beb34eaceb1254a3cca64cfbf27183b95113461cf9134e75d2569c714625e4781e4cba0556036a2b7497cf9a465cb0b730a05e98bc32bb49598973e24a6c74a5152d7ea7038f37ffad3c3e852c79929f9db478306a85c1c85547595502f272e494f0a789539c0301b55fc1f6a0e97c42ef1f3fc384e884a98f9e658bb512f31c20186436c1759b184bb16d1557b65e80dfa61c21a625ee27b78890a228ed4515a6473b58e22fe5c519c873c6c2715f3cc907b0a720d6cc5359ae210b001781cbe82b0ee7479162b1801950551b07f249efc260860a2040685899477408d4855e338e4f73f5add727aa87949e093ee1709fadc4afd689bb4f88e20947f3afa3792ef7dce1711e20ff8c55ddea9e058bed8a409e6c314e730691488a4f91427ecfa33b1e6392cc9e73339eaa39a6aa62ff406c58198de5a384241890a1f6fa8c90506677cb4fba1b00d6c8a582bafa231d235ff197817cc45421517e42be30f +SHAKE-256: 319eda251365f2e12d14640d2d2c9256d0e7d58bf602a1653094b4f3136aec84f1fdfb41bd2630e1541dc19fd9b37a6a4b5bd18d9601e9368d931f5226f3e300cf18dc1e188ce455c02db8e225897e22a64b488bc18f046f1de59cda01552917700bd8d93b006a143095f4ab989339841fe8ff4459f7e23271ad5786e8a55db61aae6859c5e688888f7ee43eb3e535a130abc01551656dd86b67fa7fc77223e885c42aaad774de7f6cd112ea51f0ab77261fe56f3adf9a9df3b83529a63170dc0b555190f4a2c82bdc09347e65d3d65fba9069ca2e4485d675b3c3292f36bb9ce51848926f06059499de9835665a1d88dd873cdd3cf849d11d6e1c22ea87f49dfeef7decdbc109115ac5558249275cd9f78177eed24a457d4ada0a557abe9668bfe2f47cd23ce6888233dd4f29a0d3411a7a0ced427e25087486d5f9a1bf4b0530f31dc0487b8c44dbfb553e816908ff53064dd4fda8c59d8ce9e0f8e151b0b19fb854d49be7162356cfa9e81f757caa25c3d321b56b1ba0b586c2b29c33b5195fe3a09a86b9ae194316098ef13f8522931a7632726714c7ae1f2e9f9be57e98c4c4d01333a2d56cc151074f99edc3a41c0d77ffdbf64b78e8ad35b3464a66c4afcdf27557466d62e3a423a215ceedd114600b37618f0505d70a6c506a10d5f301eaa2bf3ce57c2c040a3530e9e35921d7c46014b6411409c57aa240944ccdc3 + +Input: c694bce845d9dd6ce314023a26c498e6dfa62810cdd2f5dd41c1dba73a4731a4bb2cbb +SHA3-256: 6c3a66520463ea3b50be0aca73c044e6d67cb4920357b5e923e421f07e0618c1 +SHA3-512: dc32c5b3f7203a7245233df3de4ddfc965fae48ea97ceb33e0f9c8c76eff0295d02c557420f87c1b6cb4f2c9a15d4583149ac50ffc20fee06a27bddc3bf0a0b2 +SHAKE-128: 2a415cc91562c63cd6df030a8dbeab504ce8d1806d0b2267c48a7856c02142d19b3251896221b5c75eb586560b9adce338a5eb57035b00b68df03456ab12a97e5a151deb6c34e66ca37a327275c7f45f9fbe4d16790a316c28580dc4c867c06bb54cfb1bb49c0d8906dc3509c9a223588392e0f7416e162feae74207259deb1c09149bd64b35b09f27246af11bce03eb5be9b64f4d847690d78eedb89d511f6f854c2700bf41d9a95426b9789de7d09e9e50e3720b5934cea9fddf59eaeaaaee245504b721b5401dd59b349c54166c7e5e27875b3acf38fd4f752133aba03570bec9645af628f831f30c113f4000570d47bc43f99457ae6eb550fdb36f2fdcafa223c0202c7ce0f81e696b08770a70ea298c087637255ba9cf60c740c51b92ea8bb8e1faa7624977c65baf9975b8927f60d7f756a2efbc274d5f3e8200e54275da395a8500b874247975f0e7c0c8704395488b4eaa996e3d6563c0925600190b9a64d9b2f9a35fc7a8fb38c494435a792ed932c14d2a9ef4c4ba7681aa154c4568550796629d4974baa3b435cd2dff407adc1f384a557f093eba4d0eb854d52388f84dbc97658b43c1368ea0ff6bb1c2a228519429e7b0a6c2bbb7c56b61a110a0569a7e453263c6e88589996959504d032f512e711221437b7dd935bcd03550d88fda2b2ea4e138141a21027a95a09da7b8e1b1e62159cd260f38a783eb3d59 +SHAKE-256: de82b0282a47cbe163c7adec398eec7325f8df8a749591d09914a45030c636a5524ead02de020ad9af8f9bb596212fcdd6b0b6e8755bcb611bf388e7ebd4fbf7cf020fbb8d169d369b904f325e09707d6aefbf9a2434b75c7db54522307dca61b9c18ed1ea801d8d6b1f4b64f633c36c0cc2fa503c9413b662eca9a0707df65de85f32ff33c12823facd80f46f4f6b7001323ba8ca7867d09b014867b9057d600e45b01922df86a1956e284d3e40d7d863dbdeffbbfa03bc961c2b8fbd870a6d60b23463753457e1fb9977527b4628b4c6956fde108f9380646bd2b23bb5ae35c64e2190582fbd9d4435595ad785e5480f23507e54b8a33adce9b0537ca7097d30651f1be1b15ca38dd8ee010fde51849526ce9c6a7a74e02c1620ce6f86242c923848e678152f45cb1b8e43f04ed691106a4dbcb653e99914c8ddcbcc78520b807d2ca316937a29db01ca34dbf2314e342f065e7b850bdd5cdb73a2215133077a1181f9fda5a7ddc388b3b76b3a7d7619cf043b19c47a59d8c75750d057cec65cfe9e5c3a3a7dd03167dc7f3f2cf37d438346e5fe7143e4487993fe374abdce9975aac23fdd42d1b96df7ba694cc936dd56db58f507923d80524bcbc89c064ad96e42ba74523366f753e34c807e8ac5af1722e5fdeccbba2841582482aaa19160cf52b867b88c7c61f2e0a126bee207ed29fc923ed29285e78141cea198398d + +Input: 0d772d9bfbaead0d163a6cc4ed5b2783db5bcb4aa63d3b95094ed40b780bccc05e2e7d0c +SHA3-256: 438ae74a49f4ef828a99c98629541652aa8c03819cbe1a27a6b9f7eeb462c3f0 +SHA3-512: c99403eb127b0eb40abfb241121f8e6ca17e0841ccf9af66ae3155f22a29a881646e7ca98c3c726ac34485eaee5a31d55faa7cf3348a75c1de20108115fb3517 +SHAKE-128: c44cb03a62e32b2bc704876fba5dae7dc61dd4ec95794599933f5d1a36d482554abb3fd5abc1dc460e48d184befbbb1bc2ba027c73da2ea65fdb4d82a4aa4957527d0d97c149ab9eb50a8a5fec7b8c18b11cded0b0839b67d92f1b13377337803250181977fbf851cb7bf899b8086c26522788b72912ae5f8820b23e801a57a84d4ce5dfaeb3db4159e68b1c7517093491e440caf020ff13c07123893d8399606d41f59c939068dbd2ea94c83359a9761dadc5a1889dabd04ff711eb013e6ce4bf0936531e7bbd620c4f3dc341b461dc5fb7faf00155d5ff3685043f40865ca7b8fb7a11a5dd21b40f41a27b33396b006efa2c1d667211777b9b83e078f705f48e4201c86c29bcc8e1d7b563f08339c179928478827598b3d8708832a388ff01c0daa4d777ddb8e9815ebb3e72892f32d099490f9083cb9c5b257bd520a9a2a76e038aa6110e0c90361047de26d4eeaba2cf67b62916561a06de9ccf5756e86e3fcd43cbf2986c87c42b3fc7989e28db739785783494d9937888cbaaa8da22c0d473c0475b02afe996aa23e65f7e664e60969761a7e76cc09da7a516ae3d6f01429b3f063d254d62f8980aebe22a5788f307876226557c58c4bcc264afcf71fb3d775718361d7caedcfa6eb1438f9bbb5422a14074a140e66127a30657a34ebc3b4857530a4f24b53168c7e4aaf9ea0c4e3cdf7134b0c77a6242d9617c71703d +SHAKE-256: 36f48807470d7526051c6ddc3d7da7a827e68070e8e7853e7d77fee8a13aba817160de027102f8134de1d4d233923531a2aa7ffcb7701ed401e6ad514f4eaa0a956a6e2ab14f1c61bccc3fe2f2450823b08a25052eea26b589fbd2f052be6d7b5578ae9a773cf11f9d00847d982556a221692d89a5d6e8cd2cc98b64f5b65bda634a418d4c29c0a2dc8dec2d61280f3638562aa46dbc8f5d1bb140693042a575430e49ebab59d6816c085b3567a6e4d03014cfb30e6e2abe855a2a73a28140eb4656078eedf99471d19f96afcde898adb54141685acd81f067ea1bd50bf1ecdda3ad0ad3674f3305ea7a57e55b915c0d3db83a352563b7c381bb88aaf176ea1385d3ffc3686f0465c803c90da2e5477fa9996e042c1eb5ccf4846f380f039813f1aea19bf058f47a3a734d241e6e89adf2b8152dfbd958cbdd0c205199a0165a709d7a58daba7ab09b7e4b10203232d23ce18eb47b074374d22496eacd7222a7cdee85ae3fc8f3f9b216608e1e251f1dd4465926058764d65ced460599eff184d66a2bf7abffd49a720eb4ac6e6be62052e34b2388e458d26359189c35a4aafef2b0b48a17e108e696b4881d802e75aad91b5c0bc58797a2a9f14210d08eba3b5177e43dabfac5cadeecbd48a29b3945a94d923045dba482c9135dd2bc3275c25784988cb05fd119ddf823b34eff3d905f9a5e32e01e72e697a43460c011e494 + +Input: 03299b44e194c177ac85764d575c6816edaa8075d3341218cd9c1cd0dbafe447427201ba2e +SHA3-256: fd95d2e2b8d9696855bc4eb17c7f0c59a5db26670c9d729b2c31dacdf083862c +SHA3-512: 3bf5f5f85d09c632be494b0e7efb408127668e25d30f2ec1a3d82c4efcd50e5f5cc4791514dac73d97607d334a26a995cd06f4cf13f50c1c981a1a1f6f85b280 +SHAKE-128: 84ed5bd3059dfba0a2fa56f8db08695c241bfbbc76482f3f52200a4c44358e050486e3717b2e74a856ca8b83e9aca12d1d456aebf519a50e858639a1dbd74cdfad7cad2a60cd0db3c3cb2ef5e94942f336436d76a15e26ee44e47ebc28fe059f58e89ce6ea2741be2e362a5869d8f3cf93918b88906f58d4a65a4381d92706f35654c5d4aa5b1dd7a1a977c089d1488c236232fb6e77ad5fb131cfa4b9240304816311460fe88175f71c2d575396ea052b84059855dcf4b14c9c1bcd6ec12f9360e8775d8a1c49efdb097f9ea369711bd82752dbe9b35c7fcfd8133255180f4f99ee30421b174ec5aeb9f1393d44b848ebb101dd5186218bf6528d00ad43e1ed892cfc3b6c66beccaff0b8d09c06b17eb4bd3f3826a04acf355b325fedff15696ead77c3da4084e99a9fd27626afe8f68ff9abded28139cc67715422fc5760e9092a417a96f3374939540cd80d5f19316b7db7dde09915051ab056678f78c9bb5df4ef232efd5824f7b15f52095a4b6919a5537ed3a992e522af5a8f2ff7ec875ad0b33dba05e934c08fba74d06ee3a90150a4b361e6540ce7d76d0fbd038e16edd949ab68b43ce0316991ff659bfe87709ef1ff059b68d2fad9c8cd24639ee6bd77f178ef4adf74210ccfc883e4054fe7350041cd7db5c4395b3a7f31a57b02b128f68ec15df29a923ed90ab6b012c46f286db69f6e2e1674599873d8f235a7 +SHAKE-256: dccb6f5534478981acd1fe0275445abfb9f7fb9d738e05ef51a9d9dd6b84d4711d2b3ecda1824f63272abf1a4c75a806f60f0a31a0980a35835c42cd3037b0028899788179c234a98609f70ee008959dbb817806a190cc51cd31b6a73b45778526917a9373c3d69756de76dd8c78fd0c7be16ec2690aaeb1bea1708273ba2add62c3df45b7fde538edb582729fc3fcef58904d838cccb3bf542b27cfc3bbd201a040ee0dd548caabe2fd0d10877635b44f33c49f1ec58e876e0e752f68efb9912161a0188704286291d74c29235f06c8b24a1fc7dacc6797ce802a851a0b51143e77dd60679efacfe2f6493a1d5228fddf58b94c228d9b417cdd40e8dca8881f5fcd88f8653d259325c77260ff8848a216c8a6e1fb56d37271458ebc22ca8645c6a8ed38e14f1a7b02b167db8db2a803964fd9b93475dc1e86487b0e0a29b3f586c53baa5fee027a96ae02a50a6bbdb7e808b6973a32165e5f408901b84d2c3fa6da7aafe5fb7c853e7c39ed6c407c49ac3b8ad6ce5d6656f973575f44374db477225de8698ee514c312a749b5335332751828b275738f954cee6810f12e1fae4b8debd41760931edee29c306f0471a43beb178a08133a674bffd68fbbd1957e65ba65c585776a4bca044f61a1a3f5536bcb0f60887a6345395535ac133c6b101280629abfc87b3bfb821ccf48b89a4b02b8075c3ed6cba2a857dbfa14bde03e + +Input: 84f640ba62910ca3ec1ac2aa24ed47249f28e2ed64f0d856ac01a59da16e85ff965ed1b988d9 +SHA3-256: cf2b0d953542899b3fd685facc8fff04ab576b3365129e3f58978c90be41b311 +SHA3-512: 5a40eb8b2775da0239801950517d37140e1aea0df0eb77ade8ca14a293ba3ec50dd98cd0660502fed6d4aa196e13f1b7f647873cdf87c04656bcbea326902eee +SHAKE-128: 6bb90dcd71caddb89e8806f1568279d306b32f98c4d8b64eb0685833afb74c6031b6aef1445e6d9b24dbb0c320977a55484ba1d8ed77f17c5d2e637aff0b62cc2aab75c0f03bff91fccd9a05b59d0d21c51da992fa7fc5de0f94e322b3f9423c6ca780ab75ac0223336bf9d33fe9318cf646699e3820d087a59b8d2389989e6c53b73d6524233907169ec2e58723624d452bd8f474d15b51c5875d2252c641144f3bf2f61f2ed3cc12f7b4df59856321159864607c78c7797276a41bde4216304940d6cd08ffcbd213beb950491956e11726cab868f406495534fd10514369a568c9b4c7fb4d1f5a3600d6943a7cf599a6d63b320b6e4cab266a709ee4f67d4c120d47676b473dfd92fc9e8fa9a9cdb5ca4a7ba8063f190db5a648595ea4d94ca505a38909dec2a3179d2b5e6d29c3e5a4461037e712d12013ff6ad21a0b70d0130a98949a3ff26c973080e3d1e3e9f351426ef4f24c06d28a5b9785482f863c066d3649d56348b8b5fbc1efcaedecce7e35fc2700fd27f2b8137c0e38d74d2a0626abab9a8a22aee3a3fb32421646ed406f47e01619718793a7e28c0f5f4bfce1931d007fe9f363f8a58b3fcca3677982e5c190b2efcbc3ab18670dd2be383391aeb2b4d341c37c6ddc5e56648376a876648e8b259d3f9a2df5b9012f4ab0a5f026995ce48586578d16e042b7a489d19b96a20ab424bc1cad5e90114cec8829 +SHAKE-256: 141c74c023d8764799c190f1d609ab2f533d843b0f5ce416f403bb6b36a70a727cf5bf6271e646b2672a43d70cca655051edf9f8b1a65b29ab904d070cc7f5556afd0214cec6396f882109fd68f86905ca0f7d4103827de810b93e951e4940cf28d2b47e4ce384ff6d0ecd2d9ad21451ec9f20bbb05062e2ec75ee41711e4014cfa55c90a6ac2eebd92feb4817cc915e9bebea6034e0df196c6963a381f8a464b28a2f0946c69cdd3ad049984a26d25c80f933a572c708a31e0654d791b6f935f5ea4c66e098ed72d85dbe2bc7ad6dead1edc7af5c5be258fb491056afcbf0f22bfd3d8f001f35c691f65c54ad1cd63f48ff94ac76b8afd6c4607635b5394ea9683ec1a14e129fec22cb9e99dca27a0b040b1c3fd5f93f14cf972e52bb9bc8a4329ef9a8c8844149af5bd471e18cbf5e9a0e71281239920c934ac8eb3ba10393d4819ecadb053f36d25a1d08d62fcafbb878377aa3baaf92a8ea2f318bf93897fe7bb13f110e7c81f04aed2abd96299a4f35d299e1bca6bd96343f9f0a97d7430734e3e02d9c291ba2ad8247c147299df882e1deb5ab25dc41c5e1ec8cecd4141282cbff27f6d2faaad45bc811fa3e934af60eb89c9c01f030ac5c306f1e44f824186adb90d26547a258734a9b5b4ff81f1d97aaace0343ecb050f3134068d5324a0666ba8ecc1d744b9b7eaf66a92a078c5691bf8b82be425b2fbd0ba4b14b4 + +Input: bd8bed4f51232fb1fe83174deb66fa3f5094b5f303753bec1b39043e0823de8437043bd576b895 +SHA3-256: 599abade9819bcc0c09e3e73dcb51ae7098953ae064e1124fc18e1c8f07c646f +SHA3-512: 3b11228897abb8df8471aba9466d863d57bc5bb8b0d31b59f1574ac77279dff51e5f996bc8eca7484d128a966fc4d6e38a376d137b54c0590df851f0de7a056b +SHAKE-128: 811a0d3862be612c2ee8e75a5812172a0e620092cdcf589806e9f006a306e31a66bd96015e9a9e0309f081ad6750b3e0a4a36e15b235cb1418d4224506f057f5f6aff88b42ea3271ec40c8dc58e7cd7ac2cc6483b06dff396a85b1e7d0cbe533c3626ab12512b99ea0cc7ae5e114119e78a2719245445aae106f67d12580d6348356be53f004fa4b66d7c965640613e0df2bc087b141b09a40b871ac6fd8447d1000f9be0f028f1d58e6c6562f60ec94d02976df49fe3ac9a70a78bd8be9f75c37ec1bd31ff4de821a291deaa5f7c768bf080e527d1affd123b1f529bd35b0be52d8a1608d5a95ae5ae85eaa5b3deadf32b9c0732bfe77b799e6904e4cd61be7bc05543cab87a1d0367357f56b6a49870fc83d95be3c9c9ba4d06f4d0988c7b95ea6e1bf0cbccc58d2e086d2bd063b05ce62c44a1c8b9fb3cd042f9057d1cdddbf870e759016f263d95ad485e4d66ca4aff14160b4ad3d65e7481c9c02eac098e2e29b34541786e0919ca6c1937b13eae992a2ba395391d16269bb905890c6362d062ef12392aedcd46ec9337444ec2d3703033ed56d0e0db8d18cfbee2e96e7ba47ea0b6e2ef2e866f0f3bf3d28d0bf3a7acb7dbaff967d9eaf260bd6d4d131c17e275ae95eec31d42855f658a49fbfebff37a543f92bbbc50a04fe8b2b5a4afefdc2728367343e2f5c5046a338ed52f01448b38224b4797fca06e5c20342a8 +SHAKE-256: 400604b1d9809435833c8eeed07604d95722fe522a028272743265124270d85c5bc563c89e5e6ad7e2b9f72dc636d58a8df2bf6156535cb0f083a87d30fdc8b6b8044dda81f763fca24a8693a62b89bfac5e1b0094846625a554e196b51cfd8fac5bd714a4d0eefed570b0c280ca7ca8025fc870bdfdabb780f0b0274faeeed57a8656e51a48044c16110401971d7f0486bcee3786636ab0159ce09d286af01ba448b431f4e4805045539aca8e6b2302cfa988620d51cbe72beefcb205ef6b0d95d8b3377947ba7980c21b682c734adf7cdc3306157b0304bd53777212eef94419a0293f9bce0f2a0f8370924ecdc2c2cb8113fd46ebfca618def3ea8a103a3f295df6bfc9b87ac9d22a451d42922f2f9254817fbae13c58a57d3ed8dc1b7d1571fa6911a97ee3faec3b9cd776894919096639312964bce538f02a60797433b46858ec5504e5c61d69ee2b49ca21f3c1d4be150d89ae9e24d91249a094e1cda38ebe8d0fd6c99d6e2d82c3a6497feaacfc602db6b22f4e419e05eb4cf068bba3643c1e473da8a0fcf08662c84e1502f3f81d7ef6611470a629e4f9bbebccb908ddfa45419ae1060e104f970afed6c7756b2ad43d13f623f3c84baba265863d2ed26a20eca274561295672101a57e9422b9ec7af0c941932b21d2bbc3f5c2d9c3f0a996e9a425d1fefa28a2985fd3d53ed5ce5f194998c279d32f8b37ed129c0c + +Input: 1b9c65e6a2f87fffd9a57f890b61c449b0e3118901dcbbbf19ce044345d85b192c1dc61bdad64bbe +SHA3-256: 4a60ad2de4dbb39db69d3edc21c1f672a3f82f0b9a2932c8a48042298154d13d +SHA3-512: 17e45b083ff9d2d227599bbc07076148398f321d232b5e39f340d7fa610f6a360a57e2a50c6e170f940661212adfef7ff6d90cee1792e8fc72ede9d550f27bcb +SHAKE-128: 8e1baabb938de72d8bfab0e5192378f7aac81f15d5f529750da96ba706537c6f2978ba7983602b103ca6a47431c7e04af61a94afe84269618cbc673feec65f9f53dae8f779c3eea8faff9998a04a89a3be63fd80c5412c52b632805346dd43f56b2808f652f6b36fb33205f789222ad09fcc3d25ee19fd15c4d6c10c0208240534f8a963784d3da1d61d570bc751c0c2dde94365fd4d57b33bdf7e2e17165242d89bff50c16121c33844a5a5a6eb4c12be6c835718b93cf1e972efe076f5dffdabac87d7dc7ac58c40db797ac249443c7e3f1fd79d17cf78992b9df5978ede51453ec664d855632442a5687eb82d58d8f180a4b00236e4c2ed6e5e52eeeba6813ded0c5ce51fc80d248650a420c000745514c4f6b0d363a816feab00502a32064f1ea13ef6d73f00b10aad47fc50e016f34fd6f6064ce13022e9a82cbfadc7d0412e0bad0ae49aafb9f1f2fbaf9b8e5f632de4a46a3285a40a8f0146b8772b61046ab4ecc39c57d662e6eee2f8037d4a7b612346ab29a3310096b9f00ef23c564948bdb0b3f7fc7d3aed7f4b893aa60a3078d3c59cb720bd7b57f96e723f47b26a1f11003dcb4e15eb1461374c9e4bdd065a02d8675b8b9eeb05b74676385c2adfc46fefae6b21d9587e9aa66de48d70f0de2ae248cec374508fbe2ac25787a8f2cc79a43cb39d772c0005061bbd06c68c284c3c4622f84c36357f08144c1c8e +SHAKE-256: 87abc9e86b46445a60844fcf6c7fc59e09d60eb6594661defce6f8dbf2dd25689b27f990459bb31b63ddcc8a97122a0fbdc7f3b792eba01af0ad1e2248d319a284fd8cac6a91fb07fe3292b49786094bd76f560b48f595bc53c4fac06b6c1b10333d0a16823a001e2bd2b396b58a173cd896d487408d9a98837e58b80da674e4a1585c39d576a249e1976236ba8f8844112961fb92409eb79db494570d7949ae8141f0c3bd3946629136dcd9bc8b65262dd6cce989f280a333eb9774e129930ad0e745da9b5c7d6070b1e721acfeeb05fabf158169dcf7ba0955e965bfdbfecda7e2a657e076f511f1a76f8a805e5d3baae7da440ee70d74575923942add0327f775f722f282605751c44cc731f6f0b96c9257a59b81fc365f82800de1f432c5e34d2c61725d359a8724a2875a3ac6ed1d3c5aea608bcddef30a9481a264e29e216e290845a0da638c7cc92e9c65cb40c113601d20fd4f01aee38ef6767b2b2b4454f811debb4ad362a8dd0f95c18e1b9c2567cae2fa9c1106d557b2a257865ecd2be612b2092381381262db19703cb5a88f88b387e34676425bad2f52d009f217500969a99db6e7607b20eba512bec3fcf0f37d08dd8ec89adc059ab194a3c8fc1341520dace26107011e4f5fa7d2c24968f301c13f65e8cf61b560e556280b0b0200aa90bbc9d4af9069a0646ea197bc41a0fd34c5f0e94470364ac11bb33f + +Input: 101aa19c7ffbb9646ba711798c5c802861a56f0d712295f4f8bc12e5ef93132637cab5c69abce78167 +SHA3-256: c64464eb5cfb4311c9aa9f8c82e24d9448ddd04b59bf85ebf0fa4a3bf9a25fc7 +SHA3-512: 0f6f906a01c18b71a4f1824c26c138c19a46166a54badd3fa489de03f8ac84d0cfb5f571c1fc011b2f3716e2d844537f02ffa4931cf75be6ef02f73e082e0a80 +SHAKE-128: dc186094f4ce80166046d1916092e40e792dfe3bbc7273ad9d3a1e672948bdc97af6e9e1c945823051f10674b84da6805b2a787f854eda0ee680a2c3fd1f79a490e465be98c99b0b64ee229958736d07d16de466e1e56615a083ba9019a928a036723f0361fcc116010340eb1786123114eb0a8a2543347ed027ea096623172ab0ec33bd7466a977aa250351d1ff84e903d29cb901a9f08f76c9a9979fe722011c595ae169b401617f4673fa300d3f3490eba6dbce5dee727f63e3097707cfbdd89728435d8a05bfc1fe8d0fd99f3cdcc3713638fa51706e68e417c5314867c59a57b65754b89c07cd45207de8e377f62517a8ce259c2078b6142a21f76b88a606ab502ac0740042586e65fb7a9da123256183b8fb1790a3f298cfbe06ea3a9d87ce9a7f0890bbfa930514a5fa4208ce08ba673288a98d4ececf9e31d346eebe714914364bf7d7e0e160d5fd2841b7e577fb614fb13db7d0ac9d71fae11ab26a75b28f2097a9e4761f6ea3b9ecdce87944f7f15965a80342b611dad45caccc72ab1df962748819bbe4c70c8b080a1af8a9af31aa2ecaa3560ab08bc2a022537a3da85e6d1bc636d5d5ce0a7069b0d5ab046f4106e7699bed682ba00ed67ba8922a8310c208166f9cac957e91d7102421b30260635ec179a509630a1a95ea3d27ee8e737b49f0a8ca9482b24c2744851b6299e8b9a91e6b2ba35d4869efd5ed23 +SHAKE-256: b98361f3cdc74b392edb971879595a0a1b45362866599f7371a2ceb90850c95992e0f796670d4643b2032036e21f46f1d8c1d40cd158067897537f75c11ddf0542175227dd391b9f4dfbfae00a5ea59e79b8a02cf3f03056ebbcb5032b9fa0ddf3c986ebab6821c137176686f30a989fe450dd62eb26c87415f9976f55e3c3520adf35f34d8092b727ea8dc9d259a90c2fbc63f84c5b2c1000eedb2a74e5dc96f966ec3c4b5f9ee04485d826abcebf57ac50410612cbaa06009226a30f12248fbb55f415bcec6a2b27b29b1f976869e531c65cf433b0156edd412b2d136827c4d70c1b51e504703cf986835e4cb2994f1330f63ccac93dd88d96b3f3f194520b2df2e6d830b0c83359137f1b9571809c14f2da071f667fe8fd6b4651f3fc9b2ab49e700e9324a494637ad4595519944aa061a061f8856149d49b23882f064bfe07a883f6daefec8ebeaf39cecfb83afa8a1d6a35cfb41958e94489a5b83585863cd358ddb64a09097cb60725233b868416a5ee195a625b2560966fa440ebaea6c0fa82c15f42a92dd597d5721040f437e7e259d2f35b04fb0be9b6a0fc55b40a8fc5af06ddeb3261fcc33103eda07a02921518d574498cf7c0e96ddeb4ff393826c69402c4464d51a9c476f33ab44c90e51783e66fdb4d743f651d69f9a7113c643ec4a744326e1612056ef1229f800850f1573f5fef1ddaafa120df0bf337ab + +Input: e15cb62bbd40ab5f15fde6dbb0d8ce437019d12f94d70d862e7a0898a3191c6fc6fbf684e79048912a58 +SHA3-256: 924744167698219299e17a618ac449a520fbfc3030d7e02ae7171a96224060d6 +SHA3-512: cd8ee20526b1468c47c6f49897a361101ec88770d18c2da7142cc73e97973e300927f130cad114cdedf7912fc30394c42dfcc94a29c68dfe6e3e291fb490191d +SHAKE-128: f23e2976c279afa8e6ef9fb5962486b4f62664500721215beac6cdc1b3af773d7bdda23c5174f9817c47efc55ff981cee81d5d80357cda6d9a55183249bc9808cf7d40bd73db7e02b5fef215c2d5e373606b3c139ed53801ccbf8366c6f9c60c9019f164772c5576beb684b7e8109e16b739574912f68505b11cd1252af63c0982e7dfc858bb3e13de4b4722f42c7c418a5d1925b944d4ca56cd189dce312c0fd87ff663fae241b0ce538e96ec79cf128f44029f5c859ffe09a50be7ee441614ec5345e256d74654ff9f2f1c7198e1eeb13d2fa56b80e9256b7c88717038278644a4820ab3efed9f3b194efe9f61841368ea28e8f8a4a2db1f9713851131eef3b05732c92ab42f7e493822949d8134c8578c27b865b03c07f7a598485bbc336a6008c582df49aea876d34ca6f5d82e4a1718e0cb53eb773a3cb3cd9b42355dd14c9ecf30aca5e4f44df642883d17f773154fe0e4ad2cbeb7d3e6d40851b4d7da776bb1bc8c1e7c1baafe744f72c8925210504f1488ab3af14d375e0cad875dafc6a13c425f6f0025d61e0b2e3008639acd6db32470c1bdd57606717a287fb800ead123281d4d5fb27dd6c11626b4cf9409e39d349462776b839598a99cc703fb35c82cd57cc593cbccda0dc5bc6fded808597da694fcc2962cdeae7d31e818901226016f672208b3de4c3a20813d7c11fe66e43045b2bf2ae20dee5bd76cf8d6 +SHAKE-256: 180ca4d79a7b7ba820d46a067fe7c947999530a1151c515362886af44fdb289a5cdb70cdddea1c9252ce9baba2bc3a7342e0ef83e7b98587e0e9e8e1d80e6a06a52305b28528620b9152b70977e4b8cd9da628f878560923b05bf399ea4802cd2e5af6989f4fb033749454222be5fdb877940f6a349db9469f30ab8f75eb2a4a152e04046f22b86849517cd87435c790f39de89a6c288ec922a70a6f3c6deb4e97ae5abf25572ddb3236750d86b175067dcc7eb981dc4dd241bc9243ac857a21d047d97f2a3c44456e6cb6c7a8dfdc9d7efd14598b6a87b40204bab1147939dbb9a2136c107bc98a52f7a3548519c81e2f9509a937b047070fcc2e47c4a919e99e962bebc38117a6a2f055028f45f9951f41d2cfc6180ac1cb216b2e0c9a5a79a9559c3f300d74ff114a8f916de54fc77bfda3e1a426b84e402d14f1a25f7fa9d428e37b6d3350278b51544e6c2ecb8050f3b7b9b927cb2dd368e722a19f4cc933611dec6074ec704201a110fdf549dd5ad316e161a1df844a15b5faebc5a66b7d4516c198b27fbca3b6c6e9d4af8f97f4f7be9c83206f643629cf2d81e91f980858c92a8f2557d4bad8010016590f5da8d97f3ce72ca3b9b769e37bff26418935b2a0f2e55acd7fdf32512c149a924a3de44f5b778cd9cfbbf7a9b1d241fc94f8e0bac90b126c6a093bf1a351275a230a6050b55a769ae0786291c82ebd1f4a + +Input: 5a4fedb8ea111e4f47e81ff8f2bbadfdf1c194bfc798446b7d46ffdd4b385f228f4c9b4f39f9c16f4a91d2 +SHA3-256: a7a605a3cf851c2080a835c1eb8383a5a719887443108acbbcacdbbc3e639281 +SHA3-512: 68acaba0f375d73ef9b7baf86b462f01b19a30885966f9ac9a6995125a6f6f83bd983959d1b432292766031f9ff4e7cac1e14b6ecd2c82fd3984807cd552ab73 +SHAKE-128: 5c143f2d4244319ffe8126568e1bab4ab71c515b1a91db4892b0961b59dd31f6a8d864d8eb4efd77e942e03c7c05a54129e301fe43e3fb3b773ec3ffe64291133c66ead5d3b068b02ee1a59d7347c8493d28798b0e9bce310f5681df35f026aef9081f0011c5f6dedc0ba4ab1d9efd0bfca44e770dfabdd8a332f9b3d52c83b73aae4bd75317a0836efbfa9cb369a841163d3496b13c036aabe0930d24f1f1a0d5943dc69ccfbf98cfdc109692902b72ff8a9b6edb494d51b1d7e58bb106799bbe0e37c95452cd47709de53653ddcc41c06bf72cee7d2e8823be52e9206ca379cc8e8f5a64b7f8fa9d224a9aa08c4e93649e45385a44a4af04991cb5469176c12e7eee34ea37219804cff241dca4a4d4e3b306659bdd32f4d203f542e3f407e1852e899086494714390c99b4cc07e7258f5647d677d99bd19f6136b075332daecfa31d3f802462e1e35a494188df5cf5ad68d6328fb62e299475d5f95a80a0dc2eb3965874cbae9f11f58b3808b20ae1120f74e40fff91308f3958b0016209c2782d54b0fefacea7752ca4388566cb5c5e3fce0f8a5cb830f9287dcba7c15b66ea9f1a0126ea24e5316cf09faebca41e231105ccba2c2c287a2364884e3b4f467bbef324f5bc6359862b772641874ad8bef3ca2fc43d1798da890e2b303cc957f5197e587034c3726d001eaefdaf571fe5f634a7b8d8a0daf5b1200c33cf9d66 +SHAKE-256: e30a8bdda6169e84bcca9805021cb2522f154766200b6e796b4d9c261aa3d977e68a6d850946e579c04788d1b47133bb56a76028a4da881a414cd46d18601f46aadd7616850b895bd3ba6a70b9dd58e01e70a5bf9e7e96b273e177f93599030f749a994a0510c08ef4fd205d2ee7a49c5be53e1df20817299997b10311b897272f2cf5d90b1bb9b1395462332a561ce32adc09ae8f6bd9c3d496779f6a5e9edb69c51d05077a8e7f489065c1630e351031dd6b56c86fe85d57dac0f63c0e7b846a31339136530566b55386c6cf000c3ad7c024a5129ffcc25bf272c54c23ade62b159fe9166eb480dd241682d875274f3d0425a7621d4976ef6db852fefd8cdf9e7fda64ff5b6e6aee344a66d961e2e62e266080b73b0314fab5fa18e6d4361c508c5592c436c8d0c0bac284bd54d5baa3b49a239fbe5efdcf28dd7caf203294f6f579f5fbee9ce08d1b1eab96a0c3497ea5dc9143db813c760abe537cf8fba09a90e5f014df8b2c131f4a1a47c44c3026956a8ded0b87d8cf1b0c2e66b2b64afc5ab88a19c8e19a88de3a83e949b012ee450c079b519260760382be3b1eb2f48ad68eba33fc66b1fc9a9cba9e621c750ffb4ddf3c7f1a436e732f1b7ecc88a84f51361f8545dbb0edf43b1be0b2ddcb960d4e36034b9395bf7354e84d48a1d5fb0f77e67cac8df546f40dec8624ec63caccb2d7d82bca1686d919e182e7d86a + +Input: 35d464596131a3fe25997c1e3bf8a5f02c532b934304a5e42d4759714f8efbbe83f7cce78118320bb7462eed +SHA3-256: ac930961cede24899ebafc4552319f6e413569f876ee3177a46437d596dee1a8 +SHA3-512: 8a8fbb6465c5eb8a7960a03e06a6d990b33981481a8867829195a3b8deddc8924319186fdfad0080ad13c64d62e8e8b8db92a18693f2da143e80a82c27c9ee15 +SHAKE-128: bbc78c2166cbb08c5bb4f1f01ed532b0cffd73790a8ee0aa4e0a0427f6ffb28b994829ceebac951038ca2a0a97e0987a9e9c13c6b500a4365a5c5749fb77cbda6f06f1d84daf9a0bd150123dd6814baad12bda15420c88f3205f83c8de707db3b642e526ff2b35846c6ea2de1e1c919a0ed383a147f1da48940a67d7a5fda7cbff6c56d35312c85f6c1c1171b4179ca6873948abb57cab2d1197f3cc8b2b11db947c6fdd43f96de8f6a2d0faba6f30e218848d1f3cced4125dbe22bdcfc534c3a1c28baaf12d92ec215c4c339ea9c3fea17122db8f4653b72de3cc51d379e24ab46c52e940a2dec13cda9002d463f65a09937d8eb8224d335c8ae94f296e75cccb0e1fb5c2d4b4d6264fba84e5abc0efe29c1899f3052809122eb356e902474e6eb83bd89217b15b096aa4c1eddd0c25aed4eb2c83921ad2888603f0518ca867a6704dfbf95baaef53c0d9f7eb2a6c0a109ea93b08a65c783dbcccfb4bad8633e4aa3502e1c136312ce0929820db0ec40a7c0907c999d651c0f64bdcecf4db65cf259074bc6775a62fcd11d4aeb17c913eb7ee683f5a5ca0736dea140fb5487eda84af91efd15897497d4822116bd66211b00c8d49ed3498ec44419df921c8af9b73aff5ad00a0ae0f9629e398afbb16d42d5733235766f7e36abf8550bec2a1d0838d60e2f4eb77c80401a0846832e12a8eb4d7dd84bf20a382a5e5e2f5984c +SHAKE-256: 904b686130e05f0ea1d070d3999f3374d3f1dbf717ac9a837d8df362b09a3b8c1629d228e246d1fb943ff6b6ec64ec36b726cc5c2973bc0cc92009c525057a10dd4f939e2438089f66b03dbacba695f5c5f2c8fba4b53a993c63ae3fdd265b4e6a3f6e70857852808ac5620cd99db39a296d36d5713a65527e5b31bbb37d55e3c5f630489f43444bf393fc89a7b42a33370cdad27dc6a2722b29c173b4e2d5dcef079f0585334162d3ec99b00f01bac49c04f1811b7c50921423ed2a2df07dbb430790cfa815fff4616c8e335b97c61de567cb9d3764bffca861eb2f7b5b28889658addf477a541f60d614929fb010e06b78dcc1be39bd49bff747cdeb453eba4c64ba0161628f2cc9c0bad25570d1e36cb462d0195a9a624f7878b78f654904407bd4240984489e62d676a2a5efbde42982c79cdfa00367d4cdee04bb4e55b479055d43eb76193caf840392743a6ca25aa29598bfb65e8d1c6227e50b75fcdd7dcdea82a610fa5367d17b4e6cbbfe3040ed8232e585a5ef2002902bc82921b20f94c9f5d527d737989ca4c226502ea0a852dc0f1a6c721146ce99922886d03b98324fdef187f2f101b7914c7fc7da08e63f3196b54afb2d77067729154298a3ee30834b6289c508b302cd9da89b48bf9640bc4ff97cf022016e8e43d8a99421491274d6a8b8c01064bcddd004e1e3e46a175af59cd6fb01fcad351f00da0a8c + +Input: 4d70d3bf7e9238943734230177696a09f3e84b1422ad81e0cb096a55ee61bcc3f13e0116dd8da4c389cc2116f1 +SHA3-256: 96d30ce0d1d88e96cc19cefed4787d015078cc6425617a5d56e2cd0b56a658dc +SHA3-512: f9a450c4c7b0494b2aafa34fbcc0940ee1fd20cc15c37f216671e9027c14a716c5e9753b376992e3903db2ad034ca4c88eab591e03616b4fa203b782984af951 +SHAKE-128: 4596c587904f1c424d126fe55c70450193a9dfdd3178a285f3ba46fcc0bdbcf7b28a18022eeb0189d90560cf021956c6025194ab1d37bba95c0d9a08cd6cd3ac34eebf89f1f4d9d2016ea98cbbee3efb5f76639204be225c635ebdfa6080c543719fa210252b8be729329bdf39a15e6403b710918d8eff4db37a376bc3163bc8f8bcde49dc377c318d81b77a03d148079a5be6f3bf6664e7b4fdb827073fb9de892723f3be19ccf9cbff923015dee4afc1fdf2e592a4c9a6782b4ffd19d579498d48752249901772c48d2b2257e4c3308f95cd0c48222bfee7209061e9087232c40787fae9441a0f4e7711dbed3905420d3ceced5f633792883b8ce541ca9afd54166042b90419ffad7ebebf89fb40102d6946f7038e88506db4a666880384c6f5e1952b2982cb7f14e88e1def7bd6863d0ec867f4992e55891f018e517830cef1ed649039f8f3fd2783c426117ebf5a1526a3cb60702fb92e52ea6a2c41ae5225fb71e701e1105f7764cfe6c49e45ce27cd2c27efffa40973f30599e0da7d7d440f42a9554dc1db558001ce61e9a22cc3ef55c3b90f1dc20801cc6d092112bd1fe9dc320a767b130704a88a17f78bc3e94f938a29fa4079dab60af977edb29998820ba5e7b1ba79e8548c618a846289bab0baa3ccefd830deede0baf7c64bf5da46ea5656e0797cfbfd71ee0a56d92aad1d01d50e4a0f3183bbf67da6089e3a +SHAKE-256: 3e81728121f9f284532f5c48ac9b4dff1a51ed61e4abb5c914518a8edd45b20ee6a84b024c8325492207a3de24ca31505e3d70a3ce1edac1bf5b36d0033aa9826c7a138a7201c829cf5ba2df57ddb5ce3be001c51e758716d513d4ffbaf26d38b5740fe8889b601e27a3438ae58a49601da7658aa419c8a963569ae7a25677a44560039ffd0b3869543ba4252f3e8eb33a41dc24348e7707e5fe207195130d867aa6eaad0ef93e619070a6b31f775cbe113d92ee5594d591d0034802fc681a8d25479e79bf8bbc7d266cebe70e161f68489c1a17114f34932d4293c105c2f2ffe8cd274c160de6aa11416c43537712b565f71637a62af1de859dbd1dab350df38c0ffe8c23542e32be909a821ce770587637b1b1d12fe86cf1ec0c9f8a9cb8ddbda996100008b05eae66e6379e14044fdc6daaf1ce33f616f68215a22699eba633767376a9b77c89dc72610d282721722d35d4c4b34ebb6259a9ad554ebeb5c0a96768403426e53ed0cbce8a070a81dbbff523bb76ac194914092892d0af56ae7668d637648a2156c3179d1e30603a9c38b49fb0414aa67de4c68dcd1e30c9d97d9c42940f645f77e1be3987ce3c2824d41422bee9603ef9607bfe6f59ced39286dece14d656cf6c6e09ab16b95c33a646ecda8ab9ba4de6ddfed7ea7ab868c6836caf8d111fa2af56233f11845d1e728afc80a467a939fa6886cc038a49df4b + +Input: 2f6abf66f6839ae507d33d1ffca3c8655509693eb09073d5ac0f4c1b906fc9d2aeaa0bbb3d0f88ca10d3e4e3bbd7 +SHA3-256: 30cb41af84471525d246779b8fab405e1d5fbd9fd29e7e29913ba72fffbd12e7 +SHA3-512: 1c4c599739feef90c4bef91048d235e05bc69c2b74b93d1b5d47f7531c32a7545d6973376e90e50e37be82c7a60d3da313d572aa16ded535b365bc5cca75eb4f +SHAKE-128: 46c4b180fb326cdbbb5cca502765396bfdc624765daa826be979de9dea92c5df86f86ecb9bed6f29f6728a1819d64a9132fe601b81c28971fc97a453c273f47f470d81e2679a2351bf5672ea00ab56122b9e732d3c64ca3e92626cd5bad06fd5f20905182a9c8f40817218202b4d11a6d10e1bbdcbdf96998e5561897f13761255096d8feca1cc7cf5da36d36de737c7902a89f0e984a642de0ae0efacdf8eb325486777169319619e3622270cf271f619cb6bcf99b234fc438042081c65a8c9419e2fd0e2fd85c70dc1a6f9b11d53396c7e6ecb6806ca02e7caaedccdc0e89a6a89acfa63adf6fd48677e60c1a3cf71d7b59ad300934b63b9a377ee59f5f212db1e6ce0f1fd5b94d7d96c92f15dcf8c0cf4523107886211aac3cca3590a6cf101323a26c89604d63a97a349b80af1eb27c7a637d31e3bb9f50734a884107209a6a1e2206926595d662dafcfbc033a7f31bd6f48567161d3c1e3b740f11ce4b2c2c76f70a3ab131acaecafe584820bcca84fd2d943191f0e954096533a61381bcf503c45fc6c2868927c1c390f753f6e7f722ebb45309310e9b59ca2328d72bacc04ac1ed1c7a0728c7fdf71110fef2df34a11cc3942f004e64b0fc0d939d1d0cf41bac5b8764adad93d6307adef39334de5c85dbd52138f9b2208d21b2e2ef534de8d098176073178e6d592345fe53d158131cc25ff55383810d2fbda44ffde +SHAKE-256: be2eafaa1c0ec39d825dd62b7d7e53ebcf945a8f6cbb3fa52947d8a64579853ad1e23bd3a9443a1e5b36c90eb5ff0b71704c743d22e9d44e299fd7ad83ed3f447bd6d8f06e84318a6ffeb46afd01d32d72e2be62b85ca43b54df92cee98ba4ecbca30afc9133a2a6513a0b309905d00e381986a912305450d66516e10a6f7d8965111673823347775c48f80063e3bf81dd267116957998dc5c348b230dd359527a087637d0a6c724a01736b7be491521cf46ab18ba9a1045208a1d4567480de1b503c4139e02aaf3f37144b4def04aa1dd36ad26dc604871eefef521e82aa8478083e1d07dd67d995d66529f37bcc1cdcf6739a23ee08be7339b9df32cf50a6f6de6030557063e0df18f7c4343d1f873bfce918ae7613c1888bc095481e34f872abd2b73bacc96ffda63bc8659eb97e894da5a50a76ace391d35eaf5492d16278bcfe42ea58307744ab42155c93f44f2721bfc013fc7caf6b25231de572fde03404ccd3b882839404835a91c9b02392fd1d91876d72ad98ac75ed2d91310f530505a5aa1fdbaab54ebed14b689e8f763d6a8ac1d5c2a085fb67193432f03b38e83fee0aadee422ce531d0dc860b5714d698fcdb1837610f66f699476747375c5c5d297c00253ae03e97d42bbc165e633601408aedc695bd14ba4a767d79780abc2a38903135737ebb91f43c7834dae7d92d2de1ab0d11af9a2f0040f107d482f + +Input: d380c1db053d9c111d49d396393858158f7782a1c7f3b610386a64d6fbdc13a6f0bc0834abcb9c0c5771502022480d +SHA3-256: 0fe6b5c2b370211a270c2a769da3b57370656da2860f226899229fd5ab345f9f +SHA3-512: 21bcc4bdc76fc9f8b42549af3bc27c8e1941524a0f0474555eae6a2c0d6db5bde5b66ee41e9cfc6f2a7c6b05c08692a48a436a853441aa139423fd786defbd6f +SHAKE-128: 406ef25d8c529b360e7fa01922896bf7c997bc17ebd12e283df2347843442c1547bc113806dd66679b3c77665bebb71fabc3c0808ceb13a3322162eb556356f0ac64f4886e538e0dd41eca81ed55ac4179e5344e34f8a056b434fed04af1dee2778dc2a59d5a1811f92e95cecbd1733e4ff67db9a6e65a81cad569914a21a74809aebf17087f9c94d4ec55a0463d573521fc614835750068ae825a2e3543d3f8e0948cf3d87cc899a2df359579bb0f2c1872579b08f84fb25b1a86eb6df7d24e63bdc6cd83a465a3f3752fc08fcc93f3c93a121887732886c11a4c81cf3da554c90614226f0bd3bbf18bb0f4c77438db998a854f5d8f993d6f054525ee0a6cda5e204f95eb050bce4603b86ce821b9efbeb8dea50763015cad0f703498779500da88a1094b95f2d2519629eaf3b4a8b83b0900e06e2b3678db8bc0299970ef53e000a8dae0da4c9f8b102bd41ebf62144dfb86804351a49a748a460b4b5a9b2d3f964265f353fa8b00b14135756d3443fa758f23f3da7a913f328ce6c85449306bd5c5bc9ae69457185cde331bbc6cab11c6a41260cb60b3161ee5ae5aed4982f045ad570597ef7fdeee96e848b036fc8f47920781d7b9f499f102f6517bbbb62110d5bd04a19cb184edfaa5e953b02a523511a65fc459f362aa4c10a9ddab248f086efe8bbd0dffa8a78905d524cdb059d354c737faa879dbc91550cbddc212 +SHAKE-256: 266523e1a6211719ce79de23035f3c6f137be6f254011696abe43b9e13b856feb9436d7cd4b0ebcd793a2a154e0f7ba86ddfc208e3d004d28f51ad919941ca0f8e36f476652b0d9529f6947afe67f250929a74b9d48d83cb646e505aec45d889a2b7c71e36e19f4a9a2785b59c62050907465ba2ccb219e31c8cc5ef3d9b112d64c988bf5eb3b239d48ed73b4371058b03bd30c185fdda640009e453ef7058beeaa4cea44b55bb30a945296c6fd59bb8232305374aa71c93cbc116900897bf9172646c124b1edfd136bce795852c2e0991c9a851bde757a65b1439696576a147c7b1508c0a0e14b737a072432fdd988841c2ac372fd990d7deebdb5a6c9e7a13b8d2d61b4d12f115c1fd9e7fa8fed7eaaeddfd92969e41ed8eaa02e7d26bde8ba46233764fd3a6bfd4cb53b893adac6a72350f8b91827c4fefa1dd7bd9c6dc419505823dbb0d6359fbf23f0a453b27cb70dd705165ba0fc7644921fa9d06f2407df2c4682dcc6bc00dc7a74fd1780283506879a220c0952b63a97cb6892c5d6af0c81a487acb50996faaf39924b5ad090e1b3a3320a80e88ffc4390dd2645c2e40ff43a3afde53262781798227b7415ff77397946eef420264c4e935f1a97e31dc0a6b4ac9e4ae4b0803b929d1e3eb24a3a977b2ee2bad3ff7943b9d4bed6dc968757a704d57026347fb6996bbc3a7f73fabd6f28c25a1e6c187f9798d71608a + +Input: f39fd7828e22b3c7b91fd885b468ce3b6a790d70dfa0aae900d85b5a55cb09adb6b9616b29f766c79a0fa5f7e6d895c5 +SHA3-256: 9237c1a9cf6a5814942d425d556216234e5aa0aec6916e914b2a3819d597aa75 +SHA3-512: 8c1e009893ab70e8e0f93ee450478a36a4c19beee25c040598a8b77d94192d8bf012d9eca45d7c6948f67e2c4e13f21e7311db255ceb32ee6f5c873a49d50c2c +SHAKE-128: 7841d70f81c0d5129991f801c5a9f0a8ddb85692b48c5f90dd3852db9289d0a328975b9ff360e6a57564cb0367358036633132feabf6c4a4c27dee7189472e49528666563c5d70f8e5c10b04e1ccf061d8d5f5cd42221d9937e2cab5197285a3d1fa282fd78fca9ac9be3a5f4654cacca9ac2948688d44cc9981174420f036756b7150868d5cea6e34d5d05eb8249ce7787d042c8d40bcc418e9b1d207370c996ff2beed191152ab868e97996d7371f0990091d220a16d94f839bfe9a7437a3e9bf68a5851e83db0fbb6ea796de8bb3751d5ed1f145e1f9398acfafdf6be9a6de6a200be7a28c52325e03ffb04b99c815787090d5167ee688d56e8d3f7b8a1e5f926814df6c1f71a92fbf4c3884363a961cbf4841f4f6ea50165b5fa81b2f44b508feeb5b11eca3bb3a092423c4ad2c9d2a4518ae64a3b6702d5448241805a95c67c8d9d7145c95a45dd375c2240b4077d4a0e30710673ec525d90d37d881ff899c8ea1215ac9f124c7416e153642a1ab04da80c64216ca3dd117ea55b0a074fabd2988a6c24da7d1764fde36090f4188c21d0cf536eb5ea9de5ed2bf8b7751cae2f021f741475a1eef1bcf811cbebfce53598309ded5ab003c256f59eadab25398e3175df1c980a392c33f056a0810555772fb495577a73c5effcc401677a71832fb8441da9819ca1c01268e103edca142be0dc9498ce470befec1ccfbc79bc +SHAKE-256: b3b80256e144e30bfc7eafe307ea0c181a0be32f46b557998fe0775e1f63a1257789fbfff41f49a1cd7136e4e297a0625e52cf063341f6bdfaf7dd2dc9812033db7f42c93d0d072cd08f3a48007491e25291fbc21b38f3cbae9a13a1126721602bc7fc729164e3bf3a3e7fb4cebd683935fb614b7e1f1b225563dfedfb2f043c1c675a603cb1744d87be179527c3e2bc7c178f48be7bd2a701ae34d397da14ed9dbf7cc748230c9f695fde0f9592a9f950831d81e5c7a3d267c77b2559101ef11583386ddd164b7ce9e9ca361d18f2370db91f06ea370ffe174222ea887e01de54e8a7f88c3b3706a04b0d0cad8cb03659c5c140b558cc739444f7950c4aa0864f48ba89732e498876a4e0f6086ddfd9c2c4f0a9fb31647a87ebdd3d5a9124b6bc3a5714539c0daf0e0f371b6608a210181f8f65547e3482295a6073746d1da4efe24b4e592ae01a1eafba81660630115aba2b77e7da7ce3f6826aad9bf1ab1add6bc981095a17b4cd26ba689fdafbd2291bca5ebfac762fed40d74071b22c94a104bdbde406bb20b12c0ef8c6861ff6cc8d9af483e2fc8e1b61d717c43bc2b808578626d0d8cc735fa769721753a624acc53fcd078baf3436795e4ada1fc9007db2a053e1b3fdfd23e6f59661ff9e0fbeb749a2a36f9e4d83d6a2533092bb98d066dcb9d99e09190bd45bf6de93fd63fc171b66952947028b6a009699540df1 + +Input: 4d101db2686fd80ed41580f0f5e183c571c80d513ebffc97b32dd1d5fd49e4b83461419fd195d4449a6e4e218199b75edd +SHA3-256: cd8d0dee49c55315d715388c4ca5a8769886d2f69d78b2ef090ebf27fb19782c +SHA3-512: 24e1dcbdd7f795e5303552c0d7a464193092e24588cb63d06f2e4876832957a4dec1016773c34d960466d7f3b0f296e47472ff4bf053815c0f1f7dab7b607477 +SHAKE-128: 765992f4176067a17088eccd552499445e642b15ea63f842ee401c393aa4e0bb68f6dfd8baa3d68aba67c8c72d046dd7b7b1df72b425632eb176601f2ba6b4e3ba7cb719f5a3599b4adb2d327cc9e00016ec8be82f0317b3fc80bf624e8ddbf429243c1fe2acb9cf72c0716f379ae41d60b21ce9ede4f306b08d4716429a2a4e54e81c87db4c99d36168b0278c76f8a140548f667473d927163d0d4cb32e6d0b792fea5f0a4d2ca82fd79bc0e1830b2b14298aca8aa866e32c0c1d3919eb45b174323cdb40be0780a9b5f0c11c075d9e4fac4007492b196734d659b424f9874af24ca1b4a4664a5dfa57e7285e4d4f409a844065502e58475c35558f4f6c04f2bd2640078debf3f314f370dc4cdb41bea716ef3413b7df68833ab1ddfc49a006dcad7ae53212cc28d10b5d06dc5e5385d3f1cfb846cd100cd877154fc8033a0692c002475e09aba2ab3448d625d38d6f9b08d29b11f3876fe468bd89605807c29d386ae7502934a7aae1761be854f32dc36c9ddc3b7315a8034166dc2395770cee76a1fcbd92759271bde87064ea222c5dede7b8f9ba134df5056d0b8e5c060fd1a16a82220092aed686a2e029b4a3432848fc2b8506cfc2a4426b6386bda478c0cd3b5c94b39ecc55498fe7643a8cec944975cd5a8ed9241a0a108b2213ce8093f60825d3079a1dd502b6177fb87b6e2905b7eeb10081fdf395372dfb9669dd +SHAKE-256: af9606e5fa452fafd7ed0dfe46af2e91637d1339f3e5c982bdf5525416a2ec30c59d815240ea3612e3de7f546103821d4d17d5ad889d7679036ef5d90c6cdc4719853ffbb528442dbdb56da08a44a8e4b5830cf2ab155f361ac3a914450fff53d33de12b496b3e7c02d557cab17a6662ef3bcba3d30c81c2388ff36a81a4c0617be5d4c558c967d21ebe056ccea48d75ab90710d9c01243059dc7446a727d0da5f8d8ba67bc1f8c773afcaa3b2dcb5b4c7c4d807f78ca569ef9402b3fac77c96f1552a9e805030e7227a3685c0b468b3491e661fcf63f700c79ee6d831c7549c7ef04f872460379de6e43da379bc802a4b2a135eb6d5103471b295dc1aed59a48a815debf9a446f2484f567f5a46fc6213b680864b457806d4eff062fc74f6dc402ea56a47aca62152d1d3d796f2a65c9131d9c4574906f8729ccd5e30520f7d7ebaf6b58c4d2bcfed15acba0e40c756e5c8a9103009a4878840ba9dba4e85a7752184c50d177671144aec6dbcf956a57045dae0dacc3242c3610565c40557760be0a23e5fa0e3bdeb76edf3e4fcd19a1993c022085b82322da73e1f124b3b046ae9e3e079fbda35cacf04c9629fd22c924e4dbf115dfca028f47db12132e1d4e5b96cc21278719e6c1f04cb519569b4cbf515f06fbaea46adc8c18a7fa9807d2cc6384f43197a7f6d4997cbcfe0fb8366aedaa902044dfeafafd4032b319a85 + +Input: 7d7be4b02ecedbaa424ac42b6bffe9a3ec7f75ad44a4df2ce0cb88a59ba84694b0ed7f6f2b4d55f5b3ed7d28d71055c6d26e +SHA3-256: dc06ae7e4df0107c80818b102c935dcaf66ac8d10359b423ab9cadb4f98bcf8f +SHA3-512: 402c2e34c174e4ed4a4d680dc4301bc88caea40c12a065f9668f08b5caaf99c376eccec32ecbe62425b28472ed08dfa67469c053fdd53b2b202fc8e584580926 +SHAKE-128: 4248b42bda953e672cd03b18f8798b688546a7a79a3e16f498c0e9b83557695e3d02416c60cc691796f8c9f36e73cb32ae3c3437b81fd793b96a25d8975b92d14694c8bed6b4e24087f7e8b9517b66fd114b17880c83141f439a750204a94145ff71cf95b1da46720e9fc1df3435ab67d4d637e965e599e2958e31e3edab92d7c41780bd13bca29dedeee88796006f0bef002b520c9e9a141cba32034dc2bf727090200d854db7216d4a40e779dba15794ea5ec2d2585459d78893eb33d6b0edbd98ac766266e83b6c476eca165085fec8559d4fb9b0bdb84c1489f020a0a2cae1352b6d6d496a982b1c1e2d4fe1daf4eb87fe649c2ff320cbc1828ef169e20447eafc3f644d62e030a230d0409071adbf445b67dff1a05d8c250cf7e5fefefabe902123c386ea72d12d4ea4e4edc5512d8b63b9299d30b5243cc339046cd859e72b109bb97e53f139f6d203a96537a50cc4cf7500d6504f03cff3b1b9dcc2999fb7001f0e657579d33a9aebf43d770cc4f4b92c63a88326c027cc9a8ae0a05b7b4a7219162d2a73f85d556f9946bb07964d8b6c9944a1defa6235c4095e919722f671e258d8748600480059926be033dae70bd42d7d09a24aa78fccaa0f05db5c57f6cde7afefb2ed2ac97224ae12fd393d2c772ad67267ac10d26f4a1c114cb2b4875eb078440a63b7ef13dcd94c70159c2fbd73ee8b382027304b3faba36c +SHAKE-256: 8f16bbcb9fb0889a7a78d992bea4fa8e2cda8482c906d3b5344d657ea903b5532aa8d24d8cff12c1254e732a58d60a0ce594a2106a003d034a95c35810f53900d3ad0a01004bc7071feddbb06bded15d849e1416cdbb1b01a4315a8bf7e147d2eb7c60a666dfc66e4c73b5c9fbb5e9b64c1ed11f8585b31a6acc0844906165a09b29610cd6fe6ea47dfdd289e160a7df96596e27a02c235098ad937a8b7006b3f54983415585eae106e435bb6f20ac257491c446d98e0bca9be85235b9b4b780ffbb5cbb3cc71b63976f1a77f1000602cb8185c9f4f9fea78521267e54fb4913c742ff43d297ac64310a33fb563fd278a6dd61b8c91e95e4a626aef5350da11d32bca67fe7134e45af13f64446f45ad15a375c295affce07b44e06db2e0b2f90c2e6045a524594ee91af7eb4ced4b745e78dd09d076ef3540c94c302cb1225ca08c515dce25bfafc4c3b3d5688d68f63ddb6bee6aa64fb79ae89aab5d0ad255272e9460747364b290823c619a944a100f69f07409f30184d06707b044ccb1db0a4da35bcdd70b274ace7cf30133f3d013a948738edcb2d88fd11425907c22088a5c43afb5ddf6c7391748ffd6a29b2c2ea5678181e7a753710b8d73d6e1083011f32ae68a0459637a0062e9c5c9e5d9d29eb6f898a2acd4845e05725b80046f8e8509f5b86dad4b7c697b4137fe7ab7b6287fb9c936971bb33774217159627f0 + +Input: dd80fa702c10fea35ff234749dec19d443b3811a0deaacb873aa677a284ffe5cfc5bae4c042080154a7cab325e9d19baec49f4 +SHA3-256: 4d72b922f8460a14e9266d58a486bbcfa4f5464adf79ce376ebc4491f5f46eec +SHA3-512: 9afb669305462243435bb6a24b279eee1be13a1485e4b48dcbabc90dfe0e542d5a09dd2c16f6fa096322aeefda0b57c22eb4616b5d913b6481bd49aa46a2e661 +SHAKE-128: a3e8b13326ba6085a64d8bc54f9d83e6cfdf922a6eb7751c9103305b40a5a63594ceda863d8833ccf0e115a1685489a337df1273878c9bb2d48dc95ae7440446de01b9096bc67394f86106eecb774f103f3485b09c7da333ee8b573d3076c96aa8cfea3179fa9c25747e085502262c7620bd5016cf4e0789152432017c961fbbefe37994efe41e02d93af54216c03bd17e6809b962542fac8766ec75a21601c5142cd69d9140045b134a1cfe592cfbf349bc6a02a2592c6fbbb4ce1dfb8647158c05f73544d477f8eae57bb99d343c5739c6bf8f7f8885cec4bd0cba6d357b4e054f65d24751c45effaa34244b7b0008302f94fe15724c2a2a4ce580504b99515d94fd270d182432224c2b397fd99235a0d8390961967aa56974b0e32ca449e41c575a085d6fdc0b81f48378b7e7f69e2b0ff0ba4568a6826af88cd2be852eaca151ffd34783fda8498eb4c97791c60cde6f9faf77d58a2bd28ca2dd2387bc04df8fed6ec8a27b4a1a2f46060424d6107b3eee03f15a8be527718425ca29dc339713fe82e1cbc21d6f086a72b62d4f920e462e2037c84bb4c7e9ca8eb809c76ebadbc66979b044c2dc69df0b95ea2118ef006b84f7ea4b331c4c604fc0c5f2fef621b5c9276cd10edcd3a090de045b1c16e31997725ff6d2bd4468ed539192c8f790860b1c4cc48bb4a4d60590cc94b18d2919262a759848c357317d3eabec46 +SHAKE-256: e789cbb6cd66edd83ecb9aa040160361df29c2df5d4cab9c06de6c52ae0b4180dc3c924bfb93902a31ac658a27ab7c0c1d09bf80d1d2f5f30cde2eb29433d330f0d535ac5530aedc82b9c1a6b669f38e8fb0df5bce1d8cb8b1ef62add4ca774249e44c070558fd8dc8bd8e7b3ac9f58d540d2cd07089092095b6a2ef2c1c4e0e6d3e31a3befebcdfbb463ab51c5e5381ba0aeb44fbc64949aeb47dcd164478260bb66f06e2f1e72764098c198bf01abea3a0e5afcd59bf5fddd70a9b4f20270f40e1b3049daa43c6ffc7eaa603442384f1ecfb770b3d20fb1d687f2a2ec571c2f9a3b24baa677a65b0d406bcbb4397a6d8f1ab728d571882180731231a51dcb12824de6d046eb5e0ff0787b21bd621e5b0a2c1c32b389d158c1c6df9af1ab5c1fb77ecc3d13c21cd3bd1c0c6b6b86debf0bf31f5e5acc220ae0b99d2a8d4640a484af7ff9c2342d5d30309299b13bdc7f94208e36209a59b5b91d063f5731101505904e6715bf56845148cc410bcef45b5812ea734e4eab7de7dda3a6e6360568141d09648f50b8930f7757214c0e0c41922fa78d861e201d787ca86dc40ab76af12c50c25ac8335c310aa92b502c51e2719dee53b31cbcbbe06fdfc04dc346404aac43c055a9f75f6bd38a73340878c16608c843a41c3aad41efc78caab02e063c1e9300c0ddc9a3f0a080cdeac740fb0c75864b63ac6c91a4030bc0e475c77 + +Input: ddfbf02e5d6d9d497f4f7a437872eee3fc734d623f9a9959b718a5d4477946dcccf63235cbbd809407ba33b51259bd361367e7c0 +SHA3-256: fc06bee42a610b25c0fad23f70014028808609127491858f8a78066e070c88e8 +SHA3-512: 9aadd08290e18576a42c9fc0b0a13100b7ec2052839f125c8db964cc4227357d888a22f3e0e7b907b33969d8cf0bc270065d185df054f40315c9bc901593ca8f +SHAKE-128: 6e99d49aa56489101a57619964597925d206798b2c78d077a05121bc2c98f5dfa01eba8bd66ea6cd2344df00706c82af5bc593f05c1b5384576f45e0cfbfeb664ef2b04bf76126ea6a8e30cf4162c084b4201bca5a234db5305f94641f31cc1fcce1aa17e528a9761dccfeea28ba75564c87f31534a8b8845e0589f4a7f125bd2c1bb9214d58999bb81198df7901b1258e29d37d70c9842ff712c0ebd0bb0cab682632c76bfab732e47910c2a02a2e236e8805c057a68863b274a2aeef856b69dc5521d5e3e15f86eae76949adb4e2f09c1782fc32582248b2b250e6d8484f3e3612e8b36745ab81e2a5204e3f6cb26a661b913ea63d5cfe3920855847082cdee3c5265627754440d2f60dff91191020f5571ba61d8149d79c3e010d63c0ec4cd974d393a7ee81a198d7bae30f8288d80718878c2e13dcbf0f40683a526bef8a9417bb72e1222493788e37a5ef3fcb7c7814cc859870c616e53468de44867d594dc692edfc53b0af0a65f2cc8eead43cc31abfabfd69209b809c806ed9964ecf8612202d9bccc87287f1bf5fc74edee5aef79d9f68e00a4273c94a4f2de03b4308eae213acd3ee599ea81a1cd82e5cb3c726666cce9897b82139ab7c42de618b5ad918f702b1f35c8295fe6076a98e8b55b126abf7aacd5f9cd1a97dcd30d9efa7edf49d9b44af123f17070734a3c25698fcd69a5974efb3a1fa2faa550e79f2 +SHAKE-256: 3b52a060fc5f4f2ef98fde3f839e24f3c08fddadf386a4f3b04a75a181e723b5aede63c72471392a109693c119a071c2017adc6474f69a8490001ca189fd1fa17a31739fcc91d187bc0f1d1a9a5f3580fc2eb32e58fb6250a82785d9ea5f98a02f6f7e208e8acaee2c9cb1dcbbc2f6c5dfac4188cacecaf9b0bd64b0f350f8a8172139cf00b637b6b36cb363c947ef71564fd0f2c010fac7165ed213f86a9610d2d21427e8f6a8da5127af1a650e072191f0880083a1ec77ddd3b4ea79e44a49715a0df3a6431236b58a58c11c171bcf37dfe24e3e89e2318605b5c16811dff435cd21164be851070110ab9a387822677fc167e04d946ef8d1fe9d95edab0114d93465570c3d11d9661d30cc7e9fb5a56d520a4ac7437f2995ed0039071b43c2b6ec1f953caa9fdb3ded271b53b35856daba9e8497022c09e95d941a37b1df45ad508c3a92cfb34806dccba60ac1dd228475d7665cdc048270fea13424badf64a3ed2d2ed18bf609e73507c04166e71eb04525195faa63fb8c9b63878eb51051c53c879c9a363375dca71d8cb61bd63b33f5b877ca2359ff077712ce8919803fb022295daa89f9e6fb37e00bd7bc8f137f18a899a3b268567a1cda83f71e6a02cef3adfec5b7f1766d6fbd9696cad24e9e57e60c4137b515391985f835a0d545c98a9600bf717d61b7fa46757ab61cd99e35f1e18bd8073cb90c5b3c96ea75dc + +Input: 37a8c4fe65fe5b6d9ac559d50f4de8f252f7361bfbd4a4097b6b8fcffcd137d743060a620064aa8d8238b46e40c173fa18373cae13 +SHA3-256: 1cc16d8a32c8da579134146bd66c44b859a3c69b2a16887b25f5b7354e357769 +SHA3-512: 7c7280d5e03689d8452b13e359880836b33696d8f68cdd23cd5a4c1c47867149e45e20717f930cc0030007d671321891892ff400ad6a2613dfbb08bf1d97d11d +SHAKE-128: 9f503979035b9449e65898ab26cb0313e98473f27d22f92f620b802f99f0440d1d38a75dfbc30a24d2e193347e804b4c19c675f6ad046ef1ea62b5a899b20d2721ad10119e0d877e138ed3cb90bdd131fdddaadd4248dc940ebfbb214709d21d1753997e862f5242d30a0c003a1dc70a2db96146114107b5d5f6e423eb0425401c2e78141cb1c52fc19e3cd7ba6ab5350adf101e67c6c12f4e453729e897eb1d8c15cd6b8b25e72f710ccf1e15c4a75386ce380fe608135335f1ccb843af902a4289eccb94f2dc169a52da16bc8f94b9f33c26cbf4f3ff1b42e6f02d78523131ac3e8f538d922790a1b505aaaaa215cb3c795a9bf72fb7182c1a94758a915277c2dfd6cc60ab95641626057c1c6a28aefb66d4453d625c58c14084a936fd537517ed96b0fd1be35c0766e03e8511642e78f6a4fe7a148e599d53411f87a95d2ed62e1f71fed9fe3d5893b07b6bdc8ff885106222ba15fae6cd7225e39874c2300778d7fe69b84c175008eb1b326fc092b3e870458de60b857d434140b7eb93f7f77f59bf8e5beb43adacf1ab7634ad3c95e87620bdbe24dd40e0966be68c0a88acd7cd4f2b0709578e77331b0d4bb0524be9611f660b0996c28195686030719ed507ecc96a888929116adefaafe9637254841c8cb237b7e83f02240d498c697dd75c0ec1f5380c1e1cf90d8f1120054e44097ec5337c39adfaf1ee6d413cbf6c +SHAKE-256: d65965965a6046f83cb81692650e20c023ae66d2b6799ddcd2331dc3b012567ef394840725b5d77eacc99303113f290971fccf0e5d82c07a9154633ff751acdd36789b832cf852795a8d8862093e5bd506af37bcd446dc80ea01d1c4d5cac69cead6c33677bf3e73b3239d936c002401abdcfd67dadbc05a9c6e28498401c71e871d84d73db0fe3c440467f7a287ffc014e26c9ca5d21120aed8c9c91bc3607eb92e2ef3dba9080e399d6bb010fa94b362f06281a5f1d5cfe49c459fa206634d1ab78137902224c706b9474ddc23dd447fc484bb2676cffb8e0a98bbc099f6c1eeb5e7671d3f759d49e3294271b4d0e04148bdb9b632b1680334d7394ece590e6f477b6edfd5f5d5796326590886b30851a72df4c65cbdd3f93ef0fd7406acd7ebd1041400614bd333e4a35b17159382cda4d0686f870877af24bbbdd6902e62ccb29aa6151caa61513ac73f91367e54fc0bbcacb728a971a413e88052726c1d603ef5c1042ed23f4278168e5168767c477ab5dd64475d5fbcbecdee68975f14681f9223b1ff4e7c1ec672fd248040cd91f58e771501cebc0c8cb6304ff44de6eac8d4ef90766badebfcd1003ad648908abd72b90c8fa353c4c9a25a26cc07aa2641120300fefe627cbe7635d25480e69c29a2c1f21cad00d5136edf2f583fece31bc57a76c9ba7d557c7b0034394268eec21be8645a951e7abb473c6ca918d0 + +Input: 8496ec3de3bcd449cbb35f6ab61f12b56bbeee2739612a3a28a435727c42b868a9a3f3a189531708b35e5a3d2b9f95e19a9740f2182a +SHA3-256: b12813656c16efd43912400a4d32c800b26f169e114a5b489399001a5f067ce1 +SHA3-512: 2784b5adfba9d516b6402419e37cf2fa00c5d8e9fef384ceb24de176e5de0d9074f66d64b09b8b48361eb5d562a15a48a8ef867224bde8e1b5999471e4b0607b +SHAKE-128: 143337563999b2ce15481f2b29a8c29632c02b8969d5538e21aad8c58374a26659d4928fd4df530e030843afef90309b32a6ae267091ebcbf3e327aeefb9152b8c487443fa043d2621e4e4f1158367841b103bc6c67f3f5bcf2f03aec2df76b280ad8ec75ee3b3516ed24f432782b9e9000cf18466d5f3e4ec37bef78df34304d3357cf8c8209197bce46838a5db98b2300f1be2b923ea860f6d153db2068d1ea72109a55f5194ea52a9cdcadeda1eb5f58e0a94a54c78d967652bf3923708198251f7c59a4ba8e199a0ec3f9052086c6da0392a73dbf47f89b7d10b771664207ca13e6e52ee0e9a61de4e8c591388ba8edea5df5b75593bbdc7a79cb81e7b556468b8636b10527fe8eddc9a9fbee6e44a429a9767364992dd4a490e5a53dabb9285cec85fa8fd182da6423693d46882f605a1c2928384c4a2e8558eeb4cc31e028892631359c4faffe2807d1d1cc13060abb125cc49922832df65af2cb10c04c6f3d555479a9fc70f283b9e2a86948e94be7cd1a39420dcaa4c786b4a84a556932b0782a0254bd78a91340c573759401605c29244738d256979ec275aaa17a14e12d83d6da94914e1b1ef69c0185b336dfbdea28d3d1e4c6922db8ba538cbd77e70dd200e90475623910dbefc0651398c8a75141d6a179abe2039361177bc24cc42040f423343f0cfb1092554ccf6fe7e37daa9c672d51d7f4514a4485c4861 +SHAKE-256: 482717d0513f165df6e953017b5cfffea3d9c5bacfe65ea789686c24535c29f636c44986557c468b4dd3050d790bd553244c8c2a88622c4534c50f42db1dc42414adedeaa10e1f49d2716aaf3d24f9c71f6a480599550524baec78cf1ba1361a4bb13053d547641c89001cc01ede407c31d7bbdc6cd3204fb790239be50af60f19544617b0e87cd5cb0fb5b4a6d945353111513ffab6081e8b56ee87bbfdbdaa14e1355d0b431065d082f78efd1872fe796e3c4119eb975b49a3a08000e1a431474a7e3774150a02672f6c27373ad26cacf140b7141d4ebe208761a52779f262a12cdfadb2e2d7915fe551f8b65f4edb4a9ad590784e18f2846494ed6048a51046642fd8bf86578650e77ede74f23e670f1bdc2471fa94f43c514d6e74c9fdd963047688f707164e34d0096097a259e97e23133edd9f95f2c1c094b2df81db17a0b19da7096ab41d25728b54d09b29a833e9ccc3917e9bb208f455cb9e9ce4a5d715a1931b01a51d73058dc4aa61dc425379150e20e953aefd96514ceda97de45cd52fccf8e240f1767e24f2fa5f20ef4a930a1330d631b24b3e2de9041fffeee35011646036fda133eb863f7521018221334307df13e3b708697a8753b48fefac13ab9a56db074f5143a6b8b8491f4c7c62ceec24aabcc188aca253e2c2b59fbe85d645e135cd8b64a1fbf58e08a69e2a20489dedd92a48b75e939cee7625c9 + +Input: c4c7cc0682eeff5b6624743392f783bc7958541acbba5ce8c5ed561122d59db99d8c15175d13d586de46aa0c817eff67a3f0998e7f9fc8 +SHA3-256: 554013212e6c414a08eec3c569a4493cfbb60b7f88c09c85863448023ece4434 +SHA3-512: 7decf4e85b911f1dc3f2df78c60022c97f08f7f3084d0945ad193a4960bf1286eaa12d5d318e57135eda4962d4d0bcce26eb52a6b8fb7a3854403a427c01ec20 +SHAKE-128: b034812e5c5065643db679bbec20df24b7b2efb0ff687a117371e1a1daad9ffeac38e777260f21f3985d227b987ca5b32840083cdfb29bf7ec7207d990f7f535f992aa435aa9b63a4d3851f20e96d828fc25bcba2cd3aadfcc8521f525d08f156da7f602774e3cc3b58be8662315eeeb797ee257f4e45dc094c730e31fabda20699eb31a3c3f829a743f1fdf46b5a94856a032aa76038c65250c4c2cf10953586bc814f4a6c54b9e874719178e5b39e281ecbc57ac0248ddeaf4080c3b7b55b4acd8dc7213482dce63abac44e5b1eed89204ece529a1da443bc446619fa0667ec0053401ea3c2dcc6e4257aed7beefca197cbd5497f1141c90d339c6b362a8c974bc4ca64971bdc80e60f47a47323b061f8a2bbd1ab235eba9c7fff71c5c17b5a9d115e2c4cc8c082cd99ae8c3190c01f76f3e0fe9b18447b659da597e407cf07de2d490ffb74bbbe8364e79540204eab06f121b43c1e6dc843e21e2304f8bbd32039f3188cdc67d8683700cb76e815034eae76eccc8e6917c03ad51cd78ca4a42d27434740df67f5a22fcd4b954178a97b9fd25a20c5d4527f2a2818459cfd439bb7f72290542e10b642dc5986bd8720817a0c5c7d5f09396d0dcb3474ae15517696d94861a515a835ea98f317ae16e0c4151ef33d6062ff466b3c606968a59b6a91010d607192fe4f3e7b6a3975e75c6b03531eb2f03a733dfb1e38fcc32a8 +SHAKE-256: 448155483ba01e6ba182b787449d34261332f0869f36c278732a99b871af3842d43b4be659ed76b8e742bbdb2712f855c9c94e938225fcdd4bdcaece06c8bd158aca12d615b81ea5748437f793822df77a58d923701cb2fc2b468abf2ee2db5c1b173914a2c1c9936cc32e25758482b28f346ae5b3b58bb481e2d3f62ca307c56cc2d6e639d581b08b3c9cd868a18b80f38a8ab53a3cd198ec3537299af782ee9843ade5f3c5c7f2f0edea59f10ed7f82f0f3dbaf35bdcc15c44ea869078cee550b3ac130f72f3dd76b19ea2669e2bb89124fd39a858a45f4f4a3f672e93f82f7b9d2bc21a4c95a5fbe52eb8fd1dbe08e624b980634ba5a61aea77978afb0cea1e227f4bc67747cb77267d19ed564627d1aa2ad3c52b1f0b10b898c5664378c9a6a0d7b37a178b6f6d770db282a37edc5dd5d15756ef153adbbeee8490b954fcae62d364db0a2e7bf6cfb0ee20937b291b0b9393426e7722f40546970cbbc943c7bdb40765146344cc336f1b65e942b0a2439973bd2ac669405e677164a658f30cdaace2a7063e07788a4c5c5eee1735a529a6bb33d51469f626aa42db9741a11d39e32032f95f4ef89991c5cd9f962e6a8e9299dd483e5f1fc1e938a533df48e30b76d728bdc1eb2a100f412340e1d37a920da112ca13755e4501c893e7d79ac0eb982e737cbf387c52ed369986e16e7a758694a856465ca808ae0bcfcdff90 + +Input: 57ad6f51c14c180d9e916dff86171fd0609dd429a01dc5a765cf9e1038cbb3da2d9e70493f9d18cb78b93e6b5be14e8fec41f28f7a6000eb +SHA3-256: c848025f88c9ce19492d2de2bb606adeb1433d10f461fde47e08f3552b088191 +SHA3-512: dd1610d08075bc007c6e19844d37637d039286c8d531c65a947256923683a5704ad9838536abf77eecc0f4c8e320067e1413622800849f6e85635f4099815e91 +SHAKE-128: 12f962f39bb6b0017c17aac6f35e6e196ee89b431090c6f17624f9cc06f8dae72bf44dcc602e4f3e3522b93430048a702cd4349d6ccb366c894d48efae290b56e8e61f89cc2763ad4380e8f21415284317501bc4d3374e2e29b6d28228c459ca44e1f48b1559563737cc2ff387d33b5422445d06fc247820ad74e8433ee63f4a8ef588c7b53afd49f90b2c919ab7a7f2a0a4f4906b1128bc5175cc95dbaf4554660c923b88974cdba054461cda616b4a97700814fbd11988aadabddbb9b2548f540dc9093418be5347e40237fdc8f911f65cd1e50580187d3de6cb075320e426c35fd3ef5ecb026c0ae2e06f517ae626306999a58bb37933036d5d5619084c4a7d133f2d113a3a430558774d14d30a8fb27ef5ca2672251a8bfc79ce110a8a244b42780ecf55a027f1c84b357d3f3bc2b7a49a88002a57a779c9dc2e82e8701b12b93f2428df830e0bbb9c62bba1fe7e9a891ae501f32ddb862924408f24d98444afc677b695915f6aa2da1833d0540440eaafdfc9f1ae5618818dd3b3e41a6872ca041b5b35f0588092e5e3c7702db0f483a4ba39e2717e31659c2e4e81651a0b5dd405bcb369af07f4f9acc5c5e17ddc71f06b5ed0a917015d994488ffd3083a793d23e2179e4744051a2495d37338f002af1c0ab685c7b277c4c4f73bd4c7925e845bc8668f32c4f342b7f7e2c681a2a7c63e41b8bd4d2df17310b077997c +SHAKE-256: 4604f292fa45e5cec93a22148709f74d05837afdb1cd91aebb26286076c8dc3a571115af05841e89909df784784403fdc37e1fc9b368fae327b629799c00b8455ac1f44a4e487b6e16e4a0829ff3d0095f99e5dc0056e56e6bbca6167580acbdf028318b229ac397bd05c57252ca2784e0007154b48999a4abb762be6df51a8cd33df9841d9eb88b1444d1bf11511682aca2d437f1b4491f7fb2cb43b7155f8701d5949fa82d56b56409622c57c816f7b8044bfe4ae6d540733884ac754c907dd2d91a6807a47085f66c54a5e91eed5afd77f62ec75fb00ed0b58ece86bba3a3bd242bd439f4799f00dfaddb8a771fea8afa453bb2aa18f2bd0aef1b3536fd694d35475ca023835408264aea1c60ca22c85a4a7b6682b6d175c306e293c38e9e0634216a26c2dcef8ef3051b7a1daa2388d3ea89d6faf047146b4f0f8916f7b911e6e994dac407ffa2ead672d1d16413afbcb26475480cfc0096fc7faeed8c726e8c5e0fa10486d8081de252aa4ea63fd1edf6dda1c6934d5a08a35ca38a51484962063e1e07087172a4ea02bfea4db6b6b713f1b9e8c20b7c741dcecaa50a5dbb056e21e95b4d8f28de8ee5543ea64fea01d2bbb4ee3423727b781a822a974db30f4b7bfb1b085356879d561c108c2a6b5366888e1df26352f329f5ba8f249736374e622ca399614855055545f363f5066827d320549e5a8034dfb0b61d58e7 + +Input: 7029b593a62275941ee22b46814b594b0e962bd4aef0b79dada2cf0c28983efb8a8528e018ae640b06a2c770c72ab6135923f79588d4bf1705 +SHA3-256: b02569d72f0e08e855ceaaac5eb10aa6d1ef8182f9b538059cf8e867b567a34a +SHA3-512: 3bdbadafbeefb5c4e4e06bef4aec9167cdebdabe00ea1b0a8070832c6d930702a2b7f4a092fe147c75abc0af45d67ce45704d9072716607b1515ca637788601c +SHAKE-128: 35ac8e427cabcb13e233c043ae77ceeb1e3b4d33adf0b16289d3a17c0b296e372d49392ec5334f76c874b432994c05967d01aacf411197274a11eb3727f2845890da5da9c1900ce4ac1ba38933342a8166d057c6dbae3c5271e6c86e7c00edce8781e72c54b16bc1153b76b8a713fd338dc60462a10145fe56affb0323394e3cb56c89cfd4fef48d9e520b5c4acda030d869ca96ef0b09c3e56ebae914162eb946bf9e9b6e6b0e944ddeb44438f961a3d8bba96a4ab31f65622b7e618f6ee2c85277a2f4836fda531996391e6927370332d3d5a2767aed6741079af67037a43fe57afa304beab47ada56d1deba86ba3ac3c079725702f7815cdc3bc1d84675a66380e692efb0885e3fcb094bfe2760b3c9691335b6a6257cbc2f9cf9e101a2a8db5490c576ab783eb69ac026d13cdf0820955b24fe16fe2ee72450cfb53b90909c7d4e80c1f36426725b7771f046d96a8ed24a296d80311da54ee3cd03d4753e16115029fed2b0914f00900186a8a8a81a17b994768b3a1ede8102927be9be616524bed52543047e652e40804477c87019c2bbf8efe5a745a9ba6975fee0d0eb0a2c26d73b2486666b08ec53668ee55ba5d76d78049d2abdee82bea7801a66f68288436a06fdcabfa4de7ad081755fd70cbc2cc95df390644b28705fadf1d150d319b7dfdcf52b0dfa1ee3bc7a3cae71374fbd420f40d63cebc348383d5f151f +SHAKE-256: 7ca002966f635a4f09b4bdc0eb28427bc83a447d6fe2eaf1ff1438eea5cb70111ce178518676236c571ee86a592b9fddc58a3edab27f3624461a7a027fdde0b113619e72b7b27d0d051fce7e9733554ae4111ded41c2d70fb63179944e11e68bb3a4f4323ff211221e4ba2e3ffd9142ab06fd9ddfbc62e026db42fc4ca91d8c6cfb67dfa732232f28509e436b772b4ca17085fca2f5c35e2a8511a1de7bb866601f4c6f33969d02a9b5c80d9c4c76babcd8f21a1bc0ebe4fb31a0212e9961837d95a28d347352a9921a95eafc70da85b7c11ee3a2fd84aa8bee8fe9449c53763ecf5a3df102a21d5ecaf2d1bba8e24435dcb865980df02ee64c61fc5140ff5cd5fd8917020b4da9e0e7bb0aa33051256170b3977f14f7bf6465a697c24edfba6e575360fccb3ec6d299202ef91775be9e61cbf6bad169588c8217f12dd9e376b2a22b593b49fc1a2c0a1ecbe1e659caa1b88a112390ff91e93bf65eb162b2ebed42380d4918c74890763bcf641489fd93fc187adeeb57796c5d44c26b7fdf0036abb3101548b25a70b9846e07ea329d4aa92270daf64e8f8f4741e755ff6a6a6dab85f706d31a5f9190bc94e642e817783b11e0909aef448fd657ea4c986861411d4b6d8bccd9bb260863df2c5ce957ae986bd8e8ab408ece604f6fe6f62c99e0da41e1320f3681305fd27817f28e1bd6519c958c66d7616ea00b61a8386e64c + +Input: e2d5ce5fd35438de1c68bc51ce953e8445b49a53267455d3c99c203bef392c33025cd4be8b8f1b9da41d7722de7357605fa4da21606fe7bbaafb +SHA3-256: 7844b094e2a71bd14b2109abf3aab9a0879a3c80c9ec4f76dae2e17f372a7526 +SHA3-512: 645e43e6172987725df7321c84b2824a2aaad8b334e2625ae2f4ecf1b66932f87bb860ffe20fb529559c8cacc465077458148a26ee262c8d6591942030f1f6f5 +SHAKE-128: 8473eddf56115b8f82f20c3ea7e4b100bd8cf905d290409bec85eb10535fdb806d23ec048cb86c64b2155ea08e5662cf201629123efb37b0535767e0c180cec8fe2bcf7f2a1dac950d4e2059f087033b46a0a936ceed627d2c6be815baff915909b427080ddbf88412c4ef9aaeb3b04498aad8a9afa5e54708bb831272536f4868080ebc6510089c3930673c23e90c0db88b3403d93263c18a50367969aef0fec3a6324883fdb9cfb27d688f8b268872033e19362a03658e71cea58fc69e800789c1143be37527db9ced9e845bf41834b6accfe91fcee96533558533e4e24d273a53df559f3c0d4bec65af4dd6f77568bafba48009ecc01b5b1da2e18cd55ee49b3cd3263c0afab658aad6962f325f0066437a85e59fe9fa4e860dcd2a0db5d278dda9b8e3b4f0fcffb2f010b7e09905382fd27722f85feea19ea080fcfe2cd48f6fb9923d90fb742eae8befeacbd87e9664b1d73c41f4eb59f2519843e64a6524a778bbf36caf54e266f4b5a5330b06f20878933d94a51b9c0d5e04f44a26c536efc6cb392c57d42569c8d31e20ebdf110f5f6d874a2b6347bba9ae2b700a17cfaca1900a23566946f177b20a4138aac6f19f36bc1c04ef92793a0505ada030f28de0c89c0e824d34ae19f9db53401da4db5d75aa3f1ca5d8e3a63ecd577209c5504ed6a43bf46075c714f9102bbcb9592a1d695bbbcd47652265fc39b47f45 +SHAKE-256: 831386c569efdb703fda3ddde2e549320e832a1eacf0bb44f48bbfea660785ae25cf2825e4b4a43d15279ca9e3eb6e57355cae2ba6671dd80020e8008373657b6340f47de756433d28ce6ade50ec03ef4acbf10bf1554efbb09ac450aa3c423e51a5646fc0dfc86696646b1f346acadc84e7dabd7c6dea1bfde54729b550fe1dcc318c11b25095f1e67131a4a2933f94d7c84262fc865eac097959a1aa089ce02c4f76a3dc00430f6e19a3d7937908ce27f1e17ab693f4c3556a6ea743a3db0dcf6c72fd5315ba7826c878a3fdb187e916a9110dfc8294e55cbc3f4735ec55f41de01b7828c47bcd162031b8933253d765e88f52544153406f3ec8ae51faa3880586e136fedbae170af6ff32226392dabf256a109de067a28e65bdf420fd99306f730aeb5bdb4fa5eeb8de8cc9c912802ab82cef2154958bc9d3392ecfc3a9b120bdfc37bed1997f29ff87b957baed1c3223cde1f379312aaf158a99813befca826c5ab96663382a07a0a2a06d8ec1aa99172a52e3ea556e0403328d700399211f04b53a5c3ffaa060cc864512f194f3aeb03a5b2a7fffaa080112532148a2524a9ccbd470fdc1c5c3409152e2dfaba60a7a36a38beaa8031001c1ce3030baa865328165cef7846b562d90c4e49328e54d987dbf89ffc7d756f459592fe843c76e9d508dd88dc1362a2b8b392ded9a0e51d06cd2854e78f5b76dac95ae2bf615 + +Input: 3cf94966b97498f5d67314756913bedaf4ef574dffeadd2823b78cafb2c1b4239d88c7a7cf188f3754bb44f800074930670e03c643a96e0610aeee +SHA3-256: 7b5dd6a11f0975fea2b57a64690fbfe2f3740f7832cc0bed6e7d3071959c79f1 +SHA3-512: f9024e88ac10327c320c03eeadb4c1c48ddfc37187add808389f46198da2760898b5f542d639235a2ff7da1c6dcf069f28ec7750b829f70a1420c3ffb745ff09 +SHAKE-128: 739c61330e3159e22ee0eed4808d5cfc8bf6004f88929712ac56b7ff33c678ceac5c6467535b746f31cf79a6c2db34a21b78c370f3eef7b610e909ea32b6a5759b43c43c8ce6de6b1a7f09e888fe2146f15dac008962b464c82abc1ff43436ad6ef5fffda19c31022983b5855fdf135d25d100deee8bf01ff2a0f537ef7c623d7a5001865f21162c964f868b43a354fec820d67dd31385621601b8db127bab248773fdf88e6ff2ceb62495f9a5f83109e4b57b7ad5e899c05d4a2614d4a6ae99d07271c86e28bd13b894e1ba97609d757923573fc34743d271c29dc274c56e91d5ffa69f9914bc6c575dba9deeb2285c9487982b13964ab28ceb39c9791b842d584ed9a3ac2807fae0e9624a77dc6872f20f2cbc933eae630d5fd0c33cca662bc086667a53bd04db2a26e9e1d90b7e4b92a31f8ff25546e824436e802b44913cb9b0bf6521acebfb0218fd20c25db5571f18eb9747f01b0f0db48ffd10155a170ae94652c94baa1df16d9b8b8b33da02a7f953b057380db5d8e2c67c897ae28275f888f0fdfec2bf48f6f092749b4d89233fe98fd351214d545c5a463fd504dd3e2f921e809fa2c8d623a8109279ee43f66e064b120be924b6c1939a6aee17fe42b921a78f251ccd72c51520771087c548f8b976720625b0a03f6ccc82ab173f5c1ea511fd4d4f657ab33929a0e6ae5afbb9a4d4058ba21334c53c538c45595f +SHAKE-256: f8b0b1da88d27ccf28f6f55b896f952a8c2dbcc5729a6810834e9f8c026252d61ceb32e425d512e4ee02beec1a294a9da429fd4611606bf0d5c1586079ce01b3851de6bd9d60fe057d158e7d9086bbd78a0fa38e99ce4def07811b3230642540cf0fb3b682b0542f5e1527d1395ad95a6568f2d358642b4a450ced51ab5ab17ea5b0eb3f4b163d5219543fb5ca2626f6d3a37e37e6352d957675ae63ac8a3aee9df37d8186ffce03441d917f17c8afe177fc59313a6202d13b1893a38fc02941252e137bdfc3834179cbcad4decfe4d6860cf1da2397c802fcfb214222794cc0fece3940ff6546e57f25ef2868679388c6d41012ae52740f52cc396fdba69c14214956f8b9cbf81281a89526591c682aeeae9a0c20b167c8ed4d0e4522ba90984e3acd7b9740e6b59de6cdf6dbc6383db7d7b6d86c016a12fb7554f495c34286611bb37a38d184f768e28d6541cef8e1d461b9348e3439faf05e44026a77d4147b38d104eb4b43c1a72818ab5f7e7a10c7486c23d146011bb1bcd4e41d22176b749561a9442fa8879c8e7014311476e5d61dec0f47c8f6c522a797cdfc02741e95c1fc1e889c14e0243b7f8c18de1dc3f0e88eedaa37b622846b09a0102d2eaeba6549260edaea597c9a4c1a758907ea57f814d3307966a877c425f45ea4f1ecee5ef0586e3120c263201bd7d6cf250cebc952cb38d3ac0bc5e916f595adf618 + +Input: 75ba921ae852d20adf19761b09b697209a422385fabaab50abd126e27af0529dcbbfc30fe3ad38a6cd01d099530668be4871c8679dcdf7d81cebb558 +SHA3-256: ed06fd039a86da95658d42ccd0a3abe2df6bd4e8887d67fb397c9f098e9724c1 +SHA3-512: b0898f35429a876260a1d5191cc020ea055931f02380c8cf02bff17e3d6d8be8a030239a25903b8e29b158de5c9a6aaf2f50e821aeb6895193a55e95fd4063c1 +SHAKE-128: b426454e70af7d8ef52625e72b7f04112e92024d4e15334bdb81ffd4609179a1b8e4e2b3c9e1f22bb0140c39a1fd15dd8e9947d7c19dfc9b305855c492a9495c872b8b5acd45c0603e71177f83fd59432c8440a38a67d0b608519a5ca0ce0bce0c3bdeafad2a330230177ec648688ae1f675d8ac6453b2a48c34cf6566d7e9ff63a48444921f72c08c76eabecebcb14330907d6aa9055c2dd3295a881ca1081c93653d575eeae31ec0c2b673089c99838300f326f047f9c05b505993b3027b66fb70928cb9bee122f4e26f181162539d1612baa72f8574397d00bc313eb023222ea5b570e5d91b947dbd6da54be56283a465737102c318c1ca7d5cafe7a9577467aeeac64feeab29e2b37a2063f724cf4be58f40107513a51cfbd9a642d3f6372bdf1d36b071468efcaa7487d5cbb55790c59bc6b119bbd2f805cbd89b19c6544406269c25a432f6fb50d976e3f993daccf2a3914bbefa7245413db118bda05cee309dc3dfa65d3594777d4a29d942b36fcb9af4b514bb324680c4af1d8cc75cdfce4093500fbcf5ff6df47fa53344063ae400c7dc17dcd43f9c86e47fdd298c41a7ffc4182c71b0cfcdb93f9858c947744d05bb21ad043d2d962a17c07bf1dbc5825e29135213775fce7e167680e1736e190bd977b22f33353447dd07e990a68de9a4a3d30acfcc00fd8eb7840ea101790e1e37e6e6debcc4b03103f827c433 +SHAKE-256: f08395712f6d359d4f0cf258d9460d67975a7bef7d89849a5b1a0994183c5925b326b66ade872b048c65f032b1c7bf925febba208d72a7ff64841e9ce2f251d2b2496b98a3e0b0156bc5c1b58e5938e6e88556dfd66d2fc52d1d91bf504cebe2ef35d1e2db31914c7fba35930b31627acd5aaa6858fecc1c08e7ef64acd9c03f211e79a22cccf878a65228d7173d71455856c74a306c1272bceb2049dc9866ea53674dee5496a4f1c616f518f16759252847cc0bc6489d282c8e9aede4ec2fc2fe7811bb0fabbb1c3a07e768e1688821f90dade72ca265ff5f33cb70932b1a6c039b1ade189ac5c03f186f05df68fc17ff1756542e1fba35981d33b34bedcca911c506ce63b65ace07ee08a9b8b824345e2679a6259e6ca38b24377e2b1c6db0c256bb477bfd4ef962bece5577b35874eeef673dffb76da01322ab7fff29c1ca185b0bee14ddd4bdd1bc820a7c41e9b99703839063f58e58cc99b3c9d5faec4d17b4ce254e1e564ef0bb8d3d069156b67d1c939f5dbd387a21c4a35d6a6916ef5d4379c5f759c6c64f13b48f0e6b96510b19655901747e0e195393c4614b48092c57bd632a9ff4a27cc73cf6ce6448aed648d0a3937d6708177885211b51dc5a5f7afe87ae158b590bff8b39fd7fd39bbb5d4a21c77f71aa96be89bde8943e16c6e267a57732f23f18e9f43862614846e689b5e0ae7147041e64e167001799c4 + +Input: 754e30eb272a52fea2a4ff6164f94ca5b9dfb140d6be78594d14b5987e2ba45f2e237f259640e704d8badb21ebd48ffa2bd8edf2ed379fa2ddc976ba4b +SHA3-256: 8df64280bcdae9dc7f8e4bf429fb2b8add250b5bef3b86d02c20956ee986c9b2 +SHA3-512: 375d42a4623670aa92060f9b43f943beaeb3a469862a36fffe6be4b7ceda860d1b9803f8801fc1f82c25d0cdfbb6f0a5d730cbf296100f97a6da1d5807e738d6 +SHAKE-128: 895c62236f41c932bc5045448459237e1479ffacef72b877028b8f2fed9199cfe066fe198073b96a59a8452d037f34d2ac49193b40aade352e5e5c0478b62e96d5b95492d8af8c73707dfe9e937a1d2f27d056820aa17e40bab1c84d3da3d9ae71a1f1a6ec6129d8af0d052b040694afec52fbdde7c06d6fcbf844a2cffec4b47072c99ad5f8e785c2b34f9fd675798e4615f1a5ef28deb1c19a15e382082791cff76d8d3a79c4f2bee9d374a887cca79881e1073be62426f94ca077c94b6a177425454ee5ba6605bef5d84bd4ed3ba5b90b35f21e65e9dc9ae16402636104a9d412b53ce7c9ccf4a35ebc55e9da5948c070810050f6530c2ed56735241c8c411df32ba7597e09116a8a10a5aa54f9f07b05dc3943b73465edba9888c19327ea3a1cc228f2c2b0aeb091b03223b7e344360648260c69b9791eb9e239e97a862e51298a21ef1f4fd46bb6cebc9911c85f6efa0bf70d960435e68c880cd0836b15ef28280375562d5b63f190d795af486c42483a3ef2d74d36fea63c493de5cfaa6461a0fa262fa8441bf0fce992dae71af98f3e1a1bbc3152ce8e6cc57ea75ab29dc9fa1b9d2dbf58bfc1df4fb480e015ac608c939807581b3891310d610e03b86897a222c10f740f6f688030432e612fbe402da806256d5f479a99da8ea8e5e342526583b6ac4721ff5ab7c95717abd4c86cce5cc6585224fb66ba51607b36af +SHAKE-256: aed22bf278da38a8f6bf5499fc6ac9f40f2b4325cffcf2ca07549daaef5a6da0812f19f9435e774563115e3c847c6bfd9777f30e7ef2ab0751b251243a441ba13c2770d5fad6f00985232eafb5533b9d62a9f0f44ee507b88b76d8df3021785444d2a83720c4f41566731e12e1955dfc9e939644c7ea99b54297920f26e9d1f411c82ac60c970f72eac9b6f2f0171f0be322b4f35ee7ebb4e638a42f4bf7eba4866e47198c04fc5f6ff4689f81d848328996f7c01b1dcd3fbba95df6e84e68ae6d80265a19808d81616bacb9194fc821b001755175a7af88e841ad9302b20b0a897cdbed7ce3847099e0120069ad4959444325d3ca53594b25e97c813337f2cfd45194429891d5a7508fdd778512cbf0f7b9ad0d2e556c0dbd3c37eab622b263fa379a0d513e45890d705288c62add66050a1a655dcd2f80ecdbaff2e6a60f0f6cfeb0bcd9d6a2363dc64e2f3c27a39bd707ebdfa53960f4c6218aebbbb12293aa0bc9dc30ba3f11062fadbcd74650b15ff1ff7ef3cf7ceb708e41aa10a3176c44ed4e0480ced77cf6063c3e3bff4e547d207299accd29f3df586e4639155ef22cad7a191e43540834ff5b0f623d0f6653ba0b0b0738e8bd32d57ff33ffe45abc185e75062608a2a93e993b460e08fd690ce0b24e1030288f195558fceb0bef1460a22d620e43992ff9fedacf72a747e68d15af5b99a493a9169ae725ac79430 + +Input: 12f65da49d593018d4bd5d90b83e46b7190daa5d68a944a6390beee24046313c3e3f6a24064d6d45ffaa2b6b5872a04284495c1e893c59cb5a97d4ac766a +SHA3-256: 1b3c8db0dc76f9f3e0cafe87b55a722155874cf273b9dc15f738d9428c59e8ee +SHA3-512: 6f0fc4b3a2830eaa649638abf7dbecf279d263e630cfb9dcf0e7b7ba5bb5549a97ad96bd46771bd2912337981fe15402807adb275741a5104717dd792e884f10 +SHAKE-128: 73ee2d1711960feae29df60d8b5de3bad8cec6ecf6be8d8a287b1ff492113bcfb2804e74abe369cd1a19ffedf0aff6dfef876ad4a05842362cbd0687203f98223934d3d696983e92ef30175de7ff2ca3074961d44c600f6f70ccc5dfe3317b0f6a46da58b96ec7f5b62d93d3d4033019aec924f24ab6bd3cb805c8bd50b2303b51b5863820928257aa2de67ed9699eec25f07300761354f7b6f82452a95e96c131e2cd4287617ae643bc9c9bf4bd48039ca679a3df27b33ac29fd9b086663fec62ac56df288d568ab73bcb3ef88791a2ce5db96809e632e3b990123bb8333148cd9ca7519281f23bf678989c77aa9ac55ef86d0845abdb3561380b31e8a5886441d51cc785ecafb77819db8d7cf96a9a55dd5fa851ee49f6b923fb9114734fcc6521d9f650c0a45f77899695767c2bdb036d420fa6822d4041fec998d8efc7585ab5123751817d68634a8a7b8917ddcec767f54ea649fd25722464755dcd85730eba4e03a81e034c42748e17d7ce867079ff5b583853aa8f47637f4e1f3b85d712636daeb1186284ac7f6e814d95c106af81e70f06cd0716121c888717db91887dabe80030f07b3e6bdb76fc210178f36761749333263a97789fa243f2d8a70df833b06ed946b982e68cfbe6e5b20f94445f1b158f44dac070c47ece9741dcd67fab98d5c9801add03436e328bb192c7724b6e613a9fdcb50a80ef961f7b5e5c +SHAKE-256: ca0ebde1e3a4e829e4d09e54338c7dc59d4e89029fa8d3a916f1596a0da21d75da21d94110658b11ada83a230228357d640d604bb1f7f3bc551b48c7c9aee580dadb96c0ebcbf663469fda0a6a261932a9866938b96de58b9fd9204a9cf69b67a34865319f3b98307c5cccead1f63c202a53982986be719b550be22de9d0e323017422313678c09c32e954d8307c4ecb6be7d93f80aebc9ba9fbd635c78338d3b5b5274a5f2d70cc5496ba22a07033f357493ced80883f0d5aedbc52aa38e9389b92fc49f9edbcbe11512a714dae356b8ada8f0641eddf8313e66b4acf1d6a891f5013f00b3013feacfe933bd97ceb7ec87a2f76e09c3e357d2774298876790169b58565942e4b8c900dd50f4cde0d1f910fd2c1fbfb014538b9eb5ab3e7862ffa1c80cc5d16226ea3f96fc3a672646e9a2c06e7328125970062345b356679bc157a7c0fe15b3ba04ed70fec6167addae4adfd88ad148d18fc7d87e890acb512d4dffa245f3e3b2ee723f6bc7fe2787b4cec72f4e39e917dd39ba330d09eccbeb2c5e703ae0577950aa7dce4a4bcfdfee6d1a2fbb11a402dfae58e8a60d8fe2ef65f5ee64bcb422a69d739627c2c5cf92600af2452986c752de9045816943ecd27acf033e7e576c8f2c766f9154d8b04de42a0d0bc0f807b45ce3bad3fcdd7295961d70a460621dbc90bce7685ea426939e400936e355ea9af925b3d2e78a165 + +Input: 3c53a0b11e41857cbd821b844f606f25854f6aed8717039ecc91939374783679a108f6258348927a2cd66901123c7feb55e165179565dc4ff38d0b560e0cc4 +SHA3-256: 11eafea069d8aa20a4a0e087fd4f62540ff02ed803f090e49e8611d0a322bf95 +SHA3-512: decf3d3e66beae6ab2de0647c73de1ee0c1ca8d9f7bba2fe140d22a32fad2a9fd5dad3ac02cabb2a39b33ade661e449449f9407d7eddcde772a81a15efcf9dbb +SHAKE-128: fd35d1783e53a508f235f076b827a519af479152d725581a904c7b740f4fb5f1c84b2e3eb3097b0382dcdc5c835777f3b0e9f2bd9061dab2bfad12bb8c8369c775af5940502b6bc2600bf987d8314f3e7edb73514073309c4559c3376ac913e2f30ff70f875bf26ad9777f032d9b66f26cf1361e29d815d97f7c38ca038bb807a9df5069563c6f1c2152fe135c96f424255599507692bc7e74748c0afc9c198d836870c50657db969baed3a0f8b2617c30696bac1cb10551fcb036e3e9562e622e675cbfe5edbe1fa2e537282f2ebebef7e93d2d15ee2d4093ca1b93e5f521347ce647f52eba77e578fdb0ed32dda58f300ea425d168a1b3b220a44f6ed30d9d0b959531c8dd4d7a507f67756ec9a2ef3667bf04bb4a8f298445c09d5a9009e1ea7e525d90a73109715209e4fa95fb1604ce1baa5f7030ffd5fe8ac9ad6751900d73cb718f471866b1fb9a49509c6de83e2aa797f42c52e27ccab8c9390de3de4a7d2b0bc07926e67a4daf364441f809536da9d8b04895ec60deba438a32b33f71c13464c187858753a0e97edd3c6c708d00f25adb5864e08b9c955b8aab1ad335a05895ec8f6c7bd913f2289a4ef318ed9cbde255609d7fe8879b4beeb86d2fc445b5ad37c29f48720ac65cdc69dfd33b9a6ba632bea363f305219b6e28fbc40d3b0c7c31bb9a740851a01a3030c247e5f02698ba7bf9de3ea07e312beaac96 +SHAKE-256: 236bf57cd87c8bd82f7808a880055c5ec5c8174afdc157eead42cdc5807d57c40df54d7363b077c57b37999a344f85eae50292e712e2dd3f2da06a0859257150c20be81549d64ccfc265704d37a008ab651fd4ed01f8ecf436c66e0fe711a753284bc5fbcdf02ce5b51188fb3b59b016c8fc116241f1200d6f5f588efee440a7812edf60ee33c06e98a0717938b9a65740db3c172b90dbc9c973fec0d6c36a27d1485613c4d430ce0bc29da145aea9c3ec4713e7555be6e8e0d5019ac6da5916e97e881a72ef0712803f3202e627eb64719af50d9b9f58de29a3010f436a0e0f869588a7fd05fc23bdd16023bbf82e92925deff6b6044ec987c7d9f7b50ffa2e0a9ef1392dc4d0c5bb0c3244cf3f3cf1a8fea1e87d61465989e81621c50c95cbd21cb16e68af075a8b400c379349ca7e2ebf5056b55aa3869c843bff1b04c517f6015cfe93f93da7a71a5bea89973e3e84686851da1e1fe797c5df34c7c7c95b82a2f33a7a4182f8c906174c3767e1cecdbdfc66e3f9b407a55d4158f77626cd0c0cf7e10ab13499199eec6ec356cd4a6286420bd51c4f139dc86b62e2b822fe39b86bf5b7fdaf6750706a48ea8f297ebe5cb7934ee8ec9153f40a0e148fdfa97a612a90f4dec889a7e331ea5d9c940232dfe365b53c8d9782ac0ee21ced50be3ab0b98140dfc06d41577f6fb69d84662bf207179f3ad27f2eb20fc16dbdd800 + +Input: 0bfc630357a46239c4a9ed1aa5e421fd9a3e3ef1f2389eecbebc869e029dd6ffddf2c7f173ff5f0bfffbfa2fa876b329ff7ffa9ba2f6844176eb85dcbf2d4d5d +SHA3-256: e3ff4bdcceb21003693e2967a091c3891d81d119234180f86133aed009475fd1 +SHA3-512: 0a59c2905d85b2c36fe3eeab08f1cacef0e0a3a19f6f0cf47773f5734dd5ad47d6a7e4eb3edfb70c97567653c3e4ec8154af29e203f126c568e014b2566c5c99 +SHAKE-128: 728274a7c07893eaaddcde6ab9cf4c95279501075bad804209053a1e644f632eb86cbeb737b4bb579236e2233692da728c22c40bd3440f050a02f5f894937dc5ed6be861ec3dd0e34eaacbd145f7e4599a5619740296fe8fe8bfa793c281ba8bcc39d290b9b56fa976e728049cf63d380a2ffbba099481e1460db038070de1c743eeea25d228735e42d432ebbe092eb2d5167ca3a7c8e02528e88e44aa3107bb1733d966ca4a0905b8f4434bca171ed83b183e85064b36d8f41aa57a9758c3667f75d9829fd1eb8cc40b8db89973883b7154a8294e74536b4419ad84ddb54a4bcc8e0654fe259638c55d8f0a537ae8a7bd3d46603ce4ab2e6f1f2c0858a542346e63a81b414bbc537f4cd401d264c6b2b7ef05a9303399068aee5592340f42ddb48391528c0aa79164c364b9c326e0b9abc7371e97954eb7f7e61d66e11b69ede459d4aa676da969daf4a62ad9549483f37faaacd8fdeb80f4472a51f3be2e52b51ad7b0e8f7a2c1bd72fe505dfb10e3d531ca78d1fad7beddd7d0160b72b4617069ef25637633c9ec3b97430090a4be2e2c56e1469f0f84e5baf4a9c6d347da831d6b1cc4cd89704b37bded9947279d6f4fb43b5bab68b72a0a4fee53425ac77adc8a5e9a0743271b0dca2134ec407ad79bd79d46c43bf13097bda90def112532b57a2d55ba659c201295a43b1c6fd688ee7854c7ef10abd69c8406e24cf581 +SHAKE-256: 47bd1b499562670a34fff9df86771d1aaf0f63a325fddd85a9d4b91a85d401c9f2bbd60c9a1ca5f09e4a3e0880e6b850493a2bf11cc42f5eb3e766874876d7ce92568c0c510183e979573d661f869e5c77e8c988ac1f7e3e77979e6dc50e8af19f6b6e87a19e1750057c6f533584fb558ee5ec5ca6e0a533bb0b433b9b22b2fa13240a21130eed49085e2b32566395578e42a32c7feb2aab582a41d90c223b7d88f78cc4ebd4130b5358f582aa5330e68b24139a24a29cb83e685c459c458cac58ecf0ddfc9a5f278d43f3df21a15aec9018c95ff4f7f6fbc26ce46a047592338c369bf155bd18faf0d75fb7d85a25c0cbac6151a8c507e1496545916c9d4d4482f6c86ad04310317288aed0ef414e2985395f7515abce13101304a213dd8ac8e5dd4e00e738bafee810b4c8d38d3741926fdd8be93a8f17b141bd98f637bb97e817d27f9b0deb8f360892de1d5d496d573dc85fd3864a13a80c0beb217a26da80736adaa71311913edcf15b15a197b0568ba9d08232824dc2a9d169048bdf1be983159256190628c86d13ddd51ee25cf02f59752334b341ea24e5993df3f0c8472173a78cd97bb9e18f604414fdff5a1086babe421c5d95b0d9fe9b8fcba84f5ac51ab9731ad29891ed5ef94f6f090157160e340ff078ba2c7548b451fc4056b6d5bda83cc001d305a178286e2eeca4b66dabbc08c5823ee0450474eac6fe35 + +Input: c493a93f3eeb7f8fa2ad1375ff7189945595265bfbe3d0aa987d55eee05574b9a69c5393e30ae256da33a11058d2ea43e4689ae63ef1864753570870cfca7068c0 +SHA3-256: 933e13aaa54e1e3e5330c8995d18e0f0ef9a74c9dc7894925a4f99726b683fc4 +SHA3-512: 7b9128362284a109dc4737166bb2b4f2861d76c720d77bba9d42c51f2959f74108e9a9975e124173cea9686664b570921497706214272b3732bb9a5154752f7a +SHAKE-128: e3b651aeea2c4bc184e1cef7bc87bd88065fe2c8dfae4f585e4082c057c787cc3f8bff9d5edc5364e750823729777b2b5cc9b92dd6b65117ae1d4a8ae576631de77a291e65b11605e982066a13cc3102e8205db8f32bd58c44546426b47a5874aac7399b82e4f0dfa9dbfb12eb015fba479f774670e565e6ddeafb0d1a3e131c0f7055592902fd254f1e5ed955c83700397e4da7a42e4dbcb01916741a854584aea774ac0a6771ca7df1ac3601908d0e9ff7501a508f66b07376d562620742d8dc879e48c66b720f7dbc2bfa2b9e00febf84f1aab1fe810365630d54f126d4bf227fd35fa69361e94847d1a48084f9281f38eb6758a938099a587d753281e35d6973f410db8ad9828dfd949e89dc8aa92e5350e82b7c128ee4e6eb15fb47b61af326289568a2afb216863e4b428fa316435120e423fdcbbf05a7e04cfd57fa6b1708a181521699beb644130fdc0fa9e66f8b05df2f283f80971641d5bfe6b8aaf224a60fa813f6b8fb029542272675d170787ef9dcbf862ec30126ee17af7d5d57e6ed0d3e876cf9126e7ebd49aa86f72ebe2d7afb6e023559f0818827187ac196f577c6585fb7227aa40f395bd2203c62e4777e6e2d097d29895e967ebca6756005b99c519b4029de633755302aa6e30df6fb86e06330bb774c0492ed6cf2bb3af1257628e96a9697edef4b9a787ee3d6b324c1491bc220f3d36bb7a2b15212 +SHAKE-256: 8b7f9583a76e483b7f6253bfd689e8a633243a18cc377814bc304cdfebb0e1ca08ce2e593caee6442477548066a74d4cc07ede61400fbe276d1a1e1389ef7ca0cfe4263e448e5c6a6018f288f49c139d702b707782afe199d83486fc101fa2473925119062343eff03b6959a581c2e76e39e9a92cc5ca1f40be70e19b113b19f6dc634cd7c37c13ea91887b5cc3890c6a03ad0d5685fea9edcbd64a838a5d633493c900d6677dd3f209148a010fb71a3205161ec8f914dedd0bd5e6aed048cdc216f8e968c6bd02c7ac2392b1c5016fbadadd366eed11f5eeced898f074708c24bfa453a4658895861e32415e9d8bc9567553b0e96cf6f318aaf2673933243eeb66ecb8f00a9a23ace1b0f9022e717d8fad6ff2bee6dd0926df4beec5baab17e1bc83918136c0427869efb0caf9353070d34bc3912bc2a27155ffcc4a2b0a5aba2a00a989ad57abea7caa83b280038b2d71d6fa82288c69822e17b07f08bf15e8fdb8c62ff1b2b717c29122e6abed21e2161d854df98e76b43cf90c29b95ffcfa9e69afa37679c273b74e00623f4c3591a0f260fb56c853e4281e54bad61076fd4dd27d0ec31c199671ea2d242d06b4630116f31bf8885c02579a750f43867a2d5ff3970da12ed3cb5654baead5ccdbd30bf608897c5b45fd289d279ec44aabd4ba946e45482aa65485309f1b436b0f97c762594815dee5212ebe78f7cca65d9 + +Input: 446a5542aa0335d67f1b22176e7c9817c6d172ac26a741fd85da46b01fea43b0db0968da07fc7817e95fbaecbd441e0141b70e13aa59873fa91e6e93e50b6423bb5c +SHA3-256: 30c29bd416ab6a14f640ca9115dd8aab86218307ce00383d8ec87220043210fe +SHA3-512: 92694fbb0587de18866d9281c312831ef5e7bb6ea36259faf9638cbf106f0daa3b45bbb770cddfe919bfea61741e2a58036c3264f320320d124cf7877b11bd3f +SHAKE-128: 71274bc8e44a45afda79ebb794240700420089c6ea397a557d650ed2b5952a99171359a5f2afe216095e5991e5bfbfc7a8c25d329fc6bba5ab0ab905ff8e1981d9b18a7858787dd9892ccd850715a06581bad3ccc8c4f3be2a4fb62b10e427af9500b9be425d8b578b4a344db0aaec29a19cc1cde8cd0c80f4f4b0986b6c0c491215d7c9615d4ca8153076ea5a1dea0cfcc9d93d3e261d8c06a87772be4bc1b51848d38aa1390574f2980bd35e08ea19ff1cf7dc48adff572f7e44ef9c8123e8fb820ae80cea939ebe0c489f8157fac2e4b24007a7bf21629023694475e467c6c8ea5cf93f79aebdce9bcc68d57a5d45637687c0a3c0521501145f711f4202577e63fa4f0d1dd02857f082ac8e718c5baadd1403af588a6c5ac6f9063be825061b2f1ab36371b833a44143a5ad8b31afff66f5e8c2ac37d469678ff9068e13d9e211fbdd71a7b4abd17fa6d2dd06c6eb8122f41516bc4849a15e20159c8a953bc985ab5745b8197d3a04e2128d6c5a787700582f29e91d2033632e7bae715d00190370bc8630e2a36548382a12bc0dc84b259576df2fb04af0554d6e5b57d56ee078604f7a2b02c0778b96ce28f8160980b25a78afda67a5f62aad286e1b0d752c2eba4cccaa109f0fa1beed137c66caf39a82103482611095fd6056f05d22d709e21d4487f84035d831ae5bdcf77bf4520c6a07691b029d5c991b37734bb54f +SHAKE-256: a483f18f71fcbb78a30af0e0f3831fb3afc7eb4f2cee7c46c7b768e2bf166265a3441f36234e3e12d168ac8b241f08e97217f6044b24f8ff48a2d04fc1e27920f0be8469e082f878389ea6319793a9e1a09d8c7e5e3690feb5590e3dc9e776404e4a84fb46acb1e19288c94bbd262749878a5950ddb6cdc190d90064ca1b91e11dc950cb386e876a6538d9f8b2013a8c491a3c15017b68a6c74158c67d73b92f1478a65acbe36b053cf910e59b92e2649e9a535bd7e5b7e5c1acfae5c8ef3dfb9b3a99e26f7e1377bf7a019d18e58e2a9373a79205e3f7185ac78126cde2413660cffddced977e2a32bf532817ba09f70bc83fc609d8639e92d536a582afc5cb5873ef482341204f6818d6db3ce902b85123dd4f52372dcfa302dc93255d128565224956a61ad3af0d4892952551a268c3d4c0ebfb2b5c76d1015c2362216f79009359c6e5eb3bef4a618c1e865a4eb5e85d89ac3a64feb76b1d84ebbcdcf69edaf7a35f81a24e54d47ba3f1fcb93762eb73c9c2cc3b644306fe590c27ecee9197c1802d7ccff4583e7be23a42037236f926717b33477a61b7a54ae8f4934281275509356ab9079158a7793f298dd0a02a577ecbea6461b1701e4e6777a2d48ddf156118b68836d029f7ebf743fe827d245c951274c93f8cef8032097f391586b659b761a5f551b02b413a091fac65cf3592a992f02cdfd8a32606f24050ae2a + +Input: e232eb3948cc2167e2658a6652b7da5c5ec6d43c85264d73451817dd385a4e65c368d8a83e4ef36fef5659bd8903d82eefa8f8c6cb39e4fd1d473e110b0b1993d4c4dc +SHA3-256: 2239e965239941955e33f82786da1093fa7ed00175b07a17ef8aae148805fd49 +SHA3-512: 93e30b220e778566049585cc57200be471e3cb08faa82bd0d368a4ecbf3d173fa60cba84fe7f1933a56a419ab5a3b477d0797185df39922e8b5e14dad75c8672 +SHAKE-128: c14b46e44b19014199b9addbfc061aec923a8952958a2939ef313f12936a8b72f935cbafc3ab912b89c166e6e13f0e31513be67de9423aec889c32db485d11c7c8a48fcc61a013ba5ac66efe0d5502689589b1bd2bc0eff94b65d35370d461916719652259a71075d901f9e5b7af16e0801941009c4316eb23033462df3978a5d3d9305d32951353e3f83c93815fac66acfc7dc26051461418cb7b5e9970c595b8be9c207d453dda3f37016a7e52999400a2ff24d8d5468e6187284e0a962074bb9a5492a13cab2bc1638c78ce96e9a9e8d38e60b9d350243682124c9b85929cd6ad2e1b9a59ba333dacd6b3d97f75bba45cb815d617daf64b0f7893c8ed202330aca4144bfe6fae8a23c30239e0e6b9b5af51c6e010c43ade06472c950f4e0aa2c1d78d1bce81cf19aa7c0d1eaa247dbe750b04738026c6425c9bec85726b4c1a6f26d0d817a60ce9308cd8e60102e566a11a93e9baa588993a40482fa783a9a833815d8d5d82de8140d2e1036e34e08578cc4866eb5cb0ae1d2eb22eb36a9373ad74a1c0a43679d7a8c1d272d2b5d5d998b9446beb6af77f68c11230914fef2a9a86c658a894557a94158376a55767dc7270fd6f3a35aee4536a812c97d44af3e8bca1620645c25671e3aed9989cac78af7ac2896eff3d857b2b718bdc856afc0a904f8afe8b3fc59a7695926c3568001476d2b5179976361d532fb9fab298 +SHAKE-256: 76110579fdeab911a296dc9c29900661ae8ad404c5012726329a74e8cd27d145b41ce7fd165edf068abbac7ab7f313fa1caa6bd647d73bbcb7e63132737a04daec2145e7f76914649fcd50ed6127b021e8e8eca0d0e5b084c0e24bc8ff6a43ae81082d5eb7b21eeda6f40a6ce442bf7f6e9132e9dc8dbadc43ae79ad5c8be8bc6c4988fb3a3a2a35576d03ef7b4ca169a1a36289c2bdfad398a4c86c53de594f32b2fa5c8b43e43d13c4596d8e14d79275cddbc863f233afc5854354c1589a2f523a50a0434150070bc2caf34c55fcc397d3877dfd586888d45fe86cd9d187a6e4d97f979054003f732afee583e9701d93de679af806b8e8e498bd1cb8617b9590eb63d786c0e5ad88bebefeefa280aec789a96f3abe7a8b78c09268831f216506e50b55abe1f2c8664ce7c6767a3069796c01213b3bcf39688d1b69ea4c1b18e07f72b7eb79c1da6c5b0403188f6caa00298180f066ebb7b2d816b46d8504ed06bea93fdc467762f97a17605229dabb38b3b25cb92d1f6e13217878c6b83a14ae2f640f7e34aa203ccf64c233c51be6d2925d971a5865a235f265aaaf108750b33e0c47b23f733bd1649ed51aca270ca0e48dd5168d652088a2aeb5f94e09a12475b398fa5af03583d1fff507036fc6f7d638ca8d944186724f61c8a50daff1f0c76ef727b78f4c5eebfd54cecf2abaf143765f4d5ca962b9962f042222caa8 + +Input: f685aac046b016ee5d6efb32ae7b3d021d63a3bf5778a80a3b76b1a6ca1af12fecde9b5f60f6380733f5a5934948980b68b8cec7a27a317a39041e6f0afa542f939f4815 +SHA3-256: 2ad04e6a20bf4f00a86ea729b9fe9fabba8cba8642e7e8964b0c4dff93ad0244 +SHA3-512: f4cadb9a533a93e597df80a32e515bbb875035803130c583b81d166beb1298bd1f7b28241ff3505ccd63825ae8fafd726e3b99c3adddc17b1d6f79b5dbb713f5 +SHAKE-128: 84ca5b836ea1518c8812c24ef0c866ef99cfe35633738f27ccb92ff8ac4a3ead7e4cef90d42c19f2253ebf3472e2bb38306d9bc9e543b71e2696ebcb12c6056f2ad157c27573b6af3e93085a7e3db7c766dc4849925b7389eb379284ab8debc72d41e8974bddc0e798ba888131d5440b84d7786f869de3cdec60fbf5dd7af4a5e9a588d361799e023c508c854903bcffbba8bdf45697f4c96b20c898f8ae299ecd3685ea9b603554d88b3ea205d60234a336afca3748a06c0948329d6b122fc8bbbe6af72f6b4e7ba1cd3b958c9f666288502aa96e85a1794ea190720cc9f3cc68a3e203e361eef00552f847cda4b6a7540db29c215d4ee9e7a30b0756f4717bb91d63bc6bac70e5a7a4f03b28d39f9aa5b859aa3a864b1f5cf98800f15096de1fdcfd7dfebeed7a84260f14e0b769d7ba7383578911d46de1164b5f70c071f83582626efcacd206679b286e50c579c6bf72d3056462445c1d4f1acbbcf5353645891709e4ec465ddbd1c22a19a9b4a3b857a8a37919b1406fcc785a46547b264b2f33766ec8b1b07fe595cbb754cd96e4dba8ea90ad93d26dfe6c581e2670f27695f483de1293b9c0e950301be9ce5e753028e62c636cf55df5dbb43dfc8c04d3d655007b84601e0887682e47a9d8ad573aca39231da82d957dc2f1963ecfed54fe0c566cb6fc9ddc2787b61939f60b73e9611a0d4458dd6e2ab39a03f93577 +SHAKE-256: 33326e9dfc09ebf385f246548b4f667441fe2bf9f0c307d0bb90f9301d0a6d80e439ead419d1db7488e8f06f70868cf9291b81a178fdff85924d0123a69af1fd7576d26cfa07cd5b5d39e5364a3885387ef18337c50851c11dfb1cccf827ee094c51d78910c94400b55c249fdd63dcc09acda120a1cac629e813536e0f9951cbabb7462ad3f085a1ccdba227a4cc0075b86c02350115fae9ad86efc643ebeb01c486f4c00def25ad251bf8d08be3e669f5e4f40f14dae6f6c46114a2b23ef4e82c3de0ee95610c7043cdc602115fea6374e9abc901041ff03e09192f950f4ac6a259cff1327d5585f3ebed3a4267776b8e40d3f8df57bee3d2b60a855c0514c1a6594b066bc638d1128a1526c5e34fb3d63e53f345ed1ef7f61e904b290b3cecd4e177f8b92321a979f010eaf2bd92d724443af899e3dc9f4334f6d5596d62c97b790068b84dbfbfae7928cb75870b5d648c5b1d54c5317e47d32b1b976a42f96d44db23c8b2c7f575e64bc7253331579cab153d53def42cd710484ce83bb13e4104494ba1577c97e87ff2c0605e0c1216510a5443a4fb5a9a0da68e904f41b2075d0b8c2c270430a3f9a343f07c8fe8b55066ef63cf2761a0444b05a5c788bab3d22f2caed58eda455cb834fa35ea7501ce06167f223c3541c09e63cd03fcd470652c9f7e2d7c3d1f18b3299d42138bedb51d0b60286bdc9e1978f9fbf15e89 + +Input: 83d71959ccd94bdb722444897af34a1f241136631a86dd8883c29cc41ed72b719ed228a210ea76c4ef69e30897434fee86b062f840b33934d8e9d85b5b2dc0facd6ecfc5fc +SHA3-256: 15d713090d5d4fe8175ac0a848906c96895f60379a435c8835d5d2715dab949a +SHA3-512: a9f6021bb02367ab501caf3153e2f2c6dda96b55dcedd060802ffc43909e8e6874cf84eef86728a4c7802817b923d5f85d458c564e19195ef1c6fac9319aa221 +SHAKE-128: 57e18d71027861eefed813d71f32eae2ca2573dc157bc5d1a8902f35d8ee08b8556daa8fafb7ee474f3748f21475c52d3d688e822aa2f5bb8d4cd991980d3ff9cccd521d4d6fcf846eb1c8ed9e5cf47a013ab57c95a8e5c2c4cf5989922e6275085a8e07251f99e17c4d804b62e88812a5bb3ca97f52039717ef0e99035f7cb60ad699a8612bc82a70c38c6a26a62f549505e9135e2a7757c38cd99364f4c7a1124ef3ea134f540bcd0a44a722b1fb34203b5b75063fa3eee9bc9cf4ebfb668a299ff6beb7fcbbeaf6733794d55fba61c64c14f71eeb6f41346282dba33ef7a1dfd6e9b9225beb3dff5e20650059150e64a3b6f5a3c21ee29d9da8c79ee75c851cb651204fd67e73f30736eaca8424210095171ba9eba39e680ea9c394d21ffe5a7543ba0d711de23de6cf93bb91549211c2fabd3cf909ad985262c55c3f13f22e477a86729b2ab2b9a11b4e0949431ee2dabe021f5b37bac854bbfbcd6bf73d9a9be2039b34c407181e7532bdbdaefd6cca960334b9433e2c4b46a7029ef9eda8e18e0127d082761a1a8eee90188bfa8d396f218604d6380da6b3fb0d1d7ca383606843f3b538574a62bcbfef6933cb9d01f6ca3a63e61b33eace604780f6a2d3d5b05c460fec1b07c4eab0fb1f110a257a9443c855739ba6d441767872910fc2f9cc3ed3192ef5768fe42444d692db5d6709e35fdd3a3a324df68e57fcffd5 +SHAKE-256: 54dc72d28ba8ef42c88c558eb19f7d87ccc160d5ae857351348d288bea1907c0722f7415bcf62a2cbc327adc6cc9025d7816fd7b5ac6aa87c3f4271bdb1f4ebd6ce04d124282be98496e7daee4f35788df0f85d895bdd16f5058280e891b6a973afab3cdaea18ba77cc992b1ef9ae1d008d3ac448b225390860329690b1a6b7279dc58f8980002796c527fd46161ca272902c7b026aeaa38fcd24fe97eec536dd00484219b9a71198bda2da1ac46c141a22e913dee5172b4a9042c20cecfddfa79f7a3f8f22792450e7df2e311741edba0c74257a1ce7a9adc8811b49744d7cdb9e65ead7d369c3dbd6d4b5e6518f7c75a8746ae7e2cd1667ceb9cfb3c0bd91b0adebe5e2c4efa9cc30d04bba33f5ede1c0dff87c457a122757ab070b0c53067567c2efc31486ceb11bc470defb50a204c938f6ec9b549037bd06f9db408a4808cd4773b9c2bbd473e51d3f53f8a84291f5c7795ea7d863eaaab9e700dcff99d3279b33814b43e50e90116ac1e3f65cc6b6d08dd568296c686e7181b616ab2c8115b9a782f206176d8a4697f7e8ae41d973a244109354a2cd4247d876d13c1d2e1643be41aa2718f8cd8d54b0e1d4436259a2a889e3f533b539e8225ac65d10a74f59a9af1d6e77442a321a11f5b42cedcbd840a8e0add1393f01f41f0519f606dce8cd260bd696ac7198d3bd761798409db0a04294908c504ccf2592f4125a6 + +Input: f524741527cbd01fdaa1f313debe5e0c711916f053dbe20480af1c8e52eeb1e28f80403fe3d5042c0a4adbb8283c2255d7c6f99eb190d911af7d6f01cdf9f81de3ecc65e12e1 +SHA3-256: 0095d0c3e5fb1ce5b1e507daf7ad9c49f285654333406d3c60e0f738fe49e6fa +SHA3-512: 3ff1abd6e788e8e653b46a326f24c2dd17b96b027d4809ca8ae61eb7786bc16460560c5842087c9a3c046fad44a562f415f60258a00de1cd661b7cd18d5d7ef5 +SHAKE-128: e96d01bcde4721b7153da2086686538ad8a5e45f3957c12de12f9e32e1f33d57aa22ef14fbb8ea9c93a233f738bdf04018dc285f6782e85edb0c1d8f0f4a1757ba684e6b627e3574e465979f8382de10e78f92b7c6783eb361a108d72a18cdbd5e05e928f6eab746d544414a4c36a01e193582562adf06c0b88994b3284ce805234dde9df671d7816d58e235d0fc24a96ed02027e10dc3b6da317d4e5aa4da93451c520c17832202db4860a5efd30e4e9dd6a5cd5e4ee78f941018963c6059493c47bc661cfd6ae8993d32821b4847bc7d58f817295f938d497c3da0d99bb55bca3a1c8ae90e6f99392ea3adfe35d3c34a694793b625cde73e76b2c8b562138c0ebb899dc50a452965e2869bcb902f5507c222546a5ed893de70e3833337a9525f2c1d1fafe8d5e21888076a9b72410a7f76908432fd2f64e3a712bef9fdb62176ae537574eecd780a1288dfa9039921703e19f11fe49a28d4f31029bed38435a892dfcbda317c882ee6dfab2b5d2001b7bd530f4142424a9288de3513b9ae0fcf6232c515dfe0802b5f1bbf464665435122fb78680201c5028a75472a89b51142799e1125bea400e32a2f2c23e4b904ca475c5e446984df593719b6d38a3c14732cfd5739a065ef9236431bf67290165282adfe7411274b5598aa493b4c5f3bd57ef4162d678d765027fc04e1b9a6c1ec40576e83f0fa27786a365ba2db7339 +SHAKE-256: 00d50a80ff6cd547b74394eb4da8bf3a0338007acd5de6a2a1c53632777f4a85ad2e3b8c13c6c98283d6158dfcd7369d0d6b159345568436a2b97b58ca9c55394ed9f8afee36a10a8f1a66e4e8f34102581e30d55342faf30653efcbbdee80944a2292688c304b1fee10439b65db3bc68c05c5ce8a82092e4a5cbc81c1832402dac13c16a6af8d987264d48dc9b9f98b364103b114dfabe1f706642626d9ccda5db02d9424740de1f3095d0a61f72389ee892a01b08cfcc575ec86b4d20d98f502800d8d44173bf149ca7bc48ab80374d694e4e4ed68c29b82bf6c23d8b157a1048899cffdb2ba74a66f701fa65fc7f9d97f066c6f1756c9d098c768d01548f63f8ebd7a83b34cf0302b0dfcc8dea59ecd26943a43e64d2a59de6344cd8f2ea0914631fafeb871e2c2414130bbf2d1947ed63e0fabaaa4486a43fef28d6aab4515cfc23995dd59871b7887573dbcea098474165960258b481e36cbc4e6dd3185de1473aace4ecf77d63eb09e4ffaa7fa3376c7f704ca49601cf3dfb0abb5f5d5186e5765177591a6d3a1d6a705f738252b38bb1ba3de28267969c844c5c23950d3191982062008b87946499cc9a329cbc79088cd923813fb1f739529f24f1fdc12cae7c5c287ffdd1f0d5e6a201f8f464c0f4394b6a5decfa7afd87a9b8ee625e664a9a6cc737934a31baa3b1ff7943197aa5e68918c0ee52fcca028cb95db83 + +Input: cbff1209f9c383d4cddcf902e07dc780afbab61ae4f963ed2ea87e06e9f0c77be39b9f9eba43a045e0899a87a610a8f0c32d11e506e8094b6b269ea91e79b6c1abd00c90f3af7a +SHA3-256: da5a90b0747aa27bac0cda0294a5b4524a46069775e00d43900a5170f88c273a +SHA3-512: 61a8fe7df85215fc57234db4aac7c41f8be1876f7128160324a5f4c0a5c7105a64be79cdb7e67561be21bffaf6e55da64b3b3321834b4c18215c779bbfbad530 +SHAKE-128: f94b142d3299c018fb1b67a98fa54ce27c336cffffd9999a1b73a3ea9f6d90c95bc56a377fa382b31d9fe456b31a0872cdbfb5bfff696b0421459cf8465943a9354b4a9cbb00f906df2adc8257032307ce6efa3d70e27a99cbd5c684aeb6843da781ffc20d7ef2f28bbd3460065865877f31f8694e1cc08525290efba5c20e630572169ead9fe2e052049c529309e753d0486ec5f5c6131fe3c4eeb2dcf7fcc95f3d0ade91dbccfc02f450a0bb66103da5d95661602bb86755b0e62e1e68aec5507b7d5fd751cf0a353185b5bfde2b89e11564553a5e15c175c438394a013cb362c0122bd088c2c2d5db1fae5e2831cca6326ad885b76455d544348aa1b696eda12431b24e03ca02e21b681f9d051f0421bea719cdc5b2952517e2371a227b90d015ca1ac7aecc4963b777b246a9e04defbd743533f4c0353e92db10f4bf0e3bd35c3ee1d2510e3870f8e33274bc68c1e350c1249d3c085551f58ddb50af7399521337f3bd7c3ea4042bca7021a90b5f361d94d91f0cb9dfd6dca02986b0eb4970d6a707a3cdc8ed37dedfaece5bf6cd44e12696a8e70f5acb0dd896e84739cbe1e81d96d4062f745e98c2459e4b88cb5b371d9f6391c474ec43c42b920201ea31821c9ee675a068e4dc02fbba9cc7c0fb2c30aa80ce9a7a1d41ecd83da2b9029f0c0f20ed9baeee1a75b434c1db35996d8634ad7e7bd80ccf100159657bc527 +SHAKE-256: 8eb8f740662490fcba21b9d3ffc9e8fdd5927ceaf5288b7eb92b6c716cdfcfe60498ce5f70deb8598e3e43d17ad34f80dabbdb5cf266b950230f0ec5c0ffd28858d3a1b9e42fb6e021517b3d47d36d8c1cd751ce86433c3d219bd379678b518e52eb2fc9b5debdf13dce59edba450d0c20456b60dc5f513a12a533c872f9fb2e8d4c63ec5c28be79efc429b4920f60017c1e8c42c22bc592be91d66ac8eb092e85442649997539d06ba3e3173b486b60551dcf2026f266a3f67fc3a51add7973d7527e95fab9633ada3849b0e0e98f4703bd797ce1ab4c549685b3f6681ab5ecbff1aa7a91e088190186aea0f78c5e93149982a142ad7a518e7ab9db6d3d339aea6a0a971d09474cf97f23cf396ba54bb2311b0c464ebe238182b5e4ff7350806826e89def107b9204cb83df3974a31e63b2f8a8c820c36baa9c957f4ffe196674c9c5dd0917a650f803b5f023a8e828fc5fbe8f7c2fdaef1066e3f9d11b6a3b3b651c7b0207c27cae1899c1649f2592a8943fe7cc2cc1b4f70bbe7a276bd53e5d780176b7545bd5275ba02b275a4a7cfdf829f6920514bc02deb9eb993981476e8ee3b7846de0c26643e56aac8557c31f0cb5b8a7e767073e651c57ddfccf51cfe769e1c0761f6066d86534e3c2b33f2f1801ae40168294b014ada5a6b8956a0f8e81e8ebfc3961edcee8d5596f6f738fa89a0b151e959b546c695f52741773 + +Input: 91e6c2992563533da91c6c2a1546b18fd3aa48f1e601b7ccf3888c18a8c00efeb20999dc811beb2c09ddc11d37e0958682508c90f11de5e167747053129deb69d0d8594b1da009d7 +SHA3-256: 948b9fb49309ec0ea5e15dde14b50a98af48231af3788188423f82f16029b39b +SHA3-512: f9b1d8cf7de9d77623ee9c58028aaca313f2d5ef1e7e18766f384f446469edeedb6eefd93589f938544ca319f57f160c451dcd42bd22ef30e60a392767d7bfbf +SHAKE-128: 3fcf6e900f8e10e478c6076ecb2002aa6166461ddc36f0e4315e470958911007f46708ebd79746c4f32e5135625acd24ae721e9eb900973366ce15619a2ecc379ccb9ec2eb14e4f4ac96e427031a0bf47489cac3ace1498f4ee1772605287bc7728cd0148ad132d20f81e85457e6c86a3e4fe5ded3f322e69016430067b3e8b868c38078ddc9a5cb8f605bfa5d5c6cd0ac91921e43448ed621c6f6cb97b1ad0d411db3e34904285d19ffe827bdf56df8da879829ff394426631cb6ab415f2e8be8f45dc072afff34d4683bfd7f23f19a9223bb6a212b35a0431e00242f7ebe7ec0dfe1ad0850129d89c6b66c506f53a4b0c357e6a3b8a164eef9cfe256255253718a6f56fb518b0dde5166d23c5593c39ad4871f1e16f45f38b976b6b9ba8f922005c0bdc7ee09fe8d16bcd5be7f8fc84316e6aadb611afecebe9e20ad782fdf42292ae64cc8be119f4dc42d7f1b1e984c40dd7c8fd88b42cdc2a7d38fe68853b412b5c644efc10ef3c52a037779f31747b3d1febcbf2f8b19f6666aec4d6c8681951c1dd22f79507973230d1bd7ff9b3fd1bc3a00aa443ef5a7817fec7a52a1f584a44d72a39169acaaac0cc6274c1229679c052f47b02002dfecbdc0e5c980832067f024d4dbe1a44aa593f2007c1bdf2e4d11ff79062c86d8d3fe08b827a04d8f827264e889ecde37f5c392b594beae422ea3041c1918c35adef9a9f8f45d +SHAKE-256: 85677afeeb6b08a5fc06bc2a0e5fcc4bba23f7a365df3a4910caf878ddfbe6e6585baa75b5b7990ab252a9789a0fc3d10d136a0bf7467f640fd4eff193afd865cb807b79e292351649d713f6cc685fee05859ba9c64c3fd49ee4a88b2625fc42d03f670ed1bdd1aacd266f2a56264ef4f9a224468e2a6637f2c1d5d64c9e948cc5c47b791d595087f991f81e2b8b0c38e6e0b59c1ae60a586d65bd85c1b8e0338031878e1ca0f9d139f8436e483c8cdd73965202fe0ebac0209c94440d09754cbc099cd0260ef4ff0702f15b1166089a617e989992b18b923662e2609bcc06c227b3f87d1e327fdad07f0a5a054a3436d7d77bf787c658a9800552f98f52708e2d3b649d77ef2b1ebcf7cfd672da132ae6ea5b2d82f6bc7bbbdee2730116142527b861a2a0b6b9760c65400af4c1f8615fc935e71882428ebc2bcb922c27b38af3c635624f330cebdbacce7e4864f5d66fce20b0f9c93721f9ad1507ff664fbef83ea3f64fca38aa6571f4978f1022dd1341e624740dfcd3fa0cf304911d62ed16854a84ae7c2c966e2c329aef8188ab8ba80623f680ff859ce00dad35ff005b12c09068c31f2d95c68dc77416c932a6ce062dc28beff895794b1faa8b7bd5bcdb0af2e16c180119a90d7484ba9fb6e45b161df982d08a0511ec32846b58560ebdb071d753fa3ebbcc89d7a8b84148b833a81280739e2cec81a6cd812e05fb5f + +Input: a51c1a148b54d086361da6fb68964475428273153ac145532a23bf5889efd3e9a419b5384205ac381f9983fe6ecbf414cf302281f97e82e3e0a51171eb0df1d1b243bdc8b335368437 +SHA3-256: 9fa4cf24baac213facb18094c57732f9dd9ceff2b18b5056c2700d695b148a22 +SHA3-512: 88cd3efd6026f8045315cb9c56306b148d7f398608da04e5c830e34bcc86996cd21c76c7f3bd5d4d02ef14a866c0155002f53b7811d85b527373c9820b8ab117 +SHAKE-128: 6c9941a24023dca0a0cb3c19b5e7dc0d129b1d0cdfc1d90a0e11784de12d91ea9a61efbf52a744a4ed087b8c25282367df62ca275d8f17d3e19a2bf84773fbef44ed01009c34976d4ab01d410eef9e806c5d61da0339d9cd8e2f35ae70b3a661570e7ded79542d27a307e98388191557d367d9b8065c6a258d2bce924f5fcfc1702ba06fac26ba0e1a0165682d5257e8626660994048fad8f27ebdddb63a4be79b5bfc66f2bd30ac1bd99017eafcbed18a440600077284664a786ca23b59f5f5d4a6beabca3116159aa20cbd96e456665f11ed70a04572f3de560c29372156f84c68ba2b23be71b05446953990267d341fb0e2eb72e4992b9f1bdc6a841ecc8bb6c7bef8ed76379957b9c78d63d18dbbcad1d6a5ab1648a372b4507fcec95f799015996833092f42c836ab21714d138611f9cea5fb70f41f893df9f56e73cc19dce1f159f78d6d760705af3187facd745c2c4e39413ad8cb6487f7499bcf8090b0acaf7d30d29105221cfb6ae10ce12449b69227aa589ba07a44c06820170000d29d5013e89fba2468c3ea610e3f67acd9dcedd09f843db48da6480314cc22eedbbf832fb21d8018a6285be823f80f1f7979da31b75b6619284b477f45e3db8c54a6ded5effd439967dac15bcf03d0e0389332bc5758a231e0f5298f27e77827d02c43728d4dfd442624d6a17d70758fd786b9fe0b0f0fa8d525a1e772fb2ecc +SHAKE-256: 28ae05e3e7681924268357d3af54f589e08ed584335fbe3b97cc05386fa3b5ccce5a7e1746718859527a09b1559147cd03eeb8930ab3f0f0b45b8c4b0fae8d8afd6c99ab3d3b544287cf1621410bd9a476969d234e8f98d26d7f6d72f42806b4224c814cdbfed4f7a3d8ec14e7b8ad3f59128611cfac1313765955d4e34804ed8c4387e6f0f906a6b7ff08ca957256400211b0a726d756e1162d40dfded3e0c7f2469f6984761acc659bd86d70753d3f6a1408162627ef7893e2343ff3385171eb5d7fe7214933c6d5b8bdbb389e70fc967f0b073cc7fd06b8dcbc71233af8956f43bf151977fd54d429c88f4f8ffabf029ecbe3b38dea6ba71ebc67a878f87319ba7eb150d97d0ad8398e2fab16bf02d98d388acfa7c799f82853098cd15d28a4621a52223a43507731afb61c0c7a4e4503cbca52f318b47abcfbf37f03d5c36278763f27b0ff801f2f54fe8fd3398854d8b433103e46f0df48963a6c60986877519fc88ca69565ef5ec165ea0576552e195df93808279dca9516c380e796bbe22424a14495cb7a8a67debc34a30da5ab938efff5788652107716cbd8bdf6298c1de9215f952a8b332bc3e6dee98e9cf059910f2247f90842e398610385f69646da32d9c7a93da2fc68c5bdfa548a5cd00705766c0574bd6ecd5562b78f1b25c854df2bea2e268cdd354f5ab9da3cc349536c75325e4a68d243fe819f5fc60f + +Input: 40e3a3b001f88ff676059da5e248fea60b3d44e6153fbf1a84755a60f31ef477a8254844143000c3a9d4df9da73827e970f47c96a3c0827432b41a60e0f3def0bc1f4f0d94c186d76067 +SHA3-256: dfb9995afb4341366d90d388c3c2deb4bc9f4278fd1764a5360d081dcd7ad0ef +SHA3-512: 839e0cdc3e1c625d5358d75bbcf39d25791f720f98e4c87b0036daa719b607d9389e02ab028f88cffe2462b67103cee4cf71566193a5b465366642dce2445fd5 +SHAKE-128: 4b4b8eae8635c4751423b10ba08ce2a8de4fd6b35db0876fd5bc4f9d352c4f6a4abc3c2cb1dced3414279597eaf18043cc39e1198aa6ee5c7ead4a97b26d74c3cd54efacaf7491ca74200e68357849daad4b691fb4808c570f7c04caaca774ca70860fbedb2317f97d6f4fb6162d12834172d0152ec41a07b5517ed2034ac96014a45e184a52c065d6b9599d7b5d4e6fc011b53932c4288afc4ca65206066a362d1d52ac3edb0fab549d5a49f895943a9838dbd5eb36aefe4018a4ebc3b0c80d6b2687f4750508acf8b7fae95d8ea941d2deab112573e23c40f3f6e95f160eae039893feba65a05ba19c1983267ea31836394f5326184d251fe6154558a40c107759c7d06c04abda3b2ffb1b41f79f28041060280f51674abf4978552a05cef5ff6c07412b76dcaf1ef249d86d50cecb98f6064cf3911a26b5a645d1798eda7176d638d4802a4c6809149017bbc46eea3cd0d0d2a789d2bf926b494a757ddb39dc253e218df087243cc8714825ae6351f1fc3e1ccbcc7489204fbd315cfc3269d0ccbda071189c976800946ad7155ea35c1eaa858cfd72eef4a60ca47969f6b4b9ce0834bbd901c4fdb4b648f5ca3fdbe27ddab6c558a1d8405ea86dad5863ed8ef119330ebb1f87134b26cb44602ad1a1e552307905a5f21306bcf4cd28d0fd66385c4402df2ce0218b235de0f5ee1052217c586db22fdcf07037de90ad9713 +SHAKE-256: a1d0c6491012388b17e84f28dbd66be5408e495b82aebaaad263e011e962b8b9b9fe51099cae73bddb4e8f18a8ceb6c1442ff1426119ade79927ad794ea84d353695cc054d9ecbfc52a3fccf1944d8dc0893ebb4453a393a5625c8ef4cfbb407d46826b45eec94a6ffa5f8b77b3ba4d91e1422eec0dae50ae5e0f3d9205f69bc193bbf84d03f7f816a5c170e24273c242210db18933b47ccacf9189b016a81ef51ffc027744b8705b4f8257954cb1bb0241662e0176fe718611b3c5ac17f928f32c3956f0b8184b082c58ee94f3c5ab8578a979850f55a7450c5649b1e3f34c589d0b2805fe6d33a35e241590576574f5ce19135e4291a50b7329acc9f21692f33e2573b2ba60624abf8d7eb38fe5a19740c9569cca7a413290139f386669a59d77a4817a9f5a304ca6b395f2b11ceea0f814ad80d70d4c18ab87a43cee0ed2585779a62c13ec9df27efd4233d7c4bdd10fed212311053d8d27d7170bc1d1d6dd4e82931035248ec35a37e6aebc65f8f388a7143292144976ad4080bd5652b0170b33a9ad836d751f1c09d98eb488202af325baeb56631aa21159ea7af06695eafada435da14abc49d76ea48d41fce7708632724034c56b95658ac30603d1629950a65c8936f7dce93430664b6df3a5e93091d59d539fbb94effa79419ae89b200c3eb8898969bfbbfd2e1fb7f458fe08d0640bc0ef62ff882128e1cf89781bb + +Input: b7a5e0f41e801da38c9ae31a4868fc016983eb518da2264aade0884152637fef2991fe59447995929e068fc3c3d210f80ea7a83c370ed67facc2093f5c52ebabfc474f0bf9afe13873cb34 +SHA3-256: 0769c5b23c0c6719c2f11b1a4bb60f047cb418c6a0516f3a0398f1e853d9c596 +SHA3-512: d81d3eee1fc52cb4146658f48c03761cd7442bc8dee3500ad86531b9f482f900cc1d549a1319451b5dd4b2149c8696891951979e9ba8e4876ac27e9023067d0d +SHAKE-128: b055c86d79c6a5021f07442708a12277e1bcbfbd0630f04d65083bd0efdd90369a707e1588976ccda1779ceaaa72895161603630b4022947d0cf2edceecfb3c4bf293326836952a15cab46d745b1ea929687255b64172997cde05684d59c16c2d259658bdfa08ea149949b49b17dcc2a5a33592715336de67544f90e43b1522fda5f72f1c196616de6c07fd11cfe74842b23acd48f0e1aaf895a0caa26f52fefc0f8eb03c7da6895b1f78e7b6e312352ded22c38577244b865382bc38a39ad3f0e351f9f9c051b3d90b08936e0cbd6137150729928039855d17040ec25eeb0d14a93aebd7b4819cd67de76315a24b3fd3869e353747ef5c6f3d447a11028f7a28130e1285616ac46ae2c028dcf17914eb38a973566dff6ac57f64857eadbe19207fccb6f70334ae10f1329cc40f9560299ae79dd84e872735cda3ca99f1c68d86348ca1f5338d3d8c06ad1f642474ac4222c92d2e610d4960ceb69094c2700b87ce769a346bff372785522a3a6176cc435914c64b8888aac2654c196f72a449fa10d209488ce221f3f44c5f8a7bafe34d4d8fb346aed65973d4e29331e6bedf58f10e304fe8cebd371f24a28ef047a3e37e43e35db501c6821107d4e7e1b135681bcf7a615ecd565703346039888ad06dfe73b2756dd7c5b7926f47acc298ac48c40153078364e2ce45149d7eca68d8c452d3e077bf53825eb89acee5dca5da9 +SHAKE-256: 1b9907b03f4b2f536c7077928226d7d8965e2757c5853f7fa7204ba30359b6def28fb02645f79125bec9b96022b58ca837fce4f899ed40588e39b51722d1e429288d2f852f99f3ff137ef34300f2a2c84d986cf26d4c24aded54b8e0fdcffc25f41a1e8de54299c82992993a1643c884471a95a5349fdfd61fd8cf5c5c82378a2a373956696467275aba9b827c0d83dcd7a4dfdc3f0e83c8389a2f4fbe9df0e1e349f8e49a0c424155f13acb10a562163faf30fff1583ca60d84d890cd00fd8c3e7fffbde667233aef9308bd86a782f645448f796faba481aeb5331985a03dcae82110c4ebf1a626119f3253a8b11793a32a063db700255773724de596d473e67195c8f590b37978a8f8d0af4ca0d02a5da9da5a09f96c88d4d57413ac495916619d0fadbf43840f45a5c2d3d08b23dda32166dea5ea3e1865268b2bd82efd5fda7c576cff26f222074f8e5c44cb82896155e5d0ed5a82b81086a20c0d867c635b3078e7541832000daf2012b0d6125732bce889cd53727aee17b7a1c2182c87131a8b908148af135ae51ce88c080442bcfdc22706e819f54c6a678aba2ff3e1593dc74e6e2163c67e7c873ad9b7a0be9797024a2decff9befcd81378ae8cdbab21f9af7d6f874e4496496996d7211842f2b09f3321be094d0a29efecaf1f04d3450ff1c95d11ef9228fabe6859fe5cab246206725b7241330eb74e209764689 + +Input: bb9185d5f94c1dd0b2fe1c98d24d76a35d09212d01ebd46eda42abf0ce64c0cebf51df6cae7af6665b13e90dc3cefe9c64d55f5cc37e843fddcf45437e073ab68f296fea018a8b0b289c0b99 +SHA3-256: 55d1a9882bdb8e98a7b12817ab9030d78223853cad39ced49afa2f296634b4e5 +SHA3-512: ef7d22900473c916b7aa062a264cf1b6928cf2a7eed5b4c88ab41abcee554b547fbe726e2e3f8b22fdbfe51329873746c5f4625e9492305d93ea1e9cacf7e004 +SHAKE-128: 0d092affaaa0dd89308eecc3f6f511a9d742ba16b68f80afcd7eb33e5308ae1647c476ad0fd54cc731308482f4bd76e85f55a9ce3fd0d6437b6833c1010c786db2d653c16af814b5538ea64a8212d83ee80b088dc620c4e2601342ab17710d268e722ef0dce5b2e8ca73584e4008c7de27ab56d76a44193746838136bc6a62e6980decdb2c945c5811993e5875b92a3f8d38b1d76cc3f9cc0b832f31072d56a11aaf44c575121256d9a3696858068c855c19fbd0ade893e1b5298200e47681bb99f1cbedd4a1c73f954b4ef7d4d28786a5697590de0bfb615dae3892c0024349cd809778aaf001e2ce90f390f84a0b810dececad6a9b90492d55eead14f14a99a761c44b8919a79729d0a2ff0bfbd45fbf9091c784f07718a9e99c05bfb0eac934a3c7aa7f2c0c6fd4299189f37a03a99e3d0b2328d5f4cb89273374090d79fb8e98db0130a1528d1a0df937b5cd3ac8e35fd14d42290a275e6002a7b1a50b9c4e84eaaf31f94fe53ca91a9970e6f1abe081a298e3fa89bd664a690cf04393203f9c0a9cf194abff3a9399cf961c7e6ddd2f65cf83a6bad28ce8ed47dbdb80ba7ab8193ae323c9525d8658ea96a7756d9fe22575a01ae9b7221e01ad4612e748a7e2d716b57cc35d1d32ef55aeed18220333b6473bbc80ac5ea111e451a8143a83394d10fc6dae120455a314cb6961abb0e4a58d7e78eca8e37873adb97df02b +SHAKE-256: 60882c8d1b5e250193fc3f071fffd088bd73a908a797796327153ce07050382a6e29482ef6e3d1b478db796684a8ebe0d58f1573714ee2b8609be34838af568f175b2c9ae594e3b91513152eefad8badae58751f213cffcb6123287b70f7425193bad479a4a10166088a72af00624ddfd05b61a055e0791230550c8bc2181f5ebd6f68f757bab2b83c9be4708e3801e3a5d95aff0a90ee26c320796899a5e355fd73be10ec23c0539f16cdfeddd06c39ea53071509216de31a275f19879a7901ca82409eb607612d3b0a93ac348fec12c5e2faada0c1d59367a3d6e71785d0fb95f7ec514a890192fc56faf02765e676b8161b5bab583077d227452e52fa040503654a73f6bc956893e4258223e94b75ff3a64be5107b4da9ca27f5988af4f710d6acad9c2074e6f6ac5a2903aa8edb61ed89a995ecef81cdc825ed96ba5d3946e8e7502394f527671bd1f383fb5f87d2c386e2d059c9507c373e2e6942b13190ad094ae03af7e778769a84f7c387dbe76a81fdd5ee2625f68925af171602680cc6c022da167d9dbebfab079bfd215dbe6b3e753d00fe4fcb2e33ee42cc767cf60167019bdd3d0df5cddf2654875c6ed4864dfbfc0dd95c71b3f4e81f948a38be42c0327990fc74f6bb346f60a8f739b924522230df2bf700670f5001ec7d7bcf91023609e6fe3330aa81327c212f3748160581c937fa2d8d12947a28ae933a1 + +Input: 660fe039891d87e954d0102b01dc8c6bcb460e4bc177542f82cbd244b8b5e5d5ff25e1c6abf906884bba5b6807a9c8eda79d25e73994b61e9b7e85af43277376bfc3439ae53846a9c463c6393f +SHA3-256: ebbb154b6b6aebfb4dae2de18c85d320a97fd0b2cd72514e10704b9b614fc5e0 +SHA3-512: 2f4f8876da1437ffc80eb6718894b63f37746a50ba7faa4a24a56b8db1da6ae411901db1d2290703d0e88d1939306907ab22808aeda2ce313eaa4f9cb5de4665 +SHAKE-128: a1ac04a6dc71f1d2548288083437dbcda8b29168dd44f3af8f26af96f4ed5e7cf991909230ddd86641696fe72a92b8977d3fdbe9c447322e710bf6586a340d53d9bef84c27011a7576bf3a3b5d9f3faf3ff3b9d544775fe9dc0aef9b4d7f869e158ad8344c906ac4f6c5edec319e49c62eb5c1943d8ac05aa2c0c7ab707f3381142ed0b9bf1098be6b9d161c0ff760524aee825bd78a7cf7660974759850266c2d722b1add2ce63fdef210636c5c64cf55a90885c25a7e001274e47f98c3cedff0fbfe4f83561ec2bbb59f4c901673fd1c346def1b211737c12000fdeba0264007b37f0f205d72dbe52402d313bb127ff1d4c7963e9af5a47d65f184ea5f3cb7112eb3860cc75b00ff66f05282bcaea0e3c3596be090187c3ff40cb46e163132abf572a946bca781473743648ec5a0ad140d45f6313f1584bb52d8ea74c55c2611d0cfb9b89a8539b5d6d6114a6e14515ec6bd4dcae81847bcf99478dcb25ac9bcf5efc19d0e60827b1d311d7688bc35f3ae610b4aab6c604fecf7a93758e3b0c5bd8a97ee1a642c0964fa0d080cda8bda7a8981729508c51b44123714b4a2dff6fba94f5d6f9780757d93e68768a2ba579fba7e4e6f2b5604065891110e1705b0d96570c59cf2103ffad0623ef66307bde012d34f1b6452bf125566d73189202120bef73363e8cee0e826c2c8958372da550992cb6e382154dc1dcf54250766 +SHAKE-256: 6e05b2b1179ee333f38837ed76f7e16262eb5090a7f430fb119fa1170f740aa7eb7a112b9b4abd6ef1694a8887523e3504ff6ef056de45221f1d0aa88ebdd79e5e95bb7731297d778f8f6d470d2fb57a9400cdce1298db26dfb730f6c711d49378a0cb5b578dc3568b3ae89c40c0f357e1fb4a1c77098015ac876468e09af22c40262b38eb1fb380978bed6428a680c2581ee0a647c12b886fa66d38a1b951edab374ef74aa9a1ef4d9c02e52510b1f1fe83d5218b819983d7d8a02617db0d479569d9f3206f26efe5d78ec1f5f001f558e4794d725add528d2bc7d51bb4e0af2d159d050636864bb95478662092a55695cb4cbc47c1a2e64de9c4fadf02f38d75318f94f26d09fc87f92a0bf7aeba1c3854369e5da67435e6e3dfcd7dd9297e6fed038f32bcc108cf909bcbcdfdd5423511e903176640f2934d11428147c5b5cdf3b0fc432e238bdbb48c63612182cfffa84026137c51fc7b29b85dcd82a01c989221760066baed91b7ce70f7ab0cb96d2a8f170c2262e02e4cd5d7ec21bc3fd3c1517e8515895bf3442157ad3d123cbd01ccd0d65584600d97451601e33e8be3272f97e6cab7c21c19be48adc7d8ce840980a62014f6e1dd494958edd463bdb8e1f2a785d241e843d715998611c6bbbe8843f7d29ad21dceafc7993aae7ef9a279efe673bae8224f07a9b70c28e261dbefadca21408b83ade66f579b995f06 + +Input: 9e7e411cd73dcd42fce39dbdd34aba115fa067de5431318bfbd4005305c9fb8d8930f30f741af6d7fead326a8184e73aab8dd173c800006bfce3916fc1c04e186c7a0302842b1d5ff949b6a336b7 +SHA3-256: a27026fa9c3347a8be47e225664d17d4b20f811f0dc23c74685210f544a7d832 +SHA3-512: 328db541058bb39941ce7d13287733005d0181572cef3e8767e230421578c71e23a125fc5a17880b52a23f861436d9f3d735b9fd6bef3f244d3e86bffe0f6fd5 +SHAKE-128: 8a7cf91d22a70f75f24cc3fbf084d4ecae4d835a5ce4e5bbcd46a5e326a21c1fd680eb182018193ca05b846adb0323701701f6915cfd9e697f2cec74533a43a2ea65a3b03faee89cf243b224845bd71c0d5f4cf76aa143c2433832fa23c3b883bf7fb7615311af787b039d5fee4af2effa398e1d47531adff800ca9472ba1b13e10e370f4f058131016f35e86b932110bc8abad9ef63e8eed0c9c7ea0fb68540de4967d8146bb15e8052ef223efcdf29747aeed41e91186d255bbffbcb5f99ddbdd09a4f0bb95e93174a0200806af2eb6bebdb57a0d08ae8960cba6c5fbd5dc9eb2c70d2e9a75ec3a9a00c35e0047ee0f41108f4ddd9f244c142146371d7572cf0ec81504f4874ec83c579d4a92cd67580695149c1b8057ef402d2be1beb30f56f9e1dc037bb37b91b4c1da49644a0853fd8bf1d2667109a02e2215bdfe54f359d30f893331db75536d568d142295da94495c95ddf9f1e30f9ec3612c8cb3ecf8e2a767d18465579c483ce156a4cc590746b81265ac9ba9dff95873928d2e9c361b6ec2ed6d8822f07848f61630164acccaa619270587237f0f8c7c7bbcc35a880e6efc3ce02efb5c0da8c2db65a18d68fea45d596e80168c7c7d7b6ef118c44e1b529aa770b479b24dc6785f7ef4de6045b6c71e2de672eed757de9995fcfbf0b61d25f06ad175cdbdd5be7330c97944f3d53dac94a4e3e720217cecf5b5d70 +SHAKE-256: 9304947e788a2d843ac096642186816f99695d82c74a956999ea8df1671c556081b0b3898d06b05086d2319f24d6e69f08169c32cc11b6f6a67e7948e5e1eb153f853da58f9a2aa38a68f411b23c1926b283aad55557d56e7de8e532b717f26b916f9cc8c2f22a337ce35b934fa3e3e753e8d12432725cb21f178aae33ab3bf862502f255323f2116c840ebb361d2b2b15e92b04674486c4097759b43d1de3e63a07cfeec0e3aff2c7345e69fa3fc100f6d0265b4f300f423eb71a4005b262fa2ef8533baf1730fb5c399de4d5f7ad117a357ea5ea8277b12be00dcbe7bbf7be51e1c1c2b4f54f01b9b30e34df1b27c56d626fd8101d2c2a799a02a80ecf5fc6ea4cb1d8660a73a7dfa362297d15d6434786603ca31cccd98b009916294fd3b87474d8d86d391162f09da6551c9af26e0e2e9c72790c8c7bf63ad3f6df253a981ca5bb113a266701a962bfcb02fa1986b275cd98baf933e42ba3cc6907aeb54b889a4396eb401a8a0e68dab068cf42f78f2c6ee6a55609fb8abed4bb41e3fa55a6bf50254f007a7bc87f5be2117c803e2636cf827827c7d219c4b1d48376dcb8bb5ada0c282a862b238ca2f9417b3786dac6700c31356c9712f2164b16602754f36b868d051b2ae9bed67e673223f5a1374a00018eb1f10de8f4e0134e5ff976129ecf378640fc57ae859c81a655e768036dd1eee0d73d2cd24f52d01c798c97 + +Input: c767258594d2fe24eb62b948ab2672f89923964f17f6ce7afef074b52dd3de9ddb050be2a7db2ce893326670ee4ba2f060d83614c60efa7dd805809e550f9e8c1c709ef4e6209e6b43794940393a8b +SHA3-256: 1d9ace700005aa14098dad7d25509399b743b97a28f61455ab0dba8e7bc50fe7 +SHA3-512: eb6f0a9b9692b53314a35d231a91b007fdf7e8dd826f07b814a372bae59bb57112c6c44280b0a44080a401dc2fda30c65f071a69a182ab33568fd9984460d784 +SHAKE-128: 148affbd9ef3b83410a5213b4d00808e85c471df7380822965807e33aa9defcb825fb70e5d8d0267a787c2b1234332a6eca6e3436fdf325d620f51c909063a3be0cfe92612e5369b1c6f2a19b721c0104a34bfbb7a995aebb224b2ab20b98d18a85ec58116735c398077e1e38942f3e2af9604a2c47f95ad029ee15a9ef7aff9a86974a2cc468302c204c4da1f89a3c041176d4f8a70899962c0a8f9d416ee0d54cde901b147d0a8fd8aa3443683b4b4f624abb8907d31af361d00050a34200cb624fc91f64ef8899704f6ae4124516dd7c325c6398389f5875398d51532410bdcb2df046dafae1e8effc15eccd5ac3519bb930b56ff03c544bf60a79c086207e6959446f9ad4349bebe3794e0ccd77d88a8e1f24acf9e0f730c154ee42e7a582aaaea296427c5c1e5d932bb9f79a182959f780e92024c9d575e22b1efd225343188e713243698f4f118d76614e9a7a7b17276ada9b311949d78609444b3a331a16c110c984ff31e829896fb5b66f0a0e852af918e111a331f49e3db790f51318b05e05549bd697747b3d988c92f76abbae74ef3b3bdbed986b2bd7b772195281a5f48436d3032498d42dd4389afa4fb1e0252501289e53a6bcc63e05336b35911c9b7abcb8e0dedee6188891aa3b91a028c7ce2f98fc41aa50e26b4d85b82621861565c1c6000bc6836eeaa3542aef9dccf10a72039c355f3d89f8bb96895ca +SHAKE-256: 5fca527861751709c18f1b2b9966d71ee3ab417231e15e2d1a78ccc52935dd2d71d0927c957f69f7e08fbffff64a34a10defb149dfbe0c7a4a15d334cf19e2f7815e57b64964ac591ee04254de19e8ab59bea5ad0c950c18ab5a8f81efede783546a16d11debbecbbff09ec67019114155d783c925624e9725c4da44998b5d0dc8f9d1983cb72eb5c411f072043eebeafe8221fbbe14d74e1ac09c3905eec055767853fa663b091895bbd57ba2caead2a63eb0c4ebbcc5c343091ffa9b5a5f97dae7fc9ea34bed83a79d6096b7d9a883cc8b189eed475fb4a35757ffef085ee3cc334d987f4cc43a196e9f83a29c1fe6d88341ae2b98f6a730cfe0b7772bf23d0f6f8077756649964fc20d4f6be402c73296147489a4598dbf25cec4bb6d3cc46bd28669cf5b9fbf2530ece0fa9e9efe320ed107e89b99263e03857725f2ca461e3a9ea64bf50b716dfca9834022e85d74f1906edcdfe8497abe0b07b3bfd46b5b4050972b0dbd1e551969741e12966881e9177de152d652d7ade352879a726f478866ac2cf0a865e0b6938fb6e8177641213590c94403d3c5f1b590cd1dce65fd901a3bc4951ec0c98b5be97c552862d5202992a3e0c7ebf2b05036fecb88fcd3a5c542f728662eff7d96eaa9844c68f8a4f371bb2340585b63e3cbf52db5c4016e1bc1ec310b9b162ec8b004e9ebc613d4ce6435eefcf0b51e63cf8cea931d + +Input: 841c10102731b914ab98389beec42974e833af78537499334b1519bab5173e5e057de09ded0281229235d1d6f81794085444b3840be748bba793f4165ed0d918d2fe138b495a44bfd2ac071565cf8be7 +SHA3-256: a2a1cd48e5df62dd2a4a771cdef9d6081a4577ade325ceba377503eedde874e4 +SHA3-512: b7dae82620f7fbef24bae22d8a9231bc0213597930576d72bcaa65e9f060e3f8f90bfa736d3848acf579d1005de206d826abea5d7e1df3f7110ea5d9c111d48c +SHAKE-128: e7857cba05c7149d29f7f1e4e541f40cda7e0698d05bde45b2407e6c3398c753f507be861bbbbb89b64d4742b057bf5128132ce91da2d4b3477f1cfe8fc1421537340a2408bf348eda5ca3171ff145e1949a97006341ce8df8b2dcf4370077f712c867f0767aa2f778a28dbf47b24305887d07e81fd97582c59c6779526068d955b36ad6726b594e3c2d51602de57606c8725f04b43df09eb8baf2e98e508b4ea49b4d6e03f75882e1769d70026c28d06ed9bd5687c9627856b9e76fc29ed19c4cb5c78701e419379cb08294b343a3b8dd8a4a0a1957ff246471bc5715c79b497f6ee466b775c8f49cf9a46b41445434c633b877583539d3d24b044284fabfc00a3a6c234b6f262616c7578a5ea050a4ebc88d122525b1fd3124b975505bef417dd6fa2f55f72d47995e767b3f5d8aa4ebfb686d1a464968583a648a0ea2d6d60a446bd2e1046146ecb4e499d12939dbdc427c5dadc205673daaa6940f00b7fc481b3c883048b39565d8418fdab70118d112bb678f27bd265cc3941d544dbcd699ed4ec16342ef998b9b15fc54e6a66f405ddd54bd4b110448de6e2ba9b2246508c33e5847b5d2c0b90f3041fd073a448b40719840a0d5c9aeeb89d12929a4e6144f79715cbe741d1499f7f1bfa3987c92894be2e3a734187d13b1ebc35ec3cbd5b3f7a1b9da70d086a7de7c76abc73057b5468f378ae5ba83929c4b976bb9be +SHAKE-256: 96cda06cbefdc46f0ed5872d0a81322bcbd5ff2873468b9946b761bdcd31cbc4d20fab18d0e3052564075a24bb667acade85ea247766c4e8fc53f4b605aba9dcad2484a2d1c46837f82223d6e9253f9fc61dad368a3bbbb646c32bdd3f645d10868627a96147bb2fb7689ce2f1592e273d8ce8ef4cab9dd00647e7e811c4aaae9c524d980e9125218aa308c95e33de1924dba5e0a36c9fc7e2709be4dfbce341128cb9b4e6e3ef09329431e036e83287f050e07f92f0ff412aa69a5c1a073371a09ccce60e197e6df4e7157bac2ea07480a8fa82d9ed5d4b63d3465d9d0cb2e23c5b819152b5b366bebe2cf60948c2a76a17291691210cddec170777975e7b1606f024477e3c2be32b8a2d6cc5f6643fa447b436b7127d2689d8b63d8b7e21d17b3a4d105f25855fb6259f59848ded2c919971de25cb73761e3f865ed98e8215fdd887b2e756257f5fb0f4f964ef9774cb33b87a936b65c577a0bf453d95556a1029ae377d89a15573cc48aa3542998748bb5c1a8f9f32e57f6e3b13c6d88c602639a7818950e5bd208fbb1779bebd244438bd6f4965e29cdd2bad68f478606d4efb97325f949c704072fbd30cbfb46e022e5bd0e01dc5a4ca007c7c547cf529c9d3c6195de9e2d460f196adaeaa36615a2ecaf45bdda8c059ca77c9c4672f86934bfb87a8fb0dfce00e1bb2a02e892c359d2c6c0c17af7eaae309d5cb3be015 + +Input: d9becf1e7b37309ad81695eeb36db252a5d5e211cb7f0da414f83ca0b5b0ea36c73b3242f3314b6f93bc39da33d2a9a0db6499d7fad81f9106180b19b83cc734d7196c99ec54ccf254c9c6959197e2c5ff +SHA3-256: 9f13d522a37cdb1ab4ec69248632becb63f0c62658655d689d572524693d0f84 +SHA3-512: f2549804e34e2fb3c4874a8c92ea9acaf6d4088243978edb450e667359f297e47fd71538a0e6c1bac69316219382eb2da06917d506d86cf06b564409201760e3 +SHAKE-128: b9c79585fe65477159bc4b55dcac2bc95b173b29d90b218c55d01c9c381c410fc221fcd872779b7d64395f68c0884a5da2af57dc48f3f5c02c9173c4fe3ca45c04bb26a3ed2cdf0570a66a4d9e98cc0a3281fb585558e4d8975fc17eb6147a4b4a54fcd8ad6fc067070aa77419fcbbab047e585262da1eff76e503fb98d153015d01c8b299429f08e21072892682c252f0034384d71fca0b4c30116cc72fbac0d825f5db112a97830cff6c8373458548ee38c269320728b759ebb1894a50d580f56f8a23bb45d6d8e5944c30d3aec5ae713ad01ec3b57cc6609da6525ae1900e6fa776fca52aa234da6712fabb87fdab903845738a5362133e464c2e6d78e1ce2c9b419ec301885173e11e08f922e0e937f6d2b8c86b5e5d09ea4c96aec8bc572a6a86cfc77d37e204b954e14716c26f6c492d1f09d208aa7e259c850e4548aa7147496a90a39baca85bea414167c05af60246927567e31d02f156c97b0b86bfa8b3832ac10acdeb0d2d119985a63ec53b436ba5943fed268b4ee4834ff0829275afbcabdc371d6da0e6e16f2a40213ff7d4851badb7bb38554ce2018c3943570059f6af19c699d353a6e7f3a5e32cf3934649eafa0690a964a5630b9d4cac38fcdc00f37b29802f1b8b2d1b3864d7cdd0cf85e635113b71bc558172fd66a7f5a01bbce42b12d33c5a38f6292e3e74a3bfc6bef2f777632600329fba507842f3 +SHAKE-256: 48db6978546e8b173007446a686e48977751ae724d4be05745ad608fb0e1e93e05a24370201e92369f03206c398633953f5ad865b9f7917f59cbad9ed40dad7ba3de3397fc1a55d3931fc4b45657727167dd9ea7d24a317427f0063d95caf29fed04f1ca2b2cce09fc348cf20bfdabe066d049de6320f8e6e7c545e87f9058cb197d71c45eafd0f249121d4049fd37d419c7469a2d591ee6890c429c2d51768b0663687b408df38c5b7c8bf653620fff8601a8025a65bb32516c7b3655e92faf3297633b25ee55168554585083537505db84ba8f815205cc804292dc3eb5c054fbb24dd7701c34c9a757e117304a2c8c3b54c7c37e0135996fd8e0582ea10ed61e0fd33573d86e24141a4b2bb7a7a1cb6ff4720b8a3eb1c1c5c4c2dec62bee460094165b86b5a46593401f9f2a97d9327215f113c7163d5e0f707cccf283b7b46ae83caf25baa2975054001275a858b0c43123cee11adc04eeda963e88cfd0c2a1bb9dab1d6b4041029358c49d3cc5357ff4ec582f47923ffb9fb13e41cacd63393b156ed1f8d413c60d4a357281dec33a1f0f9bfcce6c3051178e3e074888d466b0d0f5522b170143cd6e5d1daebba3f3c531856f58a18d14b5735acf52efeeb4a1b666987c72a25b0fb739e7b5ce3fa7b5cd0c7c853097bc811c81d23b356cf462953ebcc411dbef3aa44dfdd74006ef9d56bd6f3b87652e591e470f2fdd5c + +Input: 8266fcc5eb3f5f41f7cb430df3a65d62ef90319c7ae2332c5d6169cdaa3a68b1bda548af443309faa22bc23a25b382484d8d90586e5f44f47542ecf6279f678a16315d349c1ca6b8ef6564249f6f9dc0ff97 +SHA3-256: f5b571e20ac6c48d570d656fb8400a8cd56f24d882bb269afeec0bd5aff0c0f3 +SHA3-512: 5d99d2dfd4123381c029424cf49dd9b3327d9d5ec59d88bc3781b63992508e1daf58787adfe1a36595727b6094cb8771853521c8c8c824ac17a9d70dd72ef936 +SHAKE-128: 66a8840e0613700fac4324bf8d81b1a740cad667915ff93aece787ec6d6d1848daa5ee3eb4b34107dc49f65a273d921d202823844d79ccf62d43c5f0fa2bb3219cb67784826049c5e14d9ad9d0af09d34fe7d8c2519a587d6b92c3d108d8983ce7a3960a0a7b538eddde3bb335c9f2b3b885a4f87fefd635b9b24ecd9fba4a5961e943233ca21e3d8e2505016eb60db2c4f3598eea7829d33235449f63c6409f66a7f188838191b385ba3dff11566732aac53c60c66389438dca7c9f0b1f2f25ac1158afb18a8e351be6349ef14c78499e2ebf58c319a97a696a8c9129d79e94db6c28e1513f58a375888ef8aae3e49983c1c5552f578c8331cbfc7dec8b69721fc51b37466ab5365627341495014d08f5b8e14d43c22c90238daf77d516ad11bfd1479f0308dd7187637bc0487ad64b6df9dd10a6618654da3e0d34b90101933a23235bdd112105d52e6d125b44d4d4849569c075716ce6241d00977539d7998cd8f892443657ab9a86056cb161ed941c934d8c17f46fac5301240f61c3510d544f43a011f5765fec94ec09860e529b27f0c5c1e8e5ae7dfd504f8ebbb08b5cf741f60deac0feb16507e178131ba877665ee9d6928fb337b299b87c3bebd213854001ac0592f390a140b05af44a50f136c7a8f222ce76f3faf673476cbae1652ac67c3ddb8ef81418a99a9f72e05790191c9c7d1f550e0a1d3d00fde4159299 +SHAKE-256: 058ec7248d8a973e190c505b558abf8744ceee120fe2c59263cd5da85d1b27a99649e379dd2f4b8d860b260bdd90b4bc3b58c63bc438cf6493138e97aa6a97a720a1d218ed666616588641932e8c0aa0eb6e5b1f581718e1a401693c00972258e9a9c49ce8106292f55044ed0793b3afe05dfa99ecf64af94cc38f8c4262d866bd285d8db805d3fd38b46b80fc66bd9c36233f87cfbcf7080ef9296ace7174b0f6564d13ca55d1f868eb6c5087a648cb2111001ac2c280f2b87de3d33a2643018856bc4ce7123cd7e569ffcccf1805a724d672ed71b13ee164d182d75832ccdddd65aaca57fff3adac4c218637cc6f7815e9810d6cac266deb28db3e151cd4844d749061481479bfd3034d23f6ac90ccdcc3ea88b6ddebd18b8213f43c08ddc95f410e8dcbaa6eddd9fc7420b30e157fbb136aa92f041311ef327ced8ae0c8568d0bc2817c19fb3ee6462cd95e4455839eb2f88205231d23cd098b4cd4db4580baf53e5c5bb4eb91548ea6557c8e48c2596c4746b220690d2e3fde6ce6868c869f30541df21b3d6ffd73c10db9650ecb1ebe2ce217fda22ec763e9a095aa7c93494e6fc239224c55752191c010061b55a80a4c6a4a61dfbf6f977bbac67bca554b7e010ee4326bbb5cdd103c6ae2d0c7c6a8d8fa9d933d22cefc372cac74fdcebc57c8371c7a604fa9978ba14c668b8dd74f6299404ccb227ae3a52b6f47277f + +Input: 298323ab396aa86e3a4c10d06a1f47eceb77bffc8d03e51082f1343d3c0c21aa870703b909cdb2f446edfba44b8967816585fdf3a512d62e56f258cabb4fc50b326c116ee0ec1746d6ec4be229ecbdb7fe9678 +SHA3-256: 1ce273944d7da9455aee7fed04bd0652c20c9b9cfe92f93e661dbfb3f44623f4 +SHA3-512: 98f11eef7d02242442ece3908fef59b9625668f21fd582e31faf18a10455bab6e8f69fcf36473bf5c7da777fd537e8c80d10e4986672153320d44743600994e4 +SHAKE-128: 4f603c1a60160d3bd1f495e2912b29ccef1a0d6cb0b8ac5e744e4eed433f309bff039c70bbba98c5c45db47315e3e696adb4958f975e85d18b4ed8cee52b0ef24a6e2c692dddd075f9c8f42ab145e6525750b231143d32f10196993520914eeb0df635f3ad460877570a2e81e3f90b9d2f35cbb93512b54151171e4d3f6854706c76d9fcd0c4c074d8aebe66c045f3b303f4cd50a135bcd4eb96ec56b0f8a3a55f36e8a3fab2a0879aa198993ff2cb2dbc5b894a96cc624b7514646d078fa1376f4dabd78804f4b1e2c7c700b1359fd62d7ff1dee7f46b153abe58f4ff900f007a37f2c01ac570d08cc545053afa4ea7b632b0602c00d269998a019e8f9b4f7a65ad40e45f6bc4c3920fee8d87e4c750cb0d19152da0aa490a4cf41c4890aaa7ec1c3017fd3ee83f34cbd6d69257681a4615defdca57ce6d73e00c442ca88caeeb4e6170fb5b6aa2ea893f4d0803649840889a4414f1843de1c10e568239863bd1563257abba5d1b540821492321dbfe70d650ba4c4e606a4aa5957f731d2eef6fa5799897e54e9e9bb58501a50a5471ffaa377c9dcf4c35dba59f823cceac9016f8d2755b6cf7a43ae3958e50fb8d1674699c448df6efa775e6a1da49da1754f522b1d902c19c9b2e949a385006e38c71f5518bcb02675b32301d48117e72eb97ce8e59cd1584dc0cef3722a034814bd39a82770ddb14dc1123fffb21e5b7f2 +SHAKE-256: a1e7c4205de1636422129e772632198bc56d96a9bc66658ac4563c4445edd17c7e0acf50f6997baf1bdb84eb7b0ca2770883ebe4fcea2085a5bf2f15d7b226d72c3e7a4a8bb128ee4401ff2aa909e450ecc350f7133cebbbb7cb5d44e6388dd749424f02d49e707c5b2326abff0cbf3e72b3a196dda6f513a8eb89d13c1066308eb5918ea22d2da5e87e480ed9a9fcf91f6c9e1774a1df9c5a8d107ffdd3bc6098926b4c868fff13d3baea829734f15440d465473f62e64057e707491d0230872503c383e744919853868d2a3153e27c8ba3ef09f871ba048b7bc45ceb3eb7212bc72a33f2abc5deb8a3961c1552fa6f589158475dbf45eb9b871d6250d1d826e8b074cf41fa6cfeb963ef6c08d1322a06e79ec7fcf3d59323c234a9bb6c2761cef5f2505e830fd249f0a6698eeb897076306f4a6af8655c912984603198d5e6387cf20200d29f5e0b0d763a7b4605490a1a4797e09cada29c533213171688d1dc87dfc5ce873337b71d6179e7568589a306a4123f472b285c92c8243e374075ef5f038152f96072fac7b5f90e034589b56b63955ab16c2ed45248e2590922493b48bcd1a984aa64d0d3600c1b7076e48a7a8acebc689dba2e2575fab54b3f5329d3e682d14f8761e58fc9f254c00c5570690ed4ff1b7047b51fcbf29fed053e968020bc579817abe01233056e56c0abcff27979044ee6096abc27247e43fbd3 + +Input: 5984e119a2af00c1c1bbb47bec7d6d60fa95ee0db721afcaee0ff190719de9058c854733bee1e392afbc1c7fda4d22d6a2a3984551e90fb35f9a05fd9cd377bcd73b1eb0745a37926459c3407332ad1ab36e41bc +SHA3-256: 08da9a98371d8480406619ef9870e20637c69ac234fa02548a00818c12225bb7 +SHA3-512: 345bb1115e9804292a0891e53c0d111aa2ba988792f6d010c49660e328fddd87bec535183cdbf41109309b8eded23806c818b9830a2b5eb6197af39d663ca707 +SHAKE-128: 9f9c80a7d10fdbc9ef7af847e0b876accff1880b2321db5e52a51bfb219c03f98db2999b8015746fd7a46c812240acb3a8eec7fcd5411f5849fffb89667def36904d9e23581f0851320841747945d17e55ff856e94fad2dc38baa777399d198d9aae9f1bddcc641af323a477f1ca7f0979a658951735672a99f9d1a0d501c652bf0a65c5286245558ebb84dd4cec4f6b329a7693e575a1ca43b2f19a1a9e6feb0678cc62f5080a65d89baa2cb08c93cdc89c2b8d16d069281c0912713268428f7df0f62c227aff943e301bf5056510e8caa7c556a6e1729dedf042faabd931507dbc5ed38dadd29a7a9f844e5dd3773caae1074e10eaeaede69ff4a1572f4945dc3ed2992707cf5e211cc3b02066fcb6f4dd241f29bf513d5d50a9b7470fb88d3cf917540d9037ce9fa7853a5129f33970780a1b4bfd4ddc547e99c5c1cb8209536d386a1099ed2f3378875bb8b788c66f3e3781ae452086d2b122f4fae5a760d16c1962b476bd7a2cc2dad0a47f83dbf2c4ca1f5b2cea60546bc6a336ea28838f0ca7bf3ef6a47d1dd516851a210eb1f5233044c75c38b5b36514226c219ca2061c1958d3f17659a3d591fac4f2cb6c1dd5b14e58340c19c43786fa750a8d0acdf322172030b3cd1862562881159489240e43fc40adcb57f8b1f775b63f392ce8308b2e5c25bf3f06824d6442d454f1454cea36df8e885f857971ab952effcd +SHAKE-256: c137fb1b3de72f8198fd405c5dc8b5d0771517cbc43f019c872045f85acfca90f4b3f67757218a287f625864267604b9a678edea9ff8e66b71f9595ae92567c6c830c8c238b3ab759346f82ed9bf4241d67c39a465f2582ef8e0dc5fc531bdab6d83abcb2d70360343b1e3979fdab489c504f69ba6584fc18f26f9ae4967953e511b0990b907d0c2be60376fbd368732c0d056c6ca4e14946b6d6b08f2cc5e326f68a521b14b6c07b04124a2bce101b9ab21dc9c73a142197c1817991077e659dceb7781bb0a7d7c794fb95f8179e54537fde724f782dccd862a09eeba5d291e8138fbc6c74233968981e0afe8f88f563757a279a536c3f39aa06be75f7047494f6b4e49965b45f08c9217f868c9aced53d5d2989de55b42d625a3348fa1e2600058d88bbf6bf2fed20b52a9e4c5ce61c8774465f715ab70685292640a61be64294e142aca153ab0525e77afde384a107e4515252369bf6c9c893256c9cad2ba33a96eac126e6ca0ed58fc08ae80f88dee095bfc3914426938d203c739a7c7e99c40e85042332542c9825e520f41ae89b96d83c5be36094e915628fafc57fd2c2b5c63bc871f8e02957f5fb859a485727f15ca47826d0d71ae4a5965ed3c9fdf4c0f987091327a35c868966a1d9a37c1c0b278d067b9a77ad4fff7e465b16bb280d56fdae4a98cc0236811a7a2f35a3b09d50b665f86f76261b11832759fae7f + +Input: 51c4a33da38dcd9a81d67e5c5ad7d471067a8782ca6d25b79945f1690ba17372f72c716241411fdf61b134270536312e0ccf1d827f60b8a77a5d1035084180994ea576339444f054e90abb7166c5848fd6c27347d1 +SHA3-256: f287cfdf0d4010a0e2eed87dc8e7830d49bb8c3b86a1f1c09abbdabddebbe42d +SHA3-512: a381a1f9a5a3c2cf3480e5a33cbf32148f8aa4f04ba41bcafa75a321721b6890850bb8cdd94e7d8691541a65d3058796efee022b7cc15c600254039b7691fc76 +SHAKE-128: 557525dc11ae6b2bdadef053e23493d81e48d204e911257c32792ee10508297e975f6f23e1397336b255e154e01dabd680165348c6e23a6a098552a10ed03a80283c5bd6158ee5a8222383c36267f2da576518b8f3b7af0fdacb2be74aa258fedbce179aa2d3b83b74e8fcceaff633ebee7e426059bbc0443071059f360db994fdf933c1c65a901007a9668e0679fe68d41bf82fc8492aa167fdd08761268a94fd8872ae62755bf1e1c1846bb5146d6c7f41d5db6259c5cb9f42e4fea6838dfe9fef6c5f7c47ce97a6622eeb886eef263c7b48347c8636f8ede26ff849f30ecc827a05085d45d51057875c8f072a00fa10eb5ed5554a5310d93803d4c7b7ff020660ae1305ff97639439ee284471a0c3296df5fa2c292b5c4966531ea272e19ecf87ff714a409ead7f7e47306afd948faa667b0eeae844150cfc9193cc0f63e49ac9ee13b41b58275c7262d9e1c283731f07996f7f71bd045a9c63e2b4439e035ac2ae93e0fa2cbbf479daaf0456b8c664fe62ab60216b158cadf223d69eda5f2f35043b727d79ac5c341ddee0df202191fc36b865d924b5c21d4aa091c146cb7203e551884936a5febe0dee42bd79310459fdec93cd09196f0b9faf86d0b3265a5f0aeb24f5be19d1a99e980a5a8a292f158e2ac54d168b49d6225c8b67b0c8732f834258720c337c828c20640b6976a2504dd87b528cc0faf11dc79d957916 +SHAKE-256: ba28bb2b3b6128c1eaa40f7fad34e07cd9a58a7c219faf7c623987c202ae2a37a09ff24c673deef4ae0228b2cf368f5627657951c1939732fe4262ef28c1c096ea29853292dd64e3ba01f33ab257ac7692570dc76efa14cd5e8a61ecd752d5efcc5c8eb66f23f9eeb9e188575c205a396d54a60b0a95bc725210dd4046a6638e30a9949ee3eea7a7e2ce98490a23109fb8b6b08312696839aaca3ec790ffb1553a0edfef0c9d47a6ec90de812b70c631fdc68bdf65d4a6e1ad3a136d852dc881eeafdcaf05a6067255d512b0f86441ad2d375ba2f78282ad2e45577795906e5fe213dfe1c7014db2dec266ca893b42b90204072c55ef8db315dd7c15f7a286126de1b598bbae239c1c1e6e07a53551768ddc3398e9ba464753044a660cd08a8df670deb8bb4b7e85cdf903d1bf09f49123fa07aff19d804a24e2663e85508f9a575cb07303351f18814a1c7d98f7b68cae47573e4a65d12c671137a601aaf70f0238bc3e850e569b42320b48c132a7da05b7b4bf7822ff3c8ca41699b7cefa66ed3ca5634a19f976a5da041bd5d538813886ddc3d984ce8857a1141be5a74faa7574eb355eade42323dc30cbe8b7cd5492efd8f1ad7a36fe4ef1a34debe44f594fa2f6ad18e5e8e2bc43f109b98e9b98f1068218be13d9fea875766064f22331d85387a5fb593b726ef902d50328a434e75d3c03b093be3e490ed0bbcf6d7c26 + +Input: af5aefb61b5938cd55aa7ef696ddca26e89f9438ec35afa4e0c49b26dbf169dd6df7ca5a3f02a35a7c76ee9506d322b1c8f9399ef0e84f10191fe6c37ee25d57d1a016d0c258297c35f88b3f96531e0f29d5a3f8fe00 +SHA3-256: 901914cd3c43b94f752fdbda8e8be676c492bb5ff1b259d129ecddbd013af284 +SHA3-512: e7dd2e33e60be0d42b12c8373a36fb964b7efd01c89bc854dc5c50431d8f7edade2605141b50814c39e5bca6c8a6ecc25871d7e76868c8d77d2d91bb224be259 +SHAKE-128: 0c96a1f92e5207bd5b0f737c4fadfb150f295149c7d433a6dd8a2ced262ddbdad5647bf4db930e4462e1a1d1c192f48bf73fda06f6d73e3487b73e869774052e7cf22c9a3619ae2a8b5547e5231ac1528bafdc56b27cca3fc66291f135258a7a2f9a30b2684fbbb368d513a6046c50c5846bd2d260cf0d37e75c2d3b244c39667b3df12803a4658fc89f927e6fb8f709d14905758de13a902d0b39039c8ea6cebb65813d211fd739558724e0b57be1aa272a4e3dfef0d90396404c52d54cfea2dfa8a01a36aa9c152891d1e99e465551c78e7af69b5363819ffe14d4e33e31d99182f250ce19a9070b12ca106a5ba140d2ccdaa111db057596e399f2b18e98faa6397e0cfbd538f14d6271bd9834a3f7b17b9e97fb44acef5efffcc68d860378bc4c0446a0ff90d8a4ec0fe044b7e248f5255f185858f30ec20d12b7985154fb4ac207b11b9c465705148087daae1645cc40a2de2986ea766649523673c8cc340a4d1ef3edecd3bcf13c20c868b3978aca1835284c07e517e3446ca33b82f1984012fdeca395e356e205febd0a962c1351794b735355fafe1db65b40c222191df06c55b7676b6f883136d2f273b048864c75f42efc96232fada93bd3e86b41cf318968b838b7fed32e378558067470c9f376d4abcbabcb4edacdd1dacaf17addddb287f86b6284a106b333c6685e84de826bb0aed18436a9465ba564c6d1bdb0 +SHAKE-256: 7d52250724a0ecc27102de01f447dcc5f8f880b5c63c092d30d0b4428afaf236c3efb4db8d8e259b98d841985311a4c1b0b4569d43d92293d10df96475aa16fc2f77eee4488b1137ac155c8b86e2e9cf7f856b3b9be1e39fbc66ddf41ffedc0727d680651ae15c37df874213af12e8c2639af4304a8175aceedb90ed25a857092a90cf06e7f2de31f55586a322bf3cbe1838eea3289abdeea9863e63b8008f7178a9f4098a87380c2465577cc21a46144c84571c59dca710d31410e6c16e46b997f12a72b4558f4cc44450a05938e67f1b2223eaf49a067d173c7afb963ae23d8d7f339c2e104c4c8b54e1f687f8be775931be8c27a6afee239a2eb1668bef7124c6d533f0db0324c12105307c75835a6f5a8395222bda00134b0ad5ee8b6cb646c1128c5cb1f5ab56f7111a89bb647519be4a2ec26e58a0429ab6b9562f0b900cbdd0dcbf89137e85e10894f7b0d350d9f365ad93224c16c973228d95e40b1a7f5646c629bcae798a72a89fd98fbe4d002d15135ba1d6b31f48a1e80a581fced231cf8c735774423061dc393f011325dece9bf8159be64e7e0def54b696519858582efed05370682ad19b1c393cece3dfb84db80395b9d36efc73f3c0026eb2929c508f5a3477c96fbffff94b796f67844b7ce7eecdd0b601e74021f7bc5642123f90da2738d9a8760e5d22070d5e069ee51132e726cffd2dc1502a1f9486c8 + +Input: 587422531899b69a4210335f71ce016d83172bc0accc2a66e117dbc02351d7f98d0723e04968862d77398d195fae5a52a5553af85a6bdadb292fc66d040cf74c33fcb8cbf7a985d40a8b1a97b364e06d5a311f4f3f074d +SHA3-256: 745c6840143e4fb44533ed5a288599c3bfda2518ba76e2df4f816f2f71c5fd18 +SHA3-512: 2c19e49a0555e4c2739fefba00fbf1d31a9406473fc22f632467934fe242bfa8c644d6fe9e419fbd4f3e51ec89684718a351cfb73b9cf0e3cb85e4a9dd2ea2df +SHAKE-128: 496380cebfd7b2ed2afeee85c5f34f66e30d553ce47b1dd241620142807ecae2c96c032ea36fd74dc2a1683d68ebb526bbc2adc86c1a3a9c5bb0d59ce547c3f57aa5f750028ef4f65dc6bd2c9df4e3aca166c6c8ff30b9399841e14c380c9aca0d52ea494fdcea22539121fe4665f5309e2e8a18b8870f9cb16d36f56dfc93b97860ee991e0e1f2f898a70448edda7e3d17e8f5d6eb46e04646ca8fc35e813b3216c8cf854507f7082b025ca33d95c1282b7ae3a40349b5ee09a3f6900dfcd59f761b7727e9827a368dbd77a38d8757dce7a3f79261c8463925991b45a05e008dcbbf427a886f0995712ab30285e24d216a39b0da65df5273f78af071ed287ac01e2f2784202724f5c3c84545b2dcfa9258a83fb960b50c87ea3a1d895af20abf53c7bf8fe94e699629f0b9a874cd3203c7bc477afe4571b4f6c582429ba3f551708c0d63813e7ab80b2851bfc7472f5647f9f5c48fe776205107772af2e8c80a7dd7bce1747a3c010c8494c1ff10e41ef5a8b6b7f3d8ea19be74c92b433f0be43f469183678eebbf2cb0a5ebcc932d10cb86999cf8315c887a7613c899a0a2fa953a2dd965a21bb89ec202426b241337aa0df69a0a3845796849a9f988651d9929effaaa5193bf4d8acc08c6dacf8172ba295babf565bfebe9b11714d8db876ab4cb679e801f1d056df3577950ea71552070dd93be1c9e3d755022c22f8e827 +SHAKE-256: d748e4469dab41a98e31077395480aeef613551061c8923e4f8f4bd3ad6792d2c3c9431899da77c57b9d207812f1c9df9a13307a884f0d96f8d31092b4abe74bfd2d1db255a82f65f3f0dce9dd4d4fe39e5d7c6d77b1737616ae463d2b9e67f7bc0ef729e3f834d1068091a47cc90f112c537e82a7b1266c3b93e671087f912a63a05b6b0c6d80cdca232e14218f1d8d71079d307861273ae462420a7049fa3350bd40cbffcf43012e60573845a1df2431095d76d8de8840b4fd87e33d49d10713c5ade6b482ae9e0c86a25b668a8add1fbc3eb15f2225914a9a5091127d835a6a9efe874b08da73ed34d46208875d4d592f9cc2bb58e9b15803e4c7fa0e3ca6cc34e950b22938ac54cf788aad8ffeb8211742d3b668792c65b086f928ab91ca38c28fc8425623dad5b6207aed0a6318a31b1937c83f6e1620726817b8319523691931e05b0d0d5c53dc01bb3ec268c57c2cbb2d9d5c9a5a1ac91ab7210aa40c7e2f91abff073ea40b738ce3f6d7708467b21fbc047afae7d7729925e6ca58f29479863a004e3b11c36fe22efaf67a021320c04778b79e5a3eacd9206c4401f7bd61ec4d1caffab5b9a801b7417d095c45b2d096dce4e1b797fdea1c95b3100ef47210b49db4180cc26d6c29a2d41c9bca93fa3825fded61c3569edfbba127f76ce00f84fe86f6361d688206caa841a90c1d698120dacdeaae646c6f1546580c + +Input: e1ce4dd63d0da4e12cea38011bb478d02c9f338ee93b44374540ed3a4eb0dd27aa66b5a7b1ba4ce921a8b0783ccb2736b1af28375ccf9e549cd33ef34ed36762253064b8b2487bdb65f8a11f27848334638eea482b2bccc9 +SHA3-256: 5d8f48bb2981b33f91a1c401a6420940d3b9ce550f10f9739a14fb08dfc55214 +SHA3-512: 2accd26d6364cb4170df06e4964edb21d88fc03f306630c44811f05960d8173e0b167b26dd5ba6e205ee59429750fad81fa5eb0da0884888f46b41800de8e730 +SHAKE-128: 247230813012a82ff8b3bbdd6a5992116bd770dce995387f0ce97c6093ae60531e43dd187eb071aa44bbc324e8b49d8a998008202669e43b4596a4139e57715508bcfac38a324ff664a289246c3a6174d58fc97dcd3525b173454524cf836daff7fc578e066bceb28240b56e2d92f9bde7da3dba90e62832dc0550a298a5e158a501585475afd0579b5414009d977827c77b00bb612d02858b176df93980ac2fc4977b41110a84da27d06b2d13eb39347e106e3d31a5a174bfc801778e9f5bd7b109e354c76e1d468de7919108d095040819ae6cdc77d6bc2f0a1f3d3a8dff1f40cc3143907a271e82c78f9143f5c90fdb3dd90390d60af99cc9fec5ceea413c667a225a2420d42d671e60cd2ae160509cf2a6e4fa6d9bc92955a3a635f1d198319ee874dea47940274e84b3723581f3c4fe4649e378a43a012a74122073313f8bd405484e26d46d19ea7713866c9696f23784235850308054c0ab40dd0c5af88125069b36ebf06717ff1eaa2bc60fd3780db465f59ead5a35382b7dd567395fe37299f8ea13148b87624530a849c2131f77ef3f4696e9db1845c4eb50ae85b44a428d1f01f257f8efaff0524807065d4859507f6d5927d117fca14baa6a70350cbeeb82b60d4499c0ac205a2ebceff921672e51bea674f342734ec04580ef53665aa24003fae748332625562c444d5f3de9a6f390c0e9635211cc998c670d5f +SHAKE-256: 14858342ecdaacacbf11e359e835cbcf58ea9db1f1b0db9581f9c7664c45b9680f3efb9c73ff7c6baec27f8be31434995bcbc48f720867bc41dcbcfc5a55328b57f6776f3433187d2ac668cd02b471d5700ba0a5ae75487379422bce671ea8599e5ab109a7bbf3a783ea8bb09d52878260f58dfa71b54e42e23a9f1618c45e70bdb7f6507a03a59c177142cc77b59ea7e627a329a0edd2b5357f194dee695a5b5e660ba886ce6105f6296fb3cde595a3b204c543d20795aaee7799c8fff8b526f8c0c3df86aa6786eb0929d21da3f9a6947fd50f2bc78bd8be825861f9d4d9326c34952633a316d56367173e9fb6855e1e0ca674958dc6deb39f226d0964b91ee63ea060302fe30cbe7133a3f8e7ef86db6a2507bceb5403a4726e0a0eae04afbe61b675f063cd7b9e55b7f084598d0db11ed433c546a8259b85bc7f382e010a7bdb253b387acf7b12a49e9a012adeb1ec9ca9883808af6f50e0dc6aaa0ffa4a994160317d8ca8b905f26c2cbe86c94c745ac53115358edeebd796563aecae76b7e7dfe89e18db56cde0214d49922730a56f882e69d025c0e3658cb4b2832eb8a3fca57aa1c4236e70371938e270a752ceaa8a45ea045b8fe47a4059270acf5414df3252402fd57fd51acc7b14f2315540372bb184bfd1cb496284d0e8d573a903054a449f3bd3ab66b45bad026485417b7d83bb96f7268cd367e0355e9fab75 + +Input: 7d3b2faabf7f0e115074f9ea9abd75c57408ef1110422f7ab6aad7d7ba16114323a50d852c62c89e2596e51553f64464e57d80e3d3db023b5128bf9db397d3ec6e1dca6cdc4cfe52b701be280cf50b74e19359718687bfeb92 +SHA3-256: 0800cbf70683163396596d298a4fd71499256b085eec12fb0f3dd48f55179b92 +SHA3-512: f5597d5d3c00620f8efc700ea68c74179bab920f26e1645f1ff4a4c932a962a7d14da5e4face8ec339d7e624856cc36b742d6bcee1fc7607a0de58f1d57fb277 +SHAKE-128: 97d219b4922f32f8e353d2ca1d6f84a7fa2045de30bff7d27429926c43ad8a189575817096a145ccfcfeb7bbda0949697233af85d206eaef7794d2c23e5ece28342631628227594b2ac7b70ed434576802cd986299e495359e3c75c33ff1f37ce4ef00b8f17fec6901e4504bf84bb12d53eb66295c945c1695ac6452f446663a920f57e083198d00ad964ff2832fee8da2cf6b033d43396dc8906cd44df14b4a8ae0748b08dcf75208f434429c83bb891e9af2d2515b670249e75936f1300032ceab050e07d2c31447dbbfa2f642814488c6c7dba32d963429f13389addc3f3c55eaa529c13c8c5354904abcb3823715a141c204031b44a861bc610affe923a7c375e6b0ad926eff423ade762594328c8faedb3e8c80ca4aa68cede5eaa14a6eda6bc2d786211ac8306e45acb013ffbdfce37b9234d73c7c6c8519c15a28fa6a8c17c18573aae91faf358d52cbc3f0da810b5220df7707642d6ce7d209a7cf13e30860c1204ea16e34bc1c0d67239aca9c4d13b58fa588e07f4ec88928bfd6bc1a292f9d9b669ad5648503eb1e58050643f8861c87339c8250d2fb4341ad5bf5edf41f200e43278f6a654a575cc4d6f9ec794c84f9d060bee6ce9e47027ebc058f53f262bc322c4b9350e0ffb209cb18a382a39c5a80af6e8b2612de8de7effbaa877a9a76ae923badba214b8b579503535114ad6cffeffe80bbae0513beca10 +SHAKE-256: 38084b2cfd610b21711da5a97f92e3f328ac66184d4d36e629d54e311fcec9d15a4d2d4ee69b17fe69bc7a5ca3a335473121551e0b39afcec96e77a4494184f48d1e8117560b17f3ffcc644a73b6ccb629b4fe8ef8bea791fb90fbb9ce54c74c4ba2a6256b5af3a62b9feeb9439b75b0235bb599494eb346aa7ca657b7005b65f0fe4ecf379aef6a84d5d8e0360ffce7a6fd49fc30233f6c8d4d8d939927dd8d0d40686ad50d6af985e5df41a84cd3ecbff083bf5dda1579d116441c69787a1d5b0e15a14806fda0005dfaffc67ff482f7dbfcd91f5167d8f735bb37e4cff006d8b4ea3632869d3e607410936741d471b98e72b87be1c4a0f5f109e1e3dc823d377fb05d72ddce8f35b923f89fe5be22368be895d35e314649d5976c809b8bf5e54741fa0976e129e812a30965678c7fb2711c452ecbb72a572c1c8eb61597ce8d5e175a0f7c50be56df02711734cf1319729652ff96340abd14885af1168af7302305c778c4c784c91689f6869ff143925252e48aa8a776fd599ad333a88cc74881543f9299829ff7cae89fbda115a5f138e0836e690382171046ac4ed6ab7dc3a394d25a4a8883c14120204c35064af70871d0c70d30c2b5abf8c5a2e561443e417d7658d76c78e028ef9a937bca7c6bedba3ba9c82e3fd5e99de1e0f717964d3d5b739a1f17a82409d5a4b20426ba4829389978efac6faca990b1ce265088 + +Input: 026f6f6f05302933c456870c990134163902de8c998b7bb8cc0b78daa9d03f8a0d8c038bb7092e07dd5ba00a743cf7cb4ab8e3c7b6b624f2533ce2c4233f4e352c43af2b1fed779916d79a8fea06bf8561c2881fe0cdbadb2395 +SHA3-256: 84b7e0090567d3ac3ace568927aa57aeb4b4d88d7466d1462267795b253aec18 +SHA3-512: b5541ed65d59251d1137cad24de4979a3ffa0ecda1384e92ddbacfe6d193ee8bd1d582aa2d73eacd1f0949585becb47701bd3ab764ecbf8ed3c6ce32240d1e1e +SHAKE-128: d27510661de6066bd2027ff51f41d66e5bfdabd3fa19f3c47d1c8607a96c25225f5df6d7f15f8e3d92a53e47e9723ad33ef3200fa9497a0470b6eecfd98df477b3eee5d8805f73efb589518c34bb54a9794efd89d45490526bf2017cdd57ff93f6fb27b98299b2b151635853abcd9bb270976d74347d9cabac6b6cd8ccb5fc520150790934445fb3c01d748f1be8f86133f36a533678e55de791becf9448e1bb07bd7a5f8a94253915a2c717cb900d692be20c5099ae3f8f16b7f477f5475282a632471a1f1e3773b64af8979837b0737725ec1840e41b8fdc7cdaf60a9e3b451392366bd555e7c9087952f5cc88986334e081d4309450665163f97fb4d661797752ad1d3ace059b94cd823246ed49f1ac29912bd96bcfc284fef2c3bb3473ad085a6b7e337378056562134a20d82914d5058c2e12d5a7b8b8bdc78bde3d0371fa5d83072321cb6d4dfd3cfe023a5fe4cfa9647912fbc7984afff4d918f1c436bb0105eb12194704107532edf28db65d538d38a739e3e2e542e449d49b96bcaf36816cace4382d2581a6f92d0b193287e88ad595d635958dfa317f6d5f660ba3f43df86164bc2e7fa092a0c06b0e47cef34d4ad135d9c54eee9cc0f53f621e0953511053ad42f88113638887077a9fba0604faeca893140e741daf4207ade4cde04ad7c865590967deb43e82eb93c214e8b96f50927d04782e934e3a71338f87 +SHAKE-256: 250897fd36c8abffe12be394df2b6e3b824726ccf3e593c2216a3054077de7e34931293dc10930abb7f8d82749ed34923ee7c35ffc2b7030ad053d38a050ae70cd07f3963a21fb7ba2bdf93a31696a1cbb9528855c78c861bee27f42c09dd2ed5785a9cf0fb3e23c7b48d09b45fddf594dce4fedbd87f3d8acdc1a6d90b787726ff031326cea22e8a0e002ba77f157391703c04c7b0d463cb9b41a4e1a46ab40f6595a31b10c0fe6ad3165048610b04b5e42484d80a178ed989a585c4f29dad8a1033dfcf507e192ca70c1cfb7bf93327f30cc3179e1d9fe608a6bccc6e6b247c5203c2856e0063975cac8f9fa78d9f28e1d60ecbc3386b4acb841b3c9c43c04599fb4f062793613770a5504f7b18f01aa20a1efb9ceba70fdde1f6914cfc300c6f4d6eb4877191d8b41866b6f08beabeb523528c28334aefc8ed68311d7d04dbc215fd0c9193e1952991236ded46b743e50bdddce37917715971bb958213ca0716dae67d8f217d94d6ab50c757c8680ee430fe4c448aba260f3f677c251c208b7e4cfc743711b6da6b3fd7070966230093c245517514cf1121d17278fa976b2c426840b52d90cbf5456f6227aa8c778f6381251d8c90883686e4dc854d0b63f76687620e3120a7d308288c85296f8da6134eb7105fabe487ee0ff497751921db85ccb66dd0eade3736b332d104802a51aa4a916e72c075d7fe222994e3913d1 + +Input: 9d23e38ac6706488f7dd2b6f87e3761506dd7e93a7b3699d87d08967aa52fa64565cfb8aa8e883cebab09fe24ecec25a6e908a940933182eefbdab8e63243aa086eee375a5759e0631e0dbc8fd4f2bb5e7205502ddc7ec2e3cf02e +SHA3-256: cb4ad71cea10814f40f3bf9b9d4d645fe3c19e85516800110d40f8ef73907b29 +SHA3-512: d90d6ffea56b9c241c931cc3decf892dbc188d30ade4c3f6f3f937f7f621fb2e3747b394ccd6e98f94d6367703acb576de7fc1503dfa58d9680520969b83bce0 +SHAKE-128: 55257719bbcae66813dab30ea0d61bd99999b36ec3f5c70d4e43a767eb14ec9d801e5cac7ddff3953d28a68d5add288a227530a64c3ab12702ac7e94c9b620b5680e25e4ce407a44448328679351554364f211f56acdf44e159a9468ee25718aeba2ddb033d8c6062f96af674699bd9444abf79e90e171234bb5b7018a22e96068a185e981f718d14644231079d1e9d4afd547f43fd441369e286182b740e14c5fc0ddde0d5beadc84f80073304beab8d45bf015560bdc80e59a9bb2c686b587fd6f4e19dc9921fab0fec24ba1f3361a3ca7c57d70a6ddacc15af87cd7eac343165e5e8fa700193a94f3a4e1b326ea4e3ad630ba713043a4ba78a439f274e6facecaf4176c5641661f030160bcd806fb904c0b715d3e7bc603f2864533434d6c500a504e374ced40fe08d0e1a4d3a0bc689c40962188cb8d8a82b7fe5a91154c98470e4f59c06d7d4d023e3701619e6303a06fae769dc12d7aa4eed45bf7b5143e472e905a837f9f2e97e56cdc9f0b0661f13b776e7e61c354c690d56dfd539690a8230a10bfeaf08aa046f3c5bd8e93588acff43f23b6c5aa48826560a61a0a89c475cf38888cde67e8a316484038590013727033d8fff87f99920bc13140e2806818b14ea027433fea7a4392ee321e7badbfae9ab4ccf5bd45f15953fb9320d3b05736164cc77a36c5bad10c8226217ad3cb2eb89df387b67154981901e68e +SHAKE-256: 21754cc0bf73502e459215539932e58d15eec9080272083e1d37866f5dc1fd55bad7ff611920359401088c02bda64fc5f1241b9099ebcb293bb90bc27831bac0021400b7170aaefd019d3e2164eaa5df1b422834f9853304e2505d52f5b05a9a43eb69d7896355527c4ab233c7677e9d5c1ba778a57d80a2d9e8373ca8e84d252a227101bf73b8df6f8296187476f2ae50777526d4ce3e3b9ce53f7e5fad13b1cd5c1ddb808f1ef7f3b1185a772a0dfd81d25a9d677b69454319486b48dde7a5138ee634cbe4a1f21770bebfdd069fb119d00eb45997639938f0e1ea09a145b87276ac242595533869ff49cf341fce485ba63d3023c8f9f015e8e0d42932087a7d5b9df36b960a31a8ba963903767dea2b166d17ce346722c4528ea083848a1df988c54dd61406c1e2c2702bba80bcac21c26fcc29721a8aeebc22cfa194e8ff7be9d92a43c56ec239b8571dc26e5b4a70c5537973322e08a3b121095e873fbf125da1c76a1ce4c14d6311e93b0341f7339842d5e87249b15dda9f07c0212bef7a14fe0afdebd7002610b487888768268e74ec938522ee1597662e797d0822b858c2ea888c78647bcde64c1411b7335fa4c23c6151e6bba93fdf49c231e4c64e6424690959d95ef6ad792bd5077276696c7cc31bf76c5c0365c7431b4b32c37b526762dc2f849b60efb10636a6f8f87337f6512c0a2bc29137ee7d4b908793b3 + +Input: c6361cb5c9b8d03b126324ba43509f9fa8a0628fd59a45315f7392b4f552be15b3cb1fa668e70f038fc272de922118230d12848915a77a80d03b5edb0fbf7b98965d0fd9e2bfd2ba999c1943c32439ff017b7c6a5b392d6daceb661e +SHA3-256: 54255d6afda6da8ae4dae17943d3fd52eca903e6b678ebc13b869f3aec4edb41 +SHA3-512: 180d74a3318fe1ddc6f98a788ad52ed30cff77e31714a6960f291b476501e3a36b8444576fc70809db9b08f7cbe7c73a8b4c87720d9079a05b1d6b2bed8a9f99 +SHAKE-128: 0c8192d81efd7bf6b9f357cbbc9464471e607b6b3dc59507848026a94822fc8341a1d14a9b31e34596933c2ef458ae33bda0fe2e97618c5c1ffe6ddc0834ad9337ec1ebe76c6d48de1c274e75888f9f666aedaf5bf3bb85ba8fbf7b08bc2a3fd325f3c22c44f0fffb59da41ade87ba2f537dc9bc9fc1353c66d36f0d079e042689a22a1439c54045e3f2b0cc535d34ef86b0cae88630e6b112ec2e88c99aec71a22e974f2e6a25d8a748c27d51739ff2ce97ace19fe9ef4d1501684e31568b2fdcede38715b112c7e6e8f5b42b010aa3c0a80e2e28cd3d32cf9332f8fbf3ad6ea87136575fa4bc6809d00174850988bb2367737f819da25d36c708d00e2139769a4b0ecde6da112f4b9bcb3f7def59e407d1d505496b782b8c7e87c5ac9ce619257739f31bcc6dd7c14cf100d199d12939d7e2a8d492b4bcce4b946369d999de580ebaab9c5b39ed89f124b1c6e9a3e9ac396d35d08d0e3cb4da9f42c14999724d3ae54bcfead719ea4a29b1be840b5db9b2261b6ce81d857be36d9b6dc6ad169a36c98be353ec2f944c69146fd1c07c03bd80bbda7502af326bda85e6d574b6bee682f0e12dc2e8edc686ba6630c88f6e9c8fcf4a09137cb53f1c556b13408e3285ccc07587c92550fd79826208586a4b14d122d78f2f976060fefe4edeef0c1f61b48026a2cb8a2ce5f9692e99759b9e34952a2fb3d8aaa64ae6a9ab6ee136 +SHAKE-256: 8c6f9ea5a91b61911d2ff807a2fae9d8036bd3e111e7add0d7fb2e336977ea814747d8585543028606d6c80299fb254ed1ad5945e08be0f05000ee3523234fcdec189470dacc349da7fb83d97ad39cfb049d01ef2399f65320e7856a872e1cff75bc096126701082ba6aaf2dba67c9cee12d1118fad215aaaa6c5cf9a2d398ed61330eaac68cf988b2573cfd616b720cdddf5781b575d965eb175e56092c2b409ce9247d06f7d572f41a3eb33e4028ce28468803fcd9387c2394c4d876bca1ab807da19c62c81b3de6ee4f476c9dece51f01e37a7c5bc9e71e5ae258a91d609f538f1c18273a704cf2e220db241474a5240cb4a9ecbf978201c99543a60a9fea8f5db2f108b1a3a335f3b9a40425a62c9c7e4d8666f2f6f25e23477f5cebec7fe8143e0153071acd71b0d773e340c2cf484738c613c1de3c680412d69ae3fc367c3e772985b2ced66c0364d7dccb2a4843f6481f26ff0af9b30dcc2f4fcf9a6f07a5ca8d0612866a5913cda9ddeb2a6c763e37b6c8316b6ae4bcabaef53cee189cb5316a49d423820ba967bfb4375148cd33407cf77a23215884ca27bda0139f970a0db0c93fd20dac887145644326db4751c865da2f41c43b7489dc6f156953371dd1f2e5139aba252100a61c8eab517c5f4326133b42d1721737c8e43a49720c01c55d279d511c9058711f33a43bcaca341ff065758dc968afc1d1373920c5 + +Input: 7bf763dccf44a6333d887207bef0937e665b829b04add35a2c6c6b96137993b6b0e5fca1600dc3b70935ef519fe86c1831dcdab6c4589f9104dabdadad69765bdad6e00fd651cda696bf9705f7db40a720a1aed47ef6363b345365c4ab +SHA3-256: 0200275effd7abc405054a471f295744c11ac480bd68fdb28d94b6e0ee3cc396 +SHA3-512: 7f4509d8cf8db08cdf280ebfe5082f987dfdc77a35686661661dad7947773f626fd8ab01d8cfb730f05e1d466815b8465c74e7b836b29b8d8b1a206c0e7414f1 +SHAKE-128: 21de48aed9c76315176999df80996d7469c099020f65c45d4be7ad89f376c89060b20932cd066e520190293fb3a8f972ee70af41d125c00388ce945e3d6415444d65db641254a79e8b8b78330822d3d7959c674346997b83db3ad2c0e3c603435661528a93429d821de449fb4b58e1441074080fd2711b5c16be28698bbd9def1c1eb7c6a7a69a72708ae169b0acae6cc11ddf87968583d865fe068732f3330b0299dffbff6f492c7e51634e2df9652e690bc0c27b8498b374628cf7796ceb23073533487fec76430f6b45d9f63fb1c7c898fb65c77d0bc73e6149cbaf6ae785ff71480300bbe8932f353fac59e047f3c7a9afce44b94c1c379207acc431a2f41527b405d21e4816c6a2450710e940fe64b46854f0179af91fe24c2b5cbaddf1b57a72b06d80d913f3a055cd950a3082cc6eca922a42143cc5eb6d45c73019e5e669b6d3d9aaa340a6ef2441ee9006ab1060d06a304a9e4eecd5a0e96b8e2a58236c1f2a4faf51bee1a78f28766a8da29ef28262c39483a75edc23fbebabdec83dc19f94e0a2cf7742f0d9782671756f1e0e01ea8866adca3ae1b8c896c34e6956b220ef8affed3297b2747a0a64ba4aff09b1de13f8d64bbdd8198a9b03ddf3b8dcdddaeb74d98cc071126609c9a9b12bdaa9281be176c76b1d39806dd52c9ca8eedaa10d41f13a1192e5bfc204d484d4b42eed1905b69e8f22bcd3c9360945 +SHAKE-256: 597dc9c838d9d63c934853118ef09d7671cb29f248de1c4b0824fa340d96c56896e61cb512ed14642aae2e4b6925251918ad8d38b6b9b81a4c2518925e73a5aedcfc6074c72f8655d5e61bde0d282b7f01fad3b2877836566643d3a743022fcd7274f696d35e1ec7fd742fc8b522dcfb9fb6b0b8f39dfce2956d667cdc509ec8e39978db96ab0bc67e3f3bbe3b8985778ca8dc619920ca05d1f8319a2b353925900310f22af11284686016294beb379923ef8e83439a63302ae0cc4c4c53a6c2d24137aed274854a0ea359d656de607969bd0f9195a909ee06fa14e26a0308a2bbaa08c51963fb7165669a685ee0241045e59362336c8634967ace60786f92c53820b4383bf0c142bf23acfd3d896e885bbc1967be5fccb848eaba4a0c7bf9f8813ad95d9c791bc1ee0ce11a7a43dfa6dc3663eae0960279881fcf61d361da95208a5f0a1700e046ea0036321091ada9e686d5642e9d761692045e29b9e8e9f5a764a3c1e92c093a259091fb6eacbb9744efe5875dcc39c9a401b746d6d3f79100714774551318a2c0c3c11510540cbcfbd86bef903d2324e993b01de429a05d4b48faa4f36ac2345b6546d8ce95739610937312975005b3e5574a2a319fcfe337f57dad62c9849343f778b66a6179a58c66503a4769b397d404ffee03790b4f2d59770f74553db6a0cec5176bbc466a476b99c93ad36b50c0c59060d390472c + +Input: 5415d15820000e1a488c2bc7076b50cd22befa33c2915146d092615168f6dafefd806de15a3144df50c6afa546e5057186bba9722afcf4736a6b70a3a10e56fd74243f89e812eb3917a6f9082e794cd3f95425bc8d53b93663b07e738100 +SHA3-256: e74b94a28b1cd757b863f5d1f4467dce3b23840170fb8c96a913d236e9426173 +SHA3-512: f06a46168dd515fd8bed004a066fd64dee3ff932d19f461039af26596b9e99ce13b80d1edb15c9866c2d4a6304142eed9478fb8bd41ede252c96c43cf51975bb +SHAKE-128: 2b976f8eadebe15cc99ffeb62eb705966a45cd6835f4a97500c190f3ffd875336a5b4a5cd54c3a9aab605f19109a19e8465504395ee6db7e6f0f3858ec68a6a7a565fe4566021c55a7cc575b4e9b168da7715518c7bf8b8153d5947d19c69314d94f66fb41a4fdd4181bf5a4381dd042e36f57ff34bea5557acf4f2b1b68e6589be1feac46dd466104f6c3f849d77b1035114996696abc7862b8ce2df12d297d467ef9fb54ec4ba4a150b399ad6cefdb8ae40794a99f4ef03ee88c21021f6b787b2c19286627b964db57b08220ae39687be21a6582a2cd83d128b8149e9820d88ea7aa3ba970678c7a04ca2cefdbe9048b64a9309ca27acc0e11ec66b47a55c1f0b4b89ae57099d5774f063bfc4f2dc8c446a18ca9dee5d79538473d569e190c53c856df8a03f8fe1ae2e76dbb5a21973f960ca6a64eb82b573533e2bb840acc09eff8a3c61d882b29cc417208c87faa718770567a6b8fba8d3fa782aa9a69bb9429d40cd1361d5251b573d3c0b89656e74292c661dc9340d65a9a737cc37f1b2f2515985941126fe395501ff762114f5ff61e44f88bfbf8cb5f53d4f145cffd72c105dd76247f0fe814cd781f20b9716db865fb7d553cc545fd691053dffc0088fbef6042f77f2f0458bcff6f76d9138789cbf91936ff0f00f827815a10cb7761da5272806885d2c622172527f8952f37063be01e5a279fde34a0ec5b2b8bf2 +SHAKE-256: a7554b32621046f3e5d68e1ead1437fa53749908912275d445972a796dbe168632cd0705b3573fa01b7a14f5e101b5c4f31fa18d059d0883075cdfbf8bbc67211c9232e9cc05bba2590fb29b0cede00fceaf37bbf9f671197743695cd3882519965a58dd171d20f8194376ef4cb229d9bf4978dbdd859d57f101f83cf74f3a3ba306d0431f8fd07423513960d10295d9016b7b4e74eb6441f6b4c88f567329ef7bbedc89b47bff0afdaea325fdff7f3d5f0ea87f89f08fcba941c28d7a96604e1d5c2a4d41f1b0274bee3b43a404c9a956f3db677e3e9a16c5d6e6436412a9a04e04f3869263e420be3dda6a1c98e494f999d78bfa92578e89ce584e13eb6169cb13cf295978f37b058faa691a8f1fc1d8c5e6efd6403bccc1a078351b90a9c6bb54b849ddf2fcbb6b8339e04ba8e305135cb4eea8d2c743c3b822ae9c35e3b284755c9088143c1dbfba7af07261387063c85a81bba504b6883b894f6ccf03b676d41de20b57c4cc6cb150673cb6fa3ab9bc054ef0b2f30f77c6639669b015051e01c33744c32c48151156f0a054806e3b3c59ad220003238b7c99a276b0d8b8006f04c38af016db865759d8d45201056494eb18a568f0f107b4cc40964ac073539ec18953b692dd0b78050fd3f6f52306a9d4d6b76ed1ddc37bad9369b9fa8a7347b8f34ca8874d666d07a64519dbe9af724a9ed582d9fc2e5e3049cd3d40f6 + +Input: 9fd6dc35f5a262f697280f2f02c5afb3bbb8472368510c56649732a02366e2e30986239cf17b06b12fbdd2a2b9fde72a4d03ffa2cea599299106415735ee3e565fbe194e2daf7effa03ff1eb655768895c41feb811a0da9621100c03599518 +SHA3-256: a1e53a1689157ba4e3eebdd453483b93decf2e902410e8b96375aaea3877602f +SHA3-512: f926cbb911690568b3482c542818afd24c9e3f0523f5aa2b619131449df498e91e1c51a03d15e26ad6a105d0cb49e06b25076e453159ce9d58b13fc3604267d1 +SHAKE-128: 8715cda875410d832aa1fd358c47f3c7480547b2ff4b171d062cb8a5a8d8787f3e316056f52d1d9951b2714495a42ab9b48ba509b91f1aaacada87c28d7d5dce5469c131373d2de9fdebf0592267a1e7667f9bdf11f8347626b69e98ada84ff2cefa5776580fa0fe2bbd99c0afce5fb27922588203ed5c3e18b68ba1530fa68e4277ae5951b64b39207088edb900bf1be512019320c0a1ec59d2983b845577eeccf7cf6901b129aa62bd2dadbe1134a721a6d05775855c0a79a12988a792f1e630a53828f23fe3644f54f6be9ce3fbe69c432f5d96899c5ad8a2b5eb72c2e90f9fe625c8e2c9a22bf153f53ab993939fdc642d9afc3d1c0402626a58fde974399cbf872a38b6fb518cb19ccc94f41a306d0883404926e09a6d5a6faf069a5e95ad56e535511b37c63d668cefc770b73384c391b629c7a2d0b8b10a13a8dc4e91fadf0a233e1c3bd9f804ffe715a57ffb7ee761217c4b7532bdfd63f8c6692f9478fdf89cf5e79b7ad0cb6d50ce7310ca269b5b441617773e7ede9b34449f6d21effcee39bf6c09b85351b7ca4f314b291b7ab1e665e1b2131853af28faa5478a054d9e21fd72a79cf4a8c2e252965a291075dfb2effa7cf58307fb0f1f9d7909961103223c53eddf8f058afdcb72e3cd08953baffb6ac6432786a65f2907ab2d01e73d48e13bbecb98e5a498e3264d5f9c4d49cd99b6391ff6cdb7c62f299bd6 +SHAKE-256: 94d6441be046af6d276dd611826b017165fb240cf6300f37791fa5f08d54edb1c92e279fa1ee2b4d7053bff2c0922a6c1d981908bc14a340dd5ae636ce3f649b2dfc8fada905941a023f99eefe1b2f2cbad7a1d5b4ae59e7d547891527eba4b26edf3afdbe86f8f64ddc4b8e544235998b424d73f1025980c08db26dc5e4a5ece1b95b0ab6939df0d3f127db81af87c37612416dd5f8a209c81a5c97ee7cfff616d500c69a1b066b6155a6a58e27c0ff5125621449ba614803fe32d667f93f32b26ae23783917109bb8dd92f1afca98add622a5e253972d9b54aaae0891af9092681c1c81a7d34021ffa945ad0c25c7c76cfa083c72f6a39c6a884561a22d9334f1411ea02bf14ce793e9c1144204ec20f60bb72e6d34390df5d1f5d1cd6967c4e3d1dff760d2f46ff403bebc4bebfeb7118595553a3084a9f82e431a4e0c3113f3fd9a7b2bab8710bed6a605de0e20ad4ddb8e98a321d77ac46488bde96799456488c30795fe2d35b35900a35533197cb4325655aef35f068c2eb084488e97903af2ecd89cfb753da331938b994d075277b04cf45999a17c71d4fd5cc09d2c9c8e64907f7b1580bacc2dc47a56be480ffc008fd8a2bfe627133e0e48e0180dfb1d51857a6649b7483fb81773a0aae1bcb0dbfa60518b438b60b4a726a5ba20eb5ffb3cf9e0ef11ace7bce448847338dae24b25fed4f6a163e8be81cc9d9a43b + +Input: fef8f97e9c7b78604bdf862e367b530c0e78fe440b2a9b9d1070ec5ac3c54d3af1664ab10ee585c74a1ff66adf4071ea381968cc4dedb45d54dc070b0b6971c966feff79a3ab4597ac2ea4cc2acb62cb977c99daf1fac18b31cf7ce582e6598e +SHA3-256: 71fc2ee2b0f65d92a641c96de854caa02a091f4418d24ffa330a02ab8ab1d114 +SHA3-512: 1996c82450ba523bdf777e428f1e92d226613bbb40f5cede9ef7452d9f128be2ac7f013efb991ae1d0b6b24d6080051f7d5cc68883ae69584db094d8861b00bc +SHAKE-128: cf60cec3e74ff7f2872c7803f1650122e1a4b60ba63fe0709c43ad2e79e6cb1f3f6e5c56d5360def71c5ce548b90aaa967fc33e94f3f9cce40e705c2e6e9648cddcec54d8bee72d63b8cd15a3ef0ab530d391590091d70c40835c5fb6929c5f6212e1b26b59945570eb6671843cfb7b277883d2bd7aee517477dd78c9e1e564507fa7c8273f0c34a25313e68624d50ac600decf4e61bbf1bbd89848044b3617342ed7f5b1810ab2a2cbf76fbf2aceaae1d46dda5b43cd6820cc08be7cb7c3a4f0ef5b1ccf0a21a3a43ed68dada2ad7527007ed0dbef96bbb7431dbd2c74c1b6573fba73bf9df1a4213ba567e1f19dd4c4ae047a8e5a2da7fedc9050b460775e9ac9ee356a8e579382e50bea24c6866becd19f723ea3725f49381fa45194f65db690db4450f98207a6f4a7dc47cdd89ae4633d936479f6640b1900e77f6d075a63dc76ee63608c66e434aef6b2ad9f3224dbeadbdb515812e7156842a454f55efd407f4e6cfb4a08dd5b1613be47aaa2ea76c1eb75e2647e28d068554338e314eba2bf82576da349b63fd72549da7eb3f391f975dbe3f1c774e6e39708c7973cfb045f1b2e4fa3b34414ec9f85aaf45008070f1d57f0c3874b5688d515b636c77ced23e0557736494dc17d8cac3b3b161f3bd66513281ee26fb48a4fcb81d1882659e8b90e4db542e705e85898c7ae8e80590682848c0ecf371202eecfc25b1e9 +SHAKE-256: 8531faee306337264a5ce4dab36cfe75b6eff44682fb38d3aa571dc4f6832546a5ccfa6f8885bb88d5f2ae04771434c020152212b09ea62b8eb5caf805c66ae10fe05f2df2baa5a96fa4b4df06e80422df03310b5255df69a138ca9f28406d9e698e5f0de7afd6b2fe3cf652cd0818b0e096f40d88919f41286350a6026b1ed629844ed79ef3436a77a25c06476b5047bac8da8187507c7b0772e12ca201fb6f0c2a09ac30b0be1e9c3b9fb7d8bbd57d36284d307a187b8fbf99ce1d52a7b384c312b39d1634b1ae66a1b1173e0991098357c887378b2b6f96b66d3fac9d4e3bb8f772288a627cc4d829d59d573ac734da755d61166d4cc350dc1a29f4e472cf12170e18219de1a5c396fb874235eed26d9dd04ddd384fd85aecff2d55cd10402e3f2024d96981d213532b09cfb1199256fc4406241dfa0affa4a607a806083fa7f406d74bb05a5ec014bde3b302060153bd683d542c1871d80af259c505347975fdaaaf1c1bfd83538f3cd0beb068bf6f75e308982ddf578245dd9058e85c13a559c2ae06e3dc1771224873867e92c15a45567309981ecd7f452f009ada7424c169774d83ce63e0a2c92102ed36fd0ce89aa00981f148ea782e4d4d69b4e1bb55bc0cf24b2b58976c90f6fc10bae429e09cb90ca4b751ddff5e4acac52cd99816f06c59d82a174f03126a5123ffad873156abdb736b9716c1015f92ebb4710a + +Input: f3d3226eac14d6204a72aa3814fe609a960cb49b23ac29bce72d06cb378f7d29a1483f99cd0ef4902cdc5f819ea11eb871bf6108157fb05937e9a580395eab43b9feec72b69561e066bd6a4ab52ad60066307919195320c166eceb622a1aaa8779 +SHA3-256: 7da625f7af3b57ea3bf2826722d03d2e0a093f7fc1ab3be16ef4853288943cc8 +SHA3-512: 33a98ed1590484d60b149507a6ed6ee13200dc356608be4519b2faf84b6087efcba295b380f43f9ae372a83319b39422e96ba7dcc44ffb419f3c465c9fa1541e +SHAKE-128: fb12cb4de9e6620d1dc75962896a66c3ceea98b40665529be95c11c10aa733503228536401ffc38494af704ae73462ba4ec0ca45c6b814bef7f16414603f9d645f5737c3f8fdf14eae147cdf4723208de000d1bbcdb0fd6787c2eb3eb60645f170eb08ba6738e8060ff248a3e548c3229d92fe27800ea7729630bc7e321c192a1fbb2f49fd052dc2bd6746dd9a878a53c2ec61fe31daabb73e9d8634d4e9fad56a66ab4f19901b66b6dacc766bb8250e880ef513416f4dd3fa42b0c8b172c8ae199fc8d4e1d0452b15d9865692e1ea522ddd197b202b96d8321054996c509e068c21aca3b9da33c1dd7caf2971c4e35034a0541bd54d4dc06bc9fb98837c3df04fb501944e1581710ec7a77cbac83d28a742f519d3d42e1440ee765b064bbe93612ee64c136fff202cce33f177f9309d3e1d3a953607a1e6a836da6ff5b539fe78aef1bba10310328baf6fbfaca69a5e72117ced8f3ccef57e668d1b9c6f32a2cf81fdbcab441e8af34ecea7fac38f05366a516e33aeb5b119d4e0f94317d641f6f546c659dbc922d24c6e1102098b344d651a7f79c2f09527789c09f0fe3159ef6913e910c70dbbf7c087ddf26eb42abfca439befb7794785cb88205465678afa9d76189baf1b85bc8b059261d908fd9f096cc966a696184880cee81759e581bd4816e8980d016702e27dc730a9b0c87aee3f23215bb62fb459153c5bd107e6 +SHAKE-256: ee80e5705f423446c944c123efbe15972ff72dac1310fb1c010cc66d1bb21c66084b242bc39bd881e755ae4f61bdd5a57ce87284d4e81c7eff570165a66e7894425a6bb4f5475c0c792604962637286750ddec91519601736febeeb35fe11d02bce2bcadbb37079be4bdf71cb777d582444ea15884513c486a343ca4d9f41f9e4df8bd3f8403aaa8e676af52dce812de685fbea566df862a7e3e28044e07dd0e55ee2b2a26985df864b03af809a45314415b2c2ab6c3625915be50cb213a5cb362e177b40d6e2b9415029249abd224358ef52490dcde39cecca69b313797166dd7ad5ba1c5c02294e8f81bcf4b395288a4885e4baaee6174aa5b600651f39cee7897c321ea1311817ca97c5532d0fcb4eec9961c26548edbd09bd75111a2cf9ba400e055887d5f81b84415fc8980901bd48dd5dd3b83b65e184d515835265c36940598e5292fcc4c2c79f506b199941142aea01ca60d4f1a8231d2d8fed8fd2125c6546b089643c5bb6056bd3de226708765161b55af0babdd051a37ae5ee91b7f7392ce9cd2687916b784b23aec3e10affb6c8365cca79325d910eff982506fa8179251ba5e3284aefb6f9cd86d5813f1dad4b7f1466665dbf670b9208a26f87bed1f3a1cf7de556625149891496d3add375c2397231e89d91c5ba1d80ae58832cf6fd483cef4507cce4e8518867175e2f1deed27118b098d57c9ad64ec6ca3 + +Input: 35c1d99c7a4b1ebc4afa5ee2d59300c9c7a0416dc27d9270370c913c1e7ee90ea7a8eac4846721003bcf667ec3c6a1d904af4075ad17a5448bc9af0a0a1b170f814ee4feddfdbfe4112748e93958f00a250608a5e23e5770b75bd74cbd361a3b6ba7 +SHA3-256: d16792fd65145017cbc7b459cece6175ea71bebe645905bec5b6f7e3f08b1b68 +SHA3-512: 94d42440814739587447600f78a1209e32ec3898068962133ad8cb131e55e0d71933ad06cbc88b57b62dfceb8c007f95341afaa4a4e66acfdf934753cbc3335c +SHAKE-128: 0f084c6ba1d72c6428b0f8bd4f874c77aa4cd16480374493f80df21bf986d204c6892875cc61bbad2e469a03b082bc26388eb41c863db775dc082b79c770ca8ed6bcd63cc96f2f2cca7bae5851f4111e856a8c618ebe112e31926336879f5b0ade23026076c5ff5b68ac6103387c2db593de91b08a5efdb86f4da0ff62e9118963cb7c235cda314fb0503f4a0cb99b0376c6e03b83a089c6504f05d07a2d14e286f46b52490c9b41661e0f372c52b5977ff5cd149bcb195cde578adb10cc0c2eb1820bfb20fa9883fc5836e0350c4c105af6eb576848103691d74a65064c4a6cb43cfb5124437399c2d8117a590b149bca4e07f87971c892d2f6b4c73ccfbafc5f75a55bd2cac81a38feb1eb0c8cd0c22d5dc4b4e650e2cc17919a0fe612b748c6dc1e96ce44c4cf90177f77d9d40dcddf1297f23551fc0f1a365f2fe35e06093c4a80b5be2a3667257dd6649957dfa2ec007ee8824a4cc2186ebc2c1511fd2020cea8dfdf676ee064ff2b378ae27a7c11c16989a5d1ebc7cb0b222d6166746787c02d22e6c27750c51a2a376f905c08fcecd5bcd90e2fa071a8890817d17dfcc9f3f5df43d94e55d3a3b27f428be895e229d1aabad52f84c1814878fc14a93e55438b16ace6c3e57d2198bb5f19770d9ee75034979d908f8166fda8d121a671430e6d761f44f26247cab72fd2bf6f5fae52f74cb75375709f1abd5dbec80e38 +SHAKE-256: c8d924239ce5ce0f47335316f9d65f157b063d130e2352a48385ede6366473d1206f429199d0493ecf656ad7ae952889d90722f85420b38dc18d74ffc3442914c9d78843b08072b02bcaf4cbe575ebf8a117b57c5169bef30b0bd1ae64841be7a6d81f012bbd3da7bc4b75c06d58195e759f00b6024847c656b9bc55e5a4ae93733bcf9c8e198a4a39c47710e1e9d334be8d4fdd7af9f1d338d4db701fa1597c2e48489691a57293b8dedcdb549f4e95b3534092d07ee56989c011590ff555bcf08b7f3132c3e56d331a6785d7c5d35210d7e18ef67cf03f4b0e1430eaa11225d1e6c3709a1d5ad7f043d0381589d3ec2e2e251ad6bedee737e5a841ed40e49a84b818621e3adea56aaa86d4f7e808be98f47cab79b88cc03f66a95f855e6321c6ccfc31ac2862778e87e25f024cfbe1ba1249831baed64594b6c672d05d70284b5252629d9ca508e471871d1cd0902ff66bcfdffbec253e638dd9e25c2e0bfbb62d43cd5f80b820e5af462cefe4b584aeffe251c64a477d74b14f7c34b838924570df3a44e6bc30c43f15df683224297016dd214729cd3a717ad10ba65ecce3ca84f7f95a8d06e39251a06353e390a9e259d095a35414d0cec4fded093b949f33ea8c35f485a0ac4210cac6e4e88ff9aa4b7cf9bda78c1da0b320958bdadc6f12af84b9b6affcabd241871f047c9b98536825799bf35deefc8a37789003c670 + +Input: 3c6ba9073b3e434e295dcf913cba6675d372b2588e1be48cf5c4483bcfecfae6e5b25f4547233d50a27104c4a772734616579308a87095f2c629af46669516ef514111e44bb0cc0b58b3cda35a7bb2ea6862d056ca68ab5d06dd4e457bf6aa01ea225f +SHA3-256: e48658f69e93496284a59a0d4a9df639dc751c903faa4de0a2b23e12e040eb1a +SHA3-512: 6cf1a0274c86a702c43d1d8f550a30cb33cfe2d9cb33237298732ac6ff4d285a842449480513734e0c4fcfd03a982dcbf380b24c327f3dfde512a8ef42cbd7a3 +SHAKE-128: a0c763b55920412584267b81f48fae5f7d6f18311bc8b32b57c205c6d0f0c8b661f171c94cf66a555423876fb4dd5359a3491791a2257f779562978478a03dbb7e176d3487d6f1d7543b247a8e1d42e9483fa996a3487d5552ba50a61ab28377586b32c400bf6663ffb7d3e7d3af6fa2bc81d4c368f93cbbdd31c73e7d151701aff7627448bad9ace94d2512d45477577bc83e81abdbbeb3e8c319871847f31f04edbafdb69653b4620af05e5ee7105c1766909bf55ffd46df09a22947dac99384bca2172836cea8376457c24bb43fc567039e8b471f3b09812dd013b25dda072211612fadc166e2bb2d303960af063b1ee50c6cd8f173ee3373aee2a3172ebf9f2638d550c7f28664d5473909f605996aa5ff73c22298164a41ca888064af08ac07392e200442246bac7b3764139703bab9ae64320d0676afbf295e3a50fae5e2df68ac05776a298453a933447b681dec3ff2088ff3a7eb126a86c5a13b50d9ccea12c48bdeb6af0f503566a8321cfb15e12c99b62fb8ad043571ae37c5acb4a63923f6ab63e360f4b52a9ad65b2d0b9484fbd354544c461f7feda6c8a5937fb0f3ac2319cff7c252275e926787738911955917dc018771a21a8342873436da1972eb53ee239fb3cc887a2b502ed363e686caddf102b6da5c8f0506268c0e5e7021d1e85e2b37eb9cb93111fdde4a33804d667f3dc6e1df6324133cd2533f68 +SHAKE-256: 9b43a7e61d41c03861f1e07dfdd8ef50780acc4b59b7c61431af948c7d779d53a406ebd5018d35753595371ae4adf08f3b41ecaf0f7beb28d0adb60cc2a86ba22369862ec617122ef1716fe309740f0754844c06142aa3a7f720f75b1da0008812b7d0f6c81a7bfcace3468385f5673705bb7cbe15c5578d35fa2a5694a9969caf67b3764df9c963eeb358fa3222ebbfbedc758b17d38695d6e18ba82f523d12e4537eb7604f2d1108351161f6caf5fd4723c0ca11641c9f92d065461a8c17ff68b04ff26cad14f6aaa6ae4f9fa20491e1aea1b925f0bf385c3baec611a70f8553c7b46567e5ffae040251cb4f97095a222f1b599a6c55c61e3b9001c6dd654e47ac52f05d51b3cfc56b9d6ed2a072e0bade5acf574ce918de83d200165ec67daf1a639cee4d0632ed23bdf718addff425ae83f527e62e67b2533b3728d1005d1a70ac6a6f5f9ea14b4f72da3c21588e237fbc9825e32005874b82dccf61fc77638c6125bd097aae9165191b1c71b8a134d4b92cd37ae9273a415a5c9287d5b95f9a4043e8ff5fc6997ebc80865cb4d094a2ba718631b909c14741ebae62fcd36a2258e99ec691696af2c8eebdb71e82e488eb857ee58f28ffc5e38f528d8c1a0a0992a10aa90fff14362c34db571dcdcbfd0ae97eccff02b92ef6af866415a323531adf657810bfcd0e3dd3cdfe344a22e9014c636de77dfc1467e2db72d932 + +Input: aceabca849e574dc7f1e4ff0f4e029376131394f3f06047ed392c9f9673fa3bb1ffb657e069b5a85c5e25ecdc768a789b1cb9825edc9666fe7a9311e460bfc22885ad264e45868b12cfd8b666f20cbfb575cc84056545089e6a8ffd880d0abad34e3b6aa +SHA3-256: b8ba283002afb7eac3f41487648ad04c2f8b34ab7c4dfc6e3c2cd761d8e3a41c +SHA3-512: dade49fbed3939363a9895a4ff4da6975aaac658ee460d0d3cd59da156f7540a3167d853eaebd4736fc7df6ab2c3b03a27ffafded29423a977295b8fc747f5f3 +SHAKE-128: eac76b25aafeec4aa1b0f86e15483a3f66b00b343d639340f5ae69241c326d3d2920f7b797f4d866326ff9a897a1007b9f3e7a2ad5f8dc04ab38228bcdfeee24817d390842d66900ca47171e457c1a7dd5e2aa1c8d763276d40c0f4cfee04d30be5faad1c1ff6330dad9e1de1acff98c0a8d51eef9863392d34609f4735f6a47492116afbb94e9f4b63254a2f51143568952a7ce114d3e8f50ae09c4af8a8e02431ad0137706995d56f536765534eb4272075b66ff81ac98423344e117c6381eca7a86a3bf4cc35ba818ca4357dc44189e0c5b13eb57f036aae718d4db3bc30682b79f156171ca633aa995fdcbeea114d77273830a15aa08005acc4096b4718b349be94efa75b72e3f83157cda7da57f1ed3deab9dd8fb04d986ead497cf2452ca7226d96e852bafee99450f6b3395c567a23056a95d035c4a80c51efb48b3c661bd22413a01f9861b893050d16546abf0cf8fa3df35a83fff4406c70eb775b3e05bd9ff49f814edb97037776f173e04d1a44c403fe1a7d0e1e861465e9ba279ca15a2b87821a1ddd789e3c79a368971dbdb93b56ad3bf0b6df141ef21c16f66acb67c57980500aaa9c5222c5e1bf528ca81ea65b160b0abfb68af5d95baf955e296b97ac6ec1068764f6a2bbd715bd796d1819b40f357d943b2312beb41733d4ff2fd435e87d4315b75c9333d789b7e4de0f23d08f0ba6cfb39e8ecf53db952 +SHAKE-256: 7076e05eb3fed9216bdaa24cf872c16fe18091f334f24316224d10d23c079e2b9a4e0e2b06df19c24cebb7515b5dce134905309bdbc0d5344a3129205bffeb634061766976e5fb3a8f6c4299065eb9d5827894182f80f5c4e1d3310b186bc67dcbde13649f3874b2f0d2546eb273e3b90c26cb607e45a60a332d0896f519361611fd5ca03ddb696e774e7e93b9b93c2392045fd8dad6a05f5baba7717454ada1e2b91ed7efa2f8d41bcd6888ef23f4e0e8ea58ae1773345ea7fc659276bce91f3b57f5edf19316f02da5c9ca9f65650ff7467f83f08e0ed5c0954983279891172e0584a2d91459050b462a00face843afd5000e3333f252d1215b6f2da7d8837e43ce8dd755f91f2479bebfbf094f1f0c5e9c44887a1ee598282baa95a259df13c920487e334cd6124b5192e1bbc3d491c1f263158fa0f2bc031e804380af8b7b9d5556733719966bfd97e10d357455847ae83515a706866f0a941f96c8d889fa1d2788b9a81e8c1a49ee94fd54367b2914075a4ae848fa6f5882c5cbfcb1b1152f93b58e7a8ce6973e201c3cccbec40959835239938f4cc1a8d3231bbb2f697cab1096a4ade3061de1f5f4178a82ab5feb14965bb0cf1f5869460bd2960cf7fa48b137227c59c3f458e1307a9402888bed1b1176281bd7675e545b1e5d9eca4ee4e2065c3bc8a77abb094a423da90c6cb095431b8d0c596678650ffc7c86eb0 + +Input: 2d3ade8ede8e46d0a93037c1317396b3d5e20d9e80f50ada4d21c5b8e16ce0382dbf57ba46d590621bc75f7e12b0e0045e45570daff572e904646d1b5e2f92eaeda264ee82301b01c43df23e73cec786f23c54ea66ea856455ba8c7ec4c1c31c30b4550d78 +SHA3-256: d30f9baeacd3c84595dd8882fcdabdbb348a682252372df9664fa26e8a5530c4 +SHA3-512: 039fcd70581bc7e28c8be280d617dcd553ab2bfc74f509393019f9cb07184a61e1f8f667299f8f0e83559629de6b73beb3e063e586140fcca2458498a8b2ff17 +SHAKE-128: 6d01aaa95321656f333010d53c3da6c194a6fae2e9f8d76f40522e87df2b6735dd7287b3a184b243bb617c8287cca01106dca5ee7d07d2ce60e19ef0bb6adf52ee9ecf953465714171726fc5d48d781b858d5215cd2dfa6eaf88b4806e511a565a2d4d29837a79c5f497a46ee89c5887f7f6bab3a0368fa13e3e2e4228f846159944c25150a97ff8801a3f3adf8377bc0a3ab9e9875c81a5e4959270921eb8bf6069ced5374f794bca1a84a5064659c9272731d8dbf3d016af2282c68d6bbe4fc33f3d9f220991a60bedb2033ab17334ebe5a9d817529c267d3f0fa846577d7334f2476f6744e4d737a0738e86f9eb1b8c9b2f9359365f2c39e19ffb6d700e77d1e3e11e62d4dc9739164854851b51d2550b68818667ba27df8642c597b13db50aeaa0f7fd8b331db099fc7a11f7007f32d0ebe62e0785a8db2a9c3fb041a543e3fe3a256eda487a07c9bf31e656c396f11b94952e9ca2a977971156905e3cf0f5a1245076649ec831f539eb601cdbabe79cc32e0660bfe988daba6a57cbe2c28f4ff3416762aa2f75c5d574c78d3948fbf05611cc89b022a391bb6257ec48841684f12362440da77269715472361706883b3243c5f85c140910bd72c4ea992472929994ef8bab2996f8c6255bbf0e154ae57d10fd678a8f1530e601c3d8cef1ff40ec8b8b0107c459d6ba9b21b65c1d129295897324733d4d1c7197717d0078 +SHAKE-256: 9fd1ae601c7184f305ab6f79ebdd570dc05202081b57ecd9be172b26f38cb7a22d68c13616f0cbb2db29b3205f69683bd2479b0b7b6c26303298463fcd545171b5b527df3a065852b6174d438f860f7daf9e7bd60ebc26b64c07d2c8f9b228abda53866a501311b6a1e477db5254f7af7d81d8d2a5e7f1eef61a49dd02af2e8537ecdb1bdc9e97a470ab99ddaf6c4c29c5c448eb4c60e611b7ce88fe944421767032f1c2c3b659db9641caab566a981c636b9324ad5a7c43828ed509ce33b9703f91cf96dfd9f71b9e95af981cc11e695450656c7be37534f47a1873b1112f10ba33e69794a4f51fef4ed4b8700fecaad48512b40f730f2f937728d23d96aa1ebb2f3b9c338e8373cc7822c382163d82402d95621d2d0ee35f479b3386d67717bafaf9efd95dbe53e1964626efbc0be48d771c3d53380ce36caa89bce4625d82e34bda0d2e929d08977996bb81a3ff204d3f16bbc81dde28b9528592b1b16ee0253347f2a9f539911821a3b2efad6dcdd8cede707d57cb1fb8a9f78bed7f3c602fd812d1f5bb8f555be8b0f4cabdef3f8f1704c20ce485f6e8acb6f2ca0f6ef5a95b08bf8ca68ace7b35739c7e215584902d8db632d1f731663a4ee9294d401c6b09e36860b3fe53e8a5b0f0c8abf76f19e8b334ee98d1677b94769553583d8487184a08d94bfbdf2d26eddda1bd89f02aca22571a049de363f23425f5d8b2bc + +Input: 2b500debb9773def6e8630658cf5bce6e083624ebd2c57e92e792e6cddda58e3b72662981d43d3e89585cb29f6daeb9d5ba45d486ed302be4dea9a2ccc82b641feb238164d3cd8a8d9bab40a9d2230d97fa13b88f67582ba5db2e077f54ec6634b9acf765bc5 +SHA3-256: ce68de7e53335162618dece848c9ca12b39a8402411398d0ba9f14f6d3d67638 +SHA3-512: 2e3cee24e11dfd59565454611cd66f74f97acc7c244246ee01189ff7e1b920ff57ac96cc865f8376643cad83a15763022a7e44d6ac3968f2342e15759bb52d4e +SHAKE-128: 6f05b022adfd1ed3e3ec94c984eb8fb9a5aeb64c589031fd31171ed151f9272da60a819c136f63a16c619989850718729d1d194aee19e9ee01f2a35bdffc2203fce0a7130c14780614663815405292aab1f2a7144db63c4830b358d4a8004a3abff2cddba734bd920e742967072796cd6597d6e41b410ed613c95c5e10c751339b3100562b6a25e56a90c2e701de5a52d7a11329e4e8cdba0987ac13dc4008eb5dd31d90560bec2d608e14116576cac7096097b9aced88a804b2a68d133ec2b63ab71dc85791bc68168a852424504ae0d62dec581aaaad5e3cab0b90c05f9a7942b0084e4bac2731898e3ed07fe94ab5026c45cd7f3b6abc785056c8b02a3134dc49619b1cc0ff8f101c93e4b1e5608e2bf75f1158fd43c0e93f1e150fbdc3d854cf1081ac80040a2aa5395fbba7d09e61b7d5429d8b9f06a5d70fc47dfcfa55ecb417c7f91bce26af94b7bd81c56b10a68a015c62a66f5f9a847ee41a32556b99d5089fa0413176491363ad1236af6aa1bf8375e5986371c81318be58ab2dc120c6fe35311a705dd662ed27c5b1645c1ae53f48b99ba8b333d5fb28da97464ab028933d949c908c24840add50b3219fe0f8d872dc749d36f7bb98f302c32eba150ef88c0f963059db5f0018b87bbc097f1d046d1a7c709f913fc177e8bba378e1617980c8fd53bfc69f0f4b37d18ea929c04a89430513634d3d3679b56e985f +SHAKE-256: 39fbbbf06a348f021b53794e45ba06e342ea8a4a0c72ecb6077dbc095060e00f897aee0e1afa703018b4b5f4088c13498166f27aed3a4d7ea1bcb27d6eb3a04a1daa97bf264b85910aefeca9cb5308fe55fd3f47750f5b542c486ecff062ffa4cc724aa13073663270adccb589f6c42843a4e56e1877a6413e7cc916e34fc3af89df0f712d1da220fc28c07a36dca87f27c8ecf3a43bd136f8c87579a50d2c7719c1ced8a6e4219c081773dce4380a246b7ba74ab725d16343de9c221927d3a980795a40dcc12ecdef19d6311c23192409714512385987fb5619eff76de1c98dc0dff0259807211a913303ac8a6644a5884683e210b7cdbc94df9125459a1664fce38b3bc394e4f5ce0bc2e282ed9c3606ab4f723b2554a2c7dd62cdcf5ee90347929665eb56b1ac55d81d813cd5f4e618d1b4b0739d72d85b9eeca8824ee3a6e9f1c399076b2f1088b9a76e82823fc900fc78fc13e4b78db431528d83e06fc3f7e603461faee335d430b884b87afbe87df8debe24a86fb5e1a8a39be98c448e545042758a52d4d02f65a7bc48a3059caf4c943583fe65166b36bee735673b6872081a319e214c27995b30e63c460f973f3d41a9446158559802855f4c95783034f878ef135685b4f1c9032f88481e88f80e4b0a291e78c43b084560392286230f356e17f0ab85625836e72f2b037ae545ca6fcbbd9e8c607c5cca88c8ba9083 + +Input: 3796254e39b006b8f145485c6eab86dc8f7d1fce265de0e12d9a96e9b0559727dbbd7af9385826bb5f1476e94222dc748c41657991def02c03e37a5eef35059bf7aa3f430ca31730951eed529e9c78c7f5b2274993bb03ca5b2ac23ef64c121dd6c7e3110a6dcb +SHA3-256: ccef493e344639a7bbb18a9b96c54cd1582d19f6053e03967433321350499023 +SHA3-512: 672a2619db96f5d981c203ff2018dfd520980cf4aa25827e0181d8e7c85cdbff5b38a9645157a5f55e77e9647499aec9d1fb3be42476df1a43a18e4d69b9a98d +SHAKE-128: a8ff0db1daf2286ca2d4a71b282706778e4eafb78fafe6602e646535a5e1716f387e0d343887e1bbd37faf64d51c8586109aad3b193c463d72cad15dd8e791737397848a9909b6c5dc8f0dec4b41e2d72388c631d9065881716aee90168bd362fa239e231663691ad8a46b40f71c964bd544d14d21121c562e7a47854f5e1e445ce8f340ec485b756fe7239f4f83a8c744c4e9ff9a2931d1cac5da592b9f78f0c475735a7e6cbb3150640f7589be14fa0070b759528af35572097d0bb9a533ac1409345e183ac38ce3c67bb6fe42a76fa97469c51d2be07dc5918ab6b5ad266dc41533b42c8f5672d4d1c6773b735875ae0b9c959e6c5f2bf1d21aa97e0f6289774b9ec850ce6697546dc377800222e12302c48f44b41af1f873ea9fe448db49c9e7febcc346c4b503b03f6485f1ec805a2a7d529ffcedc7bcfeac51b019f2c7e319fee026df03b56d0a80d9fd88959dfd6b4929bce8222483040ad6ead3e05a7e00d45c8b58963ad8b62ecf768468601745fc036826c6a8d234bba05a8a5959ee8b0f9fc814f285e2c0f3bd6c76018cae094093de2a935f906b39fa92849e73711eb7b3d13ab9dd50e12a00f45fe3e3833900a2d66971b0fe9d5905dce8a729948f5192352a4afbacb234c397bff37a42545c92a8c4d2ea3cb8ffa5cc8b1480dfb3c77912189ce7d3d670d9a08f564cb27b04e7c46ef6429466c7f25ae7239e +SHAKE-256: d8c48bbcff9cd9b879a760faac34a4f0d8bf98273230d3d4a6f3adfd0554fe0c4e1f5781eb8b6a52af20050faeac182254765dbdb1cb0f493a4e688c0680c0c5dc66ef69c3ad9e72f21d853b070eb3be71fd499c89970d108b9ac7f7e47463125e63b6300b743dd8426d37008a641f94fb898991a3d06c97570c73615dd25ff3a5680d4f3605361ef50f9a8ab504e6268e055026d776020ccf50f735bdee32db1887599eb547a8829a670bcc891deed3605d6713be02273c2a1a34bebbb9137c1e6284aa254ba66219d8450d5307428c1b76da16533c1fba2d5b71af072c54ead8f4f48401bba1c6409a400c49606cd155273fa07deccfe9dc73c5d129730457ddfb2f1de4106b86991329e3c830471193b826ce73d726b8559b366fca520702831141c313f8b07a9c1a140a4e86e32f472c8ba558840bcd4ef8a4d9ad2760e3af0f046273fbfd435f86aa1984a51c6f40852bf567ecb06724ffdd1ff8e0535d290ec7d77696ca709c2a4c58d471e51706c7f452fb2f03ede2d24201da6f227521ed00c3efb8375b3e7118b90daf3a7c2ce3d99d64aaef411ff2f5e3c9e6511688f28f077ec66f42ae16032f95bc0b1cc2ec6186e8686c9459570cac293c9f5b92f9b4e0a5d90e07ecd1938425aa32d4d720f83c23fcc6364be8a8f1eb44cf3f30e6edace8a69983db2142003fd403c49950aa1fc07eeee52b38f70d9a0c63af + +Input: 9854203fdf1e91287fa6b1465b82af9a6daeeb5516f82a803e23d36d79719a5a8614f33e81b4cf1f9a9d3e5713f0d968ffe265e2fb9b752f7a05225de65e024c02dab90016264e4a469ab7c1f756ea4913f6111967a96893868f8e735873262230b50f31b1da2fca +SHA3-256: 8a45686fb32b04a1f6fd09c31e58ffdc5abcd41c2476455d5be69f5fd8ee28c2 +SHA3-512: 161bed160157af792723b9f90b967267817a441652a6b76835f10e368d24c7c0430698d005ad36640a9ae20f6f2732e2fd64ff79f62475b846b9281234d90216 +SHAKE-128: 0e2a5b8360b72d91874fbc24d859862e6284e9aa14ff4900bea7395374d9f44bf0cc911b70e790f6b56fa655cda322ab597d6eb3b979f5d6ee0261b5258e1614743a7b03fa191606a46deb808e409af4d28cd83942bc205731eaf142745147e0f635ba96f2e474b8d9953f5d3436ef990cd1c232cb61442e70f69c52b9f276c626ed4266580b6fba58c1367a261479b824dbdb5f6b4fca2bd72d26eec88aa95d911d4592220957c5dd66089ef38f0d7eee8f05a303ccf0c5ef338f28e6c636f295e8c1fd24464a7e13a07625c80a273e775081ba83f915f1fb29b8dd059ef0b64a68a3572bb8900620aebba597860de1dcac422b7c1b0de78e8c7329bd8fe492ed1a4fed87d2728a9302a8a9647457c958742aebd260732fc276db35c93da4ef9024136b5fd71b026b82dcfafd595ee177e365ab87842143f0c60a7b43e18a1010fd109a59c44a82738739fc07559bc04702a06871f059a67bbb875bbd815ac66077ef09554d26ea1a7c9ab01fe38a869741af50a3913020d847dc7e9c5406b94c72237eb7a39982181faaf943221ef3a849c5f17e405db99dc3c0d16a416b9c5f30724aa729e8b218154cddbfba6d71ca289f0d7f528f80c8956f4fb755fd0c7c7de3f0dbab93f734c24a2d03049384b0dd86a03b621f8b2888d1d09c64954a57402feae878f2834a9d9a7b1d3314c093a9c3608a87bb06e5c01024d1bee245 +SHAKE-256: 13fd2bd3831dc5e56150c22abf9d3fe878d0eae8e3e4c5918e22942a10a5c4f1e4a79ec16759b705f93e39f9020c967d9c42cc5b4a719d95296e434af9965017bbd37f4ac00b46f58e1dd82223304ad6096a1be820b10d564ecfebe0a039c311be195d101f1e5f50b2f884d96bd0b0e074114d687c1f6eba9d2c23d4000a7a36dc9055d034ac9b9b952db014c2304d34c4e5eed0441a14ec47aeec036a0f9d9be2c3f7047913b02ca96f544bee0c06b88b5fe88e4a07e4e4d6085791814f27c8c6f3012ce979a550fecfc385ab851a7b174c57252ddafacf9581ef65d94e6e9e61306f8c94a30ced1b4743b65f2c34426a2eb6476bc2931d0c103c42497b3fb126ce1c68b9d2847c458c1ca3b81960656b6af23b737bdff65d8c3ba676ea5768a70285e2d6f9252bbcc1a1c66bc3905d3e3bd0362b66f4038fbbdf4a46425892680ef7d0516ad3740e4c466888776a6e4b55dedcfe149cc6c4eb752523e48ebe31bef009950e4359fcef09eb09943e93d50d979132d01dc75e14bd5cacff151bf5807433dda091eaba9c17aa3d59f3a73bae7c0c5a9a593fc3de7f0ea91e183f3777b1cc7f2abd1e7a1420c7455798001949b400a7b0b8716e09af409d141d9d0c072fab691e51b85d9aec9fc3b7afda0fd967142a53f6bad08808eda66d18305e6acb95fcf765a2077908e5ea96907f765c6ed2a01abf4747f699a58ee90e2e + +Input: 1efa493b8e796bdd65499d7370055a43d7db9ce58ba8daa2f52996d1c3c3e3a05dbcc92a22951efa55f8fdcb6e1d18741655afcdf01479aa916afeaf7bdc524b71c1432fa9ca52c5ee9015df22b66361d7040f6b13e6a661a1412f78ce19d3d5790959719ebcbc8282 +SHA3-256: 4a34eb30231583f43df135804e8b608bbec0d176107d2ac70956def41bf23c3f +SHA3-512: 119bfa6f5daf2bf4692fb589bd500ed45caddf61ac6a509531f91182d2e6fddf60719cc42697f8b458921f8bf9679164b38d17a7262e9368e34afec1d6ea0b7a +SHAKE-128: 098319c0b9cf7e28b4ff3e9a8813b7bfb894342a0a009e84a3c4831f8cc355fb6fde6098d87c568d98e9b2dd41ee337355e256486ab8c3787d779c869ff2efb33206e92acb4ab495d32c6de7d2b1405424d545a47d75f51a7f3d87bf9ea02dde951e0c12f744e2ff8eff0ec76409be1fb06430a5ddc1c11e7a7cab53be97340e4fa4314d353f2de2c89d92902b96a1790e15ef3c3ecd982ed05b9206273c3fd57f60d764365fcb7c0bf106f8ced9093fe22ba68481ec1c4e8baef6f2d9e512f118dd53cac79206b6befa44ff641c1b3d5c899adba20174683df618a657390e8b8673b87518e906d48341d09b61c36d6b6ec2f8b904d04b6d093e33a2d015fe6de2476409ed24f6a25816f350002a2e5521fbf28db49bc8f916fd815516878bfd1ea86e093eb0663b5aebb2662824ba518c4bdcefd06404a2c4eee4d7c898e2c1b8201ec451fb1adaf9514d01766e354448efab62fc45bcf8635a1d26ab30309850834afc1f35cf2aabc9da6168c9a6475c0456a3b961810e0af5de0844a6b47d3ce3e43f29253b381c66727fd4f197ca81641bce4ab117e70447fba451712122dee5596b7eaf4c78e681ba2d6bb430f8daeaabcad8828c5b2aa33a609e7d7a2aa9fc877a3f73ee5eaac5c782e4dd843564104829926e9d85d9436d404280309a573b2ddb544f8c0bcf1c8db74a0bd97b63875edfa466eee1d51e3610884add09 +SHAKE-256: f7ac227aff5175fe81a618865470e23df0cf2647a6470063bec560a35ef7dbfb148b334ce66bfb937323f8a1bd9184861995bad2e8e765e9f74b8b3340001ed642a1de5073bbfd804b3dcf3f4757ec1dcfb7696c85a4056424c2d0807a64afa0156a5c2616170209b9e834d30064687e84e48213d4f1bc139f750f7090023a72c72b7c7b3e422e597f939ab88538ba327ed5b3a876ba4dced9e167d4d0032ac70717d080d0be9beba150f11299ace18a2f2508418e3db60f61cd52fe810b15b6b6d9fe7e1ef514ed6a8eba6edd21a7616c52696f44b42c6c3fb09ade21bfae012d152038db1b8c345e4d592fb5fed8f406ee83af132c432e2839bad3152cbad99d981e39b9a6f74f801e990831a24a17b4cd61e775a40a03e021049cfee457aade3e415431d3d50a5b828844edc75b827dc8aba7cf4d8b9054b26694fce640bc4a3a1741944decd9ff54bdaf0c49394498b7ef61ee5a8d5d6afc28d203f9e5989bd6d12b7907f21cbe08611e96622e9e2aea5d88c8d64792f95535c35fc4d4b26050908534a6f4d9e77368265ba49585f63598be0d65694f446aea374cac499f8bff1a88ab7e967a5748c68b4947178e1192912cd05cfd754512d295ba304e3aa31e18df690331c3ba6dc80fedb7de3cd7705a25a8f7c4d2830846441d49a2e29369f0969947d056b7062dc5722744a4077d423f96df850eae2adb06fa96ab42 + +Input: 0423487a1c6ebc37b35693aa1973c0d1d468b67159b0cd1e63e8198fb6d2e49d46d176f1339b89de7d248cac92d492cc35d60ad688694c35103814173f87607b5a3b2c7a852b278930ad212e3041f390945f1c234dc5ffe7d6bf10cc909306a12fa4f687494d84498061 +SHA3-256: a11fdb3fb398aa719b28a4772636499e7f68566c61cc99fa3f277c86900cb671 +SHA3-512: 9e45ba286c4f7fcb2ddbdc4ea62a417b7f6138351e3495066904f7974ed5b838494dd18e360beefb8958d52c9d7e2683905c059d22e6e491a35c74afb2241039 +SHAKE-128: 7231145e7a185e939116b05c0ac37d227d52b93ad91e08cebd311ea124fe3f4ca54c0fd88411259782886dc3cb5d7f99fa5477c60a8eb91f5402d45bc27bbe394749fc3d44d76e329b0bfcd8b8317a8a2e718efdb6319c39d15a8c24837b897d47675c770c5330d1e2a99a3895c30755a786bae9d6ad7646cdd440d3caf3861335751fada2a2eef029405d498f0d3bc338b85c8b1f90369e307c425ba95eee382ca536f95dac0c6cb3bdca535246815a9a47fe471435b51c885d46b92a91beda6502e30e3a6168519d7c1c14638f182b5d3daf46946cb6fce6425e9db15da3bd2826a3c892a8b7934a5c4d3d17267f6480387f076d5ee34ed541e47bdac288b1775c41c44e20d10b1eaec27b0d17d1706b40197df58053a6ca3109954a32b6daefb3c4180e2b0d95bb2d662099381b76c7a83b212bbd9b09e45dc51a7665dfa90512f1f3a01b728c7e8815c8b1dc85938271671034cd530961dd64b2380c99f52c40609f76135d1eb974e59b5379bd8753a0f16adc6b95ba6a953d7dc32ccf7c66b40680f6634c7e89161de3142b40353f9b81668d8a497e89af52bc580e7bfd72639d032db83ec834e3b5830cfa927a74b0dc252e616d7674f3fd6060ab12d6145f045751a570e65d49b2a8dcc26f4de91bee9aa74adc502b4e164992a4108a615ec8675e1d955a67466c798b88f723a833334b3ad52dcdc11d115d2b386f93 +SHAKE-256: b90f6a48d415f59e6e345c6f2e48eafc0a57b99a718e88f7c8886c2f4c3b897152b62407ca1ba800e35dc09f78112af6c743416f21eabb87fb2f125560fccc51ca0ffaeae6eb07e1ef8fe2dbecb92c1a9044c4da93156ca899f906c9fe49de57467aa6c150f81f32dd12f2a9f133381129d71e6215dd934842743f1a4401d8b8d4010071fa1dcfe0330607ed0f9952f039c6f85fb8df19cec65a6b322b4bde1508eaa36c313edcc651ee0c0891a30dc5a3490bf47a2b9e327b09f4172eb2c506d9dba0a06131da2f3697c5be3c0e35479b4e758c654bcfc95944978df3804b79270b7f2df463604aea17dd63917303e1e25f9bff1a6ad91098d70e32066280ea6d8cd356dc2d4e4ebaf37e1645b3703db566e96b21b2e6a4de4751775da7fce721f81d167f2ecaa801c3f6fffc4b9dcc8eaef5cf4698a7da81e0c8deb2f90824be5407d21f4e6574f682f6e6fe3f75c9ce970e900ebb9c6bc166179a8c805b4ee6bfb6c9d18998df3014ae54c0f4abab6bb7191e44c9048fa65d012235c377630423ea23d3398966fa2ef6cb0157cf9e72b248dd570b08baebf64776125ba200d3d664d4e0f3e7bd917c8a95d5d7d8776e215364f88fb05d3d434d4794a9f0fb2e3beb158789a992b333201dc519fb030eeeb4d9724a43e9bb2ea6f38c3d89633112e03e85081a69dca1d12f72fb364098fbf65d8ad5ee52a3b4033b61654749 + +Input: b82e4b246a92bc8a006460be8c81bcdcbacf89438c22eb0f487ba5b713a9fd245bd5427bb518faa7aa9dc8f62d8b54d1c6a075f374da48e80d7ec6bed3a4c721276c0ab5fcfb42b4a0589d774860e3b38aab3ede08eb1a3fd177641f94e3649db2849bee1146f7978d73de +SHA3-256: 6e7a51d6aabfb589ae14085034b3cab302610a022497f3a197acaec8ae8e40e9 +SHA3-512: 08ffe79f8e857f8b5697f7b2e888649d40af50d6f997261131f1290c402316bd4db237f2a34ac6942526500d67fc172815213bbd09011246e8d57d8cbbb7fa82 +SHAKE-128: f45a5af7bcfcdc4f9f68092b2490bd7343af97802ad29e38c8400c89a1136087befc59831bc934e20258e0fedbbd002ead105bcdf5c2636c30c021ae9b7d16fbc9c7061b537f71ece7276eedd0188e94c8afdad4a3d21e7d7226cf43ab3fd71b638096806dbe8485a550c9b5e706812a664fb99902b14a2b5c63b4b6f06cd87a714c322fe4b98cc9cdac5ee618e71333c0c1ad0612c97898280d3bd553552673e8c46b2920523e744c3c424b18ef0a52f7f24f21ded1809fdcd4a00ebe82d5482a76e8d39e335102ffba14df3124da4d03dadfc96c2d3a1328e366d81bac271e1b744a40b7d5f56bb5ab370496f86c172190135230c8429b853d671a47ce45909f7c3073ee2878fdf24682fa3cbfd06d35b408197dc35fb80057b4cf19f013df8a6f2bfeb5c3add696c64fe46148948ae15296f403aa7378f59308dd40884c44c3bf59a7f3462f66f81d871bdc34f74000bb431a5d080f834c8d9d6a7551a4744be571aaab8b3d90709c7314b56d99b592cf768ef0fafd1a01d5900b1b84c19fa22dd1afdc7a3c93f62fe673d06b36d91ab2eeeadb65f7baaaa1b8c88686ab97da197d07cca731801702386624e1ddb56c1824f362c5f31416722d62d78e3ab7e07b763cde2ec79b882af79cf1f5759e9498655a53a930368d33314d041a1c1052560c049eafffa0bd92f9679bc582bc30b6038addaef5856e6dfbb1534457c7 +SHAKE-256: 57f734a9515111f93a6899c592147ca3b4c0296683f2d7491a7b7e6469dfef514ac2b850221f39e6dbbd1b659f63f6b88d8f861759c078a76c3fbe07545f6eb52ba104940e6c8390f2afe61a0c2081330520d8433ca01213ab214309316418e2955a25c0f261fea74950492fbe0e0a33b4c3a29e978004d5d36adbe0ada5eb5ecbaa2ba7d4c8101e95a1fe38152e8ae3d4d5dd3ae671a6fcae3c0d8d963ac873134c2c963d29eed8a905cf1839e81392225a9ef129c29130f0eca8c3307b39baa8a7440b094bfa564db3ffc641fbfc69cfade4fc0f9b24396cfe25d73163706027cbcfb7644147f699d066d2b2355c79a38eb462e335812f25fafd573165d41c4e90a65e6e7b09ecf6aa747b5f951fd7c26d2a929ab03d7a130c1f94a5284935c700c47f805a15ce73340f14d67cb482ba7b1a9807648bc8593b656029fe92ebb909dae644130419a4871efe4dff16202710b46f84a398be958e519d6c0d14235df767c1e8bbce7d279d1160cfe3f03f9b8b262bd28e67a1f62d9b851330a53f45822cff6ce31489f5331a6f61885e3212b29450fc7b47270b352a6582501f0b54a27fa1e99aba84c4cc5a3f16b22482c9d94f53f96086ee6768441d633104b4390e80412144358941da7ac76a5cdc1380d4b6c39b2c65aafc1005f70e7dbc950e5909d003e07184199798882127d02a6b30ca09f407e5ab4319b4f5095452fd + +Input: d4849bd34af6a40f6fe6a2c87e061a83dbe0ce7161f3cbae54b36c6b9784ad4fc5fa563269004afb8fd2ed90dea412fc4408db95a69618a743f5946f1249c2136f3ad2c28e6264230b977db7596cc0ea370dcf68956630fccc000b8fb6c90d56966b5d6a9a158fa8fe8053a3 +SHA3-256: d21bc9790be2ffc87e21a0fec1208e1ff3c8fbd67ee73928065b6f95d1796880 +SHA3-512: 99b6a1ba0dcdfa414a72bee0d28a4af672b80db2a88580082b37ce834b5ce59d2babfd3a534cd09ad8ff130643d926f1cb1c188dab8b356c50c643e5359fed5b +SHAKE-128: 100e253944a90ff4774a36793d56449ed3579907703057cbede51c7d5f9c2c2ed992ba48062e01311e438a16d9726bd2e15839a73ad256c0e946710414e56b15652f6c37ac713bcced6bacf8ea6696a970af87c7a3edcca7cfddf280b5b5c5eb1c67ab09d74f1a3c88db5d757d72d514eb22dbfe889fcba1acc3963d178d8a60f513d59d009e09c5a6bae0797ec88a3d2f8db5ebcb94c364bc42986785d16a884f2db799f165c9813b133ee268bac2c2c1ae57badee159f531a4f0da3de0a7e2c4abc5a28add8abbae954ccf81ab2c00cc355d82f9f1db23ef81b7fcae12263a2c919bb1060df6af0380a6c9bc52ab82eae9e5d9dfdccc0ba43dd65ea0e2755e9ded68069111c9993bcca5c335d51cd749e72d4ba253abc934c6b6e92fcee3be011257d8d13efb2acd8ee91408ab1ebc67e92205d42271d39cddc90efc174c53e3665982b397fb5ed2c9ef162f96570138f9bc842c8bdd2bef7684c951e17da796b4d7054faefd434a8c36d755ab7bda6a76382692497b6830e1a09d7ac58595bed3d2ebdc309a4804136737d2e28b45ca873e6312b743cb53cb582a010a83fa0ea5746cfa2de108f0551e452a314f1f990e72963ad7af7a89c968499922f0a3565019960f70c801e2cebce759a7adff9874c00c244a890cf25288f0408d19f13c8567570ccc46e4563091af49c17fe499efd8e47987f0d3d015d2d6bbe74341 +SHAKE-256: d67d044ab331603c8dd6368e6bb6a24d48137c4b4badcdb52071c6701ea076b3ee326f10379abc0785d7703b618c45ebba0cffe0c259a403c058799ac908ab45c3c7bdbf9de83db39173c894f23800ae22777be6fe1ddea721f5271f7bbf3653a2828fee3e63e34779dd9a1ae96bd24fbef798e1452099d2d520faf56b16db50dc06cfaa2e6678b2492d6c238408f7b7bfa55485fb595778b481ca5bb5e75ecc0a51b44916eb67e02272d023d4aa463eff068d39ee2b14181aced2aa71fa73d90a0c398054b6231c196baa6b16f5effb0cc9e628d3c963d42235cbd0abc38c10f97d4e4fc6c6f5a014ac98a07f5806b5749c7981bf85b67b1e04b6f197a8e40a245977d1e6842483a97e5af4a959b29157187834a6e0884ab37e40a074731f535e642702edef14a060a2eca68f84d2ef4133c8fb2d58008c2d201f353fdba1cedae6bcdae64b4c84555b9a8160e8c7c69bc81590317b8a90114ae1161ff91b4313172983fb9c9cc4e38df0d5f86e2858482e17cfdd612fbe684194fae79e600e0c6a5e5f86c993d86d9fa51b660dee83f522496e55e00228158c4491e8eecca856bb49f52e27e1147de571ea1b3d036166145b695081a4e16d0d48b6952e9ed04553e8977706355c307388adac0b247428c4ce66c56733e8cd5013e0ad02cbe4d76fec481ee8cca0d72d84f4f6ed1c499004036f5cc0ad594feedb4e4d22017a + +Input: 2f481cc5401fcf621a235530b48e2537817f318c3a6e0cd51ecef080ed853c4f16b6c9e1ad7d21ad27d2c82f70cd638b734f6aab33607d2b23045787a4a0e0ff256c5482641bd2469d1a6ca45f05eeff1571fb86d8abe0e356104169219d5caa38043fda057643c01f90f73986 +SHA3-256: 45cc7520aa2e4602b71674011df3623d24c85f0ac5a28aad444abb7c7401dce5 +SHA3-512: 3fcdddfa31609acc73907b03fb0a779ae4f0b6e7ee50555d6969c9ebf0a0d4db90d5178f4ad26c342fa6c75a7a8f59326aa847f556238ec3183b9d5adf847baf +SHAKE-128: 52a98f5599003819cf76a1c08168db76134dd914d688df2c1f2f1e006aeb1730cd022dd7ed1d7aadc7a850d557f9a1e6b334f6bf79141339c993ffcf0f0ec9d3f4886cca6b372cedcf76f2c3b2a13f4bb19abb85b8589d104712670564ded4b866e3290b13ea5e7d68035b9cc7836c0bf28111c84db799ecaf9c5c5ac7f5270f72ae59737e72bb04d894f2ac37a3f017b148fd9ac1d43ccbcb6de0aa75c356247b11b07ddae10977190a66a49cb0b5dee5cd9c2726e86b86b00fde6eaaece0b5e9be1628747b7857c3da602f67fd0bdfb9c796efd68df839423e19739c46b66c05e9fb15338e664226c6d11036a02d43fce9e98e42fa544933a7d28a47343221dfe3c2e099e6180f18f1ea23c28554e02e2d88343de89216f14065e5118276fe13ea79cf5ce0f35ab8b891aa27665324e8a5a47aa64c9fa4ef82669f4ae4b3b987543267532f7bf54ac3df767c380101272b9c8dbbe1d74dcd4a0889d9b154cc67fb7fab41016a4c3610b1f366f68efc69a97ce8824b42b9b57053fec6a939f83fa82fd9b5fabb9ed59eaef64b8ad4711d5eff7841d40efd563f56cb4938476e82dd78b7231660c77d140bfab6b574cd7bb8500cf534b227bdb487afa97d9a15183679d23a897a609004560be5f91dfe7a538d8ead173eb8727916fe4a19b1a4368217047b4e58b0a77259363910295f2072168669bcb4ff392fb01ec7e41557 +SHAKE-256: da1e92fa8f5a02a0f584bb49e3ec81d2ede70425f4235d97d242f99669b7d151a378a294752764aea96adddb50a782a00713bfe0111e1536e0ce9d8398dff672d58106b567207f68fd9cdb7a1767d48e26e9ecc1b017a0023eb933ce2506651f092863948eb07f48dc370f993937ccc9aabc07ad0e1d9d76e7333d0da7e676a49171ac4721fd2b7e7499bbbd0cf3bec0ee7e49a3e3348641f517b46877361b0d01a7300fb62914863f2262f0e32b92c3bfd09970fe4fbf82c90ac84e250844835805582475c99c1cf48ba667e647df79f36b5ad7bd5f11fd74e3441512b641a8811bacba142fc6b0c0bf98fb68719d9e3e4af0cf1e4328a30db6bd1d60ab4b821b320dbfb20eaac7816d49a88dfa7a831abd685e145982666d6b0b6d6ada4f4e39fc010f3a26118ca1e74caf7048086b15586a0b2c1ce5f8078d16e92e3230f469a6bfad539fc768031d44fd39c2563e9a8f8f864a57ce3b489e141e9da44386e6e467bae2a20e58079b93a7694ae40e1c62aa5ad8cc451a0a483956d13ca63dcabde110e7444a46a3963db9ad6bfb138262311641a27d8d8df3fcd0afe87406f4dc954cbb471fad46f4bcd8bbb933fc222fb1b6de90c8b9c8ce6c444922e9dbdd58a839f029e53bb815d31bb5bf4ea0abfbaee5d1daba0b3c71b1beb429e41a1ed9505d9a2730d0e42bc89b20651f7d3fd53af5a6c18b23e3d82ec09e07be7e + +Input: 64645da0fc47a27ea0a695ba67645df97a07742693abb78844578d4afecd64c12afbb69d6b213b48c4c3eff956067ecfba0a7943e32d2158ddbfdbd1d40c36c84d9ff3e171c1f64173be3e8e7d96619f18d0846cd76bfb6ff4719f19c4281b006eea5b437f091c9d0409f9317987 +SHA3-256: d3f0761f7bce557c2107e4ae9565059038466fc5c3e918f46875f948e824a561 +SHA3-512: 706ad421a96edc398388500010406c41383e70fdf72f434eb2b96b8ed5f30d5c210484e2a4dd8899d0e4a59d8176e47e21c2a8b04c21f54be16e06f963fd7300 +SHAKE-128: f01d3b339b9b8a15feb2fb1c127fe3bad0d602fffd73d0a64f3a23a7e19b3c3d20557ccff0721bb371b02d4084d2d40020b225e7ebd47bc24786c0efe725be81ef66b7f8c80b14eb3cc053567963d32899cb7dc029801cdbafad4451762a97173c6198891e1774da25e107d26dfeabc2780ad2ffcec3c26eecbbf6c9f362fa278e838f047baeea8033f2301df07c7ea2cfc732095f40c443c6d78cc98141eb62004cb006e607ccaeb14d4a77d25ebff37930d77193483e192e82e016a05b101039c4dc2cc49f18da1a6fbd0e8363369fc2cadeae1a565dd4ca56ec97611419a53b1018652080e335e279f5217c7dde527e16f6b22146f66bbb15037ac8d443d84f510af587e1c77dd48ec39395c730620bb60c44d9ca05e7c261ec1d58c2114edc5998eed54d3aad7527c8667f0bbe1f6bb7b27549591ec1b62f5394f06c5f582f4b55fde5ef705aefb200015c927da27403b6eb9e70d86555433e858539331fd72df83653fd84e8029ac263fbb2acaf5f0f833f9720d899d04cf5cdf25724013f48efcebeb7c7ec2dfb8db280dcfb1c125f429bcf4296e2572334d74b85db72417e5297edf0122cfc1c6c239e2398bb87195cbf1410ad09e0fa9593b08e7b10aa4e09c7e6f3825ccd1833a7ca550949e8eff9e01fac657e7e5e5e84c3f0ba569a010c4b5eb44d2f6b31a94197e2162b6698b4ada8f02072d925080c5c8934fd +SHAKE-256: 90fa125f0e327ae38b97463bf631909d5ca60a0de33fa65a8033822678d674091e38201c0ca732ee29c319b6ab2fd5173ab8ae36f57a98eef5a70497cb013a373854c5bd66299c21e0823fff4b274b868333b0b19eede58995afb9af478819d8dfcf48b06bfc2e1a315d91d2839d00eca22c0415438f89211c68ef710009eb2ef6b15c02c8e40e410183cb5177673746bd6408181ae12c2a5192b6c8163895bbc87b3ea0d4a7292df28e6e40a14c6ffd97dfa38c01511e1dd11e5ba816c2806f870477b73fb13e965a768865501ab6c7ce29c2a0b971ff1ade63277bbae3c489080d209022ff5a528d393905b45688b42e693a91788b109e13e19e85d16e801f356103e012fa5e2a13e40963215510599191573f38426427fc455d6bb123f79f7569e2933be29ed870ae0ecd39a35629baaede711bc81bb6f520455f22ea0bd16e016326c67e01fcd92897d0e685a6798f9da022c4e678011ad755a4b3b4cc0f6839a27f03df00cdedfb77532a77ac7f6690c6bc8091f4bc1e46079290bf2f94691e234a65dc9802dd6ffc9158c3326973410faae1d972d3337a0e4ff292642ae78c0ff1d9394914db65789545e582039cd232adbba74e829c95baf0300b2225c134492382efd4537b6c98382c0f123be28e249f81426513bf2c4b2aeb3541b620f6b8e8f8817e961442aef8fc820d89355cad04cc50d36aebcaacf646ae6cb4 + +Input: ca602596e85c8d1cb7fc37de34daa9cd0f6692afecfc25fde42a9230dc8e7e09da2f5da0db9eb2642f8ab42a2a69750f3890b4726d5a6a482e9aad1ad0301276eff7938524bf15d94e9d2d115e259edff2df1f208e3aee6f8e7548651dfcf52d3f71601e1ad7e8be6f758bef48bbee +SHA3-256: 533c392b55f81ffdee01b29a608866c60d9e083f817c9e14e85db645c1c82891 +SHA3-512: a084593f7c82b3bb74c18075eeb0304244476b5ea714083f1cf906734f200680bff3fae2de3d6b4e41c4eb18846291f806a7226071d276b8fb528d3b887fb8d7 +SHAKE-128: 8446eddfa873a874cb06a0b50a2afbe14a3212b1418b7266e096b7112de36511f898b71f8b21ba908c1923cb7279c7c9be1e3655aa51d73d2a0a0350e7ed50cff4cd002049c95e2205b65d4875d22d73eda85b15be2dc995d581ba8f1d3eb8a57cac8ed8ba30d9a358d380ae19424c0201a4462f9c38142cee3ea89f0850686cda85548c16a882bf965a64ac02ed6240b89225bfdf2a34954763d9146ce739f71f142b2fc1fab44bc3f859d3ce5e732f171a73993392b96ff4ba7f2900407b36a3ff0070a9d96c5d038b0f8b569ac913ba4e43f409c97ad7bc54b134eb6310656233df77dbac87215afca1b8fd1019e3efe04d3e2d77ac7c9669a1e75a406911d1549acbef941c505021340050fbedc21a5ac646bb378ae6eeae4293a6a742b33ce00cbb522acee956f6c7a9037a468a3830808b29ebe6118b39b690f6a643a80a296e45690cdb7aa5f91d7e7a061d2f0ba74b935c9b6fbe2dd958569b799d7ca1234bbb6f3a58d87bfdedc6b81f18698545072baacda7d58b88ae5d10cc478e53b56e6688aa449390a2f01fa56d25e0885127fd36a15d0d4a69073dcea53de893cdd4719378cd11b7ab410c7371fcc030e23f633829ee8abc3bf274264f79419696a4f85ee3fb58b2d6d3fa59bae3831d0bada3d1e9ec05010cd83c5e8a31f15da227f5cefecb795513c27a4693bba493bbd6ea3f44d3e736adb1486d4637f1 +SHAKE-256: b341658bd64d77ded0c1dc505522c1724827bc143879641d86db3459448d425a7297cfa5769f6036b55e6a30f70cdf98d9748ec7280316f3c51820541838b142faf7f5e7b90a32fa0e7b264340bdeee65dff90032f5342c9392c20984be2c2c1da6f30e760dbebd83b462624cb76105f56ef3eaa74d75b0fb2257c65c982529212d8a106c9c73b5a553066cfe7fd79723587a9762c6f79f0852268f7a84926d0d880477ca8a877ce137636971a92284ac78acfcf8215c2466bd178fb2c0fa1d5c0d68687022b2542696c8a5eb7fb11c8febdae45259f773fca8ba0829a7fed77ac2a6dda4c6364edc61d5ac740dbf6708f34da81e057570945e170b482c94fde4d7b2b77d3d17a2a5eef40075ef918fd31131f49e4b2cc2306ec2ba046d2f9f35b1145c6e87a0228dd19586b5b67d157797392d2e2da13330018ceb48a9e934908d0fd8dde84a272ba26349540dd449c08e610c8e30213a53d6094e3512f157ea24dd3233bd43a8bfaaf331f17d825f633432976fe77b050371c371e96211951807c6b01fc190e81c7c1cdcaf528cafdb6abd92a0c45f186f587adfb14acdfab8ffc4af2f16943f92317e44e0f6f018661c1e55e2032c36b93811b5fc7fe78dcb49078d23c217e0643e5e26626105fa9efce6cbe76fd8e143520560e43a131d215f58f144a55b80c3930f8cb5ffe9f1eeff909c170fe1cbf7d4571562aa238c1 + +Input: f07790b21001198ab70f89558b4d47a06ae3428ea414468610df5ee6fb2f7879031c6f6b7f1fcf7e81b17d1cd2c59c7480c2a9acf901557ad725f836ec714977a4392f9e64b151bbe76248df5a276c0c74350b099f29297abcaab97e033b2fc65ab86ee65ae0eff819d629f774cc7595 +SHA3-256: 4a50eb3417f00dbb5cbe1299862eabe8a655bfca87bb87e9ff5b6934099f534d +SHA3-512: 718d43996b9eee05f74d1b55a60a945ccf976411dd621dab7ad92ee78e46bd7f98e1e2d9cedd4d636c54c7bf13604d7612b6000fc1edefb6ca6d2037e3d46e95 +SHAKE-128: 8e57b6223a1640e667277d54cecdb342a1aeb6cd95ea1240457c43f16bba3fb9d2d83c3f2671bf3e7ba1f176cc910570326980e05668a9c80553a0011aabf5faec9337202f434bda9af24d02bb0d9e1c727ffe1b1b1cfe9a3ce711a090dc68da6c115e815823ed4be862305eda148f707c69d406ac95e1d81ff03beafbc294f56a19ebef5a09ba302141e185e4e197aa3e5743cbcbf856575cfe560bcb44a149c2e8e488c6ba5fae2b38a14a4ebef2fe64b4a9b1c23113293f02614e5d2d14018794b3fbd6ad606ec29c8279143b37234bea697d5a03c9fcb5a7bd92c4f0cf7a730c61e00ce01b6c57281a3e672012bebc471eedcb3994d6dae9d3b55ce70f6d5e61c85459b07c3ec94b5a146a27f8c804871697bf2b5fcd13d61827ca88191cec6a3f61cbe23c31393e5a4a10ba341e64237f19a0ced77f774fbff2bcd4ef8f262c07103a0e4ddc3312b2a3deeb9bacf947cc53cda4e7630da3a88f97c17873344d5343b30c2035a723311c0d7b60abc147cc1b4051176427baa3ec97dbd6534cf50d3ea3673417d50e64c9a3b57f2361396f60eb15b3f4bbab1efd935c73898acb6fa17365137001e0c0eee3a3631fc8c5ffe5782a8438f52d4d1248817dfb6baed20061a7dfda4aec5b83e8e386c27d359b342b70091785bd36782688410b5e260f9d155cdde4c06089eb427d37c2384d316767c38bcb046c2d21e9b7bfd0 +SHAKE-256: 3c852324bfb91777cbbed7229267951d47744eddf03b3c8aa5c86378e96f03f17e2f9f361ca9f2fcf63f65b31ac91db5b4f18e6202b854f9674c72cb9d1ccd3b96d8015d2d4d3f60f5b991c294eb9e8ab4089ffba3b8201d3fce484ed5ad76df3a5cafaa7cbfa1f29b17ef2e3e03ca1b03415207cf5c9a2b35c834398f715a0b979bfcbec19344fbffc703efbd440a9e22118f685839288ef6696a90ce7cb50cfce83cad42931dda697a5587287ab822f62953672f3d9ba7183e3f79b9a249886eb6f11e45c6abeb76bb50990671f9ac5f4bdc44359239587703f56b9de9a5f70bada9e84f560c96490cc2059a9fa463d6316154357533183d98f87d06e6c1812649b8e1187ba1a82d561cc514e4d26d4bd644094705407b30f5bc7cc9614c2d68b51b9360c0a1bd8bbb215087b8da38cecad4994de06a828ef11167e0f4869b66fad60a3bf813ad5350a6690d1cfc788a352c1bc3442a6b2ca5e42bbefbad8198d99c0c6f3f3743e73e4705109f40d72bdc8dc20f66d87fa7e3ff1267e96a8b956ed0eb695abb0cc18aeefe3c3df562433c9ddd890c5b97169090ad935bfcb5d8bb46cc4aa46456c392d4f26fd85b7e78f8a5a28854f828071e6fe94f1e18dd66f8ae81d7eaeb7da1cc814bdd43b70aa047d513748cc77f34a717108ddbaa20777ebe0280d68d6c5abd23c0844ae3f76061c4683e0e4bf7886de76b37df5b85 + +Input: 89f27e3affb00c9f33713b6c5abe419580593f63ef40eeb1f130d30138bd9d5fefba58983df50f6d4c29148ccbf2ecbb4495eaf8cd4cb050b732f185695d40f0ddaed73f43aafc27a56e5293df48dcb9d234074baf06f49bf8fd75f5e1e8843a60aa3124c621c831183e103753d8b0ecd2 +SHA3-256: 756ef5591413061a1b2d44ea87425bf96074a631d1646ac967def3befc4ef9af +SHA3-512: c56d1d68c249f1485de1391275815ee619f17a2186f8ab650de4ec1d4ba37071f6d9f1fa7eac500bc077dd2d4a8ce85423ac7c3ebc58e2bfb0909bac8969ff97 +SHAKE-128: 2a71995ac3b504751619b853edff136ba026eda8752699644822bf6250be4e7d422d672116394d1823fdf349fd1b81e4dc29af166683feb2b07754b052e31b948940e954cff493aff5de93080955ee57b24fd2c5c15c3359a065b9f8ab8344ba090ddc8a02b63d633c80354d61000a583b412b79a6b915e0276c9617a87177b9f2fe99346ed726187fd0685e9f2cd836a49fea3d443341affecf93ca960f441991886ac338d2786afd90df1d485eadc0570a9aa7c10d345d932ff09df6c85e1dc0ac69e2c6780577303c387746c89402f0595a1dc6098f2cda5ece4c071ff43d6fa58aaf5080afa7c8b2ddfef61ece3365cad3cd2d0dbe03b603054726d77e83135c9775171167a4450fdfb8179ff2bf749aaf8c805572dc111d494ab04a4bf11fcdd681d16a70c8b96b87d23a46fa457b2c2a003e8813492a99a2f4b8373a26779a5980000fcfece7ba74fb3bd8ca841dbd3f87f5f02cfa13b88f94b3a523676f854f26b05eb854ceb505429151303b3b83d4b88e068b3cc35d096350990113c08253fc2a545e0d373f2042bad258aa5a029d5965bcf4f585b38c03f7f310ff62951c68f158afeda252ee369cfe7d2e57571fe1c19e20971438e48a2429e08f8e0fd8401468e20183d6d9fe7802c289b2118f5036e0bac92ac69b5da47800d7194318445bc39defe2a5c7f7e8cd46ef4191dc6915a424adfa8c45ba9101cb8e +SHAKE-256: f15a62d91f9a3708f1d1763d84b920b46786935ff6234f8ae1957694087ba3205daf3250bb26973d64fd998abfe82ead5d394e95c0c4838bb5989a6c343d5fcefd7b7cd5904c78de0cb841c93fddb1311edb9b1c17779739855b53436f28e5d09205e556e68391d83e4a6993aaecf09219c08ab579690903dc6d33a63aca7f74d03f48e92f25ae5e8cfee869104169e91af08b23db6d8c26c69c56c6452a37b6f7c36f232c9f91b7f9a6ba1666b5ffe2dc5f48ef96866ba6b9a08dca85a37ac02adf961cd5b6fa947e37233121afb987a09aad66ae7d4ba7fd1c5a754cd295269f40b19139bc91d199b1237d6c805ee1fff71552e10fcddf349217feb7e39ab9467eb91d96345abc6c17ccbf75fdf06cfdc74ae29a7f3355b2e72f213067aa3b2b335f7a673b85b392859b0b49a1d5dd539c843ace412f3e21558bfa415d347ef5c3ecb44d8ae91870f6da3da2b16b9786bc8dfe4dd92a93ca5b9c3826649d35616c31b629b8483b1ed1d2f3901a77ef5759d6db479d611ab9d6ef2783c9762c32a937399062b7693c3254fafbed260b154cf3c7fde7f5a864321136760a7e9f58a8cade0e046a2f4d922c78702dc6ad1da1fddbc387cc35df7db5a2d883a8dc90224f1e0eff1cf8cfd74a4c289ac9a1515a01919f587d0b3233ce592eef0394a81b9727d76a3ab47a58d74d08dc2b09db40107a621ce5e33eb29cff527e49e4 + +Input: 73ae72dd4538f9b6e578c03bea4997f9a52de49ccfa6f9f66d04b3bc3332ff218180169592060ce41fd8de23db05dea9ed9948ae67ece5cfa87d5beff20368ccbb27b4757e466f3a038ce7eb8d67a1381c757792f052f11610382d48aeb2927d120545cdf60a875065868afdff548acbab15 +SHA3-256: 0588b1db2bca3c8f29d4ff13b932e5de8645c3958aa846032fd02f2279ca8f15 +SHA3-512: 34cd81ddb175a27ae15614896f32f7f0cf5673476abdab74910d1e4b9b996f41b2634a1cae08eb5ac912347f34e9a0ad885f8c272ff01f66e23521ec6f5f9e7d +SHAKE-128: 3b25b65b8dd67930da89729c9d04809450b35a653856eda7365366ed420eb7ca1d4ac63844b0d01b0be7417aba6233fd50975d49e6e2de82a61e1ed6d5b8aeb44cf4ac985c0015f49fc96eb20ea92cfd1130f697308da87c79f1ee89926f29661f38696a633b392785fbd229e25a10164c87b9a489157870db698f3230c01edb18932c85fc5be79b0dbf1d72c9181e6a00052615c50bd590358fe8b44214a411a682f469781419a6f2b4527ce6519c2965979892c5ef4f0275ae021f07f5e30df0bd171b45289671585bfee6d577b7b9211bfddfcc479e5eeed5726b8663e42700fafa93d2d2559806c980b3c86d2fc7639b8e467da8d060085469ed8f2f5d28d5700d8136463611d583f87bc7de93afdba4b1d0814a2384dddfa2e167538aa21765b75560d77ddc5b24a0d1e065fc5b1059bb862671343c4eb6bddfa74a37becc934f70ad8a9efa535623ebe4cc1fa3c4a027c86c40af58a4192f24392d6a95f15efc13adbd073081a131dd20c6fd1da62105eb5b6829be92dc3e00c1d161db17c72f0e03ce5c0da930e9758f5fd71f184d3fc5829c3f863fdcf847d61283e990fccf64489742c2b7e8920c1a0bb7c84b7851f19f4fb6a8d7cd9dc3160b8ece8f49eae69085a12b0f016232fa40c35bebf39b02a5c3f443cbd8e7ee53faf9868eebe01a1b64c19e16647eaacf6f1a85f07e59eac429e0a2b1a45cafffd31d11 +SHAKE-256: 6023874f432b60ee32d8d1090046d520f83c095458a7a27ea632d1fdb8c1428701c62e13a59a2aaea4691e1d06dde6bd2ec60491f7dca4aa1577c3240b540bc72cb851dd54052588cb59c1dbae29f5e8e1c341905df6d09a36fbf5bcba287c29dba0398434ff8a69fe0332b129af03a6f40d9a51eb55512052deddad3e1b8cd1b41aec792b070fb7d9a953bea684113589c9caf38696217572b4a9612329f9a4ed5b93f5c7aa31ec6b5e07fb2e2e0e2fcdf843ed7f860def0a1c8758dadc5c80c7c959414d7cc9df6eb6f0a22564086a75f59604333976c6da1f2f7878a69fa5cf211395ff4b890e7864a1aa44bcaae3509c2fa8ceed4181018f808f945f36b21a8cc2aabf7699ff722ada3121eae9d0b47dfa55dcccbc7190c02093cc8fac37d81f54f71890a2c5960fa0f9e19f86a29e7aa715625b74e449e041a8df3e31b1004bd897c157fa326eaa4db7fca6ca7efd821ad811c0f401057d02bed122bbf394b8f13ec0a7c6541d7464a9681136d807291f5d4ffa975b27cbd2a270ed1f1b5e408db0923c845aba3c445279dddf6750eadaf9cd454895032cf44c09b42e96fec0fb0d89ddaf55359b68732719a059106b023bf81bacdc88f03b97954a34f348da8620d7aa2c2d5747d38c10b4208c331e1a1405dc3f93a81cf1051096340863a3bb123ac32c05f7995f0403137916b67c1c7f381e5653d16d63e05dd78014 + +Input: c2266b0009cc5bf8188f06a7eac129d916e340b0b6213f603f81ecb490cfaee610626f9155a431b69f0fe6e40f7bb6343406b716c541a4cf2dc36823635e61f972ead865d781fe3144ef0ea9c5a22b490574544da6019f1f8ef09dbfdbc1e5a6b7346b1be9de72109265eec7b9cea5493e7dd3 +SHA3-256: 150903290db4cf71fcee3aa3d10fe38927aa450ed0446c49edfa861793c98deb +SHA3-512: 183ef809e5184a1d8283fe044c5016e5f9342c2da3db10e703f2127e7c5c72e72d0a41a518615e95e378b144a3d0e09225717c44157830844c5bc23a0307b21f +SHAKE-128: e8ce313951b79619c22a02618da53d7e091e4827468e7cfe74aab373cbc2d1c3a522a35890eef7af22ea6719907d4f529d2c0fc73e01606882f9de38f5a89895692141bf07e65d876aaec9ea5c11464684a5387e44c03e1e1eebeca5ddbf911dd81d58e0c90b4ac55ae6c49040d72deb303ea51ae0fd5f6cee209986e9094bf8c577e4f26736c12e952116057f7ec158b933a417126457b4ff15f5e698356472b0ca6ee325acb45ae808ccbe9cbaff49a412c13e322efd1a165b8b5e40a68cf0bb8a415f9824b3ba3b1bdf3041024f2898e75fafdd259c8ab35197282007d1d43bcff9b47190c524107908fcd693ce0f4d90c3c0aab9088562b84c25fb8600c56206f73f9226cf24a25b86d41f7533464cbc466c845af0bb112718bcd14f3f12fd7e9263fc2eb67769093b0f6c6fb8b46fb04bd63a4f0207ff12ac8240fc0f4095ba5acd64ee48513b939e384e83bc7ee97355c03eceb66c6d3eacc640de48362ac15f43d54e741449b18cde04f9dbc032b0126460e8d5ff4fb3e912d5875ce8caba98e4cacbf31820d4450cf318a230a3f29e18d6ce04ef165d61488bf94093270aaafe7f8b8d14f4bbd8a95bcb23170c784c34969dda2f36da089103d601e2fba262e0a560642b77435a32642d105b388f06d298651c5df29ab93a9e09c113e22ec2e1d71f660a96d56162d6169db3fee567633652845bddc8742fcb61cbad +SHAKE-256: 1beb9bca6135e309311dcc248295e0a0d8fb4c94602ddceeaf3f2c59e7b989ae40721d407db96ad71bae049f0a325c9c5133b585ab788e360ee22d5e3ce71d56f0a5f7674ac3ab9f16f47a47446b00e35c9ffca54e4637005a5fcd395754abc7dd7b5fdcbb41e561a76e5c97821fc43aec647e96f7cf3d5fed5adff3e360af41404c6336e1b61bfe2be502f99233dfb1f08018eda247f2a96d17302837d6278854188cc1a8e3344014cf05b9549164a55e6b0d31e6fbc358799d59ed4bc1244f3069ec98caa805733f3b7d89622c9394b5cf4a6a0fabe5f01d66da7f6a78fd92fac492c3caf81f54cc03c8aa295892bbfae8d9a1b262f8afdc29a78aba155feee6726f99d119609b7a803ef96e980f53c0825ae85b6fc1cba3b67546447cd8a3090daac43f736a985349d46ac66e11f8390284227bd975cede4a85c847916140f91dc1d505eac37b9a29238091a31e9ff0baa4e7ee1c6619d93c23c532458bc9587c1ee41cb8e057122509e623aac6db0f25984012ce85b77fa3ad83254ef9d4965bcb708f7d1c7840276a53bbd17c32eba2fb4bf337e432ddfb6b175d26cf25a2d1d8cf59f4d10df6c8b8aad41d78e7013c041ea4ae4c6ce7e1cd6ab9771b9f1b5110b27ca392fad00a95868d9f945b036b2c83af88986cf95fbdf844f84b5bd1beb8dbdb64f29d1d2287263f810b0b546af929f28f2fc751746996aa5d8339 + +Input: 32cb40435e87277bcf62c24b0b695d97d56879f9015ea48c82e1dd43c1a2161314dde71d16fd6d2d9a5fc3fd21f8bc8ebc704ce75afaa53e6195b2e87c9b5b2dd839b84792307c84d6c4d8ffd87769c3eea0e35b48336dc4d05713d6db16345aa314f27b2885621fc1b2aa8e107c3e45bcc61626 +SHA3-256: 4713623868d3438760d1edc51a2b06aeeff6bc51c9cad4fb6c87c432564c3786 +SHA3-512: 75966495292dc84d1ebcb88e9322393435e18443face019254bdb576639e5063a8d2f979ce83ddfd036d86a7895b19b21c984fe70e7eed6e2691366765e927fc +SHAKE-128: 2d035aebf8bf8971131a2c84c3a7c9b118ff9d2a6bef0a76fbd617e26b63ff32f07198c76e096edcd0fecbd5f5123c0c3f5e7df76502ec9ab520cc6967f13e927a43487889afe5af9325f7d1605c111132f4dd49ce3b53ba722942fab0f377a25a267ddc4c82c6c5656962a0db2e7e6826339e6c2e37b98eb19a1b5eacd159f5cdcd139b13895f168d1a7b416a96404f3d76e5215bbedd0a12c7ad3e2d09072857f645d303fa7300a43f81be90e70da684a056b5b497a89cb16673d92b5c557708980f79d671bd42bf46bc22b6b50ef3f1ba7a4596e6d78476be6bbe2d0f9a3d22f4eb9358af8b5fcce37045281c2b1c020424a57c262c69ce74d5e0af96babc3470c5d0872fcc8873c4f7ffd772d67d3f80a3954b6be05d15d4dfb93044a996a97713487e614149cdc7462cfef0fa4c0c27b72f985d3fbf91291d35169222ece7c3534e4bd7fde7cc39e5eaf2f556b14c9947db2fb996fbec1bb9f54471ca3d15609b5a9183f7529ad666a281968fde70519a55209275226e0569d0b1d2267fbe009ca1a0704c2543036cb494dcc8e50f891445401be9b0701da81ccc7734d021b98de7f72bcb011527ddaedcfae4f5772ab3b8fc04fb9fb4cd3f4b88bf9c9ed05fd7aab5e4f3bd468d1492887762dbf253425e304b1f63356a51c0cffa669140f3e5c92157ccf26c520eb2399018ab86c50ae4a8710757a49b723a75cc8f23 +SHAKE-256: 893e2df39e247e1e0e52f20e9ce594e45b084cbdc8421f72fb18a1fba20c9c11390e332d31e487fff5cf2c3c63aa4875a16673c462329a24154a14d4015421ae04b4bd2577db785549a4b0eb6361365612ea56e54b9b0e305b4c20b25816eaaf34992a13a4773f3bb2b602ef0f9d2e5e185a8f3ef8ea75b07b29ba19e4af55f2c5cbe0ca769a4d229ad51c46707d9ad2fd436b76a72c2115993c8135b69f2bd86075aafb5bff85467496d0e69468730875f3785f8b3a07c5e7338741fb1752f4dad517bdb01e1708af74d893f503cbcdc930261696d1e6b65258f0a1eeb355768f48c02e8293fc8b190ddb12f4df057f1e70df2dbfe99c13147d6c1bfee0250e2fe38afbadefca63945d3589ac5def3f2c8fa4bb152f78d2c06ecaf548b190f4670703e8dedab086651f97e6f561a6b61f0aad0a966813942773c1b5e2466a26d97690b30ea2f7b06c81b3817bfabdd08b794bdbc500cb35963803efcde65b00c6abf682c276e1efc2cf95247a42893fe21998367ca69e8a632c8884485e34471caef2792a312dcc4f9192685a34eee9e4059692c5405cd7ab4aa61c32879a4a358b5f610eb09e66cef34519593dbf8460d640d6f604ea903f7558f8c22f6a8963445b5d77ad14b7d6f4f0c0e5cfdf01893cfc39ff85d4e804041e1b62d46eb41410bc52c21f8eedaefd5ff4e55fe2936b9bef5dcf20e7e242513f28da91cd02 + +Input: eb97a9f7256f7f1d01f8985b36cbcfadcafe70f75723d87dfdccd7a4dc812e13f081d533e5a96d666b955894958f61698c59aec84573c16aaa90178b34e2b8cb2ad16d5e205df48fbd9f62276740a425a1ba09ba1ccb67e0c0abc4cbd9b521cdf38f45111b841da78fa24f26f72209ed7f207e08f2 +SHA3-256: b23993d84586e9e505140b3dbad20550c69c39d0ce23d2adf58778c86535940d +SHA3-512: 5a7c24a6492a33485415623a8b28010f5af942eea03fdadb251674e08a02e86283ac1fab281340b6fedc173e26c1bdc3a740d61c2174fc30cb455648c4ddd823 +SHAKE-128: 38fd19d8a5bf457c28150381774249ca68d2de02109745ec95f832da44cb2c7d8f290eeb3477347be2090e1fc0c9cc22bbecc5aca21d01aeebeb0b64598985edcd59147d0a13ea1c9ff0728ac0f772b1b1cac9038b916535b7d4a650b3f87f925e48e2a0d9e9be0761d37e54bbae6bd16f855e1942b326a5d6e86de47da0879ff3a0c583bab074dac3fe90648f4d83b88a7fdcc7b3017627e60f79ac70103a01e430123888b85dbc31ec75bccbb4e69baf6396efbb94b809e3516f9adad1d25d8f85c250a729f43e156a16aaa8431be3cba49e66609680c1092e7f8bd0197cad2fc2264e451aa37af63cb1e1a86413ec86c5079b98f4b91abcb10ce5d4c2455d717e14dd93d0e0888520543fcd6e3000d4618c4bb93885e90866cad9fce3421d96b0f512aad3c7b4fd84f5eed05ac903cc11f3aa7473e85144b19fc66d28d842a7fdfd7eb796782937c12bcc04d791e5a1a394d7de47c1937dee99454a27d6308ad4c20d7f523a9e2a83818de0546c827116d439067323875fef53672035755d20a5472e637f5fac387d039a2dec1f7e6348179b3b6d914aa410155e1fc69044952610619a974cfa406be4f3f8d7ad710a687ec0ff4d7b05effd61055eace3a82ebed5cbc4f6a26d326d538baa5eeb9cacfe666689774fa14609d5919d6ae067fea3a907b570a28d7a5f6026c2dc03d09640c40be448c8adc96506d22a025bf2 +SHAKE-256: 7a9ba6bd8fc0ff9b9ce71d5a9280496a32c4879b9dcf8bacbf0b1d9802988373134e43fd7328d27e0c2f7c9e39de67ab048ef2e68eece88e9d3aa7539338757c0d018a8ba97b8afa28eca0caed9428b79871af1cf7e21404ceacc440c6efa42f1f40dc9764edd7cd590e5b339cc9e6d37cd5543968389da4599096aa7958a5f90bb272e9b8bd447445075b730a5015bb83741e291d46fd7ba3e49ac280108ce424e98fddfd59f645d50095f45a887909c5788f65df59fda726057d747858d563ff51b385598789cd342f5dfeb4d7e2786cfa24096cc55b76cb311b2581a963b8ed663ae47a13eca74eb6a6fdf0b1e75ea51882e8f42af5ba5802758f933d49326913757d4bbf90f95bf7285607d2f188c01e8dd2a6bab4a9f880fde1bf04f7a2870d6ee70c4525ab41435e0dca0dca38e993a25545ce1c3a02f52f998c3526029e2fe9a69cf20b8e6051c3324752c33c6bfea44f18e3506780a39ddfdfefd6da88f57d4f0e6735138046b4578b700a09a0437e55ce45601d5e3ee820f59d6476e7ee74bc09f5a5a9c5d170b2238690fb24a9dd19ed8b4c32696aede4401276c04084d71cf47e2c288158716449b4f54895f5dac13bdeb724d636caabb9420ff42b2cc3f01785e0d18df44f716a016168b640f29238654ac351613d8936f7228c2229a2e9eed086f19348e89b1a850dd4bd34d4fac5c87de9f16d29a47989e0a7 + +Input: 41c7e9f0edbf31719ca7de349262e2dab8a810e053b19388b0ac26f053f927ec86fe24f45106c9762ed2b354dfa34c5deefa6f6fcd4d612b1022ded6b30a9baaeb793f44b65ddace690e6ff507609979ad1e90ae49339a3b8eb1b8b126eb74e61804b3625b73b47708dcb810c731e0bafd17c7f668a0 +SHA3-256: 712daef73d35c49320e01db642ca593579251a88bca8d8d147a18e3cb96eaa05 +SHA3-512: 6b2a7533d54227e40e0f706dd727aed0ab7ffb94ec30318f2452543a30f0c33508715cfd5e201b3f0f06566c9310ca3cf268bce53a45b36514eeaa23c03f03d5 +SHAKE-128: 51564072d6d6ef14e37a534fc76d1a28d5a86806b6b15a28e0356e7db311f118db2c2902383b3a965725bfd10bb2e6f3d976170b2d6eb473413db481c361209fcd1b73b9aa3ceae64d4dbc011367030192fbe23a1f8a12fbeeaafe09803e6de236b37b87792161e01036a31baa2fab5abc45675a5627c5e864e0e95538553adcec15a42a7ad4c520991cf7d7ec58c430fe6cb8aefddaf0874aaec1d91fff145c8b5ad494c2d390b92712b19019f4092c6a6b186c66d3c06ffde6136904a2aebad6bb211a66c97bf71fe28c86406ae7ca135dafef79b0d2e0cda51e4cb2b20d66b5ea24972c646f2bf52bef2fb06add84191842807b678ba7c67c34734df131af8db12a4f5cbc63eecbf212393eceb7bce20c2d33538fa26371ffb86cc8a33f526e7976a5b4c6f450271f7ab03f5e951dece9896b3ab27581d94200dc4be1d5c784ee118d63fef89566c4c49d3b7e6f4606678344b3c650a63e68b718f924bed53550b13e1abbc474fa62e8866309e52166b4ec40b98c0f98d66b261e8020e7bca033a19ef1abfe38be70d8178baface7591e6c9f6d377969dfd8c0246812c7a28e87be780a4ab4a4a567303e30d15d6268e8c4a6c0de18825c8ac457a572837a9d165fd5980096e0f830b11be7c94a6f3ba8f0d2d33291a259635fbc9b3f1ec444f1b6c7a1278d572821260005eba3b529e500e242b32ddc37b26a990d22a982 +SHAKE-256: 984724f2c422fad05d484415250b633501a59f9dfe4de2fb51975e1b8a1a3f65557865a7a25b8d9fd0a7b8780c2c97428abcb0d0f2b43db9b301e3ece6b533d9d368820e65040b0d1575f8a10142802fdd5c14e3ab92b675260867b2e28e8fbbcce98945e03e8bde3828c0b83637621b14f4d1d5ee07e6730fd963acd0000ee29f33649894d792c505950ae4c0c9181ef94518e192ed0e3cb75202ced3d9e19e2ecd39ba5f7a798b81fd8c17328674307739ba483c4c9dcb2c4561227df9e50406cf79ac386714cd8ff89fb9d68f619bd1409e2202a8489b9d145f87f3463d82a21bbd5638ffee146089fd85fdb759890fb714b7efcee6bc097d2cbc1a3fb67a4b70e8c8c6a13485384ce862bdf7edec2460efb7c77f0d6887087164d996565e2a097e815ae81afe5e70bad418ee1f36c1e8426cbaf76cc92b828974683fc573d0eb6605ff64dbb0fc5c2c6ea8ba614adfa2c6114734162b07fbc050483f4e1525a6ad629f9cb28172e9ab24dcd3090f4899d64430bcbf194f8f0edc90a1721cf6c557be71ca28997295d2bf85cbdc41626281a55e897b322ebf77bd3ae8b9bbce9cfe21789524fb7a4ae17bb1db1d02db2f12d2c863e858a6aa6c038c23e6bd7111fbcfe97ad71212820c8cab56bd667092065063a7bbfe3c47ab353413cba03accbb1edf2d93b905f8ccca622edeefc16840814978b11618aa815e5b24909c + +Input: 049a6c914cb7ca30f499deff144df93af7984bc3c0388bee7dda2574e380ea8e3f38ecc5a60413e7a4ca05f46596f5140f8732f362c79379d2692c7b4c4a7108a7aaad4e855a2953b0cb68c9efe258c63f69c2b6f6dccd79dbc373765666fd41fca6edbc820ba1d4fed7f16207b6bf3a862425c62194d1 +SHA3-256: 986905859363ad095848b5cb0407b64fa652173d8b164e6c280df8f21dea613d +SHA3-512: ff7fcf4086f68de574d792046974de3e318ff1afd7ad87202b28ff95d98946b12aaaced29a6ff8618100b0d139e29951159dfbc23b0920b572136a0c8021b950 +SHAKE-128: d1a14bf38a12924266ce77db2beb6a90e75b6d162c4a2328332048100e1493ca20ff10004bca77df9f095690d603102645025894a75a41987f5031798b5e449c2f48e2bd041b365a7b296bbf7a2a2ec3c4941ee377be1881536c7475604672a203278ae35b4c645700b1237652a90e936079aef2eda1b0ef271825ba9bbe8923af33dce1fef4a4190db56245e4ae77e9306b76dcce6e48ab9140f59922f11a3e9e7b76a4780b95ebd095a842ddd93b7184aa5cc668648c1ada90916756ba4f37a430f5ce601bb8cded574194cc711c0da6080254bf985ecf75c17e34bb3c06297c0a08efe763c69f9c20bdf2a81f1230ad4864b88dd35f4fe3ebff8acb178ac9d922f407b347c76e8d10c7da7c16653a009070c1d58fa6842f4fdd28290b9575fac7a396e317cd5987a0fe0b092a53e3f151c486dd200d83efddf14dda67fa4370dfb65ac53f5b61c30cc4b1158fa83e45157b661695559b2c01bd3fb60a00a5a4338202d57a6913ebf2b5773db03e7f4095570e13a97eb33affb25a7001626cb1c52de252fd8a697f241d22ef7bbee7964cadbb4e91ee3d3adf2d1e79effa061474b35f6bbe9d2c9e0b31b8e7b1eb46b09fd8922680fb56e3744b5ea2a2258cc2c067ed06bdd7e03a46381fde1d461496061947b3b9cd4d8c21bc5bb00bd6153ebc98a7b726b356693ec652301275d14f5a386147e5acdc20948e71191f99a9 +SHAKE-256: fd2844697dcc66c47e7bd76abedb348f745c2a61cda353f260cafc52f98eb49c30e4a85097eff79de7580e857212788ae47700f71c3d6d7c27cfa01916c96dd864ed728fddee20ba9f7fe0b0d6a93191120d803a89a1c27129f120c061aff1375b1b495383cfaebeab141265d1ab730b60720c23455442268a7cbd1a315923c0062ca297a550b8bfc1eb2e3d6eb8fafcf4ca17bb2455152ca8d724ad25c523f928fa8c60d900a39fe92ae1cbc4af4fe04a12e71b1ed1f3aa4e4dd7787261f0469763bcd5e9b134a03916f1af0f028811c748dc5d03bfec40a83b469da8b5395c9969a6ca2a7b0f64cd5b4ef14fad89972ff766f234f5bacdb79886a14a84f8e38b5fa2ed396364136cd289a7d1e9fca494123d660d429e69779653f2e011b416d5c93c07ba93fba0f35e36d88a3f36a460be12e27978f7a3f3d9e59f78ca7e01647d41b68c116c5119f83cd235d99ee2277d3607f5b869f75185cc00a72d151be161ad6ee9a303b3c1cec8b1221995a4734aef396a581676f90599995e91b74e8bb076f8d2b823d7f607e4c0780cf9464fe28f05a5673eeb1aca9bec81ad53407f75feaf7e1ef8f86c3a6ee453ba3cd411e23e307b482b6f9cf69e4c63a9bde328a8e1b7ec7826f5c228cc9d8b22b1fe44c638e7be8ed1219adfdfc5439d1d4ef85bdd33d02d00709ec5dd9e529fb8dd445210cf70dee720aca690d2f34a873d + +Input: ae63dfc2f09be9982adb090e01e52c32c644af813d2bba345703a6fc28ed4424b87ced5ca6082fab581ea087503dfc55e2186201652fe6eb3ea2ae373a7818cf5db95e2ffa3d3866bb626f5eff7fc489e8c511cbeaab3416fec00cbf5621452a429f7263df9f1f837abbc81bbfc98b86464a1001bf98cabd +SHA3-256: 4f3dbceadb4ac0ad62f08c19cf060b3a117ed368c8b4ddc83f7beb91c8f7e496 +SHA3-512: dedbfb6569e2f2bf633fe7bd64e6d378a66e7e70062d5a9ee2de301ae64297c12586c3362ce6d9eee22ff6605ab3da4755845cfabf6f251182dd5b787ec7cc1a +SHAKE-128: 5409253a0a57c0e0b7917007fb91aeb2b9b97c8cb06ebb1063d9170a52b13d8a1e2abdb8722c0e6b083e7deb5abc8115867804b6d6a78e6ecb2589938b4a749ca75103272b73e733863443a87aeafc95d842e59316ec665dc80b77ab61a9fcb6c5bf2fcd17850c3281b80cc1faa94b88403fa4808b7bbe2c9f7d7e9f7665cc593047540e39b710a37d56ae9ce2f036822a280990935767ae2e1dfa8c12b3606d41040303ab635d2cb44ac050f2724bef9bb2ca0d665f448d0d01984e1e83159fd956f9dba37b00af3dc83cf66fee4674aedd018031cfb140d6eb17f2b6f1887811291fa50608170d10cf19bf137b9d16e15131d5e906c6e7a850b9297a876f2f0573d2802900de26759c7531ef8c9ae3ef7597cd7bfef10297f22aa79643a49ed6df8fa66e72c5f420eb44ee4d4fbd648e8c21397b532399b4a997039e3b1fff758aa874073bada425a29e356db0a1df20bb0ebcf8ab945b4f0addc834402a2cbfb6f912d68623e33ba70270cf61954a550df1bb116288667f8a05b5e8a066f6be76976393cb4c2b6462c17b6d3f8b61444056a3310528f98d26cec739bd7315b653d4a481e24adcba16ce11954d2022a78667f1ac36d25f00894ff3a356aaee2dbb20681a058b6af32e0b39c5d90c7efc3e45b3771e2d365d4e82a4a7d4737b61dfd6b39a4d0100413111d835c6d533c9be207fde8c73287b8cde79ec034377 +SHAKE-256: efc6b890389fde367055837a3ee74b3fefee089ffa75fc42ddcacf98c81f8ac0ecb05df104b5a109240b1c6bf6ac2827debd4c926df2a34bea7dca98d9842f5c5f04c4aa4cc1cbac86f4eaa3bf904528b7ae9dde02932c229663fbc5e6f1b4dfa40dd48f2c3e6b28fa63e08f2442cd811346a3fa7fe5cbc3d4054fd2a99d63cb09e72521ed67048f9fb6fd579ca85d19d65b409f0212ed3cb69eb05b5c010335297f2156cd786d86759043649775939df265bd2d9765950c31a5512b01cf992874ace7b64035730eed60255d30b713ad2d45bce4b30334d812b297ca681b4de8a6545555393880b96d13054cf05fc74fcb8f29be9b9950fbcaa9b3dfe93582c184b9599dab2aab8660ca93972c8d9595e20319292b967277156c351416e2634785bbe370f112e222f78f9b50059ec27519377089dca2fd2f1a597feb78f972a626a110f6f45d99d4f9d72eab9f01ec3f16e9aa44c284daee45e52a720d271e87593111c57f0d710e31b8b299a901d4728a22476cb22b86c1894f1856f9d609525a906b6241047b42903ff110c7b007c55514e35aabb15284db7903731e128f2f77fc1da63687f96f0edb47a371739dd94de965d4a3372872ca20a32647cb42193c68449940ac603b51d71f5706ba0d6efc49763366d74164f038f97bdffd97be0190a1227fe696b8231af9059b50a0693909866355600a9116057dc0aba921ae + +Input: 28001497cb75486c18ef2f28207ef12403d0095d7d743fc0c43363bdfa155c7f3bae0c18ba1fc393b48b360205225d7e09f57ff9a0f4967a7bbd632e63b49a5a47861b396cda2324528f0d8aa4ee23d04f9d19a7b06880f957bb5ff804d7a31e267c6041b3a64417ca18bb89bfd90deeaab98f1058ecbdaa68 +SHA3-256: 737a58a3f767c1eacadbdb0694c842c65e65d3664b219ebddb01f0ae80769b68 +SHA3-512: 61fd02f4402dcbe34e1f610398df54eb64d19f6ce76bfe42ab4bf4e0a6f33f79e26fd32324fb35dca59e16e166d49c36164066b1ae2ae1cbed573289a1235942 +SHAKE-128: d937e6720115fded4915f00d19aee91c9c7dbae74ab5310153a658db55b59193875792bf8b6c1a8bd53d41c3468583dc12225dd586fe66ab48a831a255bc3f178619ffef7e3ab6787416db187c17cf82ade24ec585540203d654a70b28b8b2dfd88300e3feae3bda45d383a033cf8dc2e82725d187a40c49577d601f2a013eb6f38bbe4af4d496c4d1eb3d18c89759b2fc37719722ad3b49dad8da54f48a27e48ccc56cd711be02ec4016ff823d2084eb0ff783c71cd553282e02c1470118281d8685add175a1f57392548429570641252b46bcf72207943eda715d53073b15ee15100e7f9de765b59cb8d7090a5cea53e52398216f1edb7e819713ba19475fb6209e2ba712def04025f5d6f114c8508236026baf0d45e0dd828401602bec46a1796ffda1df852fa992e17a1ebca822c91fd2fa6576bfc8ccd3ba7b18ab4a321ecbcb66044791dc25f5e8d5bde77b39ccda620f088a282d4058b0a8081b26d03410c11d80961f30fcd83107dd6696cf2e0542c2c18b0409e7b765cce710fce81e8c41ffec307f1623547c1754d540c5acc43d2956b56bbb4fe027d7c07e99e75bcaf4ffc15a67ef5175f194f36407ab6f4bd77a57493c4d5f61bcb0b241dddd1565ab2bd8893afa00e9b427518a9a2807ec88ebbbaf1acb6734836e18539700c935dad6ab1fa79c1814d08e69ca29a53142d72d9726aa0c9cbf14cefa269ff1a +SHAKE-256: e4e68f478e81c2ae1aa8396e68e9a5b69d4fb5ce79879652ad230c3928b3645edfe0329b53c5d728c95b5a89cb74bdd8924d40ee437b8837c5890e539e49dff20e1d55b8ecf7956f3224eda53fed98ae7223471e9cabb94ce2f7428e76695c4f4ad818f954997db7dcf58ab960aa8e460c342d4dee393e826aa4d991678e027916a2edce6e2b2dc8eb52e5eed290ff653f411970b9cd05482ee31c5294a3aac3507884a600143ceb8cf13206db86a0f33b3050b9ddf49ed6f6f8a0d89d89b24448fc3e9886812841a43ac0505768b6d30b2f7cae6f927d924896427a6304c1ccad0f97e7f32c379c9b99a7cdaa5e02ad7c4ed8894543216cc9454339aef2eb2ae144ba0a478b16fb652bd48cf237d3784642fee8922d0c5a3b2f741019480115b731627202148bc26edae5da5530a754b2c40f5dad45d824bfb4f40c0f71d119a6ddd1a43f8f599762a1682142bc3d5bb46b8395f778c853cc18521a8d5ccbc78fdc0a05b34361440fb67150d6fd9ea5328dfc8543b3f74a29fba90ecc0873b8a593806cef07e21ecbd60ab06eae15f4ff4579d46a4b7030ca6cc97a34885bc762381b44523b5f7099331b0212d0af43402763ba319feece6201fff803734d53f476032fe674be2acf8a7a3d3c30f4571ea29b3fb2105be11bfcd38e2f644bd7ed356a71b3f3dcbab4da944fa0e0fd822369e9131cf51576040c113cd66c3a6b + +Input: a6cac62be9e7f2ecd19cef222384c6dc668c28026d78b3be985d29204a842ddeada52a6d6a620e0f57b6c4e74ffaf5398a32963904e77db01b2077aa173a23fd3962fc86ed1318a629629e882c9eae89db1246ceb739d101c27f48363a658fd869c2ed72c277d680d28bf4cdf0d396baa3ae79d4ee7ca52ff89d +SHA3-256: 22e9643af462293ae170ee5180840516c7247d0bebaf524206a10178201fe554 +SHA3-512: 1a03ba5b21ecceb5928de4f2361b8506caecf131922c56b9115545b781cf8b232d680071561e433793ebfd2773918a11d449eab2f4f116858263afc8d6e14cc3 +SHAKE-128: d6a7cd994b84489b1d670c126141667f4de746bdbac6a3e5adb5cb6f174ddc21f586ad0ecd6322434909bea75b1a25530a37220a857bc25f2e3b220e9aa72c9463a36451e06a951612dde0bafab385effb32fa49edb5aba3998d26c986fb40f7dcca114ef9d9b0d70fccfa05210642c82456dcc56421f1b43ed02dd1fdff266d2e87a1dbe991269d16046d7ea437263402a3034d4b53011aac19829001d6344cd51b1623871f1b900253108a7d632145b57f6edc345945d592222b173bc7338e64686047aa1ce76bad45621d91ee3f0050658cec075e412549b0e96a9a465eae7643b0fd2b0f89790d677cf9678d0ca641c5284bc4eafadc6ec200be69e120e917ffa07bed42d0c87081aa7713e7c3f9579dca816c82750133ffbc1bdfb1957e75b8909b6ad88a35533be317f7a6d5395caa22daf43d6f98ff231ae224a4d77bd0340d338913c45eaa0f9dfdda49ddb30274a346e53957e1e0b021adf3b113427c3c5f6d0103adde978f0a297c381a516da895391b5e61a34c6005271fe45192288ae4722d0a03d1ff2adb356a50cbcf6520bc11f4824439faed20c16be1498ae1e3a854389995832d32b5e21f247852c223786e59e702d2cb74750f7416564137bf8fbd1fe210eadbca5bc41ce1fd8752b676e160890c5a17cef9e7c850db6a6cacb3319bc5b2133171eeaa74cd27c7c634693fc052a6937289aa20d49cb961 +SHAKE-256: 4a3230a7711bbfa063ce369a00a4efa90f999a92a1e2b8e367b6c1cc4efd99276652bf316045e0d158b5b3c1948ec1ea0a669dcbcbb2c11950cc5b32bd90c39de49cfebd0139c07a4a72cc91272faa4cd38c6f999bb50655b5d9f801589c212e5f9b5dad7d70c05a053f39a46d2a8d178fd242306f16a0e4a4f7dfc2e99420fa128d974a835ecff7fa73cab13a2b452f01560de30d6ce7970a0998cfe041b59f562ff576a86299d29e8b60906b754628fa8db8daa01f0e229c681246ca1c92220165a914514cb51d488b8c39ce092762b1824ef0edf2fd92b222f82f3ca5b57945fe92cd172d948579b43e5d71c9986a24557c8408465a8112fbbfa045dbf311f3b7fcf69bde058bf256c78e9c5f6aaad9350b5092aa74dd2165c5fd04ece86fe5a60b07cadf07d8503e2211a0ec593d8870686e8804c90007e1e7e4fc874e15572c2ff71daef350b75e4523f90fbe9158516f11bcf8dd75b1fcc6ac444aff1f082b6b7280cea01ea588b3218bae47f1f85e44b10471850cb1e6850df3f777cea3285e79405c55426826d515209e78757a1b649e0ec27e374a243721265feb178310b58d53d1f287133e9149599539b6fa3ed2425e4fb19ca2342d0779c3cdb9941e51b1c2aa7b3911958dd7d163904dabfdff9a8e51876a470eda1665fda77a9f1bbd933be4fc4377392a9257267a372c64c1a061397497adc44d2499890db5 + +Input: a380063e2dc27a6ada0a6c018d7cc5d7e28cc20cd81ed67a02631b866be02083051fbf2742507655f82c75e5644b6b0d87db4f3eeb19730bb910853311860af20afc1a3571b61f0341bf75fe6b89649d21f9431f68774c1b604a75639d90fd9fd5b8362794dd09cb45ad42496064d180453a17b611e1fcac7542e2 +SHA3-256: 6d7ea8152f1745205cda99dc24d730a482319e1d177caf04ba32713d90d4c37e +SHA3-512: f2f32088526ad75d08a1ed73170829afa4f4936b6f3fc57f757cd2d12dbf9bec7e80f464d998cd8285986395e2219983b7bfb87066e2c9cc60fb8df3a028fc84 +SHAKE-128: cf87384910dbf1e75c3f4ef4d12d78161cd2993ba196971275273928dfd7664df9d45a384e06394705fc15b9a4b14205b48a36ff994b70211a1a53efba8cae369084175f5602b27a74bb4589819d897694213b316ce8abc6089879c44eb8e33df7e3b6b69eb694d632fbcda33393623cd499a97964c9ea352e3aae6f53b2410c17c12eb243503552313365340fdbc3bc0e6f027a2179230ec80c70cc22b7720ccd34bbe388c63181182b6c8580367b6839dea9e3e889c242c4bc0cedfefe3707eb9c3e04f4b0ba7359878b4a9292d172a74efa8070d06a43b4f24377bf830122f56577c8c2773055e0b6974da818b8433110c5fc01d35daa9eec76b0cc24eaad0fa60be0868fadc3cab544e3797211318da3add07dfabbda12932a5e00c0942e54c61ce8b70b1f44af78065b192099da4ee179a73e2966fb3cea98b384fbeadebf7f54900858103cc843858f7276b58279fbec18b367a77531bf957477838c37a6857d46836fb342fe28d012e04945f9deb4c18a780e14ca0cae0a3874ca295540db68d8ff18c5edcd72cb6db452b1593e9842e5efbb24e96c43752b7932a5ce9bf81b2ad3965c2adb44ba131281a855f7c0b2bdac6bb94d9183849449d409b9ac2bcc953ed94d8538817431382fbee05bcde3ec1ea427142e33dd992902fc1906932219f0c4be7b42171bcad3c459a0855193a5ce5f3c6dae7ccfe82ee547db +SHAKE-256: 179895cc083b075df85b99d04a915f0a06b719ca79ca1f09c43d758c0c0978d6ac30b7488d0d1fdf6941f955341b11cf58a8ea7a3745d01bca9ebbe870a3cc3ef274642162503a85a6a41b7629e550440e6b11ed4af7845faff397797528b2739fcf68264b9b09c4a9ad9bc414492009e84b0f4d68280fccf2ba97c858fbb4747d73c02df45520f9de9e657b46b01f426facaf13a5cd5205320b7c8dc648c0b7f77f8754662362602b06f39afd05d60747af85190a723ce417af86328d279bc980a17c3b2ff44678d7863802706fa075d48fd3263dba1b15e2857b8b4716e9784e193c551c75c2a4111a0a739a06dd517437a3e51b6bffc45d027285a6b25c6dc706f670eb52b26074f57c911fbd8ff5433318e0065d108d6d36de697e826535ec3d866f8f0d264b88ad0fd856f12feb8e1538c2a38ec3d13d7794161de3e118479d1c1e2b00f1d3db3088ef77dc59c9f5370c01508ff77ce1e26de81f5aa88fb4cab529bf0b417bf0ad837a2fe88f57060422acab56ab6bd04b4255e4b2bc46197003683449c67de84db758a39536433f6db32411e44557eb6b1fcb46320093a43d43b9eb988e6a2f2b61bfdda4a7c25684c76d6e669eee233a44dcd1b654ab50631455ae6a6a3d6dafc2165ad5273af0d5cff61b6c4a8ad39bbabc9c4a1ae01a3facc977fbabc5bcd127b0eff3c5b74eaf8e85eb520ca6106f04227cd953a9 + +Input: ee6f4a1d83fa81348e0f4f20ba5369cfc7156397a1a3085606ec8d0d6f2ddb4553b0c1a46c6a343a1cc08d1127e1e84252c2279ff1ac4697503c6d69fe6a7b53d67720052a275e4ebf5dbecd2428beb1be0236c8fde377a425ece6fb51b1c8b5ad25c81bd807a438cc65f52663b327cc553a73ff85d9ecc136c040bd +SHA3-256: b9c603b04b16f4c97e775249584f2d3a1243aae1e15785fe46bc9b3711e2ef77 +SHA3-512: be5ce65df06c490e4f9ae5976193d82d216e357b183a8e59680c18351bfd9047e6299a54b1ce26093b2f05789ab29dd5f28a7cebe98983b21d8bada77e8c035c +SHAKE-128: dbe58db0264066be2a7d2cecb07045300e9e9539ba7b3d849286bc6031bc7d8563f4005ffa2be7452f6403d1fd4716edc5933d1b542255b8b13348e77875e554629629f9d403766846bfcbc7ef5e5220ad5337cb428c1f91b89591e8c6b868629b7f941c5ef70f29597de36e902cdd6f2eb11b8809794ec12462c860978a44b3dfc1831dbf45171c27072e3b8038a8abecaef436113731243ae4e91faa4ad17ea308a79863b7c15bdace208bbd53ffc0461a8e58312b8ace3c78ad559ef26bbcf87eb1d5c8f710a89dc76d58d0a74da99c8d1ee5e25e99c6ca0bef2ce1676ceafa2a7123dc2784d1305df1fc3c92c0335980c327c767e76c274aa959452f01d0151d7cd91f88e702188f5c457e9285bb620b6c117d62b4d80c1e6f8786d0dd6fedc668d0834dc6e70c0e94088dd4a1d584b0f4c49ab24b080d83e2c78e6bbed1bf17743ecd379ba166022d745c7ffb44b13483f63935769aab711806e6b0a999adc3805397d9c378f5044b8bdb38fa50952009486f88b358121be9d007e14e347b6608c2ff062f8a4415a178d0c409e5a0b2d7c0e01e2aeacf05a49ba556a5ca5b60c6e28a33310880d4c96a3a5d8d44aa374a77b4bc55869a99ee06a725d5d8df8445d2cbb4d21e6597d9ee58fe6a4105ba9532f4b47acb77c0ed3341a5b3b4a578b088c81b29fd80f28449c9f5c7e188d423b57f8c7188ccc6dd94162f3caa +SHAKE-256: cfb3dbd092250c22445e77f3cf3e348757d97faf3964ad104ff6dbea6870ae37f94f5e5bd2164ccc93cbeb3782261e0b20305f7cf3c936949c2918a9a9264f1f60e2a1107f2b7b1b88af6bf70e3ca2ed656244025a87ca72dd8c8eb7e4054436b6e1ee8f18ffeb32e2febcf6f0b6315ba90a485ac16ceed790c3864b262a6ef7bb9c52db2b5433074dea30d3b52e4cc500e5411b3c62294f5cf08710cd538b16224f6a78ebeadbbc4d6f72f8219306b4fcb32fe5572a75e2b085562c95d0d1a30e2453c366f61d59646a7dab3c387e636846d8ca1d1890a8971a011711f8dd0252cd0cec0298cfe48ac8cf053a9bd24559db313a5ffce2f368c4c42b62c43596f69316156fbf76c4dc0522a3a170fda2078eba14a6ca5fbe829c6981d9f85a42361c41f8dcfa480d55d021e0648863a330517afab53ebd5f5330d3ffe6e8d6509239ebc1b28f9278830ea221ab0e3a0b72f44260ac0dc64da5ceac3507be2639a314f2ba665993c6138ed57a9e4506feb2557f3ae719310623a2926c4af553b38b68471e1526509ec45a237c234bcf96e4700eaf2dd5c0a8edcfbd40dbea29b6ebcc0f09e65b6ef4e0ccd7f12a5b7844921d499247fd4294f0836041d12eceab0ba03ea33786f4dc267b225f4d247fc4a5f44003c14f77e93635e7fa0e2001109bde540e74daada52c269632e6989810a6cc256972ac9607bbd903ed571e0c16 + +Input: 34e6324031346009d2609987de9f92728996a23ae893e8e791fb044301dd42b245acdafb1ed02957749e8a90c2ec2ac97074e5c56e674f72e39a8fce710e48560b03da9daf41d4f515a2416facbdd6b2c9346ce9690810f93829a893eaf8a1ed5fd92651c9395f5d5823412a55570aebc5d87b319fe3e0e472a7342931 +SHA3-256: f9ec2c4638735cea016fec3ae1841d8539e7f53e2c00f26130f5ffe6a528e018 +SHA3-512: accf81b2841e70b427e7eb449f5bfcabed47dd5b860dc8205517a28ce48cd999723c322e48aa3710c49b91cf66f4934de71f847135fe3d572bcbad00fc1171a5 +SHAKE-128: 3479c045076ce92192482dd6444ec86e28caf8f6511f4f40229ac61dc36a1697a4cd3165093b6f110e9391ebc739b8723712d3d213ec814837b67080b9650a7e7457d1fbdd64160a714829083c485c04dd14506add4452173cb3cba37881b467b6bfc7c463915be86cbc26dffe52a6d8cff31c2eb041b8c79f3fe4ec993bab07d5dc8db74de022e6febc5e980885fc4579620503c92bdce83acedcaaf3c7b0b1cf3831dc75b80c88ba9a3b8345b251828fe1bd337485980ad90225e1594a1fa334e2c5e96c1944ce0f325920e3a4e7d0ff09d358d482f90ebedc787cdc4c7c2418ab665942171a1a15aaf413bcfc0d0f2f5cc042ca12ca13b3c17b1d53661f6eceb1bd8aa346979d75f95a992009f2717b1a3b446a15d7edb117fa776286ce097a80a18723a6a267d544fb52bc226227aafc012998feb4d79e324e67237080f61204dfa14169f7e4b60dff077f8f1e45c051423a01caa09b96270c63087f5b069ab691ec814f211784c6a5393f9e03a8af680e0627aadc89c92f194469de78152b9533c375b809111df7597317dae40a9918902570a7de8e9b48448b21548cb320e138b6b491ce6b83af90d9ce382afa10fb899a50c9ac8cdff8dcc1596540e48045872df3ae2d50fced17336003369f8516a1ca1216eb82ecd157bbf4238ef7d82ed9c2f981aa6bbc305e5d27d943f82de78535c37d1352c7c8d39c65056008 +SHAKE-256: 72abdb1a7cb78b16160592898e26cdb327ee4b364b8a059632878efec973ca7673ddf296bf31009dd2e57dccd6dbf6e90d5981d8688139900576fd64d18c72fd135232133fca1992aa998cf119fa6d824ff85f5759854cdca26a3db4d2ec1695c4e5909ca9e1ff702b16537fce8098d25ed4c9f9c4e9af2207b0aba3c173b24423a28f2ec9114a98a40371007f3b6913c7e848b30d5c1d95e89c41ee94556f86179c638e026de0b4bc86b17f84d453ec7726d0a1c6981eefce687a436e00c8290947b5f6db04d25da4f43d7a4b3189f307e3a225356075b16664e6300bc2a807b627b3fd009d69488e2dfc71d0b80333ac39eaff02616721eb711016db1f428435db32f7182aaa119fbb643ac8ad56f3b28ebefabad3415b789f27f279edde1050788c029b8ccc6a271d126080b7c2f682e7b7450c80cfe900c40f12678af974897c50282d2999d65f754019c8462bd2700e241505fb1cee22727d2e48af7df16a0798afb27c1677f086c225f2bf2a39763bbf9c5d6efbbcf0cd884eebb9e200d03ad2dfe14027ccb4e0dfe681897f4b57facef27fcdea251c04a1b6723d3698333e3287c15da5d0fbeda0b69b31c0f552072be54e498c9ea8e14c92a5850d0231e3dd9cdd811cec3ae9df1e407623d54c986df03763b5c822f1c3b0597f6fc90345d74946709ef886c51cdea9ce4d5c37fedd91603e8d2f8663b3f983eed541 + +Input: ec5039af0779ec867f2c69892809ddb0a1ecbe61da78ab75af94c589241f0c36dd44fc89c43e1a71236da6c6e78c202df425293eb6314fc31c44ee78b748cb2086107720a6f1e11611a5236fc0d5e76ceec4c6bf1dc17877789f6ac8268dd547b0486f637421418cef73fc5a2e823e217db7ad950f489ab229e7230c291c +SHA3-256: a473a599d897a3da1c8fdcbd2a4512ed8416bd089c5037109bdfc84f80e1797f +SHA3-512: ec7047dc72674fbda3ee35b400bc1f884ec360419fe2eec376829c3194882e1388ed09ee0ae56f586f25d960acd497a988a6495414a9c233d9f766cd5aba3b92 +SHAKE-128: 572637b19cfbfb8e47c618a28368da2c666f114aff39be92e9a5eabe31ccda14fa43133ad03b7e6a2db54a8251671d041e36d49024c2bda3706b53307def1c2d4e30bc1ccc425729eefe19404ab6a87279a2da4dcbd751acec101d6399655c0b4e4f25457f1fd8f46e68020c788948e763d3079086eb60acc2defca9f61e2c40ef8290dc6ac01c435d9959b0a23fd19a550280cc9c2d73e8206c118dd4f105764c95168ea767e9d1e9b27b38700d6bbb09f3e777bfe8f51903b5034c8a8d697907be92379fc43b6f73bd742a5a04a5f3639d84090dd4751a0c15fa583150a12c186cfe6a19a188c2be7bd10d562f7af8f35bf3d67e8f5cd53edc3b2aa7ae017790dfc4740b9b19d968b3cd2aaff5b4f9c00cf7f8134447689009f4c2bffcec22b16e53fc8ec1dbd2ab32223f2d98e745bde2438b4daf5c0d1d2145ac5862ebf59c28a7bef63a6e8925d70fb2c7476ddfc6c82f4b8d6fcc3f62526788f44567ba72051de51a4b9f59910e9d94cfeee78ef48fb5f30488cdc0909d93fe2d2182b3266320d1a601f917c8d7829c80eabb8993e248c7302e0d9e454d43e219f530b467eb6981a3ad877643a24ca50b80a5e86be6b55acf36df16ef085b8a43cf839e1ceedf7753183dd42e84cc0f813a857ff9597577890faeb945402506d27de41e8b2f77c4c3e328822a2fef792ca49fe51a986709b176b08ceaed41dd3fbe7b58 +SHAKE-256: 2e8754af8dbc1fa132e4d408e0b0489beebb03ad3d1b1d550dfa9adeef7094add624e492b2f4c7103cb24c62937901987bcbdb6e4e1666ae8507178f715539b7908b8069d6d3de87cd04eced6d500633db4924b1d6219dab64267373cfcc28bf6884dcd1e3841d5f4365f068e4a4c494f39318556eb1b4172375969a062735286c0bc3b29a4bbadafe9fda3139716aed0088f6ae09a1f862fae61399a2b2ac5abdee18a2fef8cd4dbe82acebda7cbc097819a66dde85d14fd6087947460a32a77bbe252acd3302c2c9344f19e4253235456713e8854a4d23a6ef5d8854a3d0a6762618509ea7dabb3239b4953e0c01ca31fe0d6977bf23cf36f35a3dec33555e1b14cbb253622489529607eea10b7683172fe280c184264e35a8b6e5167d79d51b400890aa0eb66eb0e066b285be46d6a5e47a03ca540852e4840fbb3382f0553f7e08ef65b98ae48b5e3e82cca46b4aaf85cdc3618a41f0cde5c7979990ff67eb8c895b605a165d276571b64bc8b4b9ac9448a0031216f6f1047cf20e5b068c07df2bef82e7b5b6df09a3a06543ef1ccb4b0677174c0a08612e6500da75207a8e6d799de734747d8ca9834146e414bf2a754b1b5ba4b0f74107289ea82d4ca4a64d8a4de9ab275cfda1ca200e7bbe7956b47942a81b584e9e6e894710722272b1e2d2c373706597109441438e22eaed83c0f17c0aad9ec93979ac4f87492b67 + +Input: 68ce168e461c0ef58050cfa5a8d0e972de71b6bad0a8030ca6f897e85fe7dfa787583bf18a7e609c6e05111e35e1eced69477a4e26a4b011156aef475866c6ad41bae79da1be3330640db24e21f290ccdf03e1b706f67627cfb1177f694a75e3733b2c0ee9b25ceac1c86f5adee2f2dedcd0e366a9b5519c96a6387efa3a24 +SHA3-256: bee74e4eb770d8f4e061e9c708f1916f00153832ab5e24ebbf5e9b8b30b542f1 +SHA3-512: 13612bb71fb0f676a862f119be44ef04f98074e3399bc3f0dbc55af18fad890cef29e7a381400b8963f10edd02374a3e372c20c66a560608bcf8f06e9759ce35 +SHAKE-128: 39effcaf324adcb0fd28758f714a94236b3a4118e09415e44046d8845dde51d916761f5728b40554810e4542c67736a118afea34cb7cc7d87b645a9d2d1cd6350680d01c0a3cc827cac0155cc41baf45c2ff82b245b674ac298d3369b0a02ba279fa3c6f6fe114018313149705107f3750c16f36df52941ee3c2f28b87413eabfa4d8fd0a574aa87c25e520c78f3fec5ccf03f6d35a75e3b9366d37058bf2cdb8dce5cf0dd64f8524666bfe17370e6c7f5105d6425c6564b47d74f79c81501776276cfa784d4a0ea87fc91af461936f9687fb88adda48a5f814afb6c57c64a57bee662805a01dcf8add10aa1d0b3c2dfd454f9cfdc147836a820c878b89fe78e2546943041e5176ae91e26c65be21d1922385a9f67e157adf9a64267d9d51b41266e368a5d6eb61c222bae40ccfb88fc72c70835a70291ebdf83c9ba05347bf2e2dc1bd92c66d8cb9bd6570435efaff4f88385a32f5abc46ef7b58b971153f70b2ef657408951ff5cc0ee072631199542e69f630d9378e01af68760affd04fed1b0ec9b78db747b797c216a00cf0e0e7901c17679af65769657284dea615dccd0ef48bd34deaddea1651a2b67d149ae65c7393b304c9fb90017851421913d289079ae61a807c5cd9d6bc6803cd09b369d14b480611b30d4cdaddd9c4b2c794bd3837620aac9952c3c24a68b9aebe05a3369c07843b4357e62e3e1eac20642afa +SHAKE-256: 56b4dab1858bc936fd304a649f05d86d93c19e0b839516a8b781d6ec7b6b796fe86ea4a30b5a5bcf1f23359820ce907c1f71318c2ffc3d57b7812eb53192b9d35eec73a755b64453c06621b8235ad483db7071c2d83b508750c89517cfe9cf439620459c4c3151f2f360c5d55f68c40ce1f0f1ef5102892e9b931f95cc462bfb54c2c57581201dbc7a61e25000577b799f163f454e01bef1f5cc8a721a60e88fb9c1a07afafc989cb818a23ba9daa46dcfa981213f12e3a85716ea51ca02e23bb894e54195abb9a51c0b60dd4d066124e1830ac8b8c48fac68f8b0b30095a08c051663de40daa3bbce76bdf016186559342b122e7bd61d7af31b5574d28f9f4dbd940ed6b0e41976946af256977eced173030d86e44739d2a882447806d37626f0d824584dd8c3f71ba93a3d9fb0c81a71666a99e230bbd1605e21a1fd015348f6cf9473aa84b70c732fdaa8873d6b2d739f1394b49c1eb7fa74613a051d425a22c0f424d870c78f47917293cfb8b56957eab89e8995a73cb3da237191ab79fbd6106d043db7be0d1905ec88820741c16b55a77c7507f7cdd667bda56ce2cc53418f5e51cf635f3da4028aa39304fbc2ffd048b0d262ebb2376fbb69234b4d594ee07c87a10ed333c5fb141acd14eef124a7cae00c773fb4524c28b14966cab9f5f89b72be484488ff1fd5b5d15ffde25cfbea0b2652e398fcb4c15ba7b12c5a + +Input: 37c613d7467c9c7bed6e3b146d94b981c5dbac9322a2407a4fec381111c4bda2f56aa4ce4ded9694950bf1ff5794505e12fcd2aef9985f28645bc5c486d063970ed2328e139876a7ebe066e088161058b7a05970a83d81b1929772b34dc1edc05094c5243a97b9e16a1a8ce89555d8836e9224d2414dcf59f6740640379e24e8 +SHA3-256: 78834b13ecd041cc6fee48422830219dbf00d04c4f8b1122a0681f4d7c7f8fa3 +SHA3-512: ff7763b88c470469b610899f7c10a265041e39e1f10e4f03cc97e5eee4a264e79864da497f16d0e9dfd10185cab9282c1a0f00838b916c8ec54f0414c4d9b13b +SHAKE-128: bb0367c0bf50c7cc407c9d99dc9a71679dbcfe3a3e6e745f42f147c9cf15564732a8aa8a039142bdc1e2dcc37fcd8b6fc6aabceb5ea1332a7f944c216f99703f19509b68667393aab5980c244b67a1baa6e5f0520b23ceb0bcd1ed17e2608a9caca086186ffa564b1014c202a5e8499a55ea6bb60a03727c2fd1f2c586bda213ab896fcf4392f0fd18b26540362bf156ed4582e5688cf8a3a64e661abfc32207b18f9e1ded38a0cec52b8b8d8271c27f73c6be7d11af68a4da18cab65e4e6499c1d2ecc59b5bc758b22b75e3aeb9670f059659eb35ae2381c2b1708b8c615f02afccfeaab1a9a814c47fd10d098e7f10f0c4a83edc2d588061b45d7ea6d3e860d2c03a5dd75172ea1392943610b281166172847fcc2fc87ce30f5263fbb7b4f4b6e39ae8b7eb3935923e9a8f572d2f95a70462cc54e0f1b0bc5839cc74e5c719a20837bf6626171a1326b5a3feb3ff424a9d2926e29aa2444718813549b0d13183af149d8842981e6296c4a4bdec9d1f04a7c7c0f0879f054b4b1107aa542e6397bc1c8e598cce3fb32654b3ad6ce9b45135195697b0da42da3646e0dfcda3c148fee2613d5ca8acfa04c505e63d6828f066234e1259c4c113ac9367ab7ded34d52d657087f5ccd6818303c7b427b4babf8b7b08e7db074d66f0190fdf7091df7efa51169ec96772c80bfc523d275165eaac6af18d5ba428f5c3e09eb59e6af8 +SHAKE-256: 11bf70eaaa3c944971ddad23e1caddc862a2affde5ef454a2414d0f1a42a7e7d28d7858dba32e2b555c529825fcb1217001de6cf8cf012bd42fe32ba5df6af7a056c85f7d57aec4dbd0fb7e1277d0cf2cba44a2d43a3689e3239446b6520c3e85a698e290f3267567fc1c7739f19096d4885dd941d9981eaf4c8b817f9df23b15047bd5cace0394c9b2a3293391e87c08f1e6167fb2ee2c412b693c36734fcf331378fd6080358380d24e44e934f110e8d4fd2c3eca427a8973548de7f818c7f9c226ef2d5a280c087305f0c053970ca78f6db4e2ee9a2bdff0194c6f2fd463aee7a64326d086db73d0bb4162502b6c37765789dbcd509db887ba27f469a8ea85dbcbcae2a33ea5ddb1563d4276e612e79ef1fa25cbf54141e0a8182b46d4f197633add70d0030961f26cb26cd889ee90f306ddcfb605243dc5f7f584234a4e3665e66b73b8dc5b97df2e7b99d4e10c0fe7b0abac8cb2181dfa652aff7304de4b97ca739bee8270fdb88a18fb948bed5d999de4e567e836042114703359dc59e054d6e27a689c2acc60be7de6ceb9a9029ff4d3ba1381ebcfd04ea42bd1702c8f0a87f7d9de155910d29b22dbacdd36010c664e361b18d96e93df0d1c6a082fbb323b740e9fc8663d4da6ad910e65801d7548cefcd7de346de528e6a99854fc8e79ebeb77fa9c4a5217e7fee4f168c3476c32d238115661189373f81c4a12ddc + +Input: a822ed3dc2f1fe3998e2d733821ba4ea54e9595658967356dfd525e2e758555e2d70acaa6c993df921de4beda0bd459849f58bdac8eb4b06fc08e34ca5a0a9f89a2fbb8c84e63c97744a834cb5c63b8821b06dc6bf80b699cd3dc2aa565aff75979fd911e9ad3e706299c46dd47d42962a9b9db3d3146736a0397845ed00eb904e +SHA3-256: d1bc17fee89897d851bd9d5f5362b999cd1d02639bdd6181e55256a536d26215 +SHA3-512: 252164f74eb730edc743df60b5e755ebb7cd6d451d680f770c739f6ce2b7422312e36a67b5400efcca006343ca7ba2e9e716b635674e26ef297ab361a7fb65c5 +SHAKE-128: 7f7bc9bfd0dcb80134667ac0fe22ecd805148e76c4e6fc411746a771ba23d1fdadd1b76b928805a0da2ae5fe7e0870561c21af3ca5bd6880e5a325de0a485c74283b0e39da280a599348c6983518545526d1ccead1708863f1d2f72b505d5e95fd0479bbe4d0a4efa3f3784b02e22a6caa53379514df0bbd7e0c10c18b2a5f13af878bc7c131f216f259967369d51c25042da6bc0d663145e69397dd5f53eec7c094e1e57216ff1810eaf047bc00ef31d6a1086053fe401dd90ce5a337cc24bbb4f90578023b01526df2b96a448e15fef8dce2e64b03db3e5bb450c0521516ede835711cc7566c51073fc30fd395223998db6f7bc98a01a040507be97ccc7ad64bb29b3db066b8214072798f02556429969a15ea7612c860610b7e7d8f618cee9a0f29d16c2d2e4153695fa64d3e31ffd7171382b51e125991a6de4246c1e5a54fbf29d7516f66107cb71c206dbb24bd24cde5f8e24dbccaa12501bfbacda8eb7d93cb9a3030083a9e0a6240fb5354e8a9505b1192b421ed66888f8bd4eb715337620edfa9c3e90033276dd0b88086eccb553495b6a2a7ffab378cfccc438f39bf8db1bf1c6e9bb96ac74ba0888c5f0639d7940180aee191b41b1bd4c157027ea3755c11b457312836c3f30dc552745004ade8ffc404f71975fbeb68ee4d9338dfc2f856243f24eb49ca44c4b6468ff4ac9aec62831a0ebc53e55c4def039a8e +SHAKE-256: cf1d4cc392dca0081cb89a1f177ab711a3b5440240a1cb6e832d238d393c4513a8a9d002a73f3f8395fc1819f082a52758f141d72c5185f1a2b679d4c5010ebc6e8dd445d9e4a2e310e726ea00be29b36b870a37d75649d1becdbdc7afa561364b4236e580a7c30898bda66bf5b00d4dfbc19fc11969336836807d81c8f21179b9e05f65ebfd9a919156cf1b10cb0a3b53f7bc7ac460c179edc0e2094b7052fd3719ff6adf679a7209bcbf5a1c8e6b1eada056759207a93a27504fb6d8f42893dcced18087f3599783648c8d11306a7e1fae5a0f7b192635907617ad3bb23b18e3f02c2b8243c3a1ba936cf98b9f4b30087b53e51e0f686da136377cb96877d75779521006f2c07eb0ca3f6b1a1985b22ea99e481b94fbdd516eb4ec5f4d2ab2b8a657837fbfe98bbfc534fc8e341d39b557d8326cdcfe8ff66f59f94aff9d8027149523a4fd658d135c36fc12fcd621bbf3fb566d45e868b6544a8cb061af44b82b441243b9f998c5246214c6c74da6f90ccc8711db787f5e7ac44fc8da63e970625a788f71585b75eab40c0aba1d84512a3b04ded9037975299ac7534c44c810380f768c93dd621ee022338b81bf12f5009d58cdc50f250f42f336a74b1f3f50a798fdefd4c4b282fb193e2b5af73837f954b5b626f7016b150c218384400b2bcf4d53cba69d768a463342aa1a546347fa106f73c91d3cce2496a43f480cd8 + +Input: 93d3549d81b752655ebee995eba6a3efacd208627ee7d6b487f60e77178c7bbfa26120fba577f61ac86319ba22fcab9703dc96152f6a091fbe6ac3f35fa92c9e3d2a63549c8f5179e390e2fd373c27d492e580f0f854fa44be656e0feff416304307dfaf52b1bb50190bf4689b000468aacdd8bbc64095193d6ca5c0da7d9006b1a3 +SHA3-256: ecce62ffa6585e79d3c3f72abfddae91b589da964399bb6360f3f072ab38dedc +SHA3-512: 433b5b162fd791323aaeb44a931434a1f2a8649997a1bd1fef9de9ffe8376ba67cd0a343f998a21a38fe87657591bdbc095af389df5d2176387da3258dd2c0d4 +SHAKE-128: d13276f14cc08ea815f0e74fec9223d21ed02f80d9b45c0b15cca7d11d40725919d7541fc41f91f9d04b5d8704952763575fa1e4229ec0ae1ff47821af2871b73ed43b334dae0b8d3e7e256f10731b969b46ef6e5329e86afd96ef9531967a642586158f0702473784155a7c6f4cdc9b5ba0fcd6e2da23dc32e5d63a80344365ece7dcea679f92394ea0a304f90ab8ba6fb5cbdb29b8328aaf21fdce6e0ef087953ac02b95c38a7ae114966c98977cee0379f65fb2b49013a6ca20cfb93f0e83215975c64de4f6b817d0deededc18b8ec7e99244096d86e12f30a99312d0fa203a29fbd1c28d0fa5a59516a3bc64080c9a069eea2f35b0a92ac97bd9d4af4c819f84363358e593e8c2e39dcf00863471929935270c84e64ef955b2affbc1a13afe5c34f7e8ed494881070a350ff3a5f8a93845fa8c559e006e92d0267f5df13293d1d07146ebb8088b7d5eecba083b43f0b5965381c196f59bb39fb9a9245589b8ca2e7240ab470d0bbd2c51718cd065f5907b9d09b61d8fb60221bd35ce9caf8908c38482ae73a460e94494263330e6b541b7459fdfc5a2a5ce28bff9a580b8d35d0f3516b0c772ffb1ff8c044fe21136f5b9a46f48dea628fbea81cfb54765671750b145eb7a1b5afd98cc25866e93351b2510e9499ea3e1e930284b299fc0dadd89a7159b7576c9ac20e04a480092daf09d0889897720b36e53d0f1fb64df +SHAKE-256: 8b4b56492b2815289538e7bfc086aaf4b30dcec3ffa054198b07e45862a09a9cb62066646c69ce1269a60d3fd80e7761eab1f93d8af130a3b5605f93c333b03bbf8571831f554b1cdd0e38a11dcc169d4e8ef797dcf2b06028555fbf6082c3b597edaf8d6d7cb18ae84ef8d89006a02f304d4d27a952091892d1e1f4d92c2ae329dd75aa401163d03eda0b69118d11dc0ea82574fc086e4be968e204961655adc1c3e4d9c038b9cec0107ae34e8a50ebb21b556f4d99f62767aee163b07128486542f33454d3a0ac42f7f5ee2754c10bef087ecd5f42de3a9bc160e145c50de14cdad9d83f1dfeefbcf42dc13dfccebf503750748c3fd01574980c00db1112f621025858cf0bb669ceece3a07f65b12f3d5664296e05cf7a7a18084122e48348256b29412bbe534334b032b6d1281f45f35ffbaead248308c99ff96a9198ee82a00cc3c219634077598b356bc033d2e618aa888f922a000d224b965ce82bcfe39d12260a48f9ad6aa2a899089cdc770cb313aa807a90d625927bd3b4c1f5cf85270d743e6fb256367a959ab505f43ee758d99b871ede33f217c30a2ef1c9533a8cb16b50da087f95fb92d5c4d1d269eac69b62ce5fa8fe918a29d2dea24d4645ab4b26794e6d79217baa2d8b0d1c12acbc110a344989a2ad0a5d7bc0f54b19fdf95ea98b0cebb34880b988181b25042e1cc8421f3d1f6ba382829036032aa461 + +Input: ce13d351614d4b3a8433156a1d8ca9da3865c08cd824022c836e2d204f8d05ec61f7edf59fe8a3fd90bc50314951b58dfb7f8c56ceee1fe400fa25d150e3270fd789ee2823b01504457d8429663e0ba78ee2c39e8016bcf2c9e1be459dba5a1d50ea3eee5b91e09e29a755e33870d8fbc3ffe87ed6425b4ae815833e3f7c3c32c2ad05 +SHA3-256: 283da78f172708fc0058f128a74214067ce44b708286c483d63b9ad51fa4ede1 +SHA3-512: 54e9b4afab2922f39b6186fb5842bcd8c7233ef5bb66785917a4976f63889d2933e9e4223d212add25830dd490227d97e760e4d4fa657c50ff7914298956cd5e +SHAKE-128: 517512791fd67c6be32634a5ef21341c1fbf4168a7b6bf456625e66efda6350b7db4ce1f9b2e73bb54f334231b6455359912887ac4052274707d8ec4e41907642553f95d58f94f54f7f2290a42e50a13cee9af3bf5c89bb9e6ed83f23c5e8c692cfde82c251121574cd25ecc86ea3c2ec31267dcde8de572799f3508cc0b9998aeaff74b6ad70f0207bb06fc34e727734ddc07a603c6851d3356fe31fe55662c8bc36fb97214e7179c0664653239061b4583837e30a67d07e206f96187b0e42e68b68ae8bed7a40731ece4eab6b2b89a2c5d0078e2cb6c793e4dc1b556492ce83726f34727fd253bdb1eac507ecd33d473133e4ac55f208dd8d2e4098d1cdcb17ec96cebda830db449312828b57c1ceba46d7a6845a7f0df63ca646173695051fe13c5b2eec568b8650a2eb8ca5972170d9237cb5000f24d9b985c85ab6f832ba7def440530a3491d4870f8f5e5bd7bd4bb87d4e9879966fc02cbf06360355b7cb6cc924a2e539a3f5b8562b980269d02d5a67db8862c2146a156adb6808cdc08f7940ef0b33bf5bd8c60282da7b828870d48e2e2e634e2a4c1ec7e76bd5da938a8b5101abc10364560588b6066129aa312d0b6dd24446dbe88867be381e61cca27cd572d2f6ad76411a25911a10a8c70636c10b003a2cbfba25ce2a537f533a286cd0b317744cd563bf68a95c8480b1117b8b4b7c84c8bd30ebc0cb1c729906 +SHAKE-256: 7ab3bfaef07fe0bd3c45a7bb89942d5c66d7c74a3cb41926e03b6a69d19d5b68595cf275269c792e01901bcd62cfcf05e817379ea66ec09b861de0bf48b8e436f47b43739c6273e5b81698499ce3724f1eeadb99913c0b93bff867952ae8c3d427d751da298309852bfeb65825a6f653c360917fc7fdaf60363fbd7c5944febda76975fdc0b22fea0a69634fb3dd10001cf631ba94f2ece8cb7a85c8cd349d925fda6cce5c173e19e229832020fbd8fb87ad900ae5cc730ab38fb156d176b76abe7d79374fad508a7812ade43daad487668d10daad078cb37f339d0bda87c14d4e0c5f7cc1ea2a1eb2b648b9a218878859ea837eb74f159837d25fea9c6f621cf1dd9e1e010e5f397904040cafa7dc35d87ff7aa1ddb3e20f1e827b1ab5c5ce0d247d7d791178365a3af3987e07fba819737f9326ed1fb8e8d95f15308507294067021cc3e964b09b2b3da9b7e100d15fa726c4c89206582afc2a6688d9a8a8638fcb27d67ed1d1dc5b31aaec0ae3714c1f965b6b60da22fcd5314abc5a85b4fd82c3494c151a3fd9d46d1f22bd3326a11c9125a0014e8b9a935c8fb504b20fa061503675dde2645b527b4cb0d7b955a07938e3ed29ee3ec37475b9bc1c2b3d338ab0f3cb234315cb93370d76124828c59fecdd8e5f5454eba68e5be8c9f450f0a73a48d7febbdc3a924e6f8502143f805271b4db2ddccaadc4cb07064c406c6 + +Input: a36332dc9d1474e02587a0575bb2226a7b74d1c391dd1de1adc552f2e64a167f1886ec7c9217f128b07555fedae6bcf2aa8ecd4ee8a582d84d6ad252794cb3316d060690211997e285f629c5f264c39da1771d7fc10a678ae6f92b079e81aae9abc290fd5ef4b30f4097fbe111052786043f649f4f1a7ddaa56111f72db2950b37a5e58b +SHA3-256: c33d885f5a0cbb797341396ce23a467696fa9d95ad5573629fc607b83d57d010 +SHA3-512: e15170e4cbe718f42f570151c531acf88e0b448ee56a836553473fdca1d73ebb19b9b0569f6cf15214445c9e993e2d219ccd2fbb6c6c00a578db1250a779046e +SHAKE-128: d8b54fc3d921d1a2262655a51cf14af350508f2acd21940432b86525b27253206e9b14a46641f010f8739918691f051b17b531945d5f43d27fc9ac65f00372075ce7e79f3ebe908488ca5fb3198ad9edc51d394e3a6f9ff098a15a44cdc5c7bbb4cf8b074a0959e39ab85e1f8783924859ea338c4b99980010827cd174b8340ab5e053e0a7e501467468ccd19cac702ffa77529c1fd379b71fb66fdc54db3ededaa625e3711fa1b6dea9d31fee8a26c977c1391848ba08c8ec4d7900a71033d048466ab417bbd721efd7126f109b05a6942f7bc0a844bce6880547ace57ef2e989159ffc69ce02343ee4bad123c588c75f56294b9c5fc25324890618086619d86fabc9983e7d4cb8e8dc6cfb3eaf3c8334ffe1e265ae84ebe38958ec9a2a4b8efa75c50d1144a6bf87b5b6f5b8c08bff47153fe4c48f94068e204281355e4ab5ac96e4228abbf6108df5016458bb7e6f257bfd63da7ec12db754def0d227618aeb8278241f72bed11e89a7c8bfa58db7e80c9ce508fd9ea062852c3d90e6676489fdf7ea2c4332740edd386594e86f5ab6bd7d0d5301dcd882479920fb91980898abcee5b471c4f8ab8d4804a4e98c77f92cfe4a658acd630ba80b3ccee5eab25343c31315b4a811ae78c180a1c217c2dff12668a727419229b07408a9164a566956c871c9d75c36ee895c454dd5342c018f8571935ef70af7c6b32b531e52f3 +SHAKE-256: c64022e9e52618e44ccfee0b920c615753a12f7f8e85f3f1ae144d3d481baf19ebeb5253807887ffa74d16ee67d1b23c5fff4ff8eb6e8e38f18fcff48591a86331d9a1307a132df2f3d1f2a16e16cf0a8ba187a6ed27d0e275b48409b3e09a0841664a0e716a244fbc7eb485275e6672589697ca313f64651e11e74a64c2b7c847d673e18f0d79f8dcd8e81a4d4d3bc2fc7dff81e604d8b5a77f39afdea80ed1cf1014d4cae519b8732f4cb2d390c7b16b0dbef4f53de34319ffafcf293e248a054a191f45ce6a11aa564621fb5dfb4c910ba2562e627c01eae49451a5a2f9f6df90877c7770be01c94946c286237334a906fd82e653b2c7d6bd32433f6aeef0a6d42e93930794e3acdead02be6ccc15834deb057f7e85552d2a38c9032f548f7c5e274dfa69494c7066ce185fc637a82856a6b2ce1c7eb895592a9dba5b9567d96b594e394cee241c42289542c89ce07632c98ffe383ec0fefaea2a81ec92566bcc811751c31a7017c79e4b2b2f0f0906d31d915d7b0838e9f2bf055bf132b9454e2f470f09e15da0152fa0fb0d060b3368e42a49b0c3b791a4f98863c7b612469e65cc03b2a3a74e0ece49ab14897ada9eb777fa63dfd81d5de10221137dd32c9e4c0481cd30fe1cd8f432d1597ff2dc644216fdd944e6dbec05141d1ad8ec7e0b09fdaaed3b4113fe94362f59c44e47ff4c5ad7de99a049635074adf11339 + +Input: b7639c3e054c8b1b1c5fa748f1e9459585e22cbd5548f933a8000414ea4b1ad18753e45843b352581c50a44f2650e5828999af0381c4de516f906fb8fdb3b1a34716c5f14eddf2d3e64dfd01c2b48fdc7775e90971393729855b6d7dcdf382b7bdce212483d712f00c7d6b993a3f70ddd47fc490951fec5236c2d873e391f56862d655a383 +SHA3-256: aabf0cedeee7fe03ced7be95a52f5c0ad3a4f4793f378e50e2094b5b01e0bcff +SHA3-512: 8278d511be1bdc5bb57b287d1b3d97a16da0400d35e396c95a618fd34fcb7ee11135a034c9d34fbbd0e35931ba49f04bbd0497a163a5f04205f990cbc57968f0 +SHAKE-128: 7bdddb878f5005e678eb9e3fcd868dd9c3069ebf611d1a46c2e6a4e745758a60e3872cc995f98b141b1070659eb14b30a4e734e03e2c5aa471740bea6cfa376c85b8dd794ab825b19b9f2d3afe6b8a13f75db282fe3fd22d654b504a25160a4130c9bfa2e0d3dd60430ec6d1c2f6e42c346e5a40bc594ccf983e28c1c076443575eae8d49d252d97edcacad10b1807e753e65e8df5cde408a20914cf9bf8e64ff5cb9ea12c69b611c7406b9d8cb5168e6737b2d30d50339c0a9c73ab3246b3ab7fd2ad8e5bca331aee4b5df21a377e953106b9b1f390e403532fda41b3f9397a2b23cb81aeca179a6a394c11ad5a57ba054e4c62bf38fa719ebaccc37b54ae81b46c3f8357cf2fc2846805d26631d2c447ee07a079f489e2315212aba1e27a6f1a99b10f3d7208b614170f368c08ed13b9053a5d4c3265db22957c120fe63a767ec9def5c3bca25509ab0a70677340baebc4609d885faaf3e5a651576c247ba809036b3adce1bd573154478f6d78c78600d1777d5025aca4499db44007a1b311f95a053efaa4ff3015a7a2247f53d1c388224d228b27797f86a9728f8d1f831ad3000ecd88857065dfe230bf4fe384cb61ed13d5a275dd483951cdaf36b0b3c86d3251e2c42a92e7ae54697c400a945f7203f3537ee120d9d9d8bf32230045b1d70e1d8e346bd7f61ebc07dedeff36e9e9d2662d7a70543600e20cfa183d7ad0 +SHAKE-256: 242cc0773ada5c7a9795d56a4cbc9b690bf87ea2b884bec0741c139c5526209edd8760f3e0ac1ceff51048f45d9ce0dd92a9a5e1016b582155475662d00aa9893ed6c94d9b54265d0d5167aa5ab37812f43cc2a07e914371d76949059c3c82776d8d702f0efb9d877a5f0b4acc6e87d59701c6d0f383129384d9722903db32dfbd161d69fc845ff2f738630c031677c2cfd43fd2aa7813e6bcbd60c636e5f6e40ff340c5b937171179b01e4a0d74642fa745bc9f2c2cf1a4be45e3d5894f98550e5ac2928934fe7c72102b7515fa365bc5a4b9db43cc98687583df135e107b38b980615b723d1c1906c5a9c58b0d983c52c48ba94878db8cf317ebe6dbc00fd3e5b8e1398962d96be9813f744bd8e297b76894663cca732c4a91a180ebde43c5e2993b11837b9d3e24ddb64b180d3c9254a9e62aa3f6a7824e8640e45cdffb666536414a09831dedb6a8202d4d01abe6531d62acfeb4f46ea0dfb6bed4b410c0a4f6c197fd18e2bf27c70581b382190266607eb8f6e4fffd18e06cd45d4999952bf2061ff4f52af51efab5433bce3a2510407d374d2d53701163bfeda0c0e2acbe64bac15e3be31a17bb676d781f9742e9d34272834e5cd1d6e14a01727f17978056aec039f70014f3c6c6a826cf4797c7a89814eeb1e966e2430f6a28846d4a99a874b7caf369bd950e00d7cb73d8911f3c26c6e11774dabbcb4c1b1d691f30 + +Input: 574c00bdfc9ab2f7c09ce02d209e975ed609d9ddd16712ab1ac4f592189643e2b10e2ea13a6137359c0ad3956647d9c0c0169d41f5a43dbbce350a2c83e45716d17c7f0ce4919559737de007a610eb9d1d96f19a48364dc70edbb09514573c1ee6ebb1131d26ce836b14e141b963c073bd586ff50125158a5242fd232ce7e7f5d86ad2eb9543 +SHA3-256: 2bbee2795dfdd0d733e7a84f6f0773d003ce1dba900d701777b0c17d4b62a950 +SHA3-512: 8893f3bac1dcb1124cf6d763fe0147d185c4fda24116d5db9a089ce4a39934d54e1daa11f2fc02797f5fb2b38864d8cfbfcd44069e7eeccb4b1f616912477576 +SHAKE-128: 7157859a930736c636f201eff4fa23f753712a2b8bf0251a65b2b0bce24d957b0a2b50b03b2ec142c6e0eb7c30431c4468e9d8b5371bc43346210949d31c8640d253344ec86d64264d6c3f03a41555e94e071c4658efbcfcc8c8bde2c1646a74607f0198b3a96c20b3e93cac4e7024b19152d7ea3efcb848f3cf92ba635f09cc999c1af86c422454254a037ccde5ae45ed4ca7388c61fb7dfbb3cd4757aac4dc6cc689514500b0fe4514a3a274105d132b7c30a960046ef19be35d711850071c9f8875aa651d4144913ff683f31c713d025be987d5897ac63ee573733aec2f818d00099fcde33f9f40c77d59f07cdabf6324ebc610ef8d399915a8171685d4abd66a8b458269ac065b2a38eb548397b7e8976ef0349d588512e8111196e0fa3e65c2a19c9bdf044bb9714800575d6b09a52a203a0d2d8d0e3b4238221ec90f86cc0d4a9b4b3a1d3828411098166a71d1659fc96517d0684c4bd587412c0d74195c86d673a9661b5c824eed70e263664e90f1d6f771e60846f5c7bbbc32ff08a4e3c87f56d5b7a06c31d8412aba6518af73186cf30f10c8c8a0d298ebb59f7bc51fd8a43f2107e822b393880239783a8ba0cc7bf4f475f3b8a3206fb66d357786f2404a30a38abe483edd8bdf9cfa491762f16dfe5ea3f904ca89e1024eae7a30b8dee2037f3deb10c0a071c275cee5e8df4cb13ecbd08236d48662fdcff4d15b +SHAKE-256: 92f8461bcbda3a94d56701eeb6f982cb8508353f78145bd549087865fddb92f0276c0ef9bf196452bb4f9e15d88872d8231185e276200710682116236418b2eae77021514f5a98ed685daf983e9bd13dd29c6753337d28a2cbb0608fb8a61eb637943a951eeb9b88dd810226055b56df6fcd6112056cb86c4c16db33078432fe093554a275eae8f65c2f1da7c57f51a470b3191df54f13f0c3977af1d7df910477cbc8cf91abf8c850f020eaf6c353a4e321994c332cdcb4783745d24d328bde50ce195ea075e5e49b62ba83c1eb0fc652b5d81a36e54ab022ea2371150ad9eda2b128ac15c24f8775a6e591b919d4c9b34da20c8033c5440ab81040b3c07e2f144dab18f190e4d61aa1cfc67f00ada67c903b27e78a854c986f39ca67a4d1145370e54a1ce2c2d278f54f096359606376e3e8bf40b7be1d1d69961a78c26b62295f5b0e6c9a31dc23dfb4461ad25d98713aacaaef08f6ce9a82d5f6fb91b79d35591f783265d986417f741d048578fd913234a2a2595bbff12857c3c7e65768b4f9cd54256b2c10cfbe3fe948522ab6cad2954db47b0237a0f9408c0074a1fa68b0fa1ef61923b9be021bb4a0cc0c1015311fab51aa9eacf7137c5b536d1bc889c248f68005d5606773cd75c5981351077036f3e7852d923cccc38b89b01058dfa885c00a949e53182e2931d2fcb173a3a51b6f58a03459a9b33eba2f859ed4 + +Input: bd9216aa0bb848df6d137e5e0b5f9d294d8e06183c0be2bcd1f36dcedfcad7ff7551a9409d1f91f74759be71e83938c24c020f4995b0e1086b7bf8bb432ee5dca8fb2a6e534a1d39376b04d39040a818d7626587a4b25c86633f6f8c72a673d9880a0d11cd37658acc7a1c990f0aa2006236622c2876a315a025b3dca94cd267f29e940fd98fa9 +SHA3-256: 53c3ffd99923ef24c44d422a779c4ce81a1131c400e500d0bf220def62cef9bf +SHA3-512: ed4b9d297bb0e65977f5891bffde362799fac57c8e71d9695080239c4e4848be84db2755bcbb2104696081b3b95c1b190a4f9d73c7f960bbac5f8d435b6c65d6 +SHAKE-128: 6b95cdbea85bfa40ece1de7cbd1ada561e372f613325cf3d842bc6ad54efa3ebf8ffc7b2a30d7d1bd163d2e8b75dde7e25234115cf0873080522a1338aec767cb2aefd9288e2e2b1722fb87cb9f82517320b0362a27bc59c6e2450bf80c3cdcf69803f61f6ef0a2b122b6be9cd6d02b16f1547ef189dc388de3fdaa60757fecb22d9d492a299a14f73d898ccf38f84846c4ac51bf8f7970c9a9e95cd7af5dd9ab19aeff18e776b909a0c6616157ddcb2ae86fbe3f67c3b7a8369d54365a772b2aba9b68e679690423a53b034d92a6878c64b0916e256b1c0750db1ed03c91082c3c795ad7723b0b56a8a15ed7c66b51643af31f8ce4bc43f4f584c0c4e8dba038b6a2ad3604a9a2cb600ef50f9b17dc8708b6742b357976e0e949120da83cf67d0c4cc00aafe836cecc53584cc48483434edd0e8d4a78046672e5b818cf1bec03fb2c7c29e945784e6829493f49c3c308f11520472851dce9e4310f093cb2f73b3d0605ce764081f114105781f50029293a92a788e46dabda8a53ca689dc43e9a8878311b0c9e0252d6361489395ed5da897349a0393f57261cdcda7d83bf0a18cdc621f82213988fb3515aaa8a997c7eb541b18d8cc13115720ae8700d61cb570559e7b2c70f27009ed744dfcad16a7f2411c5d515d584e1c70011254e66f7d34fe72f3d649e4b83506f4ff416f77de480515462a51aaec3c2abaef8d9e749a +SHAKE-256: fc38b53bc8bdf48b4a9ccc1ea3b76d6f6dfb65658971f5fa83e7124335265ce881f11eebf925d1ad0dd3444419aa8cc5aaf7ab92d086c641af0311dcfc3f46cf8d1f81861f0b1e25f6aedccecef792d52a2fdf9f5a7b076af8574c321e6c13ae1f7eba7d0f068d9b669162035fad087c57fe28c648c168d6e69a815394eb079fb250a231dea8f6c2cac96f72b06eab13d366475bbd397a49c65498cba4ea092a93ddd257b1938b9926d5ca06eca0dd2f427f3162c34f90541dc29fbee807664643a31d624b2a241ea7dd7dc1f5193fbc98d0253eb76e9fbfb927eecea9616035c9158443e5b86ab2305ec8198599d6a1956e65e7faad9ad6109fe5c407ff0f46e372a00ce14b20fe7e5135a48652e32e313f6f4eefe5f865ff05200acf1ba68b8fbf4907005450d2c414b9361580ea4300c86bf003c44f3c758d6a89acc429c805cc148f224e66700fd2463dbf858ed751cc59abaa154f0b64df93106951f0e2ab5fb4743388fe694b5b6ef02511bd20c7cf9d13ddf63ff7b31924f2cdce2416c71fd11d1e1eae1345191b180541e6708a00e8d3d6570df36d31a73d36e1643d06b332490b3e4071e97c47b7a1a49f1a61afa7db26142a41c1797d4c65df0934851b6ba3d4e683551cb82254a3af647c9464c80a032db328f35e8e16d525c86bd881da650bed38b273bc661782695fa45b687af8566636e5473c389ec7dcb614 + +Input: 89917b5c2e40a353ffe580be25efc5d56424d1c56ae6188146e3ce2f209b30c5c575b65108e6888ca5eb7db5d7cf41b39518acea853e741b2fbe3083a27988e1b83bbdcea87e804e6820407a59756e9ccdd5cdc225625228a056f16fe663913e550c458f32d10a6250ed461c15ce7635410faa5b071f8ff3a65c1ad7976ff83f0e181b291e4caa61 +SHA3-256: 7b7b53b54ff340a351310e81b816dae770bc9614f7eaad68c809256904c35af9 +SHA3-512: 3431236679660fc13fd09d7a22d16b566b2c96064d44b774996d0907e0a96102f683e99d1d8cda92d8be351b3d7ecf802997fecad864948f2277a08c7a011488 +SHAKE-128: 4be60d4a7b7b0d0876560cbdaac7410788d490a3d2fdf4ef8e4ba092052d135f6750586359f4251307ecc75823e1abd162bf2a0a3e2c22f7dedc80b2991b3d273725458deaaf95c45e0b448c3a89fbb84dd4e6619aeb911250f0e9e56e62b128935ab11b426ccfa043206c6fb913ea0479f44e7ffffe9730653c84c729fa63fa74da032bc210e0ddb45ccf0e8f670d0028c8817a1afec945234c621f2da33c950d530b806eeb1880086ff4f0a11a66569af904786750b0d34d39ddbc77da8d6607d7159c3e22bc13216b2fe69e0dc580a79d9692022dd274072625901424462c7a7042ccd822eb76b421a98c23954ec8f451e1e6ab981fbe5d811bd6569a5ed765c2e27d5b4a89cc6130952fdf78822edab36745a9aa548da600efe07e9b548dd8be0e48a8ec4c4e7a3107d0a8684bcd07cdf0b164bac2d70ba8873d28ca9cefe7b210e887ef7c245ac0640d9c36e7dc517d80e8052ef4d2de522aa8348138122c8e1bbc520e2246f6fb7ab9dbd68ad35d8a90fbaf8123c849625b32e745c72fb77e415698774ecc01e75004d3561cdadb55a4d663501ca10ef8761b87257fe743c257b001ea7b2a1ffb18bbeb496c0bab40928394064d5778a2224ec13d33df1997d9623ab2fad08c16667e3c2b78b375a49f62ff33955f835fa843fbac28724f8a82070b898cf5a30f204f001d094ab7ab3e6a568dceea8ff97dceea9497fd +SHAKE-256: 962e382db26ec28ed8935a7d1987e2e882e465178ab9d848ed29d575e7717e0d24daa5811309cd0ff5d53629b1bd46ee15082d82b83f57fa1f2dabde0b6ab5126c929d03fe1b02ce66f3075cda95708d1e53794b79305705d0dca27305a2bd5b38ab10c8c197731bd0efd70b48bd5d30f57805116f2f2d6c409d74d2424c6f7ff76a039841f2e7cc4f3b264d94347b8ae846ac135b3613721201b8ffcb341bf1ef44ba5544a295e7a7dfa3099c6e41f666f769632cf4d6caf4505e19a6030adb42fd16a4d32ea86b587b0f37134322da09a92ce17ad037cfffa46df105aeef74bcc449847b83dd43e8e18a4ddce028e9d17638b87296dfc6987f5b42b810719a830e7103574c4bc9703d8f7201f9c2ae661a2bc3934c065516ff8e3e934a2817230bd8498351c992ec57e837f17ce50d882446cb888d4ec7dd16503d71bca187cc7bc86670d10dedbdf0923b8e3ee8bd54412678d4c79dff669c8a704f4ebad14a19af384295cf596b3cf9cc0d4c34d4993447a09adc117972e6c91c30b0c381c85096d05c8c8e2447b4d1ba5e653862de2b4a9b92a500564ee47dca8265a1ede9ca6e3d9fa34a7f219b08f5b1bef2407ad2511af72198fef2555ffd9614102f3723c42802b72a0d80de4d25190c0f7e8e03ef644d5a7c7a7b83e69e4f150ef455a58811d93f161a742ceb897baaeca88a7cd2299107ce0ebda1e02fec865b1a + +Input: 700bad39588403361ff086244ee3e72a60541cf640277e12b47f0adbee3d8a55cd9d2f5b91c9da969a5514e664406ce4d217c2be532db2c1def5f8316cb8054d13950484c5178b008c9c19c9fb516689e67bf897b60f3d69206dad8515eadadba1f0343e76dc4292bb507e14840786933aad4f1121ab22b70647b54998296139f375c6cf67cbd4829a +SHA3-256: 5f2606b9c4a89acaaf506c85f26b7f35b26d595d43bf5be5c99a490e3daae9e4 +SHA3-512: 8148cc206fdbfb98992d6997afec75ebbdf8c5c07a61eafd6fca292a86fe1a3e6fc70099f9f4ea068628c82416ce890913178264f14d8681f1057f3bf70e67f8 +SHAKE-128: eb03f27078f1fd2e32cd7be93e36c166d426745e95d203b491905dc3d4f3a48727e309b6993a02744cd7108d4934eddf65adc872127105ece70b49af41226393f39cdc89b749ef3f917349fed7d56173f85c769f81ebbb9cee66c03bd1a9479ead4af7524b76deaa88966179b86a19353e03864dc4d1dbcf9b940b3adb05886b3d6d69011d5d59d06067e9f379ce39e3df3fdaadb657b8a6ee3892258ea892e259f488ea221447f6ec1da550a17a11d01a6ed06f82adad792ad229514e503d7cf9b4d4bb92ca3d388a74bd67a2d913c7ffb1ea0fb15456eaebc9f5ee970b40241c7eb874383dd64e1daa9a0300a978b3b2f3fcd035ef20b5e8ccee159513e5bf978c9c9da31870c4bd6155de05963eb1da66efa8e03a11e75aaa5b735cf30ef2f883e2f029b8a619666708323afecf1499554796920c8bcf263c6caf92964a7cf27de1a43340d2f41797a9528eec96fc9c476d1955282579cc809f6d5e6507018a2b68d99564ab424ffb1e968ea60034648d8959c71a6f14f4b4b37735291c96d336b958eb54674e6f7057d585598bb7518489af010fb94c2d1394e51674e21309e0cce95afe4d6661fb91b4821a4ebe2c9ca1a4910a027ecb900239d5a2f2bbcf3d4595e9b7310d47bb3dc47e2faad48b9b27cab4198ab1f0dd78f95e3e3292bcbb52bda87168e654db2572ab3e7272d30189a1040aad9cc6efaa866651fd14 +SHAKE-256: e4801de7475e60ae13b070a3dd860f43fad63b5bef1f498a130562c3bcba9851e791b8649d72f62abd44271915aaee445d96313a0c0b5d388a513830996c5bef5be7b86e5af238f8e6ee89f9b7697f25e11b61a03247a5f120c6431bef3e21eff6c22a4a199a98774da15957fcd21e2370efcdaaf1a7a3f98d43c3842c845787d42107f63cf5f3244d2c8fc17af9d371643d7f6db1524da3908ae4383d6f0c887d67f69e24ec2b57dd301872cf9cbee6a9ea36147f80a59165037f8e9effa7f07848f1623689c8fd1ff90eb48c7afcea434bf3e83f7a9ac56a024e329971ee3d72487d195d10cc13f9cad3ac14c1ac4cbd99af3dfd6a4fb83bf1eb42fc994f6f6178d219734cfb9c4dc060d9609d7dbbfebbc5f2fcce7c8836555d05a7c532102f981b4d82fe67cc02bb2104e4d9f354812e24d14d130131da38c2c58b8075f70425ef4f66c27382db5104cbd629b80f69a78102cd66d995ad3d74a1dd71f36ca75f69e8062d7204b33ee301173ef0c3b014265cd7f30f19b50a7130b7b1604d716a4358b364a589fc3caa98909ea6d3fedf67fb17825c05bed4f194d67df484dc6c00c3460050e53c28304e9d407e74e43d4184614874b90fd952fffc54e0da042b539b96b833a1aa2ee71f6a6d5bc18a2d3b878a77be74e3fb6edd0fe3bb046aa93d2c91e20a18c296f8cb11d8fd61362890742d638b5bd6f4c41747880fb2 + +Input: 1751740e80bd25ee5b5c6a1bcfecf420c8e7fad8a7d0c4fd65e83569e43641662b5637c6f8715460f5ca025e27022cef61c9b86a99d4f4ddfb315890eed541b5459e33838677d0f1839d46b22a688ec0645b9ca9b0597e9d039e7b77b541e3515445a785ce630ad84e9b61220e6660db0f3c78d9f3c437abd2b7358b213290d759e05668ebe78c23a5ae +SHA3-256: 79e11b42bf5bca15565aed94ef9345f4e5de59a3fd90f2e52eb44785ab02d3de +SHA3-512: 92f0c2d042d7d5b3a6faa5a4cbc0cbb014ba1acc69586cec2b607a5b34480381d77f7da46e5637ad808a96a517adfca1c230b370fbdd71bcfffa47ce8c7e4321 +SHAKE-128: 67a29f36fe9b43ff172079d457b4417d64836017136761fdc97782c7544ea6fc5db21c058b5909afc245ec26eb382274413bcbe44664e1fe1ab34dabc680774d709fd433a8dfe8aa1e1d74b6b816b1f93687b3a9855803507ba665e7ab604ecd118fbbb161ff5c7ca6248d4605ceed55e850479fc691e993f0f91dde84436a9e885e596f169d5e6caf42666e2fd4e6f8d88175ac37d66d677baea4cc257232f65a2fac3d9f46583051e5f3801b742a9cb9e7d875e30c62fca9cce1c659ea03d452997fbcf06f9f130d428c5ada01ab87af3e5a021afa446e51f3d694cc0fd4b9af8d6493cde4ec915e9da21b6f67b926492e721bacfdd82353f43a5ef9b2bf9ca29b91a4b3a12e6f8efb772440f55122f452731e27a748bf57ccd7cdada17b7aebc6d9ffce62537d09f8679d4631f676d8f06760f58e67fefe61d1d1fc4dbfbd3ba373944064bded08bcf14f912f6f31593d2f507ad3870f3b022905077046688d7e35d29a5c26e82a826f073c802d0422b2f1eb27301f368cf43c1c1655327fbd9bad31b4d68dedaa15465d63e9ccf309fa18625aa8a60ea737e24261d89a84932090501aa202377e5903e31b33c2489c5ab076feb7b0ea73be2b23bb20b254e5dc40f5e6fc501172bc53002d72907820b52ede638218a3170c84c37e88e0f7bf042b0b226f55bd2cfb2712e339e7390619672afe79c6fc4298d15b2e69c6cf +SHAKE-256: b33c67ef49de5fdf94ffeac05fd3f95c8b0523c589467b62fa397cbe59215887e2999328ba323395e7a642b3cc35788652c985774722296e160d88ca4508883b7a3c8b4b35723345cfc6b617ade36fa9cceb064e743a51994cb95e222d4684757c37dd46232dbcc76a7ca43cd2c4cb27b86e93597a61282842839e4e97e17262823dc3956105c18d15fc16917d3e0627a0bc9e4a74c78c1e2d6f7fbccb536e4f4cc762b91cdbe5b36db6463e4353d0a1515d4cb1382c4384e670675f0dfbbbddceb6e31fc40d6e52327a6bc1a69201185c892fcc2f2b2ab5efaf169dfb4638de205a30385134d110fa2b7c04fd63dda663645c4bc83573b0a82ff73665cc805917d751327d3c703627f1c38c3dc6f6e9c6d725e84b5b8f63b200e3927215d02b668ff50dc8f6f8188ba95ec1482f5fd008f98118cfb59e3049995366054c11321773053b4d4f146b4d65e81b4a902fe94a4cdf2c7cf3b928545d9160b3667d90f6362a3a59971ae407d24c57973876afe4006b5f5c27b1085aca17d0db8e481ac38b8f571f734bdc355c0a1867c1d1f5aa4619dbecf8a7640dc222213ab08208f8b829af9f78e5ec6f2e2a29051242f6daedeab953ac8092887ad26fd3e891fb2b57d43f6e68100a1b55a4d9076de51120d4561ef10e87549f660780832faf58ef0c48238c02b54eed22a8aea664648a5d64ab870a1ad720507a6ee00068f393 + +Input: 2011ad3f23ebd4f5a3729211f158753714739047f7e8c5ce2daedc7f5eb26bd9b9722cb0b3f811cb328410e8fcc2c30c166b12d4a8306f289f7c643221e14118b6af3d0ff800879e305eeb5655a213957ccc1498293cd9871fd32c2c0b2b5a85f7952b32554658b5ac963d3c0c3567b3c199feac1f66bf286f8ff5c0ab940b2f6bf1e0091a437fcde575dd +SHA3-256: 1482baf89a1ade8eabf131f25c73b28713c848929e20b3dae4485ca2149d507a +SHA3-512: d0187b0863a0a4d2fb407dc0f520bafc0639445ac8343d8468a13383396021e121a3c878ebfdd9d834a5b2f23d18b91c8b096b4a21ce44b6af8d0ff7a655034f +SHAKE-128: ca4cb7ecab9917233bb3bcabc2430330a6c5f72c4f3ee3203ef461a03af968e20d6978863dad68977ff9ea062824e52157ebae9f8f7f4d25c2e360701d4e5273b5c66d9e75a7e5ff1f6646de35c18c3b889fa00d754809ff9fa309b5c90ecafcdd768f674df085c22119fb63514994a38eb755afd35a945833d7db0cb53896a531e08aa67475993287ce3361f098a05d46315e97345fba00ee7a658644ab13b50911e4e91fa2f4d90efe1ec9cba048a4fae547bd36bdcb89b04bc009f86b6fff1f25f6c1bb20a4ad78f18f800f8ae58785b868aa6d25e9afda57c0e7816141b00f4b8bef5fb243c91412d26ce0ef3fe4c4942941158955e60c330eb5f9195f6c618ca955fe9447acbc9480c35e9b463bd2dd423023f6ce24b5113e598d7b176fdd80c364e797f44f1f460be6c22b2d0e0a7cd8194e2bdd999d23abf1d25d642f622ea62808b710d3da2fed9bc5af83a5718f79817ebd975934e00fa10cb7315a9b9b785916d58fe5a2364b8746797183971bf9a13093fd7e599d34bc920c86a01aafe4a67d85183653a18e4282de5ea47841b6705fa910baaac802d8cefd45bba746fd0b6f5d17f97662ab13bff621ae48c26ca3dee75cc18f5bd53a98e31c03f630f31ded4ea463552c64b6b12abf29e3bf824992f56ead1742c6e684881123e4231fc18e1c7c1f613c6ca7a6a2fc07f3e72ddf252f6651505fa332e8a3b45f +SHAKE-256: 2f14be6bc0f5b754d05b3f37e4110a9786785d6f982f67d896250a0887bea3276ed5dbeca632415b2f6b5898ed6bda6a32f2e3397ffe5d699c0adc2147e26980812d327c09745f166d5ab0a1aa874eaa0017ab0691d19c3811882b9c19b6fecfd01425238ed47cf9e43dc2fe2919d9c3ba53fb50e7d3b346463b8b9cc177f00695e3ef070ffc1743808a54f2415cc07134e12a08eb6017ed73424e738e75eb5eabaf83a75a64e830537a160f4057e0b646ef19be7eaf770638765ee409936639ccbda76e271d8f3f9fdc9d5d17382cff658492ad3f4be9c493099e893cc9a3aef7727de37961cc59af90b379561b3582087fa9c5b4902220604296f104c2ca7833c28ba264eebbc2acbf6c4225d72fe73b03123c3502b9582d2b0a7fff72dcd803bd3c588b437eb6dd2286525aa3d05cbb38dce120f5c2b3bdf771cf7b91986f8e2fcd2d04489a6fb3db312bb2152da6058642b95b54f74e67a71fdccfbce9d83ff56b2f1d24f207e0c31a8e3a4f6a99440ca67baf35515e9f344e50d8855868591c8c57b8fa4be43ac01b95d0406c231d351978262e15a20e86b8bc03a6b4271a4fb2f582ec303346ebeb58b4c0387d55eae80c9d1e3933ec75f50f15d2aaa6e0b8f040829b48d253ad0f61e709446af5dfb6bdd4d3eb721bf38baa3abec99b29b8538be3080e0a3c613370e9edd540b408d7b648979c00b2eec7add68a91d2 + +Input: 87cdfa57b6ff82c5c8d87f57a71528ea355186d1c130933d51fa8f8dbc003a907fb3f8abf102ea7b22c12c4edc8762b6ee540c14b17ecb11cb688fa1ff6724c4c5fce79c7768b5ae37f7d70dce53b9941b733bdd9598389f0d422279bc67bf34861a0a0f34ea6ca725fa101c8fc14f37fa9485e1a6f9d469aeae234a3f853680bdc0c19219abedd7a41d2ad3 +SHA3-256: ca6dcfca889a56e7abe44560b4b40cf9235be2571b31d3dc084fb398ca5d823d +SHA3-512: 40b44640bc438713469ed23b9cafe57f6b41d8f92ae143a9fd2253915bdf92f0585bd39b7d0a2d7970bf5056adb24f284286755a24760f18681dae0b7b9f0e9e +SHAKE-128: 92ae75dc85b1e650e26ad62ec12f99d2f7022d009a92e777aadfa0b699c0856c436ba942ba260eedb0f6309c005d970431844d511dd5d9276de0ea22a4db24e442bbdfa34af68d2ab8dbb7c3213f46c4760485f53466429a29cd7090f6d2855e04d1da82d6faf148cbb1979f1fdc65e521b647ca887f71172a63d65b655d329e7f51f35e8815031e552a712f3384ace870e0208d016db0b11740c9b6d96793b182dbd1263aaa3dfb7590b3aa8748e0a937584c616f08e3f70e8eec4d60cee631f79a60368e8af7c45096879878618514f920e032122e3e2e2008adff08517f00661941643d31dfa621efb499555d61d699db59701018c09d6d03350420c73c3341b69d4a4fdec477776f00e263f93e13b4f38923fb6fe60ffee5b923741033f076a5e4c4bc0a3f456beeba26bf82b848873d76e04335fc9a26fb4c85a3a0bd746d1c5392dffd1efeef80817b3e75584b4a1b243a65503b99d72660a9613037c89fcca111d1a4df557faf7c38632b8e4e52a62f97052262f25b6d60007b87a65a3818baa67ee8753c502b1ec22c32a84d969624730f34c3546230581ecaf61f412ce3b42f0b914d02e4383b48d41322098b78f1ff861a9ab62833f12ca4d6abbdb7364bb4eb84532071e994389f15ea75d1f8c6fd757b4cdae707f03d40f55582206da322882d28d6de3cc50b94f8b8a5d3a519d2f4cabf98ecd16dae074413aa +SHAKE-256: 8ec70bb9e6f48d76afdbc6bb651e542eb47fe2928153875a1fb545c0280d4216209bd03b859decc682b63252370dd281dca24ab5519e6062369a771b0b20f64f829984ac9b3f2931585e27b9932fae886bacd3b84a4c881b36b503edc73b9d17c3eed65fd869f2a78907381c904e24d7ffa4178d17cb694f6513b1af8465607a4fa7fd5bd515c4ff2015a657f8308058657adc7d011180aa75416d360f8d59ecccbcaa1712b6923d15ba0f75779f5388cff62aea482e229b79818ce27c51f50393e1e241249f4818170d2ee6f155bdb4173fccdefe55c1f7d3f59ffa12ff39244a377349459571dc5cf15c61fc132e5ad15103d9dfc5e54771cadd2f94243c339ba3366475c4e5fa9f3a34028137b2174ccbd44edadab19e3e4283996e1ef78d17bf4e4ee36a8e0cf7b82070a35511b84e662286fbd7cb34bdfe052dd6e53052bf05cb26077cfd1902c449dad47597bbef5f21d0803bbbfdc3580301971a6ac6c7bbf670f381e33a45a069e9c88f48738fe51895469b5d9b9e52f925890783996a83ab24f5feca6b6aba004eedd8a1411cccf9e5818b49738d7c8f4760d28814dedafeaa8e49ce30eda364842de59200ff1984e2da1590e6915c6f70b0c7502dafc8b6808379eeb1fe8d55b3338b267a5d4c7b5b594ca51311a36844f7c55373cb2946988358202e1d0488cc4800408f539d65c2d3be1c2049d604679695e8b9 + +Input: 754bb305e4c0083af28fb4630de1fcd54e929f7492aad462bd1bc6cb88d1b32085eaaaf98a34ab4a449c9d6255ad1be1d4c8ed9bc950f9a880ca4afb2eca23194095c969d3c729e6cab72e73aa21c7ce3e708c3d5d9654fb0080f41064b35dfa51d89b4841783171ddbc432eac5f19de93f529a9d15230074eb09607a9a935b76e791adf835abf5f2b09fb73a9 +SHA3-256: fc9ac6ca53a4252b178a12663e10c408af3079f20da1c5c988aaebb3791e2e42 +SHA3-512: da56a010ac693468f18ea04fa5b8da64402aa8e7cafbd9fb2010f0a1b95992aceea0a6f24cdf31b8908eb2e53f8915e2df36410816c426f79d8622155070f591 +SHAKE-128: ea16fa5bd9bcca32c0e9f25265c5a9472052c1213b2255162a10b24f739869beac1c355864f60cd8bb358f45bf3bba2d1d7cbc4d6ee4f1fc3c51808621cd17d9bf71c1b48c7b2a2825a4585cea0c2a39799b9da05e5c79bf6ea0351190884064dd10ca978057bb464c906f465272e53b0b24ef3f28d4b4bc0e8adedf0c24c899ba2560c022b4cdb6301d7df35271b8f4204e7c8a74f8863cc3e5c238f561d711ca99452d4666e95a44128dfebf2e68be9d5b46b847d55d2d3376f56c58f22b8d0368b8d84bc4f8430df78c6423bed93d2d9b6c4e82f77a9eeb80da72dafbfa06072d28829406b003560ede2524522dc9dca69cbb1a2ab3296a31635a43180114013ecfac65df2b85eedfa0c97784e59d569358445485a5bae39078a7388b61aade3f6c522f729839daaa2f68d793a9094bace118465061d46e3ab7ff291c6f9eac3d92b0b454ae10a3a56dfb0ed3e0cb8bb9ba7f22979c56080c8ace18e1a109d66d8f89b00776f1650223aecce264d5230d245cff9d61fbbf8f028ce0a73c5c6a828181f70aa4dc2ee0533aa297b74c012ee21584503d917d7fd7f40c981f12d071bd3c4d3298b945abd10d3fe79acda62368dedb5d015faf0e2dc4f16e8f43e4bda08c04216a76101de9323028a346e98c8547dfec0a40203a7799fa85eef13ea90a9dbf922ca0d5ba0bec3e9799e868e4d7ae556e95dec6b7023c035aff8f +SHAKE-256: fb6fdb1f26ff572ec71a2a8a75d488fd0cc56a38367d95337958abd255f67c3cad20ceeb86bb4d5f4a375cfa7acad29cea0cf2256d98f9e9e3ec583a109afaef0980c1af57ea7810fa06db689bdf91b6546ebf52c41fa9c6c329da6cc7b369c0469bb15a764e163d86673ceb9b1ed0d1a7ae2bb721e44f3b5c387d436c058c4947dc9a8e1a9b5403b0f028e18110d22eafd7c5aa0ec6b0135a06183a9774aaf05421fa85e6b435bc5cd7c09b4af89b2a3904236bef556496c0970bb2f76b5b34a4139d8a26e3577d7a13fb5e205df73e69c0dce8aa0d06f4ee2ac4694eeae8ed25f30538ad5330c208efd5e1381cabb72b10782d9b9a7695f73e204fd0d5c2f45ee81bb3fdf77ecd0c3ff4ecceb9de0fc7cb10135faed8474a66aa13e9a80af6f7ea1b3d43ec9efc4f51cbf773d8edc3efe28bd2254555c585333c7a604fde018e26b0479acabd4e2cb796de5ecd5a9ec618ce4d15e5976f0930c0c349b89d7701a3bd4d5a8c958b82771faf5d28e86509989a766f092825133641a6e3c408e9791d52d315da274d4d5cdd6220eb4b041fded55ada3cdd160f56e420a01b0151a4444014c5dcb2352534eba5e3763ed66ee96d8a6a9edbdc9c718b294051f4fb4dd2b10571a2e1e6ff5c880cff90a0c9207545c4d0dc9ec4d3e2d4fc2fab5c725af654c7e0f62b118268e103065e2edabc3ee9d00d8f41ba2ba0e14a22f9c1bb + +Input: e49bd01f8d90e8a5aeb9521a12dace12e4cb34016b32339546f500c8949d75a8dd6111f045ec4a931345481633cf2e3a7db98d425bfb15f415e5d6c1a7326327879fc47821726de011938cbb0d2eb2d3609f605c6ceef11ef4e6c98b2a735cc13c0eb3846cc6a1e058c472b5849abcaea45196cd6589ad8e9366d6eb51b83e423e0339252acd0b68dd6b94a1c8fc +SHA3-256: 557dbde517d3c35e876be9cb5706ad05bbe5d67e4e302183819c9d499deca61c +SHA3-512: e46020bff1403deca609c8d18bc5396e51a4f04aa2126e35fc4597271f0e0cee1e9452b541db7c85d1f9507272df7021418976a5a062f90f1a3481e5a79cd30f +SHAKE-128: 86d7caa339b2d9233ddaea7761ef45ab97f8db74e317886ed38b11537a49fd311af04b50f7bdda49796dd7194f9a6273ecaed5bb8c3f58836cafe2b5e8fde2da3471a0a06e34d532d8b69d4a99bfbd0fcd426115888e802460061ac80e040d687015e39cbaa70d885c3910e3832444f43c63bfdde4f13202d25ef7a39b2360183048c4caf3486c1353efb7db1cceea5857db77cd6fd5a3aba60e105aa7cbf5b843f69b68a863472b318d0086a8d1a28a298d962f67dc73a1e18808a2876a64d028b6a0a1b63f1d7ec91aa7cfeb6ff431f1c0da8a2da0c48e04f6fd4ae7ed2d60cda983168c4f2e7cb822593f03840159ed5f6f4bbbe393a063efca65cdfc61aeb2b8f08556d405dec87165932a93c11cb5df6f9b7e696b2e3b25f5bd6d119f09f4e652039b98454ac81d14306a7a05f7739d139c93cd4c1f0750625f5e106875fd6756efb8ba0a8d8886d84bc8375d3986b20ff76c7e9d0e4aef402d799e23c59cf84e7f679743da5b0e0a1b0b256a8811ae903cc5b420998cef594d04d389f7e09136374d386376860e26bca990b3621706877d71d2c93780305ab113e1dff4d75b3f1f96dd992b8613868c0190ee2b4f86ff57ba7b741cb1a5a9f1f71746e94111029db9159c13267f35b819ba0d82abdde9c3a7271b619d19e0491e43e3db2eff5e2a2f49ba61fbaf8a055dd311a6b905a886de1d436f312d6cfb592e0fa7 +SHAKE-256: b3a4dad43666556c7cb808c7f688980eb80e69615eb8d433b38bf4306b0e032554065160b072694c488c4b2fe6601d0a9d2c08b8c6055e8c67326aae61a9c883ba0e6c482e687b5070a287951b1c9cfd37c6f78bbb2ddb74456a06c64a1314410d7f5f6f9c9f7010c293e43c225a52b4ed6ff977d9f8d217c3e63e0d9f2a1778c99eca77e66d372e41fcc9c54ab2cd6a5f9aa90501a56f980311386ee32e499577c21557950cd1e30407f74ca6e0ef8cf28be46b848224d4eb794bf3003e9f084da03bec00bf45a32b4b05d09ef023fc3acb55f70f74d98ba7e6ced8a9a71dd1fb73281510ff337c1b2723897e06d13f52c956af7036997ca12cd6110292470f6aa59343cb42095d17db96e829fe6d4222a178d0e6296235c8aa6998306402594da052c6f543fca291088842b232f6e27580a7187b18870dda45c845687d2c1e1edd89a0ca3f33713cef7a5199a4d6d2e1c9481ba070f846c57d3dddf8ba4166138e3ef3241af7465a87c32f2e2c7b77ffb6a2ea4bb2d8c26195b409b4fd65a93aee773b8a1c09483ef8e3db4e706c37786d53f6726a0c2a012462edb6c3032e8b30529be7dac69a7b7ae3089c4bcc0155b643310bbd210989d67a6245a882215c490a25356e89ad49771f0de382e0261c2048cdd183db9cf7c0f48c6cc567115b9bc2ecfc78271d9a2f3e147f2ce26f5c7aaeda0c5d85bcaefcb7d80e2b0687 + +Input: 3bebcd15df24f642aad40235464943398ff055a6d452133906e41e6bb3daff888e59dbaa3f17b3aee06d2e9fbe5c79c59bb6c0e4869573e7ae911cda0e48f538a01098941a014474469c9fe49702eae2faec703b065c76ce9db3af23b5f888119623d88e575820f63de9f15a85ce64a9faf966c723276b1627b43bd19c8ce0bf807edb1f649b45e70bba8934db1404 +SHA3-256: dd3dc79b9c86179a2ff43e25162473e451f315ce3a738218208797863b9559f3 +SHA3-512: 19ab1d72caff241fcd19a144f9080405eddd79d271936f0dabe226ec2632667c6a7677e50f3fcb6421e6e184d442d41dcf51028d7eb44f7976a0edd7303fc950 +SHAKE-128: 64fb41be037d3a07bff254815879a610f6f0cf08bac74e565f5fdcaf802fa4bac02f149ad415ebd3e55332bc4513086f981d06aec103741bf1fd1a4fbb75bc65e13604052f2b609b3d35bc5ba9e49d658fa9a6f187f3447ec4012a035ffae106e0cae6aa3b62d16ccb355d60e20d6a1b8e592e27a26f34689adc07bb9c60085578bdd7fd78f2b009c614793b89955b23a59a08b0fa75c1e4c349eb678f2f17cb1f1d842139bdc00b0731aca52d2079ca95c08c06b8bc1f31a97745c8ec76aa4a1d601a630109c4621ad0af6d7e7127a6391f3ed2fda51aa179bd9ef20fea5537bf7d0b6d1d1eeeec303b11164e64965e8725d66879584eb20739a0266f1c6b5f4e15c274bcaabfd5c4724d31527d7ea296ff22a9ac5253cc2b6432a16d971d30962d15c411c86e19aedc3b8c3cb0191e966e2e842c30afd278bdecb03728b0a3c6edf92297a282bfa2fb327d4474522e18fa2e4cb1074ad32acf420219aca25fe0a6c1b77ee795fe2d8eab6b9bbd8734db10d0d4b7683faf547e7847e581088e9f080da1b29a0a3bebfa0ca82dd83839cfbf9e934831233010552dd3fec78d17760cfddb9aaf291616b3bb70ccf88953404227db99e80f2fb1d41200b5c29ccc64edba5e6a89e1ed37809df8227b882623e7879ff9d3d5b3304d0096f1e51fc00ff41721311e53acbb0ce395cf14f56244958883f8c75fb2d0da623210e47f57 +SHAKE-256: ae15c81213c4be30d1ed0469281ae6a936e9375c9ee02810fa6ace01670aea3189a2db8d4bd36b5691589b2e1eda3ccd252b682c5b77bc3d0c259a01e5562765491e3a36c3f09edad4b3158c6e936d622c1161bb0194b9f383bad4df489bba081e7b8aa402ae8991513627ca7101f8feb1568081482892d3db678b419e9d6a0db024b306953096cb429e84f75a11f71b865b991d6ae0dff00756897a314916003de63335bd7dfd9d5b80e2f0d135a3ea5bd12b5ed24a37949cb7496d201734caab74b66e17ad8ec7be561e48bae5110711ccefaae8ff18c1a03e5f231eb84f4e6ded68a0303a72cf979e2055f706d4c25de36dae79bf20c213e0ed8c7071e9830b9f4820a1b701977866831e3413252e7f81de1d900336bc2d8af7decb118128a0542e9d40fa91214e350645964cd49ade226a2d9c66b1732b3f18e02a0a7139386da5181e0008c09e0e24dcca3c4345bb11e82f67db50d6b9863c25f93203e6cda204d6c91993f2d1af3b5ea3714553713f75922a412ac46de21e08d21473f74497575fab23fe851112ad73bb6f9b965941084b7134b7f4ee0c5e30797a5be3c29314968e0c63357046c9fdefee12baac4e682a64085f9f66fa3b0a97e708643cece0df24e7e3f10fc4cb6e1ae3421b1ec673e14e3eea2f3d6f3d3b179b8d8ae2a5ba510b2bf8db36adbec59e1a6dfe9780950f230e21764f721ee0bcad7ffe + +Input: 436278a48d2717ac56515f09c4623ed1c33c579b72419af9b3d8e6fd380cd4f46a3fa518d5b1d3da56b66a553a6d5debc52dc7a3d239eee86f2803849f5db90d75c2066f3bf5bf7f73277f318f11d3c7c210de83a0611cf22fb061f5901c1ab13f92e49396a2aeebf5ea29319b81dc6e2c53c21bf4502389d4a87232d7c2ac861172fe0d6fc2060a95eee7c827b95f61 +SHA3-256: 7b409270acbe161680ca010d72c01312b33da9076e97835bda0e17779501bdbc +SHA3-512: cbfe1ac87b1d33cfc72ecd580c3da7fc1c95a009542e193d2313d21a959be6b921d58e36f2d95326a02529d197c621da49e1873627c16cb31ea36e8047d996d0 +SHAKE-128: 46a400681e308fefa626563b7f7bb5ac43413c358b1e9fe35a78d491ccff8950ed5bbeff790fafbe1c916d81c595bfa4c23da23632a2cd17ccfebbe68f009488a26663f66ecf86f3bf047cafddfcab0ced8685dbd2660cdb16b73dc46904448b51b07b35ca44323f419cff42232aefb484c631e80af5acab434e67908ebef79ba03cd65b1b4f68d2b6212bf855e0f6198ed12ef209ea127d2a07cedfe9c72590523b1b2255ec8dac9d87dd7df30b70405c3365360a5e6adab1a8c2a6dfa5a4bd4877b54d5e3d1c332bb9bda148d5997d531d3af4fe9a57dc4df78aed48e8b35121428a15d014096300c4523c61dda3938b32712582f5c504b31cad13ef03146ae9777da3c6c6da80cfadc1e8e91a8511a5e93ee9366bd7736b6feea881da84ec031280da7ccbae961e54ddaaace474196119356e35d486fc12f181a1c327e5ff7b62919c3b8e6be2650ff28bfc4cca9c53600832a34d9e7ad5e705d603458026be452647176a71bdd5889e684297c6d404b10d7f39d4415010538a9d0e2bbf710ab27988c53310144ff39353cc3ec642f48c0d3f12d9821647450a10611ee8bef64e99ce874f30f1c8f847a71f32085e8df095222d4bc4675e4f28a4cf73103563b665b3701ca8dfc8d10dd5f7e8b4f6f2f85cd6230f4bf4eed65488be11ad4c3fb1709ae0d004e91c441575b49bf67317f6f317ed779d72ba452ae6ed008b19 +SHAKE-256: 15b5b7ff73a99d95070c6117c80ce615b26b30fe5a0f5dcb5e0faedf6cad60d8af3b7c6d53964503362a1b380f9f4214f431fc1ade26a9994bf0b569af2ea1ca2840f5291ad5eaa883b9a67660920519b5a4e63c751be9a7a93f0f9e64b26f0f083d074ec011c5c17883189ae1da7015b31c306c6db82c264cb02cdb935cef36f4e585e532d8501c7005894422607bdddae21d9a137b84763cc31cc7f94ed8b0fe27621677dfc4da010dd86f33e23e0ff8d5fc25d4e620c56a695f4b8c217fe3c3ea8be07184249eb9c00b7d7debe9754678fbbebba0da4366f8ba8065cd1b71d37b7e65c990ac09b9051a9f35605b9b68d9585fa786464a02de0eca25d168278506b6f932f96263031e1d196e50f413a9265bcffbde5624a502ee7175e01378878006961c918bd0fc2449ead1bcf2b6b89b75c5452bfbeeed8ef6f8137ab64be6f26744311da048746e9888248bd9937bdf182c3ac7c91298cc6cd5d67b3a1b4abc57cfaf3ea3983558882425f780bb17b247ee261c6e3b2d0eac470c3c3597fa7e66571dc8474e2c02fa8278518d3fee2b2650a5630a48bbb2719cc60e2237ac83534f5f1e6ce63874405c6379a5735b887f402a101c465a05294a6cb205a864d52a52069efc5c5dd552a02e97b512849d43ecdc012f8a2f382199052da3e0eb966ff2f2ff3831dd884cf984731bd8f75fe03d74250d8968e658ae18e41aa7 + +Input: 862661c7b5a80248c37ae669cbae89ae8c2d47da1fe00df5c27de11522f15208c4a00e203f871884dbc42e04be13949ee1cd1ce6287bb176f1da4585b6f0e88e361e2dd722d1abf2aaf784a73bdce7fe4e10f3fb05e79c8f6f7df7884f07326936bc26ff680e673666fe173756ef50dd1f5a9fd745aabe6005534addd0cdb51a79ed52fa1e13776461d74df3f9ac91ff40 +SHA3-256: 830a289a025059f716ef1a16a5f1c43c11bde0b0e9bfce3d0bcaccba1bb89c44 +SHA3-512: c15fde5ba7c52645394022804079508fb289206325032ecaf59630afd792c203c271cf23fe16130cfcfde647fda910f018f4db075b864f80a6a22c1f7d7ed668 +SHAKE-128: bffd9b727eed80ad000788b50f2a6064bd0e2b76564edabf0c1e9cc1bd56441b395b71dab926dad74fc2ab4e8ef42a20273d3efada68da22cd5f3586e870e96c779e67785cf57afca75089c69d919fe1e5576a687708a35626360f0019b3055b2ddf4a1435d13b755009e785d2a62f8a94d0a7cbcfeaecad36210dc109849993ddf6e28e9d1b47d300cef027db6972b19865533c1b5d2fab1ff9bd910661f7c5c0992f447a6bed46ac6e6d0c44419f5f572a3308168491aea3237bbed226c645ebb2e6f7e3bfdcdfb22b96c94c86980f7fa71b40fceb9d74b0109d5deaa0ba6d5bac774ae57dfca6b593b7cc89ad68098c96cead070c2bb896ec14ff66bf77b5ee5688895de5cd13acfc6b964ede34039ead09975595d9c57c3f9fc782f52d2d7fe5b5eb3fb1885df0f0b1c36e83311d5b4cd9754f83c530b98b02be398ab31f6daf0895c48badeb6dcba95fc4b7c8e47e916d7f60edfedcb7d361c1205f491b36655d53baa84c6d3fd43ce8044757e4f247467176aaa4e45d4ef9d63169c9fc72ec77f9d458f7c0d79d48ffd5782e306a9b835baf75d3325c5231a73a3982ac5dedb7c0d18d1c38cf96007376522646b3d0fe7ce28f20a269892aa446084653f81b29eac9a1cfee7b444115bcf9e5dc33a9f0e32e2edc777b470146cc821ab67575997b40b4cf1b39b66f7f34a1839dd8a6f062305542a9ce2aff836efb23a3 +SHAKE-256: cd6d528ce17f45c66f805e0912742c2617c79f544e0fe01c42eafdb84466d54c5c1f5a67d99651e1cc1a4ef725f94f45b64a34a4d9960e735be2f4ad339eaf712846fcdef1ae50eb896fb562f7891e96c9169cd36a25c0e6cbf04db6c9e0ab77ba2e8af76fd9b3cc3b0daf966e0edb5a46b5b800238eccd0aac8daa3dcf622834463d4cd3ca375e3d28f1b9a6f084213f6d92667a55448a60826f878dcae71cb485157f701c16e44911aa0d17d780de607b87660702b295151b2f7b01c655142298d74f8ce76a8694907a2e2a928f8b59d61057bc18bebb6a93fab80815ec9f067a94b57133c1845c7006dca811ef4b7a356b1fc5f0d6e56f80491cc3bff9a1175c90b6de39bc11a3e1517273eb1f46b971d9fc58183c72c7dff3f51349f8d7dd9e8b4c255ce9f717637e3d4d7eb3222d9d638c3ae1aa1315c8ff89ae17f39949f31e10ae8011017f021dd9aa6e6118b40a15b52d54f2caa8c6290219e0860db1155830126d295cc23e87710a15e653c440da05527ff148d4fed5a07b478de38b52e4005d486b915b7d55f3439bcdf64411486500bbcc54a1f4c0b41f079972a69d842ce9365221694764a80e243007d2ca54e1c75ea4493e81e0aa91274bb202e1beedc6bc17611e4b1d8244090635ec2e6362a0fa4d019cd4afc08939c5d7ef8f624c1eb391e1f200c3a2bbc60bb0fbbfd34b04374c4f45ea0c047e6a9ee31 + +Input: b7b074ae22a8165ca192939041c6292dd677a30fd134b9f0cc6ff0e932250bb05b797f9ad84893991ce199fa0df598dc92576d560836c722d8fd00fac679669ec2ff4d0338dec1a57d162aeb1c6de23abe54219f2200da49b8329098ebf2f90eeaecc15bea6d1135267d21bbe399995e395a028cc8a22cf59981d9cd3dc0560701ddc2f0fe94e0e9e898c1c80553f80db164 +SHA3-256: 966f1d61d277b5d3447abf39fb7ae5218ae86849c66ce3d88fd60f964aa6b562 +SHA3-512: 05c16b8daadad5a78c645873625e99fd5c1e746a616272c442d63a2cfdc1da5645b3f0e01c283abedf749ad12603a0475205879525cf069089a2cd6814a4424f +SHAKE-128: 512b2037cf1d0edc5c2dc08650210e3811f1536021fabb2ae6ae0f61924ecdc2de92cef47811d6bf52190ff00e0af0e5e4d279a1585d77d7f304d19b6692bf8bebcf4f50f17a236c1df31598bfbd81d2e32d19a9a8ec24e785a35018bffd8028060037ee22ae0f210f5458b8736ecff7d4fd66870f362f59ba6b623b2c9865bd9b6fda62b7909d5e3e4e5d9d0f7b95bf2d0c6fee2a95869787ce851eab1289d8dd2cdda42d104366f1cdac430284296fe313bc4c5eb517b53484491e3841628a41409ff9088eee50a5da5b6cff95f9d6ef96e9e14cbef71b6fa2c9ca70b10e02962d212d2a9e09195aa0090fa5094cf09b7e2dd2b021746bd09a8a5252ad25eebfadd2356c5189a4d0444b085690a369c1aeab72594e6fb321174abb78d7192370f08e437c558ed38bfb687363274a7435133bff9b4ebf074932981f7d2d4b7a44ee0d1baca1cda3fecd068e0f8deb98bd7db1c78468fa86649e7c941736de175b6869481040c8fc444f09499bd0d10ffbd44b7aab9aa1bea52168f5c0071b6c7094d05fbb7ee170e676b40c611aeef58ba4e7afd9a7ff859374d5d06afa1d5447be97e0b164106173d7cc984d9944693d2118466ce53088ad1891d367301f5e8acf022418443c5958202a1caaeb6e66adc1131bc92c4f4149a511e9ffdd3b3cab032b56654af2e98973440153a3015ff74dc355a5190ec1507667725c8da8f2 +SHAKE-256: 582be104657ef9626697e3c4b0bd7121ef9bf6fbbcf8d530078a8cc215095b6340d91a4201c938536c6864648380a0d35d1ccaf6824ba630d69816b6495baed2f53ebc5c5ab060d29d0bcc1fb357c0e4e05cc14ee8ef79702f731ff3c4f7ce99483136cb3364c75e5773210607c406a50ed179cda0251db5a61c414977e8f0641d683891712c15f39c4c019b87b6c9d1ba4e639d0fce2c7fe01561cfd9733484d95d4ad81ad55ef1ede87ae4aa787c9ecef4faa94d95f57a66285aef7a3a73b147d7c7dee2eda9cde286c276b514b4321fab0f13bc0ee0305864a39228071ac7ad64e34f21183dc23ed02db09e21740a975ab1d5a322e1037f8df1ebcc288c2653254ff30d0fd19bbea66c35623f8b257e7893e4242b3c484d3b1549e5cbfaa76c79e513d268bea9bae4fc8b47722b5ba6aea21b49bfe89c7ffd76bcb8502e4403263424e1a5a0ab256d24d3d76b01c6daca5f3ee63ab2e09087a849b216282c05a20068981f917f507856dcad0f866aa730dc868f01fa7882dde5106e6df5c551db39dd5298b78061837755d2dd57bc9dbab55225e50c85922726664cd7ff09707445066f0bc1395ee8d7117f3ddfdb5a601875fa5979d05f61f7b4d2eda04ddbc1bd2c8713f8a4535cf58cccf1cfcd520360774ceea818d91dc2d306d32cdf40b9e48a1df19482241d8fbe749d340bd3baeb9689a8cb4bc8e342bf0ce71fc7 + +Input: a787860b2baf999c69ad656b5029960e26db921db866d0571adf893af4fc5f1b0c58472b6ad40ff846c5a3329165d358d5cdd6d7fd959495014849985fe04f1bdaa779c355d3eef94085bd6a5030cc53f642ff30c5486506cc98d31fc68d4fec981d210c9ce82c5ff4c6aa734dbb10c371b5f539ac0c761d8c69c15c706cbd4b46f0c665ddca0eef70ddf165d653194d45c97e +SHA3-256: 90c0e278302e94fa6037f32077e14d69f79989403d7aeba87cb26e72a56e1c0b +SHA3-512: a996ea958c6877000766c53fd9d32e5e3da2d4c586b67736a74c60b6740906c32d3720591ef01c6a9b569535c9bf80358138b4d4f60e7f430393a6332dc19334 +SHAKE-128: 9e41c99b513c9849aafac7492f91aa30c497d2fb78b983a7bb12aecaeedd4421479333523ea57a8f43f2b6a54fc9b3ef657fbc70514959aff9ca7cfe20c1b7fbcbbf1c9756f4ba29a249e80f7a0449c596ee6a32756c9e1993ae2faadfc8777d6548b62477fdca9a6a77db6921e1f96309afc0ba854eb7d0c98d94f94e0674d950b75ca831d6bec4d715221e76dda56fad5c560f5d9c184e4480fd536c93818ff26104b86b6c310ca40e7024222c667aa8746d284054562348bb162bed26a94bc1c492893b36a62bcdd48d7c233a6dc23c732e73a33048a7623ae06cd13b1374157b4ed844bbc99557122a6bec13b4a49e1240d97392f0bff67daf1663411c4dd459b0e77c211bbe2152482b963a11f76993af10c8948bb8d1c66e2073b270a7dea9479c640412e09133c5cbd5247063ca0a477427b92e92ac05407d812c8aa5d1f41e6d6ff5bc679c6095b73e4123d9926a16386b07b1da2001498b19306a0f26108b3ac901a0d272ead091da310b076127072296eb8fb80a814d01df92cce4464ea2e66c71a51382af584cfb3730d1b9148940763d6a3f5dbd0f1ac133bcacf8f2471f1bca4f433459a73c491ea98f79fd90a26e3aee2c58cef867ebf1720f8d18e05ff2bb34db6779eb43e6af9e375730fbf5466a6592d68a3d3df8b5f415d6d9806958407239fd69bfe5f5f41eaf65f2b7c220c54a12caea91beba1938bb +SHAKE-256: be5fb571eb55597da3427f9b72ed6929ca1fcc640ec6dcc6088376e5eed7a37e30c0daad625149ed922ddaf9ce1072ec9f04eb494bb324ea843834038ef3dad457773b04a5303445ff83ebe059a83e77a8acefbf1ab636c6d7ce78e0833414f9e3ce52c76d41dfa776d9c3e356f208012a7957247e399acac92e84efdfdab26f63fd3cc90156d45ea476a70111f45b4fd3011c637185d313d5889419a9c34734ae939c5deb3f644a960b52498c4a72b774d2f2d83d7ba1a05c16a2147a39bf23511fb6f1799855f0513d8bc4adcea5bb15448e6a36bc4bed64a6377f57a1590949fd8f0a7aaa7c355fd9df78736b7f800544a53af8a09f82e1cccd0b468f761fa8da081faa1fb4cd7901dc424ba80fda7585deaf6592e831aa7ec7bc91730bcd08f668023594f5bd4a2b7fc6a5014839f1eea5861118039bbe773d546c1342e5fee7d962c84cef8ca52ab434374370f4c10239a9c19423b993d4bc7a72d983c753677e79c0eec47be32c22d024e2ae0910b123cabc1af6afd75dde1d09b9d768d8d954d102bd5964177e4c285a0358dbbbf556bbdd084e4c603ce7a3748932ca46ba4c1f69afe3ad15f24587cc546eab9ab5a3b7dce241b4201b7446b0ccdb586671f9b0041853d55bb15fb03cdb512f35a128999cd20e89b0436d8b2787ba546483ccc37aca57ea977bc7549057265eae412049716d6868e6704c1d8975d99f + +Input: f5b906b363138f76039f9985be0bbc469ecb722dba87a62c4c354de2859a994dd838f67fbaedf0525c147b91e8761e593552f1bb5386c19096a11056f04c52aff42bd1a01d9d1ce3de36e33938f78b97b55fc2a08f0600e9768f67ea518e126312b780dea9b2285b8a7fc34d2c407847f8fa49301ce7877bebebf637841186cb57e576c1bd545eb41cfc4cc9b86cca71e6dcff38 +SHA3-256: 9b940581359d1c3dfff159f988db2babecccacbe743e1a0d262343ed8074cbbd +SHA3-512: 84cc0b6fa46dc0d6500a3be0e00c0cd8f75285fafb4518c0138df8f0cfcba8a96731b5f04563d461dccad95cc1bbe1c0343692e7e14b8e11812db2029c9f897c +SHAKE-128: a4ef49bc1019c2f8429d58c1bce29d396dcee8b51983ff507499696fb83015af7382768ce81922f73bee8013d028adc29b1a4517673318f3cc3eb25b4d3298e9875f9267ff4bcb1266a7fefa505059d0b1896e0faba538fd3293d1563b8eb291bcd2a2d19a30c4f9403f7df61e9b4f55a2edfc80eaf50e38243b95c02bf1d64c0b52c6d5f2a7cdf25bae5006e4ea1051b958eb4ee08fce6eb1c0a6dfac28a23da7e3d569dc8b84fd4f86964e7e5953eb245a2518c45fd5a1121457abd3a5b35ea727cfc652962ad38c6d5f1320fc05aea0a0cb7e1c9a52fddbe6c4349b698ae805649cac370cabe7b0b0e1224e42a32c8bfa15b7ce76280cbcdd6116928295ff6e7093917833d9d72562c3b142daaf361d258f2b88459a530bdb6c44b274a803af725a9c316088fabf4d3ccca681b48205fb78054c89927febd19e0581f230101f13c321ea14eadd08ded31ff0c2038085d29c7f0f79c24695c9c13b9dbea65a7b09baa97c694c0bf27c905b556282973e95364507f4a236ba354f435d8d20fff4d52fda21d37462119c70f85354a2f61606b142660d3d95ed71d03a530a1f3c9bfb19a228d7e5db517aa79385ea458bc41ddfeb80654ccf4aa2d580ff2100622740dfc81530e8c896c3b4c6e48b6463db386ee9b166304ff217482c73851142251b304d63419da3d7cdf7a063a576b411a272503592a24cafd185d3183e3f84 +SHAKE-256: 716899a6b4b0155eef7ed13045e16a9c08a024d0ef35415026af87c73053a5ca4238b68ca752f2b76b3c9228a2120d0cae8a5e0b7f2ec25aef0b6a1c46870206360aae3df1c8803da7df17a0fe968a617e141670bafaf41147c089c8a0625d028c5a5ff8eca6c3c96ef088a910a06147ea642388a108baa0e7e1cae341a105e5bad7b36d82e4a5dfcace410eb677edd947ee3161794d3e55688a66598cc7da1cea67aa653749e2030a8056e7c6eee08e35fb6bdf6a2e8056529d44ff7a27b5ca9d886a61c3c51f90be0133be773c47c6f8098197455f891e574825468002bce02636d3006ef759a44dcefa93b2c5050d96e8280f41c570a7e671bc812d2b967945244363c86c45f60421dcad2079c16e7bcc173f9fb1db85395a0e73bb38f2fc6d4b71c15782ac8a93b3f963bee1d0dcf4e7de26e0c2f1ae3d7c094381d9da942496e7272bc710285f7bb88003f07440d9b693b5edaa6791791241cfa8651c95a31838ba32fe97fad00a7096561151c621d31b05f5ff7d6f77e5bc3e2fe10dcd31f60412b832d7ebd37024e6cc50a55bb6a73c0c4016b3dd917cb04bd0cdf2e426d511311ba47dc6e1e624b43e28828dcfd52ccff40b9712f3f7289ef0d16be669053970b0112401d3fbf6e1744fd0a030e96849d5cf59c316dd7faabce40700869191c624a0b6214db054fc847d96899d542973c20ded7e804f0b082dd4a2de + +Input: 48f33080e7a0c33c3c0c8ec1690e7ae61e0a617e327f56a66fb90117913e2ca3cb23fc2eeb65ea4307df72c7dc0c53ad619a1fe6d47a6d1b26004080c46fc99ae167e4068474fe1ea7e0d5f342d7fc305fa1674f0f1c4e4822293bbf31c590004db13ac252fe59333f40fbe2c846bb729a42a452a271ebb0f7b728daef0ffe3d400077e117f1ef59596f23906d2ee0275ad971143a +SHA3-256: 49e997e97a28f2799a78c486f62dde3766d9fee27979c40372a6f31ba0d3a62f +SHA3-512: b3e97e1aec2743e3e9b614aab190bac86046d0fdbdd5821a6e113a847cf1e92baa618d87edf6fff3e8b50b3241f04e67bab7a71e626a05cb4d4b071fa67cee4a +SHAKE-128: 7fa3835b2309d1f9f7cbc689b786d4534c2c98daf606931f55b14fc9c6ce49e2ce8531617724a48b6e8f3ec622bb4c8574273a2197992a7d8268433e0108f00f4e185ae2dacb92fc6f77aef2446d67c1e00d94ea4899329e29f0d855af34f8801193db04c663e8a841cd441732931164476c2e24c4acaf288bc38cc1300d4b3f9277f88a83799f61bbdbacff500242c8cbf250e7264d242450d7d4fa1a3f590a6cc0b49a9e8c6eb7e4c0dca2014b04b5e45bd3a58655b25d746a222cecc8bde9a476e49d3c104cc6244f0695dbf0e9ee3e3d0537fbfe77052bfbfa6d67e396179b6b84be1e86edf8ea006ca2f2232ab75295aabf73c26cad47c42cdf3a191ba42c766bc158a7f937a8a72a11a1ca161076379236b640458fd745bda16177d546eb786d2b02fc983eabe3ecf485f30e2cdac07d804b9677aa5d9716e6482b5d53bced26ffb77e67c45ccb93288e05804c5bc27f4e5396a17536538f3df6bfb7993a0513129072b3ca2a49310fb5e0b2d3da3b391ba0458f46c9b0a8fb20bc06d8222e912cc8adc61260801422c07fd892de65ea70987704d66b01570f8e06dd9b5921622450c9fa45259c887a94d4baf31f5f33805541989a8bad38ec3551cf58fbcbdbd8c0bb2bbc645264f124feda1913dd35d319434c21c7a32bcab8b2de67ccfe825bbbe90979a991f41b5c1d305e944c2bb8860bdfcea731636c4772c683 +SHAKE-256: d3f7831590ff5c71cd88a0f60d414fa7f9e288acbf6eb9e6b8d8c09ff5d8c65bf211b49c22944007302b2af8513819dea9e88947ba9c5730821ecc0a1ae5d7e98e86f4b1848f766d203418a941a1f4d93db7601a5d840bbde04072d9799762a921b3bf6ebf21e5cdec7aab3210062375795c252ea0530dc5fb21b44ed0a7915930592dad84ffdb3419a6eb9c82cf7482c1abbc415bb932d66667384ff37e2836e766fd0ad8bb12860c8cfbbbcc144c746257058de6b86e2f44e92b79c434ee037d55a5600d432632102596c5bc34d3aa23510cdd7f6f4eafac50ff00e5fa6d890512159c9f3c5bfd654ce3c2ba2805b5078ecb3514e594d8ec04ea4010eb2a7f9fac8033246f4ef0eef8ae9cb68b151f8a4452b168a08378244131fe65948989504b175ef37e5b7a18bf56ee731da001970686f71ca2fa40e4cee78073bc192a2de02d789f4e97bf45fb4966f7f2de6e6de3adc61a708c6dfb0bc2aec974047088933af77fda400d709135b550e74b1913d3ed232ee1409208033dba7a383d8d90bae1278f9e965f8175a179c4fbae606ed3c869989989bbc6fec554bbbb9b45c4e68d2cbd13a01ff14d6d4aafeaa9bd78a1363886a53be408f6efdc6cc54d820354eb2d193bedd9778f9ccbce112824ed0c35c9003081651925a5541f8d6868fba65518aafa3f1ca2f0202f28c444fae0ab1e497b0287601a3cf40170211d61 + +Input: 247fe03400387c9c3909237cf28ce2ecbd0f83443c45fd09a3702884a823e69a4be63406a974d7c20609e7d89a92a41e1edc9240d643d5188446bf42ff24f2776c8eb4c1110049d12a50ddab7deec9bc155c2ef1b5127f2a786eb7be727bb73f24e4cc538fb463f0850f9650606fadc202b8ade8f2f06aade4e1c0eb2ff8b9f37f50074c7f1f3d76ebb03c37e75e73bb952f1982643e +SHA3-256: fc7d39a32c55e27680f05dd430f456a618152afc83f71ba1718efb8dfa3cb6ba +SHA3-512: 50d37fd99da73abc79b09c8307994a645a36ff220e5c65437546d368ad4fb645ffb0321c46eb7b6f231a743ffa9fd1473ace4c979219bc0aaa1509fec5698d1a +SHAKE-128: 91507e989e6becca4af0ad1828084424b8aaaedaf2a2fe5626b21cdc56422df1d3903f857afeb9dd04b87eb24c057eda91c70cfc48e63b42b5c4535b5e81b23e69326a0ad3495f501a4c5581ec7eed6b64ff3b6782255f6baa1508c8993b273f0d67229e67b9d2ff6960613ba2d14ad1abff090c0237bfad2e19453ff4f1fefe419abe56e68093eb7c5a89f468e8dbf398301791e8282a89cf7bdab7c908e5dacb00785eb47a6d1780c246645c64b3e91a424815240473e2632b6c8f76408670093d506df210406cc30d9d32902cacd0ed5f2b98cbbad43df9e0a64052586cad0745f450b0b450396215ac34ce12eec2e49f8da26f5de850a91e913cc1bd3f9e3fc3af5fe884edd13d5c3689e37393f1a49ace6238a9993ff229c16d809f6526f9085f9950219dbab322fc86ad7cadaf7e799c29cbfb0c1d05f734553cb0082c3fa13d03a176e0e29365d98aa3a8f52dc1e5e51cb93588baf6436c99a68e3be995c0c3db573131d369f9133c45e1208d5c9930b2e1226c27f06e9fe949f660c0688cdc40c8cc5ae31f0cc73a789f3b445a8bc4dd51dbdca532f14002d82d42f51a2aa10006322dbbc1a20e380a47b5a378119d06ac39cde78006ca178363bf6bacd9b14ee07fd73c9b2b0ee8c67c8fb48a8c0f036efa69bba0d042bd6f7a54f1694a50a5c6dfcace66b9ea33f99955cf1c0bb8202d682a83a636591aaea4b7f4 +SHAKE-256: 9ec781e87ca22957775f553c8d506f7dce73ff58b8ffb983ed2d77da511303c77d3c30b333388dd224146ee6d7d0b0e4131cd163c5be4c261867dab7d9cb5947c8ebaf8c988a83558027ddcbbbde3f25b25bd7556de8d3ffadbd486806b4a38869bda6cee1dc6792addbdf3d1440650b2dd67dae8aa103ac0def296e6639bd32786921aa484701ad7278dce57a585894b768a63870911d90851f281bf8dbcd161aa17b496df28fc92bd930376403a2a87657bc81de35eb454daf5c788290464af783e8fb771cfd401026b9a4819667570b3069fc72ff3e261eac2b7371fedf0711985c194f8d3ce41869de9678b3a8ea32f34ddd3f3c5a1a3710a4b8624b2e773076c5a31dfc671df1fac10d5b79ed382af460cd0ec6df03a7aa3596e94e10a68881a8e7fdda720c5638af4d921f302d129ac3b607a8e4f9e1647deb8433f6404aa7ede0462bcfeb1974f01c7966541e602a91987dd8e0f88b6fe5e05b4fc2206b665f51e9d6618d51cdd2061fe98e8d9061b5882708fce29e323148fa2c8cb24512f5a7ae504a9ded4df5d53419f96b8bceb070f8c8dec0be547f716b3061b4f798001e95fbd8b4dfa93dfedd911ebe5a709e226bf1c361cda9076fb87f75b5eac39a4ff1d2da41a400d7450a01b2ab3a8b74e59338ca23ed0232a732c2d505340da6c98a17dac1238388e871590911e14b24a3cc733bffa167d0dfbd7f2ec5 + +Input: a42ce79f9061418d9d982fbae68275f7417303a9620bdc51b880f4eb317857816d0140b2368b44ee6a3c3c6e91c5f2dd74dfb0a2726e13db6ddfaf302a146d75dc0f80721fff2b18a2968e2c29c0284437867971464173c7e52d5d8276d45de965475a18a6d52fb21ee19684bc8e853bd3d31d8de7a7b1dfc59912685c039c9be94a0686be363f683827a673367996ed3026d0dc44c0d8 +SHA3-256: 832c07f71e0f306f230d52ea3cbf23785ac3eb5a3c386333c2e80dd262b7f6b5 +SHA3-512: 95026f63a483169bf87f78dfcf86c16d0478c07f647c78f7174a747a4648c9832627d372412f6cc132274e5fc84b43eed0e4dc20e904e43cbc0bfb1b40f66d7e +SHAKE-128: 09d8d39dd0f6a7793849bec520d9cf26e1c646b6d731582edfbf5536165d1465c7e0188284a1d61e39351c97bf1d1a10944f972d8365bcd553cbf77a2b6021b1942d4c778ccb1e607404093508211b050f0314c2af9316e762f42d1b01c0d39ea96f9115d5d9099004b43aea243b73fadc264ebb782c8bb1f1bfd81382b11ace026284ff9a9e411e2b2328fbdead95a5b8e06c57148c658261250eb4c0a2a2c0a725512b7eb81788cea6ad55bf9d183804603570d684f33c4a5f8ca47bd251c2d7c6bece14f254e75a41e500d948544ca8e162f62783c8252351c6dfcecb2a10fd5638afa64f050a450cb16baea345942bf48dd8d3d767b27adfd7a368199594c8e704217dd9b785e4c6d86e94bce4480b76f43a5a5c33849b453810b902f887227be7c2c369b2734a388c9f4964203fa28a896b998cd591623bcd2cf56fd947eafc7559877de0549890ad80bdac11b40ce99b0455c761339223f99b7688d997d5e8b9615c0b1b939a9984e87880438f0933d8b069d898f678da0e57f405a1cab27c6e4b3376d1a76b4f38b8d7e51a48692b48deaf7261669b4be4e04fd2e1b817569ec9115aa77eb5078c138f47eb1607a5891a19a45fd495c0df3772e2f8e28a3fd64ce76df2535670cb402c0a809d2d3b1160a10192a1fad610b82ed3d0593372e044c779f6a724208013c6aa8f274099ac2dbbb3d7276e8b4c7536dcbd9c +SHAKE-256: 0c3b5d478174301a17f80e6199af3302fb7fbdcf9bb98119b732a1f15dad35de3996a280148c62675573df8033291b372d3f4eebcdac776d650b993ec947527be91a8705952e85acbd14ea5632c28371a73f4e357873f0690c57229e51af4ba8cb7a1812fadbcda00c6cfce01701d50f939a6a6179635a49be0256d97cc3d3d628acb8538df67138f478ba7b5af8571fd467dc221a371c6eb4e70c68410d6d66344a43ab7e95cd301926a5a9eb9e7a66a6efd9b7b415815fc7db4493f5048646c4b84c88fc0da21e6f95a25cbdb652cec045cc85063989f658404100624b04109aa94282e01e0b11f777d95757514c1bfd79d98d08cdb80b87326850bcdef3cade9880dffd08513943c4ef09b9388e29f82c4e2a95d64ee143921e8c985423d2368e188c0a5b7a413fe9877cf9d3936605a911aaa5571c5d9b603d54070d7eeeeca7e2b67e182cae96f41482cf63ade802080a6280855eba2d93b5b72316d5976b5461905680dc1a9e53eb8e8c2b14c9239376bf3c5dd48ae9ca4a5ffb5142466261145acb175c14353151c034b3b185f267ccbb8534a3f839309d561a7bd49ebb213f7ecb5ad28e6592bc161e72f9d0be9b6d40f13046d3f28741d12480c6e95cf1fd1e561caa13180de30232506c0a8fb787b61361f409b24a39ce4e17360ae407a96c3bdfd1fa00d1001c19dad187c9cd47bf5ef08dc5cd7ee5575f247857 + +Input: e62b5cfaeaea9c668eccb72b1bbf32a0bbd4c4c4606e1b9dd9917ebf57487716e0dda9cbbf88f961a32c4fa8df3634748ae00853a9645ccdb9a614d9cef20042d55afd848726867a361ad285703733f7bd491d140d1b1d865aa285656f8a71ce5d6a7b1830126dc7fb806396b5e23854ab78587e34238f550537b15c077d0923a3028f47900b662fee92813ea4b5819c7c927ee6d58c3189 +SHA3-256: 6d2ac2302e83cddadfe560c936ef24434ba76828b68c16deda3ba5a26ff4a002 +SHA3-512: d19f4dc21bebfe50d0558345795165a73a543babca5c20b9edd1c5fcffc22ee08866679e42e8efe7af902a02289e012c3e0b043e42fdde0a96feddc80c5befb4 +SHAKE-128: ec6730ea185da580acb15f5505f5b26c66c350f98570107d6c05162145f46f82918c2c58b5c71018d21f7bf561e2845d52ee2710f56d7f3d795088fb3b49eb8d7ef71dbe3a01b1bdec3470e544a35a385840c9d99ccc1942051432500d0a256d48b1f30a314cc5b460b5e6b27c34fc9cdb9740f723c15f7db38a2a88e49d2cb8146e80ae8451d56754260bdce5e46c22bd3f12cf584b6cd1a3298b29f88725a262daab75c0e955db3281a28d2da54bc70796a302828afe737193c155866020475681186f688529203a7aea245f5c7861b724c936e1c98760a913fd1abf07ce66e63964213b4594fee49516eb69d36ffdf01f6f7a7c2012624e254d525fbd06d329d9a3c1cd5dd03a3cb371c5bdc9c60bb9294069c1bd344966204fd38da660aa2eb33176d7743463a3c184b0bb219bbc8fefb1b2656d6fb4e699c425624aa2911cf210a021439f192ee988e863e334bd6a1403b5de35a4bb8615d08467db00a22e048be4d2c26d736a2a11a065d53b27ecf1c6ad4267063442fdfc5af6c14bd112ecc677ce47fc44aab4fb27ef19de45877a18eae13189b81088536bf4220c24215b19dcf706a95706b96e036aa0cbcecc91378233fd483daf9ec66f23f9e6363fcf87249df7cb789859254ada1569d15015c3994966de8d59ec0d7d372c7b963699a4eb7c749cef4c8fb5512a710f30ac9bb9d577331bdd22eb3bbb33920802 +SHAKE-256: e8f4799b265bbcc50d08a465eb2092d7577437ddfdca62531d65c78b464cda8c77d9a87e3425a94edd5145964ffedb150d82cc5ce559c517bb999cef0afc704d15d43f322f92e79ab9acae741aee93d59f2869b0c2336312288473e91ab419a2ba4f3165f6120e0b293399e0c7eeda25c4fb27c5a871a7e08cb6f91e9d2ff4d2795427237db3a43b881bed35ec50d2db66c6927fc7939f75fd64c7edd56fa09c378c5929ef6e3555e280ce19e93f0477af7c16e4bb616ff2f58d2baddb532555c732cf2be1585b95d3633c7b979bfba7f2cef7892eb06d97e483236d283cc37486dde7a52eef103bf9a4206681f0472fae73081d355cb021f4dc40a6a368a6a75a2209dd810665dc08c333fcf04992b8caba046e249957f57dc75289d1e52c772c05ddc1553033e11121572caec891ad564110392c77382ff10ae7a33192973eab86c4b47d0de9eea9d1a74ad281683841a68bde477aad68b7018c290f10d98fa8958d0750ee557b76ce9d45cbd410af17bdb62aafbffcf0070a05078c34cb704c894b04133c3b50e9265c2a395ffc233e383af4a164973d35cd090ac6679c0cae6092b4569e0d052b15c327ca6f2b567bc81cb0b2023a61043b23319c0beaf58d1e0da2c4e28fedceb340b98a724287e74cfdfb053d8bcfbb748dfb5c0b7349fc06e84ebf90ab635f4b168de59ae23ef3aa140bee37da3f5f12561078d5e2fb + +Input: 7a3894b2109c12af5f60769f9d2b2e44f271ecd14647316b845e750c6585d78834a8153f6d7ce6596a4b310119e780d472f704d270c383cbe6f44152df8d8191131ff2ea0a040d8e73f4668064eb979d1a5135ea3d308bff354afc6b8efcadb5c0d306c044379a7582289232928fd7797775d00db9eb85b4d863bd4450274c8b05af96ca709b1728e0f585e7ff3cd1c163913f98aec7cb2198 +SHA3-256: facd784c40a25a3fb5b1b51f6e0e5ef1906c63f8f4455abddadd79a42c77cacf +SHA3-512: 9c32b907e2fd6554a2278a750d5a3dec55ce7448c791ca161c1ab412f6bbc1fd297b5145d182de77bbb622223be0051ba3b1f8f071454514a7fe5855d85626e4 +SHAKE-128: a089e91575fa125985439592cbeffcd6ee5681359f830fbd998bfa0a3deeeefd0b35e4a35f664fc60231bf1760b04794fdd967369f83a1f04575ace493e65a1a4254b728856f2ebbb53cd134c79b0d0b193ccd963bfd770e26e607feb14c1d06737651222b5d09dec0f059d062f0f60b47d1f1474c70d1f0a41f04b2a2fb698977ffa1125f692e581f60d0ddf09fb269c3bad87bb84f20f2e19bd40c93d6655fdf3c46bee2ed29d77c7773d137950af90b7da9ac7b50cd7a2d9e0408a7cd9f936d8ad07f9774607bc9dc4898c0dff645ceb6b2a58646f6ba1dd038f8df03e852544e924d721767f2d105d21d8f2c6af7ad7b498a786a858b2439e23755626c8f8b32499b3c442e77776871f983d7d1f26bcb6b05e1890e63ac0f1b0e399d7e24a23431b05630a409e31a42a83ea7b0e285bb35344dc5aeb42ea4128172e8d20d882f5fc8c478f263dabd424dbfe3fcd32d9221c95cb26f3361d97ec7a55b61b28a84dbe47b2190c0561014fda0b11a09e0ccbb3074d266432788eb619111582546b44dcd1dd5c35e60d8cdb09cbfa752442850f9a1e67b622503b737eefdaabcb4819c18c82e8d0bb5e0db5921b8daf7277024b531eac3a70bbfd66ec952f463b34a9711d78d126573e0cedd622bd5151389474d7a4d0c1ea6b892ed317781b6e3a279453d17acd60e0fd79f7b3c1fbe84e3055d856309d33f15bce964334b2d +SHAKE-256: 3d0ce4523bff664820f88f906b165624869e89fc8a2c2d859cfdc1a4017aa8d90444d20fb87f27aeb2914c6e9ac8e52ac8c69bf62a6afd8159b6661387d108c6ed4a5b256e16b87cf19485741548eaa5cb14640c6b4841311e51f7e8297961168b0e628421e5f7c34955727c9404c18c37363f89ea8591251d3c979f7bd0bbc56f91bb469040faa4bcb53bd908a3aa80049c7d0ff7fd9ac9a696e2617c62d3d0178fbe28b4911590e889459fee6543f2f4f0768a116791e1bda3a4de6a843f0ae0acee745c118093d5023c8913fef5705c0f2a97294c48bbd6b430d879110881d751a446cdbf2eafff1a4b139e4af3fc592471d175ffda6275f96719feb371cef4c83fe24053b0e71a4b6ce075ade17d5206a1cc47a01a9b410da06bcf7a6f2a9fa16d9e19930da51efe6a303b12f3a645101484d1519f2c1b8b27b3ac81b8a5469aa72715e0bca0d298d037a72f8e0fcadf4c8e69ba692adeecfac90c0b2a04def3dad7e6c3a15857349849d2a0042969f6940b0088500928c3fb2840d8315eb57950f6ac56b2b855d83a8ea8cfb7f3e83603627c2e524b0bfb27d349586dae91cbd6b1d35a10471f3d55f5fcaa787de0d7795194744d6fbb95956fe6d137be982941b09e6226094066689f6cc59ba3912f0f90b2ec0f0f0deb77304d6e64e7f0689c46c19172343b9dbcc14c32647bfb8611a345029f080efa9c0274352225 + +Input: 2563dcaec9dc8d3904ffea5b2fbdabeba986d682649d187403ca9dd615debc638d65674367ce67186c5cbaf59ad6c60f2d86a66c4dab971c2726bc33c13678f50064a9b53eb6510f600f222f5fd9a25d3018f803df52ea8ba2a46e6ea2c17c8ecc4d01b6fc0ed4807c701386415c23025464715e0f60e4ae22a464e8487d9eee8b72e73fcc0b9d402244d5a3600501d56a9ac6c9ce4ab1c8c97f +SHA3-256: be795dcad8126ecd55561156ffc61946f204dd6e4ff393fbeb4146ada363f2ac +SHA3-512: 7ee78e3bd508831e983b9a5f77867083a1bfc2cbe7c393ce791cda27b705d69913332bca7faff5a10599f11e8c6a6bcd08e8456b37b6affe4382d73611d47b35 +SHAKE-128: 13773a6b9d48d6e4e5430555250d2c922b945d8d8ed2d7c79c63037b5aac43a4e8994a937e5abb3046d374d91f728a61c0bed7d7b3fa3b3d4a37e694b1f7c8a7887a88ec3c32dd25d61bdcf2b041644d39421e40ebbd67b98470417961fd18c096385fe2f3c743ab5279d61cc7e9336e32b6709835815cc5b7357abb465000e2c4fccb7db341bebce3e3aa78590385d05b017f1c280cf388789bc147c2ebb40492fae19e327baf1495ec9f61de4a18166671cde605b7c0dcd505bccc679e0531970adb446ca0f8d2dd9b954101b0c7b2aeb584c8073e8de7f33c54adb2ba1b5906500543baa9e6e433813b74eddf0a579035da0f1cbddfb820b5a44eb98a65a727949f84d27db29f39c5254584d88ce767214424b89dcc654de869dbab1f7b00a1a4540594475078c857f7c640bc9a6933ee0fecf232604e6e0a4e73cc0e2ea84b891a11b715aed48f685fc62e794e211e6b357684e070ec25645582fd510709d8a450f3f34a60bd83a18349ded0bb3a040041c6ec6bcdf4b79738da38e85d6f5502136272aa4c68b2dab8b814fe6598a2f2ed7169ad5ce91588a60cfe392fbe347878f2d7cb0b614f6af31ff59d42a3002021fb91df8c8b12f94bbd529fe9870b8a6db42332122f94a14c777c50dd247070476f81e6482d3ac17fcda0226b81fd6858dc2d1d88f72977134533f8b3125add87631e2321ae49d73e4115aa273f +SHAKE-256: 197721df9ae3c5c7d634171e876b89f252af6762cdeebedcb86a632a9fb8c684fd5927a48510f52c779ad3befc42c5d2c1337c7314e3102bc677a9f1f696845774d4790060f1fbb1feff3c0999056274ee1de70cde86a252265367e5e7aec28b58354610d31d6417254620413067d60a60f927ab176463210a8475760bd0e24e0a8360ca12edcb3be4ee2786c51026f2b97ca8aba13ad8299b1ad3a91658b619426ec3b9c64dcfc1c4c429885d274e32f4cdfb544e2c5ae80a1381c59b57fd2a38734db3a10bf2f1c26d857fa0440ddd6c98d71155662c51bf48cc0db943f60878b206bd0db334129dfe4c39b808bf9087fc74869ad22946cbaeb6be9a471a67464ae5f893d3023c0e8854ce0683a3920b5196fc72ad8a8b801f7c984d42ea6a44ffc29e8090d978e051fda030e0d584d4e4dd9b020ecbc67cfebf0568c3aa450fa160b3741709ccc687e3662bee8c7c4298843bfa6ec20b8b7f95707c3815ae23cfc661db287f204e15faf93c3b0c4fa083ba9f52cfd9a38e2a7fd6fa7cf14d17aaa5962b9d47119ee3426cf05e3a675000cdae24d44efb599c048db238381a4973b9f0f5312cac73df673e3f271fd470d8f68f599e61cc4bde7b272415772043e6548855c1c27c40972a6a339259d3f000dad2081b1be702cbbc441c14f2a9a7177cdff288e2faabbd13ebecc3c94881835b1dd751fbecd2acac910fbc662c + +Input: b6f0a0e84b48212cdb93c601ed0a9c095d72760cd3fd219a8670434869f50851ecf1893ce6f26c88de2393175f32bf1adf97cca55370bfad357e40226c5aa694928fd812a6a4afe5732171f037586e75b380d9c1126d9c89ae644179e802db2c8d7b02c9e4c0eda1b9304ce615f410bb57835d458e18e987e2c25076ba708d8f7d9fc881a5082eb30dcb24335f592d094b23eecbf1f539f0d0c28c +SHA3-256: 5911b99b1d2043a881b097cf71dd1bef9bf3dc83ccdb7fa9a1cc9a43581edb5c +SHA3-512: 82b33e1e8ae66a51fee64c7f7ba7cb5a374b389f5144c59887d60e0df3c848c3686b1a880d5540b61cec51570bc5992856e99a42beb5e46d38787158acca6c1d +SHAKE-128: 677ffbc2228fae92542d15fa5291dcb4d101fb66d6b21398cf92ae902bdbb17a351f45802974c85710c37d8407e25cf0f1a4a99d67eeb097cc98426d016bf4702d7b5dfb8a9a36bc3b05d54a3df7aba54909f88fd6b00ea2ce9859e4f2b570b82f067f6c7e1fa16e9345c41b615647b6184f62207f0949110279b003cee9444a820f2ab13ac47876440943058b8ed84c090d7d24d83e9a39b5ba89443b76d7584671628a1bfa72de0654eb0ae621bd7d4efe27b561dd26f77e298f840576bb7590ffb7cda87fc5ae1d73e5803dca18bd11cde7e63c5690bc867e33a983c71fb1d2cdab3e6fdc56c5db8806b4afa396aac11e2844aba5e3e2bbedd4dfd1ccdc55424192db776f54df48595626ab7e1fb1892a4b764d0fafb204ac01070d025968145f663a9b9cc7efc9ed1a381b8b19b9b6c39e94d73c6e3672dd63c1490c7c805cff8a9bcd7edea23e4699b2514b9407f31366044a213c34680e375f9071325ef77602498e4543abadefe82afcab8682e71ddd8b0f404ffb081764a8f44a9d05309b3fadbf63ba73d54ec6c8cbe70d7795be5bbbaa841b191d97d6d7e2f5d740af1345da4844c497218e2ea5470b5eecdeeb470ed66eb95f1477eaedbd4eeddd81fbebaa388f91a2454bdd5b121cf9a1b55a9f8585f490dc22e8d70280cdbf99f7a4b9152c5922cba6af93af5906bb1a417375f25caa9c710f635a8685eceabf +SHAKE-256: 7a36bfc26cb42040fc90910530fbd70327da2b8de96d379bcdbcfd2dcab1555441c25109302bdaf0952c5092b574323e5d905036119099841125ea3987a5962c6958b941fc5645e2ccce9870a7312a40a081335fcab33dc20e4dfc8ba0287069364857c22b8d87157c5357383e751f24207d289c0f993a4f062ce69008371ee1d3f32ef57a0ddffc47b1488afb6a35779be4e07d3ebf0e70daf5af367139a53fda153ee060299784b91c268d1afebb2203b9c990d48097c147740261d3f88a6f4e15ffab071fbd79b9ea0a914d8c55ef6af95858c621e1c0bea40574b1ad22ba1a323de794d15d1478d74ab833a427ed8f0e50fc35ecddace1291d197273692cd1e76dcaef9b0b80a16242dbf2af961e2ba2fab9eaa20dbb1e10b8cb12f168a3b325aebd3ff6fb5fd42b4afa32daabbb8ce4e29774898a1e91a525b753b58af8b39600ce2d734ca56b5c114e8aec72e978d6ed82a7930ac0230a2b22d23f1652ab9785b9b6f3a1988fad39d8e48720f6fedab49699d85e1fe0c1b2104b77fd685756fce1150baea7126526df284112e681f81904db283f22851f975c342d3b881902dc042752f8c3a42072e9ebbd82065dc83e7cb076ba667f628336fe67256fe1b3a492ef54bdac253bafc8fd79cf3de38e3fcf01c900056b79ee9273fd02e93b0905bd4032f150cc0ad96605a835102dedd557b703a131fce768845e2652dc + +Input: cc61a58994e771b0cdbe9a57cf0c6efe2a9ef9cda62d09a9759435b1aad540f544f2375601dda12644c89a7da988b62ab2f3f40b1f6bf5439b0213efcd81cbe8d26de3dca53956fad3816d419ff90e3f1fed477fbb5125589b84c94892750276b6dd19112936caf6fba99e3ded4488a2759b14ef1075ba8a113783254d934f2f945cf1fa0b57b8d354c9a83cb884449718914944711d2fa3f7a0df4e +SHA3-256: 95b9474239e8a2ad55ff1c63fc01d1bcb00e5caaab973cebc6b3ab754afbfa12 +SHA3-512: 6032a1622cebccdade3e3a1dc6af6e1fe12640484e14a19de6ea03a21e6d386023f9d7ac9265f276eae062bccdb135641849ab311e0ab0b8344b51e8eaf22d38 +SHAKE-128: 73c8dd4b073e5444b43bee40bc73dd712407b4f893630283178644d6887916d9369d8ab7d58ce0a106c6c7d9ce5e4ed042ad78450cb6fe19cf78cb1741546cee5095f40bd520d9d7b209a6a3ce1824db116f0fb87546a5ffbdba9695e948317b6b0c2ebec36ca01cb2665cb16da80373919761b7c84fd40476ba888f3f2a0ebe64275c761d2ff42e726d0ba1b884a936a11b24935f34dcd3c3183c22726409a6a671e4e735ed95ef6b1c22e53deddc5281410c4fd44a528e79b89e034e593590ca75713c490f2df26d5f1c26d1a9490d2f93fb087869eff5fae4aa755857bf5ecca6a40b964b6fdaf6b1b1c4c6f61be830bcd9a540bcafec08cf59bc099b7e8fe658e5239d62a34f3bb9a9c6a140a99f09fda5e7625ebe3017ebfc6746edaf024e27581c503f7f5428b1e48145db58c52c44566d7d61adbee783056bec7eb24a9fb6d48f2727f83ab424f690ad953625b2d3bb4431796c96706e1e799cb5e422c3a94a4796a92471b6637a2591b62dba79fa672a3678cf36894196a0d7679ce411bad614e634321c44bc613eca7311b551b3a7e20710daf9228fa7ca753fbeed873f8731c3f849ff4e9e873301ed9d1c7d61caf8f3bd61e592e244519b144259b1b51eee4082aa64417c3cfa78ed0d2673661574cbe40f611cb1c8c41d7b38204a5564c7d527c09c9c932b31970048610ec0a25a9778b1d0efeee6050f2d2a8e +SHAKE-256: 08385409ba4686e09b70739881a247fd3327bc9839fba89fc735f08ff201ea5a4c3e315945d6302a1ac2e444bcdb2447ce2c3c77716a76ec1f3dcf7abf1274ec9d6d7764c067a466f1d07604767f1f8004dd7bf403b82933e18596ebd96bd494a5072c4273088d46dff31a88d70650bdf013876771e7ab9c2725edad57d6ade43189217c1902fe41ef42baf1ca880d36da7d25e3da7b16c1c9af72b2452fbe74b2649209ffd3ee734f1ffcec027079cae8fc9eb5cce3683a5a5071a2ecc76abbfc5b1e1261542dce007f6f98bd11838fce9e60317949f6a277d6b49867da1159d5e0067fca3aa9c209e48466852ec83a8ba042d81558dbe8913cfb0badf3becaf7694aef9eeb7baec2127d533ca04ae51a8a7d4b3fce5081897ee1ce2a4db0ae11f4915026db2708b8c8d93c8fbcc7c66ef1a89bad7e14534f01a66a0f5e3bf32e508ab57b4c2d817b1549dfba49eb311a1ea89af6f5efd85747461a72f0d57f723e0bf8561ad07a69cfff674dd28a0a781146dd2fde450308dcc0688dfad3f905f757edcc879d4354f4666e8a89d3afd857c4b7724f023e82c056beaf2b91eea0ac11eb10fa82a6708148bc4f1dd5c528e92fc087e9cbfd13260956048b053908ad16a31835f81e456054a88109ca3c01e0d6fe863b2958d0ba5c4fb1078135eabe0dbd7fd36dc8d5dc594eced50c757f1cfc8c5e7051c586a886af755ba107 + +Input: e9ab089ec94a9031078225e0cb5b0bcd6210212c164cd1a8828fba919c57454b8b5194bfbc919d92f986d9cacf335e81b2c94f53919ba2e07bc1e409ce472acb6255b17c4595d2543fc88cff7e6dce778ec821a9d7c03c493d8df88a2b1f857018422cb42f437fd8e4b56dd8ce5dd051fae21a50169f560edcfbdb353ab6e5a76ef4336488a4e455884b63ac717a8d5a923d119d8f7cb72c5b02a947c7 +SHA3-256: ba7ecbf0baf1ae6d66446512b122fda0f7390f8464515a8fa94a162737c8f512 +SHA3-512: 1d76714b2c5d53a10023adf248733f3ccda9c9ace16ec633f21e834275c6bc8146304d874b2d1a4fe2cc3bd816d5cd7e838ac32c3a6bb220e717b5cd7c8135ed +SHAKE-128: 4a10ef9999d8a4f149d63db1a4fdca6f7825214cae1567e4c9b9db2d9891499ccb4affbd76553746c9c7acd507b2a61f22c3c4e8558205ea8f090cc6bd96136e5f306e7c8730389c1c3c2576fb508625c0132a0ecbb3a8fb17286e8b4f993790b25c96769481b3758aa581921540462c45689305fc3937c5955d88283f8cc856610837f8190061daf69407d34c9370b840584c669961d4b1b1000ec0e1a19c72cd7d956703f43181fd79f52a01cbbe9ac9c00ab4d96dee77865aff2eed26b17443cd26f3e5d4bdc73d1d21dde905663da923e5b378b48b0e78552d96dc76e726b5510fa067d80ee45f4bf666a7026a032a96bded1745032847a63eb5f6a6010f3033185afb514b282bcfdeb328af735820ec6554aaf3220d6713c5a1012e0b0be5e5f28e88d4a8aac6402a9c1ce9019639137dff42c43f37f7478e014c7edf8aee9f57d08e4add5c990826b866bd38a93d615b85cf982f7ab9043cf7af5a115ead4ce3aded10373dedc8b3f5bd5abf0ef3c029ecea9092abd521ed17ef47ec43c7df389e381ff80d06a3521679be60bdfd65da288b629a32498cf65327655e1386700c61db566fc9ca31660bad598240b04c0086a897949372f36e4d4a962fda0325c2bdcb85389a5e09ed83e56f7016d35f825812c233f680be2a025214b76a51a58e0117bb9e1d2eec599587dc8a393a3738bf62f130c276ffd8968394b904 +SHAKE-256: 300cb8a792161c14dbc080c38137a257c355be9b87206b19cd77c3f3d0135e2e30049b23920bb7525869cec8d9789d909bf3c7707325a885bb00931c5d97b47a28ddcb0614ac6d616db79b4a41c38bb1b5d3562baf9154c42d21961f5fcc174a1a0d3b0b148fb5634772b45df564c8608fdd4c4b6cfae4a2f65b543f2e3332663986ac147b5ee7bb8526bf795605f02a2a3eadcfbf19bd2e7711ec7947a1213b567279d821abfe0a730d1b8ee50bc2262c7b84a6c9ccfba901ea80f002c7542096c6efcc3bdbfb94f7bf35b10e77599c05582e4ca1aeb25f2097eca5989dd235bcb7374412aa3d7d72a7ba47eab1daea8d6fa6de5f201572f8575e8cdac34868a8d39f8ea4d8cefa4cf42d46112feac6ad59624db355433018a9776df91a1bef841d74b3c4672d524d6cd5751b780a3a43ec02e5ca8f610fa41500c7f02dbb597a542a5109de728854c06a9d0c969d47ed75f9c3f370d4fd507e0632d32da16158279557e36ef03e71df430205db6d9f90b2b1d30455b10d390da559b087e0e230d53086143fdba0d894fb42119eb567363578ad8a3191ec97c2b343cbde2a371abd50a2d1d7ed26f5166d0e0fb649711fadad192ed3df06be0919dd12f54c1c370b3cd6e85fa8338fc16dd37160137ca75a5d94f1afe6618f69149f127864a783f3d19c5753176b8c39465b054f48ca4cdff8ce7fedd63d2a68c7d970759182 + +Input: 7e4bb35b8328ebfe88865646060dd1317744f433481c713f0ecfb545f59ed289686c08fd72bbeb05657be92eed9daa5e3722a84cc70d1f76d6eb8d72312de8d226e82ec1b3c70f274a42d48431cd8c250256f27e8a996a4ef55b9c0bff8b743e007ff7113d01e467912c105fd797d871d34ced922ac744ceac5c0368157346c34e2348366815e6e07b7c363010ceae303e4cf731359ef9414bff1274fa23 +SHA3-256: 182d71a067aafd086f57a60067f6a44461ba53237a629cc3f933c261f3c7d6c6 +SHA3-512: 91aeefc4a9c2021a324680c763caac179f71c5beb7bd4d64a885e4858e30ed1647a727563423084ab16cb00cd820eebe1f91fd17c58db901dcf62ed1379ef2ca +SHAKE-128: 73767c89b554764516ae5c69551a8eb988e1d09ccc078eb20c24f964bdf6aa508a7b99e63b83a3fdd6eb688175659395b61c2a3097a30d0b1dcdfb028d80c22a06a6e0796878d83616c1272399811c335e38bb1df0033cdba3971c8bd72d49d1edcdcbede24ca79dea9dd76ca26e755e8c43e4bf4c55467c2ab3c47ac590130b988bc866d2591297a052d759037b4c144addf27582bf69fc66c03e5b42385b3f8b789b6797b268e4e1ca0ee57c7d2c4f89ab8209d27dd04c0b536a699c17c9778cadeea33cc5c16293ed80b655b480b868dc049c9337412730725826124c619ca6f073e64071b9234e5a5685a87b202ace64e946c61e570cb2a72d6f7432fc5d849a316d537b9426a11488f80c87735ddfb71fda0e4966070b9e05a2a75399efdc572aff98ddef686642c7511544d79057b43773230aa22982aafa90a95d3bc06932f1dc39469480c4d9e8339b78fde08800e448d2573d6767b833b58cb43155659978a724bd511f61931ffd33d5f938259fc84467ac15758f07c76a3ba046f3e5f67f539bd322943572d69547ca77f77272bc6e6c21debed2810cd404603e1148b2c7583bcd1d2096648cc278e5142feb72c8514a915a4ee5c90c9e386049ec0b13b2b076f99d3f98a8498ecd4ac0187d3f2d3b5d7f0bb95a65ec7dfab84e3785edce8eb17fed84224cf17f5985a48992c543fdec4b5801ce6cda6dd3db47af +SHAKE-256: 6bf110f1a992782fe40bb45c884c97592cace7ce0bbb4eca05cc8ab9151f22f8bbc2e40046b39ce4cd85c17a8dd7b4dca39938ae5071e2708d4ac4a3c2f3f8443fe07a17801f7e763ee059b587b994fb7e6086f2fac4254c576d732d14fa191135370af6d46a8d024ebab2e596e8e2500f0c455b4975a08364e6f1108c35c9208f948cd169d713027c3dafeafa3f8d9c85ef4a2e1b656f6decce48ddb1b84bdb90f3c7cc7747ca15b2da26eaec6ba66a12fbcf129f405fa3e1b8ebae0e44c36bcffe7d316452fdace06f2bf7f56578d06a7fe09c163ef94692ecb61b0f2d74a7d7c6522df5768c423595c97ff91545e84b9b87c81ca8b0127135cf7afe3482c078bc0ec5dcae15e2184aba00e06abddc41c15bab15e2a0d7a12c53a6b472d53f9d8325a9e8f489bc9883cacb3195c5587ca4b3f1139108d0686c6b1552bd328ce352f2d39d244b2c8a84508692419be682895c6bc4962d956dd7b512aceb5212c4f4509a2bfac6ccef094ecb8dee50bff1ea609f21a25fc2163768af3e5e061435d376ff120e408a9471265548259fa102a4bfa0cf544b74a399b972a069732ef69053e8e8d5818b077d136e5be9c5b615b23319a9b033d5d810b225b8c7788a2a6dceb7410daf71dfdd76b0f870363315e11898d994a797b472993cc9660658aa48a0dc3e8aaa2b11f51a1495c4b26d11bf85a1bcf1757fca2bf0fe71293662 + +Input: d1fe4c78f1f7dc376abf4845629fc9905e6f5428b92d689392c81a292dec6c98c3d1bf86b5466c7df2131dc98bef5e80dc3ebd1819da22a7f1f3bf3abea76472907162383866879f0d2cd918bbe3755439118e093750a8d8d3ccef925445c443f96065600a3142a8ed7c568bbd48f0b2805882aa0e19c5a261c7daead4c5eb907ddde1a4f2286f7d0f76c5969e4246372e13cf65f0a29d5b3c136bc30d2132 +SHA3-256: ab562ffd46c2727f91a75f91d7a8a4c0b3e5754a721f9e6002c1eae51079da08 +SHA3-512: 2f42ebb2ac54ad9290e3e4b559add7336119e30bf30c31e6a588abb31f92f80caef6e2c49b2df1bb9b47668fec09a55aca69564986699b30fa201bfd8b7162a2 +SHAKE-128: 85ee6e19087561f67df9bc810835e6dcfb116551fcbbf2e9792208830b8200813019a68be93a16e9066fd8c36f012ab406fa82ed956d419d68b5252c8bd26cd5e87217accdd573671d47025f6bb1c580f94a5c68d39ed11d05cc85a224124c840d23d42fc941a950b3e6db9d543efb9aecce47660735b40d4dfca037752445af7e979d0d8ea89779ca68a7535e817dab03d90fdbaf058adcddc62971898c60d723b5121ddf3da39d3d1bcf73018dd8d677a7c4a98ed60f73fa14e21e5078ecb2f36e7bd1b1c140c096e194997a5d03473f9afb6cd9e87eee5feab1088a71fe809eb303feb7004e437ac67ae0b0b4b31e2eec7230caf474906972537fa05193028eb957639d04a745684a404c172a0bc7868628a07169ff12417473b7a07bc71c7618ee12494287955ce4382833ead9e1d50ee15fb30b0b91d816299f6e65d74acd6c5f01efe7934dcab624926c2d53981e5a82dd22b69bc2bb72f8aa41ed9890072178642d2fa1d84c3a7a58d15accc9de8b5732bcfa65bac170bde985fd076698976bd3ce1ecfef8a03c4f81ad2611dbe3d70f75ae928ce61c670c76f9d22c809eeb0a98f3973a98c4e39edebfa0a756c8c01a82d0c9744f5f7ff1e723cec17e63721f45d83c6b06f7afb22e38c421ec2d4d3b5dda280f5d06ebf8e548e817ced6d3d35c6402ae13caf276f63bae87614be1799533f6c30b1d1e17fcb88a7c9 +SHAKE-256: 2d4d2ea5593cb0bcc7726a7928036036920b031b14359fd15390d27fb4ce5d8ed59d28d0710044cb2a8c25e2b491170dad1d31a362a6abe79b253859ddb9fecd000e3242ce29e11df34e730bc487be6fededfb9701f643d933d7057f46e0f9abcb9ad1409bac576cb417e2dd6ff5a8204d3daae317ee82f42c79cab4083a1b27e6d03b5007134dc9b9e961e0aee97f45d29ecb94ecb7a1a5540005d7a744284713301084c2ec13909b3a4a0718811797bb47bdb42c90ac0c8d21a5653d7dd882894be34e81c66f372814cf4b94f1d8a7742107f74450f82bcdb531d4e8bcee06715e1055cec7356d0c07cc6abc1747a9d60fc1553c9ae7d7698eb53a1d4cd3b2995f4990f8c514db87d6b6571dca7d9d7a3b0483fbd4b9578e353ab333e9cf11ae9008b48979187d4d5ab642d0073efe84bbd8fa29df402bf1ffc00d662cbae14de7d2891ed4d77725cae74367a763fccaf8099a7ee97b6a559583c35d1fa2ed6f0f1989a83fe356dc3c33d1b5f64bc75369ab5f2a24653ce928b0f783bdbc19d31305b702af2282da3d2e8a4adac2affa5932e23b927ab85d81190e4efe7dce69e1796f161f1bf9566cd19750349fab0261627d1a5cd98cee62425640d4d8141c05eee7f913b3adf280581053b4e6afbad678c44bb21532afe4b9609032542c2c0ce4187502ec1121c2564ee7f286ff96620f5c8f7a358933827002583a54ed + +Input: e87af3414bbcd9f741692901c14dff358a3a27a14ead780291816a287ef93f597153c2d26bbf19ed0de9a81627e33b2b2b2337565a38da60eaf580c54bb0e05961cccba98042bf1c6b6477e7aa799b8bc49efaf6cbbc98bb5f02eccff7a1736aca4079076fd49f1291cdf3e5a8536bf8489cac8f1d44a663cf72a923d276ee5579ff86e2f9d59ca59fc6c42c792a54e11584d1f176f605394f93953c82167ef0 +SHA3-256: 24008ffdd3b5d2a93e226b145b865f6a5ecd9b6e528ab23f7e75da13984691dd +SHA3-512: a0d70ca46c115396fba0e10ce55e58472ab813d65561216d7a51d2144d8f318c2cc4102bd36b71f1570f455bf821c332b898846809a5ed0f98c25f490bb9f806 +SHAKE-128: c93ffecadc392eeaae2130067523719ef75bcce8a57c4d45c3b54c8ad1bf8cb0ee8c5a7374ea7d9b25101fb508c3a4b1ec061df7aa357168b94fa1b888f74eee46e06c157c50b4cbcbc0531f15b22b893d733b0d4d755cf4a08d9bcebc8a1246c7b1d5ba6833de9d641bcfaf009a5660849021bf02aa1560aa46e5ae35ea7dff61aae6124d8e7acb5f7b79c67990a9e4f6cb7ea047d9fb0d58442f8e8b84009d853cc3a7f1ffd9173d56ca74f844fec1e3fe90b105389445b3e9e734dcae38306d6fa82c1302bed06a9d9e9c94adb4d759164d74de1e3baa5732ea7c090b273b1fd2347797f092e7801b35758882e9235fea5cbaade88200ef9d3ae839e8ec989d5ee2acdf68d996543000446c15816cea5ccd2330c7ee617009e2cd6807e2257d4f15d09dee07e6dc1ac2cc0ea941d22c0e9ea4d3450e76bacc08031dcce4454894afa20400d69f7713d23b416abbbc90c2f07e923055f62f5712fb69fe255b13f2b53b2494eeb5313618e53c1be10afb6401587e764c402f1962ac3886c3c44b023dd88f1671840f5598b1a13356b5848bc59efc00d59090cf83f769a5cde297a91e548c1111c9696ae2632f7da9a086505eb760d85d242128ef56ff49736b4a7caea885504d0c974931e1154500458000e1ba03112cb356957d311461018442dc5f90f9043c8474f03087ecb4636922db777bda1e56d772f6fe281f0eea21 +SHAKE-256: 7cf6634545790e7e64f15e3a156b62629433903968cf3754e99117fd5afae7413d2bb56bc1563f0f0c78643536d39135a9eefd23aa8206cdb9008c6d9ad169e0aed69fb060c449175ba706e17b1b4452c337ee8ffb2b078518804b01964af84aa1a5c812d7e885dcf935088d4ae2ebca1587f365e467fd5be8959f300aade8c4b1996aba14c90f773cb31253dc6691af6f0c1dde9427679b48eb22a8a26e8cbd3152a8bb8cf5b61d870bdb122ed8099fd18b3d5c710398ad83e52291a6b11c10a516a13fb11bd129aae4e6c89a1189a977556da02e563c012713a573480d6fea0caf7ebe8b6521a417ba4eda0b8578d0327320d1449f9defd6cba5fd299b47f2f3cf014a00fb592e955d556de45803d5a079e2ca719a9d0464bcf19322b5a8d598b2decab8b4f85b516ffae0eefe0b0011a4c0e6417b9c8d25fb5942106f8c7c8b9fd141fc89c8ac98c416448adb108c62339b408ac5ade418e3a58a5bc454567ec15ce9c2fe38e6cc6f1c3e81dc4dba38793312933a43a620e63a192a05275db146d06fdabadca5512c57da9c082437b1b57816956a938ff709e110753c7be6fcf937e06e60e9cf61eba19dfe9c80f96782fb73b1359c591c2e6647902c18c0eac2fe0cb43745c93ca7fef34c1316e1320bcac080557862fd438bda3e7034d04a2dfe67e7309fc53bcaf46d7330a25710c61bd17394ba8ce5aebcd4190e03fd + +Input: f2789fb6d04fcbbefb1db6ff38c0d198f440eec808740b4a73c1b733e0637804beb35128261e7cfe8543242ba4918ca7b6cb545c21adca84cd3115bb85ffdd0240e99f47cc1052a26698488a0868ab6952f91e9822a69d1db0b2221dbd1ab4b635c3fa08437efdf813440db82f0c47fe087ca87dc747586dc8067d89749929490856a760072c5fb0f386733a794e80caa391278851c8e2bdea574b8d47a143799a +SHA3-256: b095951d8d3e0a77243f696035f79db2cd0047cf9d7779b825f0bbfd223083e1 +SHA3-512: aa3de4e05b22c4d7306c072e664422cad7c866e0291abcf3537d62ee4d5f9825fb788a823da4429603507870527f66eb87005d57ca0feab0f66ca1025b2b5895 +SHAKE-128: 79c849d27a5c454d539960000335861cf49de47d45539523b84499b6eb121d727fa5b5d8bbbf69ba1d0256ad2b99650f64e0532fbf511c763f70ba7a064c5ca0a03cca6f5adbae24200ac3c2e5f224bc7319c5fa2d49e5c91c735202374bc0e113a41c81bfee4f098e192c496e81c19a7569a757a2b1d48b6bfbb7b13ac178ada062c04eb1e010370f8b45c0d9a3ec55a61e1823f56dae26e416483eb138f06265f0d44f7cad5e48da584be3eb76d9a17bd7218609b76eeb6efdc0ba1f3e88419c921bb84421d966cb0884750237b3a2cf4a8ff2b6aa5da6c57a39eadd6aa606c7e312e14a7ca4c6afd035d51c1edaee39f9b6d6bf1cf2a5cc0a5d944ba3ee92b4ab18dac7bcf11db689126e57efe254a9cd179b463b4b0b1e584ecda8ad000ad5eed56f57f9014282dfcd8074f7fe617383a1e87558c42456404315aa23266b0696a8714df811faaf8e7b623288a49bfcfccdeadb7cb0691ae1b7bf2cd7111786d1f52084cfbf4bc82fffa49f732b806866f8e3acb97c15fbeda83d6dc1dc76ef64900d336599e357cc8def03c419a8aeac087958dc2e0686f664133e758d6031b90a962ede5c6e1e70b3843bc6c7ac4c7eb781381fc01b2a5a720ab0653a0df3dfe995117a3b40b8dff547183a11bcc9c3787519093fc95ff0603cb75c8a808dbc016f516012bb651fb7dda970fff4c72bf7587f30402509c209dca0f89570 +SHAKE-256: c9c0ef0a1f642b0a05e969d1bc9310359b958e3cfd5f6bc6bec4dd662bfc4a6c4a2ca497811edf0d6c2bc138c7c2ae40e7d31ec5fe2c50987a284d3e537274ad77e0a02137bb3ba85c71f9e78bd6e5667fb4dfdf34cf4c3d4d32a5e40fb52b5fa896cfe7948f32381c70520f8580489a7698979148ef969ac0af5ef0cdd92ca4ca214de6df914fa4e9188d514d313fb0d9ceb225ee8b009e9ecc3712903004277b9b62e4e9fc2dd6d4b0803acdc70b27c4f03e8828d079620c1766d4d1093618eb77b3024de0f71f1991375ca91d035027cd2569b076633ad87efb3d102beb39ac18963da9dcce8c2b965edf35476cde6a452ecb07500481679c493814c0c3d93d6f35b70f51d87e7e0797a2adffd4cd81996d5606e48186a384a4f3956aa34991f41d1dfb6b8dc60bec8971e443ef2618ddb68f2132b9b3855ef012a91a60553d9d9d5f5cbc4d8b9810eb0b2d00985b8c292ac0819d5332084fb3f5bdd689aacfaf39f15f82e7caa3176973fce4ac4a8c716eed8cdaf016f259c47d7139ec9edf9aa8c6e7dce1d2fd958a72d6a2618b7a38bacf98155972490b57f994d391cfa03ba2270e43716deec550526a8513f442cde101762241add510cee2b5b5fcea5c745787e84fdfaefa2a4023ffc6894f049c555f1e01b5fac5ff0619b4430272eaaf453dd997794fdb98b1139e8f152334c816db3d051e50693bc6dbfc8f9fcd + +Input: 848d5fc2c126072764e27f29ebdf1fa244626ebf8022dd147f6c6721e34efc075ef71df27347e268aa84c270914f97d1d47b4f9d21dabda8ef6568fec89872ace42719c6e9e6dd84249944f4ee4141181f4f8e67eff691de0a983f151f3ad25e12ba9fa1a18ba1ce7271c30a87de57f251a02ffc1b38b68d6dd501f6b077589faaf5087d00b6072e19fe1ef47257eed2bf1c35acfa4e61cc09e0d9abbb169aacf15a +SHA3-256: 73c860e8fb1a9872dfbf999c14d26e432a921b99e4d3702ac9670397087679fb +SHA3-512: 0d723fea7923b4170183443c36afbf3a13668d01761ec72fd2560cefa38e314e68bef8d3d2607362aa3cd1066a05a541d09bdb53fe3157a1759542e3e0343783 +SHAKE-128: 016779419eb48c2d1403e167293d9905e99633d4a69066d6f89cde2888591e30cf8384f51ebdd3eb8d4d3bc059bbab6b8d2aa93bd9edc504855b8e7406afd22292e0ddb88507081f985d00b838ce6d9614505879b131c1d87862499306792a3ec46310da6360a51f2b48093f89847f74e9fd9d953c3cd4770f8295d40b4e66c5d92162ce733afddefdda4858a1717de83ba0b407d3172cdf1e2106dde5379459e67cc3803ec28e6923710e9bd23f6e17d64243ee3abf0cfbe4432f9895b019dee6043c57e89baecf588ce14b98b0745c2d675cdb9ab269e3d33a9e56f9dd932dcbd7d908f5a64e0ec6b808a57cc3c56e371f2cdbd3aaae7c229c89a9926d7b4cbada16832d6c7a6d4c9428deb93d569932683904e029cb578bb12415d0ca9d334a8edfa1245aa68709dc6a23110777bd660f32e92f0591ed7d94982fc3ecc4bb92a5392513571388d06b6641286faa5ae9b2684bbb713a133982c4ed792169707ca20e5869ea2a2ddea1a1b7f1ec761339e44cefaa0ac5adbe9e07ae669137d17a074ca810756f04a8cd8888359b313fb81f74fe9eab0b1d3594d5878baaed653d6630bb4c08e9900cd560f4b30b4a5dc14146b140a4e3b15861cfca47c661d1a1cda7e13c467c7873f782fa5bd5bac6a0172657af2d6cdde6cbde20bfa25d2071d10f2cedb808330cdd360d732791ea40eee037e51bc6bd9943112bb2c50a0c +SHAKE-256: 11a40cee10e05f702c723eace5c5daac6f67d579b2f7157dda16dd48074288e00f23b5ee7cbe1c0cd27e06aefe80c2515b5c0cef84505c32520358a2499c69aac428fb94d6df9d6395837b4f1bcadd5812fde5cc87436183568d75c078b1f350698e1bfd681f6273191353c52c32b00aab4e78fb7a82801776c064d53199f2e7b448ed203b8fd2612747de9c007acda3da1cea87da270caac3b3474932543e159e25235a4e509c7cdd666bfb0b7a04e9c9c17f0517a6b25d2f74eefbce53a9f606d80de7c4537b5ff5feba24f572f5e35de71e9cd5ee929c8f74b5022d3fffb4a2e422d37663e010dd2957c681dad0a7656739017583c556d40224a1a8daedc7299cbb8cac833c789ea3cb126aa82cf2cd8f033190edde93421050d74245883c2191b0b24dc6224e12a604a9093c493ca6918da37d3af94d6f0cb4e040d28739414b40f20ee7c3ef0c0436f6340ab3caa752c761cc6382bd6a13a8f891e7ddf39126215752650918cdf9f3bdf405739e5ada97b96113ee33d2dc2c6136e385adb2889050c4177651b3fc8b9bc3664bb64ea332a3c9d826977bb0c7421dffe2869c9417a217765b32e7b59ccd2207e2d199eeb77f56aec5a5f44f872b113c5f1e229746ab4be91f0cd7ac2ef9dcdd5a6bb5568197af6bc795e60c50dd13dea0f79b3db23038e01e2f72b3fb65f8fee68c8e60d7506b9d4cff4aed6f16a2f46cf7 + +Input: 83501fc9032d8acf59d621b715ce019d203f06c4f55201e594c22d038653146aca9bf0e4eb9a69a2c093c3ac7aba01a2bcd6ec9389da2ba4cb8b9ea0581e74e25c41b2391182ee5b0c567ce7f4820ad3dbbb99743038a3ab2568358007a97c3f68592806cdbd89d4b7073cb40f410fc14a8b3c20d3c00b8c694e068b80e20a963257c300010524cf4e66a8fcbf6aaf6ceb8039582db1c81843359afc5054f298a975a1 +SHA3-256: ec2619261c286a2e0d784c509bf1b11aebc1b50ce5fc1451382a747fb09e268e +SHA3-512: dc9bdd4cf49dac650945f0b1f3c5e087cf253ccc529580b60ef0cb201e48f8d589b04ff10b8095b4f700f0fb18920a0bdd7406babb42016d0582a31abb75bc9b +SHAKE-128: 7c18516ccf2ffe4136bdb96a2b436be2e4e8d3bafb7e39ed24b361ae7db71fc4a3b13a9427f6192a8238829d4065a4293923908917df53ab92b4034cfc147b82c3acce25218cd584bd1362c92acbc36e6af8b1cd9eebc4252172129f3cb9e49547889f9b3f4566b9618a448eb894b3d9fbf032fd6f9b99743586c49e59aae8d0d877d92d47b9bb26ed6c526226823e1b2f6d79dddea178cabde0219a20db2bfd60845726254ba2e519815bfe4ce7c11a9dbe363d140f000a95cf12ce843cc7fbdd23e6bc62596afe0301056e9567951f3a371f887f3a4cd38a208657e31a8db28ea309f914ee7398ccace75564a1b35b75befa9a5e74b1b758bfd290ac232b0b8ceac38b261bf1f7e8b42ff72268c83ed71d380b3af85e81afb3f28013997500c9183274d7926c28e543feeed77da4120e8fdac0adb439f9dd363ea3f103e606c35aa725d9df9ba3948b58eb0b3bd00719a360f5332e165926bd1c88505ef61819590a57834ae4c8f77d343bcb4506aa63db51629f890af8c792614f4d5aca3d92cb8d9afb8b7475f3e6170197ba5995d9e163cfd93a50a3c42d47fe10ee7c0e65e68b646885ec98fb92b578ee5801e06452cfc50ea77ea87d41bc50e7f6b44685caef9865912019df05d256c0704f206cc383807fe2c769d02a990bc79b624c0dd98057204b10b887715d04a1d17a36e8c741dad282c95102213da7488c2739 +SHAKE-256: 119754489bb54651c5c1c305570b30b09d9d220ebbb60047ecf0bada89613bade48d4cbe1f6973f9508725b7df1a59fe3766d74d9ebd4fcf355737624095520f5b4b1a39c7f382f69b21b621029a64f892d94c7bf305136d60e9b2af4c5d845a3d608c745411767c50f6716ef6927271f39b2985a26196761e6d342b38428edab738e4a32f9208d6388e19a187e7a2edc056308b64ee17a53d4e736af01bae3cbd81ef3d5cda4ad5de8b4e239e312079109c6b5d49a5871439e020eb449ba945455117ca6457d1959f142ecca866f8f9c383a523a33b8bc90210473cefb2d06a51fda1e564321f10faab67ca70fdfa461a7d631daf621b3a4a1244cc7767b4901ed814eb3ac9fa6f99183e404101e747e52a0d5634bb0dcdaf9edb04016f1c5afb6988fe7aa7d299c058a41cd2ed884fb4064707ca4d4089a725cff2a61abf7037bb65f392aa4d0c2ffff3945f2962959d8b0c6566915ccd19abfbaf78482ed8157c4a8c0ebe62030b7ee07161568a4fe52a4ef2bcbeb738df0133c410f01d24f0c1564926346d558ee47955470cee58dc78d1a8a4be207a0118aa91e911588ef2085e4ca90aab257c4990dffa7c743c13346cdad1703bf29305dae008c8be89878f91d93a849b34863ae19eb31bee1a8b26eaab31c26453a68ce2b243340589c29680e86436f19bf3ee47e85fdb367d4669b7a199eb0bd54d697555f949cacf + +Input: b9b9e7892cb52e97e0f283fd7220a0e42bf94d95935e90e9f7e0ba0ab1a709d8da33a4b5f0a72cb50178d14f617c1f106d9af0008032b8a4ad30344253382328427c47a5cb3f88db09a6dd7ab5d1f11c1ab3441db386ee4daf6dc09ba86d13d9f9f67711b2d8d77daf786bcf1e5f69945f1343b11d66564ed8cb1845adee2f2013b3c4f0c0d66667d5d60cb594aaf3cbc71f6fa6819f5bfe4dd43d77db108b12259ff10c +SHA3-256: b27c5a57455ce51df39940d85f76b5a662743c57441d8384848f3967952b2141 +SHA3-512: 2b68cae4a177e817d050679503179bf2674f8a70dacf0759d6316fcd421abfc019c367c6bdc69fab96593b2c6f4c6ae3be28a5695ddfbfa3bdf45c36b3208040 +SHAKE-128: 740cad4c5aad97ecc4c1638f93d11ba9826a18a21f1224632c04b3ca9bf4e70c6db5b2df228797e0f68e245592afcbdccf908525db502c3384569949da2220177825c6ee2d9df792fbf603d9a4695ed034d02d94d41579deed46c1f97b59cbbdfb84c8bb1b54f8f423da5fda83c20e5f9913f7cb2c027c3520f1fbc2c8a1bba9bfdff3126656cbab4c2cc852349e454266c392d29166a7a602c5f0a3bf34de0ef6e310172bfa36fcda31d2feb28a197090e2e38967110be72456f6f9030e8e1eedecebf8d9b157bf7809342b5cffa68277e3a236993340305fcbfb9cd06cddbfc078835daa30e7c3d9e3fe77ffa1266fd1ceee51e320aa5531cd4e7112700ca84651cb7f8e60080c2875077577838540783810d0fbf30d6b844c62db4cfa2d89ee776b1f91b9d363701c1d71b59afe7874ecc0a21bbeb4061af730daecb6a361c4eb759f7310fa5e8bcdec9ce569ed4d20a7626ca4de768727c938d00632982cdca044a2f835f7283fc8dd1f0880e30aa17d83a240e72b3e99edf5bae01fbcb44adfe189b5ad15d8dc543c40f1e3d10093d250d62387c289de93c2ae987aa3deeea142165134eaba8a7aae19feee51d9bf47757e23b31be47a41c1a33eb6da831557416d955cd76e64e9cd69ab8df45c34f0632da14ae921436a48a4307eb49d1f7e8ac20691a5f7a776745a7fdf397b3690d26a04f96e4b44b9371190d6e5ef +SHAKE-256: 40edeeb03068cc292c20588a1e046b0f8853ad28280b984832a8bae24c1103c980f994098964ec36ea15a3f4d87a819785b80c9f3d792cd6e2dee4db370837c7ca5928da817ffa546e1665f5ac1672594249c2243cd25110ed1dbfe7c16b6b81b746bb9f67297f08c6394c040badef763f5238486804efef080213f7b5bb739104f3a3efa75be7f378fc53954a4f31b125f3faf061bbed5e0d019dc01c4b82b5c77861ee021d81f2508533df4af9e5accfd29daba0231c2a7b76facd1b8aaea25f0dca2566f96b023a3bc810d6067c3b9b5a1fc60001af1c102f4c90f6850455df2029038e0f841b94f1cf78d8c4a589ac0d1d250f8ad8682dcbdf401e4e282f11e96d7f826704947e52f0aaba17ae73ec7fadd15764fa18cc888923ee5233fbe9dd8ec5e548839a093a5693d3375aa7977c2e71cadc6a31d3b967b1d57b0ed073181d7f72b23db161decd93e360193e372f95a2ecda55a4a76ad573d6ca7df7c912a1218ffb14523e44d131837c31aef09c45d0eff172f0c2d26ceb74e6a7607a0e1bcfb5e6cb8fec42d1496c7690f4872f98e7ab4f183cb278b1b4e76d2f9c05d046a452eb9116df276f383a6903f41ec8723bc54ed051391defd2a693dfd82db2e0c9786e9654e3a06f9dd5a0054b6b6a5f9e9828ae8704224d7e62e8e88244c1dce41d5cd62f092b6accb858a57f3f362c57675531d8e9a6129378577b97 + +Input: b4aaaf6f9c39082760a3520a09d5095f3ac27212875907adaef193cc2165d5e9bd85d4e622577984fe563b63f225db6162cac5486eb228693530be75e454f52c6034b7b02a49a80eea1674ae5d7647bade2a32042dce560c8361daf26455de5106b332bf4c0e7c3b0b9749d5ae36920bffa1bd9bbc69f656f18b3337f2eb1c3b7a599dcd3aff6cbfe8d857b8a31f549d59930de178da85c3a62502ca8190638af946b9c33d +SHA3-256: 823738f36e3efa6f1d2a590d6dcb8903dc3a2dbc1716df61945404dde53d1d62 +SHA3-512: 1387e43d7c3a6913334f8a0c9ec8dc8395df3bc78e2031f1cc6421f05ce3321eea99f6b6b252c3581b1f539d7b63d01f4a6e34cdb77f735c099c5d4d3738a70f +SHAKE-128: 3f852b8a272a3a9cf80aa70ca6c979ac623ddff272f7a0d5f5dcdfc50993681d2f1a09c7e9af9e7736278fb49d6e8959a702b955397373f104ee423d4337d4e12a3ff8923be9fd5bd227d2e496a8ccfa9f737e787b795e3627088f5c918cda6dd8aafd31b731b8b5aef911e4c91f9538b426f62110913ae14284d8a83c4c3b8fd6e10976f5f63e2d585fdf2410e5f1c1b6ed3565002261652c3bc2a67082830bec3df9fd778898ecac252686eca2e4cd4d62204436b186397bd3a6fa874de73114f3c8576ec6aabf1617ecaf3d518283cf7706caccdcd90e0d1a2cc19e1cd36a2910af3f6f29a13a9b79e4122a584517690df370067f36138b47bf7816ef5140dee01c19ec085013867a502e6e0c538cb4dffb107f4ebe215cc5b69cb72fb57d3c21d3a5c2b32f9e80fcc41a0438874aca2364851bbb2078f16a4171dc74dcbd80855fda41544ccc5921c5d7f29b5cea11cc5c153485d3952fc39174f0ddb432970a1cd26b805054ed387a9421998c3662e16b30a75cc7fd4b942aa6379e7cf8edd5b193feedb6a213d7120643fe40bb118515de6c6949f901426f1c87b6aab524cd65bfab7ea95c06fe6b7ae7730226feefaa4eac8fcdc511b9ef2970eba8297d2e9bf1b5adfb2066580e3f2d171a76bfdadab2e1b43b8b2eb0db2743263adaefd3bc41661f3ab8df5db258a9b2f3a69373250e57e6e1377120af3438741425 +SHAKE-256: 457647b9eef14442838f4fa1ed79947cc5c2f4197a631f81b70bf51341d33f528fed1cb8524d29005b326e09b9e2caee29f2c459bfa283a316da7db6950796e154d6e1a6454c9eb3d0c8562a91dd29da5b0aa6fc0d71f844a85a55f4bee6194e33e796f6cdf1c43d05c9159c3fbad2f453fb4ad86e3c5f0ac39c48da7468d93a34ae7a36a2c9fc1178c987f34902fce8931a1142ee1a9b0b71eb28aa77f54f159073e207fd467d312c1bcc94881168f65a89e05590833842d44724bbb2cc2683c5775e976980b5ca887896590de7812554f4e3ec4dd392092ce214f411d1427516c94f835cfd68a6e8f8904dca04805b10eeab8c20746a9671c46f76b8c49bcc8df5b776b2531f7472b60cdabf6e70135d4a43c7ea8ad8649663b684c1f72b768562dd156cc2c4fed3084d4180588a65de8c5909b580220a11401ce3404798856cbb7aff796aa7ee62b5dab8aa367cbdbd0cb0edb8e08400d16e4f3ac8b683a317e58790af3417b89e8559fefe7d8d30f054c1119e9a0320562f8b8b4e619328b47a05753f613c35d2dd0772fba3bb98dc00a2065ad59c6c617c7e787571273920f457685abe5e2dd14a7ff712353b39b8f2dff1a9a67fedcd64ebcf12d72e12e2b3836e5256b4bba424cd7f754121a7cd5603dec1592eeffa9c4e60da3758b9a9863c2b2cc287b866fe94f936d1742a395b7323bf9058c197cf85e3a1d5b1f5 + +Input: 830386eb7a344f9fe631785f1d4d4608d3e93549633e95676a3b81a62f86fd1f4dafd97065094ca3cc721101c9ccf95656b9ba49ab3ae44f68649aa310e94c137197a7f7318c73e42b831855362fa32b47ef9bb97425ee31516292e8b81ade54937e359ec20ab4c5fd2962c1daf97c78c093050c1fc828b6e7c1791fad61d90d19f7d8a67c3942fec74de8323ff9f40088544109297d63edde884526450199cab2d440fe0dd4 +SHA3-256: 8a1fdee075f3d5e5b7847613b9ee7d527538308ed50cd8468c653e751902fe19 +SHA3-512: 03250f2a2ee20159ebc6be53e0d861f6eb3369efa5e416fed9cf04bef009e0f0b05c8d1833ec52e7439aa46de761529895fd055e46acafd19203d18a6f78d040 +SHAKE-128: fadd40e24b35e8be2af90aa7b41b68972912137aef1eda45d912aa3417f7fbe8d2b990656c8640e3c5b8dc435e86b6c3074218f32c8fd3dca13c4c738791f0989ecaaf7d37e3657bd7e7662c45037a7f088bc9cf5831cc2ac7b3594641a1cd4f3d7fd2dc1ae49aa0b321ffd76ec342352683c7dab46d752f7c9b308e519c19b2307a03f565701df47a4cf3eb8e32fe59dfdbe046b3b4e989996e1b47a2f6131ff4db301e31cd51d706dd6457ca8950cb69ff4038e6a369c82edf972466fe1346aa80a1f5f03fdbbde4e6c068da782c6ccd97f4ed5b3a089a2491746aa1b493e389b56442c2e0c0496b25c0536d346d69954d1dbf796069d06141f77b4be2bc78425a8c5fba4f814e8c36c0a439cd9e7fff0c55f9ae0ccb44e8f49665406f9101cd72d8afdf1fc7fed89ee0b983ebe6b6bb35040d072fff50b08e13cbaa501675480d847b69cb791e93c5222b3090615ceb66ff3dd169c2b1ce802e2be78adcb5e1aa8896ea3a6112c6b744d8596bed5b076e1065810e51037a4592c788c1fdf131cec6f3a6759686cce4d5d2a0b7f293fc042d4ab79cb498e1193a3dc90db2bc9e80be0bb9f314c06bebb3434da76bf57f98a0258e951d180b13bd69d78c59fc4c13a0f6ac820563cb65c15687941300c790e0a3f7515c368662f8fdc14aad64b20f0d92f15f9d2f6bf39832b3fa485196cda5fb8cda8d16723688af667f686b +SHAKE-256: 018c8ab358a7ba3f03c01042bdddd3a006c79a955044b605831a401bd5cc15cf43360b19b9160fc2dc539a61236c29a8af6d28ed6b1fd067b8fb1ca400ecc0e646d5bfef6ce67f7545400b9ed1ad3ab477f848d725404a77124a1a1df747810ab637508e7c7d02099e225fe9391a2da056700a920e819da75199f256ab27a21f8d10747657c302aa90f2bfba7db39840b79c9a95ed2927aa4e4fec2b671dd789ff432eb16e1b8020e6d19208ef559aa468ef47865b2233f9edb70fb29f2f2c84a436c92de3f9b216976b9ab797829531c39a55662b21bd31b95f4c9efbe383aef4bac096e36c38136f5d707d5288c37ca5760fdd3bde2088d9def233bef062794b4c383f0b93f995b61cbe9b0013f69bbbb0d06b5471f20585d98aac770a03cd47e83077b18fc92767d64100d8988aa9ce4186cb3e44e4bab4305a58c88be97667e7a67e671b9afe60edfd63712235a20c60c21d0455ca724c5c117771fbdaff071173b387a02726975d865dade539983a4ac9b791eac16c8de51ec53a3af5c319eccb2c6ebc2087578cee7605da9ef41a3d816a9acf859d7a822b0d3a2e6284e50aab45bea3158faf444d57eea33c9873dde12a5cc80d172d2414aa902c507ab22777b025af79ed410c54ea61a87b56e019116da8682accce6247d098e2e372ae73300c0edd14819df3201682bb898fba4e4dfc0cf4b6efca5370fa1dbc5531 + +Input: 8183466420f4a3d6dc3bc05dbf2bc0f54bc9c96a83e4d054d3549ca49d3c9f7f559d992b1f151d31d2ccf61cb279cbc1122b71df0880c4b07400bcbde5eb0448ca62079db6182709f2e44d5a7b927afa4909105c0eae0582fe14ea915218d8f2726f93cd1c288451483e4b074389806fd8f2d39c74ea00d77f8d73c91df00e1e27a40038d5e7423172ead9226f492cfde73cdf020a233df2268ea15c8960d19b95ff2bd7a9db25 +SHA3-256: e6588b31ea9e43f1c26c07924577018917c1709a9373c9ffab06c6db3e9ca6cf +SHA3-512: 4e0bc9f85b50426febf28034b22a42dac17e002c897f583ee5efcbd1a304fd825c7a202f26a5fca79f0303b0d11ee171ccac5e2e1a929e3da80c578291e60f5d +SHAKE-128: f93181a0b2741264db275e23c5ff9fce536e748dd483662399159d6bf56737014a3cca4e34fd44f328dbc3e0d7f8885e0cec26e70c3bf62c79b1f10da480ea03e4551f70f9a835c0ac46f32763d3cdc561963b5530662c3c6db007070f40284322738fcb4d1d15d9bb10079747a5e8fd6e4b90fbfec332faf25bd180cd91d5a0c339e80fd959931b7468a903dc9b4630e799c322b6c3edc9a755b7da28d3667efff0f971f243da5af81dc560d62c8480ff2a4e01c43f3c52e1379e8d7f68276ea5ea58a07266419b0d13fd43dd7185434eba711420d1e84253425a09b4ce31902a4e36d6044a1e539613ea3231754e491b516e6e7dc4603f2ec9255261f1014efc2414a7ad6007c05a5b245fed6a3bd1fc842230667a91a40a8e9a16b6b3d2d6096c6382f4d92080abedae2601c6bd1ee0541b4946b73d52ded19d74270abed03aa9dc7be910048cd9d5ab007e28877d6d506328ee9b2f389e29a31f21f2a1d44184ee3e3ccdfb4b0643845952218c41e3eb9c6e7534d82d014668fa14a4a9af3047da861327ca06e20328418719b67de3d8005b574a49977aa6284b8b36df5f74508c21b37d57616da181c0f434abf9310d92f94ab1f2096fecbb05fa86caffc766757838419d2fdffcdbd02c11e4ea70da9268a03048ad280d2a8904a8c61a6740ca6e4f779ec0a543a0ef042d88a9b9acc055e7fbcb1047034d818a4b521a +SHAKE-256: 41f7cb8f32b08edeff63cf18d16b67ca9af194067971fa7cb547c60bf1524c29d29e27cd5f90b6daf1bce08d46e0579bb10c5be737d199a3e08f3ff0b95fc337bf7d7de5b5aff097c90aebb7ec52b0e4acc48faab31a2f1f3221ed312ecefd557e09555dd6a4fa2ffe41925a087872977d3ca069d3be5af8d1779e89c340d07453844b9e3634e1cf8d9562c11fdca3217a56b31522bf5ec5125983373296220dca5efe9a112a690ddb5eaaf35724f8b44793ab1caa2731176000db1dbce57f1c3120707c137881ad6987267ddc18d6dde15b00bc6ee1771b67f8da82d789fced735df382bcba4e315e8b25d438ead60af99130e2f8cc70d189217723b2d99956f347a0339f43eba17addeaa48d603973ead2cf6a84ee01047d852eb54c3404330aa5f1e66c51685fa5654c480c7ff81361a7f1757736184b2211352451c01dd3c82afa8b9fa5b0903fee8d7bdc2c3c242823e93ec7dc6c5a46ded7f20cea10f50f309718622148cc4afe07be108d2375ce4d0b93cb7a6c802d11693d55c711a9ebeb18c77454de7fb321ede260f9fa9667ed8835e9d570b8961e724619247201a0072564eecd17d6947147a4207952874af051e649c3a9e81cdb21fafa93067c599cea9ae22cb4ddbaf7ec2566c771f081f1c46e1848e02d42649bced38b679d26ffeadefd270e374f56a011d2ee37424bc84c84f40d695be35713e24905d311 + +Input: aedd7d4df058d05a0867fda243970257c72f928cce917389cf957a993c28782b9df48f28a1dd8b8785d070112235499894dd5dc6b839bc0da9861a693d2086e829b4d6dafc10f6b5137aaef9ab98fe1cd6e4c6961533828462ec9fb5e33b0cfdc2b3f6f8c0ac0e4331a412222e0ece93cf6de718a42369240e9d4a54316eeb710014daa8dd2c20bdbf7c77a9a6b1f1256fa6267d165074284b3858f534fcc97d01a1e6e0e9fd9acc +SHA3-256: 487233319467b1b0e245d8b6eef7e3d9c5ea8c2df6acdd672753065dafbf348f +SHA3-512: bb40831416904fd1129acd036743bf930ac23b7e7901cbe1a484348d5b5c1fdf8b6ff9d4b8790e7ed1b9744958efbed650987180b54371447f33a48eaa8aa675 +SHAKE-128: 2fbaf54f36c514d2531c1e2dd265dec281698cb02db571cfe9bc090bdf7fef737332a9fde52a75a81071d584abe02c78e911291791167395298fabdfb16c1961a54aaa8546fe6dcc2968f44add402243e0253defd0cd051b2d2c2ffe4eb49f17ba274a7e5870536f30f9d929906edb0de8fe6cd746fc32415ce46db6379dbf2fa190becee381fe278201515ccd0468482d0b5d919fa1fec0f74a9ca0e8b06662fef2605e652afe0cef70bf58900adb2a2459cfaf1a9732023ee4612a4f088b77d290f7307aabe3423bbbfae30ac4297cd72cb1a3ab580bf72f73b9aab1de234956d2d1bf2b86b497b361e410ef491166ee0f303a713ee79916bf2f048c9c101d7c109010b3506309b79dcca9ca7e91f4588c2455614a099da776dba61edb3bba76b74bfb5acd1a0adbf4763961aa8f4bd06b366dc39edb1db48f2206895aeafce9df2ce50f96b84047b5976922b692ac00604418634b1d7ec4ed55d2409539d1757ab391d1bc7dbb2253a35569f3fbb51daaf6c87d6c018543dc5911ba1370a6fd1bc6039b9e849d693006c34055320d9f44e5e63b9143c0dc088cdaf15357dd6f98d5588c154ec3734484dd601b7d643329cc7bce2c498c74e02e53474d246037bad29040a33e313e02c40b4fa8e5f9ea6e3f5ebf6a4f463f27379bba2625c577c6ddc22873643d3ac5c693d96fe0777de4fd1054d8ecf845098f4097a54c52 +SHAKE-256: 49f6bbd89b7412a5681996ae7658bae49f658c561ead09b1119abee5fa1d63e445b9a47cc3b28d419d313f6c24b3a765e3376059d5020cc1669ec6e1f4b5a1a3881e4adf2fe28b79d0cd93aecdf7749f2850d7aa3a584e638e58d185a17324671f7d0b3f175ddb3f9b5ad96f01099c1c05939b8fa91609fec435a533b548e96bb10a9fc4864cdafb67c8019d292f8499c3fd456b80f7ec3f2658cc704c21232f2718a6ca0cdf39caf6771b104e40fbe2f5798ac9c3e19db0747069ea5d867b9374eb7106ac88f29b5f3a2db824a2c2637a85dbbcb7c97f649a3629d27e832a64fc601a68082882575ddf396c49901d58d098108380a8bf6810e5f1ec5e02036f6338416016fce4fb9d65e518c5cf44062b3fcce9d72d7463be36203097b8ab9d12ddd467e98890c51afc3086936869b4c1b7281e13986cf8a4899070dfe4ca7ce5725a3aabd753608d46f5cc3c106a0b1c2338f62b9ebbeececadc262d7e20681b7d1be367c067fd38930f7e7c87d680641c8361f4973096e9841f07e7c7ff2609ac0dcdb47eef34fe4e8f0c182ad70d8ac3d9a1cb9445c7892c422ce2dd444decb0cf95ba3cd44bca9e02d7168550e5c5a991b492d9c83d49d1fd8e33ebe9d341dc42fa0e76edc5529acde710a99ac0484b8803dd0d9bf80d1bfba7be3fb23ff4be8fb8fe7d8ab602bb46406fdd436209b3f2ed4faa594e8f4e18c1bd7041ed + +Input: 4c4b43f7e229b8d72a178ae73a741c66e891f78316adb994ffec7421724efc2b66e50261233374c6e48e895c7c2f4ee6bbcb62eb489d9e3fda40aeab8d12f50338c24ca5179fbd367db6411add8f7136c7e7d5c194100dfd1f5763b4df3db5d4482f82e5e80b7f23fb9d3c2c686ad60254b0a55f1a533fd5a6c6b810e28c8f807abc079b1ee45c759ac8345fe42c89afe8b0114bf4e77b8fe35d25e7b40c5d91d123e5d85a6ba247bb +SHA3-256: 0e78a059156dce37cc7a95babdd1e151df37452bb5e57cab0fe4d47d9a5309f6 +SHA3-512: 5447bc790e138847f01f89d8ca25a0b21927b9ed409798f7bf7b9b4ad33790b41d4bc55c588f780159ecd6791d2677ad4669ad9de00decebcedd89a108a19ea9 +SHAKE-128: acb70a1c594f0faa4366b8c31d4d3228b0249bfa5282cc9fac98dc59b7c030df4de5b7b236f85cbef6beb2059975aa678e3ae2c24a2f2c4f0825a8c0997eae244278a3ad118a8b677e4ffca33fb1530ef5ce7fd4d2e1f7a49e45afc18e393c5769a6a45d9b6eb2a8d773ede48ca9b893c8e30e65cd3febe6a8229fb696d94aeaa81a0574a4ac1a1f54de7e12753694f5355a129d150b4a5967b7c33c5ccc39063fdbadd19aa08faa851f6401529e09d0d94ee811dd14b3635bf3bc84e21f498c6881f6beea96135b474094f4606ee977bff1a6522b2411f7713a33bcf5ff9fa119b8d0ed12efc764c453fcc0d03cc76450f8c1454be07e169f75895bba90bea5b075231d665df6d23f51930e0b123fc403ee0db707ff6b35ecbfb3d7bbccadd6159810e4f134491014d7bad4e33d476e364caa899c950b08a774e3cbcb7414c0b1b9112152357e435f58d068014fb0c7a79ca2d1817dbfcfa2874244af3865e96d561de3da655c23e9603c425eeee2ae2f2b859711ad1da17f33cb24a08454c6b9614c1d522130838ea18c9038190855fabd1f772691ef3d8a86b9cf00c30fb70ff95261b729247dbb17fae214068dbf4ed27038361c025dba667d82d973dd356dc23d27f8fdbe176a6d2462b24b7c6be47fec15fb970691499e704fb50eddce149e8eb8fe5a0f440989c376893186c8fe1dc265ae1f0a23eb45eff8366f7535 +SHAKE-256: de216774cb6335fe4ff892842f8922adaf89e84fd018fcf6cd86575005775a88230093d33df85465f68821b253165ec47610efee13d6f42377412de0c53ab1a648488b1e78bc6db4cc3fa0d722c01e7f96870a5197ac43a3ad7f8a76c41b86b36c1c644f1e55be8584cce096cdce8cc0e13113fa9a58cae588ef85d6de320c00d1bb87f204ade26fed7e9243ba457dedbcc7b8d80b9c9ce089565bd7f6126ff108281b3cfa2e35f3bf19adcbf1184c3c684f54f5eeb23eb4ee64277e0c8515ac1dc28e5840510e6b1bb980bd61bc2b225e8a3c969a332f6a8504709b3c7ec0da7e132f32fe2bb46e3d40a16c77ca94e1d342db530dd0b6c4d9db47ea52d3317d85abc155183ed9f757a7073674d71904807f2392d7c87e0bb7c99ac089b447a8f8e89d9e4641441fe5d4338b90b2968cbecff082f92f777c4ad3d9ba600614730a8c8f8b676864c5359ed09b874b1c5fbfe8854d86995da1c494314209bf9333726d39374a7c3007a41fbe463d1906dbb0025690b7a752b99c8ad2e878cd508158bb082f22f85ab29a2e1542343a1db7a478906e11728e268d53401482464ce10f0b1470c5c577aed70803612abd93e0b3f09b0b44d8e40ffc4b9495cfcadc05ddcc5e456483b59ffc4c19232b500f1ba2722bc6511797fc508d5b79ad862701c6e3112349574da0c85ddc2192e9ec63dfeab75b5e153cae1eacaea2a4e5e46d + +Input: e8f183c01f3623c1923c8c5e8a74948ab2e867e3aaff927e27311377f0fae7483a6a944d5feafd1e2dae3f510c1294bae6f09f21f80d5210cad26e0847e11aa6767e1f1f05cdb3af3376f7f2e1cb43a70000dc4cc5096cbbafdae46d2aa9a3acb973a8cc26811a93b07d83796a3e8629e376e5ddf21e007a1f70567b5970188ebf4e8a0253361998cfb5815ab675c4f82e50997d17035c85f55ea10501e6831fc6854c444527d02fc26a +SHA3-256: d88106076b2895c1af4bc69da719172151439a03d104dc9d333994919f072fe0 +SHA3-512: 54d3e50231730eaaecc10ee186eda740b582c4c35315a5f2cf4a41e7e95c96850ae162b84b7c7dbd2dc00bd723884e0d9a287b3a81762ddd5dbd9f13385a7ef8 +SHAKE-128: 38be45bf3060ea5c38e5d7ed1733606b3af9398c360fd8b81bd78e98a13cfb4cec7c4fcf103c852a1285edc61c3177ed24558951d2d9e0c2c6f6f8736e4635cc2d989c62fdc7b4d0e94ab92c9958f9c93384f82d90adb5c0177e8d9e3bac8ab0371ff311204f04a78c87e25a9c81288174880683e7dbb30a90193a55253fe98c100ce3cbdc1e4aac38fca40320d0c3a22552c7cc79c40d92e8ff0b9f3596961bcc8794a4b8e2e85c325debb4813effba6748f68fa572298a5eb16498d358898b184f9f83a55cbe48b20cc9316e0afff58e3e9a5f73ab20e550b99393be931f5efc61ff099e335784bac9ea3170f43f9f336cd21fb419e5546f37a7cccd3bfab8bdf03d2c22062c9bb0dd528bfa6d34708e558f6e46c7e6c29e2ae366841a9b85a64ffccd7276b564203c3fc490ee9fcbc67dbc275e4bc764b90fd833fd80e8fc6d46c3bdcfbf1b00fff9ddeb61c3b85c614590800d995359491656e0f8b9dde5418f44ee9131ff0fe622608efdd5d56f3055b87c03a18ccb40a89022cff383a057d8537f126de0335fe326d29c510ac72e1b16fe8627fa3b9e2c83c7c1d96e10ad5a4183e5c3e6c56cc2959b59ded9fbaa1c0a840edfdc2ebc93ede5eb40e7abec36044c0707b13af59307309368a9ba936865b69110f3b52752ac7836db9e72ccef9da71473e127169bf8647d3f33b3c33c55465e2948aa2d3fced0878817b3 +SHAKE-256: 5a1c61aa8f02ead397be6f4add999c5f28804888427e7a71ff326ca6341d76ddb69e4753088feaa3781e109eecab2cd683e9449d71d32ea4a387ab1f761be7c8660d780252ea5d87d1c8a2d531a9a41d8b4f27451b2632d9a4d2ae28972fa436c51a3a430a825dd1c5f56179f31fb7f2d4e31aaf93252feaaa8948f6554408eb625d0dc85662c6a5d3bb1fe663263b3420bd787f5680c262d24fe21df845ec395601be00b4736ea5e40a4505f1683f70210718db8fab038a0a1f0764aadb5c16d842bc609c3ef4e9129389055a6064dc7ffa877dfc004b47b737cb60194ae9f362e76d78b22b2dc257d5603f905fe626f113520581bdfec3ac96c3fa9e739ddb6e0b8bc087b8c3e5d546779351e14d0145d65989512f23b59e7e62977639f946c9a97ae2d8008135860ddbd6fa1b94f73958666106aa73960ccdf5ee2998cd53de05870ac5eddce34d91e257eaae2b764404737f9a63fbd4796c32405986b8d234893d805646eeafe7dd20b99b3379d2e3dffbf22777a418013caea431d022f470ab7e5097b336fe98b7ad3c08e960403f21359fc37ddb4df95210b197125802b7075fa86138170ccfacb8de97603fe6575696c4842c9bad9252a449f7d5173ca60d297477da9b601d68ee864bc122675362043621198d6b818753c05ac8da433936f7ce3cd0cdeaa2450297ed464697bfa5d8734ee78a03ca813aa995f8dda1 + +Input: b5cab4ba5c48b493cff3d50cedd742411712669bf07b133954baffc52d5c24c88ed86814c381a0aae8bea807bca098da5168887ac9d08b278f6f9be9a27c66ba7d485412a61249c99c76cbffb876965df46993ccb4afb0a34e16e9131bf9003067524bedfa1a42ff1b86edb35d6e0c9a669c2e0c5d08da98750a798c5829c05b5dca67be375789e29d4da842044beecbe8eb5015f3c5b1d1a289a43079b4886c260032ddf012cce0d437c2 +SHA3-256: 5905df34c6e01596d1eba439061ba1732f6190cfd3c9c78b53cfa8f974c358e0 +SHA3-512: ae3d1fd93c3dfc5bbdc52a33ea6962ba9c22b2e4e65ed87055d53defe0069ca00d2ee420de827d9731230f0497bddf69b4dd419b5367e713827e179ef25fb88c +SHAKE-128: 0fd86ea32ccef48e530aa3e9af51f6c86671375ff1852e4f71af38c7eba874ef05834478a1426fb4cf87a3fb17dc16bd71cc84adb3a17adfb696433c328de22447c93f00cdea4aee2a80a0e441c3da531ad8277b40e8a07ee183fdd3237ccfa7b885bba6d93b85df5a25f1812bce8235ff5a6af0ea98dd5ee574a7da7813a32551a0438cd69b31cebfd3b5a357a8e817ec6c03f8048bbb450b607f6f423aff89424c62ddf0b615863b15f71e1c6d7dba058c4afe8f67ac6bcadfb0d4804c32e9a9d99b1d6900fc73ee87298dff88d5a59013888fded3d46a6e7e7dbf2207738642af13f6742d384d534b7ab31a04ae5983c80cd68d740745ae5a65fb7545bf57d30e62200b253d2d93282de12fc5540be5f51af99d40f36c77a0d85fb96d6c211e54799702af65a1b391f9c3dc3a9e17597b677ccc3d00ea19b481c1e990d923f440288813d21b5b99f9f646152345ba2b5514482d8ababf1b5b8ec05b4cc7fc0bbb14cbde9b702d84604f92ab195a41bb1e8010aa82a44f657cfdbd2f3d0025116635ea11c7738c4859aeea55edad84dd840cbe8f53e533503ec97a8eaa334cb738c26e62edeb2f9e4085a13a0c0378de984877c0c0e7957c0f301aa8ca1ef2ef5ac474fdfe523a64194dffd39cd99a68cb6a85d0a5374b8a84eca1e5c8009754cdebf81cd197019f9fbd78380931ddf1654820b585d18d827f506d66b7d466 +SHAKE-256: 66c1b1d6376717563dd22084d8b9f914e6775e4c34e34760c1c756f412e5dd664055d14390b8fee10c30ba1daa884563890d60b5625ba65e58f492096bf57e6b23180eb3f4f7f05e9cf517c39c1c8415671d8345892560ae7150cd11e4d987e69a2377c6394aecbcf351f0c3c3e58f049e80871e41f12cdbba1e54079aa30ce107c6049c7fafbeb19188f2fcd0fb8f3cbeaf13315372a2942383175bdb0c2c9b8d88154dca88596693e145d045201b1717dc713b290962da25d5f5cf803c6aaa7447a6bd8a4e2e55f3ca6fe9016fb05ec50ba5f80c7c7e9da67493f426d90771fbff118ad2a361c266ebb1435a6e5058c2bcae9dca8c3ef82d7055629b074b1b04cff78126bcaf2cc433e2a7ffca51832b18c14835e9f9b68109808f79fa9ac89af0b4bde25324f478c2e2b3544608504d860cefa373d2b63b0ea5eb337a2ee8af5a770c993e379aa5172a40f80f0a25777ab62222d1e08d1643fb7c3e768d95df19b32b4416c73e937103e9d78c5ffdc2b13490ab2b5bc944601436c9e35a95e34a5abccce7a2a93d434a458c8931809370aa7476e112c0d21c348d3f00a46a29aa47050baf080022e6a62963ee1e27e3b6c5e47194c360efd99ed1702b962d3bfa8f2b570f53fc30d2630b20b2b61f951033ea0940958401ee2051d3c98c78afe006de30bf303618bc457e95e8f11c459a3d8cccd9c903c6a7931a4a162e57 + +Input: 58e174ac05d115b8e660032175b78922ea3561748ac654914baa1a7e60fd34cd943b5da31e7aa8230a6d1fc91bc1f4af820705eef1e2b55a708c103ba70d000b3ced3b35e3ed5abf46aae2b1cafe4f860be5324f3231d2d2e8b2ee0b6d4aacecfbac9abae9c6eef8028e3ea339229e927a779460424e046b8f5d5d1343ea1b26e00b591766654587248ad1602492a0b09c882f14fccdf588a4787beb1a5b1df973b1ffedafbb58dea875fc60 +SHA3-256: b2d84cc786d713989c086844baf173df63ddaf9aa5c8c77953d907e945a260fa +SHA3-512: 87cae8a216e2be1b499dd25678777e57dd7271c924fb26df3167d0355f78bf58fde4da97d5a0d75e997fe84cd127dd4df3ea5aeb9093f90e0600ec47b5805c45 +SHAKE-128: 2a49aad1ea47e7b2cfff1f481ae652050d7b28a07f1339fcc01d27c31dd7087425bbdadeb5714d284b10a67e94b3af2bd3d27e4e50cae9f40ac1c40878e8287fd236acfcc1fe23d6c6517a2cb4a51a7a83c4501f3eb64346c0fe05930c17488e78a4453d4f32e41bf86e1bc5cdc44f08e64ad65d9efa8b23913aa97cb89f440cc9ddcb4f0be5c5baab3832ee45f2787bb1fe02f82cb7126bd77191033f2a51a033c2d5dbc5cef0271e4d4aee344826eada9af3f8dac18ed163efc3395cdbd5d32957df1822ea26e791044ccc9b03b8a5bca2c2ac1b439485cd9063b3bc51f590ee74b3842d80b9aebec0e6f29d5ed3f10addda8b2c2b3bae6281f77505c1941fbe8a964a080ab8f5f33b5d5d5c43b8becb0435a165480ae03b44c55d7876e1455955dab7643b3673356d404c33f2ca143c6cc95b97f6618f31ba3d32a71695507305fcc62d325e5048e8fa6bbeec1fd8ca8bf0a0c123d3fdcf326ebc48ef2855d1a93888a22bc0ce2cfcc93606e0b1b3c76962e22f598ab2879a3949fdf10cb458a915be42ede4b49d98d968512d54516b339d96dea2b26baca5d6fa23dd536bd0c7b90e62a1d85ceccd3fea8dd69a947b5c3264da6ebc8446d7b50f2c8a2a242bd42f1cc29be3ff679a71698b6623c09a90e43bb10ebb89b7530e45d95e6f54da6a9d4438d129d9d3d0416ad4c8f440d8a451a567c9bd6deafdc1b60068e7be +SHAKE-256: 85a7e209bbff0a77e310316b1a8ce7f46b821ae0c05980816cfc033e7a91f5b88d70b5f287f261f617ddf9b00c3500d7b643082e24cb0979b6c15ecb51f180123c22c28c41729b534f386b5ec7abb81754921eab9275182acd8dc758449d1b1ee2aa0760cae42e2dd2e8ebb2f05901292168a10f7ab9f343e968171213262b80f4119276e345336879c7921aebaec6e4b2242169157364395f834ed128b455aed203abb91582f179b00e5abea1bcbe0b69f0074fd36f15e2df15a433c3c10271cf32f12c8a85bac7f35a4016d280c1e224559e46a39fd7f42b13920ed24596e2b58f5fb7ea69779bab8a16a51a2ed54359c29ae6301407c5d05e8033f91cef989e1e964a7c86a5694e2cde01ef03182a5e8bace013210517dbd6e2ee734ef2fdd1eb1068e42f0ddc8e18212d6aad7ec41058b98dbbcca25c4852c846cbc7d8e17a140bd30f330f626d664d392b7754dcb328f7c5db4025387beaac9c24d3e912c5b3a9e664d6b54679b81ce296fce8b2f0f8f1ee84e0da350f5b634fb4f87d36bbd4eae62c096a623dddb8ba34cfb6d1754b6af40a2a6dbd957f7abb73325a0838fac0be9c3530626378f3a167cce054b4eebf84b443fa6997be567f45c1bdd86fe0184c5528225c970289ad12c7acc9d94891fcb8e155dfabddc9b2fe5172e364f175b5e838db337f63af139f6ededf128730fcec0a7ee2271ef98088e453da + +Input: c674c4c0a01ce902897948b940dd050fbcc1f6cc3e5ae9fed88caa89411c9ef89e6ed4afc2c63efaac6ff1b34b5df500ba9f369d87e4a15302467288ce11448ba202626e9fbf6d304f8b83a822d940173e73a806a5026c36f6e6c3d96484f10bd3786d88e28a41b9b1819093968a4e09110d55d6adf622ebefd1078bc92bcc39223a4d3f2935a226bf5db2d68bb318eb8bc0e91916695c0247eae09587424ffd99676cff05d0ccba8ee3748f00 +SHA3-256: eff718cb0f608d383ba22d44a591e57f66b486fa538167ac3df84bdc1327017e +SHA3-512: 5fda98fc2a87dba3b244cc6aae9d508f48642390578eede05fdbb4f6b051db033092bfacb92facb1efe56af660971f4653327e08cd7105adf16f2dd4a04b32a2 +SHAKE-128: 85cf5ba604b240cbf7ddc4a7ed25475b3bd9b0e635b0ad57120f9be14c7586d0d18b3b299fe7b153f2f9c52cac26f2674b990641a8583abc03ae6910c2bbf97de086f7fd6ef522700adc4d447cf7287dd4d74d312d769e9b48ce38b3948fce49957e28c7f6dc5c8cc5a2c7564c2550a25ebe70b76bbb377457d3c6e62531391f86216448153fa814210628e1cf1d59442cfc0ccab5ee5c56078e035c56fb1f6e33b71c412064680851e7b1b07bc4f50f1dfe50cb3665923a0cca226dd7bd286acdc4b2672260456651ac0e4eec5dd4c0b60d3975eae33ba13afecdbdc6561e1bdcbf5a3eb529971fa4cefc0692e4b36c94e31f256f097e544f41519b06581735f8cea09961b0210dd78c8a8611bdff3110ff97c30adff6d2d65058ce1b1d01e82158fa657ad5fff7d2596364ee60bd2f851df294eff5ac46e8c63d8166955c611d74b6ec2da727d389caaa31f1431d1b6db0dd793ba92389f123ede93d0e2aba26afe2cdabc172738e3912e73d40249e77876a281ac9ad0b46963a2feae931a03669e1ac4dadce917adb49290661d402bb53174d8d446a7dd9a62b8d1b632e88c8d7179f3b74decba2af7e17b7a7969c24147c6f763f93aa84a3804b108842d4736f27895d95a54b405cd6e008b3216cc97f7b87ee9b8e4dbf38ef5627294a3d3414d03070b3dbf9d2412bd40918fff3dad5771685160cb6140efe6d32b6edd2 +SHAKE-256: f2fb71fe9a5132674ea710cf40f7e3192cda6bbc3548a9c5136ca4789fd8e640f389e0f9105217f36a971526c2c00b71b8a8b019a6535427aec6831589da13ca264d71b48e4beb11b991409dea107bea517fe426720cbcc974fc8bb0eecbab87820d57a88d245b25690f2659b0b884e8285a3958c88c802a144af75ec06fcee31c54c415f8406d55b54f7d1bde5743814936a59a3cc51f318c876dc1d4b18b363779c58be71b2ee9b7138b42e05488369a286f6363c340d45d72c84af4849722acb992a262aeeb6afa965b31b481a6c4dae1bc49a4237132afd3568a1a130284ff5773e0b5424dc15bb12fafb9454102e0d48ee4310d09e204af705f3ee361dd93f5de5253d6d6438a5df45d2ae93be8eea8236ff22ea43e50eb1d06310e8e72fb5a8726ca2b3ef069edf4c4612037fd4edc4315ea1253fdaf830153fba34d55d1c89f0b7482ef7ebf72dc3da1bae5523c3f3151d2553292adbf9b22eb421992d152832f439476658dde2df2fad0af3eda103c4d6c2ac1ab3fd2b2498c6285a6a71a171aa46d84a92d0f51e94b12c620abdae702bd31bd05da8c4a6918c4d88b04cc4003770c415d0c29232fc8a0d03479f88940d911230ede1adbc6a4f44677bccfb4a0d7a2c6abebb97abd53619b02d9475ef7a7decc9730b16209eb73d50a5fb10d7a4d0515a72f3ec93de415e722ce4e30c3b47f6e152c5122374ee4406f + +Input: 82b9f0fbe4711d1846e60c5b3c1ec2f63c7b01177b48e520e16ef37072ae1164470f133b2814dd28eb52c0830aed25ce3f1b1531998ba8d8fcefe0b44adcc6495e0a95560869b6e39b4e733e5c80d794f22406f0e25f57f55cc14bd692949826f3fcac476a9e88ba047ff463e7d510baa3931df940a3cf0837c1f9e78ef37730c02a0ebe354b4a0a37d0936d0887b618282e826c6fff0977db37cafba12bea152dc86945fff2448fabe3b44c113f +SHA3-256: 0b661bbae63e82189d1529c9475ccb12d76fef0e827b8b9be6c5f83c73a99c14 +SHA3-512: 84315f3a5b75a11133828fc979eca14210adefa648c61efcfcf2ee7f139031987fb7091e50c9d0d480a016d26de95b825a3ae98a86b42e3f6e1316833e11541a +SHAKE-128: 52f8bd2add8fb7f5ef797da7b82232998b69adba3f9a8766959c3863d87084ddbc29681d1a544bcf90d686bef33203752146d3800b3cccd40e653317d0cacaf08f3a5778c95eb69d748ea5838577c14f13705f8a28957d57183e8f242da54fdbbb16c578f62a683dc51c342f2d654733781ad7acb56f57ead896b2be4599e706a0f3aca492ee90d143bb2dcb76fdd55989d1b536e54c8311fc2500747e824c9cb762af7f67e02a4ab83eb1757a77981d82146f0f4dc70ee45732a5f3debd776c4db983014df468a1efa8271c4a14309d6786fcdb6f7357d2bdd8c46c1c3dd89d645526761635435948b14fa783bb3479d5bdae5283e5318c4a970f0fa91782d49f7c028d0cdf5e21248c433b7e862c11452973f580b6357eda684e705392bf2a983a8072266c65340133e2585ed44241edd27e7abc0b8ab04cbbdff3ebaa403bbae95bf8ec303e46cdc6f03cbaaf45b7cd8816efc6976f8a5fc4a966fbdc26f5dea675ac16af50ed8d62b367744be87a3b4f9378db2e9f651d622cfcbc82f7733face16eb6f3b3ed53f76391d7c349813eadf05b6f484eb1357954980403b704f386adbcff5ed5f261d48f1395518cc0c7fb2a8b6ed19a8ef32834f83261ef8cb7b2113bf7cef1ebeb7909a364c1d4124fcf832344f52759fe32a6e802ab17177bc520362c25fe7a4ab85c4e7f4a8bc306ee8155ab49a888ecfce73efed1d890 +SHAKE-256: 9d32ae154bb184722863cd13d26da91faebc024d68563fbe1f5eb1d4af44cb12dd186fdeb1215e02fe1f432f3e152d0bae159b11703ade7595e350aeacbc033304433d7aeea3ffc71ee28991f54e9480dd48686c0417f5ee781ab17c79bb87f1d61d11561307cf504fdca996f3e40d08f98edfd961a447429df97d5d6bcf5bf704fc184c4362d5c482638db7bacc133accec8059d5e7243994d68a1db0d460b959b9a930119ed927742dc222dde6401dcdbf261e094c2057cc5fdb701810d526dde60f5782f988d17719d5f36a29aa20a646a85822da515764d84e877d87f1171ab3398a331c08223b44192a30093cf41d415d54f5a7d31dc02929d3df19258f3e6198358642f5425852f1551d1e95f95abcc1c6989345684defacbab74cc883aa247deaf5650e0529fc3ce53478ca31ab0367bdc7d1b74ae2c23cb6140a0c6b0b62130266d9686e32cb09766fd4321c028a3c619fb04354639b33396267a3f32ba3ba9073ae180788f4eaf06419779b05aaba1f49840315604e71809788e33dfc6cdf0987e62c3442c335d1c53c993686cdd496c90c88484271b19dcf3f2044ec9edf79eefb0648aa96b83c590621b85da48dbf181d4e3e2332f494346a909526c576faa39c462dbe7dfd2ee9368bce3ed9bdfecb8169f1216c26349bb8f130e51301fdc584a88c0815a4347ad400872abc58174fac1aaf8c44e76829fd7422 + +Input: 229d67d2e720320832bd8a8eba769b2757f4a23ea415c7e69320bf37f9465a67c8986e7060d95415b700483c649d5f2a5f4f869ff7d4ebc316348b8c9fe89ff448f8bfe373f7e5af707217cc4402ebf169393eaa9fb47f11ac1f81c01d420d01987700e6aa3478e9c7cf314eb28096a2b02e096e1d75370ea9d322e27b89510480e1497e7e09c9393b6e1b29b9e0a5adc85e8efea304de235d2774062785193ae092975f393d1d50fe228cae559fe9 +SHA3-256: 933e9545a9bd73860e50ddda563948df811f83b8912c2945b147d3a156ec6585 +SHA3-512: 7db8d3073439ca04b90ddd662a85f22350b53c5303844ba777c409b409eb5fe9bdb0593ef0d724cbc2440f2a36d94775cdd4c2709630b4519d8047f5c6bd17bc +SHAKE-128: a1125656eeb8988e7ce91810136be6d53fa8bba277ab6a6a5000999dbfce8a5592d8d56a86c0e04cc56c186a5b780ae60398d0aae2a39df417c227844ae496d0c2007116af56631b8835d9017228d3745e9eb82cab60dec5eb39ee755961babebf8ba70dbea00c66c582544b1a5f3cb695ef1eb2115a2225ef02df930be7a55e6491684ddf4948a89c12aef4fe0bc7776758a6efebf133c8266e768d02b56c2dc2b0653c71c57ce4b4a61ceeaf147f4367d39987d3ac6a966da5c48adf9971d257698e8fc4d7d84fe7a303e0c738e1ae8231f604219783a232a6bbf24008cea4a7e0660f27eb74afddb309e409efb1a9945605c3f2f589c0241717b9412b2d079ab89cd61f9f3b00b85624e50eba49edf49f4760c8685e113087b4d61d51628659b3996edc61f393fbe8463040594998c8fe6a865955e961fc4e83b80e46a2c9e42e9e1846ace9e68b96f373c3a1a7d0b319bde7d3481cc5c140a84fae676a61caa988530ec61502d4d58c27a42a50acb2abf6508cc667ff48aeaed6c42e1bd7133a174ea66684907a3752a1fa343f3ffd2ce175703af007eebbfd404cab92534cf1f8982bdbd18221f6ccfef116a1f57268640b525975e22368fe5adac7937e6f9dfe954fbf009b4d6074146105c85b90b85d01ccc048778ebfee215ebb285a26db85cea94fd329d3a4698ae75f7b09aef3da6cf2537b369be11f5b718fa881 +SHAKE-256: 33650e8e339406fca9e400132973ad43066d5e299750af7ca3036a310b47dbd19bb78f8ceef327b0eed1055b2413a5028a0fbd1d1d885dca3bbac06d25901e32119e1fb0d73d443fe8aa991fa764851d79f8c8e96ed6a24765f6aa0e7342729014b5d81ce1197d586c36efd04c783676d350669bd9d270828927e23edcdf85390fe86f4c020f4e4740a17042f275bd92b697e421558679b3289e26b381e0c0bdb9c4ecad034f77e43edcce59b02fb6b46ec025f44e60369386568c6696f5ba999c79be17ecf98965f585f17bc2ea76d1ef90718977a67a5e224a696efa59e94994b49b9ad1d6f94508b9aedf1ed27dadc4cd4e06e5fd40bf5cf3a20dc932535a863a59d6d960df058fea44bfdd8a58fab24064faf3052e4d83b26bf4cf5ba7fbdb93a836487cde2a0b848600e0517424fa6ffe5c6bd90a98d59f3c061387ba591b5758ba2218dc9ab604dd942c130f20096b646501879a2ad827dbddfa8feb3f6a91db15f6452227da96879efd9a74ed7d21c4f1bdcdf4d324d2f327a0fcdbebf2fc5bc1b9dbd00b9ce4e95c0390ea8763f3eca88f22199ae15ed67a5f6012fad9ebd905773e11db3f89d3a07c504d2f9fff17f5e4f57cfafcd30d809a23d6a596b918c549b6ab7a419bf06ae51d7b3b6a3c1ea8064cbf89b106f56f601b9a80ee2c1fba804e446a20e89c1b7e634469b9d59a90a321a5d9c4622c704b59ad14 + +Input: 8e8569fe543eca14ee94cd8e94a404b5c38c29c2cb832608070777fe656ef1fd452480483f08fcf1c1eec3b2601595f47b9355289a2bf413e99cd4dba6cb956e2c1dd786cacaeca1a20d9caa087765b66ee2194c005f1c77b501b2add7bc903344398a079a63861dc45a0fd631d48d52264c2990a015a316e7ff0ed1b191e46bed17e0aba5c735d908470c9adc07517dbcf3094cf988d2abd36ee866af28c0bb0e9d4eaeb290ac01bfde337848170021 +SHA3-256: 3886ce31c37138062860ac38b59844c6617bb82134b4943d4eaa0ddc37f8967e +SHA3-512: 3535b31251e1cefc2b718c7d745fc611a2ad198807638177a97dbfe0860a1cd0f9acca2b115d719da8ee493d8f5a16c31464dcb17ff26cbc752fdaeda76bd5fa +SHAKE-128: 2aa87718c4a09ffcac7388442f7b55b3cdeccd0a001f2ab5b8177b2d4184abe962e59a0f29060b27b824986ef33eef9a34a1df4a2eb2be942d125f7049811e00ff92b50789caccf5e8b87065bb0332e3845c21bbb92c0fcb590cbfb7d18d028e5f73694ea8789f848ed22a05b76711330865ffe43e58df1b45519a33a6af86d2624882beecb78860d19ae673f6091bcbb2e57a5e5821056a240cbd68a32bf055990c3cab9067e1d35f48e77b1eea6cab5750940d969d4eaab5b46ce2417ebbdddd2403e53f2ce59870341bd9ea8f63b1fbf365459cc3d60f88efa89d056c1aa7a5129064f51251ce625c70ed270bd87699692f0d910a6050ffbbf9274a0d7794ed7cb181852137a026d8d7a46c6a8f35364b52d081f4b45c1c15613669a86f762bf251834a8121b7db714e0d5b662346a76204ba5b84551c7273bc0cdaee394130a86487b3ca8ab86bf2472ea0bdf811f882c5143b363d355708d8b210ca593adb64427fa0ef069cd830f034db22f5f7cdad5fc9a53e5b5e38be677749d5ea17c38b23e0e7783963e4f8dede1cf40eceab4e9476f349e8f5135c1fb8bbdea628e6337f46d48f54d3c13fc2e90fa8916b9f2c50490d6fa0e8dddc671d609d629549291d157d0afee1564b69677184ae4d6770199e162f02e3c270d3a374c3c07a6a32efc6770b78d19ce136b15dfa015f12a4c18996302009d3e063a43da7204f +SHAKE-256: 0af00798718f40e2c67f35b3aac0fb3a645d824747088500d366d709a12d6d2e9adee072a1770a7f647e4ed71192fb42eedca087d973ab0df1ed192a34f3d973ab16668a2032fd105e02e2cb6d98f278ab4469fbab5db5be34dfe2daf4de664ad7a29b6dea74957393e0b81d21f5ae6af86e2f06e229df28bc72f559f4dd9be95b956cb22d3f21debdcd7c33adea4d8f08d60276a230f13df4bd09e09f5c3056e6a8639d572ce4c62d462cafa340a2d853a329b30e4a22708f5de73af2e0d861041be97eb5e17bcb78528d4478ad5eec694b12a8e343c9c1c92aa65c7c27ec502281d4f9e2f66ea19817cc3e47caeb1651b03ef9c4fb4aa4c607eb0d1d840cf70054dd6171ca9812e722087b2e6a9af30a94e2d3e383a6ffed950c05ef97de38b9f54ab3e356ab663bbce12d80b50148442b2bf5e2a20b91df1506985829a3005005b53281b0756bc794cb698ea3bfd8f97353f84f65312a90bbbd6d628da6d03526b8f6d6e048b0fd6f5b03e10c68475723fc2c27839c229abbabd2bdf8f5988b25124fd3181d586957336b7823b47b3e896fa45d3d36d76fd1379b8b3e611b5b52945e7d09b5529d3d1f856746f54c7d2582aff5606632d2f6efa8c83ad16d9d7577828cc846bee0967ab5738129d1f40f02bb858d1f36e54b6e4213c98e07b34079733ada34cafdf9eba88497da60a023e36d1f0d06eee2b86c5a4b3a258e + +Input: 3f976ed3b2e33c3496029398f70306c73298f0ee4ffca82a4ea762b6aaf7d5b4137b2b6b56220be349872022f8de4d2644cfed242f206dde96312a06afb5c82873fd21e2c308a60cbf9a50ed125def2995b84a5b34c4fa85bd7c67df00a9cf37cdf45177d1ccb0f6d4b044c817f965ccf39b6218be6224515823d420eec5691681ec8297d63166f3bc8c71ade757e550a5c2e7796bd3c20d8203006e12ac5dd055aeca6ba7e42d76df8aa0a598fd1a85e9 +SHA3-256: d088920b352d864d9608f485e20777a2eefa2222d0ad60847295ef1e1834d49f +SHA3-512: eb58ced3c5bdb0bb88130a9c41d9a8445283534916cab4984d6991055efb82d1d88e13c9dde3d6da05eea81e0e38e2b780e1a9f5aad74c5933dc481276b84d94 +SHAKE-128: ab3b544c0132d1d8ef68e9d250662ec91d691e2a7f07d9a6992e0d4ff617c65ad661fdfc9cd4afc7587499ededa82cac5121daa60b00b1a2252d350c5a32fa11be97c26e2a7330bd850de06d38675742e9bf5169be58497ba79c60f3fed2b82a0e9de0b2100180d8c77733fc38770f0043027e49f7167ab3098cfcc3193ccf38d29572f90e6d120c2f7cce54b74f8765d8de95f004b73739968dab94730e70149ecf653f157ea6a660f9e524a89f2c9a5f7829ee26fbd2fc15d8e38146431f629effc5cc331ec9118efbda80d416462d819daef64596b262ff7f60a901cb4111c733a1974bc55c306dbe8670b7f34141ea55aed9f7616adb64ec84094a5d20e1d4826eb107e786035ff774bad3feb41ec4bd81e1cde427e3008d0c5e0705ef6c476937c6d861c938f055452165050a5979897e347e68fd2c02c75340feea1f26a1b0b4d8cb57981f97f44a96ed6b80cd95c7f7107514eceb5cde552f5f8d525814650b5804188dcb032a2b02088cbb42e00bdbc9e589062899be5054074100b03b765e04d6b328c0c027fdbf03a850a654cdffad2b7490c1fe5b2fe432238cbdda3bd0964120660d0908184f2044fbf5685fb0b8ce58a39a2afb156254e3b13d3725aaa6670175957a459045ce7605e015250314cc24efea383500358dc7fcea33542e367cbb335b486c897774c2a72aa6ac6fefeb5c35499c000416f5a229a5 +SHAKE-256: 79272b225a7dea2658a0346db65301fbd76e0bb45eb564c12839913fec0073d1f9c534c685925e5ffe89d30dc74e74c7850119f05d6ab0f7322d9eab8a053088b866170b5858b5058c26c90eb01956b7a11e5e19e0af77d4436e95ab147bf6afa84b9d3b08e0555d8f8007efad525033f6bdb0162683d20daace190d0587254cc0265c25fbe8f31ad160ac49486117438852a50a6e4fd229589229deee1a8775e8533adfe35355c46ab28a6e4b7b513265e2b25dfa90c7b3b0c916c986dc0673dd13eab7f81fd396c8ba521e9281d24dd51626c83806841e001c51c54b6bc042b59f1745da58fc1d87712fdcd70400eb971b4f9d153b627b19a0a45177ecd1942772aa04a97c6943b91ade2761e20712bff4ea9ae4daadd53d05e555cdf5aaac059006670e8c6d2b74c44ad38c9edad19128cb74496085f15bc5b672b5e1ced999eec93e73b570a2110f70ce8bf724ea45c37c9bbbe7fc6474b50aad4b2005fa8852361ebac5f54950af5ec588ea0be69cbce04686d57ce14b42cd5d7b1d04925962cb12849a3cdc4d827d78b7e78efc4bc57251a06736a083c4e0a187f3a7407dd735b8ce27feca4e8d83e49572c3c27b2f5f6a531bbc6de39371d872c6bf2ec1fda21539d01acfde4c829dda8d98f2d207a04ae12ec5d54b798339b1531e1c85263ad2fddfc850fe6f6dddf9ed0763635745f3229167ca0a3c7119663effd4 + +Input: 8cb29bf522b10e53d1f587842591b370f6163cc7539d7786e6f39eba7f4e0620d0b57536409a0433d42f0e00e7d9d10eaad2fe6613bbe101fe03744115dc9d84b2b5e99e3a46082144a3563a0d6064c5ab61e19ff4946b90792e19a50cb867af96ea242bb68d663f380c66eebe008a62f77a1b6dd8cfc6fbd766131d57780d3562977ea6f257131761b2ac21385f365a11f436bc1e19a3b15483e19659c078dd4e44e4b34cd1a5df3c965a9c831ef4acb183 +SHA3-256: 87a20cb399be95d62e9b06512ed474ccb044d7587a8c975c20b7c5479d320476 +SHA3-512: e7032658df09f179ffbb5e3ce7c8aab30b7a10d048690bc02c81dd932ecf9dca8a15a2af9e7e4963c8e3f758d806357012fe124ab0fa031a5022410e9ac63605 +SHAKE-128: 0c5def25a2ec1ee0c49fc531d70d145c5d97405c5fe84bc8be6bf6118980d54ff938b9b0b7ce5a8ebf09a9cd96b1237bb276c1a098b1969de379938b685e603399db27749bbd5763b0dadba5899e7e145b84643e1e01aeb8f2b8fab6c8270f4de12959410dc246f45a45f1c04e78077199d346d35f0460db388f3aacbdc295032a9a292cf7ae737b615f82627f997a857d34f6cd006b9a7fe3ec3b414209c7843f1b44fac569ad4ccd20a1daa22a655a3c0111fd915841b82bfe5274e8b696d3c432fc0dd6bc883ed218e72a79ccfcea51665af0762d25dfa2f0ed118a7acfd8365eb8d1cd619e47876323cf18a2bdc327a917bae4ad083fc86a6c6d5eb1d514702aec1c42ae2c6bdc2d973cfd8385f1147543447ba5d01decfb4a7039149f3b4cc728918d43e91e414f70e073d90496b468f14c002b11192cd06353e403af089ef8c08f18d8881b594049b104b6fa080c16792cbcfe5eb078d0be5269cc147aa60b688c8634cfc6d502adac378abec595bfa30c9af908d264a86ab5654c4e1cbe2b0dea6d9e60a9e96e608afe422f458fdeb2eea9b58ea7b059b070d30a4d16be78bf54e5c1beaee4719d48b1b3349c78afa2ef3ad912c5c2bd0e6708c9645754fb8d288a940b90deeec8828aecc013a50970383029724ad795b30c666d3c9bc3292071ee1dcb3e1ae754b546303d047edc0c174eabc3dd8cd0f0badd1bde8d +SHAKE-256: 1cfc42f75e63eb90860bbba7ce5e05e28465374acedfe76768f61f5e4a615c0fe3cfa5c84fa7440905631ecd70b3e8fb324837e4cfb5142490c08fe3a365447ea059fe8c59b7f77e712be25163b1cc03d1f90ac9d2dffad743bb0e874e25879f1584107ff84c1c458a3771b60f4cd2d7636b4451e0aa7bfc306121a1669231b3b5b94fcf92f805e044ac7270e46878e10268d05037714934e2bb10d8393e5605c41d8a3c36651b9b15d201eb5613338926f55426fb02bc749eca60141f2030eda12fd961f6cf6f16031cc597ab92aa212416a3db41f4fb96f97cefad45a2cc67839238a965119f9319b0830d483a4ba4ec1af8741ae43973238cc14316f4f9ee78947296890d1b8ea8b7067e458692f89112ba75d0054076e2faf6bd8f2e69698a522faadba489eead7f5cce6f4fe49545b0a4e3a9652397a79234b47e18ba072e1721521b5366d4e6749882d4ee9143411bfd526717e2980610e020f7c6da0020d76552084a144ddcc2f8f07c30edeca92683ff6b0ddc143f3b66fc4aa10ba97e964022c51616caec3cf2d4318146d18794b9fce0412698ec2e424b00708f7ee5fa573fcdd325f1678cf147483c6ceedf4c76a81da472dcef61777fae750f2fd04e2cc01aec52d2c0333fa485533e293b2412e3c04773073681723e4ed3e14513eb28a7120f9f28fb70cc807664d3502cc7e0991a12667cfd5b9496fc5fe393 + +Input: 4f05e3d1fda79905776f720083eacfebf90982344329caf2861193f1e448336e698be1b1089cf0b8762e844a967962db476d342a5fe91c04d7ec11bdb8a1467fa83123129371bef9bcfd4265e9a3d0c9964e8960baaf2020de60b4c78f6e6bef9b20a6fe3c6b5767e12a29bd34cbbb8c7048e0a69c3625dda19bee68245f9547b139891ad8862c90576b6c7a1511fa8ffba69706db51fc763c6e1528311c26e88482c800e82d3c58ed3d43173bff35fe2e3f66 +SHA3-256: 3f486ee1fd646ce1d6dde03f9766d73b49a6336d148f69582ec11e00e3b68c0b +SHA3-512: cb282f421d786a80783c28593b25fb4b9be6b0e6fb8220af62d8b3139ee49be8e06ecc9796f20ac5f2c5857d05c700701367dbc17d69a76f615b61c2281a114f +SHAKE-128: 5bd94a54eeab2680f30473e4aa94588174b2121462d6470c6003b6a2a063a5c4aca9065d90cbfc79077ee39cdd17e9736c6e47a4c735bd56f7c32c77fa6124090a5ae798941c4090c10447c04912678b0d0b2db1f4dc8d4a617c1479eb2250b6f288fca4e5dabc51d6136ec415c6230e11a43d16a03200d936a02e19cc280ecc11c6738c0c1ac34846f72cc85c61a16e87edfd66cc0f8d4630a9a811da15d97cc41dbd0866cbb86dd8bf8fb1b9c49c04c29914fb0ddb08fa5b29c4b48400a3908527faccf12055a9a2a459e9b1994e9f89adec5c4b91832c9e5fb7f995aeca46c4e4de78a57958f661f7ca9bb6287727f0f929b5bde833706532ec9cd33d6226f31769d48c397174cab2232f1f84415ef6978b48778d24bc78833c2590c1b367bb525ca55a16b0afc1294d77c30d2c22801c4150f56114ba1621b3bed9b0c1c0f129c0329da9ff6d3d05ae5261a20f81e92e1b3c1a4a9420900aee9c59a77ff07dfaaf94a409f2671f7325b57c398e8d59ffe765b876516682f6fd3d79a6d7c9e3928ffaaafb227cab60adb8f0f9abb45d0b33b92c60595153513a18bef8fa1b8d8e496a127b84f20f7d6622e5aafea52ac688ed3a74c05396babcc524509289307d8e040024578ffdf02512dc30cc71309510cec06537e52c312c42d618e7ae493cdb8623893377abbb1196e26e38247bcb61f8dd40e6bcbdbb6d23e67cf286 +SHAKE-256: 6fecbf25e09f5ab63dc7b6fca2df42b32344ee9abefa1ad6a27de86e479fea0c9f99e488819fb1c4f17c3b3cd93c46c5fb650c264d5d3f9c63e9b48e97fc8a83aa08bc063456ffa927ff236db4ef4bca28505cb32ce224398b5b7f4c979e446147b15c05705a8e664ea92a701f1e77ccdfc86254ca0ac2b093f6a22379e470235d63430b87f91224a1750c010617b72bd5353507cd7b44b7a021e49141424eec58c35883664a9e1e529ed9436b8d3676d97351ea69328b8bafee7af18013335c5ec0048c868715c770f7abd1748ad9db284d849ee5bd9b5f295c66a837c200e68d4f545c8f138fb4ddbe7e0ec8fd7db1b7f8a31e20577ef177a3cb81666af2cd43c354a09b6f8a619a2211edf571fe138e0799d0f9517304e6427cdbbdb7e203d4a346557562a9e4530722e74e1502269431ef92060db0bf2da17cfa21531879f0722febce5224f60686649da3631f82cdc6fc4a3af11dd34ace425000938663f0119ab44a9167038a1643ead8af53754fad0d1fdf91b9a1587d4116050a143272fb7562482f66537271d3ce6d5deca4590a3f7b706b97a9dc0f48c294b898bc34a0b5fadb266ac8c1646689f53cb01ebb2bbf53fb7e1edbbafac8dd199c43b8c01951207522d2399a1858b03bd260f899a1f1b81950d4d2bd7bcd46e793053d1b0aa5b54c86dd309ccff16eb943dc18763bed8d6f8da828fa913eb030ed05f3 + +Input: d5ad3a11d0db8c2e1641e32baa34ad2bd897f8bf1d3d2a333fc3f23b7fc4dc0f3eac71067216552ccd7c9a0a36cf4588796b77197305117101b31dba5a89700aafe4712774abed029941f7fb16f01d2e7f5177b196749ac6ee52b36ce5c17031617f966d5d187d85e2009c8a8e49eb95fa82fbad549b96ce701d2e820cbab85a61fe0e41cba39cb87e0277e5e3a595db9eab3b3152739fd97a1e3eef1a8de2196611781dc2d9633814bb6308aee0e376eae6cfdf +SHA3-256: 14d424191429ca7f805dccd891875bd1de21a46d9417cff39cae89f1be23c673 +SHA3-512: e286dd38273d8656f2b26ec2bca0bc9f1dd429e03b1ae4456702e6be7cd9c6afd2ca4a6b61ff0cad39df21aa63dbbf8b43f8780abcfe0a56f95aa3fec8ac96b1 +SHAKE-128: 81dbca4e597486d06663cf38f884212c4c5893ede6dc97dad40b6b30ab2217530ae8a0986796ffa740a61dd4896e77f4f6b7ee12ca5325f9d8bf2983583305318ee5e75fc7cb79c638c736386f309f7df56b9a538a3968b4418e05cdc83bb49c651c6f4c2da393285861e664ceb9cb4eb3b4ae9147ee9c480f1a6be0e74155a473d76bbdf2fcdb3f586a17c36a6f895429e4f4bdcf6a7cd38219c298b1c7467636835eeaa82723740828c49372158b6cb99f9e55153c8c7e468173ad80ab355b6d35f82d68f43607e7239373e85eb45121e777ac0183d8a3740e43e499eb1618a2aeb8e2b052d3e229d02c72b02900c0fefd524c6e88a21b1396346dd9e330aeba23f2992ade32892c2581ff087428291e51de25dbebefac8c273ca4f34dafcbf399774689f0e7c98ea5570aab2c5a60921ac656439aa12a4b694dd9655b754ee4d87df7e97dfcf767f08e67ec3a37b8e59be8c57cf65d9b167225af1761de3f5eb89372ba7b67b3475e638c9ea74d48e87fe5139678b297b28785007707919827958cf55dde194ff1996ea51e48dc143ac15fa7853e1ac7c15530623b382d1bcb7778fffcdd9ebf6c43c3e066107fd5f87e543fd146e9d5e34eb4cb59254f394973bd038fa33a05e4fcfba93482172acc47364cc164a5c781346fc3affa8f52d4896e509861b29e5be633490e67eda716055bd9f3a8297f6072d4a22da6c499 +SHAKE-256: a8eee335b744e1cdd6cd72108d31d8ca2bdcb748f754e94d25470812599ea696bd72a7bd1c7d0b203051981fe3d2cbe7ab6366600742842cd4819d91fa5e28e890d6272b344575307f8d092fe5ef98412d074fb55af565e2bcc627684bae2f65623e52f0701dd57ff927bebf77ba098aa1943578d5abadffc9964ea12e3cd298ef39e6a433bc6a23b70087222c64b0d9ac2a10e7bd040ee9af8de79f912a7ef690dc56d23f8e5075afe248bae70313f6fa1322ac557ddb14cbe913522c2e25be9c4edcba912d96dfa16fbd209934e477c907fc7b9506472f5ec28f41bfedeedbcb30cec621135192120cec7d5a8cf3e64b25ebe751b62ebf757b42de5fa19c65db00e477deb873143f6a30e2363338ef8577dc24c03f23d034e60ce8f3f0edb8f7de4ebf9257ce7684c831a0e860ac309fc7007944fd5aa4746dbdea020ee04f4dfb938de3c52cd4b0ecae955b96c232a7e3b021e0e0e330a079286991a1ed03a7fc2cc0c5648704ca7099c07d89efb2c5535433eda4f509171b3b23e8ec6f451253676aab9548950b67604f114bf866471e82b147ff2836cb853baf6993f61c7d005ad03a4f2b6cc3ba1a8489c7baef9b733496584288866583d421ba252586e3ed207903ef4e6ae0adc6eb1f5f3c342ceef1b167ad783a8ea4f0a4d17ee64d86bf96096d757ddc8b8c4d1d3f5de2534ef10dbe85921b5dc313b35cf6c546d0 + +Input: b311beab9189e433b5f36012c574bb089698428c1e65cc12c9a770587133aaffb5c75f4c41d3abb1430c39778804f29d8ae0c941d5514ecd25f7f932c331cf9437e32e95d990cc623f00224fd0cfa60ab597932fa077423082e44bbe460435ce1dc414af62d1f09c2d66e79a53634e5c7962e85b9c2e63b2f0f7e6f3a9efe93edd9e38a80824bf7f8446d984a6e9162ef7d0930dce9aed280f42446eb94d90693d567185309618059f5899b6a07d91dfa80f407c2e +SHA3-256: 7b75f592961399841e599bc15181a2e338a750360371dd278c36a16b8798434b +SHA3-512: 84a92cba77aecd59633c70445ada4ccf72321fc52440dd9d0205896e674f557d146a632446ecf106db474b647cc552fb555dc5384f90b94d6840b0d271056099 +SHAKE-128: 4c19b4e38e9bd2d6ffb0d932d4c7203ff4805c4c3d07177b40def0f35d86f8f6dc2a2213d8e63c9de300da1b75b2d3ef62b6b32c4890f5d5b8154a0213dad5c5991dfe07f480cb6e4b522906b29bcd97f1fdddc00c8157f64928abc8a45d399264bee8a2086bcf80579c4c7e3a9b5b123cda61c06169020ccad3f8977f1536d4d6388f85487b967f831c25d0a5125a8b5ebbd1b62decd7ef8c1479feaeed21238e47cdabc2fe5c72d70cfba8ae3869591ab808edb943069157fe59c7640871cf6f1a26b9846168af1a96918c7f515b6509ce8e96eea13d8a021dbd74573e1c6913e2a0f4aa413e46c4b7ccd29accb86319899f3104861f1270a64c0228046667419c31dccb0f815a14e51596dc7504aa1f5112d9096dcb2d5a4127824788d5d844636941c6d29e17dc2768e057dbf0505d2889a63cc146f150bec8af0ce81f69d60d8411e05a89167c3615ed1ea596a7bd20156503c23ab5273a857465b180821091173cfa7c62693b07ab35ee5bf246639a29b202b8205429620e00a4383a247aba394d1415aae2753618ae5b33be1e9a59ed88f63d8625a4895ead2987a31b507dedb44212ebc46fcc6f9e27527f784f49a53d3e1bcb1483ffd385589ef79a475b51acef440887bdb46d6f535a60094ed94bfd837efed006f56bb978eb2ef7122878d69ac754356cee6f34f9eb6df6e7917fe8c2fa9f4fb18468c59b6763e1 +SHAKE-256: 5397a1594abc5a6686c993058da61dd1704ad2624a1bfe90d12ac01e85afc128c3bde57b2e0f733302ab3ba9265c764e547f759767ff8f532a41394d32a8eaa8086526fd67a6c7c990ee4d295f01b5f85a709069d5405536a5e10021359c63603b9a86661150942b35cffcdbe4c799fff97aeef213dc3e6a156b101e6d39dd88f7635f0939c5b7190bba11efdf9d7e04206eeac182e246c29e7404259e60fcaedfaf2085b1e7995650dbe06a8cbdab7ce2a2518aed962ce72ca94760e34563a0ccd8b0584017894c46aa667582c2a3121fec9213b4fd376d040571b58856dc862da9f070c51848a6be1a0fb049995f8351816b78190a43f4378e475b84bc83aedb651605c1bb31133a2ff4dab6593689a457d66e00d35e4711307a160d1cd71d3d40f6dc154332635180881d78b2dc23731abf42c72f30d5baf13c95434c6eab161440e4bac4c83c2a61b98641bdbe2ad0b7027c6c3716eea667380fe191ff54e583709e05ff475b45a255ab58bd29fd2bc57999abd2169edcc332d5a15a64443a2f51a0828b136da0dfe49faa508647b919ea8143c46370476e86914a66e60437ad6af6347ac67c3693e25daffd69dc7337117b4606255ef1942845ae590079d90d2b4b407f3dff0d779eebc5124b65d4e0dfcb1c04869e94ba0b874786b83b957b367c68d3fb84382bd610143f5c7e81a46e8672cb9a3d3f9c001b6627e007 + +Input: 64f53e8b0c26f733dbb4e1d99c1aa22427c265c403a50d01fc3b05f01a55f28b31ecf737332c28a7904c806148dd1500dcac41fde02fd7fcc48ad018727b4e05ca92157ca101a371a346005a3e009c5a0e415233898a67a136d67121a4413ddbac9c63e27083ec255ef84a355c350164883f5c1d0f6869100ff89023c4acb15b46d76e55cb0b0f454d0d970e4632650dd2a1fe45b223611f23e3a22be288bf4572b6b3b737671e026bdd29979718f29a706fbad97b35 +SHA3-256: 3c555f81234412706c6a642486711571f45ac023d67568a8c2505eabb3a61ea4 +SHA3-512: 7b2b1fd3c323f37175b42fc72519a0017a595db6dd2fd52b8c1fa595ac0392f9d2dcdf0b0af88b988085a855f60b95a74d1164a88994ec121595ee3c3ece990a +SHAKE-128: eeba189a4cfc05a319e337bbfe5ec76a27ddb9710bfbdc64cded7adc86a5c439002ec66913caeb0ec2aa3e57114da49b29f7e799176d1928eef03025e3a89abbe24d4d0ee538a771b17eee6fb20ee12f4b101691e756709c57d3f10c95aa26e6d9f665da0d20d8fd28486e623f0a7ddd79b4881a25f6160f9c59787f48a8ea895032ffd8debde3a6527f62902cffb2cba60540080e6c34d0503883ee2d522e8164d4c784eb0b40a5c07a86dfe38a5913df6fb136579c12c81177c80113ef9dc5223fd879dfe63fa40714ecf4bb7a64a43a7f448f838af04316845602b8cc763c7c6479f758c6630922318c288d9bc9ce735a3636853c19b1cef1b12235a48db6e489466c53ba2ecdbf7eb1d13a09d8e0a728d961f6c41fe31422da3f4da7e941e0e2ab8ce3367a72aa0a281e53e0519611cc1948fb67e285b4fea57ea92b0fb724cf0cdc0a15f99c8e4119e72f51eb4ff080b5ee482ae8b6adb6682ce34ce60a2394dab11e85a60405075723d424ce7e95efe3ff3f476c98f18f1dc1344746f9701c2a0d35e193eaa0b68f81527e76b206922d6fe3b84d8953d7a89563eff2a64d0216dcd17d790c5fcfc20b2ec6a6145b37c2c44743965a68a999354c37ff753c079cce193542a4813433c62e8e0659ef8c0655a43c9e5cbed8632477b7e6969a493f792381e49cf6e3bec40303c4e8f6bb640c3e678dcb5b58df5c095f94ba +SHAKE-256: af0e49f8121ba44cde5fcb938a1d930ad867ae2cfecebfe0ab0d55ea64ab17072b59e542824290f1b46341f6b9f9988113bc8d7edd15cda6fcd07737bd61adb542bab0b7452ddfeff252e229a84289921f839014d3d8e2d8b986624fd8a1fbcc93699837e9b8db2df639fc8e37b5aefe0bc722d294f5f728964c693846834ce1973c33247d178c8acb27e61abbb877311f0c5026e29eddcac2cf8567c209ea56c8f65ca26b20b1ae7199bff57de8734e2fddf63be338e48bb6fd815158b006a939f64a33413051420691e52512100aaf0da1498817dc708d3b69a3f4091c2620da22a9cab6d4de21b5b75f67c37e83301d15171771ffcd4847cf8e66e0e996cc90b9e7fa9bc0b32dc795678cc7af93ed289eb0685f0b71637544c3e4701c7b427cc843e7b96fd67397af22a5f1c54428a010e5a89827fc52c8448d43f1477d7dce13ce2e417f9108b8b36448ae56610b6bdbba1c17ffea622ce6d87fc62a97340546c705a36b1be299599844a07585e89c8b1f319d0a960aad8767a6d0fd23896736527120b495e312c2f47710535f30e9b6e9f5213a25b2bfc4d7fc324a0bec9814c3bbc98433fc8bfbe04ca4a964b31fe171c4f883647e25295c26f2e201794e24e844b89631aa2969dca0bc648fa27e88877a9c42d0b197a08a9eb896c6eb621440f0230d15cac102ff805d865b99d82b9d01f6e95160d2223c4443b59124 + +Input: 5d7510e7be21619db024dae6c38fddc7917f9f8652482acb209bfb08244252c8d90291184444210f6ee6c4b2f99e338562b54b0ebc410c4aef6fc2766f6866321a1747cb3f82e0c1224ae799b36a54b48b0c27a57c74b609be5a9b9b8d8eeee15466f15cdd30ca79666d47b97d9514c0c4bc06ede23b5a5cdf0eb3cb9722cc95f44143ebc576d768d072afa213bac03ad4a8344f454de99ad946940962ae19401f1726775ea717a8a7494ed2ca16b3314bfd183c3e06df +SHA3-256: bb71743dd5b9daf494a937e3e3bae49454da4a616e2254786ffb59a5631199ec +SHA3-512: 5f4d2e65fe7c5a347d4d457262fbb938942e3eb48e25459ca6727613c1b1c0a30362e7ba8961c4edae127b8e74775e9748c5235d01661026c0ab69fb7db060c1 +SHAKE-128: f1cdadb6e3c24c467ec0ab4784f78806d7ccfe9ab6570fc9bd0ac2d31361de2a851544c743e3d1c2a16c94898e4c1bb107e7b5bed2a8820ca80f81a26556ff41c637fd87dd053be51b8e06badfc42a003c307f9fa11903014e7855b56470d073b2b086b0c901ea9e0faf38864c211d0316661631c5592b65c78bb53bdadcd3e9bc26286389d4cecc9528a238549c99fb47f2981769ba46ccd0a08fdfa3690a069beb882fc10e5d0ab7f326a1f08ae0dc34eb0b43d549773f90279cfc95dccdb1785ac4df52c0fe1c91e8b3a83e9307ef064ae0898f189e3202668cdd1455660449c7f897d101047c90309c0a9c0095276b9e17ad177e76516868ba14ef88cf76969aabdafc266b9e66171b80a5b16b47dabbc46c0b6cdbffa0f61fff9fdefbff9b444b136eca9375b810b545ebbb52aebab5275da1c4c375f68baaf7757c82e80be61da7dda8680a8fffc2632d9ce96343205ab914af428075c84cd2bac03f5f250f01cc65a62c14388b8370d4d3f5aba516f86f2c5b014562849c39c32278a438602a4ebe2e300d1ec7ed6f093b5fae5d889f6c7e69a779ebf9318ec9dc1c66730b2f0c02ec5246f51fa1798f0db667b566be4b6a1af75f62fe97f22516863c2f24a3968a1b0290923158ae893fb56e87b8377c5e491173e2ff1662ad5e88ea27965d93ce19e508ec773626da451bb811d292a6b2e5091d61ebfb874cd9050a +SHAKE-256: 7e624b901f762185deb5a89ec175328291e87ccd2c2be59cdf77100cfd2fe4dc59a05df16cb243c240002c3cf009d1ff78d3b0c7e83d75935359bb8e93a4c78b532eed90ffa731f2a199b8adfaf55140ed849c0d121d74a26402d309eef1a43721d59a87083f0e628ddf86b909e46bc43e8d44bfa876d17dc84e11eb88ccbe94f17183f7466e5361544fcec1a875fd34e844d361dd399ad9f822920d4ea59033a8e1ef10befd133a6939ca0d58dff578fd78e96f9ea82241491c67323030d1c5b04165314bf840da1f3e6685260f8927bf2a3526e1845d41e0bed2ad1efbaf655bbebac6ed06d1a956f04febd0a057a73759510b986f9fb5e380b2acc01359742a693def50972c0ee5b3b4aaa7137658986b90efc489e56eec2692694a21df5e0b1aac3d34cb4a146d492c9484153fcf13dc9dfa9a5ae315e62b4351ef810f3c5c2e153593e5673657e66f6d2e4abf47d6101af045f2211e49294dce570378fa004c5cd3073af8ca9fe1b33cbcd59bda96b2dbc8bba24e2e92ca7f8b208be46cd0a4136375033185046102aca9cbcdb88ed2329db4ddeb63186cd0f0b9dd17176f144e0bbdbedffa422c5bd04ed1fcad081b18d963f78105d5d1e1215316825640d4835205fe1c8b2a66e966635b3591a3c57b149129d93214a5cc8c5e62f714091198ba6a61d762fe80e95d6e399e14bc9103fcdfca4eb342b7a0d6a4cb092e + +Input: 0480d8e4e6202d22e84bf28798183c07f692bd7c8ce76e5f66093fae2c4d179d54fe7d3dd251b1c93de0ab50919a01712727cfcab8cabb2c9a3083ddbff95087af6eab9ca6ccc27e7dacfb1b57ac3c568ce36db4e08729577887f74d32deff6c29c800555bc53cc48c877d5b38235633267de3e588f12c02cb4219463c9fc82ee3c1e1a0f9eb3631f9ee5995cf7daebe79e05389221fbc17f1d0a6b1776b9ce1565a306c962f485b0af40e98b7e8240a205f39d4705ef0e5 +SHA3-256: 10436fb5992891c6f9626abd77d551ea3dec782af6b2262264d8ca5b2046f398 +SHA3-512: 81e96dc335a200272752595c2de1088e1516b49c3417e9b72df9c07ba272eb954e488e8cb85a0430f541c590b2dccf4730108c1bb2835337d411d22144d1d384 +SHAKE-128: 48c68319fc0c649d0fb5d76d688c49022699dcbd3ab3487d15774a79b4f4a7a221a347d1c6b79d67aae611570a29795b0a94f9d667df9dbc736a0a5626ff830e6904573e24ec4e51494edd347b061f65aad4b12c2ff02e4e196bdf32e1d26fa342fe5c792ca45b6e5ee9b6e0a77f4e4b79922ed559e3b739ab9aa1a994edb4c232520af0429cbe00f9efc58de23b15e747a066b711a736b36c767c05137d23568e46f90d100d6da899dc25551a4a487359364bbc304984a1ec19c2f6f06a508a0e22076de5c0823fd05d5d67e79672729c07e70696e47fdef7e73982bb4ce5128fc0bbac8714dad3b66b46c5995fc84a328f8acd69066b9d129fb6dd2c805e8d19a5e798914d6374070bd097ee52d62aebd78076a0a7a6650dcebb089a8bcc66f21324d2a66e525dc0e77be3152be626641e0e61ee07df14a7566fec71cfbcef764328095c874477029c9f6def16c27c89fc2ea17b364246fed07e72db07dfc4f3e20e360652df75f36b471ed6c89f8764664edf30030f5fc2daf5a67b78b198df0452bd92f005302f9735df90b8e3b57e9c51af6026fd143ed7042d98c5094d7e36b1f216c12d56aefd5f197a6c6e7c9ab7fe060aaa81699d69ff240084962b1218fe004a2fdce7f614c42362131395f6cabab626066d7fd2e8b214c30568ce8c0e132664409cdcddbd3377dfbba7516a07343d31321745629329fa8ba1676d +SHAKE-256: 117fd223d35f349d1c17c017067f17d4b28fc156693349543a841c31d8df2251bdd057081379aee01f5bf5c49c8e076732ccf51a2e6cfb4ddec8d88e6833dfbacc11c4c5cc01c0d9e8facb07017f71f9f306834e95415a9f16894d5cc8363adc271a8b981b3193d8d9d2de747ed3c52a3aeb5b2e7cb21a999692f21c2fbd6c8cf10a040fbda51d1650eb0d644c72a5f7b9ad19483f7504780e6b2a391ff59131d88402cbc59066740794221dd4ae0d62fb156dee172ecb965f81f9e49c14069502d60d32a6394c7cbd9681e7285df4b98d5311633e5cbefa49fc66d1912ba8b516993f773124923373d8d1250c31892732965fa8e06cb52b6d56538b38cf141c69db0d16e5625650c33c19c93930f3c1fc08c94147d94488a80aeffe29d4ea0513cc0d95d03381caa872ec764b29dd651f1d2165ec1efb4ca1765dc530bbf1949f25cd22b04cd1dbc7df7c4c86bd919241093464a5ed3fbcc8939b6e4ee50e543ad1a33cca6722d9fc221220e1fd313c48e3cce6a0d1dca7542a48df5c7d5bf8d4d279a2d9ddeffcdd773fd038511fea8b04f1ff025e48e9e716fc30a92409545d488164cbe649004b4cee5d09359551b6d92f8565823b7243650e7685ed55e9fb4eb4c35ec6d3c95a35abd8a5f6515279a0722c635629c77ca0d1cd81f32e23db9a3be0a9fe7964c39e4cddcf9da8e0eb1861ad54535ed9ce1c02ad6f2ffc74 + +Input: 340cc17657ad9cfd9fc068f434104e8f30b1be119d754ce3c35f7064f58a684d7450654aaabd8fb8b67e659922ac17c64de89253ac9d1c5aa07357b64d6bb5ca84c440d3ae603eb4adb5ee48c4a4137da87b509e5c9ff8b2ca2b9eb4fa6327e3fa2f9aa0d68c668bc5d09f4894803a5d34da6e38f1ea59017344e93b8462a117095bbadfed798e63a39228c050f2bf8677d9da8b29708cbb6ebb9258277f061e0c90965fa424bcdc9c0a76d414498b3737d7b3907c60b3b11e +SHA3-256: 59ba4fe549e9cc8ca818c6770ebc28687121db19b31fba4eb58dbac05b233a2d +SHA3-512: a6dc43ab6a1f6b7ef078a8c5a61138e8fc45baceed1ffa888db039c04d506f614f00d0a8c06491804760d7693a0b6882b292b0308ebabd8deeb516a78c4d2d13 +SHAKE-128: 250e6c56999abae263738f6e0fca59eddc7246cc88672e8b44c125d9ddb1f019da35aaa457ed5d634f2cf2edba12e5dbdc4e0a466af863990e22b6577ddfc47362e08c97ff42a40b8045c556ba88a2b9ee9e03de419bea4c6f1e0f2c7fe600264803a79cade405638423d232e6b42aded9b32a0e8121c56ab530f0bfeaba0addf4ae84377ec0eafb7bdfb04b0b4450886236dfff991df9793b87d3e015e3fc3394b04800df741ff0e28afeebabe66b86b5f4dc0371e528dac627a7f705401d3bf7b85834caaf61db3a7befe983d7064e081d40685b09816df13a5d03fb6edefd13880388a28a1b57940184c3f8bfe2bb81b33df3d4b5386ddc3b93cdb8a32b94c74d715074675671ee852a1577aad1c06eb83c827efe97cc503e4648a0034497dc6fb8944eabf72cca3078cd4c830d8ebf7d0fd5cf04d290275479910945d08511a3c34f18eecf76aa023a136ca5664c05d2693408ca595fbd1eae82268924fc01dfcd9e314d15bb3366135efac60d09e6ae92f0926a1112385d3f93383ba50d81ce9c6cb3ea5203d0cd6cf392832f747ad5e5c438edb7e6c15d0edee3407be4959f93f96aca896cded3d1c6e4f7f9a924e387827e80fcc4efa7c8929c0a96d1f80674fc80f0abe54f89360e681378139031dabd3e0c9ee899e6650100ce074fbd4685737206c5cff537bc0a88ad7c7138e118ec86a18dae00d68c719c0e0ecf +SHAKE-256: 9c2451bf232ac42a93a225cdddb3d30cdc99362573fbfcbe85417841906ad972789d40cd4d6a85180b3944f7796e46218647cbdc848231bb7314b4be60a3b3ce945a7d2c021f2baaec3ad6d0800df797244c9d26410b42aae41bb995b4401a35d128fc3bd6105a296a13d5137d94c80688f80bc2e6c30c7d3d17f3b773885bce40424e29c1e67bed88d34b6fc88b4d902ca2d574c134084cfd4e70c44f4f29b09f47f84131181e0f72988c9ac00ea78f7e1ed842bdce795d83e8e4846966211aaef35ec19950ff6ede86f9670e4b953cf9eb351ca746a6c9f3837ed16635d07b5e67b8273df63393712c115d76fa632156c4ecabb7ad3eea63405a45661585778111e9dfa7b53e1d65121f7953eeaa4bf8b6f08ef8ea503b6437b512cbea6b34afccf693a84f031e7e5945fde5fcc74d296adc54e97ccd32b47567090ed1e8a525691006ce044eafed4e11338b7804d265ae87cd21d42304bda2d75f302e58f7c92c653d27d731e10110162a988a550237f95e19951b00d23516c85a05ac82e11760e323609c1e09121ccd9ceb5ac14ff409c6645bc032ff2151337ae89354dce7fbeb59a763cabf2a0789362f9dc6938d006dda2011bb15426d73b0b9fa9c014cc152dce090489bb6845bc0f65b475b36c1c0b62b7856fd988091fb24134797bfcc0b5317c7e9b1aa98ff2560a7398bec93a54652abc37daa276eba01bef7fb + +Input: 3315ab6d10e6ff08959fa1ca33fb4b5e81b6c1d7941f285d01ab092ce0a3c4815342ba7f50a4e4db438e06ea2890a944ac5a124d8174c7aba3c5aa68fbdda9e705651611c88417ce53ca3a08c4c8b8fd7277957693614689b2aaf399133e660a730323a4ed2bab3da7af92e2a806b5bd114c238e00bda13e9dedb76965ab70e2a96a958ba4ee4c9b944a14582f401d08b1bc509dd9a218421e074248aa458fb2bb7c0dad165b84aec421b779ef22b5895d0f7a7f3f835c9636c2 +SHA3-256: 987e2578028279245d4e8c6e16d3714359e62626936b50f5e0a4fee9b971da24 +SHA3-512: e56e83351322e87a8022569ef1a8baf85cd2e408db5b9553571e0ea11823d5760b0f0665c570094f358a178df9e263713c24548c6560f8e5fae4078c5f0966ba +SHAKE-128: 639cfbdecf1538bcd0215ba263e2ea8f3008e9e5e5eca6130967d0e1023c8856fd7165d9a28d46c4693afcd3c4e12ecbb70d7618ae0465ee8e8816466e3ceb12d569774e23f3f71d83fe556968d84af09a45361b0696f3840e5eb5067c7e604c457be57f9d44ae425773194d6b738c0d316401a89ab87d4226a4fe4b30cccc7952880c72fa82bf0ab95b9d456683c42ba3f999703377aeb6e07554b7e7bbfad5909125f6625c158cddbac04379db9455a881f9c4d18537b9f0401a264ed175eabec10c4e0047e39a63537df47df473c0f19d842e39e339aba0207833f1c08425cf2fa9c6bc45e89c6e31def4271da9c753daa337f961a14ce9142596307cf0857365fc6928ff0e34c5b682f5dce2f3996a47e577319875eb1371e9e58f72d718b4a3f7ebdd692382a45f0bfec3adef716c2928aac120956ba2879961efea21d2d498307c9141b98ec14a1c7d8e4e577fc2e523b8f05d83b3dd6df01e3b146f85f11932a74109bc649e71da6933f4edd006c90b1e1a3c0416d0ef05cf319f3a6f241317381f3dcc0902697f0917583f39b0ac0a2ad008fc05d400fa69898082c2adeeafb680d07371c590e8110c9c74d8187919aa005c40ea2bee78161acc40c15f16a5f137c39d9a567bac0326a2568255b052526212eafee82d69900aad5dc64c289bbb2bc79d40bc682ba2a6283f481c72c66b0a9d5d5b4a25bb9ee57b57d0 +SHAKE-256: 54e665758035a69dd73a86b529933384c8f64867fd765b8960da0477932f7ac849a74839b43c29c526eaa94e4b2c261a1627e4c49173432aab830923da2065502f839c70d36fad2aef4b59e929f3efed557e6a47ab19685485aaeaab88f31941f5a3a38c1a291158b84a60c838c40f57a3fa9692e456dd945fde95514c962c0fcb37f06507ce06101c3e0530f6ae73f60b87c17bb9808611306ec96f8d0b44a301d43f35ba018d108af0e91a4d804899a35220864c3532126cd18a9b42dea59739e16a2d34419bf437989be85c7418b4fed943be8ceef18ae9338db4ccc91974740c91e191e83d27ae7091ffc54bbccb96c78f94544e3724376588c9a12e41aab5f29cf94ab961f711043f15d351e8daf2a0ddfafd1f4b4518c94b62c40bc1599c15f99a15552e23c02c3363bb42b59460601f5fb9c9865f0fb5e2409435c66dbca608c7fbb58d15932ce9a2f02095e1494de7035c59c0494d8e3139040b8d8800ccddfa7bef5feb493a96db3302bacf7b01bfd548fc6911c60e4f3c44ade04cbb86e392ee7e56fbd6cf0238cac3e5837ce1d756a3493e2808cc7260a3916c38bbeb0afad7f479b39270289487a30706201300649e966b4bef2683a73d1c6a21ae910dfed87585ce8db5b12873fd2aa8d3fe189857179cd5acbea005cb64eea533c3c36063cffe566e980b990c7141993c21e785d7cd5ec569b278fe8c5358ac + +Input: 5d1cdc61eb7d731d1af0d9bae8d72a3997989230e60a9fdfed7a5692b3bcfbd6040e1df5124c04a35fedde8b326563fbab8f8a8b0d4e96e0bc29016b8d14698148829a27c605272ac02dba1f1b2876bbe76be347a05f22e2266fd9766dbff7681b018cdda77651b9be1e56a2dcaf8cf797116f53d14cf32b84ad69ee0f41106db3b21dc7384814bbc0d9f02fba76e0e0a951c8017358eca97fda2d639c0ea185a1a3d14525a6604e380a4d83e284e6b43ee8ffd7cbc752d8530a60 +SHA3-256: 79afd4b3cc3ceb346a08ac539bd1b29dbf00ffafbeeaca42607fada575bbaa16 +SHA3-512: 311d7fd554a93654947c74bda7a63defeeb24bb41e52d6f100eff06d2e09419199d834e0efb5f6d4615b6cb9f2301e66df2103aadfa2dd421cdade628137edc0 +SHAKE-128: 95894766e8ae5db0e2d8a070adc47025f275939ab5d4831ed2245ccb14eeba771cf628788081c2f718808ab602b1b7ea8b8bc68b4c89a961cc285ed9b0111f345cb25cc4be2c8a632864a4ce1cf8a8fc2e951d71f3b06435618f496fe7c2cd26e89eba0f3aafa5d44ac8f837d0edc9a383e3640123207341bfe1efd3fee75a90c7e6f9651c359315473e2f7b1fb259a935b13bac91dd720eda28bdf90f992525bf0f445e4a3acb05bee4366c267c077c1d18e4099c54891ee6df589193f62d7169c139a4e9f643c2bd6d0e0ab9a1ae8d0572fa9b86ee40322756c47c4c0e71be958180197834d3ba235ff485689083cf578853816e6ff4c4a4bf51fc8c75fa2dc771dbaeaed95b010d3cb38fb6737397a70682728a33e50ef57d348eb16adcf8c10f3b0d0221db46dc1c8c4440cd10dbadd87056ceadf4b5e9c59f5122bf525b1a984fc11212ca12a027aedcc2a8957708993205bcf307c0ca27b559edadafcdc77215425331ab149d6182beb9bc8c4211633c5e019aa859b2bf474f59e0635a3d30d494bccd58468365f1d77815c62e5bcef5d9d96e43b07290c29d1f56965378126282dd2b8f98ca09c6548b1add53bf7fe9fcc93965583a5b08f7f26d745ab92e5c8eaada3d73682305f9568322f842eba482a5cf7fd10edc4c9785b205bc0a31e30297f7ffd46d4df666ef67110e942a6d2e04edee805e9c7c00b32ef691 +SHAKE-256: 23e636c76235e2c58f3c3da086b60dfd0c38ae901e93f1443dbc2f93f8df9b910b8d09b11e834093d9c61c4d667e7410958e47c31dfa8855ce758416151b8db235d8793a9820c04a2c56280d35b6dc1a5b627750f3869d15833c643b7f7b8738cb5591fedf97ec938abd1447ccf57656d2494c6ae179d3b1dad96ba44ec88aa5ccaf6173ceeae8260da816fe57368a08bd532de350d8e2d6aab313c6d27fae3feffee068533e15d87c1cb1ebaba3cba32d292bfe4e164ddcab62f820d386ebaaa780365578b4932952268ae0d5d74ea5974bb8daef045e7fa13665681970603154f15eb8d90b340ffab7b012f2aaa77820a6992cf886bdd4684b12686448028475cc0371042a144285c638b4a7624d0956b6826797994d2b6a488888b8ccc757a2ccc5a79c0f012e7698495e0ed8aa20dbc687db6ba1804e969087c829e260fea8c5ee29d7610c121b379e493bed9de9bc021849447ed19086e0ecb3598cd96221b72ad09487a0e72b27313b1f0f7a90b3a095ce0d6f8bcd7ffa22e9331273f3bd6c1887f1bb1b49fa7b068b93f66cd30e3b34bc70a9c226449eba4458a89f249d0b033f084597da885bcf46e5c2e548b28e051989ae16b15e0fd3c26b0aa4b1e041a94173009e825c5d570e8eb8d6dcc1735f621cc1346818cbe0974253db4979f98380a7d72f04f4cad91777b710641940ed36af6d63d905e1ae1a2191dad3 + +Input: c84eccf5fc441aa65c63f41307d182ce1e43127bf9433fd2bc167de2b5896553e1fee73440d9f04dadd9ca3eac5827572100fdead72e7d26efb4d66daab0850385a5d5982dbb82200cfbda0f31b872b2d941482746c21d8b9e94df2804f6a66872d8f57c76855de32423feb5dfe1ea264261ab09b7d0c1ddc5be80f5a2008eb01cde3e122522523b71165d960554a27206b7c760140efb1f243878fcbb06ed3c30c1af2f2bef99ca8ee939d08a6c7e456c7e88aaae00ca42a1e818ee +SHA3-256: 4dc6da3998004a3cc7f94ccc45d5e301df170d986ee86c8fe6547ee8b6887e65 +SHA3-512: 155927f7187b9cdb9e031f2c2dbad1d89e0f42a9187c68d30c4a77fc49cd7c6484424b1583c33983ae24edb4cf2f5279685ffe2c964fc2c26676d915381e95df +SHAKE-128: ce593821733d37980c561e4b1e806842b496b0435c272fac7bf6e728b6a8c61b871887eeca33419e7ceb9470567a52fca419c4772562776ca48d03640eed5b1c351f5b7642df5425bfa6d875eaea582ccb129504045eb7320dfa6db51b2075c1675f06feedb4ccbaccad9c56a0ba81135ab3bf6a3244557e53e0967f991a44c6715c4dcf437cd3480a390795b89cfe25b3186dfff0ffe64103f2b6e5fb113a857b1fca1a7825b49bd0c2bb66a84b5f25d4f5f9cc86b5544ef785c0ffff341f9082c6cb3c0f3e562e412c7dcd8d43a1a9da1d8c8472b22c5584f51a89705d7a5fbd3613048ce5aebfc0826c400645a49a4743ff1e924cbf7dce0b7d52c52308b95c49976b74e194883ab407c51f5d20c22ae3635638b60e86e15cdb981ea8c9a301a57dceb8e89ea47b281f52a796c5be5d23194758f2d73bf9326f47f23dafbcce4cffbadebd923b032461b2e0a636fc5342bfc161c3540d044067d348758d18baf71211a6ec4f7fb721a5d6831d41821a77a6d29527a102f91cac997092d85a866e5a1513ab5dd886725728a3a9bcf8fd1a9947dc25bc3eee8598c4bd0b5214b5f5f4547b712ea02e85ba3f8a00e71f24636ab81e6db0c2a4d82efa6b2cd34e257e161213d855861e53b01abe6ec4e09f00dc0c951f5d26832eb6474450beae292b1da11c32bd3d7bdb04522d0ee3abedacd7ac8de31b4e536aebcdb411b7f1 +SHAKE-256: 4d0d50729f2e72fd138bc54bc277a0a447584062d5cb44aef576c36129d54b200d5c3c43e15afd2b67ed5304f5409f1bea4f659f40de7c52bfb34d9451d0622301eddd1759b8ad0649193f30f8ce0307a564cceb881d5d01567ed2b25b1de660aefff643756ff14dc07bd6a727db7c0c1b01137aae560cc8d083a767e58dd7a50f7060eb45f8ff08cc23f423727d877a2d85ff8b5bd7186ec15c078bd2ba6b4fdc43a441474523f05cd2a517b8f781ef9a269d9fecf514582e5c5500dacca703f7d8ab981212009525c5df93e2682f477f2cf43a52e01243768cc398aa7fe30e263db8fe4533d0dd5d5a460291038c47530573082ecf4d7ec827962e34ef1e0d8e03fca1f8138540b0a60b0036da671e8a12c91b5259bcc995756f4a99d6578a1c319d64dc55b0f08136e3e2c4280f2b92cda736526d832b70f29c973351aa79328dc886edf5acaa38282b48ec47ff0f3075da26490c938eebc95c8b78906f6550e309144053f41812d25ebb89ee7defb7742b02dc8f31ab9697fb3e4606d6b823cb242df76fb0522076eb881d18e6169ba3f6d45350559ab1803d8a7a42b00dc055d9eaea01782f02e460876a72ec6de5fd5c274b3dd6b8ece1ccc4ef6c7f26e6142d9945e0d6c3eec0419a4597527602b7f9b33e217808fd082086269b04f8e0e975334200451be5de9af5111f6e976775b738f8e7d5bafc2aeee9dfc8b9b1 + +Input: 9bd4ad22d52d95f819478eca86905c813851d4dfe2991ef9b887d25dacfb38ce036a1db2c908a6fc74331e7b8121181f4e370d8cad59319f4aea346b297f7ffede19d2a8a4b1c4b3ea810fc490b3ba888d31025e4201919101b42b77386b71bd547006ec1d25b5a99a60a5bcbff7ac2b3c347a7c20028f67e9d04b98a297c9bb42e2ee1c4cbc206cc965b559f62bf3f41fb4a7d7d76ae4c3f7324a4a0a11b153605cf319616aba1192c9b66045af9508cdd0a1fa526f60356ecabbb885 +SHA3-256: 83514eb64d7aca8ff061434e68f680f07566d4423f1309b35f84133e9bc5077f +SHA3-512: 18827f4e197bc959507390dd493a885f3984f708816179ff56c15817a406504df1c4ff9a2928394c67d781712e5f56faa7847be7d962a5cbe08e19308fc81e2b +SHAKE-128: 16928826fb11e8f339563747eb27ad42dc5f225b11896af5e6513c8b94f405f2c0e7a71338c50be4fecc2d0186428d229d1d2e469a89389466ab212fcc536d19262e59ac05bf52510d4ea71be29fea88660f1d5273c9afbfd7df446c96ff787f164a6c9315c7d6f0bfd5255b60ec4eb0563f20b3bd1a8071acaea3d0c53babc4d2ff5d8c51f4a321c7676782dddfed0169533786f757fe32d3caa93520b51cf6407c1b080468e60513c515bb570d826a8950468a81d2977166da5f35d3e5d9419288fa0c868b22ad57ac4ccc1ba20db135e58d63939a4ddf31bb9c8b85db874b5f83690c236ff4e27aa73fa35f24059618f59e5ae5c7f22dce445dc69b35de52e431d00b333eab11b2041b2e0e1496fa359f1c1d9c56498fbd244dbc30605cd0ee4abe9f200e6c8fca40c155012d844160e129787ac5bb9c82b77ff74d9f329f118acafe5c16efbf0dd81eb2a3c40fa229a2f58d253fbdd7904f783c9940f00660c3de71083146e338797be79039e9459fd42110fccfa7f60e54002c9151b725f460d2e662c22e219f862b6fa7fd736486a6974eb4b128ed829bfa695ebd862ee17bfffaccbba23bed046ba64af780b2e63d2d000c82fed6e3e357eb61c9cb04b520abebc538815fd29fa21b4be702ff977a0f9075143610b949d9f5f9a08a6e3041293da8792a2687d6b9c2fefa0061d3929a3300a18ef254d90bc9809bf744 +SHAKE-256: e91c973c45fb542b66a06a8f7e090d3826845279c250c871761b428ecc3cb042e159c508f8c28b1fd7add9c62deb795d9f6cd0988d4da1b6811c416c9d372b99983d71a3074a1d4444365ec02b56621046735dc293a7b3901926bc3cfb70f4abfd972618d9a68b1a1ffddbaacf7750a1ad050eb2985439fe62713abf3509f11dc7019421bf6999737f42d1f4f9a20137e2d183b7d50a991f8f644beb2448c617b59a3af8788c4642befda934181a901a27d2e734dc22cbb6b49401a9f7b3e6d6aaadc6caec527f6989901a9cfc2b247a55a72435ccc9afaef1a74cea19224f019619539ca7d7dddbcff016feb100d32d96ae277dab24ef6150bfe2d0e7e75e695821cb02283b7749f5ee0e24bcd4ca467b8ceff070705c75ad3be927418896af9b7e0367173c447f6ec2f22bffe14fe1892e68b10c5dee7a3f953dcf93f3d31aa718f68f2a3bc790a966aaf8e9fd1717ca9786d09ac64a11aeca68cef2d251ce2d027cd5730811c85f7f2a14e15c8fab90f3f9b89df5493c8a34ad31db67c41eba229fc4523cfe4d610ed02c2882fcc9fd420fe2a6d6425abf9dc0074246c4b8d647eeddc3fbe4fda6ecb8f35bba7e31b884ef5f5f7c0febf59112d6fa0e1ad8de95244eec9d0b97ecf4eddede6396d40c28bc3c1fe2fd9dcd8ff0fc3fd6be90b48c7013ae629782b73159663a45c3a5c656753f9a2acbaa8810ae63e7d53355 + +Input: 674a7b538c33c83a093dba209a806ee911ff31fae5728ab14e47d72d585aebaf1271af7d14ca5e657609cf1012c07e87599bb1ae3efafba75b2b919850fdd75f6b6bada522680a1ededf5fbf06e27029e11ad4dc7436752f3229d11c23a8036515bfffc37f8e52bac3659cb32e3a405416ce39abbcbc3f7baaddbfe0242039e8b27ed162986a00cd62087c4add0dc7092ed5a8b1b4e079705648713b7decd02b50b1d21ec1f49ec416f96b1c39ad0524c3d590c404b05045988a4721f21d +SHA3-256: c1a327802b8842312d372bd4fdfe36a23d93c67a21bab53367e3328cd6276e27 +SHA3-512: f5bd53aeb146644923f2577529a31e2379e867baf4f4031408f8e592ce8e21563a2fe90aa69aa9bfc9d5326012de7e3cc208b6519ee6716b21757988f74a85f7 +SHAKE-128: 4ae5b2a348f34b30cd626c634b776ec4e24004551d7c1d885fea59bfb8deb4e644e145077777b35e48e73a1e002b31284bbf1d9efff50b676e162929b453c55000a810fb66180787666df6d2822204504ca1345129b4869fc31e7cec3237f81be4e7be03b7301b6501cc17d0eeba3f9cf06b2a4047ce8855c750b32a447e38e4cbfe2a12b643ae6f20965e5c745e4fa396e28b9635b62f20f03c3504ce02405931e5f8056d2e79f8e4fbc554aec14a861b51e448cea1a6edda2c1f8c97e95a9319fc5992148721d924bee3eb52b4446e7a408d777f063f9e2462cee9df124261ba9377ab06accd7799aa8bc9e6aa338f8cacfc10cae29d042570fd40ac697f097d22b6d5d43e3cc19d1da9e08d3721c8382cb4fffb36e373ee25f6048b38376bfdad6e95fbfd4f09f2632f54d7e23fad375876362bb3394961a76d2a6877f728362f7216c28c028705cf5dc747a445226e6948d1de56bb5397afc3347c253e5e10d84a63501bdfeea429c9e9cbff10a9b719de6a924e8d3d9b1b56734e60ab60207f97fdc132ca65a95d9b161507f024e64687e1fcd1ba03ab11637f7f45301b85a802d88ee66d2f28ffde63710b2b35f0f3fb71851864b6eaa5b2318ee6859a5fb65ee3521cc9754a91123072f4506680055db83e06f2a5887fe673cf29b9d9af72718cdab01382243ff6fed32d611354d68026713aed015a94d8b53975775c +SHAKE-256: 2292020122b147b72755c99df4775654ab12911b28dfaa5864d8eeb4bf712dd20f8b6be52aa4fd3e36a16aa76db2b911b7643338235bc97856667dc0616066cbdebc670b5ab90d9404b1c13feb7db477964c6ae5cdcfe153b838038b606227b89899a623518348bb46d04d70fb65ab73d344f40d3688ccbea76f21486a699ab72aa13ce3272dc654f735a3e999a22814059dc9827c92e1eedea60de1a3fa4d9b261cd7b5ac435d00b5de802b776063c677f75b34f4c63dfc8a575183834932b1983b3b39538fe35fec6fafe73ff74cd58c91218e8470c5248fac7ae24e3ebdebf247e88e175f2bbaa6da71efe798a7ad90bb2f9a83db39af7c50dd2319b0028590a8702f19ca63144271ed40e88265bd1144b56c3aabf44aedfb90de7cf6910a8364ec7179b3e002d88ebba922d177782ff969c6d3402727cfaf352021ca95fdefad4b654b2fadaa6f5d3e399afc7208727c859af5519a6ac0d67a761aa24e808c18b64a0e0fef0465185f1d95a52da41816b560060721e58f6557d422ddedc0806a257ea81963f5473f3334700b90107351cd04a400678b6425b63b83e2c070d91050c710ffa807f294e7a5c9ae966929abc5b71e4a2a38a5cee33cbc5f8cd829672e409fb4139dc531e184897fbc41223da081cd41b0ac329c6f3dd1a543671e30ccdb6a534d7166267fcb5be918d94b62d929b7a86ff87e59328019816a52 + +Input: d172b60b6c13417e1605198979133d24a636cb686a1bfa126f966ff02df82d02c96b29144ecfeff01f5fc3e3996e98e114816f834d1b20ee74df1d5f3680ab0d99639f535744d28ac1a27eb6c4e6a399940ac097493548cf9462e0cb158e97af356c2f8bd134c9f51f9512aee84a3db7462511d137628ecabeec9a5e67d07eeb0da65643fe91fe7d08b60fa7380a52cd22f511cea0ff4f1459cb269fae822f59004d6a82613af530c94763a9c889d52dbd0f796d5e79068c01fad17c743aff +SHA3-256: afe3a346fdc9ae99d087d7a2d2ba0c31aedb5ea4709741baadeb456943e78c5c +SHA3-512: ec3e05642437d6264012d404a787108ca9db0ec8afb635e26836f4ab0d5190f081477af44bbb0a5c9bfebf3b6ec3a90a79c01f53f569124370d7091ef9658f0d +SHAKE-128: 7ec216bfafaa313a07b2a5d6cb82b06d95cc3c667f0fc5566209e651814dd29b3e20021a5c43f9499622fee2665e95fbe6cdc9d3ad3f53d934a471a892baef1d1df700e5cdaacadc4b094906e141c4741923c2f037611261e0ecbeaabd08075d1b16c9f58741902b59032a7fe22db57e4fac696b30d664b60a054e3abf101183493b574c393040a01ad99f0847acf1fe68d34cd30e240220fb607bd1ec385cead614a8afaab724f67893ef642a76fbca3f629e476fa568be21d16125b1e791caf5449182855a012b648c4d30abf1bf1a78063a0b7f7b4f128f22e0f8973701573d3ae5069fe37430bf17cd494afc0d3e0153d75455fe50b2369d59ab908035cfabc09aad04105e22d3c940bb70bb41d695f6591310b0ecf1504b0a7a304186ae222af252995c1c9b969399ba95fade42c65d7f6653e41c3bbec4594dd44136a351e2d61385d3e1b469c9d431c9039b4446465512cb44738fa77386f001567d2d0ef96ed9ee4ff68084a9d54eb7359413aaefdbceef4f149b5bb4a53e1e84c52dc5192e2ff35b443b18672137d71fe4e2baa70db7eece73c6de8488c83acc042607ef93f8690f119bb1d20c1b044641b59789480726226784e01a66f097f18e07f0a26cb1f75d010d2c1417e0b06e3107f12a0c70b54faa138a08324f97f7a016d5b3361fe98a6d3a34b86c4dda027f5048337f54a35ef26117c67b3d16f6f0fc +SHAKE-256: 781df09c7e135b95df6efd9e61982e670c4b0ef6ea4163ee6c7acb86efcbf4d852e05100bd11e20b82d0b6cc71ce5c953d22ad23ac3659d4513f5acbed7d75e30e78baf13c154d8458a1e50f41341332915d930f4a254d5a6d5cb80856561359b1ecb63962ab8e4d91c3730a19761234f0069d9690cf92353d4fec5f7f82f91850eda38d6cb16495113204abd689040a45710dc21fbbecfa78fb47cc960487f7f4e036877c91116c479fa27ab9685d3b3da1d059bfe102f242179815ea4a6633e5dce845db1fec42ecb7253c5846eba73eb7927d91052eb05b73648674cccef307cf8340321bbbb1cfba40f4e60e759e99b91c72734fef050e1558c7262a344c53ff2aeccff4357985da726c650eac46a161ba87cdb7cd74be67096b14f7a653634d9361d466b749c168f88d41219bd5f2d49b66892fd3d0905050059544c3e93875401844fecbfce82c06d2f5b2c1d9643c9bd2388c9ecf0892cece5bbbfadfd4f5d00bc70310456a3578b89979642f1487331359e2897303b49abe4380006c504d85cf0f5cde019f1b2edf6859a9b70c174a2fd7a2b65b66e744b70f18d7e5e43987f70286d42e9bdc0d8212dad21093245f08c2876b78d765683a38f4f72042c5098f9d8ef3f7a04025915b9e5318cf0b8ac7beddcd910d03d8633ee994386684c4321e84802684c4359fcf467d3587c26eecc5a0034842e25c2b0788da4d + +Input: 63fcca6282e49cffc903e625ac18a37855c8297a5af2a9bd868e3d20eb154e9834c3224d04762721ea817d6b5a47a0b2004c44109d0cf6f854192b5531ffbcf2e3b07b2d4113f3a2e3caa75ec289e871f298cb1b58a055b1f22a862b828e846c023ad0aa0575cb217d3acea86ceaa3a71bdcf8db0d43e64a9fd562268f22a47f2e9ae77e05df26dd16b32bd0516bb316b31f68923737ecf622cf2b7168413c8a2f6b5e62e935e3dad7a2962d93c65700950bc6d624e12143f2e92ab31e9a69fb +SHA3-256: d1d52860fea19f75fb1c218e84e80afe19443c72b9941f58a7e2b2481ced1ecb +SHA3-512: f48fe8493d9753cd69c5096a73a4957d4290dbb62dd938dd7d999517de4042ee29a3c64753737fb21aaa858929855cb383e471a15581d92d6ac6e75338e93d85 +SHAKE-128: a2ac830e8184fcdc8996c88f71464eac054c6298f90bfcd7368b7d2a3afe255d40a70626b0e3ef65c7c0a8975272dd28e434e473a9b379a00b1cbefb36901e0cec8d186a05cd26af343f564f36e55fb3f563e0a58f14519d19f6939c6c3717040965714ac569551211fff0176ca54d69db1f9cb34b7b3a6a452b3442092891357fc5657c337735f3c50a4512e4c2f66f33463a4d8e30d22b5d461ba3fdb8a4cc1633aa2bc9ee1da84f561a0331ac6e25e5d0daba51697e011869d74ca67de5a6d49c743fca08b5408844cee70e1fada3bf4d3f242eb563eda3fd68f43d75cb2df7459f997a5584c4e7c05c24d35c465fc82ef59972c79a41ebf2583bf069cdb06c1410e903f5118770783f84a9d4ee28493b9be3341f306e2d5aa754e7b8d944c8fc947fafba07cce9469cf1abd6393b92f0cd70ec405efc438f853d8cd4b2bdb0aa1417c2b6e7713dcd7486ff622d11dd284c182dab58b2bdc8ac6b05560d15b557cab60f49415981533c98a1c61c209d9df4e28d94cc119939cc60c649078fcd3ae7756e9864b01f5747ee72af89b686bbadd8ef880d330df2e8ed2bcfa4dc940550877dc4116132ca1304db8e05d75c2fe067fa58d4802dc750c6dcb7f359e3d9ee1eaf061fc23a7e92c8949eb7ecb135b70f4d52624d0569320e4a68157b66e14bdbc00360fa2790b27d1481c51e24fd19a14658598bc5c212fea4455412 +SHAKE-256: 00a1e9cba6c159baf3055b37dd53a7d4f72808e55545ae5d7ff2f77f1695445520056008ad8d4e69392b196d6c656b768ba074ce07b80790c873b47cf90a515f096cfd488ab4fdf01177f3c2960018e672b33ad11431e792d4c6b38f3d894bd041fbd4fdd6187f21e16df7f552840816a1f20b867b4b22d51dba353ad1e5a313eea1dc199c548c74ea37829360b5336944994088a8a50ba8e801f56189bab8e7e7a3a485cd2bbd988c902962e51cd7740508314aff19385db79c2c98daddbe82c980fdeb664ba24c78f26c71b8b1b257b0089bc1edf9c30bd3e1610395e731ddd5f2fa7fab62fd1d5684ec4d42c45929bf7dd87fdbbbc3fadd71158cd8429f5a007dae2291c35dba14ffafd2f920bf9ef5923024ee98687f8fe5d977e75247256145898c31b3b5b4f62074f8701b4d4e3ddf66ba3a103ba54e0de58dcb821da0a1a6b5c08805f3aa1f8370d5769e51acaecd59b1df02bf4001b2fe1afe8e1ba3ddc073ae34632cf587df5ba694ac548596c34d3b02d4d9563713409c506d66895d58bddcd93433b26f3e32e9ca9dcb62d280bc8650dea0e7bb468ac6d181b6d86f2dca92219891f39a9d27577a43b5c86d47ebb2f4ae31aa47dba0584757e53350cff2d146864c608e7247e76e7fd12a3f0b7b3cf28c22fd712247e9630ce26d6bf6bb80057725c12cf1289b318402ffd52a48c2badd1f13fde48fd09d08130d + +Input: 6b5f5951ace32dfa396b6184930db09c48761707b7efdf7a1f0218355da12985f589b91020017c79c3d1c55e29f6312fcb832934e36ba150d268cb4538b235908aed661f656aa0cbbe1583624c54909abf1dd07ec4b65629e34ee0697f0bc679e11b83daedb8ae05f8ac02c2311c2add15a8c679d5d84ccd0c98bde65c37915532035822885f1837104d666179ae95a3e957bc37919bf128054ad27c1470b8e62bb266c643fe9d49eb99acbc13232fa075d2ab390ed340158aa1e3c763822964e7 +SHA3-256: 0cadb85c05c1ec988b5f2f3e3bdd9d5efe9cdfde128652e87f5d98d96d27685b +SHA3-512: 0a38a72febad51c48c6b693cd2604791ecf08daa515f175a5e568a1a85b0efd080593ce90305fdda185b594c68d348ce97655aa0762a59554dce423ff35cffa4 +SHAKE-128: e430074882fc908b090366b479342a759c71a692a528412d3ee74a59c27396766d6a93d9915ba35e539d0d202f4ae9dd98178db40a0fa6a884829487aa2edcafa150c456f55b2fd802b5d858ad79da14a0b048a0b731ebf0f728a66bbc82c24d2ece77d3b64fbc6e9aaee4a8f57c943c7e1e4b607f88f8ea2037db704dbe3b385552886218460e89255fb34db1888e8b044e153af7403dfbdad6d0cd8a71d8ac93fc3d79982093e66c21143ef4e5275c199d79243ad9e77d7f3075c36370acb468eb2ccffe38d9d4462cf9acf612c8d80279cd8ab28882afb233dade14d376f5600e1ac1bc2daaecdf681d96f739888f685171122d660f70a60fde6e55e6758143d2cda792949d0c2e284f96ec33190579b533acf17c089ab6c267794a36b1923654d568c8cfe6ba2287809045a0bf9a6731322b99aa418f2dcc9cea5d675b10e686264f20afa1e604edcf63ba9641f29ada0a6085f03e7414126225bda49310926cba864d2e26c08166994677b48ada633229de4806b677cfe5c5c022767389a1b622aba845db90484976497c5a6cbca75242fb53828e765fdd8fa3bfb0c4b38b195e4692e8cc50fce6ac0ffa8231a5b58b3eb2d87cbbb2fa52b9a12b51b96e1a7e5fe339dd2991415f94d1a9e1b18db2e30b8cd839dfaaace55547a3f37a8bccb716376543ec24c6916992e22ab86c88a4f468f357767c49734bc96bc3a65f +SHAKE-256: 65d7ba4ec10a109da4f0c3c497d93ab828af47114be3909ced793287c78fd509923775c11abfe1efd55d0f97cb574dfbac7213624162798d17a5608b2cbd6c5ed678f63556cda0f6aaf1d0bd17308d1b64bfe46d23bf597800b8db890a320b0b04748d9e411c504656fd9a59230c618554594919277c9540c007bd7c739abbc9649f4dac08924da16cdda44f1e7438e5db45be387d4582dbf8bd0c3d69d733f4e449fb3927d4c92bcd83a7dbc3d5ab947a7cc4af764c87a8eab5c6a4e4269d609f754c33ece1e6605091a5a256fcf857e26a32aa5a966aec319215d0e657feb4eebb371d94614cfba129fb1a5ce4e6628cf5d23cf8e4b82a391d7791631f19cf14892a46269ca0403fb443ad69c8ebddb3d632287a13fd3061cd949b101251a0606ba2765eec3efc69ff773d647c1d46fd9b58427c5ccd869f3ad69cf01f33219bfcbaf0f4045616103eb85a2b1e22151a976581413d74906a02ed8e55af49f02baaefa899296c029cbe6d0f9eedd889098956dd3ca35418306fc84a9849a443680e68737ff42a773b5df926af978e47efe347b9dd4298dc754543b01da825080f5dc8dba3e11a35b0fda36295d83aad35c029bbd8207832653d283f9672121f0505cfec8490262c1440cfcc76a083560ff990704e5ff290ed7e13ae76a1a2b86ba99fd2ca04355f056bf2df863f6cd972c690601c67d7d0a004500a088b6c35 + +Input: 813f41dfd4c9156162d12ba613b5fd841b5dc1d8e10a1c788053caf1296b9ee8921bf5f88faa60b181433339e8e7d9678c1966169eafbc6bd0bc9c1effa9a626b31989b00b271aefdcfe39072811982fdb8c0056f36382034c77e0b08c684e52cbeb9ccb809e1391ebdc437d8dd35f3d2c58278f6fe74bd9a27c874f8e6da38283bc2ec684c1bb704d319fd18b93d74532f1e0267a2006c85e8708063c989591da493c6f02e3c9e0f0c651b80863ff9acb69fc62d035af13968328a2743a79c9c9ea +SHA3-256: 5148058f32fb9c1fcb6089d066b51b6c00f7b83f77962cd8724517b2fdee452b +SHA3-512: 8cb913db601532a5c94adcd4014b8e322b8633a0194bd3a3ddbdcdd2e98e65c46f84e6a46ab37f208c5b77eb698ce928d95da69127991d80b5eda9e4d740034b +SHAKE-128: df8cbb80b70498dce78715761d85418c253cb7690e35635aefc3d90694b1237078e76ed0e31941f2a9d487cc3c7603f688f025cfed8f5f4ccad01534c0ee32f7abf15df3a3ef5f7cce027f69e2e2514868a20de044548e4dff4f8e58d01db1d69698b7d194c85d22641544084d40f01876db496a17578ff8587ae0df691651bd54c53451e5d238aeeea3ee5f26a18415e91585548600e5db45749e8149949721ea1cef62269e145c974c29169004a09ccf477431c86ab0c2d5d65a72f3e6f66099f65c27a2eab3eaf7dd71ae111e3689ad8bc6534ea9b50d772f11a84912e01bc2307e2453758af9facd3edf567b27e34041fd1c5c4d60f42a33d2194ffe2f290ce0d40ed950e2f23b8b10955123a22980bd62ddc2dd60104529e98d4377871eff0a4d41a156a36d7a60502c42bcf2159bb8e3f9514e7d621793dcffcd52133539e87b361095b3d35d3a8efcbebb3469cecedfefd04f74269e1c0bbb45974a8f20f739e071a57f68dd7c4ec97f2d73e7761b8b98c323ecf317df1ccf2aaacfbbd48df14ebcf6f3731168d0835d8a1978ab0a2fcee4f05dd4598925b3ad3b4d4f833b411ac94f77cd0ce8c7d20f5bacc5e58ef3acc4771e8adad34f9f8d0fb4e9eb21147f6036451686971a685657f66a6050c8521f9bd63bf95a3411f391f194455f995e63a6cc64cb6e6079773fb8c5b76e69e67f839e90b0cb43ed2b161d64 +SHAKE-256: 3aa310d6eef897603bb83da327ba5a17d1c1f25cab676b44716b0616e2b952bf7e75bc6fb6e0d35cdd5c069f4958f49765471351c22b8c8364d2d4904d401017a1979e62a6f3fceea2fa5010bb6a58f09119e22221d7a17836b2959f352ef0caf31e40fceed17c0b44ed073e6e3a9f93d3bd62d506952c6e74a4b0625ff87827d90735786a9bc1c49c91a3f40b0128e067d9d629c8d0d57a54de59477be1e3d1ce65fb7bb347588092c76bda804f9859cff36d3e38fbcf14e600754911aedc632633e72d08be81066805fc21095c1f23b8f1b971353d833de5d26ab303be71d8c24aab64b4a9e277b50c9a638e6b2d76ba062d7843704770ed8c9d65e721776a4769cfb5a5f913aebd9e51baddf47558c358737b2432c01dc139887e03c95432670ec8e08fea374a2dc09a75ccadeedf1b05e3e36243ce439f13bfb55a967f6475387cfa4e2d700081e39d851a22ed3d3ac64243348abb6dba8702d5e65afcfc19c01c74a7390c7d7c468def7702ef3b6cc53fff88da90d3fe103fc2cc6eef36a6dc42fdd3dbbf8c5856a29a011e169bf0671f149999783f946fe59bb2041784c5cd76cd1e5b4dbd56cd28bc74f24d0017ffe4b4d9a665f934072a9590dc853db6ddfd9051d6e529fc2353f1f2191ad8359dd659ff602f4d5765d8d94e1e96c338b11b12e5fdf887dc8a54fab4b42b6b3dfcfd220e65edc21e729d0f801e8445 + +Input: 1e083d8503d7c48db022d51740a43180f75c4dbb323ed3716572238015d37933194493a66df59ee752fe895be09df7034b1f292604f536cddd6ea6a2069324964d8b3e90281fc746023dd309bde17ce32f71ffd765bede2731bd595313039df06787ddb0511d6f19f811be6210abe5fbd3171fd03eaea4bf80c5c2f6550db01b9ad43e9da1fee5e68d7ff8e6af51ef5c25a078b4c9dc5cd42202fe7d86124b332091325149addb5db19a0604fb3a53da2d61c21c05a4c01dfd27e4be4868e4c4e26a4c +SHA3-256: 5274a8c26b5b6a43db390ce6b66e77d397276e8fb847293d96413afba9ab7576 +SHA3-512: ee422e7c3db2373246c91977eca12506fa2087e7e326cb77aeb399e301309ea3d0050278092f940c5a8f735e72811649bae58b0375a373b3451740bcc082ea43 +SHAKE-128: 5b061da038e8ad8a306e6b0f1714373502cb44ea52e902b435900b754a9ac5d189b4fd9c0c93dea178cd9606a5f41f17f44459027cb0a1bc3300262c10b661588ed627b3a61320adc06b1eba37abd1eca8df5f42c57928dd4cb3c1e12723eac718be310184155709d2c2eca08d6769717ae2412013e5b93fff39329f28e2fa8244a573024c2fe46cede32a708ed32460ff87f921340f9ed1ad1ec5ed21bd83c7c23786840b86da8823f1882e9e3aadc4580170afd824270510869c6f977b5841f2bf7fdd12574327f5153f579ad0b7c6f2138110cc7b1ca3b0677d630a1c2eef63840b8eeeae20a892561e7a01c1f9a8a7cd148c0c37f1857e7b7abe308fbc09202acefe351ca5cda325fb211ef4f92f1ffa23ea6394bcac2468865cb79b19a857405bfad4f9584d3eeb74d1c1aad61eb59586fe2c1bee6a450baecd455614a30daf0039c3e3ef478a0531702ad3de38d1fc24a5757275a3c47911728d283191507f3d10c1cb858d7ab4546401b1d90570001a70b25ddd651ce0b27486eabc9d79d9024584f7f1ba4f04e134623a5826aa0e5e3872e7528341e8191ae501cfb66a7b5c6ed9ce69502f91b9e7b56fb7f71059cc1ac1502665bb2df8af37f06b1c13c89a2270e46be8b932c6e6bb628786b235dc5d00d89d163b04dfb46fc6f820203b5a0876707860c5ee968931742108023697df25a0f175842c807404e08c82 +SHAKE-256: ef2c4f70fd8ad613a8600cc3cc4bcb69869931718174eaee73c9e3143569281da433c3ae41e9c07ea1fed115ac69532b5420766ec8c6143f9069721e86be50972018c53a5dca28e454a968a144aca08c48a29bfd400cce5996d68fbb40ae50b93aa746d8523dec0ea27bc3d75b3becbdbd567a0c0ad56c9b20e02f92b3136276ffd6390e6582de5c747692111ef82428f7d928ca1f03eba7c8f2acfd66ab6cc1f72fd0195c1fb13e179d78e9b0755a7bce3b3012d95bf27f6eb9e6139b43774a063809c85ff46f2557b82777c7ee5a4b0c56ec9e07bfc65446b0c90d1e47125858bc3e6ec7f5f20d81e54ae840b0b3f914b2402f42ea382a6f7e02323ebb9cc6cb69f71741375bd8dc875e1052dea88122a04d7d1fc834898a715d12da44e9a96f374be029a51b458d6fbfa2dfb5e3f9ebb54bc91fd587f207435ab47b7aadb04f8db88b4638833459be0bde209c739c516eec99d3a88560274156052fde5d7ba0ae8e22fa32f0105506ec2cc63cb09c5620aa29dc38afc5fa67fc1f41e70019411e224decec579b7eac231d944a5798801a29331e3d7bfcd7dee35a08207c971bbdd8ff53ab7634247ab7a1220e43b241f046b4e33a39de6caec6c6c5d53a3204cc4ee0e4409236d4b218d7d3b13fb6d4565f503fd0596a6466b070a3fdbdd9202a8335c476dbef48c0b0be4461350bb6c31090dce45692437d7395d592fad0 + +Input: e0482cd9637b3ecb98689bafbe4902bcf68349266024ed6977c7c384261cefbf7ab8b3dbff48bd113da9a0b8233b4bab053b3cbde0011581475e08af5851270e3059129352bf9847be41a2ebbbeb39de41b03dbf6def201f2bb85617c898aaf9826311b60978d3b85473db52c5fb98a5d5c21bf205049613578588d9a918fdabb9ba86eb1ea5b864ceeab4e74fcd57de08c622201a6d1fbe8196d81f10a0bc24a3f1d0a46a6b372f5aab739de0480b6ca4229f8228398a47342423937af2506b25d8c933 +SHA3-256: 46d65b033ed9052ddfcb83d7156fc6ae508eb34866f913d700d15e63c820843f +SHA3-512: 574c34b762deb6fe975c85dd0b3bedf6f2fef4564c9d6de70b8b068a7b261e279276a25c0e8a477c7ef5af725b5b561fb32b5d1527666943dfc3f6a5e250e122 +SHAKE-128: 9fc51aa88f7cb3ec83772870dd237a645042d6df2aabd204be6dc35cc97d01518a5e6bff843e25d7336d666c3d1f6dd1ac24ffc588f3fd730f500d2b744cfbd28adf97c7b0bcd467f89998bf71b18e3b57018d094b3ad7495176e5b1d9a14e35c20bfec25cae782692437662e00b912fd68faff13ed01f235a2fe27e54ee24532efd10f4181985964238422336f9fdd87f5391b45d8071dfe045e172795c2e191a529c701373af035988c0322a4dac427d9c742f4140dc53f43be72d3598d4bedceb409763de8173ead4318dd0290064a5bc024044812d08a9d005ec2db5f85ff2aa7c88037d47a3ec7998806675a99d0a55b0160ced62eb1eadc9081e60e37458e282a6ac71c19641000a8b105c14bac5658a0bbb468d5e3705f4641b602f7d6da8b85ff42a148ac5624becfee049db00294c742b86d231f86d45cf12ce3858604a656d583f7e1f941a0be8abffb6fe0fd512c849e302c4356aea943cbd0c0a68be3222a6f01ff3e99973bd0dbad75bd686a593c0b3babf32e1866721e06f394cc2073d69871ba3f7b6476f080bb084eee55232a43f710dd38b216099100f178b4fbe4e391e52087002f0681b70432cc1fe2cb59aa892ddbe8c6c84c9f91074efd314ceb4eb6224d8f5296d05259ac6a9069b5fe70799406ba45ac66c44907e6980e295496ebecde98b933650674a97e2c6b055f33e22b362b757895c08785f +SHAKE-256: 35857596d7f139e1823a4051220a58ab8e64de02be60795f79d3c63b24eae8f4b3eb9e0f2b11639478e37492b2151a753e546888436bbfa88654984da03a8b884d23a367712ee3b48fa3ca3a9a1c12e24021cd8dcad7e80a212d1417eedc95e0b57269e88793faf1fa7828c7c4b51519eb7d1a8fa376c2f25999bef8c3e094c53b08cf8e7565a041754f6738451facbbaf271d8864f76deb374888163ebf38173d9559e52bdd9b8537f008a50782ca660a8045cbdd1cf77c50c8ce0bbc839f2ddfba0fdbe650313a38fd95d2530aaa00b981c883bd1906a816039e6aaad2c457fb6e2a53db73de99b2e02f318ccd06ce3a503ee8b1f616b82f5a01653c9db9fb9ab69c53e1381e5f814abfea7a14dc93893579b1d8c372b049fbb49cbb81353f7f74f34eb741edda6db638748ee0f89628c169274dd33222a457dbd24a9fcf6b37a0a414057881a2de713b49450637b3c99be6509e65ec15073c4e0531bdc57a0879172d49d8b427efc8c8d53b43cb151d90955ac28c9050777cbad83208e4795434c3f7445a35752314a245fad4ef1bbe768b4ca527ad7b8f5249c8e6675214e904831fbc954801b5fa3f884659a66107105215d76652a0c6b6384700df259ac81fecd0ec463da7a96f02077bdf2c3e41fe6e09ccabb68474c06c9632d49a5ec46996860df1d171b06dc4084be93587d6c6061de2994bf91df3fb1d2fe6521f + +Input: da354b5b145fe8d279ef57c1ffc190e54ae3386c41f79f685927451de567ce3da8a89a5ff9a29e85cceddfa48b095d9908accd00169afe739ab8131e6c7bef7fb6f2c9380aa2e35533e8d2cfc12b3f3972d47407af698148015c4b9e86de7dcc0a345d2017ad132415f9635c269c03a15e1f2c82960b153777cf332991ec4f00b1c73a482ca248798b3afbb3e9d267527b5ad8d78eeda259c629c8690a074bba24ad70be6aae3fd7ffd216ef38d929bc266e5d8f3f49f4bd195262fc7f315be312cdbaf6d1 +SHA3-256: 97a98967e5c1bf185f61bedcf054a33383213388b711b1fe0217e8bb8aeaa662 +SHA3-512: 64e27f30872dcc56c84a60a711905bf04f27dd83e460e16e8c4fe738155b1d227fae358b35a60bb91cb82841b337407ff82cae312bae306707357de765110068 +SHAKE-128: b4c955488c9c70f4ccde66fa6d1e1f4c32e6cecbbe40c8a655c5fd7be3d9361de91a629a9e3ec56106e4448ee19986f4d3a272f00db7455a238cd5b7812b3c642677b9dceb2ec47407b47a6921867da026dc162cd22586b435d5bd2d92a53040cd59adba14a283d594de2949d88dcd7656154141cd2148f7d79b039a8033341150f738eb9850df5e0459128565f2bc7a34939c0863348b5559c747c1fbb30d3c825486d3a6499eb82d2d9035b0c861edafe0c9985a6c6e6ebcb0cc8e878af93f2d900e3def53c5adc1e8cd45d7c9851b6dbdf290838190219f7fbda2445fc739eb343d09b2095bc65022b760448d957a09eed88c8a8e3ca1c432df353958ffa65b400d0a6714c84f29fd915d9e68ea8117984ec4671bb3389ecc3878187d7a5cd7ff8b6983639264c0db436113c2bc5b5b999d0479fb8d77cd2c9d75e05503cfe2a16b3312c61196cdf5909bdad3828932ce271f6ebbd3856a9241109e5d70fb326fcb495b809991bf8777fb52a2298923fdd981d276c1091a87b1a2f7ef87305177c64545663e568c06729a818e636c9f68a9ef6c1b4adaceb00a6d0927f775dabda4d553ba8ce92b49f080f20b486d3db1e03fbbc97dfc892be248d6dc2ec0190d9fe575554c1f617d40a3cc7671b8bb7e1adb1ab981b702dd50ae396496918d91a69e4d978b471aee8a4c8f2e346f144d50c0807532efb8faac48e62c178e +SHAKE-256: b0d33f40659610fdd9da3481e49bd6d85676983df84ca10015c683fa41c5c4987064c14efeea5365f0d3c1db4a4b1d190ad9ccfbab976954f199c297ec9e111ad423adae6c60ffab04ca6aa2623f87c1f3c5f5771a50b24f730fb95e27c4537af0b277718fd5087d24a005d32af1c177c1c387f516277a5104b9170efdd940495a4f505af4aa9d20d83a7ed20a113e422869515d643c905771bbf1fbc66057b119f1c0015898b77c2d68c0c6e0d4ae400c7377eb9e105929f6a697b59fb047121a08727ad4071d66143de9f7525f66e6f218dbe4943d382de82e025e49120c3eb672036332ef3946cafb534f0b3a61371cc60f3a247aa559b388947c364de10083f9292d38a2c77107550003e32c10ed783db383487873e95bb33c30c93756a2f2675fbc865c1b1f21c83247f1b87deae3f54171a23e515f1a4ddd25d1ea6a239325956c256529ac8b23b8e163a42c780150e10cab3f372de24b8cea3679076d02a6c4f63050846d7e486192fec2ff476ccc077ad3df342f5b4f6dcc470884ffb6ab30d2c6bd9a140e20f2c2073cd8bdea4d32286af4171ead433a5d8b9232975bfdb17967619cda8a6a7e04415a53c6311d7ebecf907328c550a3e476a4bc19167607871b6a7fad12fcf6844950608a0d2da8e02a69372566e307c11e771c7919633d3cd3f11af57e11b9220ea52d2c498bf44faeb0f4a95b0a8e1c5e216176 + +Input: 9eee7ec7995143ab91f18a10856de919ab0c8e4351ff526602cddf5d1290f1170ed5dfe380f2fae2530fa3d7a364863b8a28f098e5effa1f5b4c037385bed19fd2f7eaa89c7ec5dd1a17072e54fd1ca08383b82832767595f0cd17f9c4c82144f8aa15819a7b6b717c68f4769184a11759e43676d7962ca908f890cd97212e528e803b4ad3b32d75770648183ff09a66bd61d2042476d8daa8146bc9e2056ca0bcd88e5500f3b2a4f203f4793a67a1adfed7017b377bcbb7ea83b75b5b55aef32c344c3b439c +SHA3-256: 24d80d86bc71d691260d314fabe74d79abb479895038516fb8444f0f26d035ed +SHA3-512: 108c1fff5e4868b72c93b566fd6a7c820b13429f4fdde4b8e471db26fa77678bce206f86e563e3349e6b71f5e0dc4c5845a910157557fb37aace562e6594b177 +SHAKE-128: 88513577e4d5149257bf04b88a44e7e54e8b411838f0f5cd464815e21eefa4ea3969e9c603f84750e015e34f000cfa9cb5e9f684aafb31f472fde44a6fca8a37097826fe3db0479c9e210a9a945ae8d25f7b57b3ba1a622da1346faf118e76d0939cf1bafe5bbd01742e710ea31200d67a10a9d174eb7e9823de02f94878daaed0ed4f1ac7c83c663eaaffd0dc3ccec83e9cd88e8f5c54d3042022fa380e1f8a06a37f31cb1b44044d29cb6a25269eb87bb4454aad79929e574b170ba0198ec48584f9937c77d33debea9e7b1770bba7cd3b2eab070030c808998b165c80c4d0f2360d38b95bd79fbd351cd2fa8c7c51d9d8231ca4ff9a4212a1106843bcbccf5c6a92d21cc5d12ed5f99b04187f1fa127ab7580056deb155ca8bb01c4582eb7cc31a38dcc2e458f4920ccb824036344b4f7346b10aad5cfbe2357947ad4bc201b7162f7f1a6ef9cb35c498bbb662b4554bd598fc49da51bd5c3bc6b7fd5136c28a2a0fc6dc4deffd29d06145992e8004a68b43954d299ba126ee8fad2bfa42fac521dfe776471f6d536fd7b4727abfd2fc3856c8184cde6b50e6b73283d952a2a29ecc32987935aff1571864dd304bc67ed6d00b8311ddc3a452c686f551ce7c74800ccf4d8813c0d4dafdc5f5af91e5080b709cbfb89083e5a413ceb0e70c7498032a91072cac643be57b4d8c5ff4bf864dd24d1c2caa581f95740c61fc9c1 +SHAKE-256: fb5b8ecddf4c95c106426713d89b464a66595021ed53fd17fe012a9c37eb8e7d54f997858b557d094ce8e1d18663e7c2ff124e594dfa050403345e99be4e0e8cb3c713da892b3b8754802504619489000311bf067702c1a21a44261a701b21b6ef182d7920e81f2c76cbec15ca9740708596eaf7b1b878d58d6c1be1db248bbcdfbd996c2d86e5ca779b1b72d0e0265d76ebd9f5779779e7e986e177a803272ea9039e2153ea8d6087eb984f83a63a1a1a180257250c3a5566e0a2ed4aaecb04e0c1dfdd9e8684e7366ac1cac6825d96e2ff5a5c8f5a365d09bf081dfb8848f96e33ec3183e308313635ece78cc1dbc1c869f0cc0bcabd09b8ba6fde3ac36b5ef20583f45c9439a98012728a97db2d65e182bf4c26de201b557ab92d041d2747d805f2416d5c911885d84cb3b12b27b38837f923945c36530f7ad3591872dd01231c23923bb5c2f31aa0d1c8c9252aa7276bd53784d93a9ab2804964a5170b238892ba4343c82623ab20f7eae286f8a379c4039a254f15c9b1955af20e6f5a2364d170b9524a51e91458a073677ad318f35e5653e94dfebb18c9be6a5c07588740578c93bad4a499a1f6a593b4e486e961e1107879bac965d23975c58d4cddd0c8fe31ca6fd88c95edc7bf3ea719b973583d546139639ac44336851d2a527013ad8f4f1e623c77841d803f6d0a40ec6007cce49ccfe4f72863a5694fb9db5f6f + +Input: 1dfe1b84fa65da0aa11f623559ab798a9f4db7e5eb30bc5f60be34992c82db2c3187387140a75ea2808c04bfb844ba804b595eee1fdefff58a896fcbc2d09304bbf8649bfc7546ea5573dbd20757bbd15834f3c54d7535d9d190d9db705996575f31c59486950a7971cdb657f3f41b307de24275244278a183b6472e3300795569572874bb9d4f7671c04eab276ee65bc83505fcb0a207db459b0e6cc47741b0ff2bf60e8cdfad5c557662a6b2e34a395d817185e007087e3875d73a9375d8528e06ac677cc7d8 +SHA3-256: 555e373ca90834513542b22d2e8b3db8877e485d749c7f73fa40cbcaf10b7ae0 +SHA3-512: 035bf9b5af6c98f72961f939963278fbe547ec06689c6ee9adf9bc7a8a2d66c501dca0cd5cc990653e96acd7fe580d06815f880b3fe467b6cbe892647ebcc62c +SHAKE-128: 1251095f90fb3b5069aacf203606b628867505de921077a0184ed4cb954cd6ba7a801178b1f0a524d878456007737a1506f582b4f369b45b656556b4f4c7e72d07db9485c0c9ffbd30064a5e4701f72dc078cc43afda6fcf74bca6e1fc611b542b48c67905f551ca2371da1bdaf84be20f23c89d5b10a3987d5eb110e9389b9953420a4c48d846b19f21e38cb0f089e92e859c3d2fa6e7c2e09f52b9d0e24f8f4773469321116de360ed43b6f4e24f7ffef7e6a38d9e7c9cdb54d6b523b1c1eab75270e313e5bd954a363c47b6b7df69cc9f0b36ff1a944f032f1499b00e138ff21785ea68db3afbb00280d9f11accd7178a9739b5030371652feaa0bdf51cdb5db7321735626f55bc2f6daf6b7bb1d2bf586aede1da4adbf7affaa946774869bb6ba66fffa7d30a11317299ba26aabee664614e000ad0ff2c6abdcc3354fdae8cc3708efad5db14270475642cb45ac91c99478c98ae094197becaa7765c6377df1b5a51f633feb4b630fbc09dee1122e18b72c5abb4d0c3666816f9712c0506f52cae9cbd8435536c0f0c5c803c656de90ccad6efa872050182a5c838d45c98245ca10887df2f05eccd820b3e0987af792acb1a90b1be3c52dfe1a6c720966f54a42eb4acb8aa7fd81873062fcb38538895416819817ab0f4eafa2f6da4ddb4e78dfee3fb9d5cfedb0336892ebf89b7525d578ab6e66b94a4d0e9e56c369eeb +SHAKE-256: 81fc1f79ecf5f5d228abe7bc20670e477bc9a1e4cb65d168e114debb0a0831b2750cb4603410ac58a77312ee24a77174a2b8592a2763cea9ae3c6c714d1c989446bcc612b8ac296aecdc9080e62509ac614dcff0d806e0b9e855214e1df18166a2f1146e4c4a1ba475ebdbe6affa66561bac4a69ab35fb645332d58ce3473c822892bae426af896234ff66d18e512682cbb953c63cde1fee6760ece353aef70f4961c3240d4739f830133153f6945333ec87dace6eaa2589e1c541eaaf787ea42fdf34dbdc90273cef52df7debc482587a23f2e300305246ecdbe2543bf7c3cdcddb1c0b85f324470e7d6976db3c17a36e7197fa5e7106e189f1f4c34784686e51fa2bb42dd7ea78a6cba5ee7cc8136151ce24a3a376a91509ac6244648fe5e1926151a5a2bd0a90c1978a529a31f5b5dc3dfa21b02c34f1a4ace5ff4048613b5ad40ab7cade27e1cb2d9240e3a49b1f26acbb652977f19e1acd7e8db9b4deb174e941d55dcb23e277b9423bfa92408702159edb40a173d134a501267fd4412320a0a71cd5c633d4d9a9366372ca0b966b3b0cb260f3049a7bf969eb8d1501b4d9c2aa210c227ae4e6ac30c41407a9823c18ff5b9fd3308fc14b6c3209dbd9cf45ee35bde165031fa3c72d652b3c218631a82a78cd1e835caf917f7ca1f4b03136b2388de081ca80ade58d6d6102c5d8ee75c15a6739798fcc02411f3cc5fe82 + +Input: c11927c2ade33bfac955afb6dd1338a45396a761979a1d3e932ecd62073b121d7007956a12a4ee09701864c6c781a834278e0923fc0449cc14316fa7c89876261e37898bcd39852b8a78ad233947cb0e62e414cdf786ad89d028bcfd6e1a53ca0e197ba139e15d811769b0206696897b489ab154aa9fd0306577104f8fb631f398970c945b7dfcad247d6aa18564144f27ef7c13955a63dc24794fe8600fd2880a21b29aa55d42a0db2347bb9ce54578a4b023d98c7933cd921c3b7161f6daa802ff721641d0fe12 +SHA3-256: 70064735defa8642da9cd774773c55463b81733d850125e67c2aeb08244ddb85 +SHA3-512: e4fc0b3041f7298f695893d173d94c595e2c028fb7b23492991a20c3623b2d37f244d92e27e639a7385d714c3a158f86a191672e01c35ca1bf5dbb731edf4bd9 +SHAKE-128: af57c891100aa0089ba5d96dca42c084eb3b02ffcdfff0bcef8642b5000f2f4cd2021d76790baa1203da690a02f7de4cae0fe95944273834d11ac6bdcd002d3e3fd4121ae98bea396298e6ef991ac9516b4511b57f92137e528b991fb81db14d58ccf257c3d37e21bfea541f490edcb0bf6e928b3385306e70de9dee67ddf099d1f2a2a15f5c96a3b968ed88f50380eb874ef1ceff02d2e358f40a2175ada198f8ce1f0d08f53b7f06f2bee6c789da385696ddd986d14211fe3c44e877978f6fbfd4fbabf0bb80b222cee8c3085709961827756a2d6f1c0201cb3cbb834999f3e862d9f5ad035b943f77cc23603b72627f9bb29c6fa637792cf50721d6d0cf434dfd973de2ab35fa530fa7066db37562b97a7ac6dd107b9678072db2a0ceb728e95e8b480bce123e43d5f2af554de1a4aafe3a6d31c26734338d75dc8fe8123b5f8a81105f53e06431034cdd5a2ea7e7d8cc641730a865a0b4dc507e3fd80517f0516c764ecb5b614735b3bfa0fa5d04a047589719852d34241d62278725e5138741c2c9de6a125be04d5221d747a259c4ba0a5f235f35fef1db358d5558d37c6f9999d894dcb123991ae5721809ee14fba97d30845b256a9901d7931e907888b9c175340eae9a787144220433178e48e7e808f8d34392674fb4ee6a2cb31912f7e1c020ef1ae906e8d2de77db4d4a477b50ccb245faef6769c940c7ad7d13eb +SHAKE-256: fa1c24dd4017c58cf695e7a3af75856547d7607d2c965239e5e8d206458a9754eb637dbdb6b48d9443972d2f51834e6435c892a64f883741b5f865e9d60137f2386c75076c02992bbab60d1031f35c9e7ef6e3708d5633fb2f14efe2b4488e0996c0a45a736bf89b217ad835e9f0819fe9bbc70eb067930a3c6123e53504a8e2ddea81757784a8d80f9c3f184740ae825c11ebbc9b80ae3b6b4bbf993949ef8ce6acb1f32a6a76ab2de4e89d0c4a789d9c54bf8fa6a8725bf5ea5094951cf5a82820e830cff670bf54b92053b4949d5e10d5449d2fd61cdca8750399caa0dd4a169e1b00206c813400ce4f9ab0bba5814c601d70907bbc6b50b843997a71f2a22ff28e005d5825d50f92fdf29125e27b6e135c5991326a3aec15866db6375dabdd89167838ba577e38cedd0dc3c8928d25161bc263843fba41803dfc4c3932804654b47ef01c54deec99d2e5f2f24b7d2bd1aeb7bc31cc57745341fc7035d802a5e5a09b0ee292c108d37cc63550ea1e418d57e4f0a90f275325b2b61476580fe8f3ba8c00a7fc77f8a10d702e7a399fd47cbb0e29471cb1ea549a4f7c99493883cd01feae1b30d640969a3eed8e960ef9ac59a1c3f61d99a019e5a9eb3bbf0e85ab700d536846b1c683bfbf59359b02e911dd667c461802a303b995e39ab16b03b209898b65c58897d96467d7a2898a23032b9850027f6ba1cce19e1e540580 + +Input: 3ddbef8224fac0a3af319645757f8bb76d06d8d4375dadc9266f15049ff28b2bc14aeebbabf0ccd4b2900a1ffaf7d3091a17bcd7c0f9e862547d9d664ca5a06073c21145d865f8b7a23de1104739b2d0c621fd6702e247f53184983bf91ef5e11bc3093e697409b59c90981e3ec8414277ad7cc145e4d425e5ff04ea76f6501f5dcfac2075c46b77209eb16e02f323bb9036d0ba48ffce32f7e3c8563da166690fc67ba1719949809be9e8db9a4cab38ebfc9bb2877626d50630e901def90ee9de4babb76e6ef58834 +SHA3-256: cfb5a1a201ce6c46ae2f6d6d952ad0a9324a731bd22a7661d3f90dfb70bce7f0 +SHA3-512: ebb6bcb1e163a448513b4b071ba0c1b5e803b3f127fb3a826aef9ad3896fad5e328aeba88cccc04f004f7e9612f964cbd69601033a0b4db574b888c87c83005c +SHAKE-128: da74c87906763c794c091913c641a50c9d6e2fcf130122dc871792043084ab9f294f98df4d830c863e975f46fd59f699e847eb4bc03f2ed497e884a35b97930c1bf6afdc4f7e48cbb6ef5f0bb79dd3d573894ef4412f2a77595c00ea7ee450a1add6a9bd2dafbd49870b4fd27b03183ef2aea104649a6c7b8b9dbddbcf72c9ebefb50befbcdb806c2aeedd720960e51e72149f58107c75ad1a1cde245cd6f26c5d6ceb1ee2ff215b714009ad4b9ea54c25f912e5c4c59e03dddcad67b5ec0ce1c1069bdad4fda097bc354d88c99b888aa2097dde3d07ed5177385614ab3c696d3e72ac8be12fce9411b4d56e99fa4e44609135c5e38b6ee2f19e328fba3c6168e849c51c948a005906ea4d0392a3b7408fa7278e7f81699337d787e252b64b701fe4bb95c86749b6d7ab60cb5cbf90ae04e8ca24cd4771bcab5c95a5fa4088fd57bdb2b195c01fcb52cfe2649800ccfc6183ea8cea887142189f77f6273ecc164c452d885cc3e937fa72f9d56891d1db0291be75d7545a76c79f74b943d527f7a7d94d33e0462483cc0175e1cc785aa1f3cff67e0822d7ea0d38ba863e7101410b6cab3a7459834622d7391576307722d7ccc92cd4a63f04aaf5793bf6c59465315d66abe2cea88e197196e6587df6841c489ec1eef137c0fd2225d235ceadea3fcf848acab3a0296c7c4b85048ddd3594ac95cb7983e6136af8dbca72a0c73e +SHAKE-256: 3e6ff49cf6311f87846ee961a2ee2ed2b8807690da2371493c39af4de9bd3ad79f44860c2d8441fcef8dda45215de8211ea00c1d55b63ea359d141366991142b9719ac417617dddb93af36f8ab53442513f3ac7da455c516c3174acd05170f4ebcf919d579fb526750ebf93db79436ccd87111d07a367c66fcd5a5dcfe197cb257af736938169e102406bca21f595cce3e8ac626048619b0591fbc8251a7a8f4381a9e2c7a9e5104c6ac675f7893b096708f969f66e6e308067f746d4b3e6a2085390731c70bb6f48fbcd8b5cbaa239c8149ac4de8fbeed8c4b4108cdfd615161815b0e2443b958f1e8d22c2294eb6cfe72545f1a6c85fb25057ed6f7c178f89b37f962b5f43a343fad9f2103977fd00f2ed5586bd6e5495c7d79e0b65356d9e2334992d6b665a3f6d179dd8ddf238189d0248bd2c179192e07ee1eab5d146840ce4963767b3eb9bd5a3cd97016c7a367058781a81d6e46438b8789327b36295cdc7f3eaad4595c77d1a6c471c525fa074ce97b6503046ea81a0e0c9d42bdb7a44e3622d3a78ee8f6eb5456eadeb267c7cfb031ac2002494b4b431b96ee36058dfad76473b864f02d2b4574710d931c852f9cc83aef2c3d02959d614ae40738bbe4a41c60eb267a2fb3a8d50aea90f7342efc658897019edc441e611fe573f920fea4cf93f291d2ca90a36fa4c9301c6ef45e68ed11c7b861553712cd2cd4be7 + +Input: 1552163018398990dbaaeb57388d99b163d50f37ee846e5bc1f6eb8e7c22b0c2e2f7e8fa93194a8c5620cf711a7395a5f27deaf8fead08984ac2c06f4b7dca2e131ffa137b8cff98c116a333c0832c8745c8704780eb11b7bd0a418dab3729ab15641fe6a379b967e9ed04e127b1e3bf8f9a20d14d4942530638f9a98c40b4d65d85b9a48b3260adf1b87508e46501590322c86b5fe8502d33fd43bc53563942bce57696ca83b5478525056d18130ba9fd3a08d5f8159e3ed608a2d2ebbbb397fd1f35fe11a8f2d98dd8 +SHA3-256: c07bea7da35c1c005911c5c44271fb322a0ce939b2a76204ac5a2e6430a216f4 +SHA3-512: b1e985157bfa9a886bc7420b478567f08770eaeedfec0a7db27fec6c7ccf2fc6fd83fb652e8b4ff3abae6adc8f4e6788dd1b772c6ae40219979f1447386fa682 +SHAKE-128: 831b543331de5abee4ca3fe2b6af5f96ce136c6b2c82d7138f51bd00339d1fff001a9fa6c0731831116ba5b6970d4b80b3223f99f311baa35ac8417569a35e9e48c844d598e11a6de2fd1cf693291a44be35c5ed86dceddd0d5c69e6f40d24509ccee1080cef50697277a3e32fd720b454915b8f77f1e9ecb274887140df62a715bf35b32895f3524eabd70742fc2c6ed863520117c3d5efa7af1dc2c92035c647f29487d0ff6712c91b5a55fe1206a2f3eed6445bf77838fb0360201d4707312681f166dc7cd35d3e3bef4232d6cff9ead031ec349fd7baf7bcf6605b4560fff7689dd72bc85b4dc8cd62c594cea068a4d1660386ee50ce13f5237e196912eb4e17e883a26f8b9d4ea5264ec5d4e13e9a6305460bb9f398fda9465ad2067d1dce5f91a0abfeb6fddd2483fe613c339ada084f177d0978421b5300b616c5506a57d4802c19e6d09b598ce9e48b8e1a4a7273c1e70f9c16ad833b32c3bea2452bc2714e9f9c8fa61fb9ec1f78544bba00f5e31e0aad09938b14b8a88227c7204055fc4a93f7bd3b718520576a90ceb3702ccdece515e08d4865a80f3a27d01830858f860f195dc0ef551ac474840539208157becb8da58110b668a32d8f074eee8d713f67619ceab693414b2867a338f20a4efc3351af77704819292726d8612a2923ebc2477c749fd31e78f78255e805d23eb75364b5925015aa3e152e4e3ff5 +SHAKE-256: 6124bed8a30fbb5b4078a27326a068dc9bb6761af1c08d88041e3203223a2c84b005cb470bd0ac9a8ed2e93220e0ec1164a078b1832a546713c1afb525b263664d78d3bc501d3a9c629eb9fa1d28d42e88801b8fa59cbe5ce76368729900f770d9eba4aeaf4e259691c01f5d1deea9ad47a3f1b7d54709c14a1521ffaf77a721dddd2dd737ac6455c9f006368c40deb09f560ca5eb5f0a3f08ff0f71896c75c6d7502792f807c3947aeae86fe9c99e9402e520777be3a8a561b33ffad60ca318ea4f8a537a60e86832514af902f34c01a11f63490ce1f1eb0b1a8253666179347fb063d6ef222bbbdc57a219aa305fd11f329a1cd4d182fac70b238a35f250a7159dd5a6cfa1271a1784beea67f8537a883da8f53d72a1556676167e906e24978e1f19cb5d3e3bc3a961943d0b5bcf211184ae2ef157b0e4519d3320a36000412c3215f04c7df5ecf6ffa29899c8169be7451e69f48d4ecf042337a6c084fa96f732d87c7369590f5211e98f2de5c63353482dd315374ac0ff73886e8837f1f79229ba02e9631ff7fcfe85bc768382100a10c5602f8b498f5e1159692087058d922507abf6255ace5b3296d66f1e1cf9f08661c7f8373224b1eba70222b8f467ee479d25683f6ec766e475a35e49d633af2776417de0b3205bc8810ec5f49c9f628fa0a9f3dfde39bb576d5c50c95392a4fcdf801ddbf70ba84a263ac3cffe47 + +Input: c11136c92b8d9aa938de9cc269696f4b56b0d5969756532cf84b34bb3e33b4a06a732bbe5a9533df3fe2531aedf773d864676ca0ff78bd62f49525a843064a59754d94dc22f7437ed9aae4c82f44f8501c0ac57646d031791b13f445d1dd42e38af3d0997d8795fc23de60184e86bb6dac77a05648523592d34d71f03a1e506e3eb1ecd3ad9162e65ec2f999c4c5360558923cade2540e1271b8c6396c21ff7c1114819e83d2ca25542cedd5ee9213172cf0fc9a4219632c007601b40b29043cac6d45763f57ef22c8ce1a +SHA3-256: a9500bbd85da11e66772d62d977238050139447a7620b540666230293edbc633 +SHA3-512: 1bf23364b4726e869242885352977179efeb38ca4bd01ec966edab3b2fc8fc7addb21a6f3ef1c85531b43f11d1f5ef22850b660878a5c5f9ecdb2ad72e09377b +SHAKE-128: 3ad5230641499a0bd303cfd43c8f5486a25ceb986f695c2487cf2822dd4016d863da65718be13ac3c3b5c255d041a8e7b38ba5e5fe0febba7134fd5f80be3e2d36fda40edb2f97c3762506b6ace923265e63e18d8e060eb4a481e870151ce20b6833880d3d0d1662c6804b1ae67ad64ba02388106a55eb93595ca69ab280b74694ae9a64cd3b5a981b85385d1c9f276b5f49021c0058a5b80be785889db3b77f387cfdd62856be020ae5c9538be2c20cb78eed3bc121602d4e61d4dda3ee12b912fc3ddc5f4b731292eff10bf62d2ab5afbfe92505b0f64cbdca8e7e2b58db85ffaa44797c4a87c32320465d5ade18d188d88e47cd970340dbc2130a38c3017287f705033c9d05949225277c4c12e057de6419c97ce053c767fe4526921c6a906e57ecbbc8a3e09ef489c824a411a6dc5d508cac57bb56e34e1f1f9bbf6865c60cb913d78cb1e5b20f9960bb86bcac7d62e39f7041f0776b23912f9a5de52eb3ab9ba7bc8b116549ccdbf9187ff5a49dcb805dc2e30a90f9c12d801aa34e31f50b3ee20f3962956a057abe903c69a4a417da7e9c7d72e03f41f2bfc68304b22d2c1f2224ddac0d35df43c816a23c229c1861a10c7e3d7b963ebdb03ec615208e11edd9f9e7fb72acce10394a40e0a9a4245ba256eeb29559a3af31583cfd4534d08b15f0dad0f9c86c809b2ae6b5f87e71ef9fe334bf935b8f0b983064c2f05e +SHAKE-256: 31698056280c2e57e4a420a83ba172fedf4105b31eff4f8c58a5d6fe9e1aaea459a86db294e8465276167bcf5518d315e976e9416da8eb713dfaf7a6f358acd2e57da6fe2ddf5703fd609e728e133d2baea917b41dcde4160db3f66d1f7f4fb2cd4afd8c9906966f62e0ec2e811c2cdbfb02dd57a1020ad5759079efc76df6802c2a39533edbdcc637c50609fb634f652f50d9d3cb550891d224b89247112d8618a1c43472029780236dc8c0ccc329a75959e97e3db96b256b3a70bae39a296624e45ec68a6f07d1f35a2b475e5820b927ddc3d366be7bdb15cf3fccc3a2b5f870d9505fc0a0fb1f7b4c4609470feb6eca4d4b572942112b098f79f023e512288d0acb55e3cd8206f81fe81e2eaa8996148bb3001353f539619b3954c0bf9392ad2066eebaa15ec451d92cf301b4c436132751bd43be225a62afe08666ab8c77ce9cd8b225f4df16346e2b3a6cae699a99c0ac98757de3c542d22d15021da522a65eda0414f4d58d02e62a29f22af040e0b3fad88a9c31dc168e3769b928d960fc4f560601a41b8a500f7897b496372f5c613ffa180d9f1f1c46a5253001d6d9d6478ce799311bc79f8d5ace15127bb06745ab2d56fc3b9c86e97ac268fbaa9fb73f22555837fccc7bf7189e648b60d3e6a6b1620ab5d5addfa756608f74c9e2c57b38c1e30311c0f92d12dc3b3368178b66318624d7668e6ffc613a6eef1569 + +Input: dcdb25ca178fc0bca1048cd3535960af79e886bb5bd18f9d2bb06303b891b02c57f442325e1756c303d66afd8ff8898cc724d2ebf82702377afdd42ea4463ea14cafa13f74de1a74da0b80dd8b0b13b77dafbc92da60146049f2474a9ff2f2b19c0e7b3a87ac095ba2ba3d8b57006510c7009fcb758e975410fc08f60a74c92bddd67d70574958d229c2b4d1697f85168e4bf2c1cb9fc7968b5a07cc944f933815bf4459353739d2b57e3feea5cea858c339f8f8a8ea7d9d8cecdb579fbed48a6f6f6cef538ec3ea4c9cf5f3 +SHA3-256: 089ff30b624db854f7b1b68813a85d4ab4de42a9700a086a99ee98d3e1ef302f +SHA3-512: 17ca2d9091a0de2115deb30de29fc4b1099167d6bb514a975a91b85ff2dc89b5736db54f0363497625924e61de83fe84e9ae27428fc181818489fdbec0ec4910 +SHAKE-128: fe8848fda456484b74f009c900032f96ecf8456ec7c56cf7c866c23a2c8cd23440d337215072cd579be4ce4d7d0bd6835106a125144a25ef90062b48ac934743a78d20bacec0ec3f718696dcbf6f3a89bc27bdef366786d5c5af6901d8d7c06d53db921b394289e6e01e8d66519a8a54a9410269de54534165f563a51725c66735a200327a19bdec691ebde7708631399e7e145d9399fa36437090518ed5825572ab4be61daeff9abd8e1a50d844c5bbe852776cea4e009179ab846b8d6e83a92ec2c3fdafedd6279c7d941c9629de52473244fd90d11314deccdf6d62c805d67a8750c07f9dd03bb0a407949b79356d89af5e262be5b47d749891063bc12fd36593f2a757ecfa430a875b7731b829e73874d6b83897731bca0f540bda0e813e7fbdbf8b21b001fde843e35578309ee93d61591a693f615d29e91a70acc8086b73c55e28dfeec361b0ff89d99a95c3284fd26e3605fe96d7805f5f67899fdbaa1921783ff4aaa2d2c073b885b8b96cd92a1e14b910f735dd82decc039b09aaf6de6f3db559d383788b63442bcea94ddac3b5861732422e961a177626b4c8786e8565825752a5697fb629f50026524a7452344eebfbdd31ee14543e6c84138a9407580da7f335467bd3c33a60db2e06e260d6c23b4c62fdb2f85a466cf29eef8ec8b32153b8543c6e809962ff4a6b970a209f0c51606c7ae69d02751f39072366 +SHAKE-256: 2fc48c6f95072d0e0d9e1b2aa9249befe1450f160d0cf975cc0204349c94a40913877efe8571482553435671f6905f530a72ad9b0a44c7d144d86b91c99a8c612c41a744d3ffbd08cfc828bcbd039e1ffc737d70627c02fdfee4ea93dff9cf70e64c096ab43efb39757e60999373e3b15b6dd7a35b638e7848a0ff168ddaa419034a058c9d16fe3593838c7b6d79c21c8aefb97d6bf94379cc09c27ed8f8c8274847bed48f5fd8bdfc702905041eb6855922d85c47e5904fa19356835c246278687bbc919e334dc81ce5a2fae0a58baa7445d005f338dc1ea4707d0d04721807c4f9e84e1ea9c64d95ceb0e8078836d1f7a732bbd1d0ddabcec2ccb76ec6c5ab4fc02b1b69ee86d30a970abe6f53e0cc69833259c9d5def0dbac653885a8fd2a7b55be9c9510465f9deb9204d08051bce870d0bc00d3a24d67826fdae6f29ad2984a119dfcccb41b008ae190f89de4da96b596b896f2a9b0764af0b3cd2b1c44db4b91ef1f13874528e1638b40cddd6c9b09a72cf901bf48f92917e977e1441f5488a0b13775f45fee7ad406e757dc3ba0463a2203463c7159d82eb96f03eec2eddfdf9ca6da3c3fb54cebc8fe1dac05f5a495e0b21c97c69dd83c9d5cd6ce881d51019dc93f7682c63dfa9d3bf3e0a770782edf4b9d0d0a323dab9725c28094c228b60c31c5dd207f05706f08b8fc4871d9e6c58a575467d4b46fb7ff84a803 + +Input: acd70a34f0426bf20d0264be87d453efa82054898d070f5e400b52bd53aacfd9509becdd9e415d3d25439257ed8748675e86ecf9376b4036b41f89a3e2bb93c939a95db0c24c27728a395e99ffa3ba5127e0697e9465ce4bd1aee082e5930cea524e4f954b581d6cf8dbcc2968b66fccebe2f6b106f43683b97bde945f9a860a705806c44abeb87994925ff4888ccb17a83bbac11ea47a4ec9a40bc94104b65c2d9808b92f698e567559019f8a570377fb92abc085d09c0bb437163dcbf6aead14f89f59d5726f239b73ab96fb +SHA3-256: 0f93d7248c3b4776724f006bfb74f9fff34ab623e25cee949d53d8b3474d6dff +SHA3-512: c393d5a07a89aae37f4486c09fa28fc0eed76b002b8915a1eec3dab0e5d2b3cdc03bea45f8fe8e4c178d49ddb160944ead326b9b927d0b44dac858cde941acec +SHAKE-128: 6550cd8a150961cff12964b0ed5bf155503f5102e9327523750cded86cdf1a6b44c1a7649d39565e382eb595de1b79db564cacce9501bbfe33c17a4716916170158096c86725baad6aa3ac05763c389064f7be14bbe317d09fe00a667bb7e7aa3a6c81524f759c1f83918212670b678b8ff6d4c5d4b36a1a237f7794afcbcc7b071ffb39fa86434a67aa2ee294b78bd4502953574261198ca1bfe6027adc8f4473ea3e36b58c7e2d1e575be5aeb407226dd513976dae33ba6c5c0949f5e6036981eef16fdeca37184cac62282537a7fd7f07d5fa355fe335b07579c3f1efb71353d2d863f497f68b5a86b69cc2000250fd4df82597a33f8220c61aaff387b5b11087b872cca579d2c0c5796a450e7203c2587a1e4758b5536c39141366de4bf77411c1f4b1208722389fb79df1d40dc8358f9a6826a46310cfd43eee217f48bec498abf8ac00f0775e397fecfc96eebd01359a23c619234a22e5efd05dfe1effd7dc7c3606250d8da7d7dd1d5d52f9412f05a42d14c7151ed143db5fdcfcb64c7dcaaeb6b2d9935eb2880721e00997c1251260287fb7d2856db1da9a4a65291b8906d4645039266b156377a67328c1a854ec8d038af8617a1006d97925389e3fcd9b3ac312fde75868b4ebabc1f1580d04e86402e98195adea28c8ea57c30666b219fe93bbbbbac9b4d2baa6c0f44659810b8b8cdabee92661ea36513bb96013 +SHAKE-256: 36406e60d22f0e0be92207cd18bf12878b7d7e8ba803386b3a6b4849ef5cd679d3832b74509c2b14169018aed9c37349f0457526b4d7e2aa8d2d160827ae749e4bd435c66a928f2a69d576048c3869bb9d862a6a824f6ec79abb6882f9a41df000840cfbc00bba2a5355691a49db965f962926a8cb3c86f58cefa346467da937b0b7f7d2cd9a5eda831b6b4c6fcb9d0502cf1ad4d2e805631ce51a324d959521ee91500082ce818cc93e1016575dcdcad08872308a208de121a77843ce75c208c484cb8e9421e87161458f3f3fbf15adb4640602065d95355d7531764cb22458f12cd60899fd9b14c698609b32d165d74ce85473766bece15cf80d0acafedf7fde0235ffbdb2129ef16391a8eb81843a99543436f1f03e0bfad68cbdf141455bf0d3f505a4ba0c563b3a8bdd5d8273bd0d19c3ba959639549d381f9f0c065cb6d0e0265c2851acfa82485e5b73ec858d559805daa56b3e70a83ae79fc2ceb6ecbbec06a8004dffc835d41b2a7d8b6624567baf02c0ec27a635362b54882fa718168cfe6c5c4b1f77b0b4e25a4a547e076be2c7fbc341a1a1a9b22d2589fc9e52930c6fd27f7a1d10df4e740d0ae7e15f0b8d261d35fec3b02b35fd2d2c85a6819c8f53c6b1102fae799a116715b8a925e5e240be1829bcbce46b4916221dbb9d0db764b33e99f0c5048f75d9ea1b8f01af8b83559e2ccdcad2e0f7bcc79c7b36 + +Input: 4e90ce8969b68ffeefcfadc432a86bcdc39098dd92bfb2cd5e9b1acbebb385e70f4092aa4cd02dce0d8369f2b57a3614e66ca2dbecdbbf6df226ed245853db753d21d8577b66fe9ca963e88d4ff30b6d936c58908ae792500175d8bd45febf480001201481672158acfad3f14c008f3db542c16d4b71d5586e2606f9170a50dcfc33ea50081647736fec46c4a1547ea7cea95f51330e83be02fdb895f7ce8ff7e62e41fd5bd70c6f2b48750293ce00666f1ceb0deaff16b5b43e40b039faef53466332b46429224244cd9482ac18 +SHA3-256: 7667dd06622391280d854179a1bdbec9249227eeaf8f82b971a16133058da242 +SHA3-512: de169250b9488399bf464a6b73263ecb5007d1a5ab1e786ef1fba3118d6ab91027e20a3c9f57e10f69ac4e4c83620ba6b917e910d826a6840b11882e55b7794a +SHAKE-128: c4f61f778edae5db2b8b51ceded98dfb645490247b4419ed439f438da83f9bf521c12574b12770e9c38437c9c0d948223f4b09f665a619fdd250c111a9b99f000224ece192e85ba46085c1197b03442d5a9cdd04b6796fa0280348fc7c3bad357688640dd60348086a34a11cfec642491c98ab19bf582f80969e4a72e76415e587962edd6f9d42d25954eb47bab82d1fed71056745f63f704d71779dc75969b0e9c7f855d2d7fa2af544d2d99ecf73c60df1cb85d8573a28e5bca8be490a9907174577ce0c8357cb149462aefab83c64f9a67236c62c2b8a8dbfddc56c445c472798a77a539c216762c6be7e2221d4e969a86ded0d84f2460a954118c3b0dc73cf312a351f9d0d10c158c5df11f300bcf3564942a72fe80c24ff85203ca7149f1c678dbb75721fcde5e0e72ff964c114af2f38185b7936b6d8beb20b6df294852aa7e8cd8caaecbf8a203d0bfe5b5f864556fb87c18f15194128e740a99a4cd651a915e0443a03b9991d7186cc5770187fe34161054abe22975233af49ebb768ec9bee5fdcee98dee114c11cbad23686e2f9ab6667861dcbaa88c6cfe66c27d1eeae16270bb15fa4bcc803844f7b966f7e739a9ba1398f4819f1181f2d125b35e31897d0117f91afddd3c3dde7b22fda5038a3b00a0ce545a0dcddcc032f991923b7ae5584eb1463933e40cc114e147e01039b3df0473094585b00e7412fcfb3 +SHAKE-256: 984160c1135c12fb386376f00c871459da09ffbcd6b47a5f73402446fd4aca2ae233affbe811adc5fb1d1453a2d3a5b4afdfb2b2565a71333b94a4b8321b4c93d1a7d83fb5b8b533980b440c69ab0b4e90bd842d2f13d1e2ad8998465a451bb0d9b7ad1134c8e55d55bac3b4d5f9050bd5a8f59425a7490935e83de62169b649900bbca4d3660a34f31b5c98200db06109937cddfba5fcb92d50f7cc33d1aefcb0136578d4ed8af65efc8169c15584fb026361b324c90e3d1fe2a75d27209c74331212aa3a774402bcd9696d326d15e87f0d84b893b3064bcd81f88a0bb902a3ae6b444adc2c7199ac6bedba376b0f3cdb0399b6835057828c7884fab41da2b23bbd046ef0ccacb36e51d29e501f31b65fafb88071e3e5847c1026b54ca2fa36bbf4cb2315a22e742b5cf8bdf2f323e0e323b4446adc72851b31d9078af86ea5f5f91cc7351b5bfe77607fdb3bd9e42d8e1b861904d58e5940c446ad262bbf82e8dedcc04103d28b5f68b12a62f3ae8c94607526200e91ef216033ccfc411b0ec426024f22de5252e3cc9708508c1087e7eb77535c358dcbd517afa9d275365c653fb9850abc0ce4643012dfe11a77d2fbcaa0326654f2406e1f20a45c5920fff90b1fbe8b76825a69ea4e111f22e7a3352015a3e297140a319debc126b343eda2a89667a1b38324c17166341d00eb415a2591c583e6e37960e3427059a73de8 + +Input: bbdc660f4d4f05909906dc3e2af5711b7bac1605829b0d99ce886941abeba0141b42b350cb259d93e727b8850732c5fc520feaab8672369d4736fb363f9122f9d186d30725ea4e41e55e99a6173cd2dcdcd2c1e6cf94e4ee066de7bb4deb2de3635eba7dbc35f019a7b4cd7434faf3bb009c34e6352317c810112d69c36f6295de0e09af838d120efc52178323cf143377bf4c5241f2cc4866e5875f97112f031affd5fbedeac99bc2a8b63788cc71e7ca1e14750341f147f538947d2924e29f5aa8beec1a0cff67615d143ec689c8 +SHA3-256: 2d4e60f35bbdf7b2f461681e4a675a7c810babd9df333b592e90848f40861577 +SHA3-512: 7d86a661dd0b356c9c379223da7619e5032845e37e1817a6c03ccb8c34e2984bc5c70429f9cae97d417951a074e84dfb643d2944f29f488a61cac0ae1a24bd74 +SHAKE-128: c3c3941a0d0d96a7ed96f15f6fec7b9036047b66b8e8a1ca6761a636584e3865703da9af9093904166f4ae81bb1f23492ab523e1a2b3387b83a9b1c04c99469895952184f57db3ecd71ed89794953fc9c6415293f51fd83b22e3917e8d59f4dc28414bd121d18a35f025250f1feded15d92849602f5650f5f83aee160fe69a40bec54e9f4a38508ad4665ea8dba41232e652166ba4885ea336223e407d3ab5ba5356fa94d7cb3cf12bb21caa7116abd1cdba9699e08bbcad22ad7769d9a28e75faf3fd3ef7a4ee92cb1b513e0f371ee3642f47ed56a79d101693d4a06fc45fa9b9a4f2914a7a7df3ced212593379b629e5df989e97af9f2d5aa10b4dac4e5eb1e298ed39789cfde0927b576efc338e251df95483128a3f77f63b85e5670e831e1e2fc13d872ad6536dc5e35501235d27e275e710b703699937b9ef286e7455a5f42a6629105ec845e8d2ec8f4bb4a8a29498973d8e07443c93fc9ee9950e6548c25940056b1daa514bf9c6704c4d39584654bd17d0e0e8c5c67c50ff858609e23d3fbdba32ba8fca1984f4806642718fb1fb191e6582f703a7f51b10fa1a3b40f4ec62bd1537ec81770194b067d203a5260261b179c0fd21125dd9a4e699efd1907c4cfda88affb0e5604e573e25fad3ee5b2ff124204db084b2c5ccf7e8909405a5067e0a7796a3acdabe57b3a476d0f5d6ce6d8a475051ea1e3228178fe9f1 +SHAKE-256: 427aeb11a5e42d436b2775b900229b0d23394ed8320b0e30be2481fae8606684d0c7bb942aad80925f734506c2bae78ff0c359cf6c460d705f17caa07ee99addd5476a8308f2427337302dd1aa9059d15d5081565b71b7ef56ce5311de63c73f8931103c469f5c1420ce2741db80fabdf41d6b425fbdff26e7d5a81a279de41bf4b1db2aa69f7175867e46cf7c3ce8903c09f1a999ee25d049260e933e66f8afb47840a4ecd112a3e591fc9d92908c905c0a37a7660ce79ee0eeba623ce40408a10bfe7cb1cf6e0cfca5bc59f828bc7a5f0dbf49ed736bcb6e1ddaec3114d51a33c24ea46e22a552fda1148271e25a00ecc39612b4fb4c54ba559bd544d8c201757b572353a55b1d670e1d985b808fd70fca1c0a9251c5160f7eac3f5964caa72a2dc305967676d037ebfb35166515c5fa0e48ee4137957c664e886a39ae9f7cc2271a5e18717129e33476c2228a954b26d7b61bcb772cee560a6c5f7a4712b45dd5c31037869eb50ee42d3cf09a9c2f9f32b1789517ac0482ded78b36139ec9f679f178a4423db4aa27294c31a388c0d20cd94bded6518739396d689be98143d3c1c1bec3310afc18e9fe0da94cc84635ae4e71b4f645b94d8b5aefaf14ad22b091899e838468432510c11f53de255ea59f5d33656a62ea5b266756626011b5dabcfaf0b68440542a2c06860ffecfa70ef918370474f08dba34f54ad39b8b65 + +Input: 2b420bd1578ec9a8f78571e63c7dfbc33e2176cb3a2d3d34569b287b948f188814719b59292a05c1bee2b575299194aa5a6d693c9c5a55cd9d29c94abeb348f6d1272b98d086a9ebe6fc10896c55db72e25636c3fdf82e00b8fb4be0dd0123bb82fa0fd8e6b5e8b47517b7ee3a099400c3422c1d8d74d872f58abce230d4199ed0bd5d4b291f27662e5bfb1797abfe67c46fe4ca1f35770ec99b447e26a0e1a99a244880c034593a755501c94c4e1d1cbc26c5d0b18e2b557e3fda2a630b3af17f3462a8ba8165c43f94e60459008bd8 +SHA3-256: 5fb4b601cfb32de59b058a012775c904ffef06823bc10b81e8ee395204dea3c2 +SHA3-512: 608a5e8495564eda5490f740608aba2470f4e985ea1e996d76c33a41ebe0d612ff0e5f5e16d3149e6ac921d9a623910dbf23f7b9bf56c649c91736e6903b3475 +SHAKE-128: e66c647b296a772bdb0e6a5580d164b41949671b4bb7366bab9c159fa0aa2bac0e43147776e44d0ea679af0722b6736cb5b0e3be8f51b2ad56096ede4561fa762539cb654d43169832858c69beada116954b74012b796811d0171b1165ad702570cfa1e2487b10b228fe1836f7791eec22b219792f1a207af0ce1b346b02350f8e8153295c6b000b2a2404ee170f2a150832a8bbfe8f8584723e5848f056281c12cab129d4eacf053a32e7a81476744703de736528382190b1c0cb745389e7a031e4b3949cc1f5f8e576f654d7907d001fd5a64e43353bf277e96936aedc1f5448a8078cf4ff0b2806b5b6a3cbac76b09e2acc8246b3a87a708451c03711776d0cf19c16ecfcbe1543e90e77af3d9d0d9272bb93162cc2dd18d3250d56cabf4137d44edfa0872d96934be2bbb3d089fae510fc3055b3aab40ccc19ddba125df48810ac67c5fc0d14788cb38e5b4d6911c5ca49ecc7ffda8b52dfe0e99e7b18acef7895326755d430efb09b247f1713206a281a71fc7fb2e516417c29b65f6fc813b4ca3c4af93ca424e50d19a076eb19cef3517af288ad04ec82f7d9f757062ce0560c5b05c9f367d45988f9915aa142c11541687d997cd0edf75c4c38535c1956c3c9f8d1af653628abe20fac029149302f74c783c155ec7324c7b4f0921cb8a33391a3e0b8095f6cf55ca0ef75ef322963e6d5283eedad991c532332549fdd +SHAKE-256: bd71c50339cfbb3b06f3637f1603e328bac90c65c38297fc8fd4668072620209bff08e719ffc2c261009cdb441285dc5a7764ea90a0c39c275b069ea86f83029c42bc95095ad9cffb88a1604b44bef0066ee82271b0c928eb0932222c83b0707e1c44d2ddfdd3edebe2e8103a6961644a8c3e53327c52582bb73bc1ca73901bce43bb6a9f619cbc4dc83817d98530d473140dde9b3c85659c425cf00e2cec3aa31862b2532321d9be19671dddcd0513c70d046c9cf0c7f014cebd8431777c559f73577094a0fce970e4cde1854e43812b8e38c1a5051736391f5504d6a1802e3f21a1f3aace9222fe64e50b93cea4f6db87be0b4754f626c49380cefa771334670c03a729477b8fcdd4bab8cbe065d0e183ee2cd379d243040e49ecaa22e36319ce6f9166e95d9ab51a75af78281cd6abf3b103e0f650572ae99147fd8b13e845afd77d927306cb3d814dee5bf7968498886b93568e624dfc494e607437d5f9d0dd27eea25c0517659eaa42ef0c3720a96119abaeaeae3e89a867789d1767967cad91e721205c86e320de55c72f3ff6580382bf80ff22fc696f5b77a87ca0f4ba7d5bb4e4175af10ef2b584d13123c3f9435964d79175070e8582de4734a802303c48dd28728a1ace5b1607fa27a86b7ccfe4abe08056ac5c23cfe0ff771630bc0d186159b58e7e28259655f2c89c5cae65800f4af81ed96394bf479ea48fdb6 + +Input: 09db368902f22864867fea5747c106a94a1c7d925c0f6e7bb28145631a44721eff1fdb083cbff4a5c0743eb770307c7d71ce9a07c354a392b86ef7cc9bb2bea3c2540eea28bd81c95d9688e775ad0beb75ce94af73cb7864cecc440250e70708e76594f6d288883b509447d0e07233ad7f92c3f3f7ef82b5b2f33d8a5ad2bdc4c88dd236f445c0042b3580db00d18e8bea780a3459180081a2b1bf4649bb5d324dc4bdcfd06152e110d18db1b032b1c9c32fd39d87ac0313bb44f726e15caa2284817c97d79a7f3df4e00c5c1d2fda1cee +SHA3-256: b2a43faa19667dd60ba88c20c2b48427c2ac0be5e5f301fb626545ba2afc2ec3 +SHA3-512: 5fb4b8c0153c49a15909ffc47588bcdb4ce085beb1e12c543725cc07976b36f4479608a80ee9dac9800d1f603200b44cc3ad2883792450170b223cfdb030539c +SHAKE-128: d4e830197699a840469fab0c7900b63e95977ff9d421f9da1a18b12bfe60556108ddb034e9bb6bb1fef35f4d2aa1ba71588fab8b427c661b632506c3a04879bdf33e826056d2513a40138d3993a92764d8b4c3650a9d1c2c3c4496a0c0496871d237ac46c2eb5f08c580026c6d4753232fd89278acc924027573140e61e65493de13427c06805652cfb05ac77594d860ff44ba258952d0b3e08470abf2402869378c19012e32261580e2241be21b5fdc0d5cd050daec32810bf7d85964f8678955f884506d17958071201679113dac879a31313e1a3a544785b1038f0f6f4f32b9201d71f5a6064ea42cd3897c1a1079ccea8caec84070f37fd022a1a7653824d1f0bc34fe3e6408572eec91ef48d3e661bfc231e185164be55310b651e196424a241c3943e610bea691752b2f661c1c538b9f4d763adbb3e3945578f2aee085677c2aa45a59b1383a8a72248fe2f0b25a5aa0a93636447de562af1f5f0285906a3fc801a1fb4abca14a8cf43a108bb22917b7c384c64b385f69df5502ba91107ec6fe61084c5818a97136096dd8d221cac4539fa1501d88c5abb8607bf480e5b785e7ee21f7da3d85c71211e69580abcdf8f7402830a20c408f8f90fedb9771a56dfacc4704eb35ef8a37786b3470832b9635dc778c0e3ddab16422d7e362dc555b9d2460d3b62a5a460d40fdbebd571ddf67f8e0a4b184c016f0e78f71c0fb +SHAKE-256: ece3a63bfbcb413d1f1f6ee7b4360260cc12b66d0be70fe58865c6477d49ba9dd8d4b8cfabd9a970af41362aea07e22ac39d9822d493d2b72fac966f5eb7092e82daa9ac68b738ac8cb6b3517a1ee6969f93dd235a0b31fd63154f4c5d394b6a8d89f5a0c5d1baa81a458d340abe829b4b18ff84344ceca0ee22e02fec2ab19cb1f5b6875997c362473f32cfccaf8a5876e99ea30f557128dab24978ec8ea605a0c99f261bc0b6e870cf7c98ad135fd67c0debebfe0f7958062334aae3beef348df51bad6c1b41db9e895ed41c26035993f46bcce82e1ae64e7f79807adf53d4441cba657e0fc0f39ce33094d0e35b81001ab40c431d7674f8abb3d22b2c747ca0587b55970a0bb1786d71bdeaf39c220c430b4c86db31a9c740fa7da712269a700a8560b030f884bc60891a911048fc6b73a4f7fcb2e43d592fa7dbd5b7a2e4ae76aea7d430bbed8fd787bc82f5ceee452dd86dcfa97b05105dd16ee306875ff5e522396c14360aa76453beb66aa63241e697dc115e7655c4b0f7c790e5875bc8130c12e0051f0d7f55b477e127bef95b41070137d76107aac05d9e0bfb0fe2d3c5c6eb9a80d19d143a260f21266bc608a23bacbf1d198eea6de89b10488c178111f80b6b276ccb4d6922570e7b320f97b7d48c4d7273aafa07716e0792c5ed1da6574aa047fedf43ff03fe4e52ad535c33c6dc15910c7c9d55b1a2a43f7f8e + +Input: 93d6a4c02ac1b643e634aaefbc6987e7e9f79ae924acbf8cf095904b5178ca060b27a23b12b3c6d3a49faf8abe4fbfa6d56cba95d9e67475edf7afa89dc4f0ac00201739b281ccee5d4d5981949eda4d107d71b44b141e9edf3f8f83049debcaf2053f37a01a10e90f30ba3d87b8ab8e16a507d44e36825fc8f3495bd541f76f6156fc649a365e9a5effe8eedfc8deba18f2883611e2d0570dcb230de857582fdf128c77d0efcf821fba537cf257ef340e529cb4a8bed0a77137ca77b4f2526ebc12f0cb6776963a18a435891c9d9f060c0f +SHA3-256: 492bc6e0939e66e0e5d0d2f80adef3fd304928bd85b7eca3119fafaae6377c46 +SHA3-512: 9d4683b3ccdbae21d017feb6c91aa456b6c11b538bb910dbf5f9a79d5f2fbd5dd0c078b39e33c93116bccd7ac2dd78be028a5cf71115d896be3d5deeccfb5f69 +SHAKE-128: a635dc8c8e048e477d9cc0cf7aca2ec5304915a81623f665b68735985be6f30d358e2eccbe9f905014b4db0bf350bdb19bf2ea20c3d530dfe9c6d77b0f383fdb208a02d23857c89fa6d20e2fb7a71bf21a5fc476f6a201edf48fa16aff8f6279563eb3bed87fd0404252bdaf8a2318aada49a9ecd7ce96233e6962706a9ad2a44f3678ce73d76648c9739e2fc26d1fc06b98a79239072bea5470e4c9b8837323c4c02c7b940407ef384ec155d13c726c5289221cb6a2bdaaac574125906a0729d0c62efa92f5265777e5b030131d9a681134af97e645de33ec89b1c6fc07b6827bb6b5b02f7c525eb15d9be220a17bc4da9d82c1ad8982b0ba08d80cdfdf3a710622584d74e30ad5599ee79eba4758700046dd55ee8ab9a3f8e35122bbcc0238d213ce527f13b12c948c1d13065ad88df31a27f8cc8bf593c4525a3f77f216f27b511cf999b0f343907c74c774514a0b36a3b95e4ab651ed53acb8fafb89b74494520ceaddef9eb62e4de7424e0d6ca949e91b70ea7983448ce335887307f78f6bcd19b966f460b5b281840e4809fba896c757248ab58f639d6bcbfcf530a40596e1ca424896beadf4ebba639d14737e3d5ad166d86b4f8fd501ed0a313ea71562691b0abb66e2f573e8cf699ecf44b9418c4d9a5d07ec09ab65092116e9a4e0c638351c708704661799429b0861c6c86e47e5e2bc97435230186b91727f9f5e +SHAKE-256: 029310a46583a192e2690cbb46944b555b52a2a392ed7d407ed44fc3412deebcb912db3caad2c84066ae6764f55634035383bde90c010d1ce2b8340ac66931fbb9c68910b1532f30aebd1a08b7d3edab0940f35b1eec6e24fbffc50cfc6f874814952f0c95c9f8ceaa5e36e9740f88dbfdacf6d0aebdce6714957a65520eca9861a94cf87516cad310e060d1ba05aa56d95892d072cd636bf11f022552b185201c076e0cbc7443da18ebc9db8a74efb45e510638cb1febc214dd3a2e83012af8de900b7f2035c3f16b980589389e624f811e227c2aebca9222008270ad36302da27d19de0856cfda823b645c1b568becf1c222e5585015f6fbd74b593aabc523f9b3a63256f9241f16e4f1e7c88360ed4d898e18a4feefa0d4c88204856722cc36b3f24025435d9223ee1256101c64ac2c03b30529e1144be8c495a6c41ae5ea43ce9da9c152562607d00260408a20bfbb9c1c625119fbca843a02b58d7c4622973d2c4e352410d628eaa9547fe33a0552deb928612485f14e7d77af9085086e91cfa4c3eb4f4364f29fbd2ec53fa5c78a152b0148e17620f4b9500ea50c0c22f79cdc624a1e03c4ce19616519b83d90ef57b43498d0225bdde5077c6bf021019c62db3f7085603ffc2b9aac61a2243c8c71a7a5358c97f2dfa1997cf3000542bf3df140919d77662dbb3f410879c6b85fd9759fa1a6ffc0214ff841b7a9534c + +Input: cbe425b719fcaa750b36e13732b9bda0897ea1bd0203c5618571cf4bc63246099d70153bc5a733e49dc25b99c895066533c5899a2a2298e734e781a20ee672fab24deee3f4e569dfe19739debce3ee4c6b2c4f67a4c93a1b7c7d679c341c3c454cb77584e46769e616ad723e3b1a4b84fc4b429901b564c80b1562d523740787a06d91909bbe57d91720f9b3c62d56e045bd5f7b4ebcd871c5c7c9c1efd0e97764ec4224fcb1d99a553fd433862e579891e2436138d308af4759dc4848e6a13cf8f7df271dd3b41676ce186f7bf69c05ba5885 +SHA3-256: cd7878c09d4728b60595f65fe496395a14073a9ac7e0f9235652be99be010efc +SHA3-512: f356f3811f5c05fc964243267b616103b2caa8d51096b76a21a8c7e5f30144102d84b21220df058e7794877c5e5de41e3816fe6d4b46b068bb45549918fe362b +SHAKE-128: da0c9497bb24e6468389e6b9a7d9f99b930f0f3527f4b2a406b17cc842cdde0e66e8c54d3d3afcdea7e8da8b31e844dc088f60ea368ba228bfc78e82aa4a704275a1790f264e205e7cd0cb8fa0523db312d4a8e78e43420e7a231c976c71ebc4924d4789db991e8f48f8ee25b7a9fd55baedae8c71bc86174cd130bde53552dbd75549f060a2cebff89dcba11a4d82826c70fd014d5e06a3f1bce0fd83f3717641d9fe2f356d38b543ca53bdb3ace94cac764bcfaa81d61a69c4ef52e89ed4cb3510f642261bb847f6a1c49316ed6b97f9dd85421af39eec5b12e4244fcbbb7e705383e3976ff969b6235d24a8c8f7aeb82fbc2dc9713ec06d2cf3b8ce238460d890273c3e3e2d9f45e78a30aa5e388bc6bb79989aedcb48699d7f9bdc542b3f4c3b93320eecb5f14691ea1a5463d298d5b428e9cc37bca32f0d02292823a48528a8fea188ba859c60116710dc8f0d646c1c12207d6ffe302ba012b8f9667c336edcdb7f38bc8979ae7b8fcf5da023ea408f5cb162c9b5b2db9db81372a2d09d6204624833f5333e5b9f5d72d6d861f0daafb9c71fb5991fd1eeece9c52a2af1ae924ac0416e09d79b0226bf7f21a391f7256680b1317e279273f97cf9da8676e2db95ac6b03596a1b1be0187f6d37b00e4735302840df45d7a6df5795c9bce5851b6b39018f7623938eb147b7ab802b8fa78684508b9ef99fc38cbc38905d60 +SHAKE-256: e20f5898dc17b81629a66bce66e5ab9411c3818a7dd8320bc621bbda40be68579e2dd56d7fb69c7a8de445f31d93a17e83842c3ac4a7ed96950e8273ffdf19d4307be2daf1a9f5e50b91219ab74a4e98a69ba151b83f4c79218bad035a23fec3070e8c1f61b464bbc85028e35d893983ab24789aed54a37b20ac1b966316f6890b497bae7f1b752da7f1da68fcdd82cbf84ea8ef6cf95a36cb627d1d5c3e18380117df8fb880879ebac2326d1c2af593ed6fbc1fbd453eab0e4627c20c2f050df3a67610a4c16b4f2e98666357154a58a28e6d4b648c160a0daf293a7af693dbf941a51b2d8f907c5fbb3078abd17ba81dbf671b7e7ef48a28d43718e54c382e895bd51b8fb8325e43d97342b7bde1ec691db4b2b7d9fc78c8f6d3b29470d3ec1ef66552b252f4d4eebf9ff6774cadcbfc2d59321d3eaaec31e4be764856e2fae0983ee262c7bc00791d69fa278c038b32fe52b34b1550bc300ddc3992b0ee92b53c467a4e6cf6fe2e07feba9037881c208e7adf83e4987623fbd645208ab78606a714b71024b305a9af08be91f639eb7da807f98861eeb497f26ecc7e0f151efb6e6a6aca2da7bb86bb833aafeb902f9e33b04c92cd4811fc0a6589a1502771809932f1bb7130f1198b6c322290c1338a54e70941c7c902e457e81d74c19b4c67b1e211f72178d8636f8021c1abd6e7f8ecfbfd79c7cdbbbcc1fee153128e17 + +Input: 22a566913439a1cc544ac6214a73aa37a764838aed132b00dbcb9070c4392f6e0d2a2772cf26068a7de54c0a2f01ec72a931fe6483d0c887166f8c6d7f6a2d41dec5f6c89fe6aa1e5f46b88e5ce6fd922d1b3fd6e383a1ad1d0bbecad10f923610488e197f59c6517f15003f0d689e9676b32643234ff87af5e676ca87c2075f60d071c336414b9ac429a5781bf75187c56e7405e4417a6b9e0a9dbfd01074cf48972037d41a217c3c3cf78108f08f7d102f82d10e8c9d051a48736e734ff4ee9034f4e69c9d852ec38723c17a9672416247dea7 +SHA3-256: 50e91f74ed444610d26f624eeedef897825b335900baa5e0a1fcf604fdb5e954 +SHA3-512: c0e1a3224dd81e1f4c62244da4916316fab96d8c90ac8e23aa4cc6660e399eb86e167e7a6dca99157453a285f6bfab5ba6d0d252ff4e1886390179838a63d33d +SHAKE-128: 5b711a629dd16bff3d3a19d5daa7621b175e773a6f7fec44fd0684855077064eb99de18cd73d83e486d49e6bea23666a708fe9e769fba7f03cefa84b9a0999ee8dd1b7c28f3494ea01366d904e7536797e8cb43e63a8bb9c3cd417fb3a74106b8a71632b4a3cd0096aaa22dadad462fdca816c89b23be70bce3057269c718b4b8ca88b3d794cb27bdda62aa41093c2d6ae217998144213bf3be91e1aae8e2ce39823a52313230221a415c2e9373961cecf36b62cbb262b5dd0bf009f80894213c1223fdce3cd4bff87527193cbb7f8fb4f90203dba54b29668f54272d1df2e335d58bee3db916ff7100601f3267689e9cfa65055483cd185e8ab41c01d7a4009d46d6aa43583755f8069f9f41e1399761652051d5aa7a1013730cf78c5a380135f431037727c47bc29e85528b7ac969949d7f437524cfe5cef13b2a33cea10118580895cac032376b7214b02fd34634c2ab8f81e9cc80c04d01f64c4100392f6bdaf9d14609a40a7f7da444bf24c25089c46f227d6fe800223db819d2dc0f156e88f7f98fc7ded88d824975739018800a45f1a0083f5a48e60402b1f1d8e8878e9671abfcba1f286e4c680c4451ba650e2962fec3a9c0178053925eca3d10e7369236f69ae1b8cf7ae5fc2ed37723cedc0a44168617aa14e7064805df76e5231c923448aeffc80d1031d118c5eff8b9cf8d2a0a7f46db2fee07a3387aa55f5b6 +SHAKE-256: d97ab52c8790b430f6e0636b3c4a20c89cb865f972f015456ed8c6b1a1626f0486d5bf39a8681e661662afb242caa05d798529e99f5414bb1914f1966d9c8d5a53a2e623f752b57651233e02404c80ff477ccd29a1e79797336438508025e41e73cf684994f062d72710f5e60728717e93361940cebcec21e2fa87b54691c1d0849cf4e80763edc2d41a7e43870e20906f7578e7b72e13d5dfd853c75e832d1d78f818ee1626b167cce0edd057766c4429b56b510760b29bc707318ffc41b5ffa830f6349a1dcce35a99da4aa78ca50d22d27bc837f8f729cd2445bec48811b83da5d39959849dfd04ee3f26e87304ce52683792b7830b4cef1be6e87cfc05f9ebfd452ad31a235c287f6c45afc4e697186e743c5c9a8bc29581e8eea24728e72edc7fecbcc31b48baaa0f9d2262d45a68f0657d3afb40c1fee3f5f433c46e8068faf1e4be26539231415e272b94c7d8f5eac9cf7e6520dca93c79e3eec03b42193d8f7d185482e640c076232a9089e392db2993bf0a6bfa8c206662824f36a0481ba9c4f50d49b27b3c407c53a44d7f9df989b301edf70ec7b35017d65abf1a0c1c82cab5f6ae4c84b39754b0e703abbb84f0958caecb71a77164998c85f9be100b5be13e0c46d71b855bc64b0fe2a4f6558183a3da984d027ede651b066bf577e361f60974fd3aeb5ce9441fb2f76881614b932712eec9bab2ab43eb485337 + +Input: a81d8d736d05998869b433919635086d12b932d426881ce5322ae82f1666778f0e02c0c66e97b82cd97a280ecc4d0a8a6558db94f95032273bdac795b0a11e96533e86539d9fa27e1651a2ffbd5aae385f51d5729e04f36ff42e34e8ce955c8252df2b1b118f04d7db6183e099db0f036d124c35ede217821c4c81c0ae88b5ecbf8cbbf9cb615b6dd0e3aad6851c91fda893249d84be9dcde847ba9f70262235304b0b45828376cc070d8ff20615388cf87c254e4e663efa6fb26a2cfe691a08f4cb253caf8f39ce2054e6de6cf81729be8f3a5b96 +SHA3-256: 533538ead5ef0ed276c3b81d1a87da46b5db06406e21f18047a241baf785f4c0 +SHA3-512: f64ab8734afa332b8fc58db60c55cfd27ed07b658207424338211a1bd35d593dbe22e468b72c7c032efd1e20e96515a27645cdf358c608f1e687cf2cb8c6ba32 +SHAKE-128: 8acea12ca3575333a36780322c30350192841766986b76be4403a47a49859c2ef35dc9f634573a27f58407f3e9e8f2a356b9f61d7409415d412593283f71e10507d0c0841a2ce0a451b5b1b5efdad6365a38f214c97f6a307b068f7754bfb81796492d89b39aa8240a88a510fada2147f890c795a536831e308885a94483cd39b3283487661492d4d0600685eeb02b2a294a8f9fa528a4e7b46accb59ed0bbf43d2942ad7902ea77528f1f32d0ab9fb55cab71e6d1ff6d4d09b192b6e22a95c192a52e27800df3e7c19a37bb86e66dc44ff73b1cb92f4d7ceea2da6c0f06d9a53cb1335217a2c7a5677869d1237151af7bb62465620d3e2fbbeb0562620fa1f319f1e2a148edb62e68fe24fcd4dcd5615ef3a03bd2f0ef288af0a04d73b00965af172c252e2853901368bdc964130ebb57b35324026a0b7eaf9775d55217c8928888cec8d4023d4bd9af8ce7a220ccbc7e19389acc4a788884ddb506f5a1f6ae9a217873d32e0db61f05e97481f44ceaf085d6a6b8464de87af7c9505cb836e4934387aacc0fbbb89c10b793d805a61c8d70e2f9cb42682557b9871c5dd83eec669e5093d3ca02b626739d514d9c4806ca760fb11fcc7860c860386578620df563b5831a62952164326c2cf0293b46c90d005297e67ac0d3bd2e08ff1f91b0fceb3ca278522548492cd0c4f241fcd7c53ed74f7f4a32f97522f517ef292002f0 +SHAKE-256: 14a7f241068c58a3ed8596696529160a745faec6da26524ea647182c4fb6502c95e3a8bf01f9bbd9dbedc93e7a0c451b1d3d538c70e782da43772f0f9ddbeae416bdc5947bb243168af5ebf5d58b7e1fb45013740b90ddb2f26a190ae53f8666e979098ff85a98b9dc5526de63324713e4959b863d028becaad9e8dc8071bf1d80480d303248772d517095c749850ad32e3c96321628c064781fc94bf213795a678bc479ffe1970160d11c2af509b556c1692b185168744fe44db8af6d880ca5ae6c4554904258b039e1d0887870b3bcb37e998c8221860d1d63f7b6a47004b789add08814f5e491dff693958e66598fff1f557d55c8c3c89263acc0aeeb42c2ecfbe7654e083a7964472e4bc66cb17aeeb7c4872d1e6acdcaa7841f2f701fe31ce6f255747633e9b78632a83752fba7da9c90ca095e628cd81d903b78c1cc2a279868de62fb95c4834c8181c2367fb0659d8819f3c4ff105890db0486dd319e8f86cda288d8510782de1ab736a0f5ffdd4c79c85a7294153557c8027682ac5a61c6a42a503ee2ffe66b5f5b213ae846735b0e97ca3a3623bb03f4b1c2e99419aee280cf1c29df2003231bac5a76edb03dc4086b6c1e75403abee7900908be371d23a38121079a3abac1d7084b4ca955507980cd64e748253fbe6a7f00db600b5ec5076031ca9634afdfb85dc10f18e4f3f4e071509ae94c92a02bcc00772ae7 + +Input: 0235e74095c1f7afdbda35e82495ef58468d8a96ebf121fca9c131d307b937bee22b7d8d78fca6f6e6a099b7ecee7ae95a7bec727671583b4a564b95764eb132656fcc7f552f2b97581c15308b46ef706691ad6af5ae3e04a38dd7934c2032c4e18228207e15659c7bcc9d72ab5500e369da631d4ff70b50d5869ad82dfdc6820d9928b65fd2a980ffd9d07cdc3ecf27231a3f17260a21cadd8b5d2f436a6c7ed4ff4b298ee33071f0f11317a2ee5198e78ee0644d2e7515074c278a6ea62d203bea97fd3415c5f28650775fa04b35b1bb5d893c4589 +SHA3-256: 3195f01c24e02c4fdc230de122a0814a805c1e18a0b6d03408c8288f1fb25055 +SHA3-512: 49ea7e1fe6523de95362126020148597179842a22726b60c17c19b95b1860728699ea8d8995cc47dfbed9b616b23f852eb6a4e5370416c30e3cac5bf22f751e0 +SHAKE-128: 6d0825fa739da0a8e0c106a5def62f5562e5a85b21afe097122447c2afe48127be19fb55bd08119cd82e2b23a1e90c3e12588da357883e92b46ad9c5c87639c9b8ab03bcd61a097841599cd05416071f5d44267d3b5f279827556948bdab80c7942bf500ba4f221931a78fbed0ff0a422d35201c0b55f2625e7efb535803a9c0b93ef1d9e08ce75787f4ad3952b1f10a53802e0583924c244114e8f34531dc47777a723eda12f9b757b8c4f937bd249e48f42448d49bd95370d4b4ec9a2fcba1f2a010c686de43061d12027782fa217c9dfc4ec1017ea387ad818f6e836a855ac6d7407790a3907c80367e5eaddf9b6ae2de7ff55b7f81a394f1b027852acbac9bca617de8ae7100816b674b79e4894b1ead0323a017d50623beb6105ff2b7cfaa802c3ac0b060cacc1a6c0616d1cab67b2c9a62100301f6d5a41f45bed437ebb9b6705884848bd85d058472f5b2bba61efd3e224194bbdd67bf372d06af12837de5713782ced8e81301ad8fcd5adb466f3fe5c8c6049dd0a963c8d62c08e7b367f495cb0e4a0bbb0391a7650b765e5bc5ffc28be436a8b17f1f26293860230ec3d727f7ada2f626eeded96c2c596436c69d53a8d79c4fbd406c3d68c0bb7cd9c7bc603464fe6389e9e334c99a4b4617d206a2c86855f536f18db4abb28b190e8035a660ade9060e521721966df35560227509bc0fc11359f1f417bc1a68fb29 +SHAKE-256: 994daba1eeebf4a1e4ec15c3a24d7cade2adccf9c9c0ad68387499086124ba52fe9693ad367916cb7fb26c6708c820886c3a2a7cecfb6dadec3cd91910f32fea86728e79138542a33745bf409599a67fa70ac08e522f2332da986f4dffa7b3ff18137c81c32cf8f99647df868ead4e155fd2e8cef91841f22a95a57c646029e5608a35a74998c17c6eb83d2940bc72562682e0316327dd78fae9e637d95349025305eab4622dcaa410368cef15cb0de9d4778d9eab32f41c4be276a37f20ebbffabb88eda81cd5f037a2cfc68d7e4bcbaea8c8776491cbcc43c1e4779dd775ae5f006badf99a3ac546d86450b7d6c86ad7861f8b041c1ebb3360d1a083c690a36c83bbff012426aa5caa5c9096e20ff934c20c8dfcf89266aaf15332dff625b4f80ee76617d36ebd52df22f1d5e764f603dab45a980dbe6ce05ee08a73fb75aacc24a9173d67a0c63fe4c4870211073cda5b88313c998a286804a286884f5d9135e6111756256a5a71c450f9718643487a286650c1311256c2ecdf313ba0f8938f71a7a003c806e9ad56c6a82285571ba7170745dfe328e5bb9244fa797c8bf1dacff678648311b1c6145976616890d121e7e624a3312865e554b4524b09b5afb6bcf1c9b2ef84b21a6ffbacd89d148bcf2ccc10a7af51edc9d56f4b8d3543365f5cac39883e18d76401422427612d3162e72e6b4f19b5c71fa68e0c3347975c + +Input: 609548bf5732c9ee6c9c4176dd5b5fe771626a67a2458ab99cad4e922e6206b87dec5273428a96f1742bd10b3394175a553fa505e8671e0b5f0a2a892b63f85ffd58c63e757fd70076ad7fd19195645d7aab288277f9550e91531dbb0847dd33f6c449568e799cee21c4c828d33d4ae9f5c32bb5e6c47474c4a10c49909ddf54ef5a5be86235006bbd6b696078e09aabff60fdd64a8a7d945f7359551f4c061669bccd789761658d957ae657d3ac87f45f6457c24fac2e314a48072d80e3990c8d756f5a89604178843c904f53cf8724fc5bd80448653d +SHA3-256: 966182c2624dd280816d4b003e440c6a23ed205346df56732ad58f6cc68c6220 +SHA3-512: f6782fee83e1edbd129ef5a949e0f5e550268d63512c3e3f3117324bf9c53aef76c7e2f63a12c3f93223c2ea62cdb428e3e12bb65e5315840f3c761665d78cd5 +SHAKE-128: aa55dbcd0251ebe3061a183c450e0e4158863a77264ca64b0975994cfa3c8836d6102a3262fa1411f0bed71c84bec486bfc017d7497c0cc0d19f439a278f7e947936acde2c73c33ca630eeaac2e789f8b6a0ab83b676370430ed9b5fde9e165b37ab997214b42ce01523a2ce4fe03a4e7f17bdc01d29d5e48dc1d6191d40a25ec1cb0bb2d61b127a939aa855e92951251087f0da9e2dea8c719465186e97118f51ad393ac98427c6f2b39478dc89772e44c11c9f1e14baea90923ce267a606eb354987c90d46b5706c6881245dad1ed81f26be755cbf582fb88bb4818cb026f07bf54a3b9c472fe4605b3be1af110e9b8160e73006415f5d39dc7ddd211174e8c7c9a42ba260379d727b3a8b0c2cb5556ae23440002c07bfbc473b6e2e643e89d7b780144cbd4afadac509169658f4d5b5b48e6278d9b85a5bb3a0f5fd239a0542a384966046646f2b18f1c8d3d4459e6821eaaa456df0215394c8c476ffec183aea0a0a9c8f82e488855b01d9474ff2c3ec118a681da31c35954fed11c91080bfbcd159905d808bb65ff118c97fa1c3052c1641c5b526bfd5615e3c96aa6d169031a34f63401e443c0f7eb392fe1bb7203b7710b33dfca3646a195d74438c4a0ec2118f45cdd82081282d7a7b78d0c0d1d71aa682fcafb90b3a8bf1963fd255ceeb2b291a0e2b5d025a5323db27df963a973da3d30ffffb594d68f88090ba16 +SHAKE-256: 7b2181bae5266455d7d76b1d83dcf5e570787713cdb77121e6b5bedab1c45a30910c598aea76d1043b46518cc8f1916bf8f73e83e1fb4fee3979a5cb9f36bf1b6000e241e0aea1fe42ee6ad41afdbeb8faecb60fe748f61a33fb2581bca7aba15e9baf3316b309684b8bb314ea1e0055cb39ef5adb88baf4405bd4835bc99cd7f22785c2d279edfd10b92961b27b035c21dd9f0099225a126ffaa051d8c6e9cc4a6d813e8329053eecb9a7290fefc1e9b0905fb6e134fa0d3f4a5cd23a08eccce3dbca55f17b044091fe10e17a4bcad76d27415846e5212aaeede1a150c3f7ef31ba2f07c17585280fee8671903e97a2fc8eef29200bafac3916ed4074c48f15afef6830f8286438371ae7723985733e02bbc285c724cdf349bd104700102af17004ea15ddd5310d1519471690f654168480176d6db31e6d3f41838ffcbf5be1ec916fe9cb4e01dc8332883d50acbb0e01d4cc3bed03fe34405da6d085faa069ce82019f7eea68371272c33d6fa9386aaf86386b9a2daf23feba59d5aa3b1cec5c8f0176590108c58ce34a3ba8bfdd92d03c05bf3cd0c7130a37f16f033e8cf945d9d4c59ee27d7652d5a404cbaf19701d59245120772c7d314b9ad7a21b5200dd627cec95951cd5100579eb1ede03ab2e81b54cbe77847086ab645d1a825a2b3d0f06e84abf82c559dddfd646c433e880c6066a0c884a148f15fe6cf70a7d77 + +Input: 41d99f01e7d7e6f3694d07b0cabb3ca98b5cdb4e59d515e7dc9e1e1488dfa1786211b5fc3f6e63687a7de307caa0c34363ba9a57bc013f191f22536ae08cf2b3a10fb20fc338f4642c71dd1f8d146ef9565fcc2ad04e77c8c0ab1db65b5fb5a0f4cdd619cbea99d0f8a7daad6ea76cfb586db7fbc93b266d5409df496097b0a539d044a280beda20abcfada4eebe6905ddad66ba023e8e88cd5aa8e1c77700bdb2a28b06bccb28f10a2f87b0a65f8b1ae9cfc47068f08917d893d7e10af77f9e3f671cb44122d69ddd0709deaeff359be83d1c20b4779eb8 +SHA3-256: 9c38de43851c9792a9cb56665e078848e6f5cacc246f8a021474331cc8ae2a3e +SHA3-512: 0e68ddd8f8530c79444daaeb859efaf72eef56f0a34f399f6a0a43cf63a9f205d8e3157699c5ea1c95044478f9463fedecbe78e4242b6ade685991dc6b3c73b2 +SHAKE-128: 6f9f09f01222ee6960536416ea6f10b7148c2648d81d0e70d59c8645a619d817462bd6adfc277d4963a1d81bbea2a198ba7d19c109171724d302f7e02e93455fb4ae9be4e792a83038307884e83ababff795988eaf787ed00832eab0079b86efd04b47c597d17a56622945870431205f414ce4314eeca3671cc8906ff1186abcbb8c667ef60ffe5c4a9e652fa4ca68a066f3b6ddea7146a1769aa161cb5cd1fb70ef2592d6644eccb317eecfa4dcda0143b6d80d75a975314916cd2535c3ba60941ad6a657cfff6ef8f8b056cdf02cbe01129ab2c374a9ba4345d6df444d484cc68408afb329e4b0924bc5847e2ba1d62d46cb624276023deb151dd38c67f95b907199c8263ff1911d5402ef4d71e548b59501fac54e86666035ea010cc7afc950433e4950d657384e7dced343f586c8f0b072dfaa6189215faabc29f6bfdc7e2fa64022e5ed2f3228bc585e9e0fbe11340d7723a048c49de57df6f2dd7be350850a1ccabe23ba7cae77ae3e6db782efaab1b6795cac09e88114cb36c6efb1e57d9e30fd350e4cbe7ac8ceb3ac109aa833caf1213e5085dc7d946f0cbbeeeab441821e97b611ae70cec4b09fc2584ae558fe55648606115e01ec1a313026b0237748bec0bfbb85ed4aeb38be3a2e2b56d57246df7203ac406ed653ebf61ae121fd7fdbaf959ba77bcb2a9caf8985b5d9ae1bd02919e2a2a77a00d2154e8e96d8 +SHAKE-256: 62306405fb3ffd2ab01bf74d35175cdca8a61ba0566562c1c8e28883bbfd21385909d7a4d04081ce82d053bac643e638d155ab54866e34ac4c36623e9d9ef84829dcf36debcb99c9006b43a2d2915705393e8192d8fde4b8aa7666417f437ab5c8b9412f973ae0c1631df624f096fd5ed704ce97ce65378e43e6d1a6282df18972fa4d9369b1f1570e7dac02680179b708249e01784a75d9b5d2963ca40acae0372024f30dc52ba76c6064d295962315a1932c718a4bd07594c1a7478eef9398d152ad1969ed20cecd8a8ed92aeb8b751217430d13572ac89ea95cbb0e955bded246eadd33365941f0b3b726eff18d551cc79d905f02f2ce103ed874681f585e7a4a1cb267df38c613c76e9abbefa8d6db010680d53212ec3130950b5e66ff0008f7dba6ae211ccbc88c1ce135a34cc918afb838ce8d080c93407b3b94507c65a5c2f6dad1d78cd307dff49701f4e73969f0fb13ce07f2ff2138cd5b79c10a43c2303f52751d22b1215e8e721cf41e0765a37a6e4a910d293c269d832c2fe298cb3d7fd7dc24fa41677665192dc4e48d62236b1ed77ce75a31fbc19ce893ac450ceb097d74ed6fea7b565d6d045418ef613fc73980416afb3ae92eeeda07dbd97caa0a3ea6d4f123d434cad43b79b03b18facf5dcbf5e6ab6c833d1e09db6399beb71e76277d3b06b35f3fa10184cd114b4693bb9c9d17512eca1fea3933b00e + +Input: aac9d8468d782c1029c1646feddbe8f187cbb7e59b1405ac309180ea0cae539da6dc56041a4e13bcbdd1fd1b9aa116bd037cbe3160cc0bd45787299fe53045288c9009d9a8b6f3d9c4678f3ec6c5361437139e096106d28be25f8a9864f6008386dc19485719301c601479cb95d3e2f5ff85142554dedce436850cfeeaf835e75971c6a1218bdaf57dafedd431a14fc2ad80b360729fc40e9f8ab2a9b5e8c45956d9034d2e12ead756e0940a52fecf93e64717c2e4a1ce7e8246864fe78301b79acd02b5a7f73b458b80ecdbec8f03d6136d95773162c6b804 +SHA3-256: 7861c031072137ae2fc055f1c5572fcfffd909b447c9dd3caaae7123c42c1fcf +SHA3-512: a40b37484717f4d51416185d420f7b2e91d40bb4b90b1afedc12b94bed535b51f5d6daf8335e31af1d7fedc3fa8d41a38b3e18c200df7d0baa81d604686b2687 +SHAKE-128: 03d55219b56cd5f7f7de66ea8d7d01dcedd48b55e92008996e0200c5e7995961a7e1b105b3c1b8233cbaefb715068e530de79f911910a0c013c4d26d56c9ff268681833fff4a9bec9758380441abeef49500c69e975e9b670b968dbfe26687bd5c4cf54437471484b9eff9ad5ed097a53d561be1df496b7b7a158f5d684643a3c88efac5574b48b8d232b7afc063e3dfc79047011d0dbb63250e2bf7d375bdf280a861bf45cf9e168e3becd856592581d4a44c1a7e9558e4f94dd9020b1028095cd6526fcfec07eaa718564d3fd3cf7e28d7aeee5649e79a613d50269fd3de041110955c6126fa9de595ad296cf3dfe376a04806797c6fa613dd9197099dc3380bb7d2e00277a3ff90f664ff18ced9fa58e5d7a179217a593a5e11be423a2c9a20a8a248282085eb8d0478815019eafd5f6d8480378db4b118b42aab24872214533ddd5fd70c0aa3c405c1a1814c9b648353f526c731f9cc3717271ac70027a080180316b10fa1dd63cd74d210c382b363cfb95c6e665d3372f46f1b11cd044e1918e3eff8c1b00f48ba8d5b623be6501b2642c4560e361a25ddcc215629bd9d9c47353ed9e326166a89b41bb107c2e5616d1a0bb42dba1f3dc4ec20db3394d257add7e28eab9c5366e4d1d4c8c29d2d8420fb9f15edf44ecb0e3f4f6c8f5418ed3dbc4a1cc9ecf319a0cc53db51186af313bc1e3fdc04cfc066677311680a2e +SHAKE-256: 828e32cbc9ec44b90a1f69b962ab915067d0e7555bc93e3df136079905ef0a8aabfef471359b68e21bb31cba9e6de95f49da647162b45d6b3df3ae920d283a28ae922d3b1142578fcdcfbd7779fe76d89c13482793f1deb8dbc4f972ba4ddf70e34603645f4426df2c237db899b785d823394d40cc44fd581bf8a0526d21fd70c4b8624256c877598a0faa70c1ac6ae705e69987c4f76142ab17f87e3605d5b747d76474dc4cbaefad7ab9257c13f16446a69172252788588cb433e628a35d77d76e0ee3fd37895501666cbb5084ef76283f214922fb36e1994a3d64e8b2846a04366a90c476226dfbbeae51c3b548b53dbb69db42b1b98f08e49e899a21b4f74448f235cf60e71635f2a1ed2a65e328860b50e216c6b0c0c23961a83302b67ac539827d1bdac10bf3cb04e0363934f17c9b8a169282ddc37e4790639a3acca0a80d6041a78843cf172a261149c50781bf68c7506bb885bb5aa232426e6e318027d0e8e46046e2c4a00a7fb4d7c724faa42bb55f253b58e97d800c66091fffb7fd383a066337833093c0301985afcf238de7ed721b05fbefc3393ad2862cb30bc0de7b85424e6d8347d1be3134dd58f270b3da126f8075d8eaeaff767bf9932c4c27d3bc1acffa6b4e0a3a53fb5a78b8a419fd78a5a8a495aa34ea09a0bf0016de798c7afee7c1e1716155359813e94cb4ec41710bf7befe481f13466db293bd + +Input: c1deb23ed9ad14c11d26a61491bd2e36a887fb7125c84b4cb0a9f178b911d88ed8d1b375c96eb710d16038d3b950a4d22f465a00a001d9174b1cafd708abe6dee4e5a6d2cadd9e20db051f026aeca367e213471f9c6541a929aeed89737e8895faf17f5c922b5c13f8906422c17ea3be3859c70af54f5b97be733411891195c504030012dc62133b8e01d42871d4c12c5570635e4331a7be29fc52f46858e52b884fe48f1b1c642f5dfd2489d8a41c2501222c97890985b8adc392fea0a5841ca492ecd59c06f653570c48de37eb7530425cafb28fbc32f89e61 +SHA3-256: a679b7ab4e57b9c237ac40a2583340c2316ee359d6233438159f921c6737843e +SHA3-512: 933c36017785179b2f83477c2407bd7026ce7f9342b823a7ca23efdb9d56c5bfe758b37b7a2f9940786b84e542fcb5c8ab07c3c29114797df63073a84e443e63 +SHAKE-128: c9fa3d355427be6cb07d8be10c99499c3c98f4333ad0023ddefdd1e7233f8fe72c9982cf54c8acaac966e24cb26a15943906e3dfa8939e367944fac0e4a4771c0b453054b1425b3fa5a33ef5a8ef10f2f358d6a55a6e3ef95c14c2618a79f7802f3b2c75605a1503ae71545934bb34a5640694b959db2ca8ab09233e2ad0e0adf740c34250df4b49ef0316cda03bb02ce2a55f09ba32459350ccebd08298a9700b1f6b8be5f653d6e1d9bdec26c07a9131b1f716e9f0441fd7ba4cbc65149fde64acce8dfc9a9680db50200d8173783f1a8782c7e9936a35ee0e9c1d0b78123225c3b18eb63ad1041bb6acf7d9efb9af396052981c686cb02f68dfef54badceaa8c23a4a26ce1c7b4f0fdf8a6551284f5d1e5e81640ebbaa1242619c5a7048bd9436a1a92cb94cee5e907db506b078cf902f00bd7cae72e3f68803c1689ac96a0edafc8549649b3b2a3caa554953ac724eb7f67163d8b9315aba9b43ed78814b05f122ee1997fcc5a39cde4e2f4e5016e5c380313796f6cffde2dc362cbb26d9db40b04f09cabacc214f9c25351c5f05d0519a2a3f39eeedc621641d232918e5aab90825a362558f59af2b08c07df8432d7abb597588a43424c867b4025214136df26c03e9daa05970e5233acaecb8ae32bf300b356ebd834694b2c897a80144f2cc4ba9b3f1440ffab0c2ead1df8eb968f338b0c4cc007b44a589f6a794d082 +SHAKE-256: 4ed9ed12efbe6226c03961a3b9387d15ef35988a2d45eff78f10b4614a3cf7846b7cc992e3b262f0753ee61367bde2edf82429b1a05bf3effab11186715dfe6e48f3f630235fdd78e322425c9a022574315aef589bb780cc73193018201dbd8125447900f0b59c2de5b34c42a0ac133e390f21f3ebdd22857f9eb0224c83b7cf7a501322ba0a1bf0592497dac4fed59f1eea428c9ea66fa7d27b65724f90699912bdb59c9c9399bd3eeee1fdc490b9ead67bda5fa6980ea002efbe181f47c82a5c4e052132809d58cef049f7506de8a0a7c81878ba6f4becbda51f43693257595596df690a8a98971591f37864a8e8b3681efae642dde95fc136c5b265785df37b2bc06018ba445f54b698afb410aab251353f90df8d3c037fec0c0c7605eb0ee99b7b8a5df828f9f89977f1c0e96b0ec726de3e7e877ed4e3d56f4f67fa0b56acb499dd92df70cc5639f6c2de0f5dcd036b22ff758382eb9ffa3c3e8c26a0f5d47ab0608da5f59ee14382ad5d1bdb4243aef088129dfbe9c7ad274e063ca6d556d51bb3aa86fcb64cab8a2b198fcf259723105a9b6373f298248a2578f390e59870b871f794f6e6c9b14ea3b5369ac498c562cc00a71e8248751a1170b6e13d1a9a65f161e6e99d9b964815bd7466698eab2dec2db4a8415dcd9e9599ba7cb686b0068ffd4ae95fbe1ee89c7ffc08310c4ee04da7ce52723c781ea5e2405df1 + +Input: 628bf044592032786b2c93abb2bd628f789f06095f8d863b9a140288e98b7a734f1ad312458eb6061d6a68c3bb7d02161c94161888c7d5650645cb365b63b7e46f658528dde878c769975406048748d09d767aa1cb65be4364f2653ed87b68908db11f3391392602089a2939f024c392cf7db8b2bb0e68472ba341ab4a26c64d6269e724211f167e59122d147f37d0015d598b00fcb5aa77634555eda050cff084b9d26c5acc41e1dd140ddfdc68376a162a861d29ba35001dc328f5a061d59a0413d62a0fea13a952738610f616ac3393d080d95a5aa95accba3b +SHA3-256: e1fc64b830104377e8263ae597251311b255ee3b9ff42ed4ab9d0a7fb8b2d213 +SHA3-512: 94e673412bd29879e0d4b773bc59a7d9299400aee79d7550fe37a3b87bd23a6d6fb93b895cae469110532d5a8c57d97216d3482d4636d136bb5ab342b3402517 +SHAKE-128: 4bcc5d9461d393e726e684afbe1d7b38b67694ced3db48b442982dd8c84a903d1c5ae06b4f21a5cd0957feb8a3a6f519e22971b608e1319dfb42603352178fbae31e3e73bd2ec19672c2aef2633b6d7f300fa6cc30c3d6d727794fbeac14bbaf7d0c3ba8df5808f2a1a6b16c86d50d5739c6693bce44c21a5381b6c594c177e180c9945d5bedfe6350108aadb752f835a38d48d025c51648adde215fa4e5ac9e3f18fe97269534a2803fc2e7cf35b2201ba3d2d1318b6fe941bf98dc150d11d435574ba79337bf679f1c063c9f57d05c2832f9b5b3eee0246cb6dc6bf6ec257b1c29bb636d149d0aab208ec842c1ca287dfdaecc0338e4de524f70a1558e94476325ffcf0a31f610149cfd50da56b7b39b3097e961a1308f3be28f8a0e8167735d6623677e7847b6c696a4ee1e698a06a0a35a64d986d9669613b6a848fa7f3e38cd7b4bf13362412b5c2f47ff78fda644af41ae90c23017a328b4a4e70d16b439b811f7cf27e54d33b84674c95d10e91ffc474b7fc44fc7cb77e690f4cabfd0de1f84e47a3f9adf07d1c5c2237122be88fc0ceb7ff1d50c27a4aaf978822c6e9e1e35148af68bf5c59608d00a13e95f847e816d79b14c9b6a4079b91c55bb83f8a4850b334e561bef46a11caa690c354295206406595d1914edcc8d083d29052f65ed564aede4933ad3a9037211fc9b0e4c57ccc1285d2c7640ab326d9bbebc +SHAKE-256: c0c8c55bd784873bc31502ac7e2f273479be35a07be01c8aa5ee724f18aa73f30c535ed0846f6bfa37412da13817b99461b614c0667e7ebeaee1231afda97ca02a01e563f57cfe8529cb765c4368218ca634bd2a16658366a845f851e4801d8d98bdcad550d550b8149bb6421fff709e15bc1fe9c66b056469d8d20453570c52ecefacc426183ce780ad5035917cdd188dd5952bf02e109b9f2405922043deb1fcea2c65cac1b9c6fff9f40a22960215ae96536dd64b9d7432a05452dc9242b2df5d51d355cc64d42549d82f465272a4868790c8bbaeeff120eeb6755efad86d4d9d18af1270e568471410370429be7810cdb094accc8ab7f7827f30cb9893948d30ca77f9262c4f808c662f4594e9d3f08ffaf04de673e2469b985421da59198abfea7a42f474f46bfeb0535eebc732cd0adbc69439969d5aea72179c425bd6f8ef1f87ced51f26d8141fd8a9ffdb2866a9430982fdf47501377aff7b4b4dc57017da84b27a90dec14a3ca07f943407addf8d2a7b1752b6c723f6cca355dec12cc7d3b894a2a64b3d5e7df75675abe78d5fdb4b6f49bafefe50272a4d82e780cd0742338837293b37d4491b3042a403a4595c4a452b101ef7cc4c99a1194e04a0207faffde2a701b169bd7190d8b5ffb599b76065997671f9fab50afe1bbe89bb432fdff403627869896684a2e99684b22213e362be0e3b8c56f9826b66f95f + +Input: 6fa131373bddcb6e92a473b561e7eb356222c32e95dbdcae284584693dd6a65fa73a9a7f15396cf1c80af39fe90d559f2cfe584c6d20fd706665dbbfd1f1afdc3ecc019b8e916929a7d3294910371c130a236696ddf7308bc159c7fc77ddd95c29f424c3d34c52e6cb179c8463db9c37eea4d52980abecfcfb88cdd36984dda323a6f161d842b400d43d7f310855307e18c800801ab25eed9e5020bc0a26145b1b46eebfd3042f39fa60d6a1ff7f252756bc1a32aa5008f7ec108c6ea13d7c02b09c6e56ba436140cad7cacbbf1e72498daec6063a9e808e2e5c5b72 +SHA3-256: fd2c3f9cdac7f91078a10d355476826d6bbf6d02a405d2352bd26606e44774cb +SHA3-512: 7ed204ec21bdab22f614feb76d5dfe346db0f9d9e80c60c1c3ae389068a8a46458a89bb40cf6612bcdd5b4288f88ffb7f272e6340ba22fd77b2b20501b515047 +SHAKE-128: b95d0619405d42fe90685f69b72142597bcaf22ec65570e9aadffd04703948e080cc49d0174bfe41fa6f13f11a5119b7749f44bf888c22fc59c6b37346026707e291e425aa1679e99ae7961a4be4704bec2594693e4a7f61904ef63b71f64cb15b9e5bb60673d09bfbf1cece80c1719ea40fa4c53b392e5330477cdeef1018866525573d369d6a80482cd8715748aeadabd098bee76c078593e41bbd005d105de305da19988eb25dfccaf184d7a4bf64c746fabbc364f7b7311dd487e58b487bf65b6f71cb910d19e7fb39e65277fed62fc9b643e4acc407860f03d30984bbfba3fc6582c9764acc71ec085dd60afef98a26f3b197ca350a51f060d0fb41791d26b75d2abbb56e4f2a66cd52a17927567d96add00ad670188e37483f0a979186737c1d0ef2cee2d069263f4cda24e1ee854f72a04b6e4f143d38aca1ce59c15db9b685051018f8da6af676e575aba73b72fb8f003afed3914e94a909f777d14275917d93e379b935aa85e244bfd393603e97684de938a238cf313a10d2bf1a685f8e160e5b07965a3134b9d8edb45be0144e15935c298178c9ac99a454c7e15675166598fc92f748fd1b5628b78c272464a918d4b8457802613ca5bc5c625840b9c0d31402703ee690a54a108744227469485ab9077e67ad601273b927e49d3a3765a11b05151433d55b90952f60fe85ebc3316019cad8a26ade71c3e1343be0 +SHAKE-256: 1e9cc160c14608841adf8d1e4ac624d21d78d32a328afd902ab47f4de60d4e2e59ef9a02164a0c154cfc8a28c7f04dd2a9d64231b5e3d4cd9771188a713506baa5b19624a695d9961cb0933e3b47ebac81bfdcbeec31a11f1210b7013cf283e72630459dbd5fbd2aa8a6385fdffa5dad56b7465c6ce60d55f1c84580af7bde5572fea4427a845fe0901588455ef0aa25844deadcf97d7de3a3425cf13044fdc1a07336d0894780564afaa51e611736540a120cadc9da3773b6b42da3f7f41a320a34f87f8d3b64965744fbfeadd54e7e14721e6854a20162e73ad12dd822373451719986a9b00a91c937e3a4b43ce004e3d96e4fbcc33da504359969de5d77d248a8507190f4ff549fe8d226f05109e7f9b3bcdb566c7dcbda6d5d2a232fc10831cdd75c16360b08a4de3c2ea6d91423af8857807d6d157d6400a867705c5be7f81a0768be2cc23ee571d2d3471ff098e4947d52bcd3f5517373f90281119a64ef8a1237e171d1be6efce5ad4c3900ec3bd8692fadc2532fa19a3cb99e9abbad977972b4fcdc7936b123f46f3a85fa5b09c6317c22e75c1b9fe5543a6c07b3783d26bf405990548a79b5c69259e2e6ce04c8adccd55a03a0a31e0d8f8308ea8341c4aa85ea55ffe842ac70c8729c9d01aa9dcc821385369931ae2e60059e333a93c29a95028529f1c6bf029880448a75647075dd5c3376685ceb30e8f490cc04 + +Input: b9e1022cb42a3684e1aec794f8a8f756a64c587f1316251cf1916f771cf8a362dad0375d2fa6e261c03fec8e9585957665833369f17366494aa73aa82d6f44edfe57b100279588c78d479e997b4a204f5a111cb1c2cd2c9279aa77c1032efe91331b1cd624e5f1e77d8e852ca17d75343abfe974025222b84ef6771b5bcd25570784aa92e4b3bf9016742d0bea2b0369fcfa8512deb4706a456bee23396de4b0df197c76e2f41a14ee60144571e6c2f934555337d7da5c766758d5c999b1ac28912d0832d85a5e8b440b76cb5c27400dc8b5a31e8b92625863f923c68b +SHA3-256: efb0890babf7a400b83eb935027ffd1bd2df4eeb5baec091e9eb44ab51a9b8fc +SHA3-512: edb5550e2b8b3b40d5aefce96584b96785ef1c28229083b71f54c976e476322500e226d785b9ab077e5093bc0b9d082415469ca1e38a820c2a5de174bd1186bd +SHAKE-128: a22f4268a32b5b4b44c86ec91681783ebc1eb4804383dd4810f337a593679e4ecf08dcaada1241873933a317eebca8555452668d08354d574e4c08fe4649a114bb93b95dc1a6f2059eb2bdb128eb4edbb28e0abe9864123ecfb58a021b277245288b347c5c893e887f82ca586619014324dd48c9632344db7c1210bd1d727883c3f0ba6330ff35743bb57eb63e221c4679c8b420a7e02ef1d135fe6df87800450ecb4934157b8be0fcffda26b41b5305f7b6fea7649fd2b8b9bd23e7593f76f607c9d43d601904536191a86ff6a04897b07b2795b65dc5bf32e961bf63ad90956e10ae1a7637fbd65d6ae3ec96f76262111441dc03ae5f462390982a8a25366be832f17410af15b1fa0bd6a3c5a0979a197d0cc0d517ee4e2d4156326476ce36925290595ce768ebec59a4fa663aaef28972485595dab6af269c101dc5a29c88334aa6df15ab98c1ebc29b4cbb8ae8b2129f9e104345224b8645956812e12cf311dd9aa20a7b3819c65a357f8c449954b38aef6530c5fa1412bbd7d96e9c48408b1e656a6019287cf915d306b9a08da3f809fcb2f418b4542590bf8c0faeec9a9b23f07ed46d6ada2193b25b2d962c2680f2e7ae4f0bfc22f6662a968e6e3246ac7a190e4a0c2d18ce86cf8d89ca492c319cc6b930c66001b46ef9592c95f28bc39db35c7ab3c1df4b0f35310c4b5402cea6a367644979001d98d271f3728923 +SHAKE-256: 5b0b619f4326d8ab07f2d3409eb2a60a9f64e4c9d0528ff62bcfe11d6ef1a10f10dec37310652fcb850d3810f14a4c935377f2a6f337dce0435a98fe2cfee2aac478857c122f4c00642775a4181e571b42bb5adb26c6e9ef3a47d8c022637aaee69dd1df7f38edcad32992a32f8c60f4b8857a834a6eb915f95c71e0a4f2059e7124e128108c4298abf7ca7e0c5e3e1dbe50f46909155e3459b6870c54963ab7cd05cc32cd7811058fe36d0d530e3a35613bc9e142d84c79aa3c9837fd71fbbb139a275596dd9ca11708e6af3bd585d1b7c4724c512cfb9fc27d1b7aae8536d2375ddf0878ccc567ec1dbec1cb45f714d11795e2f3ef7ba4849d3afbcc8db5080bdb0290a08ed432abe6f6f855f156b3fde73cbe5dab64ad6ba23675e3e1e1cd09ada4a9ff3791cba9f8c0e7d55ea04360ea2a6c16119f8aa3d174623e82cd3a3a252ef41439a1bf5007ed46d56fcc86ab79be4ffeff432e02075fead36a4ae122e82d99aae98740f63f2a1947123100340176fc7e95e27a18cd4a267cd36990d48c40e6286022d9ed15c4312788326b4d8178e2a3fd29c1653fdf3d682cd1c632e83628522f93e62fb0d9271a0fcf5ff3cf5f2ba2e77a7a0fec43cadf9759c507fe320b63f4d0e275b67729c9a44e2df3e8c772bd613f3f67673686b05c4507f4ed658bae79c3ffe0f6fcbe6ecee2e3dd18818bd9a2b478d900c55cc4d587a1 + +Input: d2e7b64a739968d0ff4bc510384c1595cb05c116d395d6a33c5cfdb63e32309a3c1215903253e98c7750ab96dff0ff67ecdaa646d819f529741a5840cf3f9705b99c23c2675e4a9b8ab6ff203bbd0d728669b74a0a972604efc3a4749573a4e3817e0f1fab98b3f284a786f74bd3820108507e52869c91b13ec0ea35a78c1607c108333b5e361f83d62d6739952a42c69e8b13cecbf79058e2d2a0893c0c9b5b95c89befc4f3bda93fb384619641518d0a9a0959bbface9c812919f7d164f00c3c83f63a378e344739f85cb051e7585838a6efe702995488c9563fbd5db7 +SHA3-256: e6c1394d221492fd974a0d23ef338106fd00da3fbc5387fdc65aa65fcfac5ab3 +SHA3-512: de58b8b6b934fa8b0a0265152fd27ca21238881ec63df087cba563ac8004381e6914e10fbd9923809c4bd4774d81bf7210ea4f6a31b12882e2ec9209deb95494 +SHAKE-128: 5f0f4622976141b865d9e3ad87e183d9fe9b05e1273eaaed54ee0c0a67e0372eddb57f15222dbaaa6fef3874fd1d12add2996d6330a456bc7f5c2fa2b7f6978abf95e039e71511f9fe1796ec4b62c88b61126f14419109e3952af405ec201407b4419c0c22115ac446c408a4478f2aaccbedc57498079dd09ecd04d112ec281f325b9963432d81daf36a6d86b47c411fa6a36bda6c30775996d7cd088fbe2457762a97b0220d3e5c9ea17aeb98da74030d4e20aeb3fa0de06c817a76ee5b43bc1b0c148ef307bdc8de41bb7817c9441d995f7051810ff0a35fde819ba1216bd7438830a7e55df1c9740c5445a5feee2c189b279362d361ca77077602765936474487e21670fd4bff6998480d65f4b25166cad1d1af18ac0a25bcbdb1ea8d1234b314ba89794484515199c2ba0da2c7b146123528769e8d20ff44bedd3eca08ad8c44b549457ee1f3d5a2a82b182c4f086f1dfaaea9c85b20292fc751ab5aa722b15aba228f7e8e8a9db65648e26ce8fcfad64996789e92dd630f54c7e52aa23b0ceb87d0b23a195f5d5f8c7c5995f2dc7f9a66e4f2632039a30e2eebadeacc49d9cf8f55382c0b68c4e15247a0db9bf74c2546b059397cbd0eab35d0059880d7b1bcb401f3c6df52f2c85dfd75c59832df53875176455a982de055e778a3d3808118ec3fb7c9844904a8c2cec582d46e402155ce5043e911655fc1bfd489de3e +SHAKE-256: 4d3c69d1ada62993b92c4fdb50ae2d7ca5f713a14140aa07bec80366bf55bc77128bb4303afa639d048882fa791fbe2b7b7d45ea00b56ccc0e7669862deef45de9506660cb4b947090b7999bff417c9dfb819a64e4d0f2c70aef7c247c99563d5eb10da60ead138c1e6a22f8495b46d351ad7679f485434e6cde0631ac0530af7fcc621c1f3fbb9a83426982e5b0d3090b1c7828ae6440330a7ef824ab181f83ef49e397820139cffbed2a10b95a73d7903e20d4edc3617d155f5796de67f046406a9f991a0befc595460ba44118e05c1ae99dc5ed27ac7a368c5bdba7d0dca03b1b8f32ef42ce5622febff0d3f1681c5938a9afaf112479724efa1fe5a2603a048ccf7e4111df7f97e2b841dd57388ff7d7ea014c31c9554eae3d124f2083d88d3a4df9463f4b14977f3772aa377cf23f6fbf4175d2112c4d82550b11bab7d151d1563adee205ce369d83dbb6277d97d33e2bd679a8b7323451c48fb2348f702ab45f5cfedc8e7010d4543f769ea65785548b7c9743dbc3d7138a623ec8e0debb341f279b45642034c6718d3c4c89ef52246a85a396a1a7099a48182c2b05b2af7bf95cd9c92e611655b64292363876d1196db97bbeddc0273cdd86d6440eb253208f497334f9c1d24ac2e0513269e8b9ff518b27ff2158d24aeb177af62d070c50728e923dc714ddd144753e20db67843c9d74c2456a2cab9a332b9e3adc74 + +Input: 2094674dd7119005d478da6e45f2671d525a49ac99ae92a3c7f9ab8219a04491862aa67295d5913ac10b6f0d98a1f03064374e64c5988713726960f60d8f2bcfcbf429a963b7c93fe94b7b7226cdbf661004f5a450fbea217b4ac5c26be0cdebbe42956a95a8b8906d9ae441129daaaf78536789810c42d02929c4a36a74bb5b1ae5e215e4a50ac80d6dae62c43fee51a10b6931ca30bc1ef311ed0a275a876f089597dd8aacf4550274ac74f3452fa0e50e2c36f479142fdcf92245b3b7debfb06b264ca1402a22326f74fd3e41daeea7c79a2b6cd0a0d4cc8b1c8acc47b2 +SHA3-256: 7eceeea660220975f1578f3956d9c11098496c586b300273c7afb3e2282947fe +SHA3-512: 59a6b782809cff21fae5e6aa532b5e77e23fbe54d608d4af5846dde24a153b2aedb9171ab3fc1cd0a29dfd49bdcfb207fb9d0957767a8992949206b17d183820 +SHAKE-128: 8c3549380e57a3d8f22df7e3f4805865ecdeb8123d0f8a245e27fc4d24c4ba357b25fd6b30b86f98a136bfc6915f0a03f7d0b4e10ed8c087005d18367448e0fe33ae3398502d0763ab2580fbd3dce177a0b060523585606ca5e39604b8189c7ccc8678c90a94319bc0481151cabfb2cc5a75f58adb50cc5d74a46394c285fd534339cffa0705da3e98e707dbb49ce825ae1fe06e0d67b0f16657fd1eea9c098f8f58a2582c6b5e373318256e14eb8cae459cf65d6a3f8406f20115e30fbf93b4218afab25ce4e6b9ec3e0ca1da5f8c7508693c3bf5251bb144d3d99151505b736abfc3fbb9334f153476aa061d505011c1400a61d2efe1f614624051ca3110916df5c528005a5dc620a17450c1fb38d2c259c072976869c26971b227dbac11ccd6f252a7e46a0712f0d4c21f932541c13475e8bfc38309dd9b7965c6ee4afa215f615111f91bc7c20dd36e7cda9002790ae74d6596c50b0362802da7bac3c1e2216aa6ffa6204cb63398a31ca85efe33738c56f24509ba2a5103fb0b2f3871594a9388bbf525f621e37014bc18d22799c7d0605cc22eca7e868cab468ddd148f8be75b176161c4415bd2eea507bb0a07376c1b6a98b49c3117ee13dbbeadf165cf7578b0f6483d046b71887424799bee3aadef378c0eafb8a17869469ec7fe636cb4bc9fb906ee52efe895a9bb877f672bc0274807a78ecb93b2ce1979e3f6eb +SHAKE-256: 355b08122a2be5abf4df4645dd14aea16fa1918cc3ed40d4c90a3a357ee8e9f21cd5fb8fe964b3809657bba88e071ab7bf283e63fcfbe3e74d3a4037426e9dea2d2f485c5cb2d947f8bdfadeb2b10427f2c85e5523f8c3349e87ab844c70f6d5628140447db1799805987044613990036c42adb6e5ba05fec30f684e4627cba7f1a479e1c0db38fabb9942021aecb532592b0c2315d3a2b240afa80eba76da0ed51310c9ddaab22f35cb5496ce433b88b691e4c1e535629832a943c5012b6ef41f6b2e4a0a2e9240758671ce5fb0b98e60c6abd58c0c2f6137c4eaec12937208a6e8072ba5574b01707facb770fd46d610d496d44f6c354402264ca2b7cdcc8585959852d5d4bab036cf45b21de6fa975640bcf7852181e102f80e5865332bb1299e9be8df2fcd7f28167891fef04aac71eadd5febe3d463ca3393ab559cdc2a09859aba73a4fdb01bb7aa5197a0791d973596a3e1e78293e95dbc6ecd6e40f69c2677e7930c2608d01375039ccced676c8e4c273ef6bf51e705048fbeb7414a266e92d80fcf3de0fb4c3c4d3d1015bc88d75926d1265f2f818ff93d2fb4d2442b2688b7bc92bbe47125ff93fc32114a82069399146973aa3b28f829f6e63029303ac6a3eca672b759f5c571ed58df2c280ce4d47213769d14f2a831f88d3dab6b42a0f2d553ff0f1dcae10f8f31f650ebb275b78c03f6a9928972252482a4e4 + +Input: e73e07075122a733ce1ee9c612ebcd05343bf8a3b21dae3654fe35517710bfe48237cc74ec93ce6f6009e8c02592520dd301029d6698cddcb60b9dc89810ddbc5d6f3a1ad58611aad8f03e7dcef01581b8158cfae6f8de0ef67c07144c35ce0264ba68e382f06ed0b547a057d0f2c17436e94dfcfd1562998fcdeeae1184a57912b50c38d5f4c1c81ae3aaeefc7726eb8acd7fc96cc103f6e16907cb9d8866ad487e986ce13983d9671b7eb249ff2ea341bc2cfd723ea6b386ea2003d8ee1f7b6da85369a1072a789bba58f331709ab77ef98f36419a2f363975c362b5f779ce +SHA3-256: be4a321e0ca25e0bd52dcb9958fa95458daf8035a3c1ae3918f4b266e892130c +SHA3-512: fa62af07d9164309ffe3d5af24689ec1dfe173bfd840b13ad9cad29447be6fcc87f54b11d2e057c878ef05eeb35fc564447696835194aaf78e9b82ddfa6f3169 +SHAKE-128: 2dd8651cd1299041d6714883669dac82cc18686d18415c551b45b85f0fc87a4137cbfb973962be0c36ed388ca1907eba070198a3d9b45a4133bf112ebb44add9deeb41a66d15fcf2ea7b78467e7d9c3e3c068924bb507d64484019087197a2b72c52dbbef11bef6fec3005f11a4093b72d4aed1eb379f931a85f6413b431d452fa4bb251041451e6ae39195be4588e96cc3d05fdf08d5abd46b49fc6e1d6f011c9b55b71ed135e599d1135c28f237a8baac0f22eab26e65a39fd8e2bdcb133917386f13fba6e6d62705d52add49769572f1a7cd1d311a4df1f730ac3495c938157c0fb607d30a1a7c062a2327fd57eaf3bce8e54b8f00d010dbac6bab6f9158f7ba7d42a7451886dc84b35d08bdbe35e07d000653face42e2f0e86d95e9055929a968ffa292adf5e08f24318e76be64329a1b1771866686cddf24c16e413ef86797e9bd850e75c8224ab2099aa581a8f2010eb730b24e1894e063f793d4c314876d5f1544476e371ca49bb1d1b8948844932590cb91c1b3172691a7a0c1b2ba1c97607c1979b0f0458861ffc81a6d145f0f55c01b6f62252ddacb917f7502da29fc3bc829c759ac5b3ca506d61beeb1d60de4fb59ee2adc7420a956dc93916c0cd582e7370b46484b9dff822b25914cbbc8d6fcab14bf31c78f33a2f0b654d10f554a23f0b4763e0ef3a1bd151c242a32e5b56ca62737fc1dccf4bc48f5cc5d1 +SHAKE-256: 807fc779a3f5d69eb1d86039ce80eb8e2fa49a1afc85968322acbde10de1d3a73ed5d445e0ad12e53d302275d4af9646e2a5dd034aeba787a8ae4bc7311f9d723c00a231d98fc2c4ee9d615e92643e0e731cc92ed0d81e8f27fc66be870441b7bdf62125c56bf5fc1bd3c667417a7d290588ce8908f9450dc1604d5ddaa448d3aeb0a99a5b53157d2660b000646c098e5f3ed92e0623551274d5c24896f77e513ffadfd04b1621ebaef5d68e51f0d08232c4ee837d0d4a5941e5d92e043a0868b5ae7da8ef1252c7fa6c6fbb5cb82979dcf7ded7e2744d6c0c03e6d2f3ac66d3bcb33937239026fb65861a1a7584e0fbc9eebb578e67795bff259432018b69c47041fb7e1449c4753078d4a6c305fbd6298fa3562c0c132492e45b84851bbf65f445887ef7242ed03fea674d6eae4866588904fc97f4eb42d83cfe589ee88d1f69d2a17529733771b3da7997adfcb994e37ac88ab63c37bbf2e34824ad9c84c9accbefc5f0b6837964dce191adba8ebbc28af0fa69aa2863c03622f7d88f98ef1d08cda19d986d5050c28041cea7a90bdda726ac80ca314879d1bc1115f95c747abb923bf6cff4b0e395742754cd9c454eac925c7c71a3f97ce529b2c47f987cd00186efa82c8fe9e0c5a63669ae1c63c51062a067da99d8591a8e7f4c4fcab2e63c08d543183f33abc29fc833b64aa5d468d295c120f30e1e5179af8b2ebd4f + +Input: cd1fed9185894cc0b898af43a82e4ba2438e25ebde851b74e8ad73046fe2fc64c8c6e1e0b0cb4ca030aecbb2daf9374734cd610545dea0dabd9de9a7f9b00523e73dc571be43de0bd4b0672a3eeab52ed078055764fbcf62e428f0ab0ed025ea1a8d385c550c2028c0a790c96a97350c29084d5d5103a17484b686fb87506aa0a66fc772bf16265d55c42994039c04df6bc8f34597fdfccad61736fceb61797ee6d967d371fc9f440d18cd203bcecdb68c1572a80478e52e1bb497c683e4c30f4429a6186cb547ea5e20a51534053cb9841cedb43c00e4a0940319e1987e357f36 +SHA3-256: f06aa9a208ebc715bddb0d95ce54c5db83f6fd047acbb8fc79f655e8fa052edb +SHA3-512: 3b7aa9b35135296bb540ff7598163a5cbfa2c89b32244586758249ad2d42fe4072b2337e2bd03d168f01b3bd7ed38e4257240fd9600bc1f7126a7079d6536862 +SHAKE-128: 11877b7bb55a6a18cc0831d63f728e0d8d905d671cb76dba34957d80e996754cd43bc79970487f3ab854e7f4fdf4fc7494b1db4fff800ac58fff7b7b3dc4979a813eba74a33cda86b2e435dca8cf7837f45ec03c0415193e3d8be306daae69ea8496f02d1b7372d43b1b72b511a942d2b446889e6af442d6dafd811256447715f40bf5251fe049beacdb234bbd04e2285c49148a1be827b2f78baf4794ab234c059b3415a8885e2b7a1f3b7640fcd0ab5086e8e27ecc681e6212af4b6c415734076c9601bbe45376458641df6ce334c0ce6da0c2c52719275886fd9fcff2abfa8f8cca6f8890d7db14833699417ec14f7a0f965b72ce1cfa8df14391a3fb4c6cccb85a0bcf842e81ed8d72b8579b97fe03e7ad05ba5be5ccd931ff1767db75ab0f2276b0dcbac3ec726fd7e5921c672a71a643c845ff07731ecfc4df29e18a88ed9cb2d15616f312e27355cfb02a4fd7ed8fe3ab47e02296552965237bf3a438459282e9b22248fe59ec738f5421821c94badecb1a2189f7f0564882253a0a413b9827ab7c2c667fb79ab4fad9e90f379d7e908072f67bbec26e617ec0dd30bf711f6a06bb374d43c2e8d73348f146b7b8110508b2ef9db3fc952be48080158d8bb9c283deb5dc99569c557e9d34ad63648eb98145b14071e879211b7613c0ddabe81158b656254630f7c41e1f52eb2366d52a21e574baa590810143a68bab97 +SHAKE-256: 40eff28bbf2903924dc849be6b9771532cfa3b161dacfcd9498c41a9079cc2060cd3bf08ff59935d8f5db4f90697d10baa8b198cadfc220ad9fe98cf283a6fbd4e2ea969f3c57921657f7b06246155cf5ee8c342a3e8ae84b790093028e5fafbbdcbe9c67ee429ba46e60d46e987b6f0244850629844cdb5ab50622d9950a2d8a4e13f0fd5bd49374c8c437676bda33d74d9064b5f53309bb9a33e97c62cb4cc142707b7cfa41aea84a5d2030835b1a6f5abd7537ef1b4258f7630b7c7b9c136aac3b52bace1de79b8f35c5ef58d0134145ea531f3d68350d47ecc4f3f1728462c5732c8be5e52bbf3e2f980853af28da947e2f2db359975c1b562f4fe92494e00405627cd86728dd2bdbe054181cbcafc2a35a31c915691c1f3ecd5d1013c2ec39356cc3d021c328b93db7180321bf7205548609767f176db2f75e94cb4f453928154f2581ff3ddbd490d6a20a354c05950e48584ffb13c3290a62bfe1d01c9327eb3573fa454ae7826ddf241a3b066b748c0bad8700a997a87024f7846562da8bf417871704c2dd5bce52ee9de74038e7cb6a325648cd3365a43cc56df27b00fa86ec73b7e941a19c601825bc6341fae4e4d1facd20851850f75de764b360618a186edc16088b42389ed720443c21589df73baffff947d22abe451f6587e94818a8da7909bd540fcb76dcb649ec42ffe04ef4b11b5bca526192f3b5ea394da + +Input: 1fc72a8bb1cec04d3a339fbb52abdbd836feb9767a08e64b4e9d58d009672ff8894da74bebdb712f7aad1bed506422d7e8462a0282415d2c54d73de320866801b066ab53090c5c01478465c9126e55443a8bc15103091fb5e9ae3c415fb458ab992bc6efabeffff1c0cc75ee707fcdd895ca1506d08dd4816e69c9afeb06da6c373ced598db76292514f4b2a9f2df6371d3b4a835dcbf8a1782c679bc2f36ee57ca6a11b9dba1f697698b5cb7a3256fc7ba3a914c72387a673d33e0ae8da86b8f6d335c44bd5d428ce627d008404a7aa167a3f58bb5c49bc8a5953898eb2eb2a2786 +SHA3-256: d2386e10efb3242941654e4689d834ec59aab61b206ef63604e26ec12e0af924 +SHA3-512: a3726541bb21a573fecd0a8a97cd98f9479fe825515f637b3eb643045eae9462818b0588bad1ddb68ee0aeaee128c4bd374a907ae34b4b5b32621228939a331b +SHAKE-128: d5f964e616bb9c72dd5b7e7d556c072bf209f26aee132c4ea6e60c4d694649a3407d0373a77b97661ea19d9ad295e1ba5cc9fc7bea95d1e9c2a7b75834206386d176fd80a6e59512423da1264335f7058fc7cdbf2511d0cf5943d3455ef208e39ae6b8fbfe3fab43ef37c109fad914494d769c0c7ba2d134082aaad131d04a60aa3b09f08b95d0ad14ec00068f2684aabacbdccf1fca5b04a9faf6e176b2a853c2a4fb123ae0ebf6cee4143a5556e2926b101c25482889df3e378d19fe785354a890998c98434754414ab22d9a5171fd19b691fede3651eff98619c176fe77c6796a2a14da4001319948f501028dc8fc33d344963c760a05aea218a7c599221cde73a4afed589a8cb3fa7d96b30c3e75dc76f9d9eaf35becafb09b221a38af21e3c3fc9b065ca8e9e8d29251382650064c6fb1301b513a0a33057f5415851110bdb5086faf2e359f98455309309eb4f0bffc550e14edb9c2980ee9409493edf531fd05fb65a8d14cae4cb3ca64a02a217003d5d1e4284f28d494a9dc6718165c95fe71926e53cae299f3a23787d022dbd00d0836e3d002de66bbcc03c34f039b10495273a0eaea61840040fb7ddfccc44c6ac886e27e58c8103177b8260a88c2b48b9d6aa089beef1f638d08e48cf1292e469f8b3f5f70c0b66c486eff552b586feeed84c347ab68f8537db7d640435c394a5d607114dfa7401348942b0eaa51 +SHAKE-256: b7c3409ad333b73e68465aa9570430a479904b715d5a0080ffb7860e9a45afdab76c8085bcde027ed84ae86688f739c1f43a998902259f1e6f66d692c9886a5fef9f992b2ddb44c9cd900366d42f7326d73e4984a2734fb2fd1b6ad9a8878a93b1bed8ed48d3d59a19d54c28d7d91c3b8e49137212e37533ea67d50e64f239e54b6ba1107e61198211260c98d4c57900c8f859280efa10a71a26f1831a64425658d33d1991f3845c21cf7faf05aebea84f48a3b25501eec17f79a1bc59a4ada9efec85908c7810847d4eb9f2bc361cba3560539d2c7c9c05b866178d84dba73ccda44fd28350cbe49f5db53449cb34779df5fe8fc2ddabe3cb9b22d6678db2c072aaca0e9642035b28655eaf9553cbc52c333723b6fe86fa378ddc8f587c5071a07f198fb75d6495180952cee3cd4e4f4e8af616ac3df77dd1801db4ae94166c325c5c81c5b7430bb26910be607a2d312aac29c84615a038b024d3ee8b55ec5baa16a42ae6586b84ebb2c0a9d9faf52922f056c0301796338887306be47772884c44785fc908c9b3a6208eac5012df811567be0ae322fec748367219e235670c092729a9f1eba45fbdecb6cedd7f286b0d810199e20090b9b386718944394d66000d57b539e6ceb45f9a62379d4e2cdf603af5af7608e5c6e6ca8758b42a4e0203cbd2f7b95fb10fb7c4d05cb0fc1b8ae02c16e9a159d9f4e07607e41a7c2b6d + +Input: 70d04e8dc1e06770b25942b7186becbcc0ffb4e8a13f2766b6c2ccd3b6401ffa5ba5b665b8148b1f19018d5a26d5c71836b440e9aee504a93929b18c2fa208a3bce013b0a47d60ff083e73f24088d331a18155ef8fe0ea2870df271600f25e9b4d2ee33c8c84286c7b5ab9e1a2330c337d9012979e77d0ea1ab73474b84e535d7de9dfd9d93573665129abc71daef1f2c927f06f1bbe949cdb3df0233ae3cf347d7cec3cac84659832c43de9bae20b3238984faadba07759186ff5f42635180e85f20cd500bd6f0db358972cb6fe33d0ae1a755200e851deea582561f73dbcb99a6f1c +SHA3-256: 703f307f54c11ed6d0c78a1a0bc01029018a30eedc44c73fcaad5caedad1254e +SHA3-512: 9ade73c7c87619441fcbae921ce91fa216f23e069e472efed144e482d98450104e3a32d97e523b2041601b643baf40d8f72959c67616716a40a2a5d56c020f94 +SHAKE-128: bfaa2b064b5fb2e34f0fa5c756a3aad82d31e66e48953795d8e45cca69c91d93062a6559eff09cecb3a2c43a4486a034d66132f78a6c391351a9870eebd1e735d51f94f0f48cd76ca9d4378249bd05978cab5066453596f63b641ba4747ba05f09ecd88e457e908360c8a42266a34a38f4654a572e48463197dbec3c441e5466c7e369ab7995f4406626139083ef8c4c4a93da9acf5dfd45aae9cad7326cac634fb1736d1042ddd47e09e21610aee7543a03f22d449911f2c31597f76294c320edb30efb61a398b33fcef5ec7e96fff7fa808471d11576507c59b98c22d76a0d0bd51981dddf33999a288982f27168da573763c01ceca70a0cc839ef1054e042af22a4a7f74192fa918056be04e3c9f23a6da2c7b2247bfb2117576126b7d5e12eb9a3255bed0e6f577fe16bbe7951f5535468f38cbf9c4c756d1a367c05a156d41877dbe4a18307eaeeca046d8839536c9fc3fc65931c9d8b5c7532ed01653a318fe34c2ce76ce8d3bf74fbb50335236686917b0afab7db8fb2e969379ae9f74afcdba9544762021c12227b9200aaa531ec0bd31b4df2dcfb3fe799e314f73abaa6ea09e6b24fb4efc15a658386e04d708ba422ee92bea57404a1812ce543973e594974441a85d0644639c339cad04fc3d49d0d1dec72135d51df26bc536a0dbdf5dc298fc7a51d110b9b3c080855f4b1d63b27a2f846c46eabfc10e2456110 +SHAKE-256: 49bb833777715a6494e67abe3418635d56a7fad04fa5f5a3dd783be8afc5a370b546d4214f200e2eac6eeb87a582f9221dca350d8f982892c610e58039824d29432fa0979fea554035f28e837d780dd353462adc7ded030985a8ea71a204668e4c625645d1a0444ab66bdbee5d3ec8eb4f736cdf2e2227e94080fb0c9b9195ca7cd1157d097f045a458eb020163683af8aad2e5c4da4cb86a0cb7a286a577d2d14527bc9b16319d71e89cc109b0515246032fd2770db3e3583b718cc97c58aea39bbf3b57be9e0c15aa029350e4e6d2baf41a229b76f88096296eac0998d5b15c031d3cad4ffaede1d8cd61bcaa32cd8354b2cb672bfad25919f279ab34577c607fde97ef3b46b00f7521380931508dd5da6ab7d3487c37932b38e57b4efad36f6b420e0928e658cdfffcb72fc85719511ec4092fafd7269ad0d53d37d29ba9b5e08ab2b0f8f4e47db27f5640b28d246e07e4f9306b43bb10e78324192aad60422846d340a4a5b1d696658d866f7b426fbfa430d337a609777d994575e44f67d37501d68fd182167eba82902e98ae174d38bf9d8e209b65e6317136c2b08e80b91947c6ddac565e5a371bed59be36cb266324e6a12e9db7479c980ddda8fed2e34713ecad65c54587b72a18089d73a2460c53bbcb93ca303761ef1c63071727679554fac3fe0629df21de72e11fefa25cd6b018b29913ed7f4f7ea2cf3dc4de7 + +Input: ad2714ee315407195082a3536522a2e842bec353e84fe6e582fc554fd18d202245827626530256457df1fe2de6f3598e9b9adc9b28d4b4df3356fdf5823050acd63a25a54a99f4cc5757ed6caef879edfdd8710191581121384ed1beb5b164333ec52d9b464fca768c4c2c3b63a8f41cbbf025d3ef84fafe788fbdece9f5397bd66493de3a37b8c0ae921cd401a903f70e995cc42db68e30981cae1853632df17b87845029726aea09666ad52c96170c1eb445e107f156d679b009cb22aaaa9578abe32fb6646a94e560097ae9a47116132fd4138765bf212588d8a3d46b929ad16a4adc +SHA3-256: 1bd9c2f03353de7628ea44b5bef95aeba9a21dd4c90bb5baa6e4a3a18409916c +SHA3-512: 17ad20dd30200047a91e41b7dfe5aa064d08bad5aeae8d9f016fbe9b45476199d60a778b51f1678a84f55184ffd5a6230f3f18a0ee2a04f8ba60629d2a5dcd67 +SHAKE-128: 42bc67410a1a9166b9ea6973f2648c12d7a79261e07f54e5f1426924ce222d042583c672f0d145b32900c01c804108bca8c49643f11cc0f9ff2f9499aaa411302f067b61edeaa49226d7c60f1a55d1a48e0b356f1f183f84746a290a418ba99555ba2dbdca7f64cf61c23577202f843928607f0b513446967a17bcd48cb58ee8bcb7893f07d28d0530f24c4e80e8c0918b8b9983c5a886dbc0ee5fda2b36156cadc431b3a16d1e331d7057d75051ef5d27f6e503fc7c3153f3f633ff33222d166d423761d504af6c719552e402537103472f5863a6a6e51798411ea6b8c45be99e814992900689d1e896a5f56ae1be23c7403672a457bd3618be91d1b205ffed5f977de87721e74da04d479cc48afe57a12f3b31de749863d13cdba19f31f17601b84216d78df3eaf969430c7d5b1c6650807b50eec170ad507155fd468ff52b704a9ce7b67fc7d590efe25221dcd731896453678a2161baff4ef1b3ee14bfb7a38a52a7fdb5ca40ecde4aff429daab193de993139335bfb6affa4d915e151e0f7740cf608b322120b349747e2754522fae30d60eec4204e9dec55707fee9e1306e65908808fc185cfb8dfa8f730dae96cfe5b41fad61f9371d5725d8f48cd48ad3aedbeb8a4313c7d05c70a8c0f5fe8aaa65bb1d1458bdbcff795a34f15e0f2dfacd6de4063f22c19319702da0e31c935b0bc2814196d50ba76129bf77a25e1 +SHAKE-256: 3950c98e24fb4c5cdd6c408edbd9e25db4570e886800a4a1dd2cfc91f309e8118d5069f3e157a46509640406f92a3e4fb0138044f2be2f0433b1aab73df399bde2b74c04bc4a81fd123f122961ad6659080169fb70e95bca29cb90894035b4035a0439f17a99bb3bed637fccd6c2573085d73c6b7c312afaa20a044ec681b4c6ac3a2ce511eeb7274ddbebd97a7b49b3a4e356ecffcb3a7d3a4db7205a22318a9e0bd6c4c9712da89b9c47cc9e6d6ba23366b98d06074346b842698b9728dcce804b291ebe17b389707d6c2fec9f7f096e98ccdaf6a59f3e4cca0ed293a373ebc794d7d981be6987c565234f187296ed2edd3b0495713eebceb324c3a6405e9c4dbe7a71db01e31d1ff6ff042bfd3604c3c03a8e065867a3179d4989ae4887a70c89e05a746159c589cf4fb63eca84e13887d77822cbfe946a4cfaa0712f051ff2442b71e2057313c0952ca45a676d62e88fde29be01fa9d455db7fc3bd59a55e03d4cd04de3591355542b8ebf9ed1d2d3b9aa980deb0541e7bf8a00f2aac59956ce81dec930a848efb3cf45644b122937f489c4c92d90efdfc2c61a03e9d5f2cf4797e3480c6b5d4feb5965d62c40e055519826d78e94260b21eb73cb3b1e010def722c2487ed1a64492e8e7aeae6eff6743bfe4e75fd7193f9f739c543560611cb89a2ad9837b1db1c25098169bfc024610da32fb4e0ff3bfbac8929da107e + +Input: a2c824a11f6ccd3426a1f3fe6179749b3466cadf1e724d0da3007567c41ab47279bed7882bfec231e2952e2ee7f192bea8ac1a2440dc1caae0b02c40979130e356737e842d1fd21e3a87385228ff7f5609d7fedce7244940c612ea528ec8d441444f10707b5ad3a8a199bc3f795e1a250a59eb9bfffb7c4807d4270405f73eaa5b32725ce82cf86fca0d253b0e73031d3063973fe46ef1bc7b729237e0efa7cd2878aa6ff6b95dc4f52d0c2437fd35456b8dd2f6ed4470f709e8cd46700a0518d9761f3b8fbb039445f0153f0e782a63c1b623cb958926fcc1c6cf01e6b80aa204809435e9 +SHA3-256: df7ca5feb6d2ae7f7df2fea79402ee137b9e0cfc530acdf91051c47f6910b0cd +SHA3-512: fd58e6f16154ff640736467bc3edf239ed3d1953d47aa580c5ada30b66713737be1e4576668a4b5a11afd2c06f30a5cfd24a513ea0ebcd2a58b9da1de24f478a +SHAKE-128: 8cff2a722350ea98908e931ea11ee7ab3fabea4c775518bb8c4a558bcec9551a6304a3b454280a51c88a7449d0de0dd5d712e2272f0a39a66403a0b96acf8fa361ae3ee963b17965642bea6b06b77d9f9140e05d9c125660146eaf769e82ffa268234d362eb398962d99e83664ef3b850ca5fc9d696eafead038edf5e59c2ed95d2c5b2db4525664254b38895e110ee7fee96ac2fb0572b1207400cbb652de80d2c8f4b2204df7474fd65ceafec5d3af9b3e935f90b9e7053686d1283025eb2b4daa7381fbb403141f868a634b3943f25ec77fcc8b713211cd5b3a9d09b53fb249e43d230f992f2f9563caa657c63a1642f1de2f9da9eecc2307ad5270875821dc451bbca6a9159ed90d56047bf93b202f0428472ae763c9d2515cb3f54d70e57a98db95fc0dbb6261f1b1841f761a98c3bcc3d4e25cac62c5521102d8895e2018e6a49d46ad8759d442fa3cb5f9c2ab2cd5e1a5424ffe0107cf043593acba6500b0adf2d77fbc2eadabb14ef22c14ab1bcdcc35b8ef702b5f8d79da6b99204fa3771dec691da24d332e7ca3c7cd7bb7efc6872625d0ca42f8c737e1966dc376b589b6a937caeaa12e43094fc64a66dadf2b823f422cabce34b44f965097c15303712dd348d95b6a12da5c2b20a2fca05ab0a61910a8b423c4f952901ce09e6e1708ff42f664bf489290df22af6b46f212b54769d04e0383578a513a5ba6f522 +SHAKE-256: eafcfe6b85db69f2574ea0aef9ad40d2ffacdc7dff546f1fc1cc9c085887a2bfd4bc5a155035339c6c484ac98c9585d25fc4fb6a00164dfe48c27c33474538e5faba8d797533e4fa9960fa821de4636bbef413777ebe5ddb98a64acef648f136f94e3440576ab2aa331d46ed378bd2142ba2606b09f5281d887e351aea8f6a40f54e494a586e6ad47791a9e41e455b884ca610437fa9ccefa0c91060ae885c9ce83bc14e5bc7dd6b77fd9e09d650ccfe18cbd84d44e0d0d296fd698b117122ec8e343990bcafdf4558ccec74ed6e67aa0fcf83bf6b104ba23ca8c997737afdeb0d2a90aa033e6035d5cf9e4ca1f7cc8f604a0a508eee1399d922a8ddb5c89b4a68d5d4dcc5092cc19885c706bf8aca8b1d4747bd42cfdb14cecb075575994e6ff674670641c16f1487a423d39429b95b27a3009e1a1f5e068830856a4c14e24e7e292f195accd8abf7754699fd699f61f801a2fecee713f148504b0a31a75849cfd02eb13f3bc2cefab03757bce4f5afa07e3bfc701946b088e52e3290409bfd091940d00309ebea1b3481672168179cbc8983d38ec76e392cdc2dc19c742be1cdd89eb3d13ea620527ac0f09d7681edfadd8b83dbb308e5ef13438520d7459b1f836f00fcb68199a88f0e016d20b16e80ecc14ea8db369134e580118df9e5058d5f1a155e80f9a06deb871ae8d0c2495625e2388f5b6077bbecfc5b03c95326 + +Input: 1e516cb62bd6ad8ec887ef837fdffa0d91ddc85331bb24998b85601be2458231caa87da5b6571199b8149e166e7ef6acb5dc2d4cc00ca8f98758ae4fa342eeb8c9d097412c64898266c7cb7baeada32c01ea6d9970e6774d50622b94d8b559285e6889d3e10dbbd68b3fe6580fababfceab42ccf9c6815929b14e589d54de96ce09fb7e0f4baa5d9e7632cc642597465f6078d61914dacf3194f51dd796264e9c9f8115afb05ccf39b3bd800790468ff2ab9bcc05855eff48532e3f9b2f2ab1aa72323291cc3a86583353e509d26f1f4919a25f830da4d0aed8440d4dcbb5323bd3538ad9167 +SHA3-256: 4a68ee4e6a66e6bfa419bc3ceebac6682622419a4644cc7968f4aef766d43317 +SHA3-512: b7c38a6acfc5f290c3903889ecfd36a27277f19644d3d996fd17fc87f6fa2cd157d8f1be5cc2de80331867fbbe5bc6223fb7faed10971e46921903f1027770ba +SHAKE-128: 81fe3cef85559441ab5f821dce0b3ad7d64b2e731b2020e80e53e6989308344ad92aee14474092f00b64170a8eeace79c34d56d68eed7b73b3cde7884c878b17bc264b63c26556c0fbe0bf11fb8ecd4b4f8242b287cd75380db567df401f7d6308e4b611332a9f807c8ae99cea6106f30c22613d057a0b236efb7ef32de40e9a909ef7ed4560ef09d5a469cd77ec153baad98e9430a4a3fc0069d38b4eb841b81a64cc51d3a64227e5b4625dbd3b993dcc46ea0df6fa270965c5976ae8c24a3a9dc2436b7ff1091cc7332d17fe714a7e96dca4a8fb8a449ea8f27a46dd26a6d43d9a5c8d3d1f8af81a7ecb7813f5d488df3421993097d32dd7e80b1d3f1ed6ac073bc912c7df8237de1cf68a70e1732b71dad9596818117843545c88415336634988cb130670f7a92094e6aca6629cc74c7265d86d65f13cc0df895adfae2f7dd437b63e183738164098dc1970f186964183f9ad479c0c43d7a080360e51f16084a0280311e75ee62c2206ff42cc6d7e49c44ab3ccdf895ec2b4af2f05a8f2579e938f98c4cbe244523a7b74cababb8ba20af459e603eac6ef04e95064fce2baaf8e655b011f1e9c80c99cce4b9e386717b949faf9f7ad437dfa06f57ae96b6cb21f29f18f32cce94eb7ad45af041da3d6907397e787384676ff93e01cc295344ce8f523f44085c43aa305f97d392fca80e04e455a08152fa56057c4bc5a9b99 +SHAKE-256: 227bf6d099e53606dfe403f5abd87355b2c029daaecc55727543eba3575817ce10e5c3f0667b6eb3b008e9f60fd9f145097aca1381be7f06a3f13085fa2d62016136ce410ecf0f207b0a4523e88e5f3b4c8b814ff136f1248f206382c279d4ffa97d678e7cd9db52f5a2eff30daa414cab2cc4938586467ef85c78940ae78d6c40792055c8765c68a5b5f3b4d32806b1d1cedcd09c8df374dc97f9e57cd53633eedb4a9a2c05c7a71a2d5c7b2f2db3ac8a9451ed63d6b77384c1bac6223e26e9589974c6216d9edf79df139942363680295a18ff3cb2a694d18fc5a9bcb2b7993ff0acd39f1df026c19f7a3fe747c93de6faf7c62c3ffabeb6bec1be4bfbbbc83aa6da92f5a0d7f2b9c53e183c9a965824fd3070224ab01f48acd9cf6a1fec3ff48d1def254196ae5bcafa112ff96e83982798bede8d5f1a70ae901c1ac93103a1828d57da018a024e3de86e51d60f6cd322fb030a22007285b9145ed54c0c51ce711975207a4b5be0d1fb29650fc52ee8b8c82b2886cb4b594916de568a9e06064d479eb4a0b1aaeaafbc014c363b5a4593567480b24fa931fafd91279af2a71c636eb0de227134df65d364ab9ddbc38038d15c378d1cdefad04647332bff2adfeaf8854439f0da106daa77aac4df5ca5db19ed31bdc74ceee48eca06dc9b45db8eff7bbf8ec94e1ffa09579fb56ea974eeee091c9841cda629f3386efdc80b + +Input: 96ed40755a680da2e163c74eae0856f1435ad63e76a740a217bba48ba77f8387b4aeaca18037afe3f7a6b2fc27d04879c9e3e17a43612afc4a7f375a19c284d3999d81b5a55af26606582c0219479d37ad1458c3b62e458e572808859c2310db02441b5a90155d30faf0e9400c7093cdd4c43dbabcf6d54ded5adec2b11c9c83a12c314a154938479addc567d17599718a4df761bb7445b843a51cec9b8db24e11902e9216d9726efb72fbcc3bf5ce4eafda8952ee7bf47c1842b7c45107e9f6b3c08abd345b01ed4959532a4193266898ebfec430f58cd7e5b402e6c5307aed21e835be7fd587 +SHA3-256: 38a0f7c991a68615e43aad7f7113b6b226804c69fc95f80c185abb7f415b6037 +SHA3-512: 9273679e29bd1f463031883fb3511f16a99e143030491a404b98acf53d2bc5419e653f5fab9e05399c7e6e281a4441c34ae39c6b5e33047cac9348c77372c1ee +SHAKE-128: d38b3f24182a17e05bf408bb3e7f5d3cc92ff319ed295fdf2baeec860e95bc10426acc995b69c34a97bfa9dcb477b401a38b11f1955f8f7f403c1f0f8002a04d95c65ef267cfb3efa279103a0193729a8958ccdd6323691116cf9420f8b711d2abf51aeaddd18f588274191c21469b1a48aec40db903033cbf988dad24d8435ae7524f932c936e1e276dad5d80431838c228bdfa9d165160df9d41e98b130acc9c079ac4d3fc51386446e7c5c5372fc1ebc2d2ae430cb3418882f3ca73b5ea34396e0c1d8c00158a2b1f440ce2d9ed5449de7aeb9272ccc3fc8ee3a4058db676c2c7e8477fd7ff3e2e1cf618cc35650ad6862a66d60773d3c238757b573bacd1f48294068ab61c5f5f90c8166690b9b467f195b1abd8e53601a922bdb9dc0fab32c77d03e334c241febddd494bfdada46b772e62b12693960959c80b6d83c00aefe9d556531756699080fd813b4273c650094cb0eb3c6509bde4058abe10f25890c634f342d20d2d02d0292e5c23789ab5218956c0274d888386667329801eee01e4119984aee457209a9decebe578c12b76ca852ee06c1280974b42613c7f685735bdfe56ff5eeb44e0dc8e93f4a6b477a279dd78f5993c2c3b3b7f4e0c6a2deddcd599a8b9ee0b88918be8bfd2c68e1f58443f2046433dc37198126c9d5d08f54649646e77202292c4d90a70dc756990d7125b475cd8ceba8c0613347f6ecb +SHAKE-256: 16547da68d8251d8af605ce2963f41dff3db32f4b127ede06a714301adbd217c37b47877edf5a4ebb374477f6f23ae98771b9b0adfdfb0a41b8698c0bd79eee4c1eab7da1ee4270f7d90a44a67fcbbb1b3746ef6281b52c8c27f304734a34d3e93906a46c6ca94048f5263e7e624184b13526e004efbede02c803f7dac90ef1f64511eaa8a7a37406928471289e970a86086e3ef3ad96f0c307c65c4ca96b886d96a8b4da146ca22c1a8149616c1201e27ca53838a54122dbcfb79a5612b38730d95249a84dab2705486af77ea1b36dadca36aef39028387e806736fc6f7aaa3129b19cd0cb5ebe775a6fe5532d82d05fcf53363d26a22786dd957373d6028110b8abf6c7ef2ff2c59248f54ffcef09c9756678cf0e9da20f3c10b1d30c592640c7336ffe170d279aa5639cc64deb693ca72060abcd447405944ee3b9ca8b6099cb76219146be5efdf68a84d64ab5daccff2295780b32f6466b9e45ca19fbe6d6fdda973eff1f66de7412ca4ef3ebe9ea390558457dc33460d9d5a3ad48e23b889ce648b9a5c01016439ff2971972113d57af57ddeb44f47b92cf02daa3c1d309bcf3e5fa3b3e4f0daf9d4247ddd314694581276eaced7e6dd084d5c3a666ace58f75c9ffe74e16368929975b291dfae535cb17a65aa7d80a46018116a08d468a8d97cdc7f54a45a3e58364cd64cb5d8202ca4a8a36fcec5aff5e90b251fa281 + +Input: db15cd3afb2e55685fdaff2935d9f9e2f5706baf34afd5fec6e9c26ed0b1cb824354e4f967ba1be63ca22deae8eddad24cbd1d0f14f882499546d4b1f8e83db655a934a9de1d9cdd1791c3e2251ca475d91b5cf558232c865af118bccc4a8d8f2cf10e55124c6547da721c3594ccc2423ca586f1e1347ee9eadb7cb62e2982fac8592a1290fb15ca13658f609edd8b874f2beda2ec903a5990e49700b81d66d82797bfc29ebef9ab159590f06ac66f1d398a8f1e697bb25de0a79cc73f793c5438c2bdec00a6e4ff7121ec22a527e18d840e9c7e7277fc9476efc35c75c13bb92750aae504fbef3f +SHA3-256: b89eefc201611ae8700d37fa699f2b8f9a7e9e9986a5488d143b0176aa3ef8db +SHA3-512: 4d7920a5471d827f6c6fb9047b6897ae3f4b2464d5663b085820d142e86109f61f59cc1b6b7a0b1f5ea99be0fc5dcc4f7ec6eb9b24e2795b2b724a2a5388295d +SHAKE-128: 079367fd274e01e889d411ada1c1790246a281e4bed95bc4fc09518efec0265788c6bff213d39653412b7d1302afa4ff892a3e1d758dc77c7969502be3f94b90aee1b0838fd67cfe0cb11753d70ff08b989c197cfbf6d695e23bba737a2273447b4702971ea54ce4eff8e1e6cac8e2c8899ddb97a192e469ebf073b1e4fbea18552b2b429d0943b936dd29e82dc9b0d5326e012cc933a7b5575d9d431561272f7c31a1de8a344c9dab43805fff7b39031dc75cc4cdd0a6c4c9f9c22314e5e3ddbd827e952f6f954ea7f4f0b4eeab5440f469c1c4b4ee289d04db002b52bfda59732879c5acf0869710d61e3899119c748e51e618ae72a78257bbe658d1ad866382eacb3a8d98e9f810dd606cfd5642708d9297236ee6c9744445c90f4e8fda6910a374df53f7cfb7e07902008b68cd62c83f2a7a2b7eae7c377b3e3f5ed843e519518e3ae4fca1df1cbae79111eb83439a88df8dcc535cfac89ca2bbe59d9bdab9193ab7c66b0c2edb98045d368b4cc41bb5c8fcec6f92909cdbf13b2e400d74a08e29808ec4fed36b71d0d31fd2fefa0778d284ec87b42961f8d330a31ec01591000ddb5c6dd7b515102db87f1b2d806233b5887fd25fa097e7fb67695d5012a2cfc8a0871bd2c23b9429a64bbbd3515add00cb54ee4d34c32743f835e9657297edb4535f17000092f0f2a45ece17da2d7dde2bde11f5121f7d8e5c4cf59561 +SHAKE-256: 0b1be090a5183fdd96ce9da4ed8c3ec255ddc07841d304cb70dd04b040bfd36083284d992f8670e8933ab00c78c93d53f6cdeee87c9eeaa8de3c8cd8f922be8bfa31c8e12abf75d1f76f1da74c1c443f60f5e5bff9092137ad0a57cfac083dba6e4d4045bb5a778eb94e126bcb00a81959e9d44de4585ece3e190fc2602c47175ab643d2c0c978e887f78ef6fc78d5a51b99d7bd200be56a578df9e8cd4b99be0e1b6629abf957e7ab4586224b6fef45305ad8d87875fac4f127aa141f6d0406e97cf1aac2399f94e48551d11c9d2de4c03dba28584bf58071ea158673801c0f0afcd0264c6fea1d4f388074d587690ef9a74c6fca81fb944d3ec0aab290f742f6d4923c1225ad2acc483eaae7e96dcd047911b203c78275e7111f04c0cf4e6ec152b18ffb3149481999e67090d7d37767e0df6931b85f1684399e3d033ffd5d9746360b8814517c7e74ee9e24dd549505f6e6c25febc09ffe92f1d91fedd244a343c46841ecf855b0056288e863e1bc1a95bc5d756c8c6a6ed9433df51f324d4c0a7b53beecaf0ba4db30d5f4196ed08490211d2b8045abc733689c7a298c4d88a79dbabe5df13dce5dac9240963fcbaa8437413cb7e38ebbf9b394b24f6acca822f3230184d21a1831a887c5656620e9c54f4e6d3dd95eaa8309dc27bae6bbc038dcaf3cc15b8bb2d0a49c09152ed22a17f33582c65b207fd1bdc3a20cbe45 + +Input: d6f0f213a270fbe037dffebbc2edfcd261bb4b64538931b3340253b7538cb2079532f2676257fecea12fd2730fb4d033345493884fbe5c90c642e67972f7210e625341fe5cb210eb91e718c63110ae3c81ce769ada43e7f9a3282d49e7c28f3615bc76ca601e2dc4d3c450cc92ef53c0a2a37c70048ebadaa372b948fdf45652171f16bdb9e9fd45aa70482f86d4cba0aa30f2a0e1b9508a002376e54438ef91eaa4a0005d7558996f8bba0f7111e8ce0f3334d29abe98d1c74d7daa589d17b250a3154d83050b564de1acac041d15584f657bd85f1c1ff73508afbe856ff007e8be0a1ecfa8e42f12 +SHA3-256: 1549bfcc9a635830ed84d6e7e31cef1487f32b0576b21091b4aaec3ea8eac986 +SHA3-512: 62988baf7b9cdf62db7e8f54d256e2faad8528c85441ef849e471bbee965cdd97a0e656b013f01057a1b468d5bd6f7c994819f7147de20d7dd98ad4655742c37 +SHAKE-128: bd08a0add6c1c09788d5e8429999d33384a6c4aa1fa6d6341c7006ef1ddca379ba3107d5e653d2d1d2e86e933cb6f4b0fb6133dcd86edb64df2f6b043daa414fbe6157fca7d06b02ab687c2c3020cd0236e516814aae52d3d86cf209d799497cd8f2eb19ad52c1266f3d1393176d53f2975e8eb330188c1e7266d66ca10df1c683a8f56d3a2f76345d1ccc5cf1059189c11bda6d8ef73f7d60b9f0ecad3ca8d65c1298a61f5de9af8a1553bdfc5f1e92dd00cf5be35e8a2de2bc620937b23e487d0ed815ff0374cfae003f979581d811186c25f84b9209d15ba46d4f77ac2fc5e3690980338a0935261c812864e6801fe600191ed9e2a093edb1dc2ce5632176677b9b780a725b47cb2122e7f4b681b1c99dc6e524ac15d4bf9d11e3685fbdfb32fb04269b9b8002cad4ab80f9d3b2828677fc5f9c850ee31b2fab898f8a9615da85e6b84eeb32b05d72a3c0cff3f319f113a29e837295a006de2f554511451e58c912373372dd81aa62b1d3c23d29e6bb52ed82a740c8fe48afe55f3a2ade8f3d605f47154dd36b4977a7c6e3bca7e729bbaef09ef517434245702e5c351f0df4c3527192e4766b23c3b53675bada568d56dfc4f6d0274886705a2177419965ca8edbb2574ae5c1a326629b0cae7a500d41037053305d507ef336e4d5f0ca4013a71213652c166a0a43ef275a9fb3f381c6b6d15eaf20a709c4ba2bf0ce03ad +SHAKE-256: a484c816ac9a9e54ef2b627c79bfd27b5f3b9e55908059650eceafadb78942ab8e16ed4a462abc8f868ad4b655a7fee7a58b404946de490616b9da8688bab38e66edaafcf068ce08afb6ddbd04805c28a8ed9ce50c2374a6971dee70528a83a22159ee623262b450559c9a46b2b23bf38180fce9d9eae76ac12232da5baca18b521f4e92fbc2b3e79f7d9588d4f2a674285c50a0285719a45c31d922f09783940b6a4aaa96a60e77046980267ec0b57d48bd6ef89b2410d73276e1d498d05f10bac90cd876674cb2b3e9481d1d1f5ad609aa8781b0f29fc36ae699bc02a95c67825ed3f04c1accf2fba00b0758be16e713334dd6298451c24fe8a8a00bee8b0735cea40615dde37d4d354f811cc8c9f615d5ada1be10640d6476f173875b42d4459dc43d6b7af31c7e239192ea1878fa3c03a0bb7147faf2765621e5fd71573dd5759a29377761d01d6ba34e40c599a9c6ae5a44d19e71aae040c2bb488fe3d11e18e43e1262e867635b31a42687990e9a8846020ae5d065a98bf17764ffef8d81ac2ab73d22fda9aabb09f0c18be346be08b23eefaa083f0716ab6eb6c14c8cf1cdda941b1e1b8a54729cb0e3f1c180502bd328676470cf8907a61378e94b64c2c8fc4a7ef866d8f807688f4f57908b16566a24d519969a5e79b5a2ea45c51b319ee8c8aa4dd5e7e56bf9e778a44c3acd6d47419d0478d601f95808a86879a9 + +Input: 9b808f69ef76934d895beebd9f538309920c0a93adadb72158e60ef4ea1a432371005761eb2ed02d324c47d633506428b5e25a5d20184b20ebcea0879e3012ae6d394970608c84cf73bedfe2f238f17632b635f275293dbc2570821fe6eb07088f4cab9673fde0396001bd85e4477ed57da0e6c5123f96ace2b0bb6d3c89c11dafeb65c3d797d40150b2900f7a60924a523c0e8a827c90e7fdd6623a30dd62ecc7eed3de8079e5f019ec87a89670784b34758f2d68979952710fdbbcb498022c73aff78fc5addcc3ff8a3a00e10a62e84e1546d48e6ca2fa5e739ce20f2058bfff57fe9f49cdb6ba081f +SHA3-256: f067fe731683c0e032b4ce8d159d5b9dd12dfe3fac6b84025c4bcf960bfc3187 +SHA3-512: c1a77b916593865b2293acc821b7e5a9ab8b877c378d30f462f4804d84d7736e5d373bac9ad40a7abb3a0fa42ba7d4e4109b9a0b8606a691211e5c38f61e6300 +SHAKE-128: 29ecd8a675d969063a997d70d63e86c7052607d69f6f8c57f9a6025a29f827e6d0f620651be9999b44a9c817148b2223a652e8a1b68a7a43bbf4f843592de2ddf0ed2287cddd44006e53d65790a68550d7eb2189fa0568648546192814899418f80dbe7e08ea4dca298a7416d8d7b6bd7b47fc3cde9fe701c164903b194e8fd72ad1608f25d356d2531fcbc8191979ec92656bf350fe19a0db704c318849a46d68dfc38eab207d81152111ac5b6f8b6698b6795369129001cf883bef8c7f5c34f9bff4d352cdcde64299ef333ddba9627ea6ab2dbc435bc9af33447c25a604e9148d8a4cea1c8479c1abc29413937a168116919163fb4db8f0498e13bfbb3710ed60b3e2874800bd60d1c52460fb5b294705de0062fc5b4d6ec7c4717b96882f8e434c910ad568cac7ad2e35310dbb6dbacb8565222da6c8d74df81cdf87c39000427bf7bc74b419bce98fc4b5b4f919968b9d2f78bca2ab47eff2b26a60d95463398e0b03d7a40696ac7ae7ce653aeac4e33524384594ba8b35d0d9f47493c22621296b8d00616dc738cbee67627d906b9de10ba59e5abb1962d201f9babd2f062aca79117db765e2e10f9922259750818f5fde2f8d97fd6e5b6d82beb4978755bbea7e5bbada8b61732cd50d33aa836c0b6a67349569899335f4f35551e22f561f22b75fa1e793a1140b62b2658c6e9ced86100382fea65a7ab5c563920f8d +SHAKE-256: 8c206096975cb1b79abf539ea773802fc7d4236dad945eabdb9d0ecb392b98753486a8fc6298fc096f9284bb795b2fda9afa6e33b0d86e356e48216cb68d6dd6cba6fdfdf0d093a534360628f61604f2186de471026cdc01f4fbf75fe0a7885d0a1589ff6dc64e5898b1738758fc3c864fd42461c11c5b59a3ffcddbc1d0bfd77d25661794e0692e114d65c4d102ba41b4401b9599304d5514ae68d8342f33d71ea34a4ffd78cec311177920fd1fcd2e95f57cff718deb65c76db03a3455627851df43b1e452546dfb0a99d2d49a3bd8fec9e335c0d869f72c69bbeec8965edbfad5a62ec59027b8d953851ea75d228f41dda11c80707ba7a8bf62505c1824d50faef1bf3423b56e1697cf6b644f263e50d12264b8bbc51ff8291c913a19e8cc4fd41649cb8c0d94b74fce4138874b0c8d49078249bfd74547c2d1d4afdcdd7dd4aa6129f9d20bf24e6cdafebf9fb842a3b89870eaf990b90b3a51bf11e57dfaea6f0b58899826dd433a8709507b65bce671819b42544fcfb6a830b87b74a28f6ae923b2e183e0a0e47fbc9fec1f2c0002766fcb255eb1b03658d69760ad1ffd48bc1bcd4c54fec976ee18bfcd49a513dd04140bb83bf0acbc255537051fa8ebbef24d4fb130a1e2572b151a1c2e17b5a335e4151a7bc07e67f26ef8200bae33c110e1de7fda307b8fa16c4e6dde43aa03f3976f8ac93066757918f983f8826a + +Input: 104397edbe2f576576c028925fcd36fc8266bc5af5467bc3348d3bf652bbf7b8460c437f16909faa311e78e90fb853855f734b99be6e18b0b85c834a79180b4f69528c1db786166ad76e724b982072c55cad2833c0544739a95242ebf62f1dbc45c47b86a4c113037e517c9da405b47ec43334758390c2b78594269a783813d409f75b9d7d0a51b36e9163a3b7c3a09fc57ea9a632be44abab445f5aec387032e97641d372353348c600fd57c54405ba8e5f3614ff7618ace965d2fe17de87fa66a19707b9139b3a22847deecc4f6c2171aabbc3263d24b4d78a8c4d66049d47126e2555d693cabd0939db +SHA3-256: 6df06abb6e7676e3b6931457938dd74ad4e776b3a7c70a33a926e2c6c81e3547 +SHA3-512: 179a089371fb87869bb015ee07e39fab9bc9dad3ecb393cd17c0d0ced4eb08ae17b5aa01446e0567501bbc0aa22c8cebaf0c73020408fbdd216537596888eab3 +SHAKE-128: e2b17619f731ed8d52c09cbba6f0ef14cebe0c25ee74ac28a4efc08fe7052b5e7e0e6a95f84dcaa247763215cf155060d57f84cec434213f08e0937661defb4f74876b4ce2345a0474173b9edd878ca3842508623a8d3049b8bde19fc3ca1b099a790039f1a718e93596cdd96293bdaeb7e2ac7d03d228e778e88d1ae8d774a14a0b4db44773531c2e4b65fb99697f833dc033e0698acbc3cd5859c3237e7f87c734fd3c5a93b438debff9a858aacc22e10525f12a9b25ed8b0d435016ac33a3bd6b83c556fb689796026db662093402e46a75427441afdec588bcbf01bb0ca4511b7a152c43fb35958a3f118cf77e04b4d58ede58461fc76559dd2c1acfd3cea1eb58af1eda1cc4802e88ed5c66c344aacb4c0b61d851c2d17fb3fdf59983b2b8a84c6f40a95ce7315d038874bed6e86d1f96736fc7ddb2ee8f5024a0516370bd10dd3bb8ba9f0ad77f84070f869376976ada1c1717551ffde4b8bef925403fea1826712a7e041ef611956a0face1f8ee6a6f1f6a0aaad7e302ee6046cfa53258de33f04d4d1f2afa7e57b3840df9b20c9b69c8abf1fd0328094a2f5866a36902177a876351b249347978c65e6bc9fd0e52145bdd4413809a5e06f37c2ed8ff29dab976fd16ec911bd07346d10bf5de623511ad67e989498e85ac7811289fd70e50e761c575199c3857776c2c7a9aa3267f7439bcf558cb54fc97c7e84ec3b9 +SHAKE-256: f19fb2fd71e08497fdf497a33d077564f357b7e630c2a6452514fb194abf0caae43e2e86da3fb080c218a4a5d12ffc1d727100a86f5cd8e582b1d548679af7aecad42310abd22e62aefa2671ee7ac70bc6d5a3c5c5ec038c1e5e0c8800d8447365f3ecd538a13dcc8477fe6a1e5ddd0a5455d09186945dc123b8b498f2eb97a2736921f708319fabc51fa53b3413222667ce583a9a44804f5b450dd60588df3978b127a38569e887fb1bd190d672f3e608966626f30733047d90f9e334c71edd5cfda174fa27d9c2ffb91947714fc31d976be9557369d7c369b5d1f9c65758dfc6c9d21b36d094cd668c906384b72c181458089e9aefa91932d54c7da2f5c91ddcc6e3d85c6161e9a3f322db5efa9f4388908b083fb20e5329a2376f07d3b7e78072d7d53d6b022ab335d315565189ec47de473f882bbc0eb602ea9bb712c604c23df84cbe82872dd1f5512ebaedb01bc3656162d7756b656f022c51dd1c839e3e38b394d0b1f63faf389cc31776f9b0d83a1d9447a35657b592a8be30220d4ed9bbf4212dfcfaffd6eee1f441951c09f2e05dab7ea39172e1f3e0d27c852d762ae384ce5a0d413f5530b1d03a3fc3eb382cafa4f0edd07714c1d559720903294f7ab2ab95269dc36831f365af8efced43bf0a0464bdcf8d058c0e5a935aa1fe94af6d069aaeed99bd46912d86f9201d19d1941106f2530a59aa4d5756bc11b6 + +Input: 4387f289c912c2f3ccba165cd5c8e0cfbe12b19e1b422ea74d6df97a374c04b58f030a40afa3264c673b5ecdc3f2aed201d5721b91d8e4739db26697caabb9b30ae04cb67be82492e34a663375962bb663f3aa8a6f1551e42b59b8763599da4cd4af0d398973d0f4cc9063fc3aff12a1edd69714bc5e8e0ffd7e0e963567bdce817a9ed833593a47d79f6ae59c3ef7d23abf0af3ac6963223a08d1badd23fd4e3ef629123c61e0850e548ff74ce6cb732f9f19837ae5ed239aed78307fb58d9a4861773fa0d28612dff5ec6ff72530e22cd3899358ccbd5349fa37bba12acb84c257e757568ad99635a0eed9 +SHA3-256: 3d72262de24abb59cf024bdeade1e8fa5d46022e7662b3ad6da69fba023fda6d +SHA3-512: b766933cfd728793a01c71d3faa9ecd8ac9b8428e7f297f4e44ea5c15e9649e85b8b30a856c97945ad690c50b29eeffa6c5449ea59d54b092698238aa559c5f6 +SHAKE-128: 6e58f6120d3d352fd4b2b464ce1e2bd1c5daadc1ce069ed947e5f47d25262b34a1ebeb2688283693dd40536c545bbf18468b509675d8fa79a50aa927be67c14dd8c20f16b119580fda29758abca5b3b8db715776f80f6edd722ae16755fd4df51ebab193dbb7289f7546a0e08b735d4f9a46a0c20256531680fbd5bc1467949b698b314b2cd9d8fe246939ab8b4464e37cde9aa9bab0d3628bc224c7783d3916dd84d99e8443156640f906d57b82df31537fb3eefc4046b1cb7da3643ad8654ce12e7dcddb26a61d017e218b12e45944bd589e1671ede96b5a4a215ace8af0bb9ff3664cdcadac965128c0ffc706e7fad3f7798b20eb49ef20d0c3f57df04c26525e1ecbfedea0ff3811440a15ecd610943149f7bc896be6360505e3b3733299b14114f2b574e13880e60c02799206278d6bfb30c1194d4de187652cc6bb5936b2861590de33704178e9de3ce56c8b77ab991fe5888fdaf5720f6bb9c7e6ded2589ec057445541f71e39649cb82fa8b419ebc57225c2f415a468102e5c4a221a40289f066e27701a62be8da8c5b6609ab20dca4d75d536a965fb243d2a90211614ed92834ebd94eb877432acd0e1fccbdc2337f8fe4b4208831be25f4e320c6514d3ea1c5fefe4e1a06f634eb6af0d99e25c8388e17dc6c645ec4d9b34a432f3aad922c0850ece5986f5bf1e81c8c4733f9805cd7e2e804da1af52a5c8c97fc0 +SHAKE-256: 7ba865766bb4eae18222e21845ef08d74763500e946c6ea1999ce04ece7be33489fc1e6b88784fe06c0b1c4fcecfda9e06544e0fc45f38a65262264d8118f6113d0956b0ae68859465c61c63d74e725077bed988eeeafabaf40d92d725934a8dca2942e427ecc34ec1df6756cd3045e5e99a2b232f0cdfa3e92be8b2784e5db3fd93fd6c72c581c67de7032ab30bcc23a02b8c1ea1fe6293ff596f604fcad9c0f602a1faf170e178a2cf6cf983d02090cf363c25ad5cd00357d5d259cc7aecf3e94e87a8af915bf9ed5fca7201266db5ef4f007e301b920f8ecf563378b626944c4e7052cd95d348b86b8a2e2a11ef765ad008d18e3bb0ffb68c32def3ba773868b0bb9cb3eaf6ea2bc69e86b38b3e7667c1da2694fb15887738ebf5c68fb002be3a0ec74adc87b2ce30b628fb0c31e5735a0cc24e8ca63d9532256bca9b29798ef33a97878f646ea9acf39d430b6e2ee7a58d1c707ba1ebb940ce7340f03af9271c8244101ec0bbe500fb86d6ef3f2953f7f1515b9034ffa9f041f31c45be281257ca59d3ccacba947c1d403eb70676bf2c6bb9c4e6afc3905e959e72c4b129be147d99ed227253143ebb88ff004bb1f97f0f0ff3ed7bd575ce675dcd1c2bf7e723c81157fcae1455e0881724f3ea3f0ea711661e3fee85d1b7b90ad192213183bed450d9db5ece4cad2d303a5342c4738f5da0dba171f41453f93f86053150 + +Input: db23781ee6638dfa2726105dc8b855e5a1007e882bd4f19f996e3121b03414968028d2df5eaebe660c39831184111b960d6b94b2f73a4ad53e489a60201c365e2d7c86f29dd4f76f6c8738b0e275cbefc77463182b541e436f8f33b61cd28eaf69dbf80ea6c133ca28e140ef31946fb2258360ccf700e455e3b1f0d9ed905cababddb3c460d5111367d925cd21eed9df4f1ad7b2ebf1a4985c8e5ae25561d4f1c419de6d0671e385b2e356009703a97cb2aecb989ad677933cab43d4e2bb1232738f1d8de109f418fdcf1878b0754929cb78d283d8ec4d54251dd1af46a639f98e9ac89b61ca40cae11b8d0c3d +SHA3-256: 5847c5f55d5a69ef026351c95fa4922b254fd21de714b371df2e570983a5ec2b +SHA3-512: 4016fba6114b05b831b9e3c578473f6e33196d7800f80abe992af21ff36ef4e9803674b26fd6ac1eb33d9c275a622ff64d7077bcbb9f4bd28caf3be8a4caff4c +SHAKE-128: a249c1fd840e47fa937351342f21b6bb7e7bd3855bf13d86843538a2c822503e0fa3fd3d71e1cb895b8dcac6b5145c9c02e3b0b9ac25fd94ca5b6492dd8c895164da68c62c56887aaf6a88e80272f43574df46946a79626ad566b5d1c95c46178ab042aeb8648844cf5209b361bc93053beb61489471018c95edd5163125f62e28aeea4af296fa3645efcd10d29e4209034ecc98af0ee038d209b483e3a9a791062bb26633448b94545bc3283ee607178b595c3e9057ced171dc1f0c7959d782bfc9d78807c2403bbd70fe26315260904fd2fc194d45557ff12bce96da005fd1464cadc9c9eb8e3c69928cc7787beb98de3e73f61dccb6784583fff61e34ca364cc55df3a1af610b5a0961458ad555356b064ea1fa69ca5848937bedcf5149cc292237cc8f7e038dc774c4264fefd410f315b3ae852db82729de69cffa9bef31da86631297cbd934f232fd7b0a75bf1da03acba0ebd39831815b294319ecea8d736a081f2939fd495dfca181586442c7ffc0d9eb20c900c8cb6b3db89036917ee7af09229be2c201c02c57f6eaaa63e45aeae95c42048ed455b9e1f905ff671423ddc2cc03ea21707850d9a046a0f0a89f75e8236d3f5959133fcb7b374b6596be4a6ec0d8f60bafa3e14997729a72747996e7f8221def9933e6793d53dd34ce52a764d28214ea25827027dce609743eaac578683ecb94483b40a25fc0155a2f +SHAKE-256: f92dc1fd8947a773fd36ad1bd62a90f490e9d9a777b1ff1f60a673ccacca16fa6e096a7ad6dd979099b8b8c6416d16f997a003470224d42b75190c38f8f4b5880633999b7cc0b6278bb954aa6e70e66955204723bb4d7b69fcba898c05b704a3b0606ad1be18cbced6d84f2e1167a37b60ea01688f81720668a45dc46871f54e5c1f9f45be6b1e34e2515def14137a349e4c50f21d6e21018a1a9825a31e450b3e319fa1b9b05964cd3e7ef7202dcd64687c7e9fd95b767cb39991eb17ec7c56b26f0afa8b4df22c6398b2230ecd34393c1507fd50bde15086e118f10f9e5cc81eaa3c63afda27bb998f960c8d3bb85ee7de1a1c9e8c0aeff5eba4a3b20ba620be939616097b42362bb2cf81f0c436580078e2ff975602d793e7b15d3a6409ce5aee341993100d34a5c77f1d68dc84333cbf2428b9ab509e853225100441017b171fccacc321778a1bae6f0ad08ed223815b5ab2aeee5f117eebbfca21ba26c3b420fcf97c4de9132e193ac16391b52fecd9651629ece5f20465e95b93ce264b0134f5ec4724da024876ba1f2f4402c45e6a9ba8da82db370a4677ea57c9e0f24fc22985f7a466b059ee8898a4c059442b298cb2d3e382363735db9b51ee34bc06b202b596b2e2bd53adaa9b096fb555f579835ed23af4acebcc6274b05cbed172f7774c584323d50e8f093fc7497ebcbdc433394f084a005718d4c585f6782c + +Input: 3a9c58c10c1131bafd9ee70b9a3b440ebd90ac1b24e319f6c046b6572ec30df62f88c24d1583fd3df4ea9b4eece02cfb681e24add0526f66d5c1cac417956115a4b90fbddf88fa8ccffb12ad393cb2bd64ee633ade7525ebdd2b48be5b6502492eeb451cf021f3b9e109ed8004a2a789c999c8c000997301da8010358ede8fa0b6a6d4675e371ffd409ff42c25e5e9c163c440f6870cb9d422b37799f66f14ca136dfaf24049b1cefe0f65db9326146cb1c51137c37b0cd0b71f29946ab17b863c04f7fd92e8fa6f5596910838b6376cde2763af573206e8b563d621a0218dae3558d777ea465d14ea3774c01328 +SHA3-256: 279ac0a223dd22b939866cb544e5f3f96f7cd101093c8ad2b6c3528ad91028ba +SHA3-512: 909fb3f4b8f99768622d26670d4a66787f5f2b67ee7b92efda1ed906a34b476a99638e5a2951e619d74367695f7cace34d36c1c47989d50719aa2e52a60e06cf +SHAKE-128: 4fce6fc03da3b5cf1569b9f073297cd9f1983096e376d78dc3cd042aeee1293f0aaf8667bed005be25264e524eba485fc2c692685d5ca4e4290ffec33d90e11dc134a070796e247722625dac694949f525948c61325d2e8148cd16683c01b683fc639557ab77791c07d284f9f16835f13009eeaf07f4557978a6730f03caad982ce89affdf1bb37af56d274b7071e369db3bda3435ee0942d24655b71671bbd6a656cf76ce2c668ebb377b7f9f355bc4f8ca6cc4cfe4ad06539d02b73b7d05db91069ba7e98a18522921c213dc16a6a13a1b611d1ec505e8a461ce99d1786a1394d2bf0a614cf5d61cd0db03bb023f21008fcc71480d3f886bd58a63352c2afad5dcf9b8791bbea40d2f76ba3daae4c103f45c61d6469339ac1757362509906236cbb10b302eeb25b560a86a617af89a0837758dfa88002df2061c1165962bb5afd8c3d1e566be384add9a048e0274383318e62c5fa17c7b85d0f7093111613de15f596fe69fd37dd836c6f435aaa5b91f736a9f3f5efcd48369eae8f25e13d146093e04e9a9bae58a56499a4717de51c667482073b8e1d95bc45e294d7b444f2b8fe141b8eb36cd1e61ac86ae49b2d0e1b7ee2b3cec061ca519303344e3a3d656136bc8ac6d2e097f9862540023f05d5e59f5b49c4d153810c581f3c3fe6cca3cd547d1ef5838db1f1b55c7688232222e5043d3c95c6a211778b51e39840dda +SHAKE-256: af298797ca68f772dabeca721d602df61d312bcd9d472db83aba1ea84980d6e7315a195255d7edab15e542dbe8ae5b330bd61a5c855d4a9bf45f0351323477b4be3c24fe29ba7e897cfe4872f16e9fe641860499716b954beee0687d0b26340c3aa31039aa71f1f250b4b81e9f1cb3b45b100bf0301d755d8614f28bd9ab5373fb86fa51ca4a51fb91371d4d4284122e6d6a25ecdd28e88b579b5f6cebd76f5acb6e022bb65d40ce9f7d32e02cc66e488caa6ae6b34c4bf222023653ddb71aef339f78b1e33697343b998ee9d75ccbbdcbe9862f258f7b18df2e7be379401fa574218cf8c5d58ca52d01985cbd2daa761cde4b6b9db6f635c6aa1f8ccada6d000019bc2130266a7c500ae42652eb96e778fc41d73e30e25770849266827a04634e959f838df3a9dd7c75515e47424cc70f5f37c7f1cd5f486fdcaac4de1b0e5c285696da79529a112f034f43273ae201053ead1b45c26c2afa3e06bb2baefe0dbadcf826aafc6c01e3fa32e5b0d145fd01d914bbcbc9b7af506ca567af21df730ae5b2f9cbab8b939d961e4703128f4c9979cf810fb0b0d465173f924740a764d6230c5c72704ba9b1ed8b6b73cb8b12c4da960bd7904cdc39ce7bd35d24b55a6942f234eb53fe58775d7b29c8c73dcc6ee11c8e680da1c43710fa466cb3d151b90e991ff10a46977b48c12629c29d750f8fdf3d5bc851357492dc610d0a5f43 + +Input: 49066d0a4ef8dd84451ec290349774ca7b9dddcfeb12badb2119a05e2006ec80794cb680022cd6e31e41b418cc69c6a4a427b0dc1fc6e084f006349ccca756752ed8b7a8ed511f77d3b96ce33e3293355ac1c2f6e18e95a13beef946dd7727a1a5159a50ba054049adbb4b767a651bc1544b7f812fe3efb63f48359f2ecd58a4dfdf45bec9c035cc50ebb3676dcbd06222db837e2b837605c022c03e2ba318eb03451f6e94540964523f04c17d41710c30b51677c71e05124621b196f0c325edd3c601f2913022a83ec272d210af2be1e139b581b6032b48473b0521c1be691486437817c723a3a3b4a65fea0afb3d +SHA3-256: 5944144da3149c34e15ee77ae83446d36e3c1c89cce66fbdea798751f3f7b42d +SHA3-512: 6a31150580d30dabed6661249e779b03f22bfd5df06774737b1787c5af3ff2d18ee1acc9c3fe84251c7e86020daa083557583956df3a53ddc71ec9759eeedfc8 +SHAKE-128: 9ecd5341bd1092c94a0e95630218829b014028d83628e093bf3ff5bc970b2913bb44bc90c54b6d3930372b53a804c946b56b5a468ec7cd152a2fa01eeb52b4a3ffc8ca76f715ec5ed2f036924b1e9c24b3044a7d2740146eff4a6533ea32464373d8b5960d8cc359d99c086576c42f68edae77ab3406f861009346bd387b3e89514210193c7fc0f516e2850b78ef5307ec2cf97a0a4c0b984e0f4f6a8626d10d0d24647d22b7f73ea45a7aa356a6503af4aace66fca136cdc94fe02460c03d8d8712c4e14e5287a9af9b549310d4543791e21468f25d044c401c9112bcc63c659c2823b826cebfbb730b14bf6c98876e54907bf2859266679de48b81374ed590c3f6ee5ce84e7bf901ab547e89e8c9e4417b69f2c72e41a255a0c46474bf994e7d4e2b327eed8e3bae63586a6d985a82c0b02da2856cb78494f647fc6a96672261fbaa5c8ed7ce8c185241a2d716b5826b8ffcaf91d7d3149c18c453524b3087236e8ca7140a558de8237b6ce7bff0ecfc8bcb54bb618f11d730bf5e4d46c028b9ac28beb09c17ea0f0122064bd66f6ac29c74ffb68c41c7b2b5820bdb56e43922e4527aba17d71d44aabdb1ce5a0824f775727c8647d6227fd735a8a57df0c32ef655a8dd8adebbc0b9a2aa2f4ecb7cfd16224b9983d3712c6dedcf0fe9d5ce470d5ec32d626172d83f70097b95f397082aa47b7e21887ed137ff8db2b63882 +SHAKE-256: f23ba659df103e91dbd958e3de3654ce680b666c5d9654cf8ce6391357e4559a2355151c1f5b7a1b586646e59052b2aae37a51180500af9ac72a2ffa93778cbb991fc1c4b0789dc4d373dc1c0fe59fb36ce4ce2a1bd1230abeb8be5ec0653905dce67bd5e198c080c0459cd060c566d41f736b54f6fc33ef6fb6f169264634c3420f2b34fa778a85809a47bb6bd620b881f977eeb634e4586a3b965b03c57b9606de8bef492c8312e4f1ac6bf22fed5296968528b0c632e07a90dd1e63cee356bb86a00b3bc492dab48829cf7726787be741a6014779205540f286e1bb45afbd0cd0ad7147341cf6fa5a16014b376b2d00a3d040c8d8264781f00a145b31e371f12d6631804dd6fea14321cf7ba5e4a8295ece64831a120b775ef3f01eaba8493a5189768912ec487a2834f421dbb5e988c8a11a8bf9762a851ac2d2c4728ac6caf3b23014a951d65d0c4e1118f859ad0a4dd091761cb44cfed6f857a945086829f2f0a01ce54eb9a6bfc2cafa5a2427db50bcae7c03873dd9a3936b9686fa44e8bf14031d5cfbbbbe6b83c5e3300414f7ebba9d1283e4e2811dc1908e7b6ae4d52513c22d6503efaf165247f5949506afe9eec55a266b8b4537b21981aa4533e532673e822453f3dfa195634f65b8794a85d421b701236e50fa59567d2b6899534fb5d1a42b712ed3e18b742a61deb5eeb4d129b452b104a6ff0de09ccc0797 + +Input: d0d3a2f121c9f6c2f52266f520dc693228c47a5ce36a2b136024c6cd38da94f9c1b69d50381d56ddab1a71f64a0c526ca70000a8dbc34e1022bb5e83e8eec8955ebb66542ba2d6d471d8897d55825ae3d2cbe6612baa6c3f7ed0483a7e7048970797a70e76622cf7f38399f39e533a30bf7b5d1e65012c63c99d413b2b1a52c7e8ddcbf417df9b5bd6ee9ea07d2a66bd81905df3615098e8bd252ced871ee2a619822f1efe412fb2b6c511b62b06953630c089f33d26af1a3bfa8289a3638f5ddfd3d7d9e94ab83eeb85b6d08bff61a04f0dbecd7ca0f629459a2405c9bcef33fa980953585f68ec14ddb89ccd7c0793 +SHA3-256: d43b6e294a5eecd1f48b65e321e232c2368b5f43ec79469eb134498d9fd6c6a1 +SHA3-512: 2b71298b796db056378bcfdb178cc21c15be4fb689e8af1f29296b11f377f361dc292fc8f87efa10bbc7f4b513591f468a33688c82ed458d0d5079a15045eb0a +SHAKE-128: 2cbd12780dd57efd0dfdfe40300913c5d060035c1cd3a05fcf8a078cdba32fdf5b45aa757d340d068cd1ea22596a9ad764b65d95836b0cd93fac228a28b6dd51d15b9c7ae3d308cb63d6c060832506ddb11c28cc4456850d78520a444a9df772206e79a92220251240421b323fd7eabddad1331ee02aa64c191a9560ccf70bc885481a8d3d6128090930ff3c35c6e8accef653d987428cc6016fb1540573f12a14f62228b3fb10a7f32260c4453d34e7fa2f1bf038614b22561d19abdec8637094a65cedc9fae494a6e30d812c5465b557f20197448d56aefcae31cab49ef76f4e36c13a1c550729189a138489def8e8644296224b2a3fbe9c79ea6e76c68807f1e9537f81b3691f73bf608de157ed264679781ba21bf8d00709e1e8c9810f7390cdb09eeb115e12312c9d7aa1f1a29d85476de6402279249bf8c44dc16b7b4f408b70a2e14411b95848d5f6b6fbfd7fcf3394f4d7b95c8cd8e26e6c7487eef6d18b39345b3862d58d8dc6f837ef8b2a9fc76dca76fd3d74d217f7d7025bfb5116c9918075b1418d15511a81bb996052c43ece5edbf2898f95e5adeed0c97cc0b6879a86ad5aee463d3f234a6547534a5d4491b6475a8507775c8aa8a59c5e9dc2f70db11d47da6553701a4244c387e9afa83a77085d51cbd102f4a299167dbb071e917ae38e494fbbb1cd2acac6e9ed6a1f1b9364e859dd7ba4e59a6eefbf99 +SHAKE-256: 1c2d70ffa422b262552d32390d01d0c4ed5d1e1060bae165d4904e8f4782ed84830cd63771255ac2314d4d791d686ac952b41cb7d246dcbbcb834bc8105512b1840e32ad4f34b5ea0e6a8bfb63a7f2b28a1fe35d3f5fd975dd3cb3e2e61fdbad2fd7d42ef393c249d87b708329189b2ebb056a3679dfebe4502152cfeb53433ee769a0909ff947c45f839439cfedcd2e193a24bd07d249c30f2247ac0d27ca558a2e9e5426395a393287c7e6e5749796cc74d779ee004d1ce1dd8b25a156b3be5859a6754c23e41a9e785bd597c90860a5828db0ab225f7403077481da3b196ca4610989cb0becda4551e0d2747a7eaf26c3b3c82fc0a980f6a93d3a807c65a4b1e098019e55b528dd74a4985dd09e3dc74bade7a5ec35333963f7a159b5aa4b5b4c230d80b534b53f2f62744dec9062bf94ae0474d0a9666305a17698d467aacb8c2b7967b60355615614b90a54512d564619c533cc3fcdc4eb9afcd012b591019c699807b465ff68b413fcbdd60792996685f3ffea5bda8cedf86e3620a74af659d90235f919c924ce126f16667d8067c3e8c377c2b1689258da35544ff3645d360b12a8273bf25c39b2258ff0e1491a18c03c846815f0d5dc880843c10045b03c73400efecdef0c5324b7288668911ef812fd51d74bd23a40f7b52be19c35ca036d53ad5843ac50d126e5f4ee7492bb9f7670a7d0a5439802561aafa29b78 + +Input: b5ab7ddc91c7088f13afa6c026aa6aed5bd44ba3a1cf5e2393bba0827925b3f4dbb724208d6fd5c1d9137611551644b813daade29bd252e1d2a6a01aaf9c7040eb26ddaea710869a86e2a7e996ed56205cac0bfd6bd27b9831a390cb07d016f61ef8af0f58d90df565f2dbee82e8b7822e9962c1acf8c33cf291094cd25b276d7f8c0b442ff64028772daed26f3564eb0a4b5815323622cd6d5625a4702b324cd7f377a407350ded517a12fe827c036c9d023d36ade34a5c00db7b9aa711f5a202fd224c1b42a31bd9a922d7f106434f49445e1c1b98205e79ccf36d6342d3ce8a6257e9338f2bdee61b9c748d08312f28 +SHA3-256: a287e2a273a2259e003671e81ff0c9b8f9de868e61ea69ac5fa3526adb61d2b4 +SHA3-512: 11bb74976190429701f29d5ea1cbc7a0fb4c5292bb49c2e3b730a1a2691e4f4536ec2689508bcbe83f4a4439dec497d33b4f164f720f822f74656fb024486aff +SHAKE-128: 5cc7d226995a96da1d8fcb5954b191da6c0abeaf09fc61386c7e43a92b7ae846d9a1c2d5b41874c052df9dd51920d0ed93ba758e27caac91f6614693fe376adb9e8a42dc49350fa8da57ce6e7f715fdd9927849a137e70754376197ce14a5747a85ff2282b5ddf897b444026fd5a4d661a82df4759a253a45223b281d1cb0b052a78303bd42ed042f502f409a3af66b08676ffd479189e494583853326a1ac810d0dfeaeb6bfd8dcfc4f2ffb6e4bd925e9bb61fa20ee8a35becc0687a1142e179527ae8535537c9e1b0b20321378957f8e3f84d3fe889bb37fccc49807f65b3a0785e103efdbf4a4da7de4fed08177b0ec1dab6d5b387b592d4bdadc196f1d4276aa92c842ad02be03f06e0630f7082ba9e3be7b5e56fec7b9d9ab31c7842c82b933c7ce3ee4cabb5d751fb5d8e4180fbc50ae07ed5382005dbbece1246ea6e30fbb7d7089f8c885435633e0fb0c8b56a4e79d3fd7d8a7d0a59a82e646bdd9c02f8d53588a265a1e895a6b3d62574f72b48ec7474347168a393df46042ed40cd4094115755ddf4d460911d4f32b917d5b21552071bd22592375658ce9a4aa44db70cf8f8d7cc3f1a3fb7f8c138be8d857b30e0f2011b43e6730bde5af5ced016e69bf94dc74a10f2b55b9d944f2b3601888ab6900d87a77f638cb3e1cf2b443941f0c29932c5685a61911bb6dd66fce8368ba6ad7b7271867d763e6974fc4e62 +SHAKE-256: 9959147bcaf01d7706ba5413f2a4b61f11b7bc3b1bbeebfedd473d6d4ce8fc63fff53819eaca4ab276689ded2a95b4b086d7c02de5c6a83303fdf3e318117d98460b679b864a661b394c1915f4c4b98fd5ffa458a37340f948481c01310c680d5d46793b74dec11e738f0e3f84b0fbc79c9b925461b7a0938571abe0fbdf4fbcdcb6e97cfae07c20732345b21d3a24bd373d14f636a0421a62e12b1df1e04968bb8573023fe34f310f487deecd6b149752aa5e9f42513f9f0df59622823f5c957ffda8f0e9a521c1ede963e4cd63acad8a21bd49da05db44d806a8644b0cd330fb4401d9d5d5a98b27a988495ba2b75a45e178610903b373982df532eb39370f640d35e8a8476d036c53195ac247e30c3d4b3a0eebc12a658031ac1c3eb969bc47c0324fdb71cec67780eb460d1476bccd476cc07a3dc5fadb6133059019d7873b4906ce5a9117cc12dceb16fa164af024afd301beede87309f82f6d7c361534074cdff3c73250ba565a170455937b41949ac446ace264430cdb554686ced220b47a5ee953cedf051a910d2bf7e6105cffd6bc0cf1cd79f1bc647cead649bf672a89c2b74dc2a58b8473943669f3e40abc864d4494d7c34ac40f7b7035741b70cb704c30aeacd8846c07b8d2de527d9853fd8d206551927245ec1b9652765696bb282df1329522550fbcbb46226ca307348075a249757671c1a697213b73069f + +Input: 45346d9d8260afaf991963dd54ca4e6c26490f339cb82fefcf97f12abc520e1f41e1273490fa737ae407c4763667cf0d9085bf14ae0b8c0f1e1e6693e7004deb9eac4435c8a5b9bae44d3c30d45f1287228f7fc5bb8f66031b01c17be0a05b759a4eef5633c6407f691796de08d5598519b3501c64f70f0cc27227045e72560ec2c64f65a1ce3ebb55892c273a14aff82aef8579cc96553d27d27b56978fed66679893cf94421d5965c90ceb38c3e21da3eb0bf610fd0e736d8fb17d71bda2fbbfb9e124f4e98169a70a74acaba91d96a0b38bcbab4e4bf456dd04cc9062760b32d05183aa60911ef61844b44989acc465e8 +SHA3-256: 0dc42a6c64871139c14db5f429b5828164a678afa84108da99c5ef294712aacf +SHA3-512: c6d0dde725c42081097f77960625b79bbf96a5972bb045847ba1c64553265e8e9a9a6231993370cb54084cd35f6e036e377c1eb7cc340800764a0798b013d7cc +SHAKE-128: c8f243bf07357e67eee9167cae9b936995ab62ff28db3595119b190d9d400c178de5e26ba5aa67f3556c434e9f3649e8b96030d8f5949fd5a7ee9a9c726e39e96f789ed537801d1983ffb132d9b73bf384b3e706877d112c3186d78da182cf94400e28c7cd2c42191c6b510f833173d63a862e1faadf1db38478beb57528f6d3ea06de37bdb08615e2d8719b49014441ce26b53d502aa727a75daba39afcfb677ee1939760179c198ade6df425c07726dc386346d589c7d2d8160429f0740f4fba4ca9b127b0284287c4b76fb26710da87ee73f9aaf23fd58a1887f37312e2d18d4e92c967e8d4cd4a40fb18028b4f531fb837999c7a2d46ab4b8244ce807dcccd6673afe00184e4b5be27681719abfb5e5dba814e31c81e1289ddd0decfa208fd801442ae9fc39725d26d9c224ad83e28f6cca2155a3df57ad6e770c6ccaec2c51a4ad45c7c97b62bf52066a0034a56f6da8adba228a35b381a143d012363a3eb1b11480791715c83190e74dc5d0113582ea265f3a5d21f87870c825d4cb7064091eb1a6c23427c80aeefd00204a939f0814bcead0d4c1748f92c952b67d727d3a63c16f840e1e7133c8237df0db215b58d68c20b38a162967c67d646ef2ae3f7cb2379d6747d9769c6b7fb1b4794449998afce373d8c5cac060f4a347cb58978a365486ee2242ffb61eca5916ace2ac44eb72d4c48f30142814b4644847917 +SHAKE-256: b8c44d49842a93238c6491a9f3921e523a6dbcb7482f02f912b2a59a8d1892013aae90c27e723507729d397c593177bb10a453b35c4b5a66977f57ecc75f4783a863917896a7da96e81910b44d5586d504b4b8c1c292354b93046e7f4da928450a3978e530184d3113d3736106e2611504dbf1c3b0013ade7d804c0a0cf07a94af710887f31d822e007a297122ad6bc119f4396f6b94a8de8967d5308890afe25aa9d35dc47bfc36731df789ad0ec22229087f37e4d16aa801a0f2cee8a574da627a0c7c0fef65077aa39010218bf85e3f5ad58588b0bc15ca7c13394c2ed7530d7b4f7815150b243e3bdcff9523411590a5a44ab87ec18081ae003b439e5d95f5ff19c2608e4d4f79b61884dab52159b20ea29de4a2c7c76c34e993e8b93807583c7981af71a5c94d488b914c02b19ab4eb73842ca2319fa6cd846ca5e079c85e23226a84427ca6994c36ab5f5f2ba159b37e1e6a563db5a950abc6e0aa1351ed3b948f848acdce2ecb99e3e23d17cf38c06ee8e85e57bcb524c9cefaa6e823660ffebd25b0448165d33b5a16533900949ff2fde756db95f8be4d787fff7395dec325983a3cac486a4cba452a29738364f8c635ec72254e52c8451153fa63a5c7247e5753071848046e5bab1f02af381f9e43736e4fe6e3271b1706c969a73965ad3ac779926fca1e9f82a49066d95c35ffe4f620eda766d40bb4c6f7dea11c + +Input: 5ca2d0318a1decf3514e71290636ee4bcf7be5cc6053a1a3aec37665ff3e1ddaed8e0e8640f328d9e9b09bc50367b09871b578728e43e0107ca4928854535680b4906c16c93536411234d2f8fd18a93da84fb41da5428fd94171e3e0c0b5aa8b079d7559cfdcacd3e60253b794aecdb796c6b83815f1597e7f38259eea795ea360fc44ccefa47cc1adf030a1ab5af42b2372030b96e579f7eac976425085060e347a6881c75316a6cacc20538203353149188138673b2539d91ae2f13005b5b1e0fc9a3be94777d4763be0fdc871beeb1fad082dbb2074da4cf56e0af1135b93ed3c8f7d9cb13f76d41fb3d4674ff4595f03cb +SHA3-256: 93e74cc55d3f3141db30ce96b011b25c2779951930ea7482078cb65a68679fd3 +SHA3-512: 2dd6935955c05eae9336bf57342a3c339e9fd4fee60ec886c0752f46631284cf4ccff919917926802bfd7318de1f7f064aa08b1f264238ead74b9af5c7dcde61 +SHAKE-128: cd9915836c0122da2bdb4b98496665e1c01627f96c558583decbfb41982a6ca0d756cd41be3276db4cf10b0bec1e0ed2e665ba926125748016e90a008b2da8415196e1b53fbe794c67d0bd555d09e16c73d222723e8eea594c6af31d1691869b68bd69e3d27724851cc474aa818616e44205c1499790eb944b8e3493174e0c7cc9d9573ea8aae6123f86bc0abf8a8ac1cf202c4d244b839263eb3ab18a0ff679cff4d4e1a92947d853e05d8990ec00e3972e01c0f6fdcb630004fc85d51300fc2bc74206c617088803eeb302d1ab437338b9b98859da91e9999562489c333188d4ef123b1bfbab33d9b99631ceafd95b447159df4a6850f9d16ed95af249895343cf67cb6affa321bed8a4c12a907213f042be11b8d9415add079dd83a764bb6786764ea813559cac299aab158b087c413c199b037b9b7681864f102d55dc762841a7a93269dde3a23b1ab2d971a145e8acba071a70b4aa5817561d54def6402b1c7c995307ec4f7870d15cb18b3d4979e28431a511a6c2b1d08e38e0bdd5d063f1af09f73e24d80d22f2f1c2e8bea5025e9a3367d4d3244d678ce100b2a56a653e8110daf44118d2495a336cb24afcb2aa4f507f8722f2f8f3f0a3dfe8c006a03efa193323d5dbc1c6950335ffbdb0f1de27e8a4620b243dc5c1109fc5091abee42750f0cfd3a767bc7996f651121e5183c0d605fed9da74f4c7a1ec1fb53bb +SHAKE-256: 6ef5278bf8d6d30e0316a67246913d9c921a8a12c4c71586b85ec0e201b487dbd7e104001c1c263cffb4c137af7b7b0bdcaf82167d2435344b960e5bac3b66f72a6d0edfbe868f6d77d3cf234df6d86a7a33a2da7b38a88ca2329864937614cb008ad53ee37c654fe27c9c515bf50adbf95f16a9bae7a93a2a2029fa1af9a0365184a6f7c1db31b31c1cc4ab732d0a7590c13273cf962f24902b2719b22ad32a26233b570669bc7d7fded6b7d16ed94b3e24e1f6fdf4b7012081468976e34ff09368d3bb8aa7e1fc2aaa16c017e58ffed34445dede4ee3a5c92bf92380cfe3db4c11843b1eba9b923e216fd895c5b78f4804450ef7478aec89ed3eeba580e70f577df791ca65953de0717e31ff9088ff51db34370b909ad3e8227153de574a5ed3d9e754b6d4d86334fd24f7b19e939b9cd02eae5e1f890b0faa93f2c586c6db0c0c09155c443d8f74f156bae728c38eb357cf3f18f4d1f165b74093eb0d69afe3704931a048d3a90c0683dcac9084eab4da0e7554cf2116161d31a79af7f01bf0a680269405d2222ddd511490038a9c2e21921735ed2d12f5be19684dbe48dd002f163041b63501b7995063ab41da29c1d1924a559e0f9f68e6109bb1486543e9c5ad964661603a4308e937b88b88193af2c8cf479552b3673261fe2d5b5da2af9ea9b5930ad3f21f0ae76f5313005297ea202de032a614cdf4b6765efd7f99 + +Input: fc902b11d00a27cc0a1dd7ef8ba6dde671c896fb2a4ef5811d6f1f38c2ec7472c4885addc3d688f45d3b8c30109df4ab40d1080f0483b6d56f1ff1c71b3fdd04beddd4d2359fa1a9986d9b3d28e150a14a83e4470985203181bcf6a2ab389bb100fdf4fd80e17da69f9853c781edcf56c9d7f8b5db107ee42432e777fd6949a2a252ae586ec5b5643a878571246fe3d6334f8b43238fa34c85b0d370c334024f471c21a06f7b5c8cc61fdfd1835a00a324a5e370b1954a35a9afea993475d7d79ec29c21d13314bd90e1c3932b06ec6eeb83548c616b61ed35ed98dcf94bae97a9d535fa8dee9542a85c9ea464109732c36910f1 +SHA3-256: 4cbefd4fd2add01f4ffeabe0c7c2aae0d3942f38ebacd202ad80768c5bfe337b +SHA3-512: 32e2aa3facbb9798deaa2ae54de23e8b7f8d8e21a03a7f1bf6c41bf1b633ec4820ad6635cc58ba7a6b8a281506c433780b4e8eedaa11cdb63bf0ed7de9019016 +SHAKE-128: 7d9a1f990c42f654061fc4b24474f7d32f4e0a5d05b560e11666a7594db494600c1e9645025be3827d9c5a49702dd826b32ee41d610eca594ff820055a664648d4bc0ba86b11d3b76a661d2e82033a1fd9176bb2c832cf405138e8e793c6b3a8848a82842f83e8379eed1fb130f8d537d680c511fc1d2abc62fe16a320f91851d19bcc0f500ef94824b45271c13726c2004cce2691944a4072062fe94e36b23f2cba8393a19fffd343e211a2d2fafa31c29726421d0c007619f0ef9a8feff763172c3024f2bbb3ea13d6da8295c079ce23b93f62bbb5bddf00670806bbcd058171e25d2e076300f1ac1f5fca2c6291b93b29356eb442f50247d89d23cfe2f4e64b498293bf3d7598044f25e5d353a87f4127d06f3a74c792a7faaecc13aa4b76794a020d863a6fa12f911408b3a0e34d71abb9dab9527064aaa2995378cdea84f6bf89bf6c3ca30725552c42ef36488c4024289ef5581324afe03f1fca7f5f05cc000ad3aaee6c583791cfa2549fd8eaebaa3d5d61163f2e1c229ccff4b3286b88666888e598946f8795ed4acf9279ac0b4fcc35ee7b1de130d714bcd6b7db41b29ed72efabcccef04ad1669c76030f79918c3b08f9d7a37254bc2c7df7eba4264a89f7dbca4e80db787b5dc6eb3c62c85379cf06b15782401c276a710d2f9b1e356bf1ebf5be572a077613611958975cd81c857bda283a80c5bb26855cde1b7 +SHAKE-256: af2eae5e9d4e5a3b03044285d2370983b179a56c1fb69a64bab96ca5a365a87a973f14887b7f5fa64b0478cec273e0c834e41a409053d704db6adbaa8c9ca957e0943be08b285c0bb383123bcb954f1ac87a9b17dd017dbe84cc2fb425ecb7e19b13dc53eda4363051927e9cda6af4c2f6c7e234a542d41f942978ddb61febfbb7c3a874eb58cab96f7e83d7080aedece9f427288bc7547e5992370c4c859ee632a5b04f5707c1cbce35dee36260a5f961f7a74f71ac9cb4534739b0ea1835ff4ff92b24dd1a01a45cfe2684760007ceb6d69c3f33511632803fce9115190eb4603dacc23030a85b41357605e15d457704488a71aba01aef0fd1fec8c889acb2cf6c49c31f3f0c41c6bd98e5585dfec9885ef2bb9f4f5659f6f78d910497498c14489b82b5af2f8ff1e874ff43f3e5e55f94f58d40f9b58ec3e640268bd20fddeaa8b37f0bd94cb8bad407434d63107591cd73ecbb6cc06a448d4bc6c79d26bf7ca8be8a433b508e73b1c5a50a93f1b6aebd823c012f7568167f3c49314a1997ad61eb48ab7914321e734b3c8c993c6303e358222dac99781706d863aecca70cb7f83513ba833a26ab7f79ef65858c4927e17b9f2e8eb1d05923ff2496aff0b0a7f9dd82a6d4e7b6882c7bfd70dad5dd8689e012454e2f3895ca9d638d4be9f05574b4405c7397bda3b0d49b281dc66d568b56d8045d0afdbe2b9568e0870fc9 + +Input: 7b436a5f837151816c3764b2ed1706a9f0c9bb99f0643d9910e6338ce4ac2e22fab42e99493737d4f54b471c4d93cd7c86577a1237e16debcb5980579a8c198bdfa1cdc3d6f6dfc32d61b3182ccfd58ac94e900edf3adda2ee7fa37b56b279f46352c638cb901ac0d4af218d8e84aeb5c4a1289550154e3a8554ec552b3c34952e9cffc0378654940b4b6d53ccd8b94960501cd293c076ab0c7342666c293b9bb24c9432b9f5cebfbe42f7a0b30c2a6b7abb0aad7e42f24c81110a9cb109f6d2543dd05bf4640513586926470ec51d145a58ffefd82df091fe79329f5a456adbb0646220af1d30c6b2718dd3b4a0acd6505102f53e +SHA3-256: 2e1aec5a18335a7425916a7183e853e1135d26fa62b6fa04678ad78656b5ff03 +SHA3-512: 3d8b5603b6dda2b0f509741eda0047c79970199b4a024729925abdfe5b3f9fc8866c31a3b3e47cf9167661842f6b39cac711e9c899d402310ad66b1ed8b14303 +SHAKE-128: aa46207ddc3ef07ad7bd317508525b50b47fb4fcc1dfe9c03d10cb271c07a9d3a366a09766a5651292eb45863371f1bf888f82c335ab2dde8e24b995decc1ec5385dfc5ec6871ae9607425cfc8770d800d53520820405a5cc93344d658d3eb7b5832c58022d2519600e8aa6016060da4ae0d91f6535c101e57b72fc49a4176655ba3129c4229a00a55c4ed2a815ebd5c345de58e2506d03c123fabebf369449ffad797c90e36112114a6ffe20c0c00d0175f84e6540dd30de12e0f4ccad0f78f7bf2d57a157706a82cd6659a0aabdeefd5b2aaef3d29631b72963df0f193819acbb65b31656f79c93e260aafe9973a28092b45bc43824e0f3c8ea5a9226dd4fce175ae3e79e19fba520e895556555ad0ade34a39eba04352c2d0ac62c835f6c406a22e9067da6d6663761d1f6ea9fb37642d327a244efc16e4e52b9cdf1e1b1210f6d8c10e58aa3d6720013867564aac6d3efe389980a96fdb3c952d58472b8d89371ae283e87e4c70658149ab05647d862e23686487ce9685cd0aaf0c037775f918419df6e469b2ae122c9464f1a50deba8b222383bf29a264cd1cca83a258839d5bdf02dcfcbe37273c9ee1aab3e55f781d24c6b639f1f5554d443db76c813e2f80e15fea3c1b1946cf02aeadd08ffccc936252e472a72500511d1e1772502a04da08b7ade5630c7ff8913c2febd7082e42391db9df71ba6bafbbd9b0c7fb5 +SHAKE-256: 77b2cc5c13aec5aa5dd7867a7b3cbfa630682c5e67ddeceeb6d38bfcd23c3b7459686ee68f940235d34dc2a29d09503cbbf4253b2070621d9c8996e3df592c8b32322baea145c782ec01f30e861071e7ce926a494753079c4b9ba88214f414b44bdf08198ff24866ada5b768889e306ab4f8634f4a3b92c5b297992860b7b5f44f31fb56bdd083171f6aa57ac0b5d683ae69f71e2667abd72f1b17c593457771e07697ee10556527cb1d3faa01d408d799778d1b4c6c102800db386a9383c74b61877dd99dcae9e5910d2ff5d9dcfa7ea2f09ae3329b7bb32518e130fe234599f277cf446e816eafbbc89d323a9d5eb1ad442a83f4efff7d647311f2cf49f2698828798e0e33c1433324529ced6c876c2bd5293fd5c6e46cd72c0a4e1676ddad8c76734ecf4818b616ac29c683cb9bb0926d864c72c79b04053ebab0386132c5783064f7bd48dfdb84e2985a1dd7437a91491a807c89a2bac41160a70ea40f12ac25a64ef3d57d1703b39710c0e1b46531157e33511f2b3d7867a1a36033fab525ec11a5df97f3f25d76a1b482d09fe5dcf0c36220d7cff29998dd07cb2eedb119187d620705eeb9014ec1fb269b1315c7b0de82cdbe8ffd6c1ef9be561802386daf7acdf5e6610a79c9c4a6acc8b25396beb14eae775a9f20c87349c43868bee9b86292aa9dda0f53a5c3d085d4d4199ec0edcc4773667687497f77db6bd03b + +Input: fa16ccbbcdd640bd6d184700b0b940af437acf958f75f8269a8120963ccd5c45eea0da9142b6699c85edfcca4ffc3f70b902152512fb2313229601bacbdb4c07716bb0ec2bd85efd4a28fa1ce314c42cfbde207a8af84c386d635118c66696b83543037a7bffed4f4d6a01ef5ef996f0f289094dd7a753307ba203975d3f19b1eb2ac131317af9c1e9de45694bebcb5d2e6ab09013f6af579d0bee8de772b5f351c3f462db3833645aeee0263717d58553854a76662dd878bd0b70c504f5afadf9857ed263139ddbcb3f5f7b13249429c9670736605e9beb9fb7cc674878abc594905fff3fdf05158dfddba27cf72e051de0bbc57a88 +SHA3-256: 572545f609a8e5288c343e2a6aa19f86aa5457088d0231814c7def9e7f36b6b6 +SHA3-512: e16ca96f553bb20f0cbb758cdcc3086825a922096736a1105101b8ef9e103c88a1f5b0867c7882bcebe21cbb8aa9d04ef3b1dd3f137a060d92a1842aca898de9 +SHAKE-128: 81afa606496fdefb580763e228951c71d42c80a09ce3db05add69f9b28e5df3a78eaf07d67e30603c9d577538e5cdcf1bd20fc853aca5713d1fa76b0f1b2436348651b65079162338078e20f932eb7d645e1dd0e77c0cc529bbe2dc9962c57f6a4e79ef2dfca7eec816eedeedf90c77e50f55bd578cc6c5fc34c085a82350bf8c17e1f076cb8f661a9711cb5ecb92bda1a2b5629730dc510b530cabcd589fb2c84ff87176f1223402f4e6acd27077b4e8e4e9bda127069efa76c1ac16f09b6b2a0c1bbef4294b79dd41f795f31b1895219c55b92efacd3cafbd4d949c271b99b04bf428bec63c9197f9524e8e0163ac47b3518b95c816d005196da4d9bcb3ec1ab2b98f19d8406f529265119d99e7319499726b6bf96e3dd2928f87dae20eb5d3cc1a07dace145355ab0821c91685dba7674aee048d8a24434910f5f5febd1bf68fe5c3c18668f14b567cddf0364b6064fe374fe00f56160549b39a9d9b290f231f91f68700ede93c297ad7a188a1dac604576d2d173e200d1060923253f543432081675638f82714705bba9e2732b25707f1029a8c6626f4abe2892b603e17d4ce8492aeddd796e12d3a7be3607d8a8d3987e6efac9475bd5ec2a02d2518aa5843ac8e48148357af79936621882daa2c419e3259145afffa2db1fd71adc24eb0bf948da619e38f91e7d0e7d5fc03000232f51deaa119577d8dfe59c73e5f3de +SHAKE-256: 5ca44972424792c3af77789c3bd0218b3dd3caff0f7c4d03ed94ecc6a2e9d71ba33adf9fb95b0325ed9fc66fe9ab6a2a65960df377ccaa8200a977fcc2c8dbe33b4ece1ba560467a1999b8eba51741a64714002944d696da6e48c55ef37022a1ca70aba8c7f1410e6db44bbd2d70707f7437d339804f942ef0f816f084e7230b92f3e04b9a5e4e15db519a71a037a80201206d6321e7195898ee40da56fbdf9e738adfdb85a185377dc54417e885aa6910790f5bf0b9d66d91609d6eed9f315d4a7426e196cbc2820fb96c2e407a9d5c49a561402be8f6a81aa70307e52c7664cd62554d0a75fa9800fc6ed1fb0c80f32d11c390e01b198a28b432522a98e6da062c4b704f4773690578f88621b6b52e446ca1373eb161fb55d17b8e90e71140eb355510874982720f58b3192178376373597a521f38afa90db1215139540d3bc1c1df15ebf640271b1abd90e2a4ea14af77663763e24fb52968945d9ee19b5d650989e2d292bf2c7b0a96fd36926b519ad47faba140a22c22484dca08551d5cd4519144a969f0ab49a0570b01ccc623fbce38b0fc26de2cee47ba3600757e8a5510c92686a1806cbbc65a703e24925ac1bf76c3ee04b6fecb4761674089a5326022d0a72a80be9523db8b3507a81359ca65ce0fe5967ea2bdaa98f8baadc682f2f1a1a966bafc833a147f8a88e55661e57acdb640f7cebb1e290cbebaa0c0b2 + +Input: 7e5a413e596e9abe4ded3274cb0be8ba6d0db2689f5e1b974b69329d02b1fe1f9c9a1c15c79634d45b296bbcea48d43d05e2ca805ded57e0f2709af2eef2e45a9efaed722b7fef97d1be96fb167cdda764f795554063cf46b1c907d9ebbd6b6c728df9bb872ac6f32ea10a8af0c1aca22ce0c7a6b0ddf5eeebdc43cb978434292fa5e64bfdc13c4531349583f0e73b4d8b23a9b97a7067560cff1c28f4a0999536ad36fcd93d859b6a04eb81df54924303eb9bf79b472a06dc87bb7e35451b0b4c17cf05508cf9ea5d6fd2bc03f2141f86b91a7207050ae956b04d970e8005ffa11b265e8a95107e651538be175703fbf1650b099c56c0 +SHA3-256: 1d0af0539c811337644f75fe8bcf724bfa567befcaa33765bcc2c3cc76480444 +SHA3-512: 3856b6e0b2f5b5122545948416b6a54de802511a3e3c46cdb718068e29217dcfc046d2ea00da6deb9028035530b118e4939a703ed5cb36cc605ec1470dafa639 +SHAKE-128: 5f3a24215f7ec7ba7faf3a85899dab79c5bb3b7ed7b10ae95fa39f5279ad81353a14b93c0792d7b7725cd69a0af90fc5c8c008fbb5c340a406c1fb82bdf95f02be7ce906f6da3e0f50b57d6975e5eed21d8edd1b010b322a45df3e738d3660d781a7b85376648514166f7401600c239063bb56d2f24869a0f0159b65c0468beaa4b25199d374a33aaa74764931c698b5ddd9d865639acf287beb059a6ea6eebfc6ec610a578598c3c86e026b72110e0287e6b2e07a0666829560ac9d764c16459c1b78da661c7cde053edf9e597289340f92cdc11aa10f83df4d1db4b2aff202bf07cce6edf62f0a7d60ccff7f2b1f2b5abbe8cb42746c067f107714f94dd7f4b90da2f1a57851cda0c950fbe32e0b5726c9e658a93782e8700da09c84189a3d0fd27d6c8ea08f05625c6e87413e9bf32ecff6f4b70b4434403ce53cb5c8c3c40932e571b17d65e0a2ff95efd8bcc02e7a272a40ec8fb18482e93222ec3a3a449f2fdb8847f3eaa03c5bfbd843ba82963f250783db893a45f6cf89b83b24c33a60a2180b9bfaeac9295fcfc2ec3c1c24c61a09363c0ba6134c3ad1fcaed5ecb623543f039bfa3ac69b1d029bef8bb92a730c1c9d19989e1f6c0b69d64f90e278a5f44877b0689b21e3b77b348c4fdadf86514c35d4154c0f5f590c738d655f7f3ab6bba5bbe092699b40677f1a73fc4edddc482015f020ed5c609cddf30afd1f +SHAKE-256: 02da9db12829427a7b9af05f87aa60e04ee0a6b7a334a2a1c6ba0da35d7a42024e6fa8cc78a88cc17acec14f84be09d01f7901d676b760d0243e11e78b13e981f25c591242ad4d00ffe4b22106fa587fd56752ab8f7e224aaa182f89b71885a1a080d3e51272f6f5d139e27aed6d2497fa5db15c6df8e4c237888d8c2b46131e972ccaaf3dec1e5e215b75a6f78885610fcc7bedd6fab84f5ab03bbf1e7d3966b63fbe94f346bc8b087b433532ae36731635c7ab8162396de6d333dd913cf9f63f92b52f5eaa39ffffbb9da34e79cede493a5019d6687bd944ef6a8a637786de9d49da917976598245c66441157841dbb198f303366fda8293053ebdaa17d94e1a58e819e11630f617e78f3abe3139fdd908437053ae3243f9b66c63b55824889f49e43aa079512a2e8a9db76139c6727682f80be0513015894facfccd5ae4c984b588c0d98ed22989fa9b98073a051834bfa6cbcc3002f908dc99e977fa082da2c28fd78361f15406f670ff1fc0c13ebf89c18e69a3eb66bcb22704a0eb9a59db1674be5f35a29fb7951fab67e58016648abf0accaa7e7e20093d766e2d9a4916008bab2ee70903efcc422cbcaec9002655ce6900567ee028135aaedd98f607aa1220cce44d31a4ff3ae5c7ce2c9dafbee3aaedb5e285037559ced5dfd87ee25f37b621a5c5b4b6a64b66213d8b3fb54dbf76134aaea5a1836109098dcd668c + +Input: 3d3a40750a0a257f7e8ca3e13d73a4511f8fa77393735393ed3cc70ac1e363c590a4e1d3bcc087f1f56f1f8f3262dc9d6d5812b9901a4d222ccf34b4b58939a3cf798bb86009a1257989f790e3d8256ce38003a1943debf28d3c68a47960bb1189db6bb77550b8bbbdb8fc3e596fef06d271d8f301f01eef8dee16a7aea18d34f46a884fa953e062a9301f11fd380b11bce89cec1b29416acd03a239a6846415a68b6385204052471af4529cd392ca23a42badbd371ce6fcba7dae3bfe7e7830b706f3ae0308fa5a804eb1c8f54da827dda83a7f76bad549b96613927274cebd4c6c91d8e078e977e69c30b4c3f3e62c433099708597ffe7 +SHA3-256: c83c94de4617dcb74566f95c705db05f6a707c3664430b834a9081cd346b6007 +SHA3-512: e9e0cde8a75d95f89c9cfbfa0868e07ac565f43468cc51359cee795babeee301e68524df756483a2ce2d4878a611b549f3d23a26d65a2a4659c82b823d78ed79 +SHAKE-128: 371b356a3938b8aad9c13a669ea3f0fbc344247ce40f76ef4dc9cce1210ea37d081b836d4cd9fb061ed005158bc13a42ac9aedd8164b23236085c2ce6c41317cb5fa9c7a09ebf857ecde30a296de72b8f20aaecd415b73751510655dd3c2b5420bfb0225761ceef95124ab5fe630bb5b0686c40ed9b2436868f26d9d8a67a884a109dfb34619abfb63be473e78d09de5a7b433fb33636a7bd6dd1faa93e3fb20e853c52a2ba502b13ea05f564cf1dfcae5ea5be88290003e6eeba424918777cce480d3792cc492ae110c9713f37e06aa740ae49eb635e36bb6b080c1a145b3eb38da9e2b2f6158596e2c8db8fc2c5a1d2e8c19b06a81bb041e72d35c1e91e2b96bd4f06e3a7dfd2c86d057b4952e93351b08c48520414928c9abab7bbfb6b5cdbabfce0cbb0e8589645576bb2ebd4c2b287e15be87836f3f392475514be8b4030b6da2d267e2c06e49ea8b5a017380e3ffffcd0785ea170146e4be5724bcdd51a22a7d568e22ff87a717f5dcc4afec22744d3a41be4c3f577ee7208f47f20c024d2e801549b0b1067d9041c572410635a39d14f5b0894bd11ea73ff19417b08615535b664e6cab2ae3142838ea3c61af0e2dd9c5fa5aa4e8c3d074c2d02dac1b527e6b8274a08c039492392df95da9180120dd5d6d277b326337d8703c6118b729bf0c8d1417b18663b41d52e5cd8085900798d63ade2292d4bf98a50e6103b0 +SHAKE-256: b9b977a5212a43a5e4312d12c551d3b34d16a43c646cc7769a87d69b6cfbaf074470e0f430b200acc9fd06a5b129b4e888734ced070c05e514dbdfba557c5038ab0dc115f8e7c60990b6a741ecb032d50f90e3f7fc1722da652325c3c8a06c16caf2045dbf43ea07e8a3ca481d4711557d7e7929b8988dee3ca74776f596b566928b37c10a1573dea9c652dc2a754ffaacde9970ee9aba0edbda5221935259388fa6bd2766c89044017799a1376ecea92749ddd30ee6e2c81bb8c35f26274f267e85273e1e695303865ca29b4dd96a689b939da1c0ee2bb6095f867b089235c3972b738a3dd6bf8214df431051192e5f2086188341bd76152b90c741dfe9fe0056ec463a27bd8603e4ac30b71538f946137c9a30939bc42024af0f574e6a433da16dfb88822b90053e19d18cdd39e39028165efdbb2e75a7d8f69f01b900caecce0ca182047861dc918ddde65dac2d187aa48ff1cd1baba076ade5bd811b1d2a3c0466b6f8918f9d82a384a8cd73a1c39cdc16a520b0950141fdb4cb0f1e5a5015fa12c4d19dc08e9403488d233aa40de546991612fb6fa7178ef5436df14bf9b6f6d0f2d7751d5526e6d910f183782b9fdabba6f16651055e6bac189e2d93dba80413aee6d6d5b22bdfe88e864481abc56705693bbd11e274cda1c49d24fc37919b009b0d8e634c120ede55741c93c2f3ec62b93634638896b0505d937679b2 + +Input: cd9593c7a88e370ede4ff38540dd9c1cbec6631090a289d4297740769e5b9ab97eec2098bf7e6437dca5d88f84d731340471e816268d78c0f5bd1d9557b10aea9010c1a4b21b436c5c7be89d6c6f5d2db901d962801945979cdaea30d0828020daaaa88d48e3ad69916172a5d5b76c34a7833dbf3e7fe33aaa2ec8cf9f584dc03a97a1f9e00b32bc631de9900b7b8cd7b7dd0e0afaaf2b8683cfc6905b3dd4e793b4fea9de70dc1ce4d062eafdf814fc1aa7e6575d54224e988c6cd04fed9ec0d211a7c4c18d7ccc9cf59a644386dfed5d30571f514d428e3c1659c8d0a667d8082039e6a01c434dd423a64b4fe1ae5212df63d326a0886f84 +SHA3-256: cf0e45dda9abbd1769c38fe0ba2d2c64e49e9dbaae6368d6677ebe7ca10cdaaa +SHA3-512: cdd7edace2d1253900f634afcc1f449525360e9334de7193ebde8174126f462875aee6e5fa291076e3f296c3e66581eb0db81abee45f9398be9eb730d08f6d96 +SHAKE-128: 94268739f55403c877585ee64db08557fab4965cdbf25a9c3e2a41f044322f36d6c8da14bda3ee1461c5712f7fb283ce9bd6daa028b5209c730b9d7accdc930d978695f6a158a62c7f8ff708e33c5dee6bc388d5ac1419f809e8f0877e69097a593fd5569b42d1914a3ee1ef33f7535be1f7305d3b9b74c039ce1760d671f81186c1d516e9e780a0b316994f57e4b3a64c6d0706add4e6e3918d75ffe5051a0db1e031ad2018dc4baa769cf1aae47a758d8c663341861acf6fb027867ef63c653fff860b4efa1c567cef24fa9dcccc4bc9d77e576c511ae0d8ca7442d3ee5990ead1c4d0b6cd9d5a7e10b2305b537a01a3bdcf2242015b6145e8f2f4156b944dfe31bcfabdb8c29b35770d63c87791e82294089d0ce57a033b112005860795c32d732f04ba609991d7eea086dbe1b4c3b6e7599f9cdad2252bdb19fd91da4036d002277a7ea0ae5b90402fa98831b898a58fad96d01205955fc799c00097196e8b4a69c7ad86ffbd7a8531cec11e51d7c0d0e6dba59e3c2fa28143971e53265b3898a9f555d16c9db921904c71e7400b508ee6617804bfdda35dc64eee7dc8d80f4acf0c1d26f37ad442616551109ab5c6761cc1913862fbc557610ca6c2e9551ba367a08e051b983486c3bbee3da7abe0020eb4abdb82d89e04b207b4bafb4e9053981d5cdeed2e5399c8c342d90878ba8e74e9619a900d5837306ae427d3af +SHAKE-256: bb87c5e0601f3ae9ebf4be3be8485443477388d9476a417180514e372b03e09f44c3ed7ea6d050e839068a8911f91fc1f3348d2562770745da35b05a44a1a253badcc64a0a4e562c8746fb06aac65b447aa88ff5bf42654bf2ea6ce48ad3f353d11c5db3e7aa0c034fa0fa65151f7d8246efe1c61f48acfbc07e5d9fe8818d02bdce1abeab5f71e82c80ddcde85206d475e54cbb93c5aac0a2198f562393906d0ae9ac2d8059aadfd6844cc8dd28b10cbf4273dec30c58485ff020a910298e2de13ecf4a002c7619f27712120509f2de5a0883033ddb2fe3b5c087d272b20c51141706ca599db10d565434889555f0634fb061625455371ec8cfa652441e46460469621d686f06f54d3e9c4796a0064d9a9c9efca9f532c03dcad578ed3875788a9ff0e53b91b55ef66e4d4c96a9cb34bf0f998cc42a7ae5cc31516d90823a91b433fccd6dfecae10375e8eb41b21ddea417ace683fe9fef086b40c03b3dab50518c7a106d64ac0bf229a3ee70c2eba56084b855f9caf2a87ec5799cdc3b2b3d1e2ac8f09ed48e21d1831a7728b991ac9fc03184c3a78eb4da978064ba16d8d6ac799fcb3880ead2d495ac4638dc4f8fbbde5d4564c99504be1c7a3a0c418ef03fa7938287482fdc985c325e9a152e3c5ddcc52342d6134b450615cecdbdcef1bc11583022381407019d1ca777d613882745fdcf0e010a89c2620794c8644d71 + +Input: 770147d755e99b638c1614141cfaf6fe6860899d7d3749cb4b0ced7b0886d59fbe4c508854e457a0d382f9b4173694ee62240fe0a146897deaeb5bf2d7cd533a5ed1030b84db4e4edcceb777830714e8d9cc3b77a62778207d5f190b31ad4434c5de2f24da24f59f50f36100bbd2730deffd2b0fd00dad16e184c7ad0f4ee2fd78eaef211a7eb9c2ec6436a135650a3bbeb2ec0a5c52ad29478104873576e13b9a097f8f207d4f38a007ada015ffea07df4501180487caba5f238079059386488e0f726f2f8c045d9321624a786cd0cd11e964d5a3532413820c56cbb415bab1130db499b8469953904dde523ae030892908e46e3f4a2340591a +SHA3-256: 75f58015984714da7cb6f034729b4a5047cdcc42301405bff9eca9ae747b8557 +SHA3-512: 211b84361d13d66cfb9fc4fc06d8ff12ac21c805d820b17ec02dbd98a79020141ad481fd1ae524db6a2c04a0c66e6ca95c33618ef773712edad9f1ad90d5c5ca +SHAKE-128: 93d46e1ee210edbb595b865dc8ab89deb2aa4270ebf348eb24352d633a22df07dfb75819847f5d8de9d2e9b4ec54cb79b5d6e42d8e1e547d1728c041d8637406eb01064914bf4fee3796cda94bfd15bc0788aa3eb57ca81d67902e435e2307084332a268d301578f51c3989f4ee6d46203545157954e6b7991fca84eecbcfec4476667c0d64315ea62643c214f147eaaff4923b8fb1a3fa6dce7fd3defb6b2b69635e3729b4cba49335d8ccb9318a87b2cea70fa584072d159fb675c2dc37df2cfe6d11203b312e7fce2cd29cfa7abe5c6896d64947903fdf93b0e89d95bd01e4d42cff457ad3961ac4d64703062b346653692371a9e03ce710cfc05335022128fe07cd7a9e894fd6fadfc78ebac8d4f62a3231cb18e0184e0df2bfd0d9221ffdafb7fb204b87c509361a65446b900c882306b681625f6a69893a7100e67754048a226144b08190a4fce7f7ca4d2e58809a9dd13ee120d72db84f58c121a021c6d34c435cacf876e741ae1a85df50cb05a6658919f61f8d4bef8fdcab5fa5632a2023fb8818cbbb7de0001b65affb80cae76c1221eab8fb2b54e7511c8f4b8ba68f75b20d952790afd71f6719e84eaa6eb0b0922cb4921cf2e8b78d5ba34ac6ec3790a2984426af0036ea19ba45a5c4fd00dc2b40c52444db7f3ac05f103b6a949858187b103597340296ea70c56d7f05de6bec86a4a206247fa771cf6fec10b +SHAKE-256: 097954ad208cbd10fd2b46800c0d2e13be2ea589e0d2b928b09ad8f0df5dd922a3f06f9f123342409d60fa8c3c75a25f5e885d456b763c243a3e3428178ed1f86bae5200213a5a51ff60865e16071a3f60bbad4572dae5af92b8b2c66f065a89344eed7570018da8e1727e8f96bff2f0b4869221e7af96e5f0a65151eabdaaab8ddfb11328d6d1437de79a1789a38ee66469694974b1d5475c776c0bd70fbce6552ba7dd9ce5ae281b647bfe801effeeb68380abeaab6a718c2df308634cd3cdd09cec319b4e4ede6d01f18b6e43af83b24acceeeb22cf01dcc2ad96237d39e2c4355115a4b4c1d30bf58f7fad4f175292eb8154535d3776c20fb6dbf513b1fdb635613d5060029195b23ada730a705624605ac63887b158bd16bb062426de571cceab89fc5e3f9791edb468be8cc114886ae136489973f5cf15a14448027d090dd73a6565f39341c2657c20201b329dfc3227a8c650ea1c176efd74dac4dbb6aefebb16cf0698d58874d5f50c74d7dcfb894da9fa529aa5f414a500f05ea928017eb09eb703400cbcd49a915862f4002963145aac657716e51eeec01a865f372e9fffb0ba9ea13fbfaf4ff26e2c646b00f2ddfd5842de82634a724213a73d77a6c510a5ef3c2c82449806ae84953f043cc9ab7bad0fec9be8c54ada98596a6ab188cafa14951d1b64cbbbea1f03588d5ef77c7529a24f5b42f1df0c072682fa + +Input: 74ec44258aede674de36afe98af9776327fdd1d387badd03e79cef9e7894fb291b59cf81a1a255a6be6b291bac8aea7a800f0a70d08f8de4675a18891d3390e7ce3ce0841f403ab0d15c3b877018649c30e1d2efb9b39497e1c708a0288e5cd8c1abda692b015c97674fba882673e0aff596eca3c3e05e2630fd187928e8f92c24207eb7c74368405311461650f9e40e6704f797f856fec29f0d3af5896c7750cfebdd5e5d522209cf3fcde9f1a4923e0bbaca43b416c8543348fd54d3e19ed0a534dd3d37e24faf80aad3b52aebeaf7c9796cc9af663d53a771b74e627352e2dc5f842580f075f027e9f1b0b4884b738ccc49fbf8d0556786c5b0 +SHA3-256: ba3bbe144ca628741fdce3c48bb83342524f7de5b9f95839fb822955240d6cec +SHA3-512: f57dfc7f0d05ad4df05edd0139e23b11732160775944752cc982e4a0009c4dd17ae82065ff5b85b885aa7f913d3283d9ec009686b3b60108a979b50781a61317 +SHAKE-128: ccfb862462889fbd2320277f6a5470909a27adf3a05e93087ce481c8e35a47d909837079fd97e2909d1c89b247a82e8b77943160bd0291be559254fd31e21a77e95577222d450949cc4a1373b3b022cd0a357e4e14e95b61f9c7f4c4ef85f6e7a0a28d02541e1cdf3d520d817af8269d197386b1036dcdb42846a4886316d4fad98819b27ea40bc5924523f11dcf0340aab54c2119648e87c7fd2059356eba822520f54f075b463d8e85a758b407f39a7a73efbd3534fcd24debf8a3d836df7be992a2f6ef6c323dc348c8d3283ad02d3ea9f72c697b37c367e3830d415751db218bf92801a52487f9e2128c3cb21931bc07042339aad4534bf1f7b60d75a81b79bc5628835da5cfaf85f2c96b4ba95f8987e7b2ed6b7d5aeedc371aede18c50bfefc3ac0fbe9a942bf9a90871a55e14b80b9745e84ac052c2a5ad85a7e101ac65bef43af1c15fe733e4eb1a294b459abd377fce1409ac7de99031df7e35f7118a533a804c37613fd07984910ccdc0529d5eae51c377020b369fb42889884e9a8e745e600799c6907acbae19cfcbf8a41a2f41741a50824331654d1cbfc5a318bc6e69644549d0055855999fd203bcd478fbe2137a007c096bdf82e22c9edf101d3f4b9f3a4fe6ff5aa6e4d7d228ffaa58c376617c920ed162004d59d01aea4dbd2c242f2f2f454bdf4318ea9ef705bf7abc4b43cb234bb20152ad21dcbade52 +SHAKE-256: 312685bde5aeefe566b0d29d301fb58245881e685909e234e3a665bd85996c49cfbae1cb9c154cf82b92b3a66506be5ccefdcb4b041caf2024c1e2bc855b81fd7c41de25d59d22eff79d1287ca7ce0b2d89de1ee248ec0e5a38cbb90ce5afc893853e5e8ad5b5428720d06182574876cc12516c4d708c7989cb48d02e57daa34fadd4d34cde1c033442366164695297267ac0c5e11e660038156930ef0096b750b83d161f3bd2ca3022b382ba64973aadc62c0ac24facdb75e2c0d71cf1298e3eb5a728dbfa5309116ec851499ff2eb60458960e17c702c8b356f9d13020ad6f3ff5c5acd5a2ef229d7554f6a8c400d6d04b5a542161bcf28126b4b0ea40c6a87e81a469ac8be1913d627f677a758a1b1420facf770840f9dcbbe8dbc9db686b61895f7051c5b47d6f0f389a8fd8021215fe2aab363fa2ed0bf91d7b69f65c0bf066a5ba43a4c592ad78e28ba59a2fc97be8ee1b9b175915b0b5fe747741462d7ae26950253f6145d8b77ac58b8777af00620499c59993fbfe51de0e09019d6005e568b1dff976a8eb026084c33647bfd4f5b56588ebbb40cfbd4b0c1fc2c7b12d8cf6f74e64ed0747209791226fc2487907be4d452a50c9151bedc9ce2055b864f66fb95674540fdc049a78cb287f93114e0333e8adb7a2e435c7bd5d11e33cc255e03556af393f03251b526525fce5fae2c5caedd268f5c0cad025b5227884 + +Input: f26edf116fd5f08edda64c345d74f45d72e658c26459f71eb20194cf4d26ef40cf6dfd2b4a3b6b5bace715f6670cd9a3216735347a5c0b521d2923ed3f2759ff015e0610780406c3543e9c6c41afde980ce5b1932685ec4f358e6cc6036fce1de5b8333c928ffc34501e2884a433b01ed43f7037a60e325d85a4bb98e016b6b3ddbe76925daf591eb52aba7205093d8ba2c202170d6d7831b97406d34d1445a17648798b95f4c9d6ce99e91515828c14e2103d955795a3f8e14b88c3242d9540dc054c9616d127dcd0a950562e8308a628d0cb890651ae55eac994d770181496cb5dbbe6b8c412390476c68aa28b0226976134e19297701600a5a9b1 +SHA3-256: c2e9da9b01d7897ad357de03be0afcb8b2b42a2ca322ab8950ac011d596feca7 +SHA3-512: 326fe696e978af9f289fe8f7d704f08793d446dd990a167822e97cf3d2a9161a2191b4ee49b44c45eae2442f7bae3c638713919dbc53c75b8f9d8ee82ad177a0 +SHAKE-128: e5c6ee339e658f364509fb90d481569d2d5ef98f21b8322a5a4a76be9998f03c4a7600b1597d977f0bee3e7adce79518fc4b620d7eeb2939cf5016b55a047e8826a2fdb7f7e07a1141d050e69dac08ff2e6110fc351e183d104a137284946e423aa085517a8121861cd5f16d996aba1ab1d4b2d7691c61a4a9374df4bf88bd64a77108949386ada16e948cab361feb81b9b6b6ec55447f71605223533425e7d19f95c0487632fbcaebc53cca2f6f60962a61fe3d7e4fd534888f65c143f775b7f8b0d21b9d6f27941b85c2cfff751622b4d5bf8986cd8bea2953a95c74c58e8a58543817095b2dd889af6612a09a75deab17934aa19d2261bf84ea3a15cd0f78e983d0a710b4b50ccb15c1c1c87b9f5abd35167c3233340d706322c57d4058f9ec1b9daa8855a18b711219d365e8f356ebe79287c652e1675b84732d218e434a36d6ecd58671251a1be5407c88e6ffd0d35f90e44dfcc501fc39859b0b5a82bad6806224fdcc8cc332da4f422d0588023dc0c28491e4f8f16e98bed1fdad371c43809d18216388eb0c7c016bd206379b8b3305d32525bb7054178e31ab34f6198a4733caf8f0a1e15f63fdccce563ce94bbe1c1004a87d8d2e18c95a473a0b95d980b3bf6045f88c94544529208cea83692d532ae12dc6bbbe727ab73ddca7e94dbf72170d6429bc108cdce9122e2c64ec19853e08c8ce6207a66745dc1ffdf5 +SHAKE-256: 9046e8aa3d0e7f9eeeda0fdc6ee6ee899f0be53cdc2fed363dbc1d7f71de2db1d07f15e7f0c7d56fd58094b817017d2e2653b949612134f8d79a863f5c8f5d0b3f14a9601fb2969aa1e10e0b6508127fcd9ac001baccb435f74330589a3b6ef31c1a60edc51884e8236c6ec6c6c13f66dc8c282342c17e1880e9d38590061b5aab0307c7b188eb768b719b1b5cef955c56f503af264f7e116b78febbc9aaa37abc344448b766153b566a44d784e2668d6bc6c78f6fcfb2f9985c8932633242b73ed5c2a8d52e837b7ab31e931c81b487f9bdf533dc29f207a19d433de191aea95277813049c7e8d0cc7a33c4cb1a7015da38f051f3bc6df10e15bcf5be130ff96e97930bd1e384eb25463203119ac4ca628f76f8d66abcd884be33b02907d2e498c36e35f2cb870fe54eeedc4b8919bf413192e4d42b972c824a11a6ab2ca15e8cd83f0fb9212b6a54e514a32c1919c50db35c25bee771d990d4f54e3c01f198d2baa70bd178ba96b93ed7e920488cd79f57ef019fb0151abcec631d9f6e843aa93463b8789e8428fc37141cc891f8870ab6dc8ccc497a9ea47445aac1b542fdc899e9db0c6e1060ec73508ab1591bf6b6eb64e85ed6b2557a14c849cfa4079eef975ebb054c21257336a4fa920bcb39da17ff22226515dab38750ef7344e37b23cf0e6a20171c2a8bccd50ee43c1e0f3c745352a9e28a7532cb2bb27d4ad691 + +Input: 5701e38a6369652b54987fbb64e9da48449eb6dda5ffdf18e9f758e621997e3fd366f24e5ae264f9a99a89983a7393369d910996656418deb583a17d5b831fd161cbc6cdfa04633908582e919e8e4187708303edc01e5b7a52d7c626453a569fddb393b6533f96f0a2c7efb1c12579145ab20093f6155f92e314223ac06493d306976b635cdbd8800e49c9b02ab4fecccdccd9f710c0a2d23fc41b1128cba023071ff7d6ce7ec91b27f1ef3a6eec51beba4cd9e09378f828e4bb16841bfeac6c44dd49078d12a5594a18dba78abdfe3e097d12698c74051adb9f4b7d8a9893e9b62a216a04835e7243b7528edec3a2a8a54f9f14db607b0a2e611a78e4 +SHA3-256: 7f6162b07425a5ec070dee4142698ed731d57c2aae9f8a41f8946f2d803f58cf +SHA3-512: 4390bdc2cee3ed8e64e5783e6465607e0f62bd99fd1a87b1c83071ce1b8f81028141506164d64697b9142a4fe061f7096f37f4e85b5bf37b247f976950f8c730 +SHAKE-128: 7f4e4f6f10ed93e866e1213cc7a5e7049cdb8b89e92997689948e48f579574a28cfc37154c95a294c6c76223dcc2528f7d91a6f220fead24ecd4efac5daa98b47e14758afb2050bada8c31c99569821ccf572a03da20c8ff2447ca33ed80598821811e61007cd97232d13f23ea5790e2e91d9d951d2892fc76397b7f14fb5666868b050e119a95b1c49ace699ef0b34d31018a83cb368833f73844d776bd41246a77785c7e91ba4f86f8b38874e4eef0428b05d5007f699a1fb1786c486fcad99a844ab39ad3318c53c8fc865f2506a4407075dd55c0b523393d054765ca72381b4bc8a9d3144bef5f1288401bded3edcd53e6526414780d4936a793ddc58e10bc495537632f532d6b04d1ec30ff88e65a80aea1741fb6345c4feb055712ba7966fe88dbc4c40a59c89146457e13f3634ec1d3b58a47c37663fd285137a298073e99fddc948a68c4816af2eb09462be53d7687eb00fa77f8e971dc6d2ba4a58cbfb1564a9e49d9d7a047c0c1adaaf077682915343dfe399fd5ff868838ac239c3ef2ac46eb47477ca508be40b27a53cd8c7f2a3b4f9cab1fd131aca498c54dbc85e61c6b203030cddcbfe74db7764415e1172c2a206a26db9dd7d323d62320700267f9aa20bf44d95aa444a021d08d2658f477d357846e4e3eaaef817cb00523831d6ef7e30c255d96728f5a752d506a00024fd9543cd26ae4c46b93613f5946 +SHAKE-256: 373c1f4f8d4ea40a39226e46e8cb27ca28eed2c9509520211c7c3ffe0e6ae77bfdc3c10f3fa3e020b27fd171ddc2e6ea98e2939a980407c565265c92b120b6a807c100f35d560e1b3a564683819ef4deecf638afaf19ea4f748472e28b231b4a02fe9b68dfeec8b931d58c461153f741dfe50513c0b7bac95daf02b3bb85a94bf79f0ae35d6aff1b85a80b96596783b8e591956d161ba0fb38efd515b5e40017da800d5502460fb2f0755a203ac70053fe5477096587c5582da64afdac60a5b25e5fda154b0f50439d09592541cb7d75aad8c34a80d0c99d3868835db18ef2ae09940cb95de5e8fb5db9858968792258f44190ec88a276967fd04b46623662f0974aedc4e7d9173556ef5d5c50cbb13ce8a2b7d06400bef2899348fa136bb40159a3f40a0de1b41b44a87943df74f550416d17e08c1ae831bde3527e8d9b6d78f926aba2dcad0931529a532872121398436914546aca57c977c2ac8f0d429b0510327b4991a091499c66cd8d387a7a68f1a0fbe5d720ff8ab18691db9bf2deb7f12a187768373e933b9d8625426413d09d25db96165be394255bf3b3dcec457b48a94a8a53bdc70c31be514d302e1784d47d3784bf2098daca58b78bb30a175ea465b83a1dfeed6b2622ea66fae70e73de1c075e01cd6b3142c44d0d55346755ca3823aead2fa73bced19bf4cc08520e7473099564a337fd2768aa3eda16aabf + +Input: ea10ae25b93ca6aff7926230c0b7ada7a6642bc5bd39d133c721560afab1109553880e7c6cd1051a1b9877059dc71df622fd8c4e0e36ce63b0adf618126086cd87ee283aec6be53905b279e36bf4b7093ff87667b65949a3fce3a118d07f96d5e2aff5d00f7c2e061a0a3cd642c4756476b782fb6e75abdf9f970429c22f82c470e754ae89967310fee93fef21f46b579dcc558b495ff9a9f0f13e592c2c2afca05ad1b59089a82072030af001dd9ed78cf69cc25f2e11f0b52ac95e15a0faa2afdf0e59c01ce7b7f6391a9bcf9ea1aae15f1f4728a89caeedad0dc84804911bb09e3101cbac38232dcfc77a09261693c1ea9668eb57b05b7011e9fe6659 +SHA3-256: f49ff4f90481e06f062f4a22154a3e8a7f07567d7cb6f9b60d7efb8bf2e907e1 +SHA3-512: 64e23641d232ebfd883e75ef28a654583ebedb6000031ff9275c616cd888d01f8ae90f91313e6f74405db8633dc2f8be21122479f7c79986cab3ef24953e08ec +SHAKE-128: f62c711b81f53b8734f364945c1fab1644f3a8d099f61940d90d348072cb98431696e146265aabec37183f84546ba8fb3245b3d163e14ff68917388070ca7701e7c7e23a3c109a7b78b8159feafc0a7c57536175599c872a1c9344f0d49dd6bc9808f2086c103078223204931a97e0380c9b18f29fbf37ebec5cdf489c95ae7a1c3db010bceb8756edc090e5a1caedd8ce3770de0d7ca3b358f465986ef35247495f49d31a9b7ff70c2b04fcdd73642070befb7df4ee49687a90d619c65f2afc6cd531d45615bf81ed0cec421d7fa7ed25eb4fdf0036715fd56baa51e90c5a2ec4eef4d270cac8c5c42872629480511e298de5c4d3600f6ff556d038e8c453669ebaaccb0d2a8c7d28d61c8cbe8323020d21a789b5e64e06c3637a2a591af10c7f8ce1f4be7593018f03c275103336d6cd99f5124c12b6e72fc560f6f43d1254ec7787a41628fb731fff82099290d9a8b86468d263fc215ddbce6008bd159069fc3126701b9db7492ec6262b47f733712a88ba5edd440343cba5718c851036f5e96696f8ae2e11471b4c5c568dc1f80cd8aff995cafcaed76ed49595f135dd57d2fe23bb10440a4f26ad6f61097cade4176354c3b4a1e5dd29cbe7d8b2169cab6704f42110badd380220a1822cd921e2b88b148f083924b9a0f579f8f5ee11a2632390d0104cac6d379c905618f5def16ee5fac507756fedb618972d5d112d64 +SHAKE-256: c992070f51b6219403ef463e43d5ebcbd597f9b45d696558a743db1c985632fe1fd9c8eb8d1a19352769e3d256545936f0546a0e61f2540fbdfa90b02c9bb68e6869be0c09b16120dfd8f608fa8f003b4b519b3cc56763148df0d51c897b9a376fc31511104a90b4773470f7d64018f8e83ddc64967fe14c20a99ed886b9e63989e6384090287a8b0939a0c16ad030c6688b4c40f5ba4c8d53ab1d8e9b54773ef43d99e21bcace73a94a0f27de6ffed43f9cfb6012de532214cf56adfd315c6abc379b7f60bc67f2ed181743b042db7bc2207e68db8875a77ae5e8b739c848696d68512a03654313def86641456d0b3b7281852ea909eb1bf4eacef383e128a7963b3fa6ef56a75a0c9212cb994f821f1606b4c5010aaf26c9e15cea40082e4d1bd46e53f1a5a0d0fea1fe322d8a7a9e89afe646d5be3623c7774e6d2962bbb03642df081ef1f6776e947d399fa8446fdd48c4d2a87e2c0d441e046c8f7a27d5391b6a5d0e75d365f984c4b576ac28d7218e9b699b3a9fb77fc3d282ba6458de58306142f8013486bb9dc795b2728f502c1bb56066e3d838ec4a790e7468d0a8daf13438c9286610953d61895e23efa338054a7f90439833050012f04f637857db6332827518abec34db8fbc614d7198185009e19869abaeef4014cd3174121b8e3a77613bcb3090ff9eac5eeeebda2087bdd3db19550355e8f2b2223fd124fc + +Input: 4360c70baecdcbcfb6a94057584e0fa4f1f2185785d344065e5f0b507db3434774a04907b66f32ef5f40a06ecf9b3e976e17fb0c4e3588027d3d60e3f48f42fd25fc13ad1a4ddb8220136cd67c89a5c04dfc531d253fddc0dba1f69ce13225f13570ffe34bd6ca40f15e73bd8bbdfe61873441d967f6933a2659fb88eb4dd74c461686d026f0337d160a485e18349198d47b512a867aac6bdab019eee08f4c7dee03f64881c56af8ac3b6167e93c94cdf65fdc94e43ee4b4c689c3c0d022cf62d0705af1d8e82e76762f6b0c2cb5d87b27df52d0558b7f87b92a12c232ead1b282a5db3221b6d1003a61e2d26a60b2ec0c9cd9c07122afde1c47f31fd6793c +SHA3-256: 3c7ddf0a7615c2fdcb7528a266ea2be84d433798f8eb84e70dd018db916f091e +SHA3-512: 0f649286e8d8897b7069c72e6d47abf3f5d093e4d3c2b3653de43f825a1df62927ccd0eb283903d23e8f8a44435553e88d131c108ea663939f04bf7be4a6edc9 +SHAKE-128: d214ac64f919f0397013beefd269bc2ab3b2d0480a02e2f2f7b988d024aba052a81d5b564a858a4ca9ba4689efa57697de94a51094b9b9ef1681e9c3f4f728a4257f7f2aadbbc07fd6b8d67c633e28ebbef2fc72847a27317ea760fbdd1d82cc2c5ed88cd4613cb024f8f157ec9267d2801794b972ce93efc90608dfd73406f35a7812fce1351a17fef6f0fd884415f1f2c6d3492c4041be18e5b2459e6521892709625004a22824634e6ebcd8dbd042b78dc2b57b86f5107f07fde558a5c0f53dc83c42a7a8214561931dbdbbb315efa239de9751fbacf8c7adcaae002dbc209ef14141545b9ca1ee93044e1664e636700385e6f3dcd109c88a4b91ab090721015ed6b6d0430ff4469ccfe423e57d6b1fb02f7a1555c3fbc192c96f1bed089f480a62b0d45702bb37cc71188fe1592591f8ea2736954e353dd511d59ea06251b3c19d1db0e9516897b9116be3b30b993575a3915004aa2760af56fe69cb4f1ee3c0b9bcd872a3f7f2eabb305aeb2339e7f8436fbc82bbc215953410f3701d79893e5f0efb6ae77c7f48240e30234dfa96e373bee4f8d0c005b78122a4f17d316a695d0e98879f107fdb0041925d5ed812c598ce71d5ceef3f004856948a3723adccce4ed29c8bd12ebdf28cb86fd5498fc8d316c086f276b9163f7077c0cfaa7c3ea75944143b6e501f59fbfeee5922ff629ca601918ef6c2206d27e11945fa +SHAKE-256: 5444c7034a69919b8f03e043b4b91141c8d61106cb37b88991a5c721d9248fcf67d048e05f70b812f7e984fbdb82f4780a1623fb971fa450b977b23c0249648fb4fc9102f08d9b89b4277067cede46391d4aadb5ff81bb019edc96579fb2eb1b778914109294b5c69d8206f6255fe4966b742ac22ed3cfb9f51b201594c5a02707660226b98ff36e0322b8d6a152018b55fee2aed13647ce8fb38fad547f2776aeb1418dab99aab59ec62ce5126031054709bda2d44f9f5887f28e64692050ca7140a127cfce16ae93e3fdb1aef76d8c63c4e06bb2b262d980dde6289cb7735bf118b27f6559fafea65cfd15087ee0ca7e7718f9be93a45f1508d5b6a37aa2d1e10c340cbff858a7710300b1a116f61e94bb3dd06cd3c47a4a0f970ea2db13fe6cedd326ff9824268eb07c932b71ffab2f3362e78c6db75f2a189545f40ea779aff61f2f9ab88eddef2ef369a65a6d29adf986c5fc3b7b810c654a130583c424629245630941ec8e269e29924d63595ee01c6e55d78fa8a8de3d263aee09c351b894caaf525d3ee5eb323d1ca18344aa0187efc9579ba555f9002cad6a3dd790844f9def49dcd3777b2d27f05a52c7f51e65800e0a063e5e792160af492f787160cd1db9e26b8740459816db1de14803b3f79be6c8782b2ba131c76c96a877f175e36e412c7b19007f11fd0f0084e2d0743b19ce0b8bf2e926732a00cebff936 + +Input: e88a8bd3c73597ba608159428ad3dc5e595379e968c65450879775b013d6ea4be59163e55af894e2c3580b9187a666822c794a5947ba06e4deffab1b11fe50665b3ce6d993b5a6951d64e3d0019cb2096bb735bf1c70f75195d17509f76b81c9bce24788d7767822d6d0fd8eb19b4158e703108b77e331b81c30225e8a6fc276cc4b3574297616a0d810a3faf4d4cac185b4021cfba57b5ff20c24cd3f6cd05786fecff5eb26b2b6f75ec05183413852f07238db7a55c6c4f5ef4d4cff40dd0317e62b59470cb30845b9a509c132796625ca7a4f6b0b836f333375458b70de86525f5d633997c6a79c9d006d1ebf521eeeb73afe25107a54251b9fa7daeba654 +SHA3-256: 2900f7bd32b47390b6dcd7a1487b7ab097051ef7a8ca57b1e2c0acf5aa916c30 +SHA3-512: f570e175c9bae8cc1279e005c4023542cf1f2e8e79090405c94ebce9e3bb86365f59fa1d3d68707bdc9018988e3df4f5867e9679382f04fb4f95c3f79c138039 +SHAKE-128: 017dc84e802a7921ab5e4f25fe620f1c166afa0a0c28ed2e92ef0d98bf8118a2e3024a9c67cced51ddbf243da84dfd4c912b2bc78a2f0179c5aa16777f5049097dd93862d0491409f0bcf13b544af28778a3458fc4d748cd5a969c60d9932b0731ad808556a56162d07fa9afbc7279d8b27990ee8dfd19437da66e2de145cc1a8f78bc49e49f2460b2b80e173ace079203e84d991f39c9f2d1067f2d26072d3d538de5c5f022f18a007cce18b48d944dc8701b63ffd4ca5eced6e1dc3b7ebc33003035faa05a72bba1b20afa27d2d607619d692156e0e394edf6de120f3df7ccb38dc58e565de8220f7caf49b9983a62172a78ab31d317a2a22a53e6fcecd32e900d88af44d43ffbb7e8084e73d8afe6c7d527d706f4f8677870f92a91ace791c16405f98ac6a974b0589a377933ea8efef9b1c897191f8fff39a5c877e25b155cae39fcdc9732c32e67932e46bb11bd71942c7fb326f7e756943327645da8ad22dde91e9d397a5e3f42e0ee710c2b5b3d7d01aafffbe689e4c2e4925eb66543742a11e8e79d7fd128313bd02daba45074acc5088aa60bb5482ca57ed9af5a9b5bb40f8889edaf2a52341b965ce6793f4d87da1016c304da98dc769aace3fc7b1ccdfbb2e76c2800d42f1d9cbda1f944a183d25b8340132361620e50c848b268c015b1d43a85100f1b448308d34e647c91893a0049779bc4f3d5d05fcae3630a +SHAKE-256: d69a619cb21f01fd900efc0890fdcac0e2509ae1843a68ffc33d724e143f648989d139d5cc69cd4f753e8a5bf7c92b4a73762f1e054c4ddd3a5ce0cbb1263f63e9f835f59b33931cc7570873e332037f755a24d8d398206b3cfa007854a555d6a83006891b46b96720ee4aa1e6a8e805a2e7662a4d3f49609f05ca40e21ad8163ee2bf6ff6e317d8afff19463e999a20397b5e9ce728dc5061d79c336ce5bc4428d656c417470c388374d17aabc34c686c954c80c9c04b4d69b66b8c19e292a1cb5124cdaebb8d5e4faa05b08e4c4c0a86bd1ebb9977b57be22b1b9c50afbee96a284ac02fed354832ef77dd2f664b1669aa8d0ffe7835249331a3a1139049b609997c4258cab0dc82d88a3744213ff6d667ecb26769acedaab1098537d040ed32b37457f7540bee59fec5befdd192c7250de2fc4465dda267de48719eb9c27779d0b56972a157b95c1be15c22ef46eee607baa97035646d8ff7ad3bbe4245eee457ec74518a343d1cb45e471a0925607d12a2e6158bc8a7632d6ac6aa0c2067b1488d414f75ebaaffd6c63ba667ccd8a710bfb6172bbbd0021166c0e831cb703d574bd60f507956b1bf62cde153fb6710155ac2a304f7df20fb17983a558fd960db1fbd1485c3ff802468ba6db3d06e5244a219b72934082885f566c59b273e039dc925ec103fc04052bc0c643d94f4569322a09c6259bfb51b8eb9c7d2e1c6 + +Input: 2cac1abf6c76a7e3450fadd914e6f52a97a2de95d01bb708f9cf6b821dc642e031e38b019cadaccc92955563f9e9720f57785b3ed7d8ae80bb629abf1a83b4c69ad1f77acbed9b248bc1166bed38d5e33fd834aa32a0f9889c31e07a4d8cbbfd1c537317497b3c86006841e179685d49a5d692e9ebf0bc9fceac563b735f8cfc0a73fde96810cca92845def17ed59da35b11fdf2e0366b09e228d64b98d1b726a14c5c5806676f5d4039ea5e47004a26d862e1fdbc9bd8bec58b682b274f9819c443f72dd213acb4cd2d1e9b8305481f86e173090ef922ba2e7ff42f8c52faa97f67ef1b13f7006e92ad0b233b82ae39d9af3c01e117119edafe6a3253f4474281 +SHA3-256: 14764f8bde01e3f03004e2bae672d44ebb1d88fd722ed8b9da8952ee790bd860 +SHA3-512: 7ea1680988ff41ff8d7c0523883525bca467f139c213c9da4098f30dc4fbd558bd9a90ee4eef42c669a9bbb109d3b6d0b09abb3353e4cd9c7794f88d4e232386 +SHAKE-128: 87ce49eae21ee9843e34779b739effa4a685a599b9e1144c6b02a725e497ec2173fcf043dac731b7d15b971c471bbf69965959e164c83016594067983567042afcdc7eeef3440a6ca8412dc9e8eba1a59587879a4e47fe7ffe5d232290d990db639cd4247699137ce9dae8e531c4cb859463b92942e69c2b60efe7922ed288614e024473baf81473959d5b8b1b04b7b77b3d2c5342f43768332da54e586acc765714e6c68034d559fde7ca60eca31a39a397bc47eca2004a08059b8a8194297f40544feee115d282366bbe6ee3de859be6d98041d3d50471a0b74fd8da152af5fdf7ce100a42fb38e23a93c802009d3951cb0c97857b5ec5adac967f4f5175b84b4314e04f4e03a0a09ff0508bf19accfe2ce03abe0f4cc8a89c519a84886f574f770115010f4a6dadc63fd8bf590e4fa4e75a0aaa60d836681e1c2ac2b5e3f411a3dcca70e4c21dcb606e9d62acb0603334b2a0a619f177f20cc48f0fd4d215786e35724a84fd9af85dfa6e21f2ba41b5decf58e42d476e7eceaa5ad3c1a7455f01df614d38c1ce68dad0172b88d696aeca8748eac16b27ff4681d9d867758579a83e2df2a0ed3b17405c61e30f80cdbdc445c6e84f5738820bb99e5683e1aec5f84043854568829a6a0d65d28a0d53c398ad1ff45cdf6e7f6d5c6782c124be1eb1216189799681f154606a6d182323e94384702fa95a5fa9f84bf1e9dd8556 +SHAKE-256: 50861d074d5c375937bda7b0cfcdb63d2cfe3feb0a48fe463ac45699ae9c0dd0c843394cac4e63cae1f8fe86fcb3f8e42c69d49af6e854f91e57f7004fa1a39e05b5429b0bc219765b0d0f5105b95babf3bbb4382b1fe2e9969841150b791e02877827c9ebd833ee8050ab5098a9b7ac62f9f1b5921285dc1aa6d237c3dbea7259b972f5eba5ed6f0d399066b6eca67cbe66493cfebdb6deaed459e546554dc783d3f1c68dc5303bf2d96020b2f2db9217756ecbc53670e7b704c5717525e3890e7cd3baeb508ff3ee5a36ba2574ea7831927395cfb4680632026f7c1bf41c29b9ca3b03b983f48ada3f4a251c64304742f2a868ed0c081dcde6d227e62a6456ddfc3b13def5d4d2b9dae596c5b08ca11db82dc51c69054d78a2bc6ccff5070442127b6bed1c4799e0324f2f0272e9f50e698e73de70a7f65bd3845c6f77718853d6c095254d2f1529894f7c10582156fa7cfedf5320d4cd06423aef0a397fea5a2bec0db12cfbc3ee431614ad40a4382bd9fe98d49ea0e6bd5c2de9fc3e40e9201615b59cebedf3aa8f325f1b43d2af859ca9f3d90d09f0824eca37b8519033ed55f34407b6d5b12639818c98f1d488e917ba5c6958496db22eae39b7d32004f5afbf7bf2a32bd117c64d324b8437fc724f2c51086386972fe3769089eeaf6025fc10186425f1b56db0961d6275e09880f4b6270e8dcd210fe3040850549d03 + +Input: 372e38b1bfe43597a45b5ecfaa290b7d699112f0a7c7b6a6da75f4c6cf36e28b500a835e9ef3f1d1a37e45f1bcf2ea9458de4cf1e8241a39d5dde527fcb3bd6100f8effa6970ea6369cc07afa21a18dd21cbbfe096b1260187d062d4c7bef630fc3a0d23a485df7c244d3d20aaa9d60713e25ca30edaea1650b715de51cd6378b4d1197085c0d3563ce880c0acffcfb26ca79a3d3ee8eab4d759e3cbf2b791c096b8a222eee30e109904e1ac0e503bf81cfe1cfb6dea2bd5de9ec73746b45e39623659a02842b0e434fce12aa9f031aeaa478dab30946c4550cabd3232b0529173eb9cbcbecb261233b420fd24c0bd7c24923e14263c0cbcc392c7cbe326b6587c95 +SHA3-256: 7f372aac3ae216bcd2a4fad5ae7bc83f23c031bb5308dd5babcbede1e885a9db +SHA3-512: ae1da5eb3a351c42e8e00237374afa065a1aa5e3507b283c88c366969253b1839d28bb19ea6ef76474250f594a5ada641ac8ca4f3dc619cf304b454187aa5487 +SHAKE-128: 1435eb767d0ffde116e111741fb9af48e6e847fe8c5b95639f7f5881937c6bdf1a9483f7f32f95cee3e1cb73a8c3f0e38c81e3cc6a0e34279fda784f7bac2bbe0c1f652c5b6e9da138c4a318dbb3e02ca09fce6b394eeb4232694af4b169fe983802d75e5b2b59e6bc606cd15643a85cceaae5184af607dadc7b82374090941a9df5f4adfcaf321b7a6191871841d6a974da68f18bf8f3af265ac35579c606c619c1df502ad978f229e53dd092cc3a6e5dff9df191f3735ba493966e3c7b5a1b81af45f51e97deed96336b39f9881801ee89c0802ab5a9808598695f64d94cebc4db9e022005636dcbefc274105bda301b14056a12deceb75ed0e1c8acf9945950d205cb0c82f234829e53e96ad7cbc4dfd199fcef21ed333ab26774ac9fa83143b741569b5c664c4af4322f8fadab866d21dc4f0fb4741b45d7c4752a56832377a53c245a6857495cd396901218cc22781e72245feefe2084e77111532c1d0a2ee02a7399e77fcf3d20b68c796a650d1f3b3bde693d4e10e1f4be19dda99048fe06f41adafde18878220d74ab7cc4c4c9c1f79454340f4417d81e064f378037b9075427f53e40395cb1ca879e829b7e24bad9ab3be66a505494423f956611d7ac42969fa1196204fae1598d46dc52472a6c7efdafd948d60fbbc44ca793f0138b0351b4a14d3b410bdc9e9a32cc7f44fb3b5ac62b760e65307f8c6b303d19f9 +SHAKE-256: 6ff5891efd350de99e5fedb237a718d1d4e5d5bb2ff0b75de1bef60a91145ad9d3069b9eb2b0e0df058d5b18bd80a1f55763bd30b1fa06e4fc4147b7862427680ccdde7b45d66323dde0bd3372532d4ee08d0add32d73394dedf8e5b7be358e85fd1549c7bd68be27bd365369bacfe69c85bc7ec50f6abbcf1cc52610b715e9cfefe14e6bae138750acd176dc61da6599518e9caf530f52c4da2859b1ef2b4f08c67ebf44ccdc884fcb0bad23ce790344f1935ff9bc49441803bf2b3404c1029fd7497ac0c3ffe11307cf5c565ae218ce383128ff0318edbc96a4dd4fdd03164bd4caf43e29afb254b2e1c16850dd7511bc4b845fc2149ded1935f2e262ef3b4f4f451f3e94ab94a4c2ccd12ce50651e4f20ca854164d28cba30a9291c29d28ebb728115775e103c1403518c78167ca54c9cf9c492dea414decd1d610a605adff7fc80f34376c1dd5e71250b6150c5f961f8008c0d764f87d9b2278fc081a3390ad07766bee11c867606b5eca91aaef192c525987abfffa45c7b14d48cd5c36a6573a181c7b33412deb9327d994d604726e9cf8ae5a0708591c86e9481d95358f232a166419fb28dcfe2e94dba3efe926ac122ac423a05229aa5d0bd06b67143533457fdaffd643473ec5184d09b273eaf2480dcdf3b594ee0ba11832d69d1e003101b25ac58e58c0c592ac023228541607f213af18517ed4ab62f0de796f9ca + +Input: b64032bccc18e4778b836f9925d83f96c6e9ff00f7ea1d48a356010ebaeb1080ae628e2fccab9b0ae65fb3c096896cd8e48c9cfb1693a2410fad9e08b8757411f0a186178baead3bb25dc26cbced479d2dbc57e963258ac60106e00062ccb596a3ac38c574aace0331f5bd342194ed3422f01b7ae14ccee79a74ce8c836dd38d44602ba8bdc7172e705400ff68cb0c16daaf8613eaf45fca09f7c43a830898e24523bc72fe4bc3518083fc5239388433e9a880f1ff813491634dc024a72cfaf03921b03db8e8e24c11c4b2cd0fc8756cb61b337826619a9c55adf8ab925ea51f014ddbf968cbbc4a6bea8b278cdaad6dce2aeebdae5c3e364cea8ade2c8eb201b1ef1d +SHA3-256: 537cdd7fb96636ece72a599024deb36607b0964a47053ba68d34e7e4f4d41da7 +SHA3-512: 0f0f54f8b5e82d8cbd93bb6ed419300657cfa2bf41a5c1bf4757739df0e2371e1f69563474cb66603558fe55d5d923aa98b05f9ed48d8ac6bc1550bddba21608 +SHAKE-128: 4793ea2b020f54fd4e6d132ac229fc81934e5f615c522ee6c6815a093b6cb756fa3b945a79b8f2ed76f318e029f1e2159257c504749c84696504c0386c0f3a2a97675fc9083338d1e1ca377e1db74718f3a609f472896f83e321d7407aa675a762e7043456bf2a6c0728e2ca9e81946338b1b53ac9f6dd44c24894b6462842be2f8d892b24758ad4fcef8eef4eda27424f76e9a7ba46b4f269c703088bfd6892353dc9b6eb26ab62dd8a226c86bd2a96a5d9bd660ccea0de506c8e84ffccf797db27b22d2086926667c69eeac3051cd4b19edd1454bca98eda48208f390119d69bbd8fcc93195fcc97a1619bca3a01b18e7e56198e9fcf77ec211d45d5f97a3642c1860ff6620954f2c1edfd48ff9676364834c33d843b404e6b4c38e9d82b0c19130a54d19d701e298fbb498c2df341a5b4acfb6fece92fd77c7f19633add19f3e2abef828a91fbf19d663ca76719daa466d44bf6077fa888b7623c739d715f8ee260eff698edf2bd51058b315e68c5e7710c5ca6931e11cb7bf29fb29b8325fc60d265ab05e68597f62679e4f48757f8407f18b57f6451a1f00f49228a335301da4f939a3c26005db2a80c00068dc7db20cce1e9ce31239163c6c8125d4bd2f7a49a3cc88fd628be4f720ec80837f380a188c911f19be69a25b5dd188d0df1e21d73d0bd38c2e649d76d6806ffb633fe165691f2f64861ba5ae63fc9a73777 +SHAKE-256: 11336a7e6657409ef191555b7feafc4c09ef34ecc4155500a19809362ff0a265ce7f7fa92147bfebfbacd4aef86c80ea64c32f165759b9271dbf85b6e0dedd3d4dfcdf9ac7f060f5bbffaa06a7306608e8703b21338a386b23a556daf150112d75143804a9ac129c55f1780a228cac0d5fd522d074d362d53e4b80bcadcd045b934a8f950ffc0e9b0495a540c9ea853c69877aac60d740242be1412473d271b59e5e295816034ab133a4cb36b5a2b78cd227ef3914ceed0acbc86f8a806eb94050ea177eb280796f84c8f03a3e09cea625edd2267c8238f03937d71267e1279c7eea9aa43fe0e9b59732a26ae1ab1db2d7697fa8c30baa13774407de8a3b708c6f15d995623969ce684e2ef109e6864b53d6c0790dfffc1f7678cebe749c4afeeaf35d9419816e892479b32fca9a3c70fc0c5b5881ea35df79669683b19d64fd0cb6cdd7bc8ef2c9d1d71675bc8b5aaba6f4cd2892cc393583b26f16380abcd1e6ee3863d44b00994e459bab128b08e9940787242840c2bcbc0590da09c6bf001ec4943470b8f5bf808cf6504fddd0bd3b18b0f53c66035940dedf81ac5fe7bb472bf1448a1a6d81f89c90bab567f01c07c6d9143b20692412053f51d6c59c9f9ce1c5eafd031e061bc91d579cba76523d6eda947b31fb86dc12116b9ec0a6eb5e8e85f632e5895a3e9cb0c61be67c24ae113d23b706091dae1d1becdb4fad95 + +Input: f97714080ea30c7afbca0dc407110c2748cc16f55e8046dc98c3e0b683049141f541d223f3ba53f1bd566bc583f338625f449769f582eb705e754016f1a09397458982951ca67d55312647d0dbda6e30de43c66aba4d7d67ffcba1b9cabaae8eb853c43046c740ba6c2bec18b41fcab944c10e434e913714e3dab11a993733d85a6ea60a4c1821decd84ffe953224ef5a3f9f7e1ca46254e6b1bde25adebb6b11d564b8c3a06b22a317340380e2e7bb14682608dcb7f2a65033af4fa6e0687600bd608dc270cf6b6d5bbb70bf57f298aa833947476b68f7873363e342620ec2ac419da6d5272c0cc7ade9aeeded2837bd851d7c89c63bbfeb35a43ff9db6b86912e5f510 +SHA3-256: d32656bd369c791d043f53633885bff8ea2d12f2b6061f7fd9b5f263541527fa +SHA3-512: b63a1c499396a86b55b030de972fb6f0cd8e1aa354dd31a7d4848cd9b092576244fe5d317e2ecbbd2a5ee59a51a7623a5ae7d1d8e89be3acfe68e298e4edbc65 +SHAKE-128: cdb8e6b07a17804a36b18bffe1ebaf30359033d8fdf0ef71a16ad2b68f89a7291b6116b7e8bcad5513f1228e2543f5992ae4aa51f4fbe9534f0bccd8dad0520e9a05c7ef6cfadf8b9af7ef3f046e026a0fdc27da387c1f93d3f6e46083879ad08e550085f9b3faa74fa95aaa55499732c85952a972f102a62aff0e534de1cebbf828d357b8af0d5de0fbb6f84eeff42d7ec579a92714b7c5cf7a34486e98f24e54b2e5554718eba33ae517728f0d6cf48908a7d7bd0c4af9190f102bc6d56e3a4fd0d52e5d88f091963338f5412c07fb1df31b25646e8e0f84870744108b300cee3360ecccf657f7a8ee1d1472167aa191208c377b779947cc94847432f8c8fc1f64f5aa845ed65c132e5aca6ca5b705b15f97ea430091358a76a38249d9622c59cf3396e0b7fcbdf5687e5d8e66a4a76365bf1ce61a26cc9f6ba450876c0a608004bf5698371179d374f42eec3dc81542389070e8b78f91fe46c4192b355e6f858ae2d62a639b5c44c123d4703ebc4d2c3b0c36ba0ec7847954ef120cbc6429d561280e95b242cfb30e3bbf082c2c2ea5ca3d859a43d51194a566255a6f89301a79c285f592ffb04d163a09943c202d8bd1abbe81e6b77e90edf2c1fd3a195380d00fca26d04649e341737cdf31a0abe444258d03a632624b881de45d2fb88b3cc63b1317d61bf7bca7cfc5ccbe3b05d46e8b09876d38ce293494cbb96408c7 +SHAKE-256: dc836a3e48b065ef9f86a4ed6b6a09d975d399dbd9a195000bfb4b97c1d4f0e70251ecc69259b22303dba9d967a903085dba660efb6ec5ec925e57fb6156fbb34e89bbc6f61cf20ce3a091f8aa2541b36038e672b785b0d5db2091b42a3d9c6e211a5b9b9645245f16b3898b80da3bb441f04c3a9247c58c9af6f390dc042eb2e58830b0ffffe12b399b7c9b1d5c77ee0404c43d43be71f8dc6f586fba7aa90c0d2773b99eb4ca61baad1771c3f9984a1224e4f2974013751396f5cd9367d3fe14c2aed6bcf54ec2de36281b043c4c75819f4cd0de3991050e3c7fd546f359ea139fe1e615bd516450a6f9ba694fd2a906bb9679f872bc413a725e68552859ae56fb091734b5f5dbf9a1f30e470fd1e16c5b37767cc39c00df0dd6fb1d118ff94a84f4b66a7cd22b658149e26c4cb8c71b382296776771d30118ed1d3943ac3fd6c2b6026a0eb06869d666cabf0b225117d38d470d5bac7d1fa8ac00610ae2e8983945c0c7b1db4dd9715d26a0b040a7924840b14b569f5a8093ddd4008a077f7def482f7044d4fdc505622c8c236a5accfd300756ba25a865ccd2d5c6c746b1894f4fe71190698168b39b31ba52d36598722580479f4271d37b06c1148f7c7744de0710098d2627b411e4491dd7e5c63bc06851187711cb1a298710d1a993e42e21c6d791c4cdd298635aa3b78576e5fe80fa9f11303f7560a1b3ee104755fb + +Input: 860b94ae766975e4e2021bf79d312862f657a91b718a2a73e3131d289a0264f5c0c781c0d49268f91d65301e558f5d90af55e2b4f1f9dc6cc9aeb2dafd7c1b576a5352816540350a2ddce7c7486c2cfbd55a37846711d91a3e341638f535593fc50aa4543df7d12dbcdd5fb2ce31a829ff66c11096ad9e43bc32700f7d3bebbb100c41ea38bc9d729d0717fa09f23b1a37867cd1a50ebca36947d552f3e1c0a9e4cf56989b46866336727ce1bbe7ad206e49157bfeaa8a45cf0df032bbe2fb3a6dc43381dd8f70a0b700fae4472252642610f5765ca864474d6211081446946e57244d25ea4287622d0fe698fb3a2d26093d333a59dc2e05ca827c7342e565232dc2b0f677 +SHA3-256: 679d204c34d48a235f50173336b3c04529128927cf736579c9e66495a103d666 +SHA3-512: b51b8977882e708b58a655afbaefdca9426d9d2d080490b79b7863e2c9c48cb362d63f3624d38371e381658d04b6351d08a67139431961a277044cf3c19508d4 +SHAKE-128: c27b9a9c98f3cb2117aea392026cdd78cd77ce56912b474a6eb963703112f2f8d3fdaba277952c9bea4aa834d2b3489b8bec81149035c3b87e4ee11b3b99fb9d251acb079ecd306005140a5f3bb393f364be252e717e6b7c3191d0e550d6c255b037f42bd2bc8036786a5977ef53058dacc14ce83938d07259dbc6c585f80a69de5b4f0ced20f17d1f0d8fe5715c2192afaf5be37809dd456f8c47bc8cc7de9d62779404a047bac8dc60beb7f5c09a53de5e623c5bc124a77e64eec1d6309a444f72e4d662bfd2f82c47f88514ae8a8d7ce9d78eba16b48256bcb9b07700458e48c0d35fc4b864c5f2871ff2f7242c63db0f8c4a58ff2314b49b5a0c68e3a868b4d3011aa2c0f46858a8f78b3e5e9c6cb24582f74949884f92c72afc4895e5c05982d067150268ebf01a9905bf7ae373cad050eaf89f462c790ef13bc80fc622a3245493f5fb09dddd3fab9ccf8bbbfe4d61dacb23b67b8c92715d0971dcaf885604de100ff3af5ba4d204576e784c57c423e434d2e5e26f30e14e9d456cd74d26083c37382249ca363e4a496152db430de29c873b8ef8cb267e80eb5ad09645732dededde8f261f68fb6ddbe6a5d212051bcfeb75c116e15accbec86528977ffcc629d4f388d69ccb1e5b24021d2530b983c0290f18223afe8426a039906165933121d39bcda9cd1aef578b5ee0d9611f7be2ce2f6afe260f7986c1a7a9814d +SHAKE-256: 8b0cef8360d30689d77bc874e903ad2be47a6dae4f51bf0efecb41eaf44c48fcb2977c3ba7867358685d57bd3858ef2acf760e73a5e04b306ff1b8a80030985d4ec5725e9ab55b8d75d5877c6b882b2f8552a5a2eecdad5d1ffe5486777870a902c57b3b3d6de658c439d5368aaaec49d774ffd9e139caacdda9c99cfbf6ba12739a0cedf02650de2baa9268e818767e47c8b9d6aaddcc4e207d7cfb5dd1365c0aede37f9239790175126261a6bac7b149ceb64e02c3f96011e2330d37ffd2c6a767d548b7f6e5aa6c10e2c5d8422ce3afff13fede3986e61f764dd986ec884b1cfa68d34ecd727c8d9ce04c809b559f94c3db19ce3df274903ad8e5d4c8e23c25d2fd42f6a6a5882bf6b915805566e61e2ec786242add8876ef081cd58ea732e3cd9d94815527c099708826114a8976e65ac5f6a009780b926bd937d950968a5052f351a0913a21e6bfebc65e6e62f7b97059b787a5150a19569c30ae6125ccfd2f21178e6cbef9f8244fed1aa8697edd104a8e0fd9340915ca0c67b2d001533858b384da324fcc711c558dead233b02ceadf4a9e8b8d6d1fc9da00904123db64c667faf8864edfed0dbdf1452fd471dc17ef5866097c7630ad1aa1be680a9aa722e2ab42d7be2b8cecb4a89009486d2ac6164068797b2369e593653284216911dbf270e1adaca7e9104f6bba02e9d79f932f1cb666c395866c8bd2666deb78 + +Input: ecc4fca85d6ae5f6bdbe2e411f0964fb143209726445ef2df21ab4b0644abe4a6d6bfbcaa765b547f70fd5c370706711df64243232e63a680c9176034d1375988e0c139df06c1a4d1174e36c6c9f6e837bbd4903683d41e298645c88d6c406619514736d73d8fba7f171780aaafb5c1f6d6340fdb341a8fa15afb95da511c88c63622628b373c882f45fb7ec8c5d0640bfdd609ef6f0fe2769656c07b289e22cca6326879742fe68ef6b781f1aef435a805f2a4912810d57803c4bb78d239e82ef52def50a86605185a85c668c533095254d7c156dd32a6c7d40b440df46afb30a395aa60ac634a18264f742c194006defa4bba52321d28b28527817d2baccc3dee13db0806e +SHA3-256: 6e624080602612de7a5802939448416871eb39399beedf01998d696c38af16a9 +SHA3-512: 404190b936d6ab530f63a61c5dcce09990134c0f5cb89dbea7e2b5775da0170f686e7928b4c77843f6a1a015d5b228015c95ea41c539d61b7b8069ed745a88a6 +SHAKE-128: 99a1fbb0b208f1db63ccf3b312a74f472592424f35dad8af2384e47ef2763639bcb2fd692f5857598b36f6d5df8325a066a3998e444a45123d0c740823dbc987c1573c62a5aad1a8724d248a1cea893e6b70929b23c7d1c1089ec9a6af13264f9bc921c274ec2183a9c5f564ee0fe36b6fdfa6760d06659e54d1f07c58c50b746ecfdfd26de12d590f5c34326362c79909d09a21765df6d1bb1b5fd8924031f9035bbaec88a29c446fc148b2bf0949c425b69d565333577343aef2854399e48d7dd97897bbd8173dc30d4e630a2c6e7b5d12df5cef1909301b9744692898431ae7d4b8c1f65d7cb771614e9e12e392e50dd9e41f730f271bcdf5918e487ed6a2630e0fce0cb68943f63621f254e7d8e901fc75ded54d92616161cc4dc24520f38bb9fac314d99ff6577c8b979388d197ed5c9b2989cb9108cd4159c12007c10a11787008e0e25d51fcd1f5712f875079c7a03af3593b97e7b919cb7f63102a9fb47bd3959a182041a97b4ff6a08d4632060ae6a3497c537af27527bf82797d42e8f4bfc995de5035c2583b1c8aa9ee1ad6d17fae1a8e9962b2cd12a05d0f8613ac710abe6f369ae15f7aa1db66acb4f6f22dda5076fcaac7f90a9b9b9f33b75a412974df359af73a7534004f2e9e3b1f9702cd96931b144f93b93efdacea9f8d13b09a1b982d74e2f4e720e18fafe3681b7934dd26a2000d0ac1eb5f7250f437 +SHAKE-256: d43c9b6aacff1221a97e3a6a12ef2de2c03cd827385ddb0eaff3278c659f5d45f57d68a7f37cf9d3d6d0037a3814ff1b58479141636a15fa58be794047ad0ce1266d2f3028f979384ad14dc2c2d54ff37fed0c6381cd31d4330f3f1aea362e8ddebb376d1adf1d3d73ba772a594d21b4e960d103e6dc2b36b468855c683db0a2762b1daf73f0a82920eeeaff3af4acdec41f6b131b7376ce432b2227b351e4673d2563ddde8d778897dc25f9bd1eed68c407f913168e0853c22a3e3aef3a64a58b34119b0d847d76e88df6efc530884e143b97ed4cc0d2f725760b9226223008c53aebfc7f865a88da69be3b7f52d1ddc914908e54cb19e41064fbe6a41f46900eb2545de6e88b44ecc62fc87fe6e8aa1a9fb927c5053d73b7489da48672ae0cdbc0c8d741881c3b477937d9f7260028a23cc2db5f5363dae3410f2d337a60044e17a40689fde2ea30d0e67faaed2b50b402f05fb09c4287b799d0b002e2108ff7909900fc7ff141a0c67b20110f77822ffe5d433d60fdeff5a12350b346696dd482757090b106d2d2d8394ea74031b95275a333773d1c7081a99f2c6e58c986412921a44742ebba8983425155e46c5e0ff13485743b12d1b54772b177a21f5a63b0478d8a3fedf314e939ec97e322aa34f62f85d5ed6006d4fcc0adc94e5ab918f593d5e585636db3e65e65f579355fa87758f672b4c381e1d8149cd314bc45 + +Input: ea3abd219495e92ccf6cd69d87b07c67413510c19ec7f2f73f758db43481889160d66abf22b4640fb3d2b992bba945e7da20cc40e8f3f91de66327403a7d6af2c2e3db5f79c4918e9b7c48d772733ab0df94720b03233b367911df37ac43d63289891db8493a2f60ae69de9ecb226a58e3c9c2b2d433b7712ad4c17f0907f1fd1cb22cd8f961c6b7e82df2ae015226f1ef618958b789904f6e99e1c4e783ef3dd836cf6bece8f1a36fcdd0033716ff4049a6b457157eab9dfdae074724978f2a8af40ecafe399c4ddc7a2a9f3301cf554d5cff2e84af074c8c4e4a0508139a6fc71ce5124f375127abb21de9bbe9ca795a8fe5e1df19170d5b049359a4be663c53c31f17809104 +SHA3-256: dddbe45be0dea9e93e5c1a17730146786ac63fe32fc89dbf90cf18ad3e88ce06 +SHA3-512: cd985dadf6842700b8e504e021e4f366d2ae71afdd60b0f1660d6602b47450dfcc517d666c8f438f1e4292fe8449dec3ec46e28a99a315782535d0ce38c3d47e +SHAKE-128: 022b80a570ba8be5d3693c8487a318083b5fd44c775e74172dcaa3d9db38dc86c7f7d2bac24adceb87fb831ef61b1ba93cdd1699807d3a923d937108acfa42265d935804bf10707c7c543bca94d98854f8ad05edaa8a5bbfa5562ddba3cd41ba6f57ab438d4c5967bbd8bd0ec0152c36d8bd0d40d3c9488bc9a77f9b928d3fa560f7abc8be7b7d48a53df8da0157ed51ce13727eb2f0de1c2093819eedba9f85b2289833ce7f737dff0093aab8cdf5c79d77a526693419a5bb431d60bcbadb833379ec1c9c9b10f1e4027bf479f128069e5f1c2e048e773e458039f9091051eb9347cf89b2adb7d965fcd9d433dc7e19c8d559f3c61502d98d9b211fcbb045d536892918b9a535765420dc554ee6e009d3fc0783a24d22fd65cba8805f9bf42572efc871f7051a2f3e576dd46bda87a126bc50b1a2030ccb1238290f259a9e52227c931ceb3c30402e330a12972da384f0505955d30d10714d35d59e2eb6590911ac9e9b4d42519ccc253cb15b445547f6112d734f2c3d7bbc4d95472fda503d84bd3951b2b22943ca7a5b0ccddc67d79dbfcda61a3c2e7636c333d50a40ca0ddc3358f896700b352a4c0003c2a4c17a13ebe9d6c517cc38e40b6743f8a98b0a4e4af51117d3a38b727505d688098e95a45cfb6eab878569d2b5e0a64670f1b580b6bed3cee9d59ececd65ac51838b79d7bcc1f9edd61d70939eb68609ce5b97 +SHAKE-256: 6d5ace1d431e06c8b9881fe5da99ecf08233bbaf7b5e6574b481eaa0c95906b4c346869e2f824854fa1ac7904dbe9d29833188acc4d1f6417f2431ee66b8523f7ab6f4f6f635af061aa95425a04abb43b930d28afe5231675fdc8d30c904e30ee7e747987e033d0d47babd6ffd628ec3f2475003428e31db37ea528fa530ebeb261fdb97bd5bc3f04d4e26a96b675849045a48189314edbfecc3f7fff325c0cb8fa11a9a530b85eabffcc4c1673e5e0ed31e27c1ba3a58a2c6666cd8321d9e59014d6551d381da4ffd6f04d26fd950cb9500bebd5cc89408cbe6a2386e79906875b7f9006acc7e655d5b5b8057e7df427ad467deb56264d40e1962aa1389cb2362efa2027930767fa02686aaac08b69a3d98a88673da188929ab2dfcc0601ecf77e04043e7bfc5f453a3ed2b304740e36fbad84b8969242bcbf8a155a68afba2a72d1266f8f4c42f248d3cf91b3235c6831adc473529c6d7a06d097bfa05ed38237bf896bafe060a089a4583429f7147c12e6b5952cfff3256c332310ac520bf78603efadd5bdadcd2497d30ac2b2891d10843840881a7a0d4aded692710ac242e20b8ab4e031113654d0cde8dd3fdd97902fba1017d9ed0adb5a34439830968e9af7c199af54358aabe0ce99ee58de9194a1f2d2bb2c1a8c6ecdcae0ea14874702e79b13dd26feb9ecd4a94624876b7c2bf0edc30ba1fda8c4889637d870138 + +Input: 3e0453d46201d0530ecd4132f04d72e17976bbd7cb28c4f95fb59d5160fbe71d9ca146631f230d0193e5ad11214d5a1e806ea19afa74fa42b9991b3dab38c64e30cc91bb2ff14fcfc8d84038534f3b33496dac0001e673ca73b6d99de69734ccbde5ce13ac201084948db5b4aea01bd835067c4a6cf08ed6611a6c97180eda5244f738d2ca18ed3e10c2ca2895127301666e53928b68a521f336dc0709433cca9f471f3b82a1a72f6ebde86f057d1dedcb8d67ff334bed59b320858dc3fa9e95f7abb18a50eec6d8b1a20dd1369b9d3ba969163bf4879f3933ad185e687c1fb004c5532ebf8b8375ccba949dadc6796ae5fb0c7b97672d32bb64954d46840604cd76294138421868 +SHA3-256: 8af8afd04bbde31fca8c2f0a885a463363d50f578a4f589cc91997b4b2755d74 +SHA3-512: 863f1dcefe4aebaf65bce38a8f2b67ce41ae6ed391a0860c952b458311b64346d944810d7bf694c577ad888e21ef5c1e5ea122030a465b129fc5597fb8054bda +SHAKE-128: 2b44dbbeda1344b28fb2929c2dff8972283ea15c3f4428fbc3b8c4b6acd30d6e1a3f50701ed132cd111f51e5e7816919708505366b2065cc5e509bffe42c4b6b7de4878c5a897f08b3092ee754a537eb2874ea16b881e7202192b42b95a09299bdd49c0a63d711341cbecab39b76a68e35e1f4d15499be370ef46fa9957be5c5dae88ac05f5652140c77ba6303767834c02eed401868fafc5dee7544bd60bd2615e415668100c84d0f65d69adeafc9f360793eb5d959091b750f76ff678ba35e1fe3198ad06bdb055744fbf60070c9da32022c939a43b104b19af6e80909500f34bbeef18ade683b0eb84ffa683728cc9886fc91eb8ec9049aea84944f4044eba4957eddad1ce201e5df78259a987aa74df0dd56166bf0115d15619d5fbbaf1a220372d031fed4d03de366d5b27d5d123ef90c7af9fb7d1e93a52fed8bb841da570ddd6578786e8248b02139f5a7675b82ccd6e7769991264e1d3daa82e7e294746bdb7dcb9518119a6312efedf51ca1eab17053eb4bdb90de326768449ec4891a87c3cbf4fd82a5b8bb940c108fbf66e874627e1ab9d275aa76c77f294a23f1eb3dabf9e9ab0a4c9f5024eb745845a5a824bfc534db97da4633f6f5445157a720d10c505d23c54c35c268c3e4453e12dad27d6428dfeedbe8825805359004a83fc972cf5e6a38e3c29002e747f65c77640f1480ea1c04af6dd05ae0c863d2b2 +SHAKE-256: 299cb0887b20324eb9ce6589899d81e4f4086f73c563d9a4eae5bc4f05202678b970b3916c65dc2f04f8e47dd5fe33c0c4395b1c15a92b1ebd3dc06a7c8117cbaf05a3d609a368c82e9128ea571c2db826b1e36038179923e7358cebdde430d58f3a43b54b881ae3da85480ef55f224ac35a848fda0b6224d51cb776cfa69235cf8a7f712897e51199e910d46fe32acb339b5d3f6fe1e9649ea235be8531d612129f2b9323d8bb775484aa7e312d6cbce781e0f183686e0df3477846ed5bf3e0d5a16626080f7152896a33ba935bc6142090c225cd325078c0e3a7d13ecbbe28434068a1b24336a7c80e12ed0080b9377d36a08d9f117ad1f38ca56e0aedf14b7f22f4154e6fb7e6d0f4898dc54e6deb6392f889b716effb663c8abe4b2abcd4139509060201901a2ff35f42de38942f5ea7f70dd39eea8a641afd3fc678d3204c594f17c411ea80847f2d3493fc7afc382b3c89f466e6e7b75b6fee482d62be054811babc56a8e524f144c48a50f3ffd6437644d621e7850946a2ec2ac5b7d71b91c6e96b498186c80e2e0535adc4793d493f7ae857747174777552604adb4246a1d0f7a52cf2174a0ab8bebc37ae12eee67384c72ec6b6bdeaf6c85f850029e4165111c572792abcd5f1711f8b219c9dcbf4679af2d25cebb1ac3418c15a3521eee3c221f6b58e15af00079347d00ba1bea06674f5b2a0d99848d60fdb6c3d + +Input: 2280b52c769b3b0f66f7c8f8f8a042a2939ab120bfe2cb64b7e92c39683acbaa3089e3969e508696690400f2bfe874755e6a93c7d0896316949503c6b91524b4234f77ff24091aa72951bf087684678894417acc0f04be79f891ae73aa2b709dd95ca11897d420a0d3ca403522798f27a5ba246c5747293ece752fd360a86a0df0cefc0c51e9b4af95fdd939eb6d1fe0d1792a40f8d6fe5312d6e46bb388521966b44e3d93adb43abac0b4c8b572413bce1bad3e6c75aa61828d479ebd8bc75a1de0fc9107eb83f0904274a2ec9cc08310335efa6f27b65c9252997a5fba04b309bee9e186282869594cdd927cb93ad64b9bf896287465e0cf08ed909383423823d11aa9fb496c7399 +SHA3-256: 50b238c33b1ed91bdc92d23e564a1fa387f04f17debe51ddb9f28d94f09906ec +SHA3-512: 11042e74d21db4fa61e08ca79db16192bce7c8007f9ceba467ccc423d76939e2913f34ae4d074823014e6e8e078424a5f677f32e6e238f0440c68fd5f8b2b757 +SHAKE-128: 1880e87365c4f6029cb8aaa52013e6b64f86fcdfc351e1ec36fa11ff596633a36332768424f40a43c431945664fb8ec2aa70b611196edbb8af2051d3421b65a24d9cc4e2a113cc5edc4bc117e6bcdc6ef52ed2e9fc59faaad035a229c2084ff8f1f8ee794f7e951b12bbd2068194e37837da43ee7779d46fd8cf1aaf1ca9fce433e053a469dd1a67f29bc0e595b8d2064717d2a4342a1b4528fa20d28ff742c78379432f0fcea52e8d8761f4098ea9aa14642538d2afa42645da5186a49267516437ce3e63710c54771832986b2575792478c9b715d6e98baab0bddbd9ff6c029a16f695d4bed7b9c46ea3169df7cc4e664020d69bead36ecce65b8f0669caee20f1182c1278f74d99728c8b9a632702bc3abbfa3709b3222a8ac041425c70f8b2473389cdfd3c25b02438cadf78a25205b890b3b85f76bd12f2b7e690f07bd57b0759f98e78e597242b18df95077556dbc0d86a88dc95fc079ddc30e9d5648af62edb88498764edc0fa882ad49fb1b6da2a3fa27275626a50a88378d835d1399e63f1f9818a3e03d3e4b6462ec4f8e39b242267fb26f05ebbaae97f32a732348d8fc2c685730b1ec9cc91d59be4aab6536bd07a15959c6dac2d56284974506b6be8d5608dc5f89bec743137a0dcde1a70b89120b0efcf94a75e3e9d7bbfd2c2cdcee2127b0ebfff7d4c9663e78215cb4d25b3bdec6a7b808f8a2d2ac20fe085 +SHAKE-256: 6581507caaf26debb329f9f912f82058d9fd2f94e86c380c466e135205477cc20eedbe601fafe327ed55485f806b8f68ea34e21fb10bfe90a91ecc3186e77838fc7b2a084e200c99f455b022b5c0f281d8216d72f0b52837f848745747db8dd5b6b75357d2a63bbdae03831897c624ca3fe4fecf774bf6e125067cbbdea226c6f96b3c08d9a5a45ee74e2c0a746a61e236deac32c0a3b1ac4c343cbbcf89b3721f28c153afd36209d43f3f4770c7d7fd619abdaaa0674f695a7ac209bae34851fc1caa5248c13b89b1266ed08ad39859613e1c072b5d2fcbec8e95e3e9f2cd0df7cce8fef2bb75b38fe6d498c0963188ca56c2ecd8c60ac49e0fa935fa07c19710a532bf8f869fe97115dd5c04dfdcb8594d20f2ab3e050e673e354a6f4b97a835590e3367c9c07b63c88a3ea86135982269f660bb7dc9a612be6defbdd5e115b711af1e17ddd70aadbe346f31585233a5473d46bbdd0cb5a77af5e499989ee4b479ac30801836b1e00f43f8929245d42cfe2ab8feb54fdb9b643187fc20b2f4b7fb1c077737ef914bd251956d767eab53424c0b0337582ba36b5d3801b7953db65251a6624aaf1cd8e8bf46c3bb4dac37acaf9acbb4da1a047011e732073ec56ce360de3e62ce605d868e8469c79f8e97e05e0edd699a9c16255c0628129774a8678c724fa8781bdb91a8d628d571772001f5a60d3d95b2f8afd2c4a97b1291 + +Input: db13b7a10e784182cf192c757990c3dc2e53eb4bf9e4c62dae0eaf851ce12b2c119a6df26295941fade477eaecc72d3a927704db69d44eacc6d057c6998d35d7ce53b03e4bffe6d7d025c018b8116fc510da09fdae3a3e25fa51f8e7e9fb370e4d2a01fec526b225004888596fa12244b02c945a529b21633993de3ec646fa8091c156f866f2a5e3c2449c0cfb3b8d6821ad7edb283d1a71910cd53ffeee57a3d9421b0ca8e45959ee63a38efd823d41d92c937945b275027038630484845e85f674dd05714832459824d2ba821bb6ab1851cacab5531c18ae324e9d5f57185048ee18422713eacdb63f5174f3882fedef967212b514c15b23514e1369340142465bde575a843dc234f6 +SHA3-256: c76dcaeeff89e3ccd39e92b58e50de06fd760147e130ce01a8bb8da74066a06b +SHA3-512: 55b31d8af2131a459465339d2f03b07ce47afd131df616c8391189b4f2545d8143339d07671e8f53895fada7d17dcb55ac74d2c97912676298609f0515689042 +SHAKE-128: f92622f229e5025c85589e5cea3d1a78d228c75b6169e6c667e3960dd6a15c5b392e4c73ea31d036d4df99401f30697310373392cc6777f846bab94f80f241190be0f24536ae9f0a02d2ce57b9b4528975a156c03c795556a9febf69ea295fb3ebe06cb1ec9276bc601b367dc79de47c12c1720530adb85e2cba055920fcee3c48fdf28ca3bdec7b3649df218437a6ee32ed76bcbbdaba19d0c6b84c0b860d78bc12313ef1382c5afec61baee174cbc0870b0707f1344a5d314fd109da6d287ec1f82e91a02e6e1a33169ae923ed902d9b08e2a77fff309cf0d32b1f79169d8983f9bb8193071d526f7c35ad0f73b5a3e5d5a5b271e1139363865b95a40544aff37878662eded46ff036492a4961add068565ec8bc218255074f199e629897498a8fbe941df1e7d6ba8331192dfd37b3f85716640f8bb253987854050a558f75eaf9f5643216d2a76dc328a4ccbfbffb9a92f62bb48b273288b7036853aa7f81f28832efaadb1932d64d62fa3a9db48f387c80afb634f6e8710232039edb469fd877dcb8d9eff8ff59e7f9bd15baebdfc09cd6a1ab0dbd2d2ef6b660b3d814bead3eb1b5e35c8d33484b8bc2d38994fe44503020ab738c6de2f971d8ccff05bd6e77de9c71531fd616ed526118a56f54f9c7b70ab01ef884c8ecf347b6e3ad23b8852bc778e3cdfc081777f86eaae791a8ca6d4276c586659bed8f83d32a8097 +SHAKE-256: b6b95881fc769f27799517de1c29137654c1b5ba60466789fffb3299a9a8f2f66de8908dd5d0891c70a3355093e729f30acbeec68a6fcd3cb00c63e3cc5168dbd56ddc88c88fb9315670cbf44a3d4233f2230d83971537288759a9b270059250ade14b776214d01bb0bc2552bd08913e1f9b038276660110a66dcffc77f8af37943f96c5423654ec48a069bca0519827e54be4750fafa618d6a61dcaabe320eb3daa19651f4785b6b572c4eabed1bc4898953aa1ad9e7a61dd19da6c89f7e5231be40b011a9f160aaa64404eaaef358f1ae0745f3f5d67b7424ca9017b6cf278b2872dc2326f5d321a541654260b72713ea393d2155f57217d4781923da3436f05afb18fdb90e182011c36bdbb0af600e613057e6412083cd357b5036b76169084c61dc6112a28c781b3f60d8e283cc92e4603d86d96f3f146ccd2b93b5a03ed851cb3a2b13f9c8fed06068046c131fe4acc558397860a55f06e20c735ad1cff57a8ab59a2e4bee7f69e1b7312345b5a0431b5ac8aff3b54b34ced32798c9e2fcce3ac3f245b1242983d83c4b7e8a7b80b662538c4aff286c691244ffda9726b6e524eaa32705d75cb7b863040fa47316dfdf84609f062512d3104f3eb42af2d6cc2d78162deb1dab8954716d42fe98a488af0bc94645403ac0c88b34eb8612396d1e3b5a9ac0fd328a8ccb7c43378d79615ddd3333db6ff129b31e49ab09942 + +Input: 1f8c348b67021f6fcde33f05cfc9987dcee56a056783cdc2a3025952930ac0c6a649240059928dfda0f4fb1db368c41f65e3c191207ecd1d550506b808d996f8729deffe56904c7b6b14fad2bb48d575e7ff847ba7522d160d009c15021f891275351e4326171ac6ca83794438515de6788f99ef3120ffdd0fe4d0d11a492efa59a1cabf6a3250702ee2af51a22707d995743eca05f70090f2ca4e0fcc4b875a9af8b594ad1d19a1a7982732ae6d01233941d87c9725c122e02e6b83a5c12422ba688c285eacf8fad6225d63bd2ef2b12be2b3f353b62adc090f311f241ec2cb5f62e8ba473ad15369833cec5bfa8f52e0951e36a7bbb3e9d7fd6edaac76d1e7fe84811449c5427e5d39aa +SHA3-256: fe373d6d0ac1567978d60afd6f91e756e6ef18b86c742ca9f174e058db5485be +SHA3-512: 748ede4afd133aabc2b2c3e171b4a9adca376c94aa153c4551a047690f6392bf6b82eaf7384e46286556fa1453e683377013b4bb5a001478df8ad94f566a2044 +SHAKE-128: 0b9e23ae52fe34da3012a88592243463adbbb76026cd202f7a2ca2c54cccc81b97a844c2c9accdb9d6e748c12ec3ad1333c1952062ad9c1dceb590ce2afd0a943a1f08555103c38a45df28c94162319bd40605e5aa8a71c47d00731ae12f3b493c635cdacfe96073f09355d0967c727a309efcb1a1baac208ff48b49fcb65aa3815fd9b02383d3f52eea0f211b2a34f1f45368a7ce63a597d84f82113fec18648f6715c49f20cc3ad8e831d850c3e004e50c08760d6ba05f0f0cd2dcf5aef3a0e58b2b340484ff7fab486017adb000f3624338f5bd0f7be7718d24fe66de45a19c51b39e571cf7de8cc2b4f7bd739d1f94a1f01d71c588c093cec21cc8eae0bb5aa1ed76d662e3776b5e19f6ba1aa2fc7b3a9fd5a781c4ef722394164a92c14dae810f4d6304c7e4712b9d2222795b1237f3e00fab25139d9b1a53f89f7b216d1c008e350f23b5033fc1b8517cf5d0e79e94329b42ca1013041fd380d6f9d38025c419cb9b843f8b78f3637d3a42cc8be8f9fed94dc2af0df35da7a7f36d7ac0120743273812c0f2c41b5f25808309cffe6cf8a92d63ae89a93d8c184c96833023efc041dc0f98dc250469af37cb5ef39074a171445f2fe9ff7c91f4bc22e12a86cfdae248d146c0d9ca09cebd77f7b8d02e2a0bed8a1c7b44fcd1590cc3da849202be31fbe28e4719ea9ccefc5b7350fe3b2a2c0b9b3b0a40f9660a28be5e1f +SHAKE-256: 70d864b0dc5e18a1cbe34ac9f2c15f369a05b8bc49d58453fd85c01f294a662872893e0512650aeacf61d22389f6b02d789369a47f7c097bfbdfcdf66710fde6530bd2771f8e742bca8db9acd9448413a0192317c49013bf7cc80ae457c482085a7cf73fa6d0d5621897b7940de8b7f847c189284db259a8dc7c1b07bbdaf2af3f8040266e369dc7b9c10edceefddff0c9d99e97c227b95297b80e3860f76bfb71956dcf93daf939a7102107883674fafb30cadfb0e42af83e834ff688421e867bb835ea79952235beb9ee75259b1e0db81751cfc728229a101e0a1aa51a1957f5682065c49754ed91865182f680864f063f7949fe64f2ddb3ae30a7c86e0e5ff7166860469de45b67e11e623c6206e650a10314da5ce52fa9185f1953dd3f05f73cc1b211910ba35556938b3e18287e940358197e3803f1c20045c5d55509fa2f4a886e70c298cb6b0b38589906b51c86d82d5e91943ac14b99e36c621097333fe584956f6a3d532b8f252087ac676918b57851a3f81ebe5f008443a8faab5912c8e1005dbce9196bc14ea90707cc50dba0af06323b39633edcc48fd5c4668afe2c65609a98fbaf7ad4a4e952952227280eb7842646e8c71ff5a6867d9aa2ca56958a793dcc9742923b2fed6fc9bccaa23a58509b6b0d408d0695fc7266cb3b613ebd6d2e3fa84ee0452f59cb8ee8c76caa0ad8fd282060bebd81d6c2ff008a + +Input: 729d8fc64fe6db8e048f6a37bfb54f5f069996a36a420e5f99cd9fdec2413391c44d780d65456bc74b3d40e20ccf8e8c6bd3b59074585ecdad26a824d2bc787b09ad0a44f06e54397f98e623da375cb8de601b9b5c6e9c035f2e8852ff1932daa35b4c78f9eb1c2ec1d6f289ea53c62878ee46ea5d89d71b97110b8efced657ac3a673bd4d1d1dee6de938d18591774d34bb6a689ba15a920869ba591301fce0b3764f78262c54df9b8304a7044fdda881fc63c652e484995635f214ac3067e1d42c4e1c81d899423405dc3e194b3c4cf2c0581984a72886d897bbe0a7cd1336b0acd355faa84f1aebbf19adbfe0e50141a779f1a610e773188caee1fef93f5fef77b62ae49b6a0c2e391399 +SHA3-256: b88e3a3413adf80069c982e91a8d1dc79aa60e0360bc7800797ba4cd9ad5d161 +SHA3-512: 41dd08a05fa731ca2b9c931ce8dc1e3733975bf8ecf907a80f0881d18063f19daa846c9d304ccae6f83f89f255f1dc0f757a62f2e81172ed91673757f85f0db9 +SHAKE-128: 1271c691206fa9b251e30079c7ee149158b8afdede5630bf2bb223a306d7b32f98e118139859bd223622806c1a450ed368bc7d2ba95716324f1e09c27526c7591b42e94eb79d8d8555b94bb5b6260d0c3faadaff1ba771ad707b66603180e3133e92d576c8d8d09f163502ced3835b761f798bfecbacd0cc9f890dbe59107fda82c4addb5230d24ec6c1bc8a8cc5cdb9b21e8f7551b4e026ef5e24469399796abba0e08990ed466ea3efc2ead7b57a2221dbac3b431b7c8ef8332c4c240497b48fd845188b63d0558a6054890fca64195e8808628345ea0dd6244094780230af73941256ceb18b29b006ae00e3e40be33d50c6e506773e823146bf7c30d3568747ec2cd3744249b49e701c6d44fb4a8302842c92bdb233770b063edeb383af3c6386b49233d7934d55aba009e57a88bf18aa1070c4f13c076429b9e186ab0ec76bd60dbf7503f8684b50c7bf20ad0c4a62dffacc57fce7a6f80ca06e97cf85a8ca3e5704fa18d7375a3c717d50a014d1d7db39c6820c2d33a59688c4458db99a8b518e4f3b464d28901fedb51a98d92cac850573f2a4db4366a8d28ed68eed5d19aad1f8c74c411f7877804941db9e9cf21945732e131855625ec63d00f810900a36315a21e83c6aeb507530ef093945d903e012c16a60f81c5ef6eb2e2660b85553dc540e56e35c75f29cae6cecd034126f78f32d1f81394ddcc88417aba3a7 +SHAKE-256: 4921d30144351ba6c0756c47ea7212aa0acb53d8dec565b208cbe24c22c702bb810b9eef414f2f9e8b89b415c039008130ca97e4df3908a0bc94ca76bbd25804e19462f77783d6386ff5f22388c7ba6df626c87b9318681860cf01c35390d86134f8e99cdf9d5773dac5577f9d5295df194af564721e6309b27fb1cc1ba2bd84b2782fbb7f021e13c97ec84b616f41d205260c571bb7317022d9ff37d4e164acd291ce97e8b791f4c834b8aa641378fc3a698698d98a258ef4d81d90d6b80ffc70e1d4b5d1cd9bff8c8d57a77c5f85fb244fd05a30b1d4c39898bc258cb5c113691ff20bac89826c77d6daccdd9163863fb69775b427c9f860f5934c9a4f3ce291e3881ccefdee5f8cde1c840bff04100ebcdb45149dc7a6d6474c5cda3b2987c7a9c4b2df04b5921fb9fc661a12c3eafb2bb850c02dc767288f34a12e7f7d600f8e1af4cf6aeaf430f20ffc8dd27e95a1c0499a40389b5f8314ae580d740d4ff5295bf6a354ba1625af2adc0488e381fd864ba3496be98cb1c0a9e199dceb499cf47c143f7316a130d2237011eb490186464513c20402cf8c38dfeb9b75abee7062628f8259d439cd4a2b012a1f5cb1cd7e48fbbd1dd7a27b95a1cfbeff782090fe5a68f4a7c49fa8aeae1b5bf605a9fd618a92048d6a486bcd631787a45348587bae0237433b095bbcf82cc0891b57a75504d13943fc7a80460607ae04df1d + +Input: ac5d1dd5b325cc1704539bfb4b17f085985f358909600113f5e169922e7045f9c59f6ff70fd9d4832037c39728cf2933ebb087f40516c9d1c99a83f61f2416cffcd92f6cec5f681fa61d7eb4d12ec6005b3327c9574f1f5ab79229987ae1a3acecd0e207f371a22512696ed680f4e598847be3ed32b5183277735f1c54b8a996f74cb2e943ec67ae4b57225d310c6d4cd412b54d81e3bcd4d6999668dd94aac0683519c4e53b853651953774915d519e0e3ff9c70710e888b0f358de65a1571cf7366c64c8fd782bf3d3708a64e4eae8552a7456cec1b0301533aafcc34ee0702e8535ca6d0d0c89960611bc92fb536d63836eb3ea86332597e08f51d47a311f5401bd4ac1fd37a6a65a54df9b +SHA3-256: 7693a6c5cda6c7e3c1bc7b13368664411cc13bdfe6f654d2f1816d83fe3c06c5 +SHA3-512: 8200f00e1b76f2a568b6252d64bd00dc7aa48bf434e63982074e72938588ad805078ff31509e2d210362e7603c6be1141bce80cf8c32cbd52b6f48e6f2dc37c9 +SHAKE-128: 8759aae658c0f4515e9651e4ced886d43ee9310aac44dc8a20264098be04e0431aae39818e09f4d4c631af823bd608f638e30417e8d032b2be885707c1750bf70314dc80f1bed99ace14ac691d8152885c2e63b52c3adeda7f44fc30ec03f5cb906518c205c6d1d1c2b1e3f02a765691156ccf9b9d1591491878278c51379f41434312d14a4c3503a21053e26e6e68ce3cdadd9c58fd0581bd9b3fd5d60d882e8569824be4f0b71ba7195f7e195ed0218d3e0e2efec064831312c4f7f14704af49ed969481cfbf5fdb29d03663964e5a93b8bac338f2bb061510b59bd85250247ddec693b7f910eda27f675bea89a8e6c4975eab527fac47fdd794847b98f15ec6ff71e38802171ee6bb51d684e752a018fc3b11114a99909f38755fb4b8824b7934b31aa9ff482c0862de142b1a735bde8c6fd009e2d6a6db98d2ee09835134df83d8744b0a5164ddac3e6bcddf2f0399dd08b16e91c6e24bb2bd07968cc6e3f91c8c0d668e0464dd7a57cc9b7b74cff82a87b7df53c792db353fbd6d00760b53e577584da643c7b9bc1bc4ad5f99d1e0b889b959198b47f3730e4a38b6aff25166c741d80e3e73bb876510bfcbda4b029af129338de2b31e870101b5a537fecf8021886945f88653d3563bc07461384c0b81df2ced4d67e58e62b4ce80c1071fc66a261264714c3d89a87e8f5566578c87791ed998f2d1533be06231d94e77 +SHAKE-256: 0ede8fa394fe81524fa2e05cf7a1b20a6a48c3e328c1409f2191e20dd4a1d6d9119c8548a7fc52192141c69df2f4336671e46cae068163d72d37315c00434234d2022cd27e69d2ae1ce1664e79a5d0f84477c8a03975f0de22bb013038da57113bde84e7ce292ec5ae0b7e83d0759b412d50cd0ae4f700bd0b2706b59611e67de5c05ce7611024f5fa2b822d43e380f30a22387955a4f33c675a004db855b336945ed9c7f8550529918850c481297d0207bd3cee6878a8a66f7e7ef857235785ee776bb145f564c466c133a294bb00b0fdce3e58bf877a7d940291448421547873898b85942da2fd36cdbb77f057d4c7f32eb0cd9a7198ac147e918c77de6625e64fb5acf342c76a49505db257094b5f614d5d3a2f49dadf556f267eb947125a75f488e463f6bbd2a8cf11cb9ce3b772f57db15b9ebd7e4b4f09113e8977bc0f5f7a1bf0fdf59a92f1e1380b88abdc0f81dae22c54f38a3939bcc54dff1001fefd4cbc505c816fba2d66c96fb85a60bd8fcd5779437ba68dbbed2a31ac90198bc25a78f8c6e0198623a1e68baf4a4b2a1d433590bf4218e7d065c873f8ba5f1526e22b7686f6d324d3096f8c89829151b1f9e7cf9ae377dce8df64f7fb33a53e9a17918560fa42258e3253ac4240260699a8c92682870a524a959164bde4ea8124f4cf78d4954a5b5a7d84c8c02cbbdbedb58e1cdc9455f5b5766e294b83eb42 + +Input: 51bfabadcce5073b71abb3ab9fced89b7d455ad5edc895291a018ef2a5e18b2d644f92c4b53aef2b35d2861e62ba215096e0e3ac800b9bb749db92015cb1b80877ff69b7927d4327cb3b3540595e34053d588948e362f366aec7923a7b3e8bb6869150f2c2ffb4adf97ffc0ea9f17e1d37ada168c92d1ee82e11af361b4439ff24fa2db7caa2aaac67a5ba27bf0e0677e3d55dcdd6a5bb61e804b69466a04cc335bede90b56c0b7dd4d1b126c3d32e5faf0990df1ba046fa1cdb1082f5041e9e4fc0e7c833f0fdc01322d20a2373a0036cb0b12abde86d0d3d18a1fcbd687ef19ab395eb99f22621842eb0d99a1da6e6d73ac58d128061fc1e870c048b3d94ed0f558b82e709c62a374e98b767f8 +SHA3-256: a6a4f49aa81c7a7b1a24fa2f0610056444def10ba30e015ada592698eedf5438 +SHA3-512: 30cdbacda93a4f02c2be2272fa371148b4294aae6046a11179d9a9712fd8d85c52e57711682155bbdb80f2cb66af0491d351ad7253412a4eb1ee01cfaee21ed2 +SHAKE-128: 8a8da0ee68e4f36c7a54a7512aeeb94559b236138662e987a03ab61d39a80c6d14cb7ea2baefb027ad1d9170dd791b6adc03a84503a0d4abf1f7c42f29d18638e1f41b687a32c38f26fe74f5d55f296fa044fcc6fac5df42c877d53f6600c2f16b59b1f60e532995ebfae4bedcda5e77325ad6a475843c1d6d65a4c237d9ce9891a9b2e23b3819b3d8aa2349fe3a8a05822638d4f7c44a2556c68f185414b8ca03f0a81189e3dcd4c712ab90fcfb5fc2cb40defed7f4cf0f2ddf3168a8de7aeb62b55635596c750a89116f34f911250b0e322dedaf856cbcf5feb14e037b985499bfbe59ee3cee0d2d628700756b2034ab112b61c9c0fbab3a1e112147d3d73ba95973d5af662c35713a04a9061c083fac6e3359ff78f181fbea8bf2faf31c6699547f009f55491725eca85a08290330776bbda3c968f23e234c16b1927d243467ddfddb14844b0dee257c3367411f78a39bada30223779845c5ce048d5ee206d7317325dac57ff3edd77c69add101a6296de4dcde65548925a8c9dde7ce93db6e59651598a0ed8bf58d7c288ff255a29d2964297f67b7f28464b6b25533e44aa1a41c26fb3699f460d034857d778b0c20d0634735307f584e7a1e955731dcd39215862a0cd6502517beccfb6900582c9a1f416536ce311f3455aeffa9b825c03443d9ca1b1340ecf3ce15a0387c92688ea6d2cd34101e5f48ab3d1da18de3b0 +SHAKE-256: 1c78972f04a35672df49244baea1c234c6c080c2cc06b14ff315f9b91d6bf9d836411a5f5f6c67e204b392550ac75fe6dfd60b8d0a99f06a34228d0cad4cadf3a4aa01b86ce2482149794e96dcd7dec875908fafc81636eb5d4319ab8ae36621abed573b8d9dea93b92fb6a8cdf6fcfb6a0dc8a46c43436d03e9a534468e6d5df627c2d617b48d985e93d3ef39c9e5b2dddd2cb81d99054a95fd4e2cfa9d50e8f0b81adffd7c8d7251eedee1256e3c1e94bdee107be9520ab5789dc4afe0e90197a145fb7fc981abe0c5281e7be51b934a467d0f556657e14826bb72886e245d7c0763350a23a86acb7ce46979575895a198c642e89d5c4a4e9acad9cf8b209d5310fd3e8e46a3d3a723c02c95e4e6d5cbaaee1a74a47c37cfd78643d3bfcbbc1901dd37ba79989c2d3b7deb48130ab1b7cd6707304a30da572437f38dc5af762b342baeb93c55c60dc914372a31225863ac63c0c38287e5c41c1a05cd54577d8ada22d16bf17bb60a551ff07851b67ed2ac78b0878826f0b144e46c723d296c5085503be0a5ee8793a17b9a0dfc381e0f9e012ff1ed712e772d78e969068c6308c357e136c9030d1e7dd07d50b343e9c1009d15448fdb85d90f3aa28b752f0fdaf31098a7148270af2c9f27056837dbab666aa91e2a08b9600c2f72cba22025f595d4fea56ec53fc1d85ed71a1404b10d6146440071f55015780ac7859a4a7e + +Input: 27e80655514f4d34afa7deaaace16c8f88eb2997e9a9a7872d22f3035c83537f9054e6cd6a1623102001bd8b41328a1209391e590f757b38a8198671b8a5e6bae498b6b4f8c12604a960353d38941c0ccd4448a6e8251cd78f01660da55f655e64764888a2bcd8fe9cb65f14a150d816b3d4ff49c8a23ab00e926fabbae463e035c8308b95b54d88c13b5d8abc357a5cb712dccb7c2604758e52974acf8e17933a186e170ccf803590711d7989b4d28c5d34b3a2097c1263cd30c19a168e804b6d3836f98ce97f2c53534038842f0dc3256c3298b187f43540fc851669d5de77c75f05462cf47255bf42219c05cd5f6bc1f148f8f4750550808d3eb97b148f1f2aab693b5c29b73e641888b856f0b5 +SHA3-256: 1632a3c8bd62e72448d84e6c5b7860769d0284b3ff349cf1c46eba85131df913 +SHA3-512: a4dc46b171853a7e74304e8637e4c12bdbd956d4942a336fe2efd47b96988e194dea70c2f1f49d279bc45f5323ce7e729313956e503cfa9a4929a7d47942c64c +SHAKE-128: 8ccfc4b2e3e6c0a4843347e3dcfc69195c089a60226f9807390aa0847dd33e1b24c1a6087a47051a37689c1354d8451563fb2ceff75659a9ad1ad4a3b707688672addd53e37011ec2007429a594aa7d19c960700481ac1e75575db628054ddc670ea865b63f9fcf6bddeeeab17c1669b0718042fa5734338fb726b339d213dea2cea9517fe008b36b6cd46042b8682c76e6177e12ae2574bd94d47eb627f12f4aeef6a9e6a3d7338b279c9da51c0a7d0463f313e798509ce743d377a7bc9330bed0bd127cb64aeed7c2e7c03995f8752e68670eba6a4b6f6b18de4d564d87880817fc084ad8ac5745b6423e8ae1886f99110b72580698f4a7c1677e35a5955e7bd3c632a65d502154e538ded346a423e475e83926522a8ee56155fd69ce41944be412deaf6da50d20d683b3e094875e9e0ed901133e48be40881861e3cad178e0c351876592d5384bd5edd64f1663f854ae2a7ff1c52d9f51db6e42b93bd1ff13007b2bdc8ca4fb6196cdf7e06da9ede4242220736b92c45211ce3b896f9d37402393d6ac1b63f299b00d96c96813855991d76dab1d9406cb6065b82fdfe33f1d4a5afc070ef39a267f479016207e722e58c08c5af97a449ebe3079a00643e891243fe9a6a1ab4d53c1c3ebdf5e498a7fee657dc77919dc5751e38915a5230c3fa424ad8029e15ce47e6679e255612e2d5e286129c225e923ba33107971cf4a0 +SHAKE-256: 7f062ac778722f8f390c0dc94976c491952a9fbdd1f6f194eaada7c546d66ebfce9cdfb5b165caa25e50791292a3870014ff66f885a1f5636200006a588e93211ce4530b75434c553d32d685925885827eefa7ebe92000fcc35cf9dd4c8c471bfc0027aff5f2ed6ef539786e832f8806700605cd18baceae1cd244e91d8937a2b265af66ee23ccc5afe28000e4f6e4906aff767b7094e29ddf411f9085dcd25aeb42286cef644b14d0330927afbafa9fa665883bade60e9856fb640621f36cf4e49f981fa4aabe106e7a0d42eaa8791f4202b962ef0031f4b968d56be2f8df32d3865022eccc36c5937117529c7da51ed4a594d9d5ec6ad29cad82a6826e98e3a6558a1ba2561c8706ea045fc109dbb2a72992e26d62ceb4cbcb6a845b17cd2e61b49053baed9a45978da226a2027c8d4fb9a44208a35a6f9d105e5115f0dd8cf9362d199c05c4c33b2b15099772b34cd4da011867409ce0df29c02de7b1af15f63f8144a3f3da53973c98919965e81cfe12d62e111b1f5590c5034cf940497ef337adf658e0b8b58183fbc2e24ee1816c1ef78c23dcd6361f8e7164389e93faa48332e9d2862ca5dd6f53b38498a5e651de3c86cf346a15484cc6dd49afd2d615b4925606d061f8ae72b54a2214d6256cc4d61016b9ad6483edb8c266490b5425aaa5ecec28ed008fbc3d15ff6d3f1802ad7cdddfebfb3a9007a8fba7a2ffb1 + +Input: 8365730dab7edb5392d48dc72d9f80ae437f98feaeece8c783761bd93ca9da3d2fdda4e0b36b9fda88322dee0c15f9d095d96864b889ad720655a49dca5f90ee9f1c2f726484d6881108aed840ad6aa70571aca09b14b7f86524d008efe5620a5f143cc14422bbcf389aaa802859b2d383ca19dd2f2918f281862107586fcd3c5715b7c150c5977a40f925e0e81ab7ecb82a48c6308ccfc64e4b31958edb46e4dd82b5eb0d57ac965d1c4d565c8c8f8052c27c6aa7a4021a3bf9cd1b5a5d3fdf03038caa922c7ce36ee1b6211517d694fb096a6bb5cb01963da45571f543c5e525f7dca5d7d9bf40ae0155391b9f6cd6c3f13ff767995f9cca17d7e9bc28c139334070382c908f58c7e4490d3f3e68f5 +SHA3-256: d7c468e0f3e3ce5ecb5e385ca0bcd9c3741bcaf28d717ca1a4661fac7f6f902c +SHA3-512: 5c4429344973338b31dcd6abad2886fe0d3f185171b13d24f6be2fc576bc69ffad69655bfcc666f20975c889f2b9ff64cc574080a9a05dcee2726e1e8a407500 +SHAKE-128: 2036e57ce4f1a440307b35dbd8899db94f21a196e3cb9ffec5abf02ffdef2dbdaa57ea850b2178760b7a966983fbee99c7a411322d8a57ccdfd7628c8d9d6d7449fff9b759618213f6f7ddeef1812329dfd7c95a8f0bd1c3497ca4e91959fabd9b21b723559cb30b931c5d48208bbbe6b9e66c2049d5825df3e04312cf0938ee29af767e9a9d902987c44375cdb682e9a58734f3aebfb429dca31d2380d15614e2f9e7a4527181069fbcf9f4457f3ea1da2acbd5158741acbf9ea784cd1ccb75636c60742eac4e313889a29870da993d9b1fe957821838cfcfa7d3dc4dfcae6b4337fc5d8d20c5873625d18236ffba499285fbc09da88345d22b83b089a9e3bf8a6d12e58d62a4b24d4375d4cb020cf3987c982edf78111f4b23a91ea10e5609667b42e41a22e3750fece2485b284737fbf7f063fd8d9facc2b268a7615a006c0ac316f52689ea36ab922b33709f42476dc96ab9913a92a6aa93822b42ac5a6e5c6b32bd03ad80720d4764f414d19ea2fcb247865d4badad0ad4fe826ee9939f2eab178b214ad3243e862964ae0f5b0c42e288560cd3692a9209024f9a861b3e7ae110bbd103da7cc27c3a6311263b081cfa5082fd6fb07b66ff7c35132e89661079ed2e44524cba97de759fe2c029ef117fd88217e0a10268499ce12b38f67229b5b897213558ccb040d14962bb6a5cd1842d48de9548821c8f6076d77dffbd +SHAKE-256: 9d8839facf48aff8c787828163f6f4527a6905fc8999285c6747d24423a30aa213d74d71849e74d7f0724aad32df07666846d82dcd2bd1f5724dc13c9cba6bb8cd7e2d39a6e834ebf187e962b40855d3af41adb0dd51433687f4bc7e96f793e0d893596328ff9ddef2882b84ce89ec0c766b5fdc48253df15d3ad0e051698ce23b91e0293d3a3832077c17a0c990f602bb087f3359b5754c9fb11b44546fc0a8a951ac885300dcf7ffe2e1af3ffffc7bcb46c3d9ea7a1777bc4e5cbe241281dbc171be331e260831d6aadafadf40ab077417c3b21937b6fef599086c3a5537b4835de6368d09ac3ba0a3a0e5cd4a22c84ec7328a8fe06fddf6ea9d4dff9eeb70340dd6f24131e07b8ba73d57bd6927fce114f6e245c87f451ed67dd74e4f4cf2bc7638f330606e3b4a1bda722f31e70a0d7469b224cc40877bbdcdb6c51c5b8871c519767df0dfc2be481bb476b86c4895162f2fe6f64e5423e1de59b1e4fdfbe9a9e4e536232a3a359c0090c1149a77114caf52d8fbc80f85c27d917a46e9ba14b49ff5628cb003e13ede80e782f56009bc794de06ec4ef007f9fe5dace44e5294ab2f14ee9c763e2422137ed574a116e08417fb90d1490d38e7595abbd7e98d00397838836993b324216ab4e53b49a5090e5a62c3ff38f74c68221df05b59d295394a3ca45ca75abf45ca953aa8ac2ffde1e7ebcdbd5120213fc6a1ccbad24 + +Input: efdf3904ed2d8e8ed5383a45fad8cf8d6276457a3ba36e4ea8cd925dbdb0f4d346b24ff2ca50402b250dc0814d07a9e604f58298b650ca31e3a5ffa050438a5c28dc35f3dc7478760a3000c1f2b6676b77a46f3fe67453a938bf05396f227aac55527f5d41acd14bbaeb7980389a779ca14d37ddbbba43cf9d0750ae5e9a2cdea286a20cb4777c7d15a8cc407da234be4a010875a5db3eace974e8d9fb44e3a6ee771f2b2592b490f5447fda431a807853dff8fef5cdcc01c43775ea387a3cfb6952e58350a21db037734121395b637f00b31e001bd1e8bfabfcdaff243556a076942b056317f9057b58b0b2089bed9018706c379acda9b5f30e359e6e7af427f33d9af59435bf9d76d135a1f4e5cdd091 +SHA3-256: c505f38539d0a6dbbc2c755ab14f9c3d609abe5343dd0e692698e6c37b155fad +SHA3-512: b00f201360dd2933c4b4644b65d46a895ece6d84cdc6224efb323d930372b42454d5b614bcaba111d14bde4ee2cc8f2ad6bbf5c170977468333943635636bb8c +SHAKE-128: 28af2cc9df157765e199f6380119d577ee962fe88530c06a8c58f63e3d0e6282eb9be1ef4b89ab2a087c988fed833be0a689ab4e58fc8693405949c5ff3811ed4c1fdf7ef698fdc5aff0ec7148d4c71ce5622b760956522242847b4e4a71f414309b36b78dfdf8493b758612263d31346db5ad29f47d56dbd3795faf8426c781a8836d578245f4692d464540aeeec1f3cd1c5e1809f06612e3c8ae0a01264378f05afb825a5490d1390c07f0fb07e61b02075a20b387e948b9892d4f848de289dba430affc2871b3e6e2f7a324ce23408012a7efedc320dbb3a9d567c65033a8fe04d308f150c57910ab36c3dc09efd8e190738369540ddbe8478f6dd64d7ae9d502901595bbf392af40c9dc1f0002f3981c86e0699d06fc99f045ebe6621cd47b6664ed1f8d2cd8be89310b01541ed236a7caa06c966c9873b44103773e5136206da8ec97a1b093d6b6297e6c1e3f546990adebec1131c1c848f3c381c9d6505dca07fc58e8c9cd141e65f18879107461e5238e2669fbe182f5b33720c0513cdc731062d36566ed3727269a83991f45d616e9e74603ce9bb6f4fe52f7011348ee9883bf3162e6be76ab5020dca295da20ebdd89b34aaa6ca986860dabd7130895a5780c3545202aeec547ac9866bc8f950ad48f70836943faa59c34fc256a131b6dadf8497c847b6561236ad5af44991ef8d2b260dd6f425d28908ea3422fb9 +SHAKE-256: 20100a3a892cf2c23c400516918d548b7b879aa379471020cce08cc008163dc9f7cbf888193ce0e41aa49753169caa07dc56fb2c7dc1eede64b05df544ea0672dfb54ad604aecabd57deefea29794f439090ca37856575eb66f7afaad66be78d4fa5966c0ba9899820954bb59e3645c3fb8475c7e4e11a06b6902abcd262e463c3c216568787d86fa99503aa2bcd3af2c689c1d46ef15756fa41539479faab2e46a3ef7f61fadda259201bdc00657c406b086822997dfa546b64b9ab2d6a28c7735e67076b455a2cbbe3b7f5ed903dd77a7609f182cc5998c301d3b14d704d858e3baaa146cf6a490d1c7e5fbc718237ea57944096c24103e383cd2c8ddb6fc6a23cb5431050df778c54e3af004b9386d4df09a491ac9fdb65dd74005d4d32a38c42f0af8132d1b84468663d1c2c44604179d4675620eff93619467f29f5a1e0dbb8c53c8ebde6a647da5c75fb851aaf953b94788aa688bc17fa02627bbec1c2f68fcd412846034089a1edc87613f12b48ac0e9d33d105ebd36bf950d6dc89b99e33cd9d06c3c56bb4d09c8853690796bafae2b92936ff469ccf0e056ed3391c51be2946fe390309eaa0a82192fb6a53245f52eae636b86fd4d22a4654be808024b86a8621564d1765aacee342cc444a830e17f87a821a20f5f722c6506d9e2af06588deb873c8567768e3b3a2b672016f5a4e84d94b2b7e1fe174be1d49cce6 + +Input: e002c0e6546046f772574f11e60d385bd7a0090a65b5bd526ef68cb5e2a8b853c6e58bf9532fb86c6fdc719033b8b954fce7504997d53e213dccc208b2198f69843c30b33c7250867e6485c6a13df1553b50482012d637727bf1d351a22e385bd7d2baff5cdfca6d42ed798b9179c96ab90a8a2362ebc30e45b5c986a9443594732804924e387f04a813fc9d4537e4fd372eb64fefdc5ed2b141b1c179acf39188307817652f1b5144c93e551b7f7bf2819c67b770b70da64f0191e4908bae62bf909727c87e8ba41d16e517f5a1f5134018fa8d816e643ec141b436e7b8dd0a682141eaa4730ea30c8f1b8877de923354cfb8578872732bca19e7d215fad4bb7fec9af756b75b85b79e4ba6d142becf9e83 +SHA3-256: f046ae10437a8a95473a42fe343ef4524ac43eba64a0929c03e5837da9423b44 +SHA3-512: d6da2264164eb59f4a509eef9339f59615239c66337c86b5ee9694f335ca719d35fce4a810a452e96fb3be179991cb0d566a425d813f3bfbe14f4e2025d5edeb +SHAKE-128: e46c31d487e6159638e6fd8431dc1c9fcb7dc9f03fb8816088e2a931eb1c366a0537836931a1760a83aa2db59bc0d885f354cef0bc1eab7ba13bbf5321fc939af996ffe6a17a8ce2653d835f4ae4282292a463816cfaa38fbb8e6c02e3ae7b912d942300b5393448b1a8a5b25dce9f6f4e0ce003851db73d4c731f6ec4f327e2dedc12992ba0443c0dbfb4a6ed4de162b527175348f0c197760870f4bffb8d23eb0dfad744c4b298462f5518d396cec44d99ec161e1a9828be84cb140b4350ee3a59463b597eb529efa078ab54501ebff4ae8a8f7e9049d808624aa932015a9bcd6b79766ea3ef9327a72581d4e73282d822c7b6e77be3641f468c0107af5a3b47095cf2c51908b5dc72e1ed6b53f960c3042d70707f427b961b722ceb6f6f57ba45b66e178e2fe83924a40ca42cee25eb37a48ee4cab26958fe6812ac1b9ce257d69a9f9cb4d6af615a607e15c079d301709edf097192dae3ef6db996f14af57a5316d00578790e41064fd87e522ee9af0cbbd10765cdf9dfaee3373f747bb83ad77c416e4df81463b1fcb3a3fa8ad087b721cdb7bd86851a458ac08df9ec2b42133d0bcc316987413f6107ea48af2492e60f8c3b6c0386ea0e92fec3c5945055795d8fb2e1ade1348a7a2b62cb46ea2c453707687b43c1ec4c4e5b00dea642c604b48995adbe31888cbf6b0fc86d188712d45947001c707392356627b1c5f4 +SHAKE-256: 21a88906d79bd3154ab5f420587074ccbf18a0ec54aa7a6341cf30d1caea5fa342359d1eebbbc6e343d2c799f5fba27fbc2db4f2df13d73a6ae75fe6f9f04b6571c3c08aa5afb4d1b586abb02018d9049285a6fad0a35dda2004a3e8c34d66e6093841dbb1c71770b637cb0c51d501e7a64edc6ea20db914429ffc1ebdedafcae2aa164aeef6cc41ab2a2119c8deb790d686df2f6bf9ad4dd32a22fa753fd6d278b3844e5ea670c2444aa877cfa08fdeab1adc90991c74292735e66a138a559199b49fc5f1889605b21f89e180a9e932919755efd9397106caff728b6ebecd979fa490a552b419c2ac6b64e476e2a81016e4e1bc650a75e42714b391b3793fb57cc2ed005b239eac5f8506e2b96c22583c8760dceea6128440736af864c1fb7f5930368b7ed82b5dd5ad383e724e90e61e9fcc90cacde0093c0fdbff30006ca57c2fff6025ed537e9c1d1e7d4dfd1e36025002770420ff10ed2c6d35ca36f2ea876ac71c1f973bc296369800babf8c1b1bd76f08b0e850259711d4ea0945ca86630afced62093c686c4f7f9b8c55c9f94c7d348691ebf03d2b46677330e8adaeebdb11490cc0845ce731bdda1d815fecb7314251ccc6ce27ca9c919bc685014d8488d8db061741ba31e95f76e1551b6a1a9dcfe51bdf3ee7d2390f45eeacc0b5f212d1df81c5475c4be2efa6d531a1bc3a6c5a9d5f608520cdcdaa3bf7bb5c2b + +Input: 54692a55b780a31f2bcd6c2032f6c4464caede26d332e1f2d000abc15f03042bc70f391d26c762dc0a8f688096bc156718069c826b20f1f737b81378794bbaa290a8ee99d7c533ca34cad2257047f14b471a95ec00d1a8235547db2d384c49bf7b0ac5a85bd7bf56d02e6ac8ba2d79bcb9911ceef7d9feae1a8a0f5a09740d8a4fddc789d70c0c7cb42d33d301319705c8b00f9136776366ae8f101d6359a6d4e7eb09049365b982db0e166f5509bb88dfb21c11de3396e8a445429d809e654d8d655f9e80b5baa17285c4e6ccc7e89972b939e185a4fcda700005fc1bcc975da39dbabadb3373f4c58416f9909cfb77bc683ca38f29cd93a906a93a395d5ba7911ecf3bd1fa0d954998ec7de43f506594a6c0 +SHA3-256: 7d4025081a99f0ae878d4fb71e9e1407bce9b75e8febcfc361308c71e939f2f4 +SHA3-512: bb51b8311d20f2f3ea60445f7dcbb1b76363ddede4804195e8c614c72dbed42daa2e9330b04f9957e26303d5f756c0115efd63a3ddc241e564cd841df6201892 +SHAKE-128: 3807ea489c34221e708ee43219b1307f4e618021f23b75db41ea11739c9302d455e01335ae2edf4292a8c411c2973c8357409ca19c5d8dc6297039baa0ad50b034ada0f7a041c9310f350befbb286f46b93a1f1e9df5da4db23f6898871b1536965b25a934c309857dda1a40acb9af60ca233b577be6347ce999158bd91a4d151c39fa13fcf074b3f499e2f61f73463eac049b908e9c457c3107808d9beb4bb8f0a9f76f6748f17650b11b51fdd02e1ced83627a9d39344dca8191541391d81a08e99b3681094f480e482fc6af12a506bc9d5c0f9aa3954d0252ff8d7188dfda785dc39992b2bcb9dee5574028fb940ad7b44be65ff981254e4ee941fa820a02fe85121f855644fefc1ada6fe1052c3eb41d607ad7620b64f715dcb2fba8f7a40b04cea7e0aa847b0e21ae14dbfee7d77faca84a5bb9339847c8d7500877e4eab8f333da4a59c99d0d77e5b73aa6bbe3deb3e1de3e11a88839e4ef5f67dd5c183d2c7fb80a72f7c13ca4a1560cbf89b8b27c1130f10f1c224a1ac82c8691ec5451d13d859cd9850ae17231956f061ee9fc383722eea5e49c7f6e792500de8477763a8a96aad37f0b08ae74dd31837184f5636f3a35c302c33ca980ba11fabb6c85c322b47fabb348faa083aee27e8b2ed171f374f89f86c398cc71b1df60cb1219f1acdf4c6c7cf55a14f6acbf8c7eef845f7010b121ee895b0c0acc3320e699 +SHAKE-256: 8ab322740e5b1a6958a66b33194596ebd1971150a8a2db6e33325c80c82741ab5e9e63723135d433364fee464a13386349031e30dc993551afda1fff6c95451ac8ba3e172698f73194b6a88f2f8d7b449654431ebea20caf531be620a791179568265870a63063b0506bdd836e0bb1b0ea18c8d6496e5c603c0969c2c3c52811f5e27148b830f4199601e8a741aba23cc3760e13152f7939b2b2246d3fd4299a314f3796448d4caf1beb721d044e9d5b1d5e4bfe610b085503fe80750a94eca1fd83a8ba2bc3170e42e074bae8917558500976b5d92adf3437ba63260fe688f8feea501d4ed3960dafc359b21341be3ae01173c9547b7d8439b0a498118f6772bf1903ec50a4cae2a7242c7b4f58f0f494da97c18fc0dc198f28c6740f8a06f7239e9bd2ebf48c07e29cc6d4a28f53a33947f2549e4c7e49094b993c4e508b29dda9c9b41a4d4d2a3a48869f53e2aa3e5a47a7aea543a129caf341810b30650ea57328676331c24a434c2696ea9338202780a21192b261c5a8561740023f217f88cd4adbf15cab4f488f8c76bb8b395f07423f2e57e26bc3d1c1df1de72d0be66ec8a25ba6dcd8a418aac224674dc395cd44f249d72219f6aba16e5d881f5f1fca2c20bb1b3ac33f5c4d69a370547ddabdf64f12b94f71a71e93153afbe3ae71529df3f42665444720bb147c8aece34eb7e286f002d09fdefdacc05ba8829a5a + +Input: 1535ef658c408bc2fe4a0655f00e966902066a2f2bb303cc589edc73f61d30023ae50e9f510cb6fe4ea7ded57049831cb9b02a5c6c647d7bcfeab0dfe18b65d80f9dd1c835c3abc478aa0a89b4bb39bcd97a2caa6d0181b27799a9e3254fd81e9b12b1e498b60027cddd292f852af47926e57835f771f1c2c0cfefb22dfce57a1352aead03270c6d778fe33454f2e4f9af5b40ad0f1d12d2a4fb822b082b115cd8c11b0974c1fa8f01c7788766e8e2ce63f60b6d79474d0fccfc5fa80aa613c85b6649acc3a80896a0733f0f6ef8d32b4bc5ea186ce5f004450880b1c1d127a364df1939c185dc063c1d7c65198abbd6d59bc5395059ae517e30dd7dc2a20f77baebd0d84c47e0ea8a44d9ddc22efd4d4c4f9f35 +SHA3-256: d2caffa0459f318d664c5da6ef39bc475a0bd3cc8375e9249301f4577a898087 +SHA3-512: 13cf6cb40e4bed9b0ff94ef19683608c106975f0d84e1e107280c2661d6b74bad24d70fbf844e01488bcd272ffefbdd36c7edc367895a3a51975a38ff868b59f +SHAKE-128: a5552994843726e3bb834938a7e7884d6e07f2358158aa52f98491c1e408f6f1a8f8d227b2bf8cf857f540fcbe3425110476faf6985238803baa272f34d181324961e52d987e9858a8422e73581d83ee58963dab02c3b614877cab4b6e7e98a623f82ac5fb688584e1199e1521921ba67e6ad5835d0e7b5846be96e1383f802ff2fdcb473e1e0394574aaafbeb8c256decff577770c83e7a9a0fbb6a9cfbfb777ae4edbbd0e7f1feef0f6301eb36adc3d6139d412ad221b3cf5242bbf45fcc61f7de7f791464aec259b911aefcc1f0a6ce1cc6e706c5f8066ce2db240c7337db1156be3ed55bac93cda4ac28ed34d7956f619dcadd030243d1f1bbf2471c1f362098560326f26ca56b0933c2dfc812167cc6aad5ba68a407770c84fab02dd5ae37ac47ec86d03f22318563926f036baf7bcfb7f6f786b1d8e7cf5dfeaa4d4b81307f81aee797d2b107081703fc19fa82d0db7403cfb62829bd8d57bd0de9523551ebe1a2dc4f7562c1fe95e2e00dece3f2aeca58063a72b2a3db4640de783a404e8ecd187681e0f8b6d8db04dd5b7d438d61b323a836663eb511cb8e2264166c272dafc69e0c12172aa3d3b25e08142d7c888f4d24dc64f305843ad90d5ad6524196cb6f805104e6b813d2353cd94f95b6c5f81685dbee579a6545efb088ed28cc52d8deddc6a82a8b087440f23f5256faf54bd17665d2d7553e7feebd63bae4 +SHAKE-256: 681426d30e8d72a1a53471d0c05ed752dd27a098b5cba22757eb99b8af2005770b010c3e8a04aecffe2899804214873bae21904c04926d727721a3b3c3596a995044be04f73e77c24d357453865bedcbec30697dcc3d9a7c1596c0f5c98f4abebd6ba27437d6d82283d03ac92ee7d3dc05564c15c201cf88b4b21468349e1c8f33e3895ea01d443617639664e9f021d55ca018617e12089ffe7bdfe208169c2b79b9fb35f4b269ba8969c134f81dfd90d5769a5cfd8ec1af4c48855e8e483405b55f0d3e811a7b902efdd0b706301ff2286c23a769d65555bfcac138aa6e3e175d27a8d4b21f01b6b760998b80c2190f1d21130f23568928ca7b10614091dae4742256bed806433815cd1893a9b1ada7bbd953b87f7bcacdb24392f83db348ced8850b321ec6bbb9b0605c26d36cf968d69834032ff83bd4f1e21f9261a770d950f4d1c1cc26f8fc231d93e984cb2ec181c6e3f517071663dee12cc0a8b7dc4053dc4465a86b12bf851067121185a5a62fe22ef9d9f8e7aaa1cbc538fac04bddb5bb601d428e30b043661b7edfc96b44d75b57349ab4ca22bef60ce90bfc34fa7baeb3355d09029889a62e8fbb2c416adc3e4a1a9afe2b44f3e872543b840d0a9d512e5580659b2d6e6738860720e2be7f7358c4853cf5528fc4623cabb04dc28c00feee35697a4f9373b454b87f59992d74a519582aa49b528c4d3686c06884 + +Input: 90b9879dbc421177d7be19cdee515dd09f62f6d712b5211e48d3e56a51c9230513d59032ebfdf060b53b8fac74c8a297a950afbd7f51beed8c072cf6f3ddfece1f8e8e8175a158ae6f3a9d275179a3f8194d5fa47ab977d244f1e51ed01b497196d66cb2efe5b47998a824906d5bbdb8ddcf6ae175b116ece27cca213ba32e89a272b9e724362cdac508b1540f46c1d593b25d69f387949ab208b7dc1836aec2e3a86af4f5ca5b1ef751693e70d23caea348d025d9c86f456f1c353b5fc67878901db08732ba5fd3352b648533dd13c67f30cb7b90969e05c78fff80103227fb56fc30a8e41589427fc66c475e3a5ac3e2468dac136ce46adfc5c85a96127e32dc7734c5c2a0a6e6629453f2531ac48342aede8f95 +SHA3-256: cdc39b97a1f24eb7ad02cd34a7ae02ab6ba2caa174b85cfcedf4002857c467f8 +SHA3-512: c08684aa7c3b43707e688ab7a7e88a607baba3f2ef6f27700d9d6bbec028cb35b651ff4ecc873af264b1ad445c4382f003645aebcdce0e9acaa38ebe5b6e3d8a +SHAKE-128: 464545e0eee1b6a5441917053e967bc7c11025b1d36ebf3ff37031be6554c5dcf743d8bf66be6923f0e4c92f728facf74bba01dc8fa70cf36f33eab6d7334b2e4699569f2b3ca5ea129b0517f2db562fb090e6c4c3fe6e06c9ad1922f0808412f49d4d7e292cf591f3bf5f6694fd8f770c456b0fc5a5cd14869f73aac278c447d3793b5e92355b886a2b0e41e9d4e7ac4007207c5c15deeab218e4e4200445068ca6e981702261e7a318f39040a75227be8a4f760a91b85e379df3c4ece2cf21c2813cbceda206d246f4355f038fd631b66758f23a56afe01a52e9e5830aca65200400e59ea501807d0b3f0302a2816cebdc9dcefeaf5fe07e0c0b6d969f25a7e8974acf6771829cd2e3ecfe158eea2268d731922677bf2ecd74d46c66ba159603ea93c1b1a7acf468a8bd5c126375cca2394698edfe5d797e86923b67fda053f40b76f56ca45c516ed62516ea3a379930db7cccc60f60a7718fda472a299b5fd7a844332af0781825ec424a246034827445dd9e0b83306e9fdc1ede7b31bad5e3c3b3e4cce93810506767b526659473b97c4b7cfcf42b31d90a0c40a9c374ba02f191f58c5754aa2ebbc80a77b76622275c3b12d04fe729a2bdafe4d7c696e642cbf1434b81ac7babfb7efc18728c62d4d9f625d5d62cf5422f6a7a3880e8111ef6ebd9c5b798149930f93b765a7f95569340fddcc1974644c733b88789cb25 +SHAKE-256: 7073c700ea2653cbb3b30a49e0c862420e2b8653d0bafbb8afd537b06e044eaa241668753fb87573321205fc0553c85eea20e17c53338186d707edac2131e81517cfcf5c9f6b7f86a7e49e131b78b479192f16945655bbf8afc2ab126436169c699701badcb1c6d744095b20894789b13743e5cf4b7dd221e0929332ef4b583cb1c4d825a2036189670c9564f90eb2dd5cec9abf425868bf0ef5fa0e1b2bd7b4cf0df3b07df0b0f011e85d3c9605fbd78feb0869147fc825b443145a0cc1045eaf1d7ab3398fdd3e4ef2a95edd659d434757f68932f8acdff7eb0fdb20f91a13d3834ee696d418182fc93414bf4f04f4949bc4457010246332a157bf10a53a7c8a244d973b04e9bda80f28ffc88a6631000921533f7bc1e34e5710554e294adbbe09803a073a639d30b974c91b56771f128c8d1ff11028b469b9847e729c4186401a85c63d7ec12ffecf1af1a7f496cc058072490556731f62cadae959a024a49314260dcc78f13ce030bfb9e3b04d5d2069e95b4cafca7e2b6d4defee75e086824971ac8774c569cd6163cc0bfd83b6df0eeac1bdb139c1e205e91cf8859b21db639af4cae76f1c265449f8ec556e62d2fc7b6f9b4abc3f109bc9f2f96e51e2058e5f7808f3b00aea72813a789f8b38f79313cf5e594556422c62ce54e410ce136120eb05d3536a710b3e995270b20c496048b6ce7987ced61f8d56112d8f5d + +Input: 81d5e31ef3c329fb6b03231af5a2bcc4d22a551d23defe54db9dd7b2c2c6d47cbfbdae2f766201694b7723ebc6b0ac18e595be42f74dbe65460e8ecb3abedb904ede81a0d847c09910314344d9e368ad9da3cb5e62c3e606c55139ce65281d0b822fc6b23335da2eba23392a43b2eb4145d48b34128b5ee1a3158ea78c39c38d04f2383bdb41a1f1005f5b7d5b86bda127b964eef40160c669aba8bbcad2ffaa2c3c0288003b82051df80fd86fbec2d4b6adadb19329fe968ed1d40af932fc9c8c90b6b7558f5370f6e69c44b898d9a7c189804a330b2ced2ee313a0b2f44d9851e38d43efdc98e0ab307eb176be17c70262f780d2bd994e5373acab89ee9e101539e038c717eb9d7a6215207bab2a1bca0fefe23cc6 +SHA3-256: 8b609669303e3c4c23139fd4e4c706516cf38d890961e1bf706a60d63c384d01 +SHA3-512: 91ad72d6100448d8ea2549765b6efed6fa73e063046ea586830f58cf2c2474f1b8edf6233d135ba1dab9462aefbcf5c5fc64062939b00fbf5306905ab9953a67 +SHAKE-128: 193ac16aecf1a57f263ce027a583e23724ec095f7690b9b475898e78e0558bd7e7982381298c02d7800205039d1b18751ff7e17dc3e3c170b884ac2a4f552a9ae77c5e6d60ec048eb445ebf8726d55f17ce0c18ce9b79c8c426ccb0c37c3edce5bb6884335a191b9bae0ef9be7ad130db8bdf66bec1cf15c76817d7409c56fa54c806cbc97b5cba71ab178e7742b4bcd659a829005775b4aa454d8c84ebec84f407713f0028501e10842d1a8809ad510adb4e6d0c4fb02f9fbe59481e8e1527028432766602c4263b57cfa552225c99615a9a50c90fae91dc30d22529614a43b72ad57e735b4b329cd9066873712466aafba1af439bfbbfe794f15aa4233705216b6c0575bd08c98e14d0d36246196a990926bc328504b0938bb27c0a307b739e09261f78678c8d070babc32c9d44a0f765c03ab1647b39260ac9196cd8b31e30dfdf9ca36d6d9b4807e89c2ba0001461eb35d7afff07dfc97675e068da86b5bd92198a99e18b0feb672f88f663762f65e0ffc5fd6f9b97ffad3dfd12c5f6ca0c5062a14a3473a178e9647772600f8b51aab8da43453a7c1ebc03563ca4982202c35467a0612c823b8a3882ac79dfdaa0d8ff8e6e4b462847d7f4ff989b7a5aac03cb76452f26fba02493bf57d5822d4ce43d41afecf1755406dd053113dd77e3109f1ed2c12bb9335ea5280485fac2935fa130ccc2407df565a7d7d142174bd +SHAKE-256: 2966fda3b1471db641149a3be0e0771454acd15a5da691ab3ee3315a0ee8b763b036210789dfa0db39b79efad9185b4e2b62f16efeed96ee40bf27bd0877ebb4edc9924f9313694d9f86353c819f88f0edc50853db5d1c9d4de91b7dcbc9d647d5897918c5ebcf9849348c7f850e5c64af64cb326d4aec23554660417b85066c7bfe2a9bbb9cb0c2ae731d7767a6b701344e7470e181202dff18a5b61e1ae069610fc24a7b04ff4fe1cc78f8bac1ef4703ea2c968aacbb696fa29e778ebfc2127ea27a201623ea38804e9b66ac9434b162335d806d48eff66772f901470f99843b50ada91ee3fe8a881a5217b4c177ba7683ddeec1344e8059c91d649cba678815d6eb78f7c70c843ed6149400a0e78b249da170dad15782600d7968c35bc45193f37d56d260ede5cc073a0c650b9dd65f28e55bd16fa4d6bc6055d4eac00ca57a4b1f9755bec079be39b2af5296bc42b961853a38d2c9de452f0d87ecfef48708f3c554bf3ddcc731c6880087da91af067eaac7662db150cde24f5ca23d708298a6f54c23a8bbf2760ae9e83a5fcccaf6f43c9263a81d9aa3493c1e40dd2809a1ddd8c60f1ef2180db89bcb5fb47e8f97ca1ad5695d6dd80c923a4224b22893064ab93b3d7e75af646cfd47ba181343ecbdefa13a8c4d7c42daa7e6477828d2d75b47c7f6fbf6b40a58cb5998e355a709f9ba20ac10e6461bb9162828ee60d1 + +Input: dc4a9ee194de6c75bbdd2666ff40460c797ef348c9e1ab50dc458876e489ac1818da76c06e67e47ef6b338d3c23afca82a6807857a05177f0ed02b87fb342668324eaddde742772274e3b138f11bbc7bba97faf60c35f6b46ed3ece039503fb758b117b54ae6d143643198cdedbbd3756654ae444084518c82382e9be84bab8f9b3bceb0734186f29774e590942b48669e366330d84a1d9b7cd2f50479f4db632d5e76a2dd24d84a44f935c6dca0741c7ef29934aa6c1ec27352203d8dd6a49f3f7695bd2ce2ff85a4ac29520fb0ee8dc4f58c5b266409e7378a6424bfa72937dc5c71d6acfba507ee962dd98c3fd905e20ae503ac83b7b0e23592136046afe32905a657253e5b9368c3a484953daf3c1c3e2d79930e80 +SHA3-256: f569ad0fb31ea98fd72c24f17d0ad66cd1dff65342e2a6fad2260af5816170cc +SHA3-512: 0576a47027d545b43cb7dc6e7dea9027a3645beb00c161c9967fb01dd374290cb822c2f78f6f2deb16af9eef18f1f98dde644d71b73bfe02759f46b4d6b9c215 +SHAKE-128: e2a1e76e3b3c11c5734d94a968625ec28a413cd4fa98e5a86f2db3e1f8cd45b943a399129fb65c0706f0b059ab874449785fac5fc5a548c04bb1d493dbd7c12a964e2603bbcb6d08b0b9378b3ca85c6627893edd55f8ac33d40fc5d521446626c46c53db8e78ec67b1b5c2452bb7d2ec303516a7fc1baad537b46aa8e347d449f99fb125ec0856bf4b71df8489847b0dc389ae995d78f4a2b94b8ecbb68b190de0d697915d2aaa44405a4b3c70561cc62569b6c731bac93dce35759cb23a62e8c82a7ea1d50622cba0e14ca43974b0e3cae09bfc9ed5f689ed1d1c57046ec84f4685612909315f97784394a44bc177a47263be69fe1eb5f6bd8fba5522dfc946fc382793a4bf83505d648aa0afa19a393d8470c87b22faac8f86653ed46846b7531257c354fa996a3ca3d945f82b807056cd09554aafb10309bb124b00e04db325603fe9cc58a2d23ea7feb764b10b7f5fab4f4f212ed90201ba9868598e27a2ffd39e3c089afc74461816b8ecabc535277b3845a7937fc5f356fa573d8ec600f46b108b035432bd582d838dcd2163b37b5224c6d93b77f3ce12a196c773d2d28807b4f4eee5f993ace341a3128dc37d49b99256834c5d23b56b8fd2d0e6c08b9cd728949fc8be6b697016b5eb95fcf7a492325788059fd2e3040a03912885bcb2f3c5eb8a13cb615c2478f7c75404c32c9263ca814421212e2a66e4e1ccb19c +SHAKE-256: 485165582c06bbd80607e83f429c3fcb145dc350c37833a52b455e2e7b6731834e422cc98c9885ff2029b3470d23bb670b543179e8af239c5856661f63ab7b4cac6e8f961702323d8e485e934a26e44ba336e27a0efdb48831db9780f69470594bb9a9c79f2b2a7e16d8fbdce3fd6b0eaa08ead854dbdfff13e4bae5403a91065242be572f0f6e771ab4ef2dbc7301dcbd506c79c48b1be983b3e8fa4c963b31f22d7059bf556dea05332feef6823b8b70bcb2c65e42bcb3a05e80c01646efe6e9f79a362bde977438c7d94cbb468874cd885bf14fa2987388acdbbd1d79dcd7e5ee9e356d8373b42878bde9e39b3fc273781e02e0ea8674e4ff3e734429df701cea95dbcd266c33aaf01382ce370e77ade2508bd157006de1ff6b0a412c79d43fec2a01fd578931c38149aea3bba5da580f61b146ba887ec2e8204204bcf9cc60cc33f524c79969d4875cc91c0b9593929066210e54b3d1f2b79ea612b9d64ef16c69a30a018fb9efaa940f804f7b4b4590f92624282c1b21618d16bfc6a8b77371f5967dd0bd117fc420455a672df7ac482d0119c196b44801612a5121b7ad7329d8d1e6a853017d57fb826eee6ee3b97ec47a485b85f725274606d1003ab6ca411fb1a5f77bf2cff86cfa2157b0d1f791f874e7de92ea62a1d32288f2f92cfb309759c011de3a70ccb9671c683dbb060bb47d0919ee12e012d7ef8f785f2b + +Input: efc3af5126fac87f8b4245b2ba4638761f115e969d32f3599151356ea2de3fde638d36ec4e869d4cf6ed5dd3dca76ec37fad19c19e26517aad60e0085c1c30b8732ec150247494ebae5663bee8c63e987d2d7b123a75e95c4eac8b37f77596a22ba86a9b90ee00fc96c09c9257c2daf7f504ea7dec6ecb6aa369801de3763d29c1521b04cf12cf5dbe5e2c8f5215081186f2a7b8076070b21b9d2083f2c89f66851ffa9470aef3b400d3172d3d7404bed12400ba80da86b07475b6ceda17d48a402a679476a74ca3575fbbeb0ca5f2e81e2b5b75c780a75ff972802a9c655e9898586edff5bd2ab61abd795882abd91a0ea3d47733074cc762ecdbeb139e9e5d8af39ecd38027fa9585143684989677b192565bb02d9d398 +SHA3-256: 4624d4a1f65a104d93279ce2659363f63101171e0161bb0fa3f1f70e33b430bc +SHA3-512: 667193d3ddb9b25ef76f269ffdb2f3c7c4eb0445f7d07c6343d65a91c4941b1d6e656e41441c93c8cc1fd12870c1ce4aa9b5eac80347cb09aa16cb5c1e33a1c9 +SHAKE-128: fd661201b20a53745d320c2384d4b9084051bb602522788126e39ea94b3f9abc2987805eb45d34fc7c9de1205701e812edd0eeca111c26bfaeaf0572bd9d7090ceca8ccb7b719af1ae84366ab68a34fc36bb1d1df90e6887c66a8d31fc03c5e07cfa5f6a77dd4b1a7080663b018cfaf4b0adadfc9e60366dbdbfa38ebb529492ee472eb2797b79e3784c2d55a9e9ee72a87ce97e5f779211804112c81a24b9ff157186f91ab057eb49d1e788908b40c7a77e6edb1d36667987f322ab32ea27a4363224eb361d06e4f927fd5ee820572fad366574298c1a8c116a25a051a8834bd243bb7a4752d625dacf3eb6ff5f287d36a2f0323246e7a7e07fa9fa84d16c5de8667c3e9b032ec2fa1adc9ce327d981ea5bab8ba6d3dcb2767d8f2c00f14ec24f7352b1d5f8fdf7682554dc15ae9a99990b837f692f159526aaee63d089b7f51b1c0518634413998f3950ee44252cd7484d61442aa1b74efc040a9c4c011da6bbf4d4b59ff4f798118c95905e10af4719db31c22e051ad491795e168f967fe3a817ec0e43180e318bd9a65394632ff9745f812237f2db623a6b97a4c66242c6d395da1637c89dc242ff6cc9f575cb98962469a5a2bfded2f09f910cfc7538aed13ee3ef1424d69b1d4444253e9b8e9d5710320265a901258beb66a434f7ae013ca8996c83f84690aa7bacf5610879cb00a187c0dd9427dd1b04de958c09da8d +SHAKE-256: 33d8950a0fc29cf0d7a4bd55b1d6c1fe240beafbed647d2fe50b4d6b90066ecc0a9b87de9461d65e4e749f7f1adc11b99dc573846c2d3d6a69cebd479b83b2706081a7cc90befd49a0f0ada6bd527dd0ca7d3fb6a3dcb0a57cad89025f1b26b75661a6740a20364c22236a327f050203360632f0a7046b618892d9f2cd9f98078e652a19e766fb764c1623e2b207da66eb618560c90320b2668d5033a5cae5cc3a84c62d1dbc84b1e27ae2a69b4cbb0cdf3a2058845014749d1fda1f7f617c05bfbd66d8d458a9aba85a9bdf664b39623beafdf5e13f4126915251f1b70b05e30020c1ca240b1db33b78febbffd7ff1eb53ea04edc666b56a717b972171bd23f42ad78a9545cb2b48bd072988477cc09bf72a351e6e443f042f63bb249a27cd2e0099055de4fb3f2a7b6205410f4ced3bde016b58e43946b4bc35d16b8efcc6abb422ede02a15e3bae41b0f0711bd0ee684ac3b04c76580e87350a8676f060dcbf3d24b7e41c9bd1ee27c5302b21ea8ee678e939e3fe806e8457829902330f9728cdc857a7a6433ced084621d5f1686a8b1bd9834e62e505b77f59f6ec4e41bb0d8596f5667b0f38e858bd28d326d3e6044ee60aeac5f1e5d449202c05180cf5768066e057ceeeb9d00d730ad31a4b3e642c19507bbb55db0198f6d58edbb8c30c6d24ef25a4ea8e8d3d66d9c1ad3a231707a734cf5313dedb3117fac53dd1ad + +Input: 982d52f8db5b4508e8189d045b135ce76e82265ac654c124126b97385eecf167170a8e2af284747b8353933b00ad8822dd5ba238d4b7cd11ae11078b575a2159ceee555d65462d57c86506da009ed5f28616d6c079856f5715619bc750692a26c3640756180a497b19ba43922b2910ba8c2fef0c3d8580442539d7a410b4a653121845d90efd990c348d40ba2254f9ebabe44908ce316f5eff8433fa63e28007cad4fd404a7f2252be45906a62e8962e7eaad9bb0344940096eb1bbd13bfe22d45599d7d1b4687bc30786c0cc3cb179d59359983f2734a36bbcca50034a44946ccaa2e978d35e42679bead2711db6e2cc1f1f792fc1fc57323405fa2454c55a51af38a51b9c296619222efadce9998f9bec8611de668e12b5d +SHA3-256: ad5f76deece42299d761cd7e7381cc5372fca0de6ef2cdfdeab1a820acf22232 +SHA3-512: fe9dff2529251a4e420f6441c6e2b1c57138053e991477549ee70abc6e9c4e7cd7462bc3ceb290b7778ad9d7b674221cf51330b5fe87f45d39d9b38f4f91330e +SHAKE-128: cccbf15a2d7024e27be1696fb0acb73eb939abbcc65b6b2e0e9a72e1c1a84cb8e74da7fc78891ac5bc6b3a1055c7198eedf8101bd6b980d19c89099e37987258a5cf832886a18a68b3768ee286613ee9c754f047b218ba44e2fb85f327e695c633c3c74b08c7a8eb9cb4d78c01fb0ed1d9d23e177bc942c9e2db2ab64bc2589b9c5e49795e5536ff179ee83bbe3f996f27f459607dd8e0050b43063da9a75d600d92bc003da2dbfffa316470ae9776221ba227eb5bddb7b5bc6dfd9f07f9cca7ac4e78fcf8c414bae8b8c408fafe701665fc8cc30a3b91230ac66554487bc5feec9e64b26e203e6e48ede876af8ed22f1ad0b9a5e160e1638f26b52ea8e860082ae285d4f67b8786bf2fd4ed80e4fd437f94b2df623299ebbef97ccc4fd7249257099cd4a93486307ab5527ee5661149a123284fe8b3bd96a1b0c475187142eb29f7cf56d5701d47f72d30f0942146c138fdd073a2a619787448b10303e965107bbf4615605802fa95e91024a1e4701e7b17969f3112a16cf562d488bd4de95f0e1c7a20a18766834c3cd58ec7c1fe49414077e4ec24caa6434d219569ccb54efab5367da75ffd7ce3571a1437a0dbee1e8d4d2f2cd1d87d917ecfb09d33a03238a3d6f19e50bcb2fd173bb7f45f0846cb6cebee818e62740b20edd3aa47cc0dad3c908c581b59e49f26c57e4204c87fa4ea2ff1ebc861b979fe5985938ac149 +SHAKE-256: 101cfe9bacd2831a4b3a6158f72fab1f17db9ed21b8990b11b36ad0d8e34678dda69fe9bb3cc8cd51d0c492d9763b1bb6318da9d5b3a4ef4b915e421cf41f0fec3da01da8dd6fd2a7329fc3fe95f951ca191000c2173507ad7f98c119a4add043d5e41ed1439506da87e51e3c4991e0a86cb1f6ef93770b30522c131b4aba3ddf5f46fa507f869c9226e89d94d3315c60ac89cecfd1e493dd4c0d3fbac64483396c3c5dad300226924b8c6f9949845b7a24133ffb42e165ab76215205c0c8f3e36fc4e1997205b09f3008029f60820a28f21d8f08fc9e5b26f20b67fbca1e0de1c0c97bc48e7eda9e43c6dcc7eec7b6edec93081b7ebfcab874f6b4678c36c7299e279cdde7388556ed4a6bbc601034bad84637eed67417bab5632a6d8e6a0647dead8d68096fe5963d4fc30f8090a900ebaee2f50c5ab2badfe28247073676620c606bdfcff216d5d37f8df956a546e63104791156bdba748ce7ddc4da82bd7eed66112b86dc8f49b4ed64e723edd6fd3f5ae97a614310c9043c1d3345c3ce6fbd35d91782408db5dce39c43115be349683e8a461045d1a0479ad4d729fa01b8d782f04f585a6537e3a9704fdf92dd7d9f1a9b848524c32c8ddb12c800872413c9e88c78926512a0b2d3c5507adb77525dc2e974eb62b05402262def7d86f6b45c93ad8ad87eac2c82f9bc507be4fdb58f49b3ac0bf99ad93b55d06d6d15ed8 + +Input: cdc7d095efca120d007355a2895b66875c9cc22441804351f2fb09d7d90b9edfd967c35cebcb29d6c1bbbaa8dc69af061693717562151afe071522cedf04fde0f1c9eb3f28eac894b73dcee5f779bf9596920419b5b78209e318149469da41959cdc8f2150f76c846b41702295410a63816592cbc7c08845d44711417494e102b9efeab8a43d8e32eabd73db46470002a4ba6eff8a76e23986ac333739529e4bcb33b065c6886610030ef777efb1593df7394f8e0813a03c107b23f455a34fd1db3c82386be2f885931d8b71c39f206fc657709040fd7e799339e934bf671099efaf6db4633fd6c7422d66995f27b48642a528a7b7829286b683613c74f240cf7cd01607ce58cbb7be61a548bc0df1dbfab32f95e9037fd16a14 +SHA3-256: 0b48ddf496d546e2e26ca3872a026073de4acab887a09cec2ddc2d2d5ae83f73 +SHA3-512: f0efc092d8483f54518ac283350d0e3c7a99847345fa541a1c6cd0e49224c7326c77abed931c6240228c5c6ebb75789a746f0d20afa368256c0c9474173bdebe +SHAKE-128: 67174861230db049a88681bc7be757f2216fe519a04574d5bc822f18c2e82e677356509bf3f541e1e5a1a29767cdd19d815dca663303f39c9daa8598e85f7100b98c041102d2ce2fb0ef17233ee5b0aee6260899a32900ef7e328853a136d27af732f2bb051947fcc529391016eb12def1fa8ab82dc3c4757b703840f7765b49b7fe66df5fd4f200e619158ae78201dd5c5d9eeb1b0283618bf8a54a39432ca6445ff593006ca5222c0e8f16454dd10b8e80f943e279cbc4bcbca73930340f7b523b71c33800b46332097cb05c751e2f7ffd125c3f5acc0972318b849df72ca2da1f4d3265ae1cd7e40bbcac57cbecb9a91bbc8ac67f87fa52dcd789e69a44efe0158f67f6599b5675949aa1d1e9e821e31211fde863ea6e5b71b36f5cd927e081a36dceb5a178cc67a89cccdef82543d2de8bc64d70c479667a12273f0ac5814090fcca026679258d83d9218202f86ce94b4593aaccf34afb1d3d805be2f1ed37b0163aa87bbdba93881ecea6e124036f8aa9eb4c07962bedda4e87c0a2b9951a6516906a1721ff7c316bce5858c072753e8854ba5e653919143188a0004f296da05d5975e7270c77d689d4f18f9f2801d6c5c344000d9a7b5c91d3f357c7369488d1c7d1f1029e9523e20e4ef36adee0346cc8efff55826fec0c693b5018b0ab190577e2d44e8ae09d02b17f057d16ce3651b9493ed1898f7669ad23d462cf +SHAKE-256: ed7a69ccb1d8d51e984d8212ceda3572fbbbddc118d26d862f74675eba3876bbf3fe7d3f858dfdcfe90a343372eb6f378d7b725c15e183b82f1ce7d1257a36e135130fc765dd8d17ca9c1dafaedadb7a76452721e13338a1595e8cfe37963f4636f3bfe72bb4ce37afb1ddbf9d783bceb5c1d97fdfb9c24da3ec7df488fcd05f3d805c3b7e7f5662aaa5f41e686545020431b2aa5695f097ba83b9e8c62ddd622bdd64888d4887521450e4967dde86646a3e9b1a5ce0e83f7acd27c078a1e33cd771301727e497910afb8e4542c4f842830830fb707646a2a039ad5c084e63fc36cffc2923c13f89c987b92d0e4903c31b629daecfeb7b2ba7f752392d2ed9ba2300787daf30b6ea57a9e1fe828dff5ac320e050dd28ab51342f624126ff2a735f2ce35fcb02f0183acfa28457873d2b42986528d3aa03d1652d4d3ede3bb733f6b0f51e9ec3727d492cc370af58cf7d8aba4d2b5e7d5ca15f18824321bb7213e441ff1180fae23c9005f9590a7bb874183b6b8680fb77f30cf98f5448da12aec7ddf921659c7bbabfc4853e8c50a8240f6e8265099e9c199a6f29c6b1bcf7053c36e43e980ae4f66a252636e1a87e4ff4f7677e5d25a2d89fab0911e4e21e12249aeb8a3f291179dcf8d3a5e52eee1119b6a67235370ad0baf9bd48d5fadde24b95b7d84909a21cce4300d7ec045daba4bc49b7b7deedddfcef9a0d76079008 + +Input: da4b2b8d854d4b7d4ca5d5a6e1b37b6536e365560466405ae17d37cc9b66eb6b93ddd0de81847bb438db1db4467296e3769ce81f409d8bc451e1c131baa4a284a5ac15a96f2750089315e0bbcbe1c8b222fd6c1f918d0b0b2bc4a0240f9283cfa7feb83d7c1412ee348816167bea1ba0529f89632cf176509cc7a418819f128dbb6eefaa61726d1027d71704f9f8e63e7255e7fa444e5acc18ec0569947eb6bd6feae20514d702ad6f3d5b7b0830ecf11fcbfcfb0c2a4dcbe8cd996cb4df23a4b15bce66dad00f1d8296b272415bdb9a49000e903d35d9def2b9b70ed3bdf7ede3bc62724360c792b689de1d897812227cd63f70b157f690c1a887e32177b6df15e06c6d1848951dcb8c86102a7b246a84799186f15c39ed2e26e7 +SHA3-256: 97e0a7596c47a989c1238b775085b0662ac68853b34b8867202dfc48baf63d6c +SHA3-512: 4d2ff7f2dc60b947c8d6df387c14888ed3e44f883dddae2ad42bbdb2146c3cfa0dd8b7508937aaff71038980abab46ccde72f0d6f3c81183798a5ee3464a97fb +SHAKE-128: b683ec0f6237484a26ebcccf7641b49fa5812c67d53d508bf97e58d044cab18a044db3b827e986e479ea1d2ca67660ad9ffae59d106de4554e47e26190a3ed626783b4d07e28d52140be785218c2e7b854bda8800a1111da9ec96b809027dda6763d4f0d08288a648afd8377dd6d91f553fc9595c056870887dfd2f1ca31d46415d0ff3b4518578961a79038b93bdf0d687499a1db051a26c9900767d204a5f9bfd70ba343b0b86b872fbf17124a9c1b997ffe4c2aa2a8f5eda4239933d435a45ab529c6ace427658ba083c81cc023138a0cae2c107f8b0308eba0706cef0b62eaa336db00b3e8f3bfa5b148c642246990611701e4a3f39ff09dccfcfe43b23178ebe863a5a96e7d21a9fcf9b55bf59dea794bcf70e3267470e2736746ff39de186c26af9194a672ad79218c40db5a37bfef7eee3b7927bb7126ddee867bc727a64b92a7b59cc972d10881377d97f9779977ffb3f6c2aaa6aeebdb990933c654dfbaba599479c1ced6529f01de2cc630634af8a262cf9cac590f904027862d358692c8496be501086fcd5dbce19989066e3f61210046edb60040492979306b545747d3684818dd8f4a833f149bc37a37d894d212df80a645db9a15a74dc12da632c14ab090698d88592c8cabb4fb5283944fb7f08537b3a06028b8249e8ef67f1d37525feb42d61c40332e3852d134df8c5c921bb1e16bbed5147025c998107b +SHAKE-256: d2c92915a0488edfc3b4582030ad111b03906d374b0e22b9cc3de998e093bdc35539afbcaaf9893d211d2a73e817bce981cae26028f4db5a20b294f63f149ed0816bb3d28434b01d3eb7a5852097d4b06f830d7700b50d63e8450f40ea07a83bd24fa597bc23307167182bd3c87635ed386a7aeaeaeeaeddd7c032d3ec0fc00bb2bb7e190ac791a310e3758e6d92f14a6178bb5737c3dce0d77ec51da09b8642c51d5b5ff69922a0414a83baf4f7429d4342b9e9f284a356d2644c43ebb9fad6b27a6fee942c0e618fb645e109548b2376eb058e3a42ebcb530755ace8ed32cfa966b903f75b439feeeacf44bba3c28c9b4e2ef016ebcb884cb056a34023b3e50fec85a3dbe7a756aa15eda6d57a9e427b95e78420a00266ba5a50e1a8433bc1eb2a9d9445cd5d156377b766fef3b106e04ace461c9754c1dbfdfb969cf6536dcbead8bfba49d1c53dd61f7a060c9ed49a9efa8c3e1e6be41b2cd6a54ff4b43165cb07e254fa3168d4c485c67418a1eb63cf5989a96ec232d3d7a71da26dc3d1b0ab4aa5acebe22fe6696e9eafa030c860ae63330ebf58c5acb03500f7c0ac9e3a3da7fdb97b9f417478edb40d267532f233cb31f40823391c6ca20dd7d58873b8c00e4393ea471c791d9c168016bd4c7ea9de4402cbc6a9909115dc6921e19f8990880e28f01076d6cd1f25efdac70d44682bab317a9b723c4320c0a983fee9 + +Input: 40857ab5b4749e0637ebdae9e087d5e8f126904f8cb613d10c5b1023b9d6d6e4508af1033566a0fd75b3107e0806ee13b31659fb287633ac093d19cd58480e7273a84a5a59ea1966088e0b8f6bfadb2384730028804121896a9ca5749438bf71c44cb1b585033c43f9c6797620cf890ac7834d10318e41c531a26b786c3fb1ddc3cace2ac8e73680d1336e1041450d48972d7db2294f79f03917ccc60ef6be063d92863b283a0707f1b78d8edb7c27812e5a0e42a252e2be578123cb870be64a49305a323891434f79c4aa1d342a167c88722fb3037f72dedf5db95b0e6fe337c6f84a0d829511ee574a190e97b5ea01bb1ee9b9d9375255939aef09c6a1ab9e7574f35a801f4c557f00641bd01ecd4c30488e43ddb7bc07af39610e +SHA3-256: 426af9ed8ec779b7f7d1ec165b29c6405e79e5bf8072116f45518cc1477fa055 +SHA3-512: afcb19b3acadf18ac91be9eeadc2e819f359e4e485e42ae3d52e90487b66a13c0e7d694573e32a815874d258c6e26d593576c149fa36f45a608f716604210511 +SHAKE-128: dbfd0ae4fc3a6684023c5bd87a05d5c14f94a589a443d83ea08a6dee44310464bfda51b5e4e3beae037e6e877f568b3267d91bd6c6f0743a1eee48dbd8f2fbd6b495ee82ce8d621477fa5ebfd21de7807ac68ce700acbd34922a575490aa4cfac6c97ede9d900336f06bf34e81275819933f151cb8f6b5a6a1b0548fdb3775e4e5c032a8747c588efc940ded5b052eee71723f843f2fcac53f15a897bac1528a10e63eab401b794de3cf4c4fbe8da585e41bbaf89e8fc019eff0aeabf69f3db26f0cfe180ce4aaf86ec3e1671a7d54a1db658edbb6a4932c20c34f523a0e59adb9d8df3beaabfdbd4b02369e3e7ed51cbd1aa8024c0d91f421ca6080ac2c78667e5924a3bfa81a75b1e5769beaed658572438220f54cfa2c857c434082209a5b570f05341eebad97afaeeb93e3851a5fdf52652df4a4381c37019f79c59c7bb52e497175b3f1423f27b37a4d0c046094fc5088a328f3889029540515253508f20aaebef0c5c652f19d5a45f0e9822b56a746a2941b58026fc06917a76bb7c515edbdc9a4882cd78822ce84f5545205f97ff3c0c74438dd6381c3e7b8c6dae0cbf63212fa978cdb981cde0402ddbbf694a94d6d1fca014608680142a2404cb4f869e9183ee83c2956720fdb27058106fc8b06fb24eb726ae310f26295c3e5192404eade63f20115c8c01cc06b2f5400b1cb7c5f953aa0ad10fce525a4a3a3e5f1 +SHAKE-256: 8b7d0782814c8d5d918d7b21fd6a8df0c47e7c607c7b55507bfa7f59282585d138d6bd4d0e39b38c5549038d0ec22cba09251a9d32cbd28aa9aa5bd559ca62a7b57a5ca5d4bd46eb1cbf990e4583c048876b00bdb21d979fc91cbcf5fa8a48d1b1f051bef726ed5ac6ea369eb6f7433eb09f6d58959091496f5966dae57e8ad3e8a6aa890e903978cfe163b40fb1b378a472866fb41bfcdf8f6f64c01a3c350f868db8d5d1c0e42a886cb526d081c0f91c932c36428ada7aa9254d530909c7af414b818e06a553cd5102f8c910dbc3578edb07dab74630956a546a6ff7203b374692dae40aeb0b402a7990b3406cb81b8b85bb98fdd491767c2876fee5ea2dd3b4795d159abc049e9d2763c07623026c2425a86dcced67fe86947db44986f59de69cf38a6344fe75bd002a4a8a5ade2743aabea92306f5ad1e81d590bc53190789655fa60e6530ede5c69b100b10a393f7763b46c24c60a19eb503fe79634a4301023389ac1f875e0736a4638b56edc73629d1c45fb67947e3cf2450bad1c7034a3caa4c8970cb1b4741856b5ef3c021ab5570c90aee5edf72ad86bb3b2ffd8f706341df08e4e38812a821eb3fce9e0693217406ce5ed992997d0ff0d529385cd15c6f689c3b0b24f850e19876d04604af386f72a644678eac55b1f8fff7802d07dbc56af17c292fdf6afbf71042486d1691172aa1bb463c089f231c6298bece + +Input: fc9087e76eb6d3d084e801aa83231e60687b9c3fa6d04eff6945480a7458fe660fc0612ce552c72f0090ce99083043b43390a63b351a081c0e2f089a8fd290b9e4586cd199cf9c90f1b86acb9be31eaa78ae32661e2e1921b7cc3c7977840bf36e1ee9bba0f797dfe456a7bf82267ec396212651931949b05b81895e76135219f9bb1aed88c71495427eda3fafc1dc4ddccaf7be43043e82ad524402f88fe2b925524a84da14a99ff1624dd351f8eba7b188e6f354048972f72ee5f3600da9db3c1f573c27fa1d95a7e5c2c9b233e61202be878e3789abb1c0a5d62182497c417d1ebc153edfc0d3ba3ca28be8e0e8597d3a56adc1c96ab8af4af3eeca441e8799a3b85691af7f29144cc8adbf391f800e71ba926a575151d24c898f6d +SHA3-256: 429a35c46b9446e852b2ab200a426ad3c83001608badf0cea48e67c066e44001 +SHA3-512: f70f4d8286e548bc52b4c0b1dbda597bc35cc4af0b9a89afa82956daa1f617c9db9c913891f9bfda8360a2bf9fdb458c274463526e42ddc36c36aa916987e9a5 +SHAKE-128: 5b015f3568c2cf39f7da83058b6b89b96379e94101674d6c6370e2db5dcc86c6ae862b8ac8cd675274604c796770c25ee632b3790e15793bf66f0f92c2af18ac92ca2a3d648303eb74b9fe7b42454756dd213a0ebc14c4d9f157441c15e8cb1cc253a7e2810428097c310f9a7e052a9cad45e0f2dccfcb388c3a534fea7e3a9be6c9729eef9f2e1d7ea6e1b3345eebe4f8821d246ce252035ff4352c8640adc948d7f83771aba70fbf4baadb0d3ae6d88e1da3496d4ce1d53d89e52e3eea46af04d01d809c3ca5d0aab7f671063a75d02df91a77113c3011d108a2601bbe88856e9da62cccf7e7f3db66aed7cdb4c462b4afd4e65288b5a8a182eb7af82491d1e8042e617c93f847aa3d86e55a3bbed77c8fa4813f82a6c705d42b82017e466964b2ab5da536d92a7248971f497fda6531d36d0a7c2065a600ad7803b2643367d90e976ea54f4be0cea31655c5fd88b0bb842b9c7d287b3230e1b3e1c70ca32dc56130ab095ec3d1bc7a13d2a9d1a5feb0f699670dc741bcdf8c5481731c5867eb13a2878c3d90b7405266da0a02cff2180ad3cbb9d716fdbf9e5dd03ff10c02bd6f2a3734bed3d9b41ae1b90761594e906debabcbc5eb559e6bf14c00d842c3614c6cb5bbf50e73b3b1fc169cff836eadf82632cc98b3bdf0c5fc064f66e833a224d6d68b343d746fb285aa8a99ab42000be32745c7696bfb583db4db36ed06 +SHAKE-256: a0c8d9acb9bb4a7be8bf16b3c009635d4acf76f69c5b1395b8ab5fc72ce0a275c5f019eb82f87cf48e99f75f5a74d77a1c78f9089df1737995f5541bfa410e489e54c81da3157cafa62388315bb001fadd90f851c83d92cdd40b9da3e509fd2c7b04f4fa51f3037d593fea5a87a46e2c58e4704434e45fa54091f7340aa5728047a451febf82075d03697b26e57eb9818bbb84d621eaff263b28330340a71f0cf1dc69f122f590bd61e8d35b89dfa0064519654d13029244c7588d9426320792628538b238672ab10d1ca55bcd27823a3a11ece42c7bd63e74664e4b9a6848357789228e98eb5b5aea74391c999202fae5196bc3e04b17cddbfedecdcbaf3a647d1948d12f98f717182300787f4774e1e78e8a705d9f2bb20d43fedb7ce7c7227046e36f51c8b191e8bab7b8fba1d38dd4a7c292c49f072b64692cabd90a3dc78697813e8087a974f4c516d39f15f02d9a0a97fd02b7cf3ab708ef99985f9858eaeb0a7b8036a76717a135334deb07da45be251d2105ccf4f654d4e9295b2e1ee0d25baa23d43a4eba396d5f9f89d243b6bf13aa01ef629c87336bd7fe3fc4d0ee5360b4cb4b531d4bc15c3876bdd502a234a811278c76e0fbb8e739190f51410b41aa3c48b4cf8dab173ab00e1fb8b313afcf33f09d7f2dd5b86d04bfb8f7b82017b236d2146bf54390cad78727f10229a8e2fb942ff672c98e39304c17fdf3 + +Input: 7fe6cdecb3fbf75172db7a52a8cc6ed24b110147b62cb74433d44398fbdc24e392f1f6f33fdbce5a09c7eaf37c1f5d2dcaac0b7e291a3fc334a3536dce351a7f137e7251363da73c0e8361f3381ab7da0b9e0d21802ba80c24630f20207c9d89b775d54b8956e4da37dbf6b2523aa0af71fcc59cc9e85a6c15d1e1e746688dbb2636caaddb1b01ecfbea34dbd3162eff996f84c364866fe1a0624fb5274d6ab7769c6dd97e7c5cfa054c9711812a605cdea5d4a821f90f3f7e1b672d725035c0c1e3c21a3d75a13d90edc7db5f8e7f1893d31251059788d3191c8b1f9c430dea210d298d8721c61eb9d3f5cb77f9fdf0870d154d51a03d6b3e997e0ddb7c6bc6738265a659ae9cc24e5d59b5d60e9af04ceefb31c6751efe3703fdd3bddc +SHA3-256: 6d48c9735c7361c018094d02a70c28ae7497d2c7865163555a61011c90f1365e +SHA3-512: 901e829d81ad9506b7d0d4f41ecf450d2f36033c733ace8c57b8b88760c14ba489190894ded1721292bff6e830c906cc5c228436effc2d08995bca9bb0a13da4 +SHAKE-128: d55b433a0722b64ecd9c1475985eff90dad60bbce50cdf7be42c565b9cd3152a32ec459bfeddcee895004bf3de4152f578217686c1ef0644f76ed32f3a501bac1389b884637c4920e5bf045e8dc2b0ef60cd335d6f0622e66ab1f51cee1cb393a91f4628ca8eb7a71e6754c593bdfc5ac00c78111dabd1963c39e55c1907bdc47ebdb0ba3ab4c48af868a4f8aced18237cc04f46e6d37545d1cd8d86742dc317fd80b79bf34359c5038fbd61ef88c2e648584c1e9400634c5a59f61241eb0ccfd7c61d85da6dafec56839984ac9e802f0df559c405b72fced4d50678e7ac7d08ef9137c393ccea0b93e1ea55f5d6ae7f030d75344ece4c00e047e237309088f7c50a84d7d57aec96cf071b7837275411865eabb41969ce51e16fe5a0640584842ec2c9243d20b7f91d6cc0367a1f481cb77a9ebce97555ad1e879bf2c98d2f20767dff1e673774f8602912bf465bca7440457f664de5c8f7e89271d15e909bd07f3fa3e9dc3c25e05f95342f578217f434b61b051a4f8e3ca97713d1895a03d5ba520a1eda249a5be025b03ef9f18ed2c12d4b2dddac1b04be8aefd3d49f3582d959fdce4ee98338cc434c656d8e0cc7f28f6f7b0e8dbd1f3ea0e7aba39336ae24e4a5998d760e01b54db06d3debb49de377b0ab94177cf16f1b633e58e415acc5c56d8eb6615af5b4331f702cf52bf2ea77664cea34210f2ce5da08eb1eed5b +SHAKE-256: a07c5aeda940a08a4e96330be1874c1f67f641ac17366357d3b8a3d1a0652f314033e1dd80eacc56fb1a0ea366700fc4c3ab30d243d731f83295f19d79dd7a317bbcfdb37c0a8f770200b39c22e1da549b54e4264e00f837b85cc222b4814bcff6cef68779b95f0fb71d3ddbdda9d875f24f8cee66c9bdbfb53a05c2efcc110f019749a860a06fa654b68028a950d9535ea0e53888753a32737625e74ed15d9c099b55794517caae103664abc8efed099f551d2e46e7da9ac89660ae3ab4edb27eeddec4a8bcd13ee871d16fc9b1368a000164375c725f8d2a2b71e03486e2407d2752f469b25f6bde0c65901f5027e2ff2350cd726a0e454572864c926476e3a84db2dad891d786a86784f7fe3353849b90eb39b96a098fe573016a13cf91ed90a79dd0054a854b0ff372b959bef00656fe039b4baa8b07f2ef8c7211072760cac73cb1c26b98c7b84109a36bf1c86d9fc228b8c6a432b1e4d855796a652966648334426462cbaca3fe52ba8d427c2ad1ae522036856cb1085d70435d1ecf8ff7ef7cc4dc813caf3246db578b432c41fe5a942ff16212c7bc276b23e90dfcce1a72ae539dba88003f5eca8012dda32b987a7f536098244c16098b2d1985fc5324a106e5b28a0890b47dd63a089b991e8a2e981ceb726707249d75263892944928db895aeeab269f31ab4e8e1dc1799425ba16426a583b90f115dedf5d89a2c1 + +Input: 541735f7a612b7b762d13e10506604068c646d932a6bfbc79d74b7c632df52ff02e3d43a1d964bbacd132233d7151399baee44ef347371450a5ad45f50c74dddb758a64eaf6b58fbb5475160712c74443de884aaf394353aa5fdfae73b29c9a7017287d9ef9f04ac06c0f21b1f512806743017213bcc8596beb7030548defab3e4865ffc54cbe6af0c65cda66c9002a827ada24d58ac28dfddad903376da8811b5ffe672b2d0308a8a002f189ef80f6988731318e4dbdbce7d532cdcf7fe5241bc13f984d85c0d730da52751005503baf3529dc5812d193c4bbe6b6fd5542c5888184293e2b01976f03b4bc359eb6fa4ac07283b4e913059b7517152d35672c9a233ef06824318a1e8aea302988c5ee9ad40d09dea6a844824c2b705e75b6c +SHA3-256: f54283a1af3836885fcde8d2d1edeefa408d44aec0a3b0219c33c3631cfa56d9 +SHA3-512: a00c4337d8281751f7ac9e836025e283b5ae918cd9fbbb6cae2c08f89e66aca9c36d82047936e9803260ddba07137c6481c8f324793f3424a36f6f2105f35902 +SHAKE-128: b8462bf2ec877be1dcc9825bf265dd18ecde6a861986df0287a1c4380bb611e0f9b222852b4a56f33d04cbb2de9d93efc27d5888b1fa896a53d50c0db34b0fde830f1f35d8349884010f110519dda082e9cd7442e037bc28e34661dc3186c451e356125b70cc4a2ca1ecb2d348c6281d50391c108366d4d5b7326c765dd4d8517321a333491bae1898bfae6963fcde71b5e2f951bd00bc03e94c27d8e93f954c577cf247076e75a6138a6b586bb1379dbe45b842444d5c681b15028e0f20d507b927473604829816fb54beace47d9a0fce6c6a5b66515a682141b333347cd491d0782b7efcd476f9c57d6c1152af294d63a810419c51fe9a07af44a0d3dcb1235334ae954a7d6e4b3d61ef972a2a7dd9fd787e3dd4c794036c887530f4bffcd9549a02622725dccc5d04f91d08bc117d5c76ee6fbd9c1e93f6161d9dddaeae4cb622144592dd8746caf2e34866309288be9d4976b70770d06fdfd94fa3406e064e71f582176f5f92bf5e1af95c45d96a7f9ec3e952b190a8e5f87a2273a62d7b3841d07da0498f5ec5bdc3e3114d2a538ab5d5d61dc739af54cd3465c9b0c5333fa72087857b902928208fc9a110a65ea21b0d63c8d48343fe41ae45dd558ea98238ad6a954825143ad2295ac5073e360f1e5f8be1f9463fca9ba66aab5e375f929911938d949a0df8a8c2b64a7bbedb8acbcf02d5c09bb57177e9e685a99091 +SHAKE-256: 132a4aab2cb18814c7fffa1764aef7505ee0f55262020968f4e71ed1392f0ab38ff5dea14aedfb871a8dd886a778d05af4664af0e8a1bb86b3157b49080d5140c0adb05bb957db8b440e1b3a51b060a942cdc488120096e5a75126b738eb129e05eb17abb4db8106bfff35947769a7a7d0a01277a68ce0ddbd06890aab4424b56c1648b09148871491027c17f766b4ce0c8cc264cafa3f94c120f4b23d94013ed67a73c10d1f185b8dba3af99d8ac7ea46f0cadf033c42bf05ee1a37d88ce8c85c248307759e7fb67e3799c7435f8fe4cf899011d816b3a9a3047df72c55ef3e700f0540625a6e347cf215e99f09e517a59e9e74bcfdd5faf7533e4b449d000ade92f49c6e506be1712677712f867b21b0d0c84bb385d61c7632da9f39efbcb2d6938bba4e9960d759683e42f7ca623abcb8dd1088c91af109b46caf3a0b2299eab60f260c4acb4079ac72c409e00b1f3bdea96b31b72a0507de49772623422ef3095bcd9f6866fb2d4b9abfa4cebc4e2c3e43a410c3357662fb450d3a538de3cfd60f7c77419b055e345fe55f532f73f25285b63ef971b01ccc723a6ff3a360dcadcaf5c9f91bc3e7cca5f5c61429fb27dd53640beb9701d986b5407d2b81ec741fd3f7faa1dcb461b3a9a27235205f9d3403b03b08c2236897c6962cdd29dcd92f418208bf1427cd93316e8c04edda363f7b7fcd4dbaf2ebdaf1cb093fb558 + +Input: 910526b51d4c23f3f31adf694bbbd88dbdfcc6c4dca7cf4c24a49912ad21554271414dd4cde50c4707fb8e04e8a80ec9f0de4f38a3691eb9c1f57a26b441f029c966b9444cd0403456e3f22aaec0d0624ea64881dd9a28de405a312ed7c26620034177ab74043ab4c556c46e3b7f1330f3660c9a9ac1aee46bea25471b64e8cd064c09f62262f297d823cdd7c9f7ae863902c040ad6e494ded161cce4a488cf40252338f4bf0ad6c6d0bbb9824462dbcd29509232d3f71299c69444bd60c3268ae2befc2483efa5e6cd2dc6185e7522b5506f60886fc139175f71c6e3234a0d62ca2a8770497f44800e35057ef4d128893f3bdd58f42edd31fc6dbe5f252614932c266520575363ea7ad55e6464ff32eb55908b4cdf23ed2abf8e889d9b2592c +SHA3-256: c4f13f0158115f4a9dfa7662e2c65d2789f0f5fa986df308dfdbac62199e17c9 +SHA3-512: 03831e79a6e484e0d1ed5a8bf62dbd092cabdad379dcae48d58c04dd73ea7541e6a1d0bd9ec6a71bb8774314f35f515a6f38ea8f11bbd9d4cb894be05df2f0b9 +SHAKE-128: e15041bfcc45eead31440e66ebf30ee2178f73da36cec16063aece4cd93d3e55de07b45bcf2a1067e721e33d2bf62317a6177427b323c241b6300dcaaccae7f3fb901fc7046a1c18e3446c7bdcc23d0e0983d875c05c265637c2a552e39ac4c7c8f165e1bb4ce6a33ea30aeb9155a229ce40623731b464c7c4dc8ba0bddcd0e357952214508640a3e5316c0c70d948e8cebf604ccb4362ac59d78c623df06a74f08cd157295cb8b86d60ac9fd2a4ad7e5f22fde5b1e779c773e7f41d99af984e04916153d6512afd24da3c33247b254872fcfc82ecbce777056622d176113d761e9faaa4d3c14ee7affeb0b71c25473f2bad4b8978d8402ab9b049ac96db48a51167dd5ae452d97b2a98b9b01434ffa79ef39b46aa67c724dae1786dd7e4a78ee2539464e7fe5edd3e45fa4790159fd4ab0a87a800e244f21d9e40ae666199190e0c3c5d6b4b205245dc7f7a098f07d346067a2e2fb000864df0b0b58db6c8361db940145ed8e648fb619b9b0251886c9c73c34c2f9e1b1c2aebf32429635893b24d2c84a8d82173555120d7d6f10c5bec680a38d375790418d5af6e25ebb89ad8bd6551d294e5e7112d5283d8d63539bf2873612317e4b82bdfbbec15aed5d3f0388302a13adc764c5ca0d6d3447a5038dc8584ccf231ce97996501d8a0a660732025906c6d5af85eeffab39affea62fcefdd538719f0ff9061e0b1942a20dc +SHAKE-256: 291ce7950a62b19123512740d9501c5ed03872de11d1dc46a6d45e4c41286335589869c05ee8e48e6502bb3b86e2d7ebab17167a6acf714fecd94ae25a38e0c8ffd2bee4a3a97db197c514aca41ba15d278469b8e3252d4bed5681f5550e151698b821cfc2c2fd88d17d30baa930df00ea26245bfc02c64cb59b98adfcb57a56471355cc9d3da822d4a34b166865315af37422fef77b882e4048ecd915281a6b48ce057f303a9b5ab447c82381c5f64976cc32eab0c7c3a2d8d83f5ad3025a40c96cd7b90fe5692fa9a0e15a1711fc0a3f021a8544e731a08fa33648a9331ff6d09f7d624c299f68105eab112079cee143c45e8bf5f2f8b1748d82f951c0603ddc2107bb1582b8daae88096cb1955e006743f95f7b6c3cdf338c5426f693ae7d372981b8a99688f2baead3bbc52dfe3b63d552e8d51fda2d77390adcf5c38d8794232faed18cc6102caa68a64e5bdb7e6257b7b48dc09ef7820e8b59760b3ba41f5d099d04f154cd77ee846a2ac14b9ab7d27493f35fb2387626693b6e8017ab8730da1077071ccb754a87f548498aefdea820ad80640d5294bb6afcbbd4701f279e3c7a1c49d58e598a2f61b90bd81d3007730add991968ffcb4e9b9587bcad5955c1d5dab585ed24e29ef6b7c8170907ad1638c711db9d68d1f99366c58025816604eea42d2272fee53224b65c11fbeaa1068bca9a9c7e3f9d6f584e03a9f1 + +Input: 7d05094a1f3da2ea13d015df2e188f69fb77b86143e36e2b8c690c29306e04e3c27734efdd2da418a0e63bf4a03a3d3be49ca2658c4b8486bc01420a31112226ff4a8f17957e1a6d3eedf6778cdd88f786a6c07b0ad2a316f38b82c5858dbceca7d80d4c8992c10a858b7ba1db88fa0b9c276e7e5cf647f2336125c0114e77082952484c73a15ba0ae74dab3abc7717b51f14c72ec97811e5b6d3a7cbc832d2e186ef869f8ed9edccfb2052352b77e9a59fcbcb7972bfef66d3d3548d961dbb5a066be89956ebfa1a4c60a78fec5d42b21e98cb9b75db1f7b491393818a593004166647aeca294f34c1aa3d6e1585fa75bd0d549a81bd202938192b3ae58a6cd872159c62dbd93ef94e7c54462fcd99dc52b716768f508477023c69ecfe455f585 +SHA3-256: d4626138d0ffba7b61806c35351a35c206158ec43e0a6793d8e5e17953c9e573 +SHA3-512: 5f5c6773353c716be2c12aaefad8ebfc5cbfc1df3a7544fb7eede6e18e5a4aec4be35eaedcc8b2377eb88a7acf12966d60feaa41a29268ac2cac749e0afff414 +SHAKE-128: 1030cc4c9e3b8871b32584aeb457b0cb97c259e9c8028e5916e7dff492593deb7f4ae35c10df4290bec9b23d9f88589caa36f3b280996faae28702cbf150fd7def3d556280b5a232b91e1f1bfb4b81e9dd76d7940468f4b5964876091c2ecdcb1c6b0025851f6539e3ed81b57ecf9a0c434d917393b273c2134bab757fbbe4aa669f82570de80273ec5cfebbac0fcd465bb6ff99710aaa6ee4b1836d4575ae56a56086e834e8f268a0bffcbe67f2da11a3a2dfd20c1e5ef6212a19ebecaac5a173ae60d71d4e5b8446c6358a408b46c19ad01d7d9b7ab3907230f72971c0b3a97d8dfbbe565b2ad6c61d54401c27e7b52a20233f01179ed7e1d71e7ec438e3c8e81a2fa1ed9e4a9bad05b1419f5fb52801afb66ac14b28e3cf35c309a2f699f51e13bf19a25fede71b9b0f20b5ea638b865706bead8a317c90cef42c493e5146cd617d7c36b56c563f374485550dce7298b12ad84e6fb96269c61abcf0a40ecf89341fc30b77963275f4d3f5e97c289db9318aed42e78b54bdafdd47ac88e7af9c11ad675e7371e91e4edcb16bfc763d7a0c953ff05d99e230ade52d2a795cb80988df705c3b31e0628cc885b120bb318436aba8fb4b58141742315d6702588f4cb9251fbc596d199c3a26ac0789505c65f49b0c104f0373ed18ef576b346da92b7f368cbe15114ec92cc5458f516295560ebeff56b6a1515928d67de3bd0f8a +SHAKE-256: 2b79d4d4dc9303aa37dc85a51ec0b76f7dba9a05dd7e25f56704b012427b73c8861a7083e57c09ea89eda306f914e827210b7301a4f91b7f90e438aff0769521ce4ee9cd684de307e93130683701d14733dbde1419280b3b6d15501b282be0acc2fb42895bdfebb4cf64dcb13bdfe26d05e7f6c38191b131e34fad47747ebc790042157e33178fcdf85f29c56d0a09b6d5b971e9145fcc8952a0f477e7bac152a7492092df7ecee94b49c187e36471eaf4278a5af77b1cea7bc863a82a89fbd3d8c3b561b39a70fbcb4afc35f2b1620617c544e788b16b81f809b2746d982308b9e1ab5250ca7640160aef30c6d293f847f058cdc7f46ee422f95b8094e1af02702fae9b47b6f7846217b076b981fc52ff4648a36be0b69c15f3b9f52980c06b89cef0ccf80d9bbec46e97e32d591623c66207517cc609cfbef954d9d88c88f625816dfe32fdc5a5eac769471e64224d98f73fd533e6a4ddb525de1bd9c5a5c785cabb2151b796cd114e8cec334ff22bd9915bdcdf711daf1eb9b967d9c830b40651bf402fdcba20164407c08292e50ab3e53b4dfdbaf2d0b7794dfca04d360ada347ccc2a7ca10b60043558305a44ab94e94e77e4f4eae89f758b29fbbec98afe91cfb6b4cd082773f02f03481ac35f5a2a6d67047ec6f1a4cf9da509db9d03e9ba3b1b5b9cfc95a3b62e9298a4b59c572f48899a9e7bd94968d49171ec5569 + +Input: 8d37257bc1ce2a74f53802fc071c83faf2a1cda4916cf647473872e5167adce5afad92706f092ec11bfd40f44394e3d3c5607f3d1aa6258603937ccc85126a5b284bb11ae06211756c53c752ab31377a224d27d46033758dc533d731e4f49ca6c19f8d4f07cf7627b99699255bd1bb44aaf6075b36ac48eb884cf09eb5ad25a6b1b5afe5a065fc31d2cc54bdbd209b2df28a92e0427e30e2471df570777d47bcb4e5443b031ba7f4f564e85dddeb7112af4111c34cbacc97e7b4963b564c28bc9a966f31c63263f12b6108519325696b2a8520fd51ecf9555509a19d448ab202feab4398b44f78172d11e0bebe09a3cf2253ac7fe1f216765b0119dcbf95dd68825df51384f36bdef2bbbc3dd45e01e8de39b1d28365c0506026908dee93ba13d9e4 +SHA3-256: 461b8958af44435623aa915394b898b2ec876baa9683807d646c0ab3e3363940 +SHA3-512: 38c6b98977513c984dee185bf0565867e4295e2714917135edccc65a02102115831b60a30c1ab1fea81b3d28b5dbe009373db9fe4bf9c15b6f3231e82e4df58f +SHAKE-128: 838dfb304b91679daa626a2e5ea75d64ba50318c3adfb4b05ba4b9f232ae3a2bcd3f5082cec9db146350d1672f136a415730b2adbae96241ed65d858dc52bcf0a1049e1715f24c5275c514423330db10650486c0940a7851ca6d38244fcde265c15845635c355255d0ec80e38ae3a27a9616f9ee2e3e8f62235fe457dc3ebd3f88db51ce3bacb32d5b4dd4ca06f9162c93139e10e99189d5407225c898fcdfd14f1e8b7b154769a3bed3fe1a2e4cc5baac9bcdfcfd02beb217b66a0c7ae1d6558ed2138dcb9c392250d312c307e8702cb60e3e3514157e0720715d6a0cd0a71d246b78a8e5536eb81017b0642a643d97fb0c84ac6b7a6761c1dc7153eb235d7e2c9c30149e820dc8556f50e7baea5448fa9a317e1921a37fdfe62567e4df3e471fd31463f4df66a651b4aa5a1bc652d8e17f0ea069fa93933a306289c5b9d42652e9c99503e05563d947ebbc19e7f60f7d9e7ca131f9400dd16eb8aab40ecf30b9e14693df9c91d5f5073fab6e2b5dab702f537d7fe8583294d04e306f13a57f070a8fa353bff58c6a8b48f57787f98d244e22e600165b09904d773b2b742237d26f4291538b398945a7bea2bd400bad0530bb5d5836970ee318cc3f5566b63b0899c4ecb9fc78f807781f68f8655682bc16aa3721354caa80a043fede006fb2ece3f8fce692d2d8a91fa784b490033ecf7cdf5eb4aa05d520007401a8869a48 +SHAKE-256: 967db108d8c66c43d77d997bdd5c6a550392b5f79a7ce4b8cadd7c20fb5416be483f50bfd8ba39e69994d2b7c5b96f24f66fdcf98377e21b7d177a1884a6fac76f4a1f689ea7e566a23176c88f70757a69c9eac9975e4bd790a7b5e640879b61eb0f39a7089f6b6a1a74d14eeed179b82b533edefe0ac449f6b35cb36a9ce22135d2563b9b6c459b6cab9850df05fcf1be408aaa4a04bab8e5070e24b34f174ef20248a910fb06bafbcba5d23fdb84cdc0b3ff3368e968e1accdb2405400c0aa7b40cf972339aabc29b6b45af1ee9ab6c5fa896155f7f92fa90da168eb6be1d4c68aab2eb164c1e3aa18bc2759a3986e4251f528d365b677a9d11b73537bf63568ec616f6facdf6847c1ae90563d7d2828ac5499f63cb4254626a66251eb5bceb5cf883bc92f47b4f434405a088aa1ba367f8ff7fb0764216344c0f04472330b7e88b498ca0dfcae0d20a83158eec3f7ed7aac0cd8f6f20103f4b3800bed34c533b97cabfbeef485a4638745ead5953d1be0e01102dfc1fe37d9fe19a41ee82ca2e9e195de5ef29b2c035d44164bfd1162f104b2e35cc77b79918acf2ed5224e00e55a83d1aee05dbdcb50750af44c83b3595fcc8e5d523bec1ff505e3a744860760d798d1ee51a8b29bfcc79a21c4ff58b65c7a7c47852167a94b2feb094358bd337d5fb1d546f62f265ac50f816a3c4b15b34c0297346732c93ba978d4f0e6 + +Input: 7133a3246b8d09db79f615a42a178641080ed43077904d495567bfb196d35a116f847bddcea64a5366d4b9589d0e22f3ccc925553024e2badcf495642efad5ad50fb792a998b59730f75e4468144a8de793dd177fc7b89912a604059837968a62bb034691af0504cf480e698398b2691024a3a4e6cac8b3c23f88eb2c9fe3f53bb27c21c6c5fa60c1c423e8e426318b98e51e5cc14219bd7ea3864adf19624079811fd5b7c6e466290ae2993e046081af5bf3c5c7870772539ebb9fa4e6f19b364e68e2344072a15599ca9262702c7b8b76d96c0f67ac5cbc081a76e9ec12783ac31ecaac05fdc9bf671cdeda45ae85ce339f5ce1ead05535caf77d18ff25e179c2d4d344688f178e7cd802db25a44dc3b3113cfd5837a6c690bf010a3ae4328baed76 +SHA3-256: 509c07e9a9ce88e71aa7688fdf2a39c353576c59079259797edfbc3f46d961b9 +SHA3-512: a209eef30f43b43a97e1a5e33d3cd0444ba7fcf371eb9715b2d3f072f901e2246293e52fa31436bfd3a25d46b8e906fb24d95543bfc9a7c6b1055c355d8333aa +SHAKE-128: 3767771efc54ff5da5ebee484d4a0e43450ba9e219e5ae4075c3338407589c86e875dd828bedcf960628b04bf0614c9b3d56ed824b5b47b144b49eb464b9fec1e8c61d2b411325672d5ef937440b9b5aaf85c99c720490a763bfb43b46780c90d6dbe0a6219aa0f6a7b35ce2d1e209088da03aec22bd580bbed5a15d78c7bc25084ea438773e1ff291d164a77d84e34c7411a5645d8866dc24a3df7778c2ed9aafbcab1cb70188b86c76d4614fda66074febd711dc0a775259289922705382944fb75c2977445ceef2d052d9fd8e96e04e6598bb4013d9203f5b2cdea5e1a7b8ba226eb42061a4ad9b584881a7d5e0f16fc52f1da018416c4a734a2375bffd90f6c7e0d36835c8336480fb35577de2a07673b733e2b224805d279f12c9830c373c6fd75a376bfc886a56d84f0b06674edea6fc48c19cf482bdfc3f54b1a731606b0ef35a347639edf356be510db50a4ecd655f562b65ee56a67596d0d2193de5caf473716fe6bb9df02a65505081bb15bad3ba5073119065f6ccf73973eed639c028c41730425a419c59d480c62d913ec07c98a63821729ad363867bc5083f2aac901297e8496c428a2598f57a9c84aad12ef95421264e83c68505b6daf9d785c743c124947dc7193b1667153dcef5b6cf32d5a932884b5d1b23806ae00a9d2e0dfdd2f79612a9f0e368885924bd3f9bc9e729cc3f579f72460003d935c868ed +SHAKE-256: 8a3cb1139c7149d4dfe924f55ec0c8e6dbe30afc48dba519cb71e5231a0d7cb75f90ec1650c6bcd6ab3116f2b3f83054bf8b0918090538234f550162e809cbe31b7037f0fe1485dab815764753b7831f0dced16822a7a73f692e2361977906d0be716756c9b7e3d1627351113c7822b5f3deebc98585c07267793eec06dfa49be61cccb5ed27bb9def097e0c13c94afb31c8442697773a4d4866db8dfdb029766fbd954d579522d65375b3b1411f10a8eecc22c51a53d9c5ca4c2c38ae366fa33b784194dac64613830e2b2d97845502c3767bb10352204094af6c3f5f03819d6c7fd51a6ff037e15e7e3579caf4c1066f04c5079b2f808b44fc9984af94cd845dd80788116c9b107e4fdd93d624bfba6eaa2334f833a2c5956a3dde48ca31754188a40bc82efa2a2b5441316d705811b0c646b4c0bbd04c6fa9da836284c5de6bd0b1d7de409b46cb2e92e297a7966a0fc766fc5d81ac530e02f22092407318185ebef5fa86d4d6b3b7885c05b6d43b95afd9e6cf11c5ab03465b8924e84ba6ce6e657db0c560054b116004ce3bb616b545f1f8501880f4f2d852c2cf568a115250392b37d4d6bf65ca98fb2a9b287bf027519a3ca2f386da5b89954c2911017e444b1b61135103effaebd857c0ec8d138c88aecc67278e58dff9e92b32128c103750785fcebbaed0c3552d85afd62396acfc479acccf1566d970658ced9dc1 + +Input: 6cc39693d1f5a982ac02825641aaefa2a3a1d62aa83017283392dc4a606be266027c4186c4b46c92f3b41d8bf693f549008c5724cda01659641be6f595ca3ba66f4b381708dc59663c8ec0bdd5cdabbb072797311f663f653ab1ad95399f0abaf6b8004719e5bef2bf703325a49bd129451117db95cc80a4514b2bf81763e3dac6c4667277eb3af6880b99875b608a525a69092fe3fa35724a1e0c5e3259df0f0a7866be3b629e13c4ab18ef80feda0c99de436ef818b04894f479725eaec614d6326d5bf10528a244848debfffe377113f0c1bb7b4b306dba6e17a3c02a490376769b4d498b4ac355b5c97f587e043ce001736cf4039f6c460ce90198d724478d78c8186e0cf5a33d1ecc6d7203b0e77f096cc8f8b5146704c4784392d22a3fe9712592 +SHA3-256: aac5bb80f7a750c76ca439b6fab24b369631b1b2dc7a21ce8a22af7a4c8847b3 +SHA3-512: 3068be89026edd05e7260f384d68301c2ed854d5c3fe5c370aa887175c68b2365bfd1db3b4bbf43c777b6eaba45a7f125b3ce6b0ae62e01311cb71729a994e2b +SHAKE-128: 43453dc6a35904378c3fa336d7f422458f6c689ff7c07a2c218c5a5d51a14923f8c1d169b9547c1d82b0f54391dec847e64e1ab77bedf047f685ea938f63313ddc8066b35d630b93e8029f0ac97a0ca8a8179558e64da635b614a75e24a7fb941f19332b4b441c1635cb96e615ea157bd6c7d94cadbd3d0e8279947c332c8ab93b314d2053fa5af27585934137e1ef662e571f0d445249780b916b05a9c17b39e5d0d9dda4d98934c02ed66d02247a76c5af2b152bcb92472370a439892711b312eb347c7a67395d76bd214b841394b8a66cc818e5cca1e1a92eafc74f10133954a6650c2cc5f55add16812ede14c6b26c19aac442c45f7ff4ffae42f30a8007fcbae47a35644f158a06bfd0c7d5eb0d6f4071f7232f4310b5991a59498610de0ac05ba6e152bc280a7219c744871e05c962a33e304c027c7687b0ec63783a9c994dfd99b89dbe7e2dfdca51f32fd7d4908ae1533f4c757468db189838af840b8c493ef30d6a6c0507882c81b04b8ed1dc3e98f14a47e67d080ea4baac90a5abfc5f7eb868640867319867e6b8d5f99bcd919e560e3d3c43a190df288b95528244e6cf9da15bd7a4e57fa1010a74575b3b2d2ee19c70485843bf1b4db7ee88ba9d7b0aac28e1f88af06bd5414c91d86c43ff88e26105875d2d1d0bd9526db31b67c2507b903c511dd2675f3615f727874894efb5355fa211b593a2c625e62c2a +SHAKE-256: 0bd333376747586ba078b85f6932b4af6629a82489395ea56131fb75f6bd98b18bd95af63eda085e7c9d481871101e139b4bf6d2a899bca2db32e3dfffd458136ddcb2fcdf00590cfb19a3379134f9c145f3c31d4f26eabe5b5401e3b9408bfb1b5049d3ae480e88688f8f1d765e126e26a39bf6c61ed2226a26b53ce531fefa9fad54ea0f54dc64192d7591150edf002af3759cefa4d1b9f1ed71a20da717e5db71c740f8dc232b6ab1bc767de11ad319f8d58ae3f955a1969da7693cc12a2f92dafd2d6f9d8513c1ca1e6d8e3f7509530088a05f52e53713556505bde02cd951d448d01b382b8b2401c7addd2f93aa6292523a6993135e4e736efe4cd75b1ed847507875b5c5e54d0b3e0b4e30fcf57bf1c5f6bbab18d70bf6e92e32eb633287dea548078427edcad3b4f4194027963ed61469189838fe2a94ab26d8fb0ab0dba83dec29ef66a006651becbd5a5dfa49e02ee10cb438101a7079e0933148cb5baa47fa20daeab642d0b4f38572f21b7dffb0fd475140b94cd959d5a2177c6939c63120781e6537cb0304451136749968cfd58b6187d8673c10e74b5fb213b5860557c80bf7d3e62c8bbc55e87d47a226ccceaafe13f65a09854ea7c8ee719856c163cc2b717e5beb74708d5645cec8c98a8dfc6981686b5e274fbd7cf6ed6959343ab99e34324f25641def45e840946ed6f02f4d194270f6e862c7407db238 + +Input: 2e091266dc58ed4ed872ab83511dd33590228e19ed751fd83a576c4f21008bf585bbe4e5fa412d6ff63ec28eec09df4a3b341701e3782fae10ca2f4c68e0f4dcbe6a21139eb0f3d4e6a1d343a20494c5ab5facb52c3c0fa2c3cc0a5052576373833f029a6369433f4f01c21922eb474f8b28e3777a30e9e5fa1d9470c67dd6ee1f78289d18d55c1868054669a5191792a958d12b5147f689a0783be95a468338f18f44bee2a3d24df384bcaf2b0a5217c3060f94e196655fbf891e596d35129c519f0a042083c3ec8898e8bace89d1ce5914bd5f7297aee1c681f75d2e88fefcd36de8fae97e07112e3a591f6de023cd04d8b0f6f4cc9059c41ee4a6d34f2b8b5ce552edbc608c2ae6e826ab3428e01e6cf7609290ff49bb09ed813baa8d161f1f2413ca1f +SHA3-256: 5c7fb6397b81c1dc62f37308b4812dde363dec91733d9095db89c8cf57de393b +SHA3-512: a7d9f2bba59e4abbd0d40459897a16d3d3240ff6d545390f0650e83190e81fed0f27104ae4f846a7df822952ed096c21d7929ab2e4cd6284355d598c86a330d7 +SHAKE-128: 1e0d2d42d96b0829611d3e276e6b697ef015e30ca8d6de9b9a838136249e7aae2489d4e768585181468e11674df4e4fe45ff29c5b99d2986b42208eea2a92b8ab9b2c9dfbabfd6738d751d254297056111d8030855f1a965cbd41b1703cc3d31f23572224d7a12fef503ad33c21f59d1a931cd77a2f9f15c35c7f4c5a23dc9213cd3eb7f195d7791ada722ee757f4ba023ac9b0d20ad1e757465c80e02c60d44e5df7a52038b642ca57a6763ac44915ded5c0ff252b3b10ebf865c91ba1054573ae72aa7975687e71e611ad91085deb038cf34bd71e33d4610d4ce67f3798fad0ad07cd60f99aeb76b92cc8c80540f5884c2396f273a4a1d7f1eece38b068a5b9c11ab0a3c8f5add2d78d977d4886649a3e3fc1df27842eb7a61d819acbf5b130d9c7e1e79a65f19986f00316dc960563fef757b7a54d6091696f6cd264032f57c8fa83f2e5d9d35d60adbfb8369958dc74e114ad65d8a11fa6206527cefd72d46b789aadd19e3e55bea8f529b695630b9fb49511a85d7ca761da072fdc0a832169f4d8a4fcdab47405c86817b0226faa882ccbd3bb99e9c9abe6c721f6f07595c8d64447dd19c578df8dd84b8e6bd41a8f2d0d9d13bf3c6ca4ac259af09cf99c156d2f904a218ae2f388023d094ae427c9bee1a0c7688aee56c7182fba40e007bcf7028382bcd0aef557f440ff64a5808119cf8d0aa64cb310c1947c8d55ec0 +SHAKE-256: 13bf2a73747f0cd365150e08c10bdcc8e65fab0a179281f6a1db4551310e602af1e01769c983a8292a4747d95730cbd374390775f2d8897e49a88a6a1f4ed3cc67d75a843e0d7fc310697696bf9ff693071e51d737734b2949e96d6d65593b4715ede9dda2e877b4a4a5eb808bf3728dba02ae1f1e29c87fe808b008ce8e135193763e2666b2f67ae19232c53e06f11fd7b79711cc0ec963c5fe0f42f3e3d6dcbcb08686785aafabac481f5de7944204f8e32f01f0907328cba07ec3c292d1f0693a93376b264bbaaff2f2c5240c6aae861a7b943662293ddb5fbe2bc0db61a8b3743ce4b4fbf9af85672fb9cfe33610bcc015a4c7ef91bc1afd51eecef9511cf970f68f4dc3348ca768ccfa73b48eebd1e50f3a8df78686b6a77e4da73849b964f7ab21e225781704380196baf87c3bc7cb702973d0cbab4012df1cd9370dc747976b01fb3c6e7c70bfe074f57185b925972be69c9a557896e63adb4ee68cd51cf2f60c6c5350b9a98befb9503363b6424443e04b5ab620acd055a5521533b5298a23b9400e3e31b41e4399d0927b4b5d321810508cd91af3cf1e978fdd63fba1a781444219bf9dc2cbb2e4733d54534bdcb67542580b104b784508b3b9c22a2cad8d6593a2a999aff702e7ced2349a4d142951a0ee582672d4359acf4522dd24e29ed43edd40f3cd44eccf1e49370a0d7611c873364aae01e0abb768147ce2 + +Input: 43614220cfae0a3685e87c195f61c5b12a2d070bb7558d9897cc20d3a602b741deb33f5c535841c17b995df026d3db768dc88563aa0cf39aef33fd8c3e60e55d3d4e2b81ed7e93fd7f297a66d2eb9e1a31e5feae0b4ab682dd8d2cac27fbfa964c33eea0107d2fe07c45f28e1a3fdf9fe380f104f37f91853a15733ae6730d477bbc2961edf7d6df740fa45e14bd83f64b6f8af30cb68ba0a4a2737f23df17fdf9c98bc8ad1dc00656cbb425813c0bcf8d02f2cfafdccbe6a6d1455a539eae03bb5bb166d42a42819051bb8e4793c11d148098311de5f039ac340329d05021aa474ac390e5f84cca678b510f361e117275c41370ef50f8f6540ae81d94fce654491c29f2e6aae67b385354871ec1cf0a18231c81b11f3075f78ab54ed39a69a3585e40540c9b +SHA3-256: acacbfc98bd8dec52209b78df4b250f93f8ed6128a4315f0f3119d9bb1268a7a +SHA3-512: 8cfc482fc57ff764e6eee05700262335c09a25031d8d59d7885b8a3bc5ddd866859cafb569c7ce4406d40278bd3f5bd2f072fc3c5118869591fdb8ba70c46ff2 +SHAKE-128: 411fc4a93b655c3e89c450141216430739cdbc6792f64e0d92305c6acd431c66e997861eeda284472bf644798cad315ce8ced4b594f0a9766811ea8426e7fd7017ed807f283514f73ccd3aeb2eedd4e5d301ed7bf1916acd09f823cda85bcbef286164116007d3fb35229202be189742294f3087f429d082a295eb4704c51fea8934522755cccdb66678b5c17845eb72f4da5434c49178ad395c6789ab14b374e64a0ad3b6836ad982c1da1fcf9753d248a32b0cd542bcb2dbd6354dfa1c1bcd3f7fe75dee13e2a2e73222a1ed8f946b85cf8c533eebb399812682f976732d4c3ad73d02e8a93e0d4bb7c73642bcf810065f69c4908b5c6ffafa6d2e4bc1c482f7eb17b323e1c0ef0f2856732ea634c02e47b01767b8645b958eb95e7772d38f271bfc7ca4f767569012a1747ec7971c75edaeabdb1cf6859a3ff260dd106a562bc90bd95bc9faea7293d766c58c7aa21031fbab9a27a907e4c8253fffc5955ec5b166fa09cb418ee50711d65554844e7b92ea770cc7c8b875c7c7728fc16cd1918e865be45e489c0a0606f7a4e86f4d45e24d6ce3594e80dc12182a4b8d4b1e93156c94f1e1837ae67609ec27aed58673ecbd98c3fcbfe098776922be5d7e74ade47286d94868cadbfd0017a929529f607078629d3bfdae736d3ada155999468d928af05fd584b501c5c348f9352f3a720b8c353798177d6da9a7be1621d56f +SHAKE-256: 86eca51958c53d0233fa71e953b2b7928ba4bef3a9498631aa58ab0bbb604bc602c24957d6e5d388e347c7d8794f09bd166a16613208a412bb2130db9b5cf34cf303d28b26cfc10f57fb803ac4ab428492fc91d41c0f024ff2429912fb0eda894af8f2957333733e6c515b766b275efb0d5f88f90926409d6655eca9cbd33f315e2bcffda86120e8c19de45e45ca54155d10696ef7ecfa3e7059eb36bd3eb80b5eb576b6a2a970fe9d989e2276ed8011bc31641496bf418cc38bae347f0f5afcb16371d5efa5842fb73ae4f69496155c3129035afc5f8d79c61abd4ec1617d58be6cd0afe7f8e32f3b997abbdbf3372a36011bade2f6318ce2e1e6c85c8d467ad9467261e1b4ea1485f89d20ed1558bdd7699a1820438dba1178b7009020b245b9e47e38442fbc1cc436f9e4ef101af3b4642571b1931c4bf116122149545c572a0904a4d8566a099ba5c6c8930ebafb217dce0eb6c67c9020caae65109b8b2cd28a1ee35b03afa369bee1345a38736f8037e7c3be9c831743125c865958b842b9e728c911398b706ec2f764421189f021e1c035b756d7ab8e6daadb5480fc15558716645b2b9cb7177aff1e6b98a8da4f4d85d2d66f8792aa2af6ddaae4e5f15ef9fc50d23e29eb5797ae7579a58448f84ca303884472d7ba1822436cbf01d908c39f1173ef88b94bafed42686e702ebf52cdccce87fcfe621ed1f1aec3ade9 + +Input: 1e9fa05f3a81e19f6b4b3c02c72bf86b674eaf60da30a14690b3d6b23decf5e4a8b809b8f7a1c51d1796b8a4dcb4ac55b35eba33591b60081bb98b615a66f88d1e170f6ba3ebb9cd5cb448fe021755257459270e8a7e4095694a066b29b60e4b54efeda117d662ce11fe10103c512fb2e07ddc0266ff728dc289c4950c7ce92b2d8d3a779e295f37724008952eff71f4d2078fa96063abf899e3605262100c1b7ba63a7821e031897ec01e331a37515f870d24394c5372bdd6ddb91c8b78a595707055d5ed4fbb1ca7f3d6ec7f4d17c73dfa334bc1eec08e17868d8ee1ff3ff11221847d0428a568dcea25667270d8e348c5be84bf635471b0b6aa53f26648488f2d844151f1726f969d46584d3882de80d182ac3f930d2c27b3482193c4af56a27180f26b2e6a +SHA3-256: 7fa2ca6171e3b25f6ee47469fe5d43bc7781cc88f1132cd6bbf92687dfa3f714 +SHA3-512: 82761db19b644b8afecb00c3a856b7a37a42faf347da64820cf6289ed636e4efc7d5a8218d3fac27121a5128142d3c71be068dd91218abe979444898eeda97af +SHAKE-128: c1885b7e95d4f7a362df1613e5e4b733fc5800faf05647fe0d11d24955c2e1bd29c871ba9190f3b7f28fd959dfb7d75e06d82ac38b145a341bdf87492315db9e53749f00c60d6644add1875f7dd90e52747f4b2ad1155c0b2a261b116d17c59e93b840dc77c0f2e7e06ab9de699f0bab43d2332b40a33f7ed1c440803687860b4df6bfba631cc3f732a4286dbf6f2a9c817bf411defa632ed688b2372661e23594d55df293f5f32f00d71f476ccc5aae145bf945f2f2126bbd8b2d7272a6f16d37ce6bf474ceab967ca376b9a447f3f70e2853a5cdaeb1139cf95fcb1cf7fec0077572d15a616599883d4ade6db261675d9e2139bb41867926fa7a1ec8b4da1a32e64565438bd6695f6f3286e8c310bacd82a0a0c7e504b69f1a2410891503c949bff9a4db57398c12f8dd731dfe8915b7d8c27e52b1c9400b9839d0b99821311503f25cc4bbce93d0730c9a83d8853ff8252cee82fb7f272f1ef0dcb99d14bc15ee6ee8f94e8fa21fd74a1ef89b672671b18e9faec66fe56f75259539477e6b7b348f7bac2d0bd1e9b3726789bf33d59db7101c40b2300aad6ec8f7a6d4ecd057e3517f10c203cc3556d9e3ebaeef4808c60df0536d9dca9639931650b2b7989a3dbb8b94b6d2c850a89d72d96cbb4227373edcc65595f084b0e71cdadfa9fbf867232ad98eac88d96aeef7854f2de9b285c44810e15ac03242bc191a4b3e06 +SHAKE-256: 9f0c0cfe644345268197b53c0dd84c0df1058e9b33fa0873735361e8ce6550db807f40b06dbcfd60cf95c67520e0ca83c996313a71b3254838958390273ba4c9b2e46c337b4b0bff507a36231d0038e44d2df89b2a734c3212900afdad94c6978ce1be521d27d6116337a2405261389414259e644294a55db78ba5ecd4e12840601380932146d3695d0b3576adb8ec1a89f331033d52faa90917efebad9c48fef16d30394c04324e8dd9dcd9348b30c10190ec4fb97c6a35ba975f1562c4d73d958ff153a3641f502fb60ad5b26e2802b74a9936607470d820fd5cf6618685bd7d88c675ed185bfe6cf916e7919826918735f84e95517038ff9ac6d49cb5a798b3bf6b174d51ceff5639342cb6288bfcfd142d118caedbb64ec389564e191c5563895682a76f902b7345c0dea07e1523f882bacb8e857d486804da057123ae0a1dc02ddd857cf5d79b637ad27de2252c53b0c3878477e0dee16416ea4245d652a5dc231b8225441764f40c82fd66d34aadbf8b442a04f1ff1c52041043c4ccaf266969dde9a905907970263b1026440a4d3538f6ccf6b5f4a84098266a9dba4f01b23cf3c5ad00e88bbd2ff90c9d679090e854e3bd8e28e98f3ca7bdc972b7aa477c242aa3753b16896e8a16bf55048336adc31c3f849799b8b15aef01d6595992a147e22596794c044a781f7651c01faabd3bb2644d5710ec2c1caba620e324 + +Input: 2f1e14aa04ca1258a1196ec625faa4459260315e38c3882a574b188bf9f5309ddfb90e5a5825d539c22c8507de8b0baeb93d47b7ab45740e4299fd775e3035dfac8cfb91cbdf19e35f460011e9d317641140ead2c33c94e052eeb449781d16a4f088eb358ac98f7afb8e7f82815557b26f34a2db6de558e2b83d3c9afef99f67ddbe195a77b9176d571ad9bc3e39ec318cc5e81c302ba3924278aab8f0fc88a0ddd27b062980606ea7ec7211089e0cf0607904f78e0f5f196a2a86f21c03c58106716cb3d0e52ceb4caacfbeb5b9cfc28a1aec2165680dfb9b5d65bbc539f7f71f34fdcb915e37d9e8c350bf9f210a78d137084e088604411e37ea03185241a40681a62a9ad6efc5810768dbac7ef784502805c20a2b95854ca10675a94a059796dddcf9f4ca5307 +SHA3-256: c908f1db42869889f717fd076c41b7ef56407e1440ef1330b0f777b60ff1e82c +SHA3-512: 17e8aafff553b9249946e4d36d11d076d334c88336ce082ba648f099639e0bc67459116ec56aac9e723351f37e5b34fbc2b1b5d71050a777ed19bbd664c290d2 +SHAKE-128: 93eeffac6b784f9158868ec84843afbea9c173ccd788ca01b40ec634998a9971f136e6230eb55cbc54905cee83b5b38fa70909107556596ef0556d814b79a2799399d0ab32251b38a5def76d8cd5c1729532c59f51dc9d34bbd71e105ede6e5343398138c47fac478b32e23711e644ccd8dc61df74e11e788985b0ee5056e62b16d5d67f588752fb7e70bc613d31440977674865895b1658370255b259cffcf0ace81a5ebba2f180c6c67b04275bc0bb1fa8f1ec9dedecbb0e511c1bb628e2dd637916f75dcdea4c13f6afd58d3b82390ea0422250ee186c031b8ccd31cfe0e4a147745b0685cef777eb91a096c3d85b7f7fbc32e4217e932ab3969e753d60a3c39500df53ecb7a69fa41a9e67da32d26b13b467a89a9bc4c2a42834993f9956cc6201fbb226855115caee449ae6de01bd43e1ac6f06b921232af1cd6659101a1d57b3981dddc101f877a80fbdd5dd1b22996d5cde9a730401f37c878b294020f1a48d398dd92506f31caff4bca5f9a4ddf7691e6ad08ed5295129c75381ac99f8bdc9e93cc5cb1f92f6dfc95e03b7e9ed358ab12b50c3dca219f2e9c8aac80da03c67a7a857caacf5843a60dde480674efb88f1c3a1a73e086dd068594636fe4e1441e940610d4eea868aff8228e207014b18750377703a2cbe1603508233133f533cdf65456b07a328ca49e0e91f23a66191939ac037ea7264980a14436f2a +SHAKE-256: 2cae19c70236bd522c48a9dcc88bbe4ac08e05857fd0f91600e5c559dea5e7de19ad6a13c5fe2c73de2b0957e9e8e1b1e390080513d1df15a1bb7190fdd474e0df00fc642bcc4d7c3c15f14a3b49ec5575674d252608755c318b02a86e3cbffc54d9d959b98c6f99eea492030ed84d26a485511b860d55ae8901dc80d46a836d1b2babfce8647cfa39680367320c8723a013252c0b1f394e37658e7b7069b4af225aa6c4fa6657b8144a6a38c95c8c730a76fe678b915dc5bbd15d4c60636adac39c203b49a003fe79afdc6575c37746b8f6a85904911209b154d5e5c9cd62d637b6dfa3800543c97cbfc97a3743345c40ef132073ac0462155fbc327bb78c26adda7a71ea833d111097101a5b5a215dcd6ca4d920781dfdefdbc36d458ef356cf358cb5e73532608c34dc1c620ed8d79fe304b64ff012008c838d25ab5d64aaea9387b36dc43380ae04638fa200a8a790be0d6e77ddbb9d0e973689b973aaf075a01e6694fa361a100be3885ce223d1a32f552751d8fbd0a34653f6efe16dfb033e11805fbaf7a4189abaff53741c446df67df89f03a364c73b6c843395c92d6321f18d3013b2c541bd7dbf01d8e0c0636822c916909a1f66318a723fe7283f8c6ae3076d5aaf20ed8fd24ed74a27d13e1c09144d1d3ef108638a18589c71950cdea949df2c8d2a4a2160f43017a663712c02fc4dce826f9c206050ad0f839d + +Input: aba2b00372a2377221221e7777fbc229c674e22eb29063fd32412718aeb535eb31b9f28c6ed3f50517fedeb107db7f6a8380e7bd825cfd518334a3d15077fa1ddb7f999c56f2d19347100533c7ede669faf2fd95a54170a4f48b5166a2ce6b0940ae96e02fddd2532c036b5ad18992a989869b41fcc298f2a9545c5a2f89673cb66ac673f8655a59bd800bd322c3da9b07a49153578d2255f0651ceb5d3ba69427e7d0eb8fe981b7708f5c15638d2c3d70d938abe6044ca85c4cc90d530912fb6d325732a30b1c875d7c4f8d8b74af7da72d351b900a26e7ebba29f36b8c039c2c6625519386a0a49a3669fc2e98f37d51069e4958c94b7b233a23af619a35fa7a3227c2e17bb80b2bd36927c1a12a68d7d3665b6f6ade370a4c9a40061506d39a2039d75bf136b9d7 +SHA3-256: 80c741a26edcb20597c59bc1664d9a6c2401b152aa6e3c06d24bd94f3862c98f +SHA3-512: ce2d2f13dfcd8e9f36c8d7ff2be33537d123f7099ce8e305f194de73e3c020bdf6d75b31aa1b607b7c9c17f18532c515eb3a53d5b58c05367dc0f706f956e967 +SHAKE-128: c8145279fd37619ea59853a4859a498465a36b5f38dab2b455ea83a7add23ed9662093d55c058d9a0a1dab4e090481f39352ba7b8c9eb422264626fe645a4b293d59694f0ef0cac28b0d0fe4f943b7265b39faf58d7dd6b00b2f2ff40cf485b5c95433fcc512e87346d0a28aa4f5be6880c6cc3996168854647fe808e510bf1b738d0b79f9580175e797be6f19a5121c079388b87505d70d7a0c9bd5dc882e18b39adcf08362c2af6f22effd560fd141bd1f1220bed3ac565beb4f3e3a4b77f354dccbe4871596c05cf2155620b4d6b034a5dd8d089b5ac59ebf8c0f2bb51ae2adb9ed5346aacad7af606e5a73efe092b910a270f9485dd6b4caeac0bad1dc405b54c94b5dd94f0cc5f3bf1258cf0c46e5c92ddf672871da94638b18a4641f45a249c49da32fe8c2514e14c7732e0f5c685878e9ee0a5d5fc9be848fe09ea85fffd54d97562846fe79502920da5d6f85bb94e647cd81f70c00d26c6b2184367a9d58a475c4771739a645b816bc6770008b4c4776abafd05ca1de95a6e1a2ddd2a11a7ede8fbf2ef900db2329de8c741c2372201a538fb7f84fbd9b21436247eb736895a75fc7adceb955f471fb8b697703cecf5b78dc28e2d0a364e6d4f680d7fb8726349e207ca8a5b3e8376156a92406611f941cf4b55b89630c666a36ec0c463dc5e1225eff8b1ab847044e148130caf98034839dc24f5b8b838f52b3a261 +SHAKE-256: 0c04096ead8e3f6584b575e7c31791fa539667a0501860d4db2e5b55f1dc068b2e1142e3f411491878e69672ba30f5c84f2a105245ef37e4744887d9e4cb20a7501da7758816bd126746e4547983cb6a61680cbb8fefc65349b55ffbf15ee50b213ab8863564505bd7edf0acffd425351973214b749b4ea87379d96560fee85b332aaef3a10fbb638495a29ff47b64f439137e3c1f66b75a5ae36d6d0f119d0b762e257977407b28472d9a9e98d4f243f2d2e4765b7b3ea32953e282716c115b81293d26589cea0408be53b73574c6140fc5be1be24490a7250af07d0713cc34ad531e619a42fc27f863d5fb34878ea892e3299b3ab66b8005a814afbfd288198cc5539397288abe18f7683c8f4a46b4fd5f8f5f51c77a18c13c1e66b55b97d52a1c708dce66d3001e720d9004d7b675ebd1d02de3f787f331847ccce0b4d3c13adc14d091e63174d95578b4d3436c94cb325014cf87b7e38cc7b1ce9180a621a865b1960e2e9333a747df0899985cec144ff692ccdb7ae91996451906d5f6d44bb6dd05ea2d348a8c8aaf8dd43069b5a4d6933dc4b1edfaa1aff849c3278060d6795a299cb9cebc413bb4f161700596f856b0f60b9f9abe31be4898680729fb8e848c60e81c9f66fa9006a42e02a8b282998f6344c0d9ad01405c7eac9956cfe2618c0b16db9a44261d391fa69b76377c48a1f324f289939064ce29294445ae + +Input: 21bfe9a3283cd9488467a326919a01b8e49317883c418493757bc2eda84dab6ad706f277b34cec155822952ede0f72eac7ff96f51113d24b1992356809bb5d1fec918e3497348476d2eb48334a3e0ee82de3d8b3804fc48a107c2fe02c2ac42a689717a03004f2702c1a1db7e864dec1e1e1bb653a5358606d3f03f5411a3757a0cd5f70c98d16b95ccf0f239cc664206002270a0863db71ae33959b9bf139e280cab2752369d13094cdd7912d00060ee95b7595fcc1360da8d3a2fb9552eaafdf9b15419c9bf59a7dd52dc7a4aa573eb7848123eb6ffe63cfe482896882e284882ddac1d3552319a7f22164bf760b2995dce5baede14014e6217124572fa7c6c370c086df34c5c828d4915b8cb9c19da85b6486ba90b510137ec818621699399ae177f7f37f6b310753 +SHA3-256: 8d5243be42532d5c5d97cbee1159e4a1f68e1d1761841ccdb7685038f123c8d1 +SHA3-512: 95104c36f15ba132fa0210f2ab405385fc9bb2965e98cd572cdceba168a8eb11b5927c5e8bdda2bf295b63eeaddd4185137aad6cc74f28552313e211b05c77ff +SHAKE-128: 6b97ce384af6302990cff8844b93204a49b4919276161bef3824ff1483d2b195b1bc5187580e2ddf261c5f018ee7c47ba9ea547143e07cb40dc1cc05a24a3bf58b44a7d84a66eb4c6f250a65760d11ad302aaccb1f17ec7240ccf3ba14a8af133bf4b81654701ba44fd8b3103153cce4807ef31fc72b8d3a0b0cb31ce1ad9e6cf997120b1ff1425cc1430c633d135bf1dffbb0189c01417745014ee5d3a38840015bf9421edc70a22086ce4388e62d439994b101585bcd4371ccbd25caecde59ca884bb7fd3a1b860b712b0ea69dcd52ef5be119062afd34e54567ae3251a5df66eece67d641babd3adf4f3b60b65ae364e79e21f0f1f99674729cc15870fba39c91f555f587b99cd6a80ab44983693db813b16724ba77a13e2f12e112e5a817da90b81299918bc0c6ad2b93f0f57e1aba7552780591a475011be85b07952e4ba397b2bc576e3ee6869fc157d63fdc789e21760a93777524e8862adab611fb8ce1587a77f223e206e6d1e576789b33171c6ad174ac3bfcfec29acdd24cd99396b6e59585c984720dd935585ce4e688aaf165873b31fc0a53c8a9633245f6c2b4e57a98106e1a28266ddb89533071562d16a30befaccb98628a63b4ca836a9f8826dd792eaad40a4173ae95b0edee779a1989577fa2fea219c2efe6d4fdd53ff707fd436350a50d7dcf2bc7eb64e045255a9cea9cf2fb9c1170ff4bf21a41dfaa +SHAKE-256: d2b0764085e191b9d61201d8f4bf6626df7da70d3b8de99094eecf693b7f12a931f14ced221a5fa33d193c9692e460cbf7013e46279f84ca28b0ccba8c96fdc823567776743129cb8ae7abb62228adcce85149b16a9ed672734496fbce6c3c8c373d29832e063e72eeebcfe1fb6d06fff079212770ff00661d928965f0d1fd50b681e418dc59747365a8fb6143d90202d4732205189d5520079bb5ac3d87629043382df4bdee6ad21b40d4306a986d78860cbf5490f90ee8522cb83352d9335bb6151dbe8dae17bf42545795146e9844dc9309d08d069e84b6cf516a4c5680980289f07ed5fe17bf3514ac729845e754e3faad21d84d876505594b5fa36e551db52b0f6e92f4843dbdb2ee25f6e939454db595bc2a227dc7a16101b962cbeb3c3e05ae576d1bb63f19da02beec972657f6a04d5f0bf44161481a4b72ae7b1f5da588172364cae626403fe31588a0d8406c06b963529e81738b34438cc069e35a2ec79e34262bcdc2355c421cee11cd7c444170fe67bc31a3d45b08e54521c2d74a48edcfb863884eea6aa1454e30949d5b1bcfe95b9b118cab25dc89c893211507f214e3e460c53e35be5a0824289ad9133be685300f23ac1f6ef14c549b6f03f4ca37d27c7e9e502c11be9bf16c0d16f9d3393def71aa3914e6ec83caf7b8adfba3b0ce06ae1b1ec35e187464ed44e7a85136fe16c5ff24dba33685c3a5ebb3 + +Input: c48c06708042f2931962dd35deccacd30652474dd382839e3d464b5f220a38c3e742f6867876f32f73b97ebc812876f55cf0fc85d778705647ffefba3aa0fe02c1788b5de8db887ddab1e071c24fabfd5a9fbd5883ab856b1f9922497e7c8cf6cd5780d2a68b1c6bccb9335cf5467f6a1480f5beda6cbd022f0f41030f7dd55aa45a461be66090270429d94471e9a9db418bd6b8fdc05b2125c7ca3119ebd6394692df1a1ea66bb4b699d7e75cc85186b11689c685d078b5d00af83531840d3b42b59e8a38e044e9cc02c89fcd6fc5f292c761a83bd6d9765911b89f5429422aea40c25b108e12d599ad0e7243f5145c6488c5c51ef1bb899aa9e6efa8bd0ff06b88800fb1d74d0bb09437659e0681f95f9ba3393be81464ae3296d68efc31c638ac2ce00621544158a041 +SHA3-256: c635158da5d13129282e21f73e61d24ab97ad8216b4565a9c8983b757ae4a143 +SHA3-512: 15c317f655521e98a2ef97b1a8c3ad298dcc754f1e8d0a4f00e034672df32733acdbf32dc43607f685738feadbc6263e6ec1b404d50f9f0281a00d1aac090467 +SHAKE-128: e2f2f86c0009a79595f6e7727f9692153b4335c9afc23ac915ca1b4ca57072a6cbf955112adc1a38d73013b969663d1067eefdc5f6b58e96e77593f05d0ebd31849afb330366682014df3e7085569b93eac45a12112d8839073c59a0eabafd161ca1f0d2cdeb61255e2d991026a7c241d57b5ac63c6b335f67cbb6de15e8112ff763e5aa76d65cc5866d693e918d134c53f94a7713f5f0cf997726595db4fac6a74c20d8ec69e6ac45a929af7fc924e607bb86a9d39e69337b7b763fecb6bb897b888f6aad033f4cca246bd559e83820efbad12354ceedc6c2967aa82cf0adb888eb8258801395640c0463069a261b8db9a68b0cbe9c92e8df9eea0541cfb390c1573a953f07d49e15e2c99185a70500a670ad809443ffa76a079d5d8914e2bd7229aa90f08af87231d446874bccde508c656b2c2c10f52d616c876f5a9419d3840546bc2189cedba321fcd402da64d897c14e1c6c1518e0b0d720175fd31546632629d042d2b05ba8a2d2abe71592ad8ec8f82f9f9c35518a4b84ac8a68e2e54c4605d01b4fb476cca7cb852f5e84f9d3b9b2c7fb164ebc01013c815ec40633097d41dedf30da5a147e622800cad61fa708d02f546d0415e981ccd4b921d64f7bc679fa8cdb9fe5f9acb5d36ca26c232df5a6a2cab2ce9e8edf32520bd798df8e7db350b732815c7eee1019ae29b5da4d2e28b2eb10b7b9a685548f46728095 +SHAKE-256: 41e93039a891da92b19e8578425ca7e94b95077c13a788b6bcaa6e8b39f8c48ac7b96a430bfa67fec7d8b605575dc85ea6b56e942fa86f03fcb0f097123a2fed6edce65f8f57b40ef2a4f77c194c8dd55c407962b21367c86a1aa402d8011df5b568ae0a5f7e9440a6bc721cd04b6cb18a1088c659d10119973915b7fbf1ee1796ed2130207d36330f0df7d5f4da0d6a1440b6468e09acf1a139d10a6bbc40984461f42e6f8c4549133e33930308cd5d4c05cfafa8ff1739d56034c48d36d1b4b37fb7a767e95d97161b762e2a72802016e268ea9fad70133505465d6e573732e4e767696b57b32c8bc0fae5527032aa6110502f5b648006dab9440367426514e307d694b3d93ce7ccd739a5bb9f99effcbc8878956873f3dc841e4e381dcfd433c2e7b93fd7fb534782eff9d58f14a1ab8dd3f5a95f265cd457241f0b99e4c5203917ad7b9b3d9ab914e91daf4a7b6150e1633c4d7a4abe84e8892d5c4013604314429e4388ef19607bc326f25e81547d8844b928e4afba64c1ed9f744e9230db1ade44b111fe1b4ce05a05586aa667f7b4d94462e1dc9373dfcd3f55729bbd5b8cda9c01c0f4d3fb8efb7ea5dd6269e2ffd89ffc46ab001c0cd157481ffe0fbc64de8c724c0bbc4ae6dfe84b53034a00000a03988bdc982a08b6054daa9f3b72d8b283545fb12ec98e0ac71dd64126d2e668ce3ca1c896a490aeab5b70b943 + +Input: 0c99f027e947bd1408fe151f72951f2136fddeefae90351b5874c4e5aafde8f5f458b4d042466f2133548fd647e631e623473f851d72b0afdb0b99aba93bc9fcdcecb907dda4cb5fae6b7c06fda702a83b54bde81062f650a626af9b5284846a977e838c472968c5e61fc0f0f49bffcede0743edb2f9cd026a04235d956530061029e97a7fa6108f0b58df5a803eb0f80c314767399a0fd66dbe531e220b2dce94088a973fe7c3c3cc522f640f5210954db192ab61f0af2a7918f66264bbaf74eb853ade1778b33b2ba975997c54463286332baf2cc162aace8d505c42dbab48e24b5a36d41835c3f20328bf0a1dc9beb08d710d0bacbc686ed979f12ce8a1b77edbd84311f07c8064488ec1b1e515bffc14427b62a2d97d1b99a8fd9f3f60ccecf85057000cc0bcd42c29ba +SHA3-256: f0e795d921e549dcfe208b8996a0acdfc73a9c6e4cf9f1a0702f2735b1f45faf +SHA3-512: 4bd4c0c3981741e016b6464a3d13b42a536124a6c6d74aac0f3e541cc7855f922c53e4f79f24a0b0cef31b7cfd39aae5cdcbbc87bb0e85ed4e7ccf77aaff5e02 +SHAKE-128: 255ab1fd554fc789595cdf9f95e4cd9369adc16791ab706ed626542206d6c7adb11eeba24a9cf32976d21bf99cc0c73f03fb7aea369de8e22095df32af9933ad8f3874375ba2d6a0eb11d7facdda7baca3886bfedb77589e4b9a20741da2d7979b29c494a3b8f790f8b47d4629b6643ad5cee0ba50856878327ab9514e7d367a649716081984e444de6bb10165f8b64d83101a1eca55ea012c6e29fb98c63cf6415e1bca81e32d185388b44e56ef2f302489f41d962889ddbf9f21f1a2b4c0e3f3d4c4205804563da057e4e03ada500de57f9775927f296622e94eb00756eab89676f9b960ebac35f14d92552eff3ecef853a620824515e436a6c366da3c7e6d7b6fbff9d7e5932c0433dc129506422f944fb9a52398671e8f432a892243927fffc6067fa9eee3c087e47a2360b1d19744974cda866880fbc4091ae6f3172e4b34f143f717e96d8232fab89ec65b5f6d4cdaffd814bbe19b669174790a1c33f2f1141255424bfaf1867546f9e929b65d4ae533bd44acd62be8147cc937eb2ea0321058a91fd83706f658b17746628058346204a94d10f9d63da2188defd65bbdbd3448d53587313cc0058f7130f2088f77da8f25a740cb3bf6d83a9f4fe6b6693fc9672b626eb3f9f8ec6a65d32cfd6a8a9d0298a2e6b8e76c566d8d4dbf83f43fed469c9b746f759ff99167c9acf439a908c27f73d0ee38b91dc579e81100c6 +SHAKE-256: 8f1f8b3e9fbca86320b40f2d5dc5f91cf5b3c0f08cae8817a0e5eee3c2399cf86ba7da59ab286ed5be296beb8dc23a215656b812dbb35277ae758f7297541b4225684d61c27a623eed9098f530c4a4b3f932de4c7d6805f1f96dbb91bc8b51ca8f7795b26afaae10b38e15f45ac32b13d0c4115996f3e63ac4a5bc8406323c407858f2b38bfb69a005a34664be565c0065deda78b2b860c6b5e4755b5d7cbde7c5752c861b66e8d7c11f82bbac2812e81708f08e6f8ace16ce23723ff0f3ad27802973dad283141c52e54a174d2c87874d9ab15a43ba8a9e67c1a5417426fc0f94dacdc272650a746228d69e0fb49b29f33e69b775bdacfe6d762d9609a373bac4adc95c538d1048d7ab753e876ebfaf94979cc50221c4fdd33e045b98ee4dd7eabde4c03a7a59ff5f848e60e1fa3ed5f01b9d6adda34e01cab2db45444d8f8200d40955ab883e0cfd1e7c36895a285f00b29fc3818de076198f707a45d7f820a0ddddc986d461f24c8720c926542c4b34d32dfe224693d5b99ff5bdb5365c79a84dc2035fc00ceb34fe8888fbc4cd659c23bf1a6803d4c4c0406d1a0039b9a57bf209a5504986eb0a705fa4ac90e827079711246b598e87c846afd9634d2958dc6384ab1e7b58c356569197a8cb29bc992f0925c7932ebaafe2e0badd8d361de607068929bf029abc650f0c114fa402183bdaa5a756b96552fbd978491e5a07 + +Input: d81404135b4e3d22f64935ae6670f51508f8f747290ce379436cd3e2921ae0be598dc8630d418eb2cf0210e5f763a31975d9c91664bae9843b6994f4b12a59b2dc0ef279ad23b5358e8429a3e53b9b4775913758c5068e27c67724528f44b818e37dadd3d4db39aa5c6494156bee3f5936a631a4c275f7e51c831ddc6f22367d530a6fa6db7d930634627326f825cef0a587675b31a31b5f3cbd72a0bad7c274d01d216ada8aa7441afa1fc5f43e6e9c5fcac25fbaaa33002188ae22a571b8a716f5f4443b9d620168a3f32cbd0190b9113a98d87df5fe85544b9b96dba4ea7a3184eed9c188178ed4434b92c64bec103539632fc0d02654c82a605d74da9892a5e1c74ea37b39ef4ecbc0abb5109f5a072e3deb515cbc2a22d85ca29327ce694f2d2eb640b746de04b1159684 +SHA3-256: 68399793d9d001f947cb2ed112e86f21e6783db0b20f5270334d7a958c309f89 +SHA3-512: 5ef7258f80f3cc8c204f28d17e943b724213332ba5178c9fa3eb25fa837ee07488d8d4be55f108420ceb4987337a608f9f0a31095d2f6680b35349c0916c9895 +SHAKE-128: 4e9f4b8cacdb5111718b75d4cbab35c21e98080d6d13e82cbacfb27860463e2f82ec59e8b603963e1b47ae2ecace8e568c6f5d296c431addef9f544aaf6eec4842ba1a2a1df55775a842026d15aedca1cc0de299a42de8182ece32846782fcc48b88ea341b4620dfa1677749dedb543c950c1ef64ef014feec9dad24d142bb5aee88884833bd28b70490ae005427f107f077a6a1225888bd402daaaa0d292f3ab44b11df93991b0754188fc0982602b3c31b459baf1c7d7fe04c9a692953668da98529c2a2a0b3b42c1859d8191aec4a9ec35933ccfea44212676d732b43ea032233fb0349bc1efe16d84aab8e9f448c6cb4398fe0d6678b129c6d5a042698dcb1de9711e262f0042927fae0ca04192a28a887376162ca65d45a9d7bdbb5be0665892ef0285836fefbcee3b0eefd90ee505b70382a3334189a6c56c0caa0585273c777cc11a5233652c5d3c60a6d01672080c07b97d560e72a09db8840f9164bd5f834315bd08f173e4e757cbbb05cb7c5d27149c3b3e2fe7fb7ae4c9081d704c6cd7daaf176baacca5aea448cc8d3ddb4077bd4a7588918f9c4b7e56c7d6d3a1dde34583d23250bdb8c953ed4100a95c7933784d8d6bdc65322e5a1aa99bbb87b02a75c275467d1b5053831ec252ee2c43261df8fdaecfe6441ffdb2d251936f7e83f8166d6fb635a9afbd2ecb9cf04bc8960a1077f972d0973f157331f445d +SHAKE-256: cceda327ba6ccb72d91d870ac94b0cfdf7ec88bf92acaea18d4a7376994b1617799eed29a6f52828d3e22fe0f40b097f9a56c06750f173e98491f83dab1ee4814d13286541ddbdfbdf2820fb0b56e859db0d2a99673c7e9528c96f5a03b671b4e23e6579b23c5ea5137f69fdaf74ece3d5b22174bf27f2f74679d473327da25fc25acea68ded49d1550527fa85448dbb32b4254bcaf5e8fd0363092ab1219ff42bcbcc3a1904fa2014252a2966dd029eaa16154597b69d56aec09afba11b092ed12b5cc5200e849cb056d23fc4753dab2aed05dd61eb681631a89337329f0a7a4cd7beb7f54f254e67c1f8fe91099d20020e86e49aa6c11574b175679fd978b23d776b85b3ec58b403862ed11c5350db58df924306a07b6477c6b395c02889752a185f8f215b6e8823e012af422caa0d31d92cf55545743c2321c5f0311877d1cacbc840941ee8af5d149fcb0e0433dbda6408726c3b58d1adf38990f1daf104899bd6c286ea3227dfac1a5bdcf308ea8a7149664273dc21cfb3d03c9ba595e14dfda33443a09e7f10fe57ddaf26cc3eceb2264aad815b294484def86b5de126a0beda10811e29284a93810a2bd617216e7f1db9546cfcee280c555d208520ff93fd37052dbe586f89bd2367ecf4795af027a3a3f79605fa62822de1eb71257b209e7e274623542e84b5962fb7bdf2b24a9df91fdfb928ac3cffa4ff82cefda6 + +Input: 56e1170b5215235cc8d04a0f9dc7a7ccb8ebeeacbf57fde85d3e48e4b27d8f8875d78378bfc4090e8ef412cd7ba5726c2036232b68808b890f2a5426c405d95530fdb7e48323a0bd38a81f2b311929158014ce84defcece71adf7f7a1b88f90cd69db82d32c7ce8a2c3fddd3647077c39b9c772f771b6992ed430196c840a4f0a3bb15382bb7e7bf852fc0ce79a0d3faeb1c6b6b4a872036104eef06baa13dfc19e75c575292d56a924f55b664ef2845d1422bc3b966b106bf60d6d3cc2e08ef548d838392451e9a34944e22af61d0a1056c37afd5357ebf6137a40142ac76e00dd8b4a31812ba559524c68770808dccb477dad7d0a7e84080d85b4d991b310e67313b6c948670e36b17a3176be2b7c93d0eac6f0407f10d0ff1906bd7caae57df621b7e9bc95a8e3fade6213e8a +SHA3-256: a48b35ccc7427b7a0da7c2c7b4e255095ca57f0fa5828b42f8e272e6d3c746ce +SHA3-512: 62bb63f7905f2555799a06a5bff681e31e69b2eab72466ded7a15fb453a64d324e8936e348c81e4c5ebf60ca8862241b60cbc5a251196dfe1e26c7e21eef2928 +SHAKE-128: 1b7a20ea2a6f95cc95de593fbd99a8ca79aadb5908b50e0014b1d2faaefcd9a6a4ecbcfc1109542719a28c4ab2abd4eb88b7bc700d592dfb736afb75a115d023351321c89bcd834ac24acf6d8b2c02f5204b168851d919308ea080574493e432a914df9269d2e2bd58ab515fb6cadee5482d7b5910bc3026541c35d216a8e8956d73dcdefc5199d141812d21f206b323f9ed602346557d4a092375c7d614668d67c61c3a15451bb814e48bc555dceeb107fdeb488cfcb4394878fb0b88ff5e0f408529125382f3de1879a3465f7f0e3252c1ce58a1b4ebb85f35b95dc0f3470c855403471c789027bc6c23f371d7a53d38f1fed2af644af7399add6d3ca6ab66a13d18028fd52fb90afbe3bfdf08f4aca16620740b60516020c5ab8a17a7ba1b6f267b41610f43ab5941a3ec94f74ebab67ab3b0f5158b7517ae7fffd30395b0fe3a41083f0711be3688859a8340bbe596144688aee4ac4f636050df93bc9b68934c6cd0b8a9b011605d53135d22e27dd9699d9b02df1578845c0e217a5322182acc3014fca4002399c854c5ddf50daa7548dc3fc65bcb96b9e09e402b97e1253792894bd8edab1345bbfc348682f6566059a9fff5464e88b28c0ceed1d5eaadcf55fb4359523ffc136b71148fde7a0b159f3bd4ca3d0fc4833ae3fae55c9e061f07639ee5eb13da7ee2e66c05eb1ed508c8faf4703a7b51747102a3efb6bb91 +SHAKE-256: a0e67a267d4b46f495525b7d1aeb4393259e7b7534d065083aea9aa5feba6874947b25a5fb19db5d398eb571c90e9d0efe900df181c3fc7ab9967cb73cac88f8d46126f9862c713fbab358cff4a84a7833a9bced274675bd89faaeb3660951a7812b80c24a65d4e2536a5e8bb24b99d45f458c04e3fb0203d148ffe03ee5a340dc358dedd0bbff09c4d14fafff489698b1cc0178ba74e1b8028a80a9cd10c1086bebeaad3bbd98dc885e440629640d3eca48db39c6af2064ca8ecb7a6d52f5e3c28e9ac9237658181a5d62954bbdc0325abc9337a502591d66b46368ca206aaa5a21bf1bdedf5dac276a1ae7f21d02f79a892e0ec3d0e249ed43b77a68ddb04fa14b67ed87e144bfcd6e182a7adbaceb77d7a12e352bc65370f1f320ae537d8f14db27901667d9cb28e58a96e7d73b2a939c01c1f888e3cb9ed4602dcd2ca9039301452f4543817dd7666a0ac8a0c7c4c082ef8fbdd5589bf923e8ef54007908242478b173b40277fcc6f3f8c9af2408426c6fe561b6d78568077fe3e39a7163b39295766081aaa8dc1fca8438a20fe2349c8d5a26449d3f7cff99665802a54bb0c8a34d6cf66fb335f5f92c392e8178626c9953c5f04fd1d241b35569423bba91e97c11f245649f71eb478a0fcc551bbfd6f3317912a8aaa26a6cf09a11c72ffa287745faf645ff268055bcb6569214759408f280aea774256b52d9a93b4406 + +Input: df11694153ce690b03478f30f41c6fef1346785b807762203650674d50163edf2b14d7663fa58b0e309f63a34acda80d640a6dd553364c6695c1874709819c3d468739e14e287dbd54a8c0c7b0190a044bda36bf215ad11e22e4fffa8e469cfd8e5378b5924f61dddfdd70167ec2bb8ed88437965f0c40a65d3cc4e21ec387226b085c123d54f29dc8146ae1a121d4d66812de29910e3c72f31d28109385ba2c9fa0715f686e856cccbecb6e7bf7fe7a133e517f59ce613113e79748f8fc87d9bc793dd16e5c7198e3ab70dffa143b3413b9a8dc79abd44c5d96a59b1b7199a97f0b8d45d6f32101e0a8c2fdb6bc2731ad1a482e48e5f61275770083776b3d70f449fbb12c8a0bba43a243972c9b0dae93e4f7d9b1dfd0edc9a687dad656edf579a84e5674ab4b3813f7bdc8f5e791 +SHA3-256: e0badee6b1666f94de06ed4b5b480f14bf1a9d68136655c86a657a9cf7e7fa51 +SHA3-512: 50087056808d631eaac97401eee467dcfba5faa819b988b41a40e3f6b440f1d5c67a3e9159deeef676dc5c110a035e96dd531b4951b69964ee71cd35c82fb6a1 +SHAKE-128: 003e1cf09cdadd457887a56eb2138cfb8475b3307e1c7b494da2298daf94722e33e3ffba04a3d621ff4817d9cc6adc5229eaf9a7a9a57bb39cf554171348f779ef53d4e8662dd8a9e3ba77593ae19d5147120d5c5f559fa1ffc1a2ea4cf4bc91f5fc579d8b3cbd181221f4d03549021c9a68f8c9a912ee09ba2cea394bd050d971ceee8bf77586d45ddab5eb3db35dd09d3f8fe8032826d53fb264c946f2eed8aebd670e6abe76abd8bcfb17c4b8554179f16bae1208bb387fbdd6d3783f5c76019ae43fb3693071625b328a2c055cfd6d72e2be532a73272c57263154e5cdde2657acfc48cfd2f0376a69402ed4555fc7a2a51fa2e8e1a7977caf05590ced902fe4946bf2156d21f00ddbda1c356ff57f9fcda5f06db28d8868abdf30a98709a85c9d0ff4792ec2cd88e4d19d99a78966d46222756247227fdb7b1cf9b8e3a855522956133dc5bc5321d1669b82dc53634e8c61056848a641941a861bf2f6bdfcf574e2bdd888be4cff5a8f42038bf763528e0db130b71820da35be1447975ee0e1bbf4f62ffc395254b48fbc97ce30f6205650b630014fe68f68bc9a5c2732db51055bba608e9c54fa6e7b3c5b0e6ca54a53c78c856bcacdb43ffd60edd40114195765c9a98dc61b13ab2dbf27322dcd5489b7b2138bea34de2f7635991c113f015413fdc9082198e944a7467c66d0fd191c2187f661edded4e836ddb7baf8 +SHAKE-256: 0861b8e77f6e1877e336374694d35f81ebf2382ce959ba6c59d0f2ce6a19379bac5e4f0db97496c2d6176a7644b6b2bc12d651f842f7d9f46d8fe89d5d18c21750aa70d86907f1df85907a2161839c16f7bfb2ad87cba4b46ea7e393fa405a663fe0157ebb43e6fe06602190f1f1d0750539c9e661dd6fc413f254b0de8fc64176206a532da402578d8c1ff1a4b0a31e58def3d2920ef8e4069e28597e175416a965545f402954247b7858fbfaacc3ec994c670e21d1e2b8d9c3eaa4d08e420d7ad975da66ce698aee4437073f93818d95b92b8fec0dabcd8489a63fecc556cbabda2601369703dc4a8e3095aa0ddee0bf13325e38dd0c9df2932ed86262a7a1ecdd374937dc3b2a606a8a97b83b12967ac7737f24fd9ea4b10917be4eef337b4235fbe4c92ab069931c0a0993bb7ad0d9da23c657bf9eb6a4621646e028085545d5a93561cd7f33b65752f1e50f7ec5dacf896061657ffaf525fc441340e60c7ecc6bd593e95342fb8d5eba6db314780bf44f724df877e0bafbda6207d9986758ae96e8a63375a5812aae28c10fc75a4956600f3bcd8a1a3c3cb89cb80da9ac2a878e531741d217d4a1eb7466c200a6f9a5ef98142a0a6a6d81d76376f7a48bf36e8693bb12648be58e9c31081c86a929be6597d001f4ece5c5b8ceb0e6dadc58e46a06d0edae4175f3ab07a62030fa3b1c2ffff51213d424c2e4db59c4a07b + +Input: f37516016bb9b67587f6518b2e19d04ca307170111b9744ef895b208c62aa576b86a40e7933f3f1c0a8abd79074802d9bb0589db4dad5997220d3cd712d16c6ecade2d72fdfc77bfdf6bf402ffb9642db1ef17a5d70dbaa4b874c170a256fa23f298257bf63a2b39b4a523bbdb5adca54bc8ceb3a1d45bc61ac9fc71b0790d6db5c4eb952fb25fe8fb464011df75698cd22fb644058807a9cb1d43eaa57153b23507c94b1c380955eae106e56d365efdb9a67e5af132a7662a4c947cad2a41e0e32fd701d660b7246d972fe48e96db0f4ca686c3366134f5445c31c3206e2a4a2a9db2a939d775c08bef8238f93cf17d787a483273b05e2eb7dbc7d1a32aff8c8b1582ae91cab2a5fbff6ab61626b067471919fa94ef678329cc734c76450b2bb1cd25782da077e2e49d7334aede1204 +SHA3-256: ed116a22632a8b54a6f6667811d5467f5f902007861c7961b00517afe2aef3e2 +SHA3-512: be77b550f7c1bef8a8a0833d0c5516d726cf7ba24aec15c9000e8fbdae807487070e1c46659ada850e70230b09ecb9304848ad091e12b996da839d66706912fa +SHAKE-128: 40fa9a1ce9f50c3f97300c73c30ccef4349cc73800b9bb307d78a85da4cc9cf072d9d3bcfea0f36bd5a67d3ba408344b49a23d33c05e06fae1aadaa16401a3a2c04eea1551f84a8ecf9af84356629ae12ac0644468f3d516921eadc30ed9435371609945c313bce96997f07c34b9adfa77e4cd9daa7b8e5204878468371c2aa32dc193431d2916f81379361dce1164ece6ff222aceb48c20738ca732ca46670191ff614531928ec815a88e4b1b2ff3609778868d19605a0a7f02fa94c6ea5b97e17ebea252e1a83d317419cc9eb3b979415d0a627622b9c1383c997752f228d7f91e6d53f44b31ef00350d1dc3703b2e0a4964ee55963ef635df9983f3a0f9944cf564bbff83ca8454d917a1e7e09442665f662572b4e6070f3f36cceda076a3bb8cc1ac6b6a2ac2e99eda1c04f351272d77e3b02ace7efc6ebc95e8d732cb9cf655eda636647499f0e3e7a19364da118b7294ae9aaa0e0f1c265c42f9fcdd3e6d31420dd3c3c63818c07940286f2fd007a290588ed12e68a0a5d5d280bc89feee1696727c06c3e81a87c16e42279a5df55c975b0865fb33740a2c47000d3adbfec7c98077594d5d1ce5f5ecf5f57d27e568dbd7d5ff96632b4b8a7e708fe2506fbbd390801e39fdfd843e3f27f6acd7041ed05b3762b3d975b83cf960288bc678adca9750b4a027c10d4f6370278bcc4eeff4cfdc0d6a46abf160ff48e5ca7e +SHAKE-256: 65afe99cf9ccc48b1cc743681aa8e693800cebe8a84e59e1427e0efe3fc383b4be164d139140e793a02f871aefa7d0e147623116cfa9e8ca7f6d13418857a31afe779ce7ec0836544789d5786a6c1781021e2a1b313c05ccbb0b75568b9c8480e69d3594e029543726351d35981725801ae82816a6bc20609cb12f6473a8d119d5f3d0149a3ff57e90ac3aa414898eb1de44ed55489d54aa93216517218305c4673cf7f66fce48108f24d83eb4b4934911cf6abfc4186a564790aec4a24788a26646cd344e3bd9ea84227162030ba5c27fba205c35fa8393e590423136536cf6d07ca31652b1b3d25be100246f1e41d1ea2ad28c6ed7b2b040df31033a819aec2f507e242ddf9e695ea3f6d1f64fc7c4bd6841fced22d512f6123c5224b4017c4ffd250f483371eaea7b4f6d39e30948007539697284a5b6e8d0e384115a985c9c75f178e34f72dc328b93df95471dfb7ff7704a52aff53e07b9fe106a25d1b807c21af9aa0f29a2fb6ecfbb87c4bea000b34d972aa8be60c7af6a9dfaf73e9fead417df0fdeadfee97fb297842710485f6ec05d663fd5063e3eb47f041a0db0166e6993b4082edf94dcc86c470ab7e4628629bda799c13c4b691b7673a6a6aab49c4a583d59917cf6a01a605a6390af53fbeb8ff2a1ca1348ab2c788b099273ca36717385cb8f834f3db669ee20677cba90b118d818af6e9a8b39732566b40e + +Input: 81becbda93498502a81d61d6a92d028b8cdb474d679565581a3bfe8e8f2693739a1312d03edaacfc565a97376c807cc94d1fd010859a197a942cfc58168e1327120579ded3cc24fe84778fbc7680e3956a5f1745533e2129cf5fafe4a5c6355c752ba0948b329150e94ea99eb88069a34065cb02e299f307684cd072945347104fe4a856296dba9cfaf18d64dc1baf907d792d1efc1a58ae08251e418f1d9d74f3f5c9db0455fa888eb5675ee7596a611065bb779c8eabe6dd27947f4bb8275289632295ec54cac1f906581b9fbdc98e8d283a4ad96e7f514cc0e2e2c9aed4d737759e02c633acc2e18240e3d958eb37dafa959b0f79a4f1f8881f72e7655ca226c46c962eb905d33edd5d79120525a6e1fb0b0870c8d90a73a6c1831c010b277ef5ba56e8f72a87d5685ae150eab893c9 +SHA3-256: 5659d1214b4a59ec8a18495848d78d0b80da4e05da29436f08a87ab7fad67c72 +SHA3-512: 18ff6ef11161cf1ec6c7d787828fb8935476955b1b484534884bdfc3fa80093b57736f1814c2f7b9a0e287367e1ecc3692a55f2dbf9d85461e6393ca53790231 +SHAKE-128: 798ab31d47271a183bf8cbcf098959d5a2112bdef2ae2aa335f85d8b771cdb81851d9ea66fb7a0895efa095155ac416b2708944291e0bda2a3c520285072ad10984c17f471f5d2fb740f7d35c51f9746140e6920b4abc43653cdc48150dc56f1ae5ce3871bd241bde4d51a74e8e26439b9590901009f908bafdc21d743fbed9bb804a95d17d8991e1c67e5aa5b1f766e9dfad1469777327145c63f5b83d79a784ca399d7924db0f602b98d4fde28d68e57b0d566c2252083c99f39d86a0497f7ab2537bb6c4f040c551a127590fe4f76ca46041273e90179eaa589c49792ee3b7d83ba2c812ffad719faeda527288f159c813c7bd398821c04c959830c8141b0ec50090f3a743ec273d47edbcda9dfab0fbc0716c6a02bd809128fc6ec3156d7b90fc312f814778a524a91c65360a998cc62bbe7cbba984cbc027dbf145938cda6124f090d51e1e907d7ef0251b069c0e4e93d47c7f1022274e3aa46f10bdc35ff4221f4e8ca111f11e5b2376ef2463e6ac28c19ec3b8c0a7c2b7b61a60cf2475c9222e02fa1b33ec7ba674b3a4820eb1d6be05e09da2a7ef80337492f45f01048153dea63c36e236488bf0177f9f776b240c5a98770e1e7c8439c16644daf530f0609a16d9d0e4ded59d6a74086ce45346bd9f6a8f340fe3961472d09019bdd8d8e800f2a4e18a93c8b9485ac35e7de3af82a25b608c3c7280b336e1ae0f739 +SHAKE-256: 2a58e4ed7c82856574cdce494e183b943a2a73bdfb6d54d3fdadd7bd9791cdb24c5e49395545c3f0712c1320894753ca739a1edf2a810bb8f0efff45218537b064afbb2fe269cd6138ecf2b467547cf0f7a7d654007bc7019f43f11633e979f1391e1e0240b6baac485e49135ffe8c97da60c0f349d2021b3f69f0f9e8d12fbf5d0b733d89ddf09102c93635da5660ed705f6e24ec49591c5fa5c9c91d0c2f22c594f1e292d263fe76676a4778c803a15c7902b5984cab8ece4f6f088cce45056c283c60751c34416a58d9bdb33c5350290d6fb325b0a276aaa7400a6c7f60e6bd6d81a4bb9824ec1417798961508d2201daa8139640d641b8103401e403f4e04f3277ba64c5215c72895e93692ca9400b43c6a01da9c4940b9d30807060ea5a80fbd043675de7e977f2ec3a117a0c6e4130cd5481cfcc7d38e309dd996d0d0ea510f8bbd0ac8f10c70fcb8ba321293dc6010eba9d3b867f6578b6ca2bccef080c8d9236dd3b3d985a50f8b0b9ebf7c9c910dc407afb1f6725748e9372cea88b6358a44a483381ca71137d60fa69a05d91d701cf5e4b65cfe2cf28fbc126863cf34913c983775454601f5236162b0945b0f9725d360f68ba48f5ce1a8d9181f92c2833ea4f57171e3515b8e50f2ab558cb3b47b4f14e10dc00cc1ba3584f2c7dd2e97cb67f25530449a042b2287bbae48f74074d11104fa2b8436804a0d0ad27 + +Input: ca4315c46acd97c37b76970d61050102e7ddb1e4f95db0c81fc9d55612a1afe71a2b036c64ad864c4550fb6b9377a7bf95165df87afed684c58ca205a2b39292b28a0838ddcb9f2385aa6c09f1e3b6bfe1f2a01178db8bcf9173faf88c47f725f0abe9e2e821c5c855bc309331bb77e4dd1065950cf25b8b80d59ae78ba07ac2edcfe8b47fce1bae3c3855c4c886fac4f4408e65053e6384ecc55ff3d596977d4d7210d08694023b6dd813f3662aaddaadb507485093801ef03af9c81325f57dbcd06e6967dd1d81502453f91021dd8e07d19eb85e25cca18ab58a3e90d4cdda237eb34fc2522c6fc6409ceb06d4fc80e9f1f73f9a5879f120ec265a4df75e9620df5d3086aab7f7917098d746bacb9c6bbf500ff5ebe8625e97253fa74ddf65a29365f760c60db718fa6df6e61125297e45 +SHA3-256: 04a8f7204bcefb506b572dd5c8538b287046e43e5066815151bb3c6e6dbcb253 +SHA3-512: ccc71224fb9dd702111fdb9dd7a593077024992650021cdfed0a4ff7e2f3ab655e94e85646a507cb3de4dfefbb013d220100cf325f33e628c33d66705d1b5537 +SHAKE-128: 989c604d033bd74c50b8261446a699799f856cfb1f6d3a936262692a822cc1d5d64bd8e510332b65f7fd4ef492fd3a21f3641a83527e8a44ad7122256a8733c01baff7e9bf34fff86458dffcc27bb3ec41fe266ef1459e98bfe7dd900838e93705c2e75d762ee58d24a21882a5b0ae4631480fc23ab203db612073fc4f30d60b949394cf9a02eee44a57fefe9733b5ff103b280862300e824e532edbe53088612152412d982e0625a33d4f5bcf34ed45d6f92ba489e73f06a684c4bc2016a6e2cf591a18f9c0464140ada6efb5d70ddf91fd0572c468cbe583bd455cb7f8f644fc68df1688fa57e066101185b59e0c3b970b4bc17bfdcce7741e8b4dad8e144fdc34471d8cbc7a446c5bd73e074fec09292631473ff17b9b140be876a403e1e13cbcb6dd0d8dc9c70354bd097d0cd511d48eb7dc1ad1de42bf20fb03e4f853f86fea6e8c8ff5d20bfbb7d6dc89260f86794253dfc719a876b5ae64f1fde3c374f6611f6f9e1bf439016f79025b7b76a6faab937538764f35d6f746f5f6e89adda68249d4e35fc8744fa165cb3c18c5b78c8db48ba710d156e9ffee11bbaa063e86e7d073d0e03a5be5f3d2b82465f3407d4009f10d331d0730b95fb17e13726d628991c277d023c1bc9b7f78e7d0f279da39aa89df6a83baaea4a2cc2169252385bd6d33e23e2b837dd3d88deddddd238ce620087af8548556020e2d0c937638 +SHAKE-256: 87886ccaa45a414cd7226cccba707a264804e0dbd539afed16e020a4a68527f19eb0ecd269f69755ed7723f5e2403b63bc7c58061605b55892b714b2c3ecadc0aa2103311be3e0c25b4307b314e0e518d083c4ab42e3fcfab9a1791beb188d3e7040a254ce8b69b08dc94375790b143caaff270e1278c63ec914186d8169dc0b680bdc906b75595dcc59cd8acc2b2adfbe736bd0147f3578e5438ab3458c19f8731cc23ea1a0fc1b69f0d3aafb6f2269fd6bdde52bd14409d245df5f6cb13b88f601db75a884200eba9c4094ed81785ed35fd95e43d4eb4ff786b28d9bd02e576c01b62f8e751004e8810ecf5878364b24e960467f643142b24f1b7fbbd89a93e8ec653cb67d7111ba52635d6967db0bb16fcfc96fe06715cfbf7bba1bed5072a7be2aaedf3ef7a97b6fd97e5d07043764af8d6726e7e583190bf357751ebb2aac644d30c53fca9a8a3da5cb6a812c45bb2e6b060dbab51c04c3272572a03122f47fbfb3def82c301cfa386282b997e18392aa4a07f051ad348f37a16c506828e32e75574425604c52b185c6e8895f02c6ab56b292856be9ca033bfed6cd183d51166e4c93eed9569b621fff08231fbbb95d6238f3e20be4d99ddc2d4f9c7215e619d9208895d1aa321c2f28b20c32dd750cb76a2dc1a004985d30b3a15ad57a16e69e70494a7b5dadc0cc4f10e272c4d1a822c2fe6bab6a05a4c4826078a353 + +Input: aeb5fcc949ee6cd5ecc0aa6bc5d9f1aa6e87894fb4c44ea73a17256b9066a32b6dc94a7c3013e4e27d925b7b702ef867b071345dd3238796118b980be568aadde3ee973096e5c8881bd4f466818d523a7202b6b4c8da3f9bb8d751a101595f68874533d59ec7eaedff2820853d1bb8a62b92ab924d80e6468bfbce3b7629953e3e1dc147bc98038694ce4f5af655541fb493f855f62e0031a7e52541c9f085bee4c6d12b5f8299245251102ec255d9090641e29d4cafb947bd81d1c73e689a7594c0e00fac67cf0c4e9aa8a5ab059478e77d4c9207a5eab82ac15046d139419aa12bf0bbde8eec6ac57658dd9261f78e9eaa06aa945f606ec342422922ab04e511aa13861f84249e9734b38154ee647cb277560aa2ce7dace4484b1001155d790d8084edac135a8255274638af773139e5c509 +SHA3-256: a96105072cf5b42026579dd80baec04ebfd7a536d9a8f37265eb69c585ae0934 +SHA3-512: c57adbe65452a3b420c9b851c0293de9a891bbad2de7877580a772a6364620bd69f3fcd2fb7e7347c52db8a5b5c003662a32c7f3f4a5b31e80b05603d47ecd9e +SHAKE-128: 7dba93f35ddd5b5bdfd0afe5740e2160590db05925fa1342696a2f2e14a9b8722f6a10ef9a77f90f363814f0a61dd4f40d66a9112480fb7fa44d9b58f08ab2d0972e406347c89ba77892c13bbf0803d3d0577b3a5058144f42478b06dbb25395ba5fbd788a24eb963e8cba502b93cac69e0f5f0a187570361eb1319ed5e3d56f6cbcab89d12405deeee2a4a14353465e1c767be01e5f21bd40bd71d77cc1ab1d1a8b0df40769812e98b63f0ea9bb69c939acdec5c8ccbe3e19dc0318daf63331ab86be40c622f743619eafa9fe284f92f8ed283313e372f30c69a75d1420fc2b3cc8b1759f3ab57b48d2eaeaef88f4a2f44eb4aad86a95e3d8dbacac9797ae9eeb37cf1a6407af72e89bd6ccc32ec972f2172499652b5bc525e7e634e1a4a07b7addd8e59024fc6dcd8d9841274e80ea898da517ea03728ed48ad53d8c84e3d4db4b73d2f680cd57a667d0a00d07198c1b7d29b8d7c683c4e34dd380afe03d2b5ae4a807500fb67d37f33591b2210d07d1cf52f2bdc62dc3eeac6a9a71f6c7180cc02aa92da26e9becf2a6e6fdbe25a91159d62ffbcbf4ad64b1eab0cbdf3aa64e809250d3d57c317f4ba48c4ce56f02a8d214b7fad6404c75e8ed0f387ab9b72997619f624823ab3c40dae2b2735565829f5f30ff5a4b496f53860dd764c01e18fa53d97970bfcb0c40c292e639a1dc638bc232913db2a90e9e6af7dea852c7 +SHAKE-256: e3319fbf8e3a1d2e32b7a8bf40b969db5f3f6e2de978a06eba27007a9c03f0a6d32643b9db01296a4ccf984d4791a8793660ddb5a366d2970bffbf31622e3a9245082f5b8bcdd64a11ae49d92f4ed52ffc5cff64d2e093aaa495e9426d5825021776db47424b8970461fd8518185083d2e36eac7375b84655da44f49efccd35502fedd3495af29d2d4448bb4a74eb05857a7c3d9d9cda121c93f705be58f82855ec9917a52e131d6578094cebc46c02c76c6074f6f736546e47047ecf3fb6b68aff99204baf80fbbffee85a58cde71c4db782591f45607f7213d2b00b4d29c2c15d9893c6be0e63681cc720bcbe8b14cd32c0821bbc950882145646d0c8637c44d74d9a6e933660f7b44239d53b88d7707942c7dd78791808c43faa51e720989e5303f966b4234363afe34fda0ad1bc7d2742acdf0c12b50de2d794696103852c3900526c35d842098f7b5b31339304769637c9aa7fadb716a476ad2777ace5a8e1a96bca143c770cf524474a2c3f43614b09b9daf227e9cdbc0413bef32d4c6eee4b63289f89bd7fd31b3798d7b5026592e75d55bdb8ceef3459f747b27e0292dd8f27bd43fac59cc01a9e8db04d0dd636b71832f875769bf7d926ae198cea4333ef768cf8b895c6ff7083126e1d8908ec8096b24679def39db34cf0dc7040f102ba09dc09bd576c5e830cf7e45ad25bcf1aa6e5c1a19448b3c756aa703bcbb + +Input: d4b2636cecb58dc9b609f23176e1610734ccc3aeefd2d33c1a8a40850c0dd908b587cd6d03099bbf9e5983b4f83757c7c1c276af01ac1f30a5391dd7ebf8cdc6b248974c77ee5ef11e4e73e447814331b644ef53a13c47ecb01bdb62298e6294c85cf28ff027009fcfcf68579d7a7b20aaba88bef69db0861e285269b7eeb43b9b8f379b1ae94ac0a7e82150012060aa74d4145e50bbf202da20a7ecd3cb5cee3a80d797af95875f0fe11d92fe1e9293ce81cd637d47792a0462a123b6ab5ae50ac3cbe737f3f17c65d5748abde58d2d18642a09531f11820393c74fe327c885d8061b0e1d29e4392c2ae227d6d0b0e19e432c78f329569d2f9aa4a68f7f19e259e5c26806955202c21a4d833a91f2dfc9dae0134aa441c656696b1c1c77443f2271891e2016c9f68747992c932a500ae6124e8d +SHA3-256: bf62b289e163f452a2fa2192aac373ec0af03104f2415b5c424e0452261dc28a +SHA3-512: 94bcd370a29f9dfc5234f8f715562004822facad148c1fc2bdcd8b42888d33551052c16d80f6f96836aab079b9ee45208c2f5f04bbf923bb23714b8597bbeea4 +SHAKE-128: 92f4a04bc9021340e60c55efc5f816abae9580fdba462be1a5e68c465360b52fc386594161c8ea486609bc48cc53713f607e994b9b5d05e14308b20c3801b72ace6dbee33612a05dda6ab8bc4e407e53b3e125225e52b1fd6a817e05efcc41270879a9dc7bca0428ccf083b986d65b2f6b8b22ca09d6fb664d18aaabd1e31a6b8465d7ad76cd4aebe42eeded7588318eb9790fc4cf7ac041b7d3c28c707987ea2df80cb927d0cd52718643af358133ad4fb2341554a64d6f35ffe714aac14524ee7f9a4fa5c233d62d6b4560014718c9d2b4bfc6f48cb38543e283e99b95d285593d06cb39f1b9801c4f80efb68bf5d4d89c103501259a2ad9a4939b7296273d7da5b4813929e1a5d13e2e2382dcb586d5e252191a30ebae9c42b3a286324ca2a88d22fe8bf44f5d6fe072ceb5e18df8213e93c9fe4128e2a5fdc8a845b883b1d89d85a944aaecdb6f13480e0882e1ad09fc5a08e10d53a18c5e46bf9143cdf3d35aac197298793851a72250284392edf2436e49d79b81688ddb3da42e580a474db679e7837f11cde308586e2b27f65be0ae5ca80c7167b46f8ad5636b3d8dd9b5f2bbf67b196964f0e9d36d62c7497b276243a694a355c2930d81b04ef395b7a252d1ec48d8b9f9f2292c3424eab4cfe66feec42004b6787477c33cec6dcbcf6ccb40f3645c9ae2b85a2b2a35df6f9b21ac956a1b9d25ae77d79cc178d122b1 +SHAKE-256: e688a2b9bd422c5bb54703a949f8d54214c3bf32c73f2765daf19486443ff8254f609fe973c742bcf23bbbbc3bad967a209ea6a52d28034d20c9890587b3ba8631cd8ced9cb363b31349308c01459efa1f2025b097fef3ddeb565f8f1d50653ada6334c069c59974b7b87f5fe4d3d2ce11630923a26ac1aea5a67d469577ffdc3f6b7353e08d8599a5d1f5539189163cfb9ebfa2b651bd9edf3121a36e2f791d6d589ef4fb0a8d389e8f9bbec689fadd9dc7a224b27c9f2465353efe5606e3b02ab4947bc59af41228713ffa8ce130b059100cc5423242099a4d2cceda23a399e6619e245166da0918cf37f2a80d50b173150536edd7aaaf75aa3f76f26004eb510dd08135e9b3faef8aaec0086fc4dc27a6505de254115be72a81592359c3c9ce6b664bc80a7ec7197393014d4ab312b5d0d9e2d0feaa2e5e750c16ddb5722000dbfc98dcf90a414a26454f2bc47811f615a0024c214ed3937fc784471c20c5b6f30e9f807be33c917059f2099696a279d2b24cb36752262af828ece6f43c7d112441b00a88ddedee244ab76b49d95143b499a82b8a102e02d14e1d27695602b5111d91e170272fa7a5acc3d89bda2c0224ac667421e4d694b5c9bb2d766f0046689938fd829ee6c9fe09f4343691e06e3b2855560232771eb2f9ab9091016ba7b9169005b7540e0065c717e9f6aa63d2a0cbb5e6dbaf632d193b54e7a69f3e + +Input: 8714c209c0aa593f0705a04d8e1bc75a0e40dd7108897ad56d6ded5d43865c43cf03e9bf9f0b289603cb4c68eda72756e1e21665a309e8ae196cc25d448f189c2ce0da87a2ec91f3838698c97c38b613a8501c7549ab6c12a6fc6694db8cda928974c0bdf57acffdcad0b3ec1e25223d8f802d0edeeb63565799dc4599ce7c246b955d9a10c32aa8b8ae662a6fe5e7b28c7b8d038e542722813e86937f986a593ecc0ad73839e68caedf8b6e5b874143cbaa2d56130cd1636441c7a4d9379086af32456e7f6e7b37237487b4aca56ca9a8b1d778102db398d5bbd799c59fb23c6ee521fa14de662e80cd42d0ae1037147fd25a4a50e648d5c2d09c44b00e748136a55ed0890a186331d2cf5f46b5b53128bdd90125591494d1ca12e55eeefc435096a36dcd12e8e9eba69e7f77cd2593f963e34f3c +SHA3-256: 81c54e87445e06e4570baa37a8265f09d2cdeeb0c56f1f7d7080a93dea98aacb +SHA3-512: 11ae6931acd2050cba25c5cbb4e1b1b069167ecd2a15e957643b7c591a73150c3d9fdbb62d837740be8fa9a2898a649c41b3ea18b417ee2a73c56695d8cedbc2 +SHAKE-128: dfb24270828d067dc43e48a4d591bf864e4334370353754b7abf959a86de9b7ace18489c5ccde0b27c1f4d8ab280512f625e64de3a9a26e1502b60ce37e8fc32f92780d59a8e5d2a54241f7d90a7fdd596cb0954fe6d1c4e26decce70113f086f8916dd2e311a87f24d07a0cfb4b305ae0fd655075f5b575c4d2ab2d3c29979c68cf9ccb224fcd6554b062877777d2e649576ca205b7fc846ac8173942d55fa2e5261836dd153907c99ec5a02fb0c0dcbab6fbb0363e7369509f30868eeb948c384279dd6adeea1945c1b4234d4108f503a54768d90b4f966382304c7bb64b8f16ed6d2c0e32a59c2dd69273c6c74a240b1fdb779e72ab708d8da1e9107a2c3fdb98f0ec1aa298c2daed3f76025b71bfa647d94abb60e30296669d9c229da64a6229b8dca15b690c98ddc1a8f33d6819fbfb48e44209fb238bd0ff8255e314760eed6d6ee9796128cf94b37c0c19723250143aaa177bda71a03c9ada47575faacaed10f8f4fbca035db31efde36c30fdbe5375298f0b89fc3d3c6a75f9781e3e382946c56a520d2e15966ed0b0f94da33e642dbfa98f155c724c5879967705b3b126152245e264916bad5ece113e3942b17e7eda61c6fc6544c58bf0d217aa8060dbe4290542ccd8ac2197cf5e4dd1ba4ccfbc32d97752e3b5824504b530d3383cffb730a560ed985c8a0f7472bd7dd69286f7102b51aecba24d2b2dce913ac5 +SHAKE-256: a10c45b31c5e7325938672f39f054f2710d321dba546a45f9d28b4a7c76ec4a1e4773c44da280d1cfa6145335af265eb40267f59047b35981628326a520258aa98592d8ab77c5f9053b9900a1b95ed30438a10f72ea5397258b15d718381fad4bf26552a79edc931a5a20266da3fbf7c796cc58e6c824162d80ee4e5fdd03a3c49a149fb4dcf5d08090f9a01c8043428f523f10c78522223cbf63be2495632e9bd704ca81429310abfe25990067ec213c1a01223133b86e3ae3393339a33ac5ced8a1617640c4ea7216b43d2eb24de9a4b5187ad90c3742f0d81bda5e93a967f5c7e1cac8203ef00748bfee124a91481bc5975195933867968cd0c71bcf880a901037b74281ef4e6500867f246e67c3a3635c407c01a739ab61328b2e69a7a22cf0104cd81524eeaecab8e16961bd7c91ac061f4833e7dfb808c549961768c4ff2cbcc56160549c895175a77e72dbdc0245845594876c8a051cee9f1aa329b2df3393810fd34ccd23ab626c0e067f74b05fe63144c270ce96efdf645b8e8dd789d9daecaa7207b506bbdf49c60ed29d5417aaa8d1168542744f61ae8d26cbd41c426abab0acfcdd7967adf3ab002f740d0349111e82e601ffe5fc3ac8330b66ee4a52a5910c34df7f0dda3074d9852a91ea47ae36ce7f597cf733ae9890b37c318b42e20e65b710dd317135f004e7292784edb394456e92c2f6e3c47f9994d8c + +Input: e54321a971715c43d925a82e5b645dbd387b5f0e349b2d52269766e3040c95b1808bb6233f9a51ab5217a09fef77be9a67e15c13552f614c0855e8b0caefbd6e077449bc6a047d452b15d6ab8f308867355b6f47c9b1ef3f900a5ed1511cf2139db7cc34cbd72a2c2d0c209d7f2b2cf2cd81bd25937fb68d5662a61dba638381f61db2886fc47481f421307a237f27f164f243065b6621c38b57b4a018a8d1ea8bc75f6a3fe71dfea4369d42354bc172d55ffde7292f28b175bb935d2fd7cbc98d4b94957717951b5b593ec04ecc4f7eeb5de374c8b91473dcbc70cab2b3fa0c8fd0702e1c26a1fe3e8dbc11c8c93af23650f68fdf4a05106f706155e58cdb6618452f16e6a94db0acd71cf8af9ee87bc5ba0c79838e1a4f9470f5270bfbe04be5b34d1a20c81402e151f3b7ff34d7d0974609aa2eff +SHA3-256: fdf566636c4f16c36e30e1be3ac463f14cd82db3741e425655c823a77690aaff +SHA3-512: 6b68d0e5f9a6f9a27572a24e1741cb401e2289f2d2d136b355ffbf1ed182c4f1116557245e6265c8b17d109b2dc598d345008950819a1944fce2d57791d4e4d3 +SHAKE-128: 091a11385245197de133305bdfc7a131524a5305b98fc301ec405fc6a70e497a9e4a4325d9c8e620bd0939105346ef8978fa147bf6e739a69416ff44936dc379ae1567e3e3b16ec180985501be9f7b1ff858d257d213d832f19628f1e2f67ef088723b5c3506fbd883c996e354fe9d598da95796ad8986da1f4b9d2cca268b7e3c9310456a1b768730a4b3bdc750fb963f5d4e4d9b5d5379e11129cf8cc4c980de97979df6b0fb343b096288238a39f55cc78d16a732fc92ed95cee8f3eddcde6b4335d68537d565623945c2797bec030938813b7ff3472f33e41884d0dd9ec216fa725b0bd9f9d2d4a75eae78878765e8f72273c3d13621958c95c3b0bd90bcd7651fd9b454e608f06a2b7b549275b78993be6ebd4d1fc3b8fef839cc0d0fd6bfe99b388dd0ef3546cf411b9be870eb29387c86edce90ee0b83a39866f337ac59c72803cf0148005818fc7273bb1aa39d18196db789eb9de9e71e6a753e8136b57bda12f953d1d0a22f86c401aae71fde12d908f90ddf6be3d76913912906c0cf59b5b0ddeec54f5ae1d1308632bab9875bd27a710fdab47f43aebcd94061cfbdbbcb8325e991bcc74d635c18f478efa1bde3af0dcce40c11bdcb06cc8135b61a60faab0e4571d861bfa2cb8487a1d9982cc3024fb5cd78e08665b66f701d06da4fe589671faf133259d50e26efa689d6b72715d29c543de3261c6d457261b1 +SHAKE-256: 44b660a5a4df9bb7c7777ef04804d6ff315ee50ea68f7ff62ff8218d063991f75f4d63bbbaf131a32d36245a397c33563a4f721d8c17ff2d28570442cece41cc63928581e23ec493ed7c8e2fa7e90f19a3d6531c19cebdd1ec3ee2d8c751488b99b00155dc4b6052496332ea9730d9b327b5da9c6954cfc971e239824e6588e0f2a2f7169994e231e0b84d81a17425cac347956737e5b1a793e3907ae4559ba1a0ccb9df030637d0a7dd43b2a7661e992931bbc7acb67552a8661ae27dfb379d8383190a6c6ee65f49001494ed95b86b92e6c71126745702e28d462a3df6e218a36f2699546f269e9817c03e41efc86786c88fa6d2f7c9a8bc216328b42c13d6434199c686c652a65a61e4675616d1b9bb3e373b1e67f1e2f682e3294b2d8fcfbfe6af56fc082610dc0f5f7438946f27136c2575d6cd71891471f8c091c8da4831a4ac683b7b3f5ff89088e41ae29172a74e841ef32ab507d3431bd052de6457b3ba531c8dfdfba5c76ee961045e497f35e4e165ea952f95030d5a8f9473721720e3dd28d1822695a0bec894adeda611e384b86d2d8ec893a723cb5ce176019250da8cd64e9edcba8f927e211d5564f77642e41e09d6fd22e11b48d48fb9b19ea7d5e06868ed450720f55e8bfcded2505d91be002ffbc748fe70542cdfacbe7eec921b4deaf9ff66386f94eace732d49b0a61e376ce4d5be23a278c538447ec8 + +Input: d9a389d68743a155209f4699c94d3b1aef9320bc29386bd6ba49a86b575ae386220c03d04470f8ef149b5c46b75fcff237ea98ac264802dc1ba1c8830091793e5a1e104fea96bf467cbdbf8fbed2ec7eae1a34edd16d96a65ccedb8ed178686beeb5a582ee57bdf7661e29a644aa464a60068ac4ac137ba91e668eb91fc29023106101be77a2cd77173c7cfdb2e010e6a2a494eabc1fa9c1672c5fd5418792e44f359a8bf59da29bfd167e94e5d93bd98268ea145a530821175ecaf05f4d1ec79c13c461cea3eeca48c05b570f47a1879adcfb75645ddf80feb56302400614edb9c810b11c010df854c9b42670172244e6d7df5e892fa0adcad17c7ea57c9398263475a9a8e02576841c46b892044bccea5ad61ba753ebc437ca800dab72cb5b2c31b38653b2bddd817561acaf27504e8912cb2323dd49 +SHA3-256: 09d138cc642814ff6ffa408c0a146997255b3b1b28fbf2dc56cc4343dad3324c +SHA3-512: db06ec9ddc3f5aabed07918360e3e8e7e246bc2e6a307d32bd1ab3165a787a1b41b623e5536ddaeaf7d4ab272587c19348b6ae4ea1718bafc59ca018df6676a8 +SHAKE-128: 88ce7827185232203589eabbc4adac928941bd99de5f75bb8f6813405cdd52919fba4c5be7aa45f832504ed4d4e3a7a8b3a16fd6e05e037940a8acdaadda831985eb87cc9811a7706129001a107670f7dd2568f79a90c0f61db2a4a0b4920f179f782d21f8aff1e966ee18cbbfc0743d25ed703cc793d032302f3bc867927343473b8981339ea112eeabd3d6c6674b8a28839bf866ce7581304686d2b49ddc8442ddf7ea5abd90d1f07424da33765f8d61e0364703f0065201f1cf7a70c6f02b05dec67f3264e510249a6d4e4b230ae0c0999e9e7b1948a516fa5e9fbc36fca0b74e4124488d0d5c43e2732f9e993ddad4bdd8eb8d4a27285dac8d8c915a6da10a64deb12bf001c12d9d249ca4a98b10a5f925b3442c2dc4763902c839a01da6d98633f8fdc9a15476d4dd1a5942cbbebd461dfbe756d67cc3808206ead0171227a6f31d25d6a6970ab734e679793b3f03bab1006bd433fc6531808e5956f081485e2c436caa0a51226a0d13ec31b97aeb4acf00ff5f50141eaa8cfd8c02bb9255b709588940d691539b99dc139295ec37e5b14b23cdf17c8785a3029942304260727068ee29f83143ee4e323ea48ae5c0691f1e61a961bbca2e280404b879bbf0e9af985a3fdaa9ad77cabd3873733c2d0c60c1187cfbb9cf96be9cd3105d28c917da0484fcfe334221d279e7b25d2c10a3dbc5114742ee94729864cc40a606 +SHAKE-256: d188d7c137813ecd13ebf55158ec570498c73d47db79a9277223dcb1b9cd6a194105bc42043fab0298a305e5894fcee9064bdf0cc240ff8ea30dd1ca928c3ecb8353d859f8d7a777be1eec1240fc58334bbda98dd0a386fc23634658780b63d774b1fdb93a34be669c02b4b1df9ee56caa43affa77f5ed0876dcc7f8a7f88d6acae92cd06373f36e33afae7965364b5c4b77096b4d95bf02f9659832811485198056ec0c6770ecdf5be6738111489414e3508385548392890b24ab902093e2df5442e50b36186bf2fa7339a61818cd77fecd098d8b95407a5d0ef20da61374928b79fca15be0764cb3ad2d9634340b79a61773944aa811c0da50195c5dc7e4d5f5bdf7d0b4af9deb9a8dea16eb7238f93414139698225914e44334e5407ee1c5d7906999e6b9db11fa1ee3afa5455432a0e374ed4b97b1ca7422898bff78906f0562a925b6a800fbb962337d107e326b35aa78ef4eeb2619035628c11d4309f7d031c9ec46214b0def7b414cbdd1cc36783ae59c8490861d6d7717e814b2a05e947d2aefb045ae666b316428a028b0d4416b1db852ab8c6db04fcee5545d90fe0b794ddec1cfd1b1956df674fccc70166582a62d9d158ba0e2b8e3f9db6a857214fdb02ee7913fcd3d40864ade5798a4726c6a0b9f8c61f8256e8d99160e6c9ac034280c33418236add15d20dd880cd276579aea0b89e1c1f4f983b71d75fe03 + +Input: 6bad96dca5417396cb5c4ddfe0e00c030e426614156f168ffd76c1bd5f6dc538ac9a7e506e60a73adf4e714cd354ffd4a0a2cc1ad0ccc41f70769f585873897500c93278f17a0b3213ed6bd349bcd086adef33b862d06ed915fb9fa133c55cb163b6778b2eeab8aaea424e817a378b72b9cdd653467061bd73210ec193c16d1a5797fee0bed814039f0345775692e2c5648a519d5ed3a495735b9c734f2f897b54bb3bb76dff2f1a1631690367b5204224c0547704a521d1dc8ea60159ae932529d338a8f426c7f0aaba6e95fd714a9edf14b553db7eeecea3b8b5f6f922e87b6de89600fb93a5057fefcc8a0f5c5889b0d77ed8ca2580c346853b1709986c213f7b07f38f761696255eb078824e9acad96a512c256a5c4d51da603335e2b6f5d56b23d0f9248da480bff90ae12cd7464dc0dae24a922def +SHA3-256: 38c9e3f7b75b45c66ae876dd5b5a7671711c7fa9d701b46d2c652affa08dd290 +SHA3-512: 9c2b4c6599c2629b28e02d0b9a18367f87519bc52dd9ecb5d8f6b1b5febd2cf76076fe11199cb566979f8f57e0a27d0b6042b246f7280c98d23e30f27426d49b +SHAKE-128: 1498428a1c414799c34789378a04c56df8d3c84a388c2cc269de9e786344f00465161c9f1cbbb74b4fd4637b7ffad021ddde4d13ecdf61253b0c73add21c7422ab20ac566e60e57888d354acb5ad14b2e1128f22e117dc536d08c0befb739bec986af8d981dfe75675fbec6bad8fb74741fb9fe3dd6f3b618754e97cf7e976198c82ed473d878e676e8a674c148df163b8817ed1236114eee37c0bdfc8ab2e835b9cdb27afccb5716d08d6c189f5e43b96fbc8daf7bca181562ed2f7b0fd7d767d9d4542652a5858bc87ffa1e7e18b0df4283de82e9f5b3f4ea71ea2a293b2de824cdc22e3a71cb8f41e360dd7c49297ae9213521481a972c71a5e95c9ecd3e589f62ba3d2263065d739d3c983faffdb3769bf8f491fdb11a0251c1b03c155ebee5b7198081f801328baff3751d8663391784ce5ba53fffb8fb3de4109ec3d574e8c11d9cf7cfc50aecdebf4ad96ab486e52acc34ca900efe056db93cc75db4208e1a28098ad649a7db418f9a28e4956815f47c9aadcb98193fbe46e44f10153076b56e575134968d956a04ac2753f70bc0a805078be3c6fd1dc48a9c60f043ad9f86d12efa4677d1056e5394b69691b2eeb1f79148192fc48a059b7e38ac55dd5e88f16bb3c8f472ab597730bc6cc945d8d63046bbdc840bd2e718bf3b37f76ca41d0723767010bf64653aad718b473ffc625c2273161ae0a3dc7e808c180bc +SHAKE-256: 769f91c5c69eafe94fe1215cbe20013bb3cab93318bc99866f3b98ccf44fc23f41f9c8d5a924d002bfa169253ac39d4fe061d1b161a6661201a6c019285dd2b82a0dfcceede72b52c8344b6689d6752a4a605b926b6701c59b448b163c501066cfe32562dcdca5999ed7fea7ad967cf43c58c975aeb447ccade5c4330eed18779b76c192ea5aa43e3ce2e0dd6f1df23cb3b9c23cafcd7d21611c2ae34d64d5cd5813f33f862ca2a90189a1e472e3bbd6b0d6766df3e17163367b2246a63efe166605a9cf326b83b533ef875fc3b0efa8069e214e64f72d5253db7ad40f6135d29620bc8e5f348f4477bb5b8f4739844145a63b2faa801a5ff0c13e1816f180bfcd52e2015d30aaaa1623eef7c482fdaa0f2496a367b50e868b06c3dc0cd970faddf375b289f4f668f6727db2240c096f2128a1f3ad7d99158d4750f05e587674808869b90e43bccbab7ac5663f9bc9ae335298359f7bccb811d8f8cf8cecc45369420d94b4bf28b20bf190c9d77f6ce0e3c6359fcb064d8d96549c3d53ed4b535a4e9ff2e9b969af0462a9104e09652dd595d4a74f524648cb609d4f989af9f7dd252f39a76d0263b92a19b4f71d5c369b185ebce68af8dbe6edac4ec055845926503d738f551b6cfce644d029786cd3e1c1cb936d85c31ef2b7b9a95e1edadfbafc87e94ad8e63c5c878aec95fb9d7db6cda3d74f5a1d8a889fcc19ca2571eb + +Input: b99808da3159c373e4dad25aae5d599d088154c987b8d392d468d6ca73e307bf68e7345a29e53e4b698dfe77fd65534cae0385fa05018ba7550e1f9a6bdff905c5d2aa8810b663dd285ed46585e3f479c54512fe7eba0e48dd5a155e55f93a776846c451904a7b4945c78208e7ce8cbf5c7559fe8005cfaf71907ba7406b9ebb64946a31ab54d33e392a026891ab8fbac692d68cb7f9159504f38dde2082e7eee031c583f450815a44df1b1d503ef4f07cc3c050b7ba83f3f9fd45bc36ab517b7465dc1c9114b1a808d269c981e951cced579a92d9ae97d3f2dc5dbe86303495a33facbf9c41fc24796e4d4a647cf80424cbfc6f4f6ac721670ee0acdb24e89728042b2f73a07774d02ea45dc262330ef0d530f8cf6b1e485b0c6d2169b47df8467b162cd9f43bb54e073001d7d1e867fce7e8311da713b26c +SHA3-256: d2238ca83e972cc8d2469786c91d34264ab4f0d6c72b84a0f4ea3ab73782b6e7 +SHA3-512: cc0970ce14fe16d1f0a157d87b46a90d9230b07b76073ad55379827255916304a2e4e1152ea74a9c17dc86b4f4986bc7b4b4c9bf72b827a8fa49511bf6f733e8 +SHAKE-128: 648203c584c7f1e42e3c2a7fe05e2d64876166841db2dbd9d3c3b6f219ba7a8dd796d56b6694a5f292568f473be42b5cbcbcdd38f62dd27821689cf1b02673ff1750f5101afbe8b6593b00f4bd38e703dcb7a5ff3d1294b25405caa33442f087912e63fea44ede5e86dc09003ac81eeaad1f8d29f64d18ed2942b550c189538946dbb0b01224b03ce23c2e03c12c9317858c7871eeb3a32ea3cdb08f1c8f4e365eb0843ee1204a7f99db3538daa7701e2806c1e606bada0ee51c847f7ec9995fed45fad4628f23c50f040378c50434f31abea134e391154af09e55d3c7bcfb9c97404e7a5cc7f647245951e405add7f52578ecf449e8d183535cde35f9ecbc8710f2168721d5570e583345fc9a71559775d9848172a1560a8f7695f2e98ac2814866936cecad49a6a7a5062d645b58b6e2c98d280f0f402241746ebb9e8098f853ae09a14d687c18282aa2000a6c9930b6e1aec29ceee5f6d0d4b067ca4162c6713f428904dbcaa869509aa561d98b9ef764deaa6de897c148abb71cd5d2175c9581188dfc558e0e09e6ade67fd2e64a30fb843016e9c0942bacafc0d096fc2a4ba9f26ebae6e4954af3cb2b0eb119fc762ce14b0204b7ef68af0ad30eed8ac8a3cebb208a62b4433fa3ac0ccedea417f996f084cdd200641e17ace4fc607c0b47212af5f65d621d9ea0c4d3dcfe02e999b41110e5eb7477d47d7254c57dc515 +SHAKE-256: 35d24f9a1aefdd3db9561472319a324e96c39c046fd5ec6c0c0f9ce5697e31d00a880d479f225d348af1926c9517bd913690e715e151566fa84fe2d4029a27f344a9723503e18030b81680c7031dd974bf5f6b8394dee6e7340a231a775e08e123bb5d127638502bdb19d5e095e340af3c553bbf327f5fcb87cc5791a3a2aba1f10b6568e9dc1e7b9b15486d6023d081710c59cefe16af1795c1dce0784a3e361fad18bae98f106b235538bf472f47ee3fab87aad20f85f92966035f6f2181247bb06601ba078fb5fe60f14e8754005e92b5c7c3eebfe695d6f5bb09f43893be07cb7f2be74b2be8790887ced636a913fa6efb0b0e3cd27eea2acfc43cf04a252568c738944031af4688831bf22a0c7511261ea9a64db6c42f39ee772f8dd3f706b3ab66b815a44f184a8b01916762ee67337aec72757f55731089d9c85e266aa2aa4c9272cc8eb6de93beb18bc7c6904393da52251afa012d40ef0abea0307645267b22b4c888777ed7b8073044db1e16d63774d9ff0dcfba968ccc6ed03c775f0463ff7747fda63bb7ecaa05f581bbeedfa1db2fa5b4317726eada34a1c3cacf5266e12f7d27885128bba02d8871fe4926e79ef9139ace761075cc48497264ee5a7c510fc77e722062a5dc76758d60c4d84a8dccc72f333d18f4d0e78285ef25ef4ff5560b70b7f0cf623a518ec46f6e276b29eadec55eba269dec2c71a64e + +Input: 8fe8cf22930d048ee93c3c585d7654b67e0eb0458a2d0674d2a2408761afef3f07660ce28154b90df842d1244fe556735a4a9064976d7f40d4b57a04d55771693f358cb34baae75e54069829eb7befde872baa217e927693babb741002c9e7684bf878bd00672caad92e7dd9a45bfb49f53b661903a4ca3050798c3373cfb4facd94b1602099d1e4cb9f9c653d25f5c8b569f75b85584ba30b63b73e9b1a6f886c68ba696a181a5092eb64c1af3f3e6aa0c31d23588c6c403e424dbca91bfab2e76ed1dc794a175ede57a5be96fb71772a3a74400c49abc6e12066f9a6830b31f145ce19b19102db50c61614384856069e31cd8ce6812967d0ecaad4a99d5b6bf6a6fe3e3b8def473a1f19faf8e028774f449123aad86244c5305426365d15743fb85a83f628716ec022c30e335aefd3f2ad37d516bead903628 +SHA3-256: b13ceba57c11e33f271df456d85cfcd5f0f226c056072e81dc1fca5d4bac6dde +SHA3-512: 0b8504ae37902477e7fdc3d86fef18b985377e3bc90f67f785a1689376dbb963cd4c374b5f57cb4591f7cf49de340c3c3de406be4b36c02513bacd0ac46ac476 +SHAKE-128: c403e558fe846e2ea705f57763e935930e3e7eab279bb47e5f94ea07220c3f3d7606fa6a385fe01056092e1d1fa277141c12e4034be01cd59fe651d9e4bba201217452b723879e33e6b9f63a15326de8c1fb895c5dcaff0500a34319cf151d30d4f085f71e0f7c38bbb86a0e528c4438403461a3da44762268ec1502bc7227825148c4ed5d50158de1dbbdca72c74fef8788ed88ba2bbbc40385ebd29638aef0bb22b61b84caa98068c640d8d1c43842717fb15b9343c051c52a89a37b53f640e058cb3fb6007caf634e987e1ebfcdcd1a483e9629e60d9e8f5882e6328fd2cd5f55b645b3c8f5b4a9c429dd1338ce036faafcef4e1ae32d7c5cacb139fcba5db298e4674b141bd31b76d58864f224c4d2b311dafe3709fd961fbbbf0454da10f1aaa3fd5063c9bfda15d372f1697f8609f9aee77c84de485c363b8099cd2e73f328c8737b2cfff5fddb30cf80d359dbbfcb798b88196edaf5cfd1c6d704b15ee9a53cb1381d96b881f8c722b0b1d5839fc3317f3a3f894ff2f1c95f774af8b82bc4c67114de2591535ebb079c7cbb1cd6223de355439d4e93e3f500a2496161b44f7e44ef021faebcd07ff1f22d7688deb1bdac9f01174f1c9c01a2711d67f6eb73c6327ac9468ab7575b2daa25ac1b448c79164080aa672e53fc2ac3367ce645ffdd9e98c881d7855ea89c1bd87dd7d6b5b731b0723af247720c376f2befd7 +SHAKE-256: 87e86f6cf7d58db4602ad24aba1bd9b1f94f4ea55a0df8d610c01174b1b50d1d6996123abda5334f76a7fd491330f42b9c46a693ef87bfe187bb299c1e3026d7cb26e2ba74a46cb17448b415113eb5dccfb46c1c77c5bd4f102be5a5a8f41c696a35ae6fcfcdec6d98a5af77e7aef93218dd9638159f4d4dc6a5f24d42206d6da6db02c1bf6d38eb7a3ffc5169982bbd586a7591c1891e615166fa6c4c42c32da04ab584891afa389e0b720416362304532d15efc7a13770a329be9faef33e6f67ec03b73dc1fa09e501145497e7978d44bdf2f16f625458afa3c51fd1b46e6c0fb997e57e29777b9ad1f55a5ffdb3d5c95c2f7420f888f7189cf85ae3c6246372777d8dd74075d2beec37354421e535aa7178ff5137c16f12aa1bb6393fdbf2abfe5a2976c0dcaf8a98a5ac3577170f022eeba9db26da608076998517eeb5265db21518b9096d457f94046b383e1cf6ca63104ea6cebd26c8fbdbd8ed864d8940cd21fcd78fbbbc1bae5bc183a65836a86d914cea3d6dda09765fc7d8c222207415223959774e391bd29423c0e869a20f954f22cdcb321d4a1a0253ee89f572b65c347a7215645fae6c8ccfd011fc46e1b7d8ce5e1a4b280974ef968da2224f3934fe6ae335e547b78d8ad7a841c7e7986abc577f0d71354ec67ad4ad6383efa13e4b74b38f4a92f5b94e561166260c8b407a727395884d66fe2af1006451f1 + +Input: 9df00118a5c3c9455f6546453c37ddf03ed59d02e5f4cf124f4d80b1f8a9d4dbe1c4fbc277f6d7e4a3e69980773daeac66fbd37fc7795583758e8088018abd191010b6e0ba027318f556585bc13310cfc35bd63517c892f107f1dc669f636cf392ed8cb84f78a46a9888417b71b25c2786afb5be30b959cdb5f7956bf11d6f43b6374f83a29015b0dbcee939e77d5ecf046fce2acd74c89ec52d8853ae6154fd108e3add8668fa61388979a610ef23dd8802c08cb6e259aa9da6a581abe6f4e4f3d4084e81b34db9eff85ebd089c44de87521c3c5f642d5196873b8e7f2bd835dc8b38c8cf9245898723864fe6ebf8bb1b06446bb45bec6053403ceaf198c76e425e3b5cee74d80073eda8dd809af637f4d5810eb50a82eeb4fdd8b7f98ceca10bc991331e47d15d2bb594c60b696da2aca2399b7718284fb2a91a +SHA3-256: 4b9e404695956c371e0c13addaa068de61adc35d265789575d9cbf64a99dd3d3 +SHA3-512: 7cfb3a25018d3028239c0e0908d34b117703fac0160725f924d2a7d749b9a7bfd2671b712c91fd5e2a5ad022b9aa0521c8bc9968c58da335de921e5b7e76e21f +SHAKE-128: eb8815d17ca5c61af9d168774e4ca07ecdb384ab11754a4dca861a0049bb786e77bef74796a5ff13b7e9792561e1966b8c9922553c8cb98f761ec14fe672e2bd1e3baf00d9a92b8fd24deab10b59ab48882d64beb6f0529f2628a8fb06a7aa62a7b0e992d1723bf022ec74b32eb5a89bf34faa5cf2be217e522b7da4df4962346fc22558267c59f0e618f5af05e807cc5b5c29aaa7e6a7898b4eb86b57c38bb4bf05e4238e4b2675eadc2eceab6cb04af3086d715d361f69f09c38b538f787b30b1def66295e552cf4a289fa2c762f68e5445baf8b794f11a9074d8da62a32d0f385bcf3f4f18cd405f5e202fccaa1ea33f406b2662629c3808dfec990a35a5562d249046e8ba6904852c4eb893f1ca7512d227c703e8eb44df872955db3f0a0e3662703b3544a1c91ea276d5c90f283eb1b9c32b9afd75b19671a152828dc8c196bd95753dd61fe69ea21be445abae03d3fcb1ed01853985994240540e4ea092b67472f0c16ef0242610bcce937a43a7311c1eb66750da616b6ebe7ab0785407f7b566d144f539c175f4beb51ce819301586fb0b01edc4fca83a7c96dd1b94eb2fa122fc987c613606c1ea22bcd62758e41a22346021b1648838110d6101cc4d16b85314c667ec7debaa03f8e12e33a3710b1d9772f83efbffc5ec7b3047c43f9bc8e912bf282e07e879c83c355f3a2c6f1301add4211ecdfd4c5517084da87 +SHAKE-256: a84296c85f7aea4c1db0130a2699f4b68c15179becfecd669bf86bec711897b00e3e65911f5d1586b3f976023eb30c9f57fdb1284b3a1a52923ec9dc162e2c9cbb2ab7d111d6512d0b0629d30989ae9c4d94a0c5aab33e73f6d83badbd1de26891961e76069e00d8b7dc8a4908d9e310dac62a4e01f81f858eab667f91426f0e906acaa515a4ba9fc24af2fec6a686e75df935cc21a479ba051c7d25924a2f2e40100ce3b0029f586dcc659364d095ac06cb7cd7ca18c350c57258cd2ad640cb5576bb070ce47e65005c59790d308b4b9281f6d6a1e1d13dca5da6ad45751e1436aeca834162f66e06f0741704853ce7fe39b6cbdbcb1bf67719ec84e1b0f91ab6b6db2a040a95161d407b8e30508abed7fa534def132bb0851a70cce493d53cc8b0aaf650f995c28021e17d2a5afe4549a8039e1a74092251d946e76d51eae5071eb5213bf418031af6abebe988de6a40b878a205f3ae7a33f950c13fe5fc5cdca1437d4b11872ef54aca2f1f06e53a7cb139aeaa831e73b4d13b4dc993af013aa096e7086b73d41998eb7db0634339da06c445b7e7244e752f485d2df7cf702eb4a8de7482e90824126312ba2ffd27ffa31035aa65e9be6f08b0fd0fccadcdc88f0142b6b2e57dd5662b94966e100796a0a0001ebe8899c264c718f9644633189ff9b146f0acaec225bffb9a283c92a5b8f9cae684e20facfd1774ce70f90b + +Input: 9b44c937570b27e211f2c80c079ce567edad47178e17bca5f086288f6e7d152fad509b733e758fc4e00227ddaf94a35034f48210cec809ba5d1762ef3d38a6a7098402b41d6dccbea3d8e564d9864ff20fdbe86fb653adb21c25256f5b073fb1515355bb28244ce2e9c9e2965032cd02d3303108de4a3af987624c0aad8150e71a32c437b34e639f117dd64000aea7fd2f726bbf36dd6b67399c85b476a0245b89f51c0983e4a16b739e4470b012c9fc675b8c18701a6fa0895860171d34e17cda32fe3018d76f0305de5e867440a666b51a5a3381ba4720579dc336784c22206b1997fb9d66c4f4bd5fcd25f265c0ba2130c2e080c54761c10053ffcf9e3d708a838f904282ffd5acb2eb18c9285c1d449d705154974c61eb35c88b43819aa6a31e85161b848a204f3ebdc0072a492e43c31e1f37c22152df95411a +SHA3-256: c01856797c37129f6c58f5ef88157deb317443f76d25bdc414ca22ee4e60a873 +SHA3-512: ac34622e1629fdf2bc56a1dfdf7d5080d7c658b16570d3b18c401c5e3a6e9c12716bf29341f514a38d330f23f54d8e5aa1ce9a81500a7d6834ee8aa4159d0a38 +SHAKE-128: fb92345a618193607c846f6e63e1333f90ce9312cf4f8024b6433b309d59ac0e5497a1f146c4b2c962ac1b70d92e383608be07b0385e4da1393b1d927ad40590388920b02669a6c7435b3955a2ebb9d37ce60f2bcca0a1c4089d88310bfad7cae96cc712295ca03ed2238882961a9a0a567cb06847b480c830dad807bd61e2051c79e834dc24acc189e343975ac64ca34f40029e3f407e2187d28365e6e974e314a3c988270d2cb8073e44d724f46beabac9012e957630050bdea1c532009601cc0d8b0c6e3ac47e2a9423dfac95df5079d025b56c823a4b3579566f2e7d1911ffde7288109f20a2589019ade05251939d5c909b6334441b793c081725f303a7687734e61d9aab3d8db5148ce260d9a9baad1525c477b41ae89c4d33b54af9f6c6e0a06813b930fdeb8051cd99a0b05e9910dea0633e9f80577f47edfc0bb577d439176d9d60b69df0ac05d7b09b68c3fb54008f199c34d3fb666bbc2d06c56bd7aaa168faeba4c29213cda25fc1a2b4e38a621e22d913ae997b8157148b42f6058f2cf29f3852081fe1088099d32d7ca31a09702f6779b55aede41512761786f200cf0b1f1ad23d74a0f09f60d2bfdedc3ef853cdf01c06b877fef6780f72804591830a8dfa52d692386096ad6f3775f254f2eac22ee4fce509a48252402a6bf438e6afe244c9c92b03b84e6e089639be0606419953a72de096afdfd29b61a3 +SHAKE-256: bb362533402466933a4075dc8f574f357c2e25d02c1b742b575c0b9c593ae3b735d2c2796c905aae60839bcdc2cd1d5a3c22e6bbbdcb4419d62220d05870fd34de5ec3a9d45d4891a3820f313a3f19122bf088555cf13b8de8d0a8c4c689ca98b7d521265101fc119d4ff9f305026c1ef3d90f3b1028cfe3d6c92a628bfb25e7e93dd79a91d8e200c6ebcd7188904316a683e09d7aa1945fcf3d523c7ec0d09265e3dde034f2c7504cccc59159bc59528a3d9feff631043c211d165f1f9dc874df2ecdca72a3c3b087be283a9d942fb3611cf7e3f6d5fe049a1710c177f8e5234515047d01c851c11283efb04a11fb3de3b4ecb2318c4c8d8c91d991fd8c96d0240331572d9fe4d375b01c07f60f6305a2d45a3d9851843fe887c3233f6a3ca200ca9e24d1e39da736591dbf04a363c383e73400fd12cc1a8150656eb1031cc3e8d4d5f0506427ed7df188c1caa2a7c13343cdc9e3713c1ce537e049169a0c1b821b512ad1b6df2484c73f4f896310c7f70210e4c3ee816fee0daddd53182a5c64fe745f9a485cf9403b39aab5fd754f5e66301793dff664b1cf2cc725e3b58bcf783650c2f44f7c4566bed60cc62e1305a836c7214dd18bf07ef7448fd4d09e9ccaa93d89ffade4a7ea68828f0dd2c53162b04b9d1ce74c183a41fab1599087d5fdcb5f9f6a92de75e6de5787025fac1730474780a756b6ca4105f5888ba730 + +Input: 45e27c743224de404140198a911595b73014ace8ebd92ecd8d3f6194593f969d6f97e5014f3a1eb378390382ec7ada25e26267ba8c3025e45e2f5d8ef663024a8f4aff3d467a013d3fa04f4cbf7f3e68fe0acf590215c15e12d0332e825a0bdadc934e743f8ea86e10c0892de1f4a3970c73086ac1de92dd122ccdf80d3577ba08cd685c3737bf68a2ee7b72e536762de46e6e424d099c8a4012994a66766e539d7eb715ac5400571c6c097be4ad138313d003487c96d6504ba34e0739669d6a1b7ffddbc34d20acadea939ba0adf634ba78b4ef128271f0f6034ecf341341bce8a8dfc43a1e42b0a02cac126f3bcc900526c901865a5016cc7f79bf901a9ebdd5a08ea91efb982430ea9566204cba48673d6f1280ca9a0107204737e50f864b48fa32d50bd6a346e325131bcf92e8f8f6c9704cdae3a87895a696ea1c +SHA3-256: b50801337648e2da983d3a3457a659d64f2522accf5291e0f58f4e59794f5a4a +SHA3-512: 61d93d672e12215fd3ca1bae1793867402de110d04e5ad39067cc65386f974dad09dc022976cd2a78fd7fad65b32cb10c6334406279a87cfc355b9101cf66158 +SHAKE-128: b851f014c1d9012151b4dab6e0a8ed83ccde0d88242132b1ea7a88f0f4f5a5d120ade9cc420a9e604a6d69e8155fd534e4bc1514aa2663daa026605a67cff8fcc6c4a41c91e834c4545a0c5bbccba5219c8174fb088945f2c1537f7830764c25a64169a4495503018a64bbae725b077e3fb74e8f6c07e946d86f90b6293ea790e72f3cca991929f68456a5e9211d2e8408d3565d4663201223bdbe5e6191e907aac86272dfa9eb92a0ca78799312fbafc0d85e136111de478ca66d1d17c6c52eee0acd83b5a311aee9996ddf4d44c7b54b455a9d181e8799889970ac9c09204856399f53bdbf1865ae301fc8b0e4956b5e18ac6b5ca66379cb8c5298c1e32715eac89354786be3d90269b1ac38e7b3fed7cd230edb20c4ed7b44a8dd0221ce9afe1e510ec82541d333d82e66192dae242af4f8a0c026d7a606532c6d0dc650a4ea51059ffbc2920cdbe69e8133457b0e3d743d3dd877167f12dc7159b40f64fa1ac706003aafb1e827aeaa0ede298c6e834dc28df11fc3f4f3bcffc7ba9c2c273e54952ebfffd51fb3c0b138695f1342f49ee03d4b01e4d244f38fe6fa0201af319994269e96d8dd3626a575185ea0e5cf6bb59caf82cb7b19a5c21aaddceca056842f348b59fe541a1e2526690c80ec00d4e6d7a15db50900d3b394aafc37a13550e7efd1a3039ce4a01b2f7d2604f6cce262672f0e7fbc25f2cee7d1d4b115 +SHAKE-256: c34e5e3e61907050bc12e4b57a944a8bcd33fa09f498a056df5e01bf8f4c155e4d78f0bbbce005ad783843ceb570791594ab3d41472f0a265b4a2c31bc7e06111cf40a8c89aa539de6f08b48a98fa237c1ca09f673f27ce8c5d479afd12bf504a6963c13b9fb11129bbe01e88c6d395acad53e604aba28d54a219f777fdaa2fa901b50c29e0ce1edf907b61c81cd6fabd13831ed1894b9a0da1ccad21d3926144cb4e4b174c13b2f32a9b36ce725af711b6339aca3b0e2bd4cd306de85c96b1c72dc134c9afb59b7163405b4e0a09926eb509d2f0cc45cf5154cd8fabaf810807b1c844d543e663e94a62156285fd0a441eb5ca0e2008cf65ed7aeb872e3eb0ef49d7778a631020e0d63db2a8512f5da4da5e22566dada1068bdde628b7229669a5df039eccfe4d9cd871d4fbf29dc64291fc9dcc558f5ccba9e3ca9808f3b0c00e96863963d46cfecd4dbbc1ffe222842662939e311b07a787b77b7742046a1156d88df45c78fe65f9701a384cf54c37c434029b2c948aa45858bb9c7b40158de7ecc3918957c5d51007ed338ed24ca5c00b75d4f8e893a917c70fb0e5077d92bbb9a7a6901a7bbf4d6190d25a66f100fe23423f9bfeb4d0df2da83853687209055f11e125df5f78a3d6d3824ad68dcbf697a3912fe4cbea82ce766bbb4eab99aaf7c975ae976b4175f90e9f9ff855426ea8fc75d1a773b5160c4d4a7c47a88 + +Input: a46f56604a8f25aa1c4e76d261307831e5dcdc8adcf2a1e782012c5e9edc375d086e09e7c1f3a9fc204e59da6ab9808f647421987397993a5d6e27eace5b7c88136c528086b7d182eed370fd3a654434726d33a799f93f064e8ae930ad649a892027182782e11b3da4ac3d07e3f4967251039690e520cb0086aca6b3fe500a42bf4b38a199307b9d0ae6f1a95462072e1c8387036d676faab028296857b864e2c614df8551627ef24740760f84c8d47f345a8320675638f646fd21853dd9b2ca3693cd3b4138ff225b4571616cddb7a84df38d6e6438611523a9d4a4f4f68a0a71295b37ce117652395b4d390b0ef820994f1435aa776f840032b0fdb9b97f2b5cc8f4e4178da166937e97116888915ab9d433d3009d3b8259fa6657861244b32090f3de3d0b9d93c8607733e8487524b867b5e581895d971b879441f371 +SHA3-256: 55701b60ad86cba2ed462aa098b49ad5d3ecf76f993c549c7d282ccf2592e988 +SHA3-512: 14e5469f2f6a883d903b8f242f0e1e945d66f687f8f464cb4828a2a8354e3ce568ae2a5f508d9301b2b408d9c87c923d284b25b7e85eef57214debaef7b84302 +SHAKE-128: 5df425eb8d79d46049c78cad4273502a2c5068eb7e23e86d43fe4ed061f8e2a99533d7c61c20c053f127dd9d477281eba860ba978ee336045d66a5a30e00308ae0b2076057ef8c716d3623e1ac44d41fb65686511e13f2622e13ab911f84f5c0201518ad131f0bcffcacb86fd5a9601119e88f30fa87ad7faf705932aa46944e358922133b27b3634caec10d0b90a64b676d733aa99424c9cb78cc2322efe0fd7c3ac0ed5937f6d54b864fd36291000c9801ea76d63518f1d6ccb32e550df74c88972b4e2c1e1b23c6937fbbd7b3b997800dcaebc039709127960e39dddc6a438f6cc561277b940296a8caad85ee23c379459940b1e1ae952939df6c4b7fee4db3567c4f5f76a1e43883965a63e5b01aa13e7fc192b139fa7c5d20ae0e0304670de5c5fee472124e3ddc17987bfb20a5975253080b1d9ebd54cce2be7b446c6beb934185bf425fbe6c9ccb0cea49b05181353e2231fb18e632311de280d49d93f9c3400b47edbb5de69c546962c3da64d19e70bd0b41f5259324af8597d3ef5fcaf8a3f9c287d375d954261e24ecdcf0364dc40d3b8508468875b8024a329b2fcf0041f7ad382b6ae30718ddb866d28f21990411bf40d89fc362862e90e5d3b9cba1f84eb45b1a172b826b32e901e1778fcf6f094aa89fd982950a6bc5be11f50392dd9d497f49904b20dcecc44d9d709f8f49ffbc90be1647356ce10e3f07f7 +SHAKE-256: c686aa69a931481c9b937887e6f47e2813726598eea8ce77c60b9bc6d5fcabb44331bd9a1711ffd7ff2f1b268d81ee2e0f680deccaf350d538ba493adae683bbfe2642aaf98bf90235f22f18d1a34761a42b00f998e2e7927507d74169e8ae09427c4c26fab84287e36bfc0ec4ea86450e7f5bf57ab34765a5bbe69215ca7e19c738e9d61756ff6201be7674ac9750d750ef84569d7d7fde5afc45deece687e87a5d24095d3659f247552735e6f42ca56d27425800f175e8bff14ec2ad28cdaaeb317a5fe0bd55161aaaabd333a2c84d98b56cfe865b0a1a8815c7c2e8abdd749215a52cb51b9e9ef6af8bcdeda440383cbee1f622031cc2ddd5a32657017b5347a1a2aa53331686c8080608dce2d0fbf60b94bd4dcb4e919a02d1b05c48eea4aa161d632417f32e50105dbe45d3ac686fcec29bbc75c527ca4cbf3aae250a82c160b3ff74cce836a4015ab6b175ed7c6fae887725b2dbb73902bcb7407218caa942a7baf1a01f6f414650c804d896a5b7bab178b1e454d261e4663525aefcd8be574a19da1b1d7dd2ef832363d78ee06b69bace7716d6c042061fe91cfb0170e07471eb51cd421f410981fd3ea3b795c6b6068787dd7b97885656f997268ab34356c8e5c67e0c47482d3020227892b1a0f8b6d59f545a64980b9dd3e318dcdfd2030bf154947ea90c1ce1f3f3fa61cc4aec8bc3c94dfb16d2c65040d370a2b3 + +Input: e6429ca3e0b6e7408032053d69ad8cf3f084e22a54d09b80bb24861f299d54af930f5dfc0d5e3d63ee4c97213f04ddb26d9f08da682ae7670c01052eaec1a172dc2a25672398e45f108c17af12f6dbd86259b5c28ef885563cb3d4351863e0e039da8ffe88d45c376e37c0624806409a2b7da8328466ee15dab370b37f1eac7dc738a529eb44ffa2d9cd87289aaf4d46e8fd70d6ebbaeb288f1b89dede246285d96895dbb7e1885f1c98303f0a59feae0355229537a14b756401913d7480b258e6f72693bdd1f987de5cdfaa5257f1bc85881c211064f0ef4db176d4b2a9c57e65a4fdb15b5958000b2c46fbaca61b863b20cba2e1c51ec729c026157b74f2d75c782d5bee2ebc01994c29178e3c0377c1988b2a371cb8c8cbc49ab8fbf2f0fdc08554bd26383330a84ba717b6db41d67f7ae9266b279d981ce3b434a1262d +SHA3-256: f3dbc7fd4f3292f03c0ef3eb2a2c3b089b10f4511664cc1703927ea83a8d6e9a +SHA3-512: 065a113523c73fa3be0fb7f167eb1c1ec4565f9175615acf75802c1d276b15611f09bfa4db26b4d542905a67bb339ed6dd8f7a8337d771faa55e8bf277c8e29c +SHAKE-128: 0bc2513c5ba5c3318542bffe844e4d3acf7520ba768f84e7fd7083e582d8bfd6be59f5e27d2813823fbb0cf1ba494e259ac0ea051992f1f8c1ec9d536edbb2583c9954f8d8d50e35ba5bc2fbaf146e1a529190d862b491af62d450ff1443a750fefe978b635dcc6ef6d42db2cb000b0d27301019cbe9d19cf85ee5e59e4331e6260447019ddc7d4529c14ddca33830a413b9466fc8655a55f0f8d0ec12d23242b4cb2dac872f4f211ad0468c49a719217a5071f5f44ad43047d17dca115acd35feb95b392c167f21060cd0b652f2641b772d4f9aaadd95a4501826124d69c1105ec05bbfed861b7a8caba9fc4552a9571ee8a4e636688715a14ff482cb02eb188ed9bb2bcd57c9f51d58538533359ee6b1ba93b8bd6ff7dffe6b3d9973217c4d0a15448c9e06bb1df5005d0fc710e4963f13003187f187225a3dfc75ed28735ebccff5a920fdf3a0b460b59ac3031c0488bfbc5289eb932ee173342d359a1821c410289352ba8b557c71cd3ec25c721f048a74c2ca07c5e7e9222435951a5f423b86053736a2674acde90cc2fd889ffb01a9ed4de731a87a9120d85d508df4e77d51973dafac5154f95b446598ef976f3695af9d147a0a54de5f44f9cf9c7befcbb9052f72c828a16c068f0454a4a51f3ec2c3bc44a32f858f1df49da48df0980a0e8a13a0ec60c6f626865c19cb4028601582b810df0e228710f8844e961c66 +SHAKE-256: 4df8d47b8b214f229791290bca0d195029394cf6257233a4839493d48d961da20cab8a3db88d626dfb857a22133cbd0b413459401d2009e84912cd333690d495cb0565b83c95d691c3505682cd53879a2de7b95e24713516ce0bb8c57af11bd2a857d9f5dd069269aa2b6f0f4f40d339977ac9dfcece2a9d9f919fd4253346671bd8972854e54051347a4d448b1b842fb0b55df5913e3c4030718481dbc616727621a8ccaa91330de43aa43962f2bcc5e82bc5b41df7576fb82bcf350ccb21d15866a653ef2b14f5024721e22d75aa8546d72478cc3dfc0865e0af1330347b6e2bc345bbcd12f4e888cc0d5ec65290d1202d8baf41a32f4b1ce03e160714c26f65756f27775a855d65ce2fac045d897ce43a9ab303a70ce2044db79b7501fe82348c5f011d5ae621c979a13f39bec59644f6d0bea7b731304ea5f36ec60094414168bbfbdd3aeb181e378bb70e1000458003eee64ccbc8b6c4c3ebb4e930c23e0da6c9d12ca27058cfb5f0942616f1ae9d3104c4269cdfe7833622109e75a3e14ddf5d027c01f7ea591285ece202503815b39b36041a8fba78c7162e3a10be251e399fb3b9be564a7068852c68a6498b6f2c1af0ffbde6f2f3cf158b71522c470f999f4453b4249e41627dfd5e21235ac9b0a5c393cd420699b5911b9fde689941250fcf32eb31e7bcc9dc174f137752a65ecc68b154d95978d440b4cb1ac04b + +Input: af4a227cfd0c3cc80b62f1c597708f0c32e33230e4cd60dd0474167627b7af7411a5c0e7ceff72208841f8b40016ba3fe927d49b481895a1ec7337adf256424e4156901fad0915b07b17d7168c79688b5178ad4554dc8c880b75c8142108b5d0822751f539ed18477087d1a2e39b723b89c8a457e527c71f148a17c8a8ac98b7e73388b0149a6f354f5ab7f11aa8371d0d64b1f275aecde5d593e5cfcbad41441f2b613123155c06c19414288b4c84fbed747675dd0c2da40c5f2d8db159802fa40a3d51bfcfdc0a18e59e7b6fdf5faf6c02b55df9310a150b7c6ca75258c47f3dcb636b0fae3470b2b21cb4fab96b990b23b2e4e92d967bddeff3235930b0420ddef93aa52e444496ba7ed267a92fd70bf33f2435cfcf39786f495078266be2cc310c37b0abc1ffed3fece6b0b3134a2c8e166b74d0d65c16b09a15721d7502 +SHA3-256: 95989a5d9831d69cd1f9acadf9f0d15de6e3f7d51ac230a82e5c90dece7a0e91 +SHA3-512: feefc975f20a6798be6e184223babde6eacf98c770a1e6ad7e8fda13f757676a4e5a57f56197887d596f539e48000f1af180239bed9a921973b65fdbb1fbd2c1 +SHAKE-128: 2b64d5f5663be93dc8dabdc3f4c989cd09c4d56d10435befb2a1f0f2c566b78624e58d493536f49c8ac638d88cee70de16ad1e5b1e0f0250d7c6855ec017aefc238b15220efde08c37a9cc3d7b8e2ec09f1d701c10766ed19abd31049533a5156cf0d185d71ccf75008de5b90db1152f97cfc4951989cdced5bd2fc0c3eeeca194605d26183d42909475530931235ce770992e67ad0111898df271e3ecf4c4c332b8de3a28aafb3afe55c8e2b9ae8860f1b93ce53e713a55ca6fb6c1a80329626a5a915f1894d03195018fba3e157b23a2195edffdc8065d83753b9c52d1d60508ec42b46337a0e6a8f2627bd154b469fd12c785d8deeef7d2777043245bde18ab32da568be9022c5565e8e004d28a38e224380e6375000d0cb7cebe710516dc866469a0c1262954dd46542390e2fa8d53eaf95d0be60d23f484822bb16e8dcdada4fa242d2282218f311e3b74ce8d461b9477271b704c69e8868078923df97c7f17ac3d9b42ab17e254b3c8eb82f9f9ce87e1edcec58af9ee16f0ef2c704b8fdda09266014f5df11beed3dfe02891f89818b443ec1f7894863bb9ea8da94de0f9c09ce79871a3e0fd55334e9833d8a6308a6a79921c2dc7df21d2b0408e1d36d303fb289cab52b686dc2622e72746be6557368690d670ceea842ffb37d34e62cfb8ad1ead7c47e362137a95dcce178fc270c66fcbe5abbcd2d61dc02fe4ca95 +SHAKE-256: 6f315854e87c5d2c10511da5c4404c6b8881b0c84fcaf2e81ce901ed39ac2ead17b1c60d662f9c9ed309338bbd72aa9ad6b558bcd63d252e0d190fc46a5e342f8beb36d16dfc95a40ec18352060653001af4030f60f33c1bf9071b61238a27a5f031e8e4ae51250289535ee3f52e14043a3c0826f4af377762c3d10eec4ce608be1288f8bc633f1911f3cce3cc1655b68a56eb58cd6f2d171c928404e67ff1b76c3b312002360469606ebd2acfe9602b22f2e3364e901f7575052da8ca75d69ec0bd492265c1c750051f3b9264df6254bfb4fa2545e48736c7a765060837a68cadb1f6dc2932b3814d4537587cec0f99740a88abb90456d405a425b735c9b02a4e7acb8f847c07a6fd649ca392b6f88eaa69a766feacb72bb0eb33a24009dc204c15f0241c22710d2e57b601e7273ebb943eb9268819f4d24b910121c2b8c8b77d5cf60bfe322552a874f3fde02b217fbace61d0959d7b426438c2bb5241b13c8abb18961156c40f90d7cf4c0f9b54d4d3e64722ed70f4bf47c2a6b8f0e2badd0cb4d59a0c75e969d9d33eec7044a6d1ae59319842e11e4cb190042ac09a9b7b2b022a66c651d7ee7f06a66974894a9d726fa6532880bfda63d270acf744187a2e58a634b2bfdb1fa9d5fe5b057bfa27dc7c1cfb7570235e5871fcfa01ff1389b5e1ad9aeba2be0d6a047e4b2e8019553dc0449ca166eaf9891d18b4f17616f9 + +Input: a018d8ec56744e59e336fecabd7627f3ce395dec1fca04c22584987fdbf96201a12e2842491946bcb35254d9b5fe378e84cf921d869433b5da45c0fb5c9d0b1bfa42bf287ecfde5c605232efd3d2bc57205f4d02030ea815fd27d1a8b4c38f144b1eb94933240b937b9b603342a25a51de3c438c90e46625ea91867934117bac436820dfa7ae1ad39715a9069418590d2281984eb4a9be6d4bc5f178dee734b784156d500c42e960966b75e302fec66c135f4b672fed463236f3e4df40c4da84cc8ee888a301e5156f297ff3da05173b203ffe3c32e8340fa26f4c4dcebe02e17f9ce4fa07431333d85d5b991efb1284add5b4bfcd523f8342525c669bd872a77ecf2c80e9c472f49639183d6698e6612da9cb52d8b14fe16369a79fe91a06d735247c356b7fe46bc4fe3b6c135ca5059f4476b1d016850ef1254f37f5f761ac40 +SHA3-256: 0e183959177dfcb9903a42f8d20ed0d777df75cebb7feac72b8c57783b9a794f +SHA3-512: 11dbc2c3ae9a959d1fadf9ef3f71834b8575332ab9647a899ed734413de795e575cf0d608b2f38b4b67b8b417865ada1b86e9bcf241c2394c0cb8bba974125ad +SHAKE-128: 37916bdcc9072faacfc245e5279fa702341f26336d15c1521545aff459e5ba06556c3b03bb0e3a11e7d777a71b95bb68d95b05e74a40e072d0b40be79688e9eedbcca3bc8a304dc16aaaa4d20bac5c39194b7ca6c0502dca7185b47aa6d7533269fff14b49c4e7d4190a1e0d6de3e7d7ffee5c6afdf7c7437536e5d0654064ca3ec22ad1ffceb02a366dfdbf3931cf7da6ee98992d228f3bcde786e217a13221ddfc9922e89eb47f00693c227557320d7026cdc65a83f5a1667b9950ef17466083a50a7a038e213434c9ae23ca5d1e1bfc4ae3774d15c9bfdb9914638969cd27a08650732f8acc80c0dd437437690407fb9a724603f41f260d88ad355fa8165941799e2cc7f07399bc9a5b6dda42f7245a4895004c7b1380d5ddda1356bab9d22626e5d08081472e0ea24f94a3d4f82d92bd11a12f8000ab629ba31d548b9cebbd0891f5291dffdba42e10a592f5cd85e766088d7b85cba6429f461163a9f6477ee9ec9779218bcf7dad043ab294d6bdbf0a0b5fc2e0344d0c0d8d67b4e6d95bb0547df6773e2e7246ee0eb60a6059b17b040939081fa70d6d927c0111629816834824b07d8f4db8568e81a4d5e28c903a407cacb6f0aff2f0e6846dc53d2b1dceb8e66881b1e558407001153a4be7980839d30729de66908b14619db1dcec0d8367337f9ec5739da12ee7e5f487944b21895641a9e16542352ddef361948461 +SHAKE-256: 57d7a2abf4fb4a97e529c1cf1ff58e49fadf11bb69e0c578ea425fc2cfdef11de9619558a27d9d8bcc0915a9425cfc378e1ef1391884b124cb8950d6179c29b355594cd0e295283f76b4b37f15af42a0e347501afdc31be810fbf49103db05184c3fce4baeacca1f53419e35fa8146c41339e34e757b1c8e21715375b670717bd79da568673b44f86de3187f56fa0423f2d14c8d2170706931f4c9ec98a1dae49ecde4f68114dd4d2af9037964b9096f8d73474f914552b1ca976e72d71fa9394d71f1b143399d34e5783ef841d606bc42855f9fc65d2a4b5e6d29c01ed83ddc9edf7525b0d23e9c178f5938b02462bb5598600a9f6d7e8905562408cadec2b562440ba5dfd872c4b9f90ddace9c16f4e59618c3580be7c79830d24732daa5f1f7f760cbc655ea479994dff4aea5dd6ecca3b13eb627f5aa99baa367c1816a167763a286840ee97e30065b1b935f4dc41ab6f55cdcd48ed6beb51c0a134914b323a4a58bfaebc7b96e63bd99b6e2c52744b93774b52d4eadad08610f161c1c0eb90bf1b5d4be223905748b2a4b8f9926c95f196147433fd609dbc8006c2dbda01f24cf76c81f5c83f2f5018963143a6c815884af1088846a439d3c9998558b3b6c230f725ffdf38a76778c90ef28ca0740aacb0b3beeb86ca933786bc70f53cce46976604311f66e5999ea024cfac381b2f024562e4c0e9816bfa8d1ab5522b8 + +Input: 2057111c545a7272101fd5df1b90951a0cb10710ad1a63ed4d6b642616f5c4e9030786b5b4f267f6786684b6d9b86287f2153012dad420fa69c8a4138547e94c0b45d7a3b424dbc4ab01e2e5f735211208a1190a01998f35b894b64f479ddeebf2d440e39ba6b74bf8ccc2fa469046067a8e50bffe07bee0216713ef10d1d5d4d8d67added24ebcfb1b758fea52037e5afd6f4703da888a6e709061f5c0190df59d58d89e7d46dd44e4199b46c7b9614d59f194148b96aebed08ef495a6ed42e1212cfc87f0d93c953f437f34840f5ac178c448154261acf05117d1a76f5375cfd81f6814d9386b22eaa48fa04fcfd2ba524585c418b42c41d60f0ee7842d4c5ab255cfcb64e70a12c2db98dd7afc701d216d25cf63c18ac52c496e320265e0e9dae306bba88f5883b3403aceaf5b0d9807da9871b224736afc0ca09f7174f1090d3 +SHA3-256: f82c53ea32e9f46ddfe3ac965e9337455d312d3d6bb0fd0aec5d56b6e91e6c8a +SHA3-512: 9d8cbbf1efd85a37d8f013d82692f6f371273139daccc60f17db41ed180a445e9de9602b908934ca633ccf6b178c9996134919dc4d20f7b117f8463568829225 +SHAKE-128: 623ca9f49358bae591f10acd5d172ade9681d63a2354038effb3172620b1a3b1add45a52961d64b371e8060da82804ac77150449fffab06a3ad2e53aa939c4014851f7b9e4a143d89c6551d1fe32aed6db46e2b3a32ee6ff60c17fab1bdb4cf64ba3347d8daf941eca04b958eb801c48c4a087919ca5888f75ee20b9855f59a7cefaaf829470dae7250e42996c18b24dee38690b7b5881f847ca2c7ac86f057dc461e557783758ec30a3fe4153859fd2b8df225ccc9d2af94cac57c72c598ea3ece349e06b5479c2feb05ed9a95894e9e4aafe907e1eeec9f014249f949380a62662b17c02946dcfa1eeefbd0528328421a3a63f365ec20319547a46f1c1a8fd3cd877f8f88610d70c6cd40f9cc5bcbd2f6cb436281ba361ebb87b7e76344623612035d411906cb9d4a99dfd65c6c19ca4bf03fe56643c3f0d2cbecf77ac1d382b793e8a284525f677f6c8a0fb1d26af603c4b016c1ae416b9b8b6c2d372eb7dbeb08db8b1915e9c101e875b80400b2c53a5142e0d03bf8fae6bc9eb98f58526b8996b1f1fcdf1b919899ab455de3211ffa4437b701aa08808cbc7ce58f7822978511f38a12115348168321838343fcbc6925e1b2958353a82b0c7235a45ae7327d6a718ed260fe577b721e4844027a027b961c0e23d4602aa2387bb5433b1a2b8fb82b5e2560baa9845e78ac892514eb93809e9f9a2d4be016b4995522f60db +SHAKE-256: 7ff8ff6248323b630fa3bdf30291ad972dd0626c19bac5a86ffbe034dad1f73e8762436ec095ea2ef919ec427c07d0559b8e64c45f6579ea61291ac9bde55f4082bb5994d22981632800444bf2aa5168ffe1a2ce470a7f35ec63ed1298642e940e818d2540a58511d1662e4a4d14397a5ea8757c7ed7f54b4f8406d54bc2e293fc4f16bf7099826f589bfe0f546389870de935febde9371d0445b3e6c0acddba0594cee53d2b6fe3da2da26e7c57a68963690ada2aa0582669480f676d9ab75dad30b979476943c6740986b1e09a1c8a81495a8863c06807464d7c2bcf0839b5be5b2286471ca1b30a35034d6e9dcea540080e2d20858d76081aa99c80a2f8973ac740bcd98f0bfce9a2540d7e41ffa1c02f4b3c134ef279db927e777837efb6640925db9905cad3bf49e92dac18017d43e0e9d16e3fb8d0fb1343d4b427befd30a701e9353c3f27099a0fffc18d8716ef4fa10581253c9397f2e7278f4976cf2f25dd75e4fcef1e297266b68516840de5f75358395bf5474ec6562e2e15f3b4bea73578fad3eba139a48e4fb8b6fe3c947465e6acde70cdf029690c75ac10720200727bc6d142c00bd642f057256842e83364712195f3ad203bfd490f2e4a0920700cf2d673e7a02e6c2160afe05edb9a9e9460f906a46b31118202bec3fedc5df6659ca1a7ff526d79f4c727ec27ecfc2fc088bfb6506b286417b5d044ad1a + +Input: f57450d357c9081cdf91f2ba01ebb06a5230550feee2f909725bf6a2f9e10ccd73daf7a9e8e52897e1f94817f5d6c38ad9ec81ad695b0919d24b3c321f3c627436a07ff5fa75e5138839495b5030b5efff2869eb9289f35ec7eba4b0b4b183e263b4fd4cfa5e6cc44947b3b7000b173b48938a3cbf9510421bbe9bc0afc18f1f20a8ebb48df70b8db1b6c9e0ced33d93c58b101d865c33d4ff74c5e411e312f4747c68b7bccc583d2a0d9d861bff8cd3238b2d28e54bdccd3d74e11b1750aca705f1ff3e2f7602d5350253846216a2d34a286faba9be11f3fcbd9f2ba67d52af2454743bc10f36325e2c67cc584f1c6668a5c286a4c98a98c29075296a92fdc9f637eba477dd38440b8c185b825d30f190f4243516d751286097335b808fdce18392f7c8ded84d8f3f19fac8e7cd6551f17933694312f3cb6fd241d72de8c9ca3d0195 +SHA3-256: 369259a1170e535ded5fabb2309dc934d31f93479c24eafad85266ce0fa44f8a +SHA3-512: 93828c471b3072ef0d251f6ee604598b1993aa056878ee43c4eb93112ffab60ead95c766a9cd070b6287da5375446a52e3d2360657de617a533246ffa698d11b +SHAKE-128: e03fcab6097fb52ac1782a485030815c5ee19ac80a5eda8b743be46fc0a7847bf69c2be0a526d14352e639b1eb22f5ed8b18a710ce776c15bf39b015f7295381f98ee18f301da56c7cc35bcb387efd5b5c90122b2413cc64754e3d21f5bd48f69039c2ffd557f8db7c269a02cba9b48c6932c22bd834e3b7a9499bd5cbea8beca7684baf14ce21aaa2bc5ae534831e2d5bf2c35adf7e4273f8cc280df1312d7981ef37d3af0a47c79e33b629e01aba1640d69e5d0071a05d78d0d7eb7b27237af7672fbd703ae52d3b44b4f346b342a01fef9aec20f998b9498da06aaabf9b0a900e7bbc9cf04a250754955e9a477aff1b1aea342871f40c0b246e2f5e0b2e6b90adebc2eb3439545e9a015902e18d2bab8a42a5f459a1e76e46a457de9fc2141aed7cf57990ebc69fee8e267074003e19ccbdb902a571ad6be46449a2e3721580648c8c7ffe8655f37e804b2f2779560996695b838c19d61b36a66e580c8d8cd7be03cc35d34927477e1b84f50c7ec9a2301414575cb7cff30ce32621d7e347784ab3d56d7e9f7fbea7ca3c8fe9c47af39c59cda9828a21e12b2d55fc9719d8766f96f78e45a01d9110272be1eca0df9f30cbeb4e18b6ff2c689fb8c7fa0a49c720344eb703815b93e48b9cd5b513e8214713815f52480fca592ec506175d54ab06564941fa0a77f6f490b62e622c18181af1cde3d265e07d3361727000ee17 +SHAKE-256: 67475e645aac0dd794abacf223928b4e53ce795a2b2751fbd11ea3fd688bf7960d5531c5ab16ec58b784caf73dae768f9a184d68533a9c5608029fabde14ac85db94306713d88f4a0f332bda92029893cb9f59ca7155b283294fcc7214ce38c57e54e09a44683990949a57222df7d25a487c1f802f6a64b4f226abde3018e057f449812c3741307d7868a8f448a128309a6551e6b3c5062ae8e63b3b123325bc953d55ea0b68d7e3454d67d83e0bfa5287e8cb1562977b406045ab391e1ea89d26d66aab3294f42e003ca7ba1fbf21e42c2ba955257dc49c8fd2076d707a4b2c4533537c8f7de290361ca15517ade864a4e8fe12791ec6f803b17ebfc17c58a2cd4c47d98083751f1d5d2b851f5827d1697c3429aab3aaff67da0d098cd6df66deea37652a4de78d6a350436d9977993bc42facc6a4e9d4b4ac835c5a4af6d642d64bda567c321364a6805bd3dd2a54229f83d32ccbbee94eee4cf164b41468f20ebd7bb77493c02f963fc4eb44900ce9ca9f0e92932f77cd0eb1fb1a8ded7d4fbfb78b5ebf326c0c75388435047779eae04aa09b3b0d294fa19c62c199206f81d5e46810c308cc138a01b821a4af7f7a7a4f4f65b4fe87f0b4b59f138443029ab9960a92304e269fa99c66d5657249347a67b6287d5f7b11149c440e2d0f5ca047155764e8c9a5f071da2b2616ec8ddd4740cba2aae2f253bb86c8619ed0b88 + +Input: 66a566fa4c8f5565bce3aa5bb0dab1093da688ca9b682113c67e1601aeaf3cc6c8cc83327c41203870604a4c7660aea2a37ad754f8d0510c275e55f62f8013cc72edce3d8ee3276a07ec71206afce1f5b86f64ff855b6e6a3387a6d64cd6f20b3d64147925fbea5042ebcc8f2fd4be9c3022adc32bad52a240cdef00446244fd7c866e287b40c4228fa12209145873942e825a96fc95166540948a22179cdd694e5bd61ab45594e71ada5cbab4c6a3e13c9f52666e0078b53a16eb882bbb19639db55ca23c93209e9db368cb244a79e741133c3fdf43deb7e3856b57403f4dfcf0d2c2f0a4602c75db48a09397cde2d4014d74a3b0be004aa7b91c4038c6570629fe6793801b9a15a9fc72a16c76cf9443205d5fdfb5eda33345b1c3e9c6ab4fc68b95c754678c6239e2aabd61af26dcc84789ab5305eeec24fc12673e62212ebb8408b7 +SHA3-256: 647aeab6095d50d15b90b53187903909c65d0e926fe2f42b173598c2b86f42b1 +SHA3-512: 2d6ce550321ca2b7a21ad059bf7eb32681ac7b74d584ca579f5a3c95cc5211a19fc5ce198f92bdab92c6406b34611a64a50c39fcc93b24648bd9f8762da18d5d +SHAKE-128: 72c936b2a615e8cf43cd7f3d6d3f31a8a35832b8dde7b3656b4670c0e28a382dd432ac77d47f6afe00e4e157e047a2b79b9de437bf166e9ff7561742d04ff3dca18ad11f2e1d7594435bbec2021db63ffd74193c618ca6f464bdd4e50ddd1256636d6b32879ef965f7893619489ad99bdf0735d8d130553b247437af1f50cf1e73c2e1581df6b5c9b66621b4812a27c3894828476607895d6eced756211df606531854d5ecd2d569c7a411388c8a34dc034d5bf53b54705199e4357bdf27b6fc1b31285875c90cee1f91e937472e1f038b4ea26f293bbc4dfb458d3a951d5cde73236f9c6c3bb3cd0b4524a31e82a60b1641848d2a9906561c926b35dbd29312f47264611d7cfef2b544a49416c4200fee03f82d5520500363a95e3eb509d43eb7a22fccd59daa9c91b2c5bd667c02e7cda424b25798717b8e91d4bc192364267b0fd795bc30c3a8302fc59d237ee40e219d3afc1d680efd0a5cbbd4206b2190713930ac9994c0e570747c4db10f49e917b5c01291e7787809bec13fcea6fed818e489e1070d0ea6caf8f72157ea76286d0fb999f3deabbd0f29d4b5f519fd43c4dc4178d4c73b8dbb820ec038026cb36c4d015987f3c45c2e3103964367c0c2b2c3b63412ebc42758c8133242661eda82fea4f89f0a0eff08dbec889f18dadcb50bb67b0fc97ac6a6a755b7046ab68c2659967525250b5ad9a168bd0585a964 +SHAKE-256: 6c3d87c88af787e6e8e6ae8cbb75ccd707f776ebf97d63b4b5c6e458ddb508825aba04d3a7d1e48c8ad054afb00ba0746c387eaadbbc628f0c83cbe9d7ec74b2f6b5c7b1123f0cb5b0b904c7530b387bef7f3e267d33cd4ccd53af007aaba8e31321a8a96a2d3dac954440463a2de4e8cf43499298d80c646699e31c9c806745640b57f6d0ff9fa842eda35459e76802da75ef568b0a13d9778f94cd59303e6329949ab14988be629eae251584d646088f7c0663e31b2d4313c7a710b8626d3d6c79f7c4887a0ae42209c4556d30998a67d7f7931e010f257ec44630c9a74e520a77b528f1e32ef9312aaa22685dcbcf7b3e519031711051bb52b3f5c6cc6524f2fb58f9d9e00627be494b71c0c1d021b5272595b9726aad043ba4642d0ad9f425ea6429fae990f80e9de6bf23dbf645042fa694b2664e77760e86880900cf085c573327f4b21bb5f4bcfa730ba959bf29c1472ad6b42882729c39c796bada7f93f8b403e9c57c13172190a491d57d97722b53ebeb717c1029308ed09e5d7b76e6537ec8707c61c4f4094468b26e7ee32d6fa6a1b6cbbfc358a3b769550d3ad670c77b27a08bc01d937099cc826e8a6693d07279b56de45b0833bee803583706c6e3e77108c643944417a1f2cdee89369d5d209523278335e470f362e584fbc9af47e23b7735173793a41fa5e6cecc5a6a2a3b8cdf150a93fc5a3b51ebc3ea39 + +Input: cdc6d3436ff6eb8e6c5a96d2412e564b93649fe237ccd6ed16f291cdbae408f3987dc5f6c2e3e73b9dbd659571ceab9169fa948aee45b86efe9eadfb2ccabd7e1c307d4e4a9d93f89ac14d5f5aec0c66e0f146cfa2da23fc3cfc884fe72bd91932b111641b784d9fa3303c32c021286b3d2285fe1805473b2a836dd8f131c0505544fe859b85a1ca53cc5d702c30c32964638971ebb90e7613904e403ea38b6790c75fde92760a8292a8559755c707c432cd30b7938d54bc191d3156b41d5ee2b43c130e74101b0e6dfab5827ce17c710e28b76a122b1199a4118d8fd4c9020cf2e25f7fe79c1d43ab64ef16b78acd258fdc465b9c91f851ad0d980b9f84b732b7c73070b1d959a896bd2e494744854d84d7d7e41e50c768d6acb9bdb9d6eaa2049804932a6d1990673c3eb97d66d07074a9cf05bd79845c4424be6a716184b88c14a3ff07 +SHA3-256: f4c31390dec66465595ca8b20028c8d988cf69687088ec892ae21781f3a58fc3 +SHA3-512: 61f0307106075b44e9128789692880872156ca6ab50fb7c26547c2f8b33c5bbe1da545c570df79297e3a1df4c79a447d27b1fbd0dc732c3cc0014fe0cd683208 +SHAKE-128: fb0fd31dd6f4d26cb36ff2ed22df3b56089e83a68e9369b3cf061522f34ca524099b9fb5f28d36bd71964d63789ee6f56b3983a17523c6ca6fbb59cffdb06a529fd9a8304952a8daadbf7913f5896217e863394f88b2c0b56b3ff190a59b3b46e4b8695055ed438bf110f8506b08521a1b5ae30091cc554604c68a6fbe7e5d69b62cc1c63ef2ba81fcc44d8973309db2295bff72f3d4df8d30a7586204f98ae3cbd450cef65243b01e399416f6e3bf7773474ab8684da592951827d907eadbcdac5691adfa96331704baf2779c0382cdcce1c3a33e3cb374c80629aac700f263f0ce92926447289ed41ec964b9fc41bef6db375e7b9aa1171758a757668e285d59edf6312d1cf67b180f3239ef5766e908ca62a864451b6e1a46eb152ea1b424d02197687f76a935da25452f1ee5494f04402db6a7573558412e92f707e521faca362abeae3873574a8224952d22dc8644f89fbc68f80dd2d87060d84bdafb656a79f125ddcbb1a7b109d239e77c0296ea6c2771d37c1301be4477d9ae106795f954c9fdddeda4b6a8257ef658b9007035029e08c7e2027cf79fc0fb2aad001f495d0adb442aee372fd40631768852ac03ef7e9f92ec13dbcb5411ea554784b9b8d132dd2ab916a07339cf7344e4bcdc9fbb7d4119b64cb46c08bd5a70e19c2e86d3621fa72cd2c87b9cadc8c7d0a930c9c6c13b8b82519cfe17abe774365619 +SHAKE-256: c4cd4f87185905edef10016b570a26bdad24dcee8f6c3c72d42f293eb7f9592e4aec73b08f74611ec6124665969ba641ea8fc79e7f5465b7ee88d2a3a8e75d5362830c3867b1f3ff600a6128eee98faa67b35249f9af1b7a9480c05d4c777f6b4e1085b8146ef37bcec59c72ae9d710ecc32ed4198e44fdddf85e848742e919575e891884ea7bab296045f10b773a8cefb2cafbefe539ac1968c8770d70cfb632051df88d0c7dac5fc10bff79fc79850f16352b45b80ed064d9dbfcc32cf02f384792fd7f6ce5b65374de3256f44f58f1983678f724f45d2b0d14e958edcd2b1809a60ad293a6a22741afdc94379ce5b79360527ffbc4403a9dd096488b4ca52e15db4594308e7e04ebf170bd08a3cf5264f84c57231626cf971d6a0698ad53211bc103f5866f9ded1cbdc6dd1aaab98bb27169548125bba7a48819f49a703455a799b38f1e13e395425ef4c72161dcc0ec544c0d9a515b969117fecef313ca5dfd2ac90b323cb5a634f5c3eb4a6c9f2b97245b16f75cdf3f4626ebf7f1ab6ffa57bdc0578a7df46ff5f2c7519b9b456f016447c4d3e32f7dacd760e0451b295288b0d31ee4f664b98d455e9eb15e2e0a9efa32b0d47007273c36e329b56e31af0998554ddd035c306aa563760cebf6ff757de573155985f7be4306a2ca30b3eee56b5757da7d818035a511aed45d1dea004885e39a2c7b6554cacc317b8804f + +Input: bd7144dd6b8872d12d4de7c059bdd66e35aa72f722867ca1eab8e3c745bce32809892d7e2f0e9e60eed5f2fb6cea7ec6a37d1b9aadc6b920786941bc8305799371458c7382877352d72fa11b71f100d92f6370cf748afb2c0ee479608cbfee8d449a3d5ebfc164544a57c35fc764b9c4d5bd94be96b270d9fd64058f7137fe73682f63fb98ad8e79298140b2b526afffc22a471c896b8437c0c91193a07caef3a905a0ba86f7809951505def5c0f19f540c84237a7a550fb5f93b87438f5492176324e3e8fa02936bd0c1bb1beb2c020447940ff6dca9bf81024dc4a28ae34e4763757a993836819e12c2fca5c684f8c2c46707d9a8135569394ae60e714bc91ec48d568156ec485072d15963395dc440fda3f87685274b15701ad6b1f99482f70b9551b745c3acbc9a48eb70f37c4d65ba57091e3d02a38dae050a15ccf6ef3eb88b7da720a +SHA3-256: 909fdac5664d90125ef601247c5d312432cbcaa1300fa96078d536f043db7cf6 +SHA3-512: b74f867914709c952c1824223c26e23cf2796f7f07bdf38468a8235629ea35555fc3a74799f5d425e5878dd0e7b430bb7c15e3d81ed67f871f7f323ecd185927 +SHAKE-128: 62596bd8813457538fe54d5bc53cfec3a501a87558bb0b83d9a5b73b6da5d7cf1a2c245fefc8356b408df3f6262afee9ffa161911e41c89f0fecd4a0bcfcb6201e7abf412a7a4898f3217fe296b507ef89785285b820c5b62db87621ef1272a36a09ca8f38293cc385b3293a7fff14290a12f8f7a13343c5998b15fd185fa1ba705ff653c52efe5d24d7b01163f920ef9300c20c645fd0ed71074b18587c582c6a871fd72b9c35cba4eb4876ee7dafed6981a08a4e80758dab149bc943883d88ab845bf26d869bf887f8403a5208af1d9150a6ef7d772c857482a4a7785d876a3759db1a62e353dba106ad3dc3949841f459ed093d65e8f0f5f598b9e49807c033347ea825253f42e15941f7aacf91aef9761cfd8f896217b5e9cee969907b1057865ee28023f8b9a1a989b17229f0657a9780e67f22c9b37b8fa5556603bc767268b4744d5eb3e151394056f360039eb341deab1a9e84a4c09e1ac8deb5a33b15a16479aa41240dbb4d5cce24b1ddea0ab879e09795a070f0f25e880707fa3e408280f664f5bd363d46fc33bc31507d973454476ea22419c65d59c980c0cb6cf272e481affd93a74c1c78e0fab128e5e52dc89f68026bf5689aa90f9a35166973cd96d92ec3ed850ae92942aa888e4b0d6407ca89d9b45827eb1ea7d1a9aefe6d36a52fcf898b09c530139d95c395b4c693f296eb936c6174f4edf4f3577826 +SHAKE-256: 4e5360c5316f1e8cee69513b72e2868733045e4f4a0a48f894b6f0c08b963e507ab5e872d55635d8f18afc1dd5de27ef3a79852a5fc3c24098a040a79f2884d443161a7c0d95759b77ae086ceafce427a9273b1b87db74456c184b07dd9df50187f0d2676118e9862c8c8c63fb1f7c1074fe76dbf4430c2493363d11b96a2c308c1f0ee9a885be05d2903395ade15fd71edc60e6ebff2a3a8a84ca5457a0e260a66c829770240002dae1ea490fdbf50003519271932475402ac7f30202d109edc5acb4cd12f4debe4910907d1dd64d21fe5d147c98d4e2568fcd82179b4227b588060c3d9df6dcf6781ce4357e324c2d5aa6087a7541cff561e8ae4334721910bc2736c74a3a8a28e6f7cc8982ebfc9530734975d19f96f8329e7e6a6fc4b5d125d39f206a02676bd6c75f57aaa3f41b50887da7c40d69f385ec67c8948e55cdc71ef8be77f4f1415117a628fd8a98e5606396ab6722d690d2777d5dc25334e73aad0a66ff286b93bc8eac44218d28ccd3fe07b646d1f6805627e33c7999079ba611f6c067649af2db730709160086cf703c6ca9dd9698276e67dcd98cbb87186dd06b47fd40a43b6fdcda5aaba3fed0e74dda14cdb39e9e627c3673e5861ade9dc5880b8874506d1f6ca40a9a16d68f5b63c3c41c6770b94eefa15286ceafe83a2f545f29bb7e4d51c9c23090c66ecf04ca94d1a58ae26cb27a44a40e76d864 + +Input: ab2cda3a61d4ec27dea999c7f0dc114d878162dda0032751c240ee4c26c6d1e0b7160d5685bc2ed8e94ba5c10a135c02d68d017d97e0317e967169516d076cc3dacca636eea86d743cf59ab24715e7beda94fb78190fc0c0f9fa85e9ac5b50799df52a3729c5d56e1048dd0b390a80afb11e6844d3f3d623e8653db52d0d583ba48621c19afd04eb33da9be01b49affd2e2cc429e29db4f6982e52965e962ecc2787afebb862acad36151c8e2332e80e9bd5c49db3f19de5d13ee7aaa9e794e8a9fd723cc7435c22cbbb4b4cbe3377260e03ad8c4a5d3996e0aa9f08c66231e58032ec3c6335e7c48422b855aed98064e59fe378d6483e98014bda431ba7d82ae4bb93995d1994377a37097be92d4b0d448f863ac691a5d81efafd7db31e41dae27f1ce629972d696e27c6a8b9299bb3b6ea4b5e7d8cc5585c92fb0552fdf14a3c2e56a5417ab9 +SHA3-256: 369ae7933c3923f0fc40fcbe0a8f5a61daf5cbc245e4e87eab1ae892319c9cbc +SHA3-512: 3dd9661a91a8b678fc8f7d89a8ff28f8f0fe29ad0ec1b9e4ea78be46e5704bc56febd6b62348888cb21cc3e5f92bfb7a02d53fbad714d62ec6e688038f832214 +SHAKE-128: fa130dfe3b262931dfb09bbd4f2d6bba50398d9f84a50a234932deca342fdfbb2f877288239ab8b8ce775ac22b48c3099e642fa50b0a0f850be332699c58c2382f9cff7ac04162e29b300a855629bf3f29593454e6fafb23b17a174cedbebc699d803f492707efa2acd26a728a5e43eef4215c2e19501f69be3408ce053b6d9bc09419e34b89816b674915ca763b743a68a7d9c24311349df6370ff4a3563676c4dd7118dbf1cc7808dc0db19db025adb62dfebb81c938ae57d6cbbba9a296469ac07de2d00eb44ed14808014565563cea6be1561c42c5ad1aca52403b8cfcd18064194878020691390dcc65a929bd691036cd3594da4935d0dd46871e97eb149ac3bd9970918f3aeaf5bb1a1da294bb3fff082a63a34860e467bed8a6936d15710acfaeccd00228cdc5eaae13ddfab763f712d05c65e7e222065770c6722edd91df3216c62000ea0553e06a7c9003756eeeb7e8c2931078b93d00c06c5304e50d3015e6ba831d8c03020584ee0758aabbb91883ab28f835acb9ea7c7425b45aa89f1f5b52fb413b566994d0fc8a464848415f7bee5edabbc4c6de58ff567cc38e898abce0d0ecb0f11d6b8366a4566bcfcfc85a0ad61cda2c329d86732400546c40b579f701b140de27fdc43b4e581fd7b98d31e557f814e1ee2ca1ae7ee89b7acfc8ef4e0e7fd8aefe3d74f8d7b6be7da2735589638a664a2719e7a5e08925 +SHAKE-256: b18336b251cdb716cecca025b0f72312945f45ce5cd48ad94580a20d52890f88c8f19fa363c39878a45ec9bc6a56203ec837b8f601e720d41cdaf962e10cf6c2fe4675a3a5bdad2b87a4e0f8de92aa9f624e8d0716aba96ddddabe09e0fd6b8cef5e8804e98ac8c39bd7e868d5ebd75de7b9206ef9ffb83a3393c38d3038b86011e377ccb83d397c1bad1ad85204eb2466a5a3054b8e9f06e33f3bd84f1b8390e039026a92916fb2f38023423246a8afbbfc6c5309f2052635eef84e01aa4cff80ef15259fb6210e7e55c9fe1aa73950f2982c9a5de76e08f192f4c463a442d4fe080c832ff0957443bf6cb67c63ae417b4fc5ade69f9581a1eb4e98cc6229f65be8899b52e69da6b6e888ed6a17190598aed49887117cdc44697387b2a9b0a0492fe10f802916dddb030ffaa30aa57fb74faac41660501f015ca20584046879dc1def80443ecc3dd3e67b092996e4979ddf001897c2cffae0e8f667ff4e099fd194e71e8e9d0f64191f23d97e9837e794193d97f4369d3a11b383999987df07306ab9b421bb04a05c8c7d74e93a9fd191c9242b33f30e6d81aef5006f0559afd96df43a4ea0abba52193b7967a702c72c653458fe9fb3ab5072f6b53c6b5c45aceb770ef11b446e00db690636820f79fe935ab6f6490d06180ee6464d038df41ca80a6c3cd0e9d46793d86e79ca4ce2b1ce9a0de7001c7767afbaa122037fb0 + +Input: bb17a22648ea1f9c6fc8e88b2441a5186e5af524ff9df72bd67619d36bab891426e4af724ef43e8aa3e04071a618aeb415b382648595251a055f031e16500998de321f6daccd3c35eff60520d0aa0d372efd4a465d8000fb98c8fb51c432f4935cff0cd26e64c02b994ee0b314ed34b8e3bbcc0569b9f9e2cd5aead1ed938636fa64ec93dcd22b935fb3f054c5d92e16c2152dcd135579c66f7d3ef4a6c7aded48a97f220c44c7576b14993db62b5e80fecee665ded906a52d88f071a7821d42f0fd0a97c0c502854e1d96e33839c3d8f0008546754216b007e76f3cb61e8f279c0d5ac219854cd2d529e59b08f4007605b09b0001c7d9338443826b39243954db13fc68e2f6770a9374dbdd6be63c020e3982c13a06a926aca153181c6833da7327d5c7e52b5c088bee8efa6cd312359f47f0df0389bb44b87e1633e306a88727c41ed79fcb6db5 +SHA3-256: 022702776c5473bdf62dd6ba76af1b02efabf782cdc2c32751f5efd82207f4b6 +SHA3-512: 2dd892ab5fb7fae8f4622f775c06f0be69628bb36cde9c91a4c664fc2680ce00b3416ce4fb4c2d6c76a92d4d0e4c0b67165151d886e651bf0b8ab8a8e3d9fc7c +SHAKE-128: dc9ba7180b3ed55c177fd1a80b6fa972e5aa05845cc3a0dfe5479bcb4bd92ca591b07e61f010bf61724f65eb786139d244f8d9e9b89ada2542b400c9ad22a0b4b1780adc05dbfe247e62e2691333a33117e0b411aef2f8e0b5320d992bf5b682a56b25bb6cf905b3733e61b1dd04c1da85069daafdcf590aeb0c61f5d384e6ad67092fb99e85b09b03f7da607f5eb93e03b409f69ef14474486966319bdfe98f2fb71c75dec6c908652c03a73e06358db0d2cfdf11f9a192fc71cee548bc4f86a2f883c105f1f5bb180a5b20cee3434f4de9051c9d309170b7a86903b04a2b7eb2452fef6208adbb0a22e24ec150c4075b4d19fd375bfd820bc1ad6197af53ab50d20ceecdae600fc7e19c87fa67fbcf0b96fc2de66ddd9a2e6c0b383d8d7f216e54b4cfedfaf9a1bd8af8d45d03b802cf5f1a4718536bfa774f6a10f39bf8eedcabae1c05fb59066b838b2d717a884b2464c469a0e040662471723422ea1be7ccb16a24975542a41e77a61b58afd89c725d2ff4cfb8c4ec946fbe24e85c3334461bde680a2c41de8d6f98cd79fe296c50343e1630baba7c9e3d859b900b7a136704ca0a73704abbe97e3636c538fe3936ad225844c281e3105a0ea61c8feae6db351d408b51d0db782b784280bdace171efc0362940f6ff400800a9e2071b9d605cbc30afc256a5f34fe77a1313fbdd7c06166ac905d1c70314122a7c70bf80 +SHAKE-256: a2b5558a4a6530697639ca8869d62d9fcbacb00679b3f51c73c8934f951c389a9e36e1d088a02aa29a01768aa1241e45e50df6ffb49c4df396d494861df3b24eaee148bbd5d5d1cd737dc371189b4d5b867b6ea0abc389f4d56ff30e23b72493a5de8027ce52d5f9d5921b12f6dd9df5ce70d81d895ce0823c7ac42e853a2a94559fa0e01dafcd12a8bc045525662d884b034739bf0a96f6c4688195167013126449811ed21c36cbe66a1460d97f73c21b4a775481be6e6efc7aa3d6f2c0411dd548e66bc5a44ca7291bd9bba97ef952b558d9d17aeeab92d733061586ae3c9c4d597249d3997bcbef327d9cca51ec1aa6ecdfaf1bbf7b35c2bc339d59f71a68dae42ade74279d06bfba6e1751fd85030964ac336bb3336cb57e6ba1699050f62de9ee09ef0a3e84f63beb3d6a3ff73d9544ac6d947032ea7d07d60a0ebed0d107cb61ed96d80a9e901b86291c14ef681ac9884270cbf998ca00557ee3f76c02d3008cca44c4989277cea4c7b9cc36453b912120b87ad3751541bdb87650e04c2d4ad9ba080e4d167efb00ee2b92b5b5c90c9b5daf68b1130187403c8e5b67a781955290a4a8529d2ad6946f8d99399c1d032ae632a0be0f2f7bac96c710e8a744288811f69cc1d17c74b3b426e6062b69fbc9145992c1d7416ef1e0cb33218c13d23b841b5d6d03b3c21b322c547f562ccdf0b84a2b447b130b9a14643606e7 + +Input: 1429133e292264a7a6575b185cdafe44abd33cb2c1f1760d54233d37815fbab30e9241bc874844eb5d92b7500ba59fdc1e4174656a6779d2110e02b4bb0d55de77b73e2637a0ea91ff7d574850628e629739255cbbf1121442d4484b17c0efd0b1bc523ca13d9698943973f13d19cdd3e14415f7b33439d14fe3a0e2bf0ca36855d06ac2dbe304c7ae6a888f998f0fb05cf39a8a8204f37ded23069c23ae26d4d1eb3eb9baad24e384e155f1b4e91e03db08e61755ad7ef90f47a038f4777a568aaba59e0c5824ee759d7f4fb0dcd6299a8e5bd24c5211ff8340385020b4e802085922b064233a7dda883731650d3f4e551ce52ae04744c9599244ba75c253865e5256ff5c9c472627a790ca1eb93adff4c3b62a8d94bf2e5088df1be176cc5abad45ecd38c55cee58a57cbab3218d671f695d67a70b1309802766f9fe7dd8a3898f1e976c32e8bfba +SHA3-256: 7381db34d2f4af61898478629579627f4e1b387c394befc924a680706eb71551 +SHA3-512: e3874e6fb88df8461277cd502d81ab678bfc16752400d0825d7d37020dd1f568e0d0e480c247426b05ce938879b459fb56a47235bfb4c968132b773014fda224 +SHAKE-128: e9ffa7d78d45d2cc0b758a623b2cd0feffd0d3cae7d46f659c33cf0cb75b94a329d1f63cd037e341df9e0a8d2d84b065b985094d06f5f9d40fcd03fea68a969310029cc8cb7ec086808057fec0179a6a66bd6a1050124c594c8f919abdecce6da48be9c0e943c4034a788be6963ea0ee668ffecc6729494ba17bc528851c18ecfc977ddaeeb611a234406cca83cc3f61a7bae5a33dfaab32363c8decef81619e56390be9689e98e2bc60a4b60d5568e62fcbacddfab5e7673b6ade49a63fdf7d2d73db401802df0a7937d89acddb00c0d403aa75cb17bbeca61c31a369e71d47e24e08e64a9898cb0868f175d30e989fd640e565fb15caf06a420bd0a725658063c77d2aaaf64b2dbbd12e6e26be4f5afc745f60efedbdd8b0983156443684e3cb358c2952850535e3f4a512a355bdaa1b25058f798690d4ee052c4b6ea9c243a9df886c973f47311df4852b62442ead15173610fd0970330f893e1ef410ae5df740cf2e18c9ef4b7f907078aaef82e6eda84c964896dded21bee68ade27e70aab5fed626ed1ba299b7f0eab4d3e75d8c3c1c143e406507069ed7fa81dacfccf663e1c2423f7cffc215f7eeba4d720f2fa7de3064255fa4d3749b79f991e6850c4d92adb9d6f5deb3846efc1980a49f69873d8eb489e6d99e6546af3354e769bd01d110de7b33e9477334b7f413e3c118767c7d0693fbe7ba3695090f0c27c21 +SHAKE-256: d47e404a0be71c17348b23d79b913aea6d459755b6d2ed687ab65c8afce7cf5b327f2abd3394cda2dba9cff176e9e8e590ffc60495714f65198c35a865e2dc289fed1f7ccbc7dbff846272d5f5e17b10018209b9fdee7293ecd86ba33bed88a8dfa0aa45435250a32cbc2a2662d2e974718053ec02714b0b57dfd6a668c4c9637f97a4c2e907ec197e4480fd03ec84d1fe23e4f0d24f73fbbe1b5919ab42db7318f074c9b7a42e71b39beb077c32be1bd44d6648e22ae300f7bf6e327367fea2d13b7a8c6799ece5634a58b84189050700982131f48a84221919860cf299f5339cc5f10c95bef0174f5bd1b448a100677daa8bf8d0fa829fd2174ae43030c4d62f2287ab5a2c0254c0562b851d94ec275b33c4251470c5f1f5b529b00d3303b5d52d400b3ac1e7688802c38bd9ace7b676221287adb1513ccde68fa50f69d34516583f9cd957ea093e587b70e55eba01e946532c0ab044e7c5db59941431f2b31e55e96102bf7d64f0d1ad873dfed97e7e9fca95997d326fe44c73a6ecfed093f6779a165957bddedfd5df62b3157003d8a359ac3bc116bee166a0631e583804dbbac0b3088763b7bf13d095a4190245f1899ff32a141e855f34a31409201b361689cfcde0f2ab081743b9fe63c7b7d9a1e643783fdc67842fb005670490759aa354b5b7d4dacf5189abd87fc237184656ae8155e58ff3e0ba8f7abc894b9a95 + +Input: e927507afb8c2a233fbc171ce6faa51669cf6017b7336416660edcf5f9c9c88ae19bff34383c525189d27fee3a4888bf123b587004e20868521d8f45569450d22b6a9e18c1d97621e0286e83cae407833bdfbe9674864672ac52eb7f12a81adcf0049bbc20fb4b3cb423629690ca8434f8f3e9495f7ca70c6eea6deb02049310a7e94411e739fc1f5a9d39486de6b35b19b59eeb98fb43f4b9701d593952547fc3788c0b85b5c0bf2038ef236907b9f435a4158eb619668bcce8d5c417b5ffc959ef96f674c6ea2a01b7e0f9f35a4f67ce92d59c514c633d7d0d66388ab7660524cde4541ea8e966c356931d70c4b0ba32412c694c9de13f7584beaf1a40ef542fec56acf435ef6e6fffb817933c8d85cbf6a5367ad4dc7188439a717f5e9bd18d62570faec9fa41ed8efbc126512bbcbe33b447b7d214560287c1add94b7524985d92c4b8d7a376f65f +SHA3-256: 044a7a86cc56aab6cddda2968fb158965db849035cf90f4ef66ae30c9296e4ae +SHA3-512: e67d1dc102917d0b894bcb761c7eb753963e0d376ef21592327dedf6c73454cf0e6a732681d950535b35ae4ad9952b23c684f42d818ff5ae8fe7d9cd04973bf4 +SHAKE-128: 041ce95b9fb726d7274617b76f063f227c9aaad53d1d07d011b09d76c1deb971f82890c358ed4ad729b098920629e32db1a9098b151f5410c49dbb8876f6e921e24368b04f99461c0ad28a7397aa70c9cf4db1297c61320e69067d6b05ae2b207892b0374bfa9e7c1a0572015069079d4b84ef81eecbf96eef3d51879af02d0797e1c33f2bd92fdc2b811126416bea1ff9d4eecd9ec59b0ae4f53d15498c6ae58179eeb59211630e7198e85e3e421f51fb21ecb889421202ee270783c83d1d7501a2e1eee81a778fb0daa770859deea9a523467baf0555237d25e6f791e3ba01ab01fea1f1b0b599785d383ad439c8c330fc71806eea12e1e6f43e9375dd7e884d6ffb6ecb6a38c3c537bae7fd2a96a09c3c785fd015e93a1e7d56d844c5bca2ba28acf36364975e6fdf12ea24fe0b6614a7100318f69fdb13d428137f596980f0820716077e79036a1645f599a7d9510e9557f6c4f18c94f7fca6c2f9bf8ddd2ccc7d825c806140a8b14fdf6b2752a87cc4cc94001960da1b8949ab18a03ac0bb916b60ada763bcc92a4e0c542751070e2a9931f7512624b521e98f627da159cc16cc10747b58f86bc67fd7d763ac766888402c04a73a5437972714d75e5050b9b708380f4c32719bcd01ba2e6fa0fea5b0a2d5ca6368e506c9827c4c7ed49870b6705ad12570bc83c1eed8138162bde9708ac4a089ea3170776ffe1772fd54 +SHAKE-256: 909dbe8405a6158ad0cb05c3a17f4ce9cbec209fb93c61d53f06d4a682c3c20d47b43a3986a820441684452a42311e81dde785872e6570faf0b4576ebe025dacd5a31235cac9a94e3c400b1be0ceab53225bcadcd703fc38719f645ffa52c43d1a194c2ee067f5d7bd568d03b75daedcef50a15022e2430a5d7f5bb641c100ecf04f7cdf6b809d310d4bb663603fbaf1e2fea606a66fbc3900058051dd83b672d0d822600c82b3949be4d42bf28b5d66e8958114bc9ac8b9bf27ea1c93af295416df45683b0cb8a035d97827ba1648ee0473ac107a8a97ba705e1397fc092b82cf6d2f54c814e6c1cb22db8e3963ad48fc8178b02248ce311d8ee3510d0769e2eb3f8795d905df5b668990225f12562091c6742eab8a3a3c9872981d1a11d8bc158375869905b9100bea9140424dba109aaf8fa508cfd10795ec3c45940b796f73d27e121b0473f97aacdfe81b508f675e7d567a5ba6c0a0d703e0f8a99b81db89601d44caf4551fc13d646aa426ace2b2a8f3d94df76696729a0a49703f3d5ab1ecd3d09692765aab203ca13735ba96f577b72d64a5538338a7d440bcb2f697981949f8a0b82c149ad3dd171d92ff0d340616cb4ddcf02dd401a1083c1a97de15f83b1b7a166058bb96da0f82057beb915a2fd5ca776329bfeead55086765c041d4569b1ea20b16dc29ac0e4ade06cf2d93af463b5f5674dd686341e4fb5652 + +Input: eaf5406334eea177923921cb60824c02ed687f9fd449b18ccdf2f9a4578159a3b4881e4a22ff0156f561c59d61b3469bd3150e88784a58c38838a95fd9c672bc35c3079f81b8802e25a142bbc087cf5bd21a78f12a8e0965d6c9a7a5c3f11bfed6c1dcfaf82e06a455f6fed7ec3e2defee27c65156f53b52731c309876590aee58d7e3f2cca78254c2f05b3e5be33d0336f9f1e031e50dabc3baa21dcbc55ceee876f7f60bbc28443d18118379d0febcd78b0f2fb6d19cfcc6e9d00240aabb505919d07423cfe87ad5daf5c5012a046e7734b29ece5f8d336439b5df22cf764ac75372a6512c856e7e86f35e3841986e75cf635fb0dcf983d8f5917197f591c04eda703f1ebcb3cdf6fd9a309e17a1a9bb366b53fe13f1c9620917ae11c8a39e7ae03d985122c7e09f833c79742fb1c4c01f8dca920d9e514bb732093daade421f971de4fa912d16340fd3 +SHA3-256: 73b4846f84ca7b3438ec7e8bf8cf03e8e84b6e33fd84d7921e1659dd4f6a3369 +SHA3-512: b1b3e1ffee4856dc021a654a9454934f3aee82f540dacd9dfb0dda52647fc66c14f05a43209a9a4ee18d487ffae6dcd12ef60d0ca750a28dce8df6593a3331fa +SHAKE-128: 87bbe0e9b60d0480a3f2b5a9f6f8156ad6c09defcae79f69c5c20e055a0602f0134c92af4bcf269fff5dc1c95bac87fe0b64d37ba71f4bb51dc4fff15c2d6e0881cb63461895438d0f077dbb964417f7bf8f9e76afd952f3d12ee38184858feaa18a88e70695689930df502b2a863e115b32247673dfda4e8711c76e96c15b896794d09d0137f1590d53220538a624fbbf646c521b51f78e10fbf236f4e7d9d3586c52c12f948747efd2c128bc47c1c4b9f4845387291938df49cc2c15edd96e7d61e5e6bc01fb986ba0be821acf2be1d8b27a16ec9b5a1978ecf44adae3a80080baff5530d7e7682f7bbffc1dd004c3099beb86c2d2abf458a56f56b0abdb02c8deaaf0d0e30957342a1b9c7c0b3557321906d6e220127c4dde1c221c75e8e61c6447af19f61509d742cafa3f26226e6006253d963949a3334e9746ae028339e9b9886c306d11acd52569dadbfd65c67c363318d412b042e908479c3ad85b64267ca700908169894e98ebcf43ce0fbc0c75516bbe893108717a12e0c6f402dd8454ed3a043b55dd3918dc38140e73434a80f4e3ae913110c4cd7ed32b156f96e4c158776ef9a37c4491c60aaefb4b9800e36c0da115e8faa4b718d2855cdf64f80e7ae1d028349843142bcc0a3dbde4af3e006fe536bc52f84e3e9fb3658d2ba7f81d3a10b6f93b99b427be35dcc91c762878f73f356a4d2f18230b4121c91c +SHAKE-256: 663e6f5d60e357677b27b3f6f340db9de8bb750cf2d3733f2ceb9fb76f6fbc5818de159cb1b58062d994b6bc4ff5ad84d2f506320464c28e8613356705252cbadb2428058d1e181c4c61c99aac478767a30cd27705710afc03af7fd1fa3f0c30b9f282eee67d569f487e345de2fcc20c70be9ac6d827d0073dcb4acf1aa7397e433911478a68df7fb79e93d343e387c475b013ada4153ca75ce365d3f233fd53ad30d672b4eef590f5a0519c60a06f8fb8036b301630c713ddfbe1f8839519a22afd8f3a0b29099abe55167dd0aa47b765172d64d968843cea0725b820c86fb63c594e46144aae53d2ae7d08ac4922ee1c8086189ab40289278efe3677018fde0c1a27b4613089fc6ffde5d221c74cacbd1784b4a0173df4fa7af73a53db449b1bfac9b0aefea0373e3937a0e9d208277e8e695d0a93deec9484a655af994a476ec9e6381d28ef6d37fa98917ea993b61adc22bf2280259b6e0f7cb3724b5a6376c1419aae0b9fea6e628d2746334a9beb6d68de061d438c0db0af4d49326261cc50eef580b98220fb1fd2ac8363bc88b6cea24584371def90389202e0f9072fbcfc029e420672d754366bb1c840e4b4c94a512aa30c5742b9b4092a7008e591d73ff0e1af74b6d61724e774cdcb65a0d64578b2120858cb968f0ffa0f3d4b8e443d124b84a5d3f2ceabcff867e7cae062dc9b03dbda62fa0a0292385066bd1a + +Input: c908eb43c3e7f6195880987da3ccfe7fcd3f5204b6da156d0d67f1d26ca0fb8cf20d2fa729b7812935761943c28d148690c039f49a9ccf5d2a2311fdf7c63d69115ecbdbc1de01d7646a6d34afe4b4f4a64f2730a5b28cdf105d9919e2a336212a3de5b199d58cf67f058a5cb038f0612858435f2e709a81deeb0663cad1bf562aea8b83c334190fd7cb4598eac8a089cc1dba78c0117aef25870c6f662ea2dfa55a709b7db4372629df9e12ce81bb2c41c02737400dcef1be604cc1c41fc67c9190e5d8017da4605f1a39a37d848548ba98c17fd767fa0ab147d0a011a8ff12d0268fe01ebe014397d1cf9379f8d4ff7f74b5029017a9d05b59aead9fc7965827a233c004d10c1bb355d847f88e525af942cb091bc0defb2676c5db34b1ce619fde8af3c1fd7cfb3c2b96fc1bbd688699c230795a535bc5a6c5d76c4bdb7ddac7da2814e4de4d001c4f2210 +SHA3-256: 89a35b7ad236d5f54a93541dd9c07d5c063da7f5a83d9d97bfbf25cf969eb372 +SHA3-512: b6418e570f5397b7c698af8d0bba10502d280a5e4394db97666999a2ecc2374d40195983d66c95b580bdaa89b25d2c1175fea57662dd5b582f673cc283e6d2f5 +SHAKE-128: c98c1bb3f77198bc003ed30ff222a35c30c77e4f28ca59b1cd1ef8728b77e0d69e1e5c39fb16acfc3c1f9dee63acda843dd7fb2c2c6d75ca2e9f4d7aff8995a27a7e68d4fd29fce5556694930630b503f52d9159b78047cbdb168f959889ac961ac7cb9bae581910cc3d78c6c3840251c7e0caf186fd6cbfea58b00b57edc3d622e934a489aed19e9c2e4f5adee86dac332f8b01f4f6e8ca5ba250a15301d3a0b093df33c7a738b573bc39aaf794dc1bc3be3a33106197f0fe17c36b1a11eee6acd016dc27aa1f4f9cf44d9fe61c99095becef58e6c6e1dcc2d5b8a80229bc89a49c780912bbdc98082936fe234c4e93e5ff6e019827b69a9309acf78552ea2a0a7743103d9dcdc609949e82929992b0b55bc4c1d9b3fc86ca7be91b88ae5d163d7990ea14d99b070fa9da4df2a5a19ed943e625676ea83adce42fb3c5320e6a36d6a7c980f37e6f36f97002e729a3193bcb68f32109c424c6896a93923ddfd23b69b119c2e1323ec8275013cf47b99a641c0e21e58a0314bc2ab8e5afa5f15c075e3e97b8b208c3051d69cd4be5a4be08ffb851163ae017b99129b0690b27331cf3c756b60d5f085fc8122e91c50ec143376cd56015729c7a6fdf6fbbfbd8add78f7c58309a42f62f958fc93694381c2e0d85cf3b63612b7d1892abdf0756dd4350bbaf103c08cfb4029e55cf72f046b08ba1202080ffdcfd8125b93b2239e4 +SHAKE-256: c5e41d4e3b73dc0f379048f57a41602b98885a859d62394c446888817e694d68f6b59f3213a902648e0701b9f2c88e5804c6ec54849783ae41250439c6740a710f4f25e6f03a6a6e654ab1cab8d14dd61e69adf8d1c060b349b69c581c9d888d9208fd5c0f8b48e48878458330de27de687fee780bd17a40205819c576f87e9f580a3f802cb3f793a85c6d22011f4a6a57a3ce92761af6a8dfb0bd6505aa38f1610aef0980932aa4a4f5eb8c7e0f7d6dc09d0326cbf53527e4bae49cb5d4464775bd37edf89852769031a989bf22d6c6c0c65242a10fca2275fbed4f53496114473c98d9ed1bb6e1bfa9634ed9b2e26614f3b2798f184b7189ee911e52af8508a1d20a40a4a3846cf25bf2a9a3a521b53dbc6b17b021c36ecef22048d0f62f08dfb0e2f34b498ff094d4baa8716f6d2e117cf02eb36355508ceb98fe66e7e56121ed7c26af4dd6dbec9ae983c3e14b6b4b78091b1a782997143093436967d631baaf1fbf8abd074fbf9bfda48769a5967fb3911071a1d1aa649d8da7d0a2ed914c5862a88b305392f0beac7e11529882f89d2cefab476373b4a6e52e798931d9044716743e495a05d7742af43e35d2f7b8b0a058b1a838c6258e505ee748d8f6e43695cf0bc681adf2737c0268cbc23015224d4da38a97948f10f986f811eeab62542d060daf0d66595290c3f89618d6f195b446cb3090c0aa73e8e620c1b3c6 + +Input: a730475ee0a5d4d5dc2fd3f47c5432cb01ff205fd500d26c584eb689e5c87ce8c1e2529d0dc425077acb634b11efd86632c6dbc2614551d80783989451597612dca10a72f025a0aca512c90e4100936707daa7e424789391a566330749b61550d009763a1c0225fdf8eb4663094e3df79dad4883a2bc814bb2b3d1704528bfb00ffd0cded220e5fb3da7cd383522a7791b7e18f6377d44a2b77d52dcf2d222724b7eb2a4208819600ae05615933b2f5091a7dc3cf4bd2bd9636d93129fedee883eef65681d281fdad16aee6d0d0531f642a38f901c852b708a76bb6111c7e747162bb309484dc8f12296a81bcbf9ec91a48c9d4b5b96b6144806aeb3d9c91b2e25a3d6dffb73770a971281abdb105d6748436111d592e0398f705b6ab49b598c9611db1b6953231c6b70d7b2adfbc506baf780a60cc34d097863e52fc722b67859130876ada3e856e0b409040f +SHA3-256: f005141ea2fb7fbf533a5d4498559f87166e367cf78a381a108b88934d058b80 +SHA3-512: 1b06721251bc6a6257a8b63fcb04c1c2c6f64de644f6cceff44146007771f3a959f4ada77d91ccf4e20b5555ed059ae429f064fae1acf74c8c13f0e80e360fcb +SHAKE-128: 8dac834f5daecf2ef5d75c7827f4de4e5e3e1a7fdf6b1274a5ccb295f03cfbd49016d1ab4c9d16f28950f28803e4f9993f5f3bdd2a03173d727c4052111ee65a0f35effd3c492e09ff0730954ef6c46721380fcb39d2bb127b197a30b61da9413b0c4ae60dd2e34595e6cab6c68f5673d648e0631120ad4c34c1517d9c74bbd4ece0efa47a1be36dc3481481112d69f554552ded14766a4d0bad8dddec9debaa57cabfa88049dd432d59d230046925411c050b6901b9869ce2c4882e74702efddfdac1fe2a48d93dd62ebd3756fe92aaafa7a0bb880ef32e4691904628dc3bd0e6d9e028b10df3c31a9583888c1276b196cc5cbd74d6cfca7fb9ff4461de549b2cea752bbc43faba439ec8720525e87c2470e48e1d224ac168ec221794684720b3dfeee648d79a0b4fa3450b1b681b1a0f4d4b4eb69f68bee8e743a140736b90871dc612888a45d0bb0053917783a3dec5008eb97d748393dcc728b4e1ccc99ccb319a35dd795e1362de1d76c3bbc8d9fe23b15724e197f064cb2231df3fc493eb61f38f3fde7d12d3b73f25d0d0f873441d831af51d2f1a55db090eeb721b94d6b1bcb5e7001f247c66d4997f767b9e0af59baa3465e0994942d35ecbe22f1794bee6ab1dc3ff0dbcb90a41515824c3c96eade061aa79931b2a854815150632bd64af00646505048e3691da15923816d7a6bb73ab881536435a40c020c43c58 +SHAKE-256: 48b0055293cd80c3b268af7384392ccd65193efffbc3e242209868e487ca83d5d550dee8c6b8da28f35b2b889eb1cfc1f881b15037958804cb1005a60ccab44c7d2207598fb7026056812649056cf2f9e3bd8d7cb437d5d5a97138d55ef16a6554ceeb95719777dd0dcc36e6250ac9f4b38882c175d738ef7bd25a77939374ba9290f2669ec80b5f33576ef5f3d525dba4814951f2137edd118535b8f2531822776d117ca0fb15e3f4a69d17a23c59435a6363b871d08986b3e5f6b918244f58d826aff7e84432ce776264f04b005471eb28bdcad53216835bacd603eac0fe26e5aceab0ce399706189d659b6935fea38de2ab7831350ec4aa087eab4d44bf2c7d52cc7c00191bca347e91ae3f195703ceece8170aea872bedf1a6cc0565d105ce243699b18580ae0bcad58efc748b6eed3c0b7d0a7fe6c4e9263fcb3949baa912622eeb68cc6d168dd734e49df7171ac50df238da732cb9f025273197e582cfd4a057cef85684e4d7c82efc78b45ef5d6c052d97d7b82d18221a6c4471300c54a50b72f52fcce3ffb7c1c6b42f4d7b25439f7c3f8e23f12cc629f02758f603d1601f6a3dad29f9ff956bc5be5c7e3f1c822cc800ba2f16fe43666b763c0b8838968801484b7049977c15a368e4c9d47ae08b8750cb61d69e3e8b533f1792506262376cd3b452dd8bc65dac42e75697976ddb1f083d554b7dd68cef6774cbc4d + +Input: be7e8e93ae33e329a9028a9faaad626c586ab01e6bd5bc6ea7050786f45a66fd21a904420aaf5107015eabc321dce3917da8c9d74814cde5cadddc7d94014d5a9e7f30d109956ed0be68e9bf88db79210ccf9dc2c5180483fa3ab3fe64866bfe1f14086baa6872dfee2b05589c92ef036ca6216aec13268b4fa4972ec2965cf1dee400f7933494260c6ec19d0b2e8a2e3b271813f0314b386105d8637e0ec8e789e653611fdd4d62cf8a262fd0328d43c1613932963586ad86986828320f2c0b6a9e02bf9bfd42059708019163c8fe1688b950c9ab6812a7f1c1deb414ae8be4aaf5c52d86f1da93610d2091b046cd609a81f51e5b4571d3d0f3172388827c7cf201624b59e77f223e15adf974b75892b9fa6af730dbe0720a3b955d9bfacbbb9e39891bb65d6ba845ded585ad6899e651521817fd320ca280c92b97c70ae64ea1c382feb320c89fc6543dc414c3 +SHA3-256: 611febc0e4d8b92ed1e9562fb493fcffba7a9887703c7cd57df9657b725c4b6f +SHA3-512: 8e352cca86bc3fa6256d9cb3668af6bac0e791b66d82018ef7c18b5e01496cd6d638281f7490529db2ebccf3179cf2815c9f0685ab2ec9a66b81b44d596a1d1b +SHAKE-128: ff7b104861e2fa4a7135cf8d4f65706dd00dd8062ba78dcc3a417757c47f2d67017e67181ac4a319bedb98704549218d78bbbd7c71a719c4e5941059d0ee70923e052a3f02272fde73ea2f1b7d2789175ae6aa63ee98b75678be432a7e1d89456e56265d4fbe4f0a931117da35f815a25ef7bb44c5e263ab70184dd1e36afeb5e150d7ac5176aa43b37db47a8aeeb3d4402e848ffdba1495d83dde57b673cd5a530cd7b735d46cb67a6d2e8df95b5bc2e6a1580317dd03019f5ea9b6943bc7cacc8bc54db8ab7f1339631cf10b3669c7fe35b6de3c3c67d0dc99366cbe908b51cbcfd7b875346a9cd6f5e7ebd8a2efe8910f9a979fe58df47e45c9ebb3c78f98c5b96a8bfef7a8142e98e78f57031cab96937003103a0364fd7550a61facf79b8a0f218413bc6b594f5cb006cb433c002451cc2917a827e6e8283dd3dcf7375ae8303b8173904194fbb6294c0e4899fc7686f16a1e0027c95a649905d31f3c4508f71b91b72ee0a32cdb1f5773c2042f39b209e4f79469a65e04505ee15852b899f40645377d90c9aab6a7637ec153e685db63b69b914524759aca3d2d3e6f4b725f293e22f79c04de6d53780d96fd4368bae0dd74152e7ad7e3dd3e9d58a5d4c782dc2fb371745d1a458d26cd9d9271d1111604d8f5d616ed4e7e3b58b2f900af7699127cca640beea28a19d11f60e1ddbbf1f65ed2423644e1826187a5b3a7 +SHAKE-256: 58b93d4752a53f308c45571c4655cb2c013e1642208f0a7ff6eadefb992ef4153631d02c123484bd86dfceeafc8718a36a8b72f2da23c6fbcd94707c72eafe32667716b72e480689a91f48ab1e20aa2811b4e5149f457d4d9fff79c452ccc52223599384bf1c28539149ed6af8865bc3cf8e137d68bed2d0089a0d0a85eb968e85f012c358bcc0575c1f28bca1449bd67f68e27367518eeed469d70cbb9facfec6a5e1197b1900aaceda1ac121acf9beeb6e38e4597165c26834a9919682edc543ddd414e21b358e07aa55b565fb76bb2adfe44c91e8a50da5ced0f61a7200e12e1ca5f3954c7fa508d9cdda4918bb5d6adf3c4db06764426ddecec431f2a04a685c5203b050830bdf9312650d94b2c730b2d4c02ab37f85dac727177187b1db9d6acf3a559dce2cf81ea6013174704bd53a9447ae9951ab919b7bd73f0ba22071b982e0ce5082007baa1f818f0c4869ee6a2a3319bf3a5403cabe0241c360cfe605e80f10023edcf13e206f7bdcb97722c5b0077b6a7786c01164fa17226377613d1f3edbbd46abc4b0023f0a5df66555331ac098ae0f89df9b33ffd9a3a60521f5028abac8002f0110c7f26f8f3fa594147d5b37c5268164c30e752befab2900c380d703314f28649142c43e173fe0f01c8fb33ff79653f63b17258dc363a2e76f54d359798575c6fa3478df4c1203547c92f21b1af903f61783e935c5c316 + +Input: 90d292ed54b063d1b606f02e330b185e3b59b97e0a3e49f0d78a66d927e5793e86921332d3cca0a4950d12d37ff6d472be4cbe50f01eb9395c333992c9c666a913cc752f0d8a59644f04f561826cc46a60a6b642c5550eab049029a62ca701beb96984b8687713ee0423e7aeb1d60e4571c7d78b58a94f474027f43943c00ca20b4d30291ead1bbdc720131af90add629aea2d75738bd7f16a9b14bb361bca3a415585071293df4bc8519b2324f5ce9253664e9db842d2af24b3a03494479107e77eecc00bd5941f00efc77f2035a47496837dda84f2f137e9e9e5126433c65cbf55a607216f8bdb0869b3e47f52df96a090f9255611297d7670210e94291f22300f0c3f6988c6d0819fd422931127cf166414c900150040e4685ac95606aa5698d66c3064ba1c501e32f6426649722cfa3e292508d73c269e2bc7ec67069600abdd5e5e922c2bb7d060f3a2701f7c +SHA3-256: 882816d458de6b518b20b38357c978482313345c9a4b15a5ac857aec73de2d94 +SHA3-512: 13d1f2a2c33416897a12a09754d21be97078a96e442cfcb1a0ecb4d54856f8a3f400b510d5a23d50bab154353fd20fdf16d4cd70d0e241d4f5418b7ac2c07cfc +SHAKE-128: 1a91f5ba5464187228ace9ab85604b601dc21604f4c7fbd6feaf8e40aa1e22241c875801c0dd24d1e942a994277df86c06e8b72013a1a35d30c850c3f28e8e1151a36f6bf9afbf8ee4997a50b28b6e0a17d705bf3106d2e25549b35a25523ebea2dc0eec4c8a2471e71b41e7ef224a836daeb2f95034dd97199e5ca03c62a7be05228ce67a800f3fd64a6fc38aeecd81b9784061e3f1742a455ae0554aa301f7d5c2c37ca56c8f36184c3847aeee0e6f7b0593bbc94a16f01d1bead64825e9bde2bed095ac48a4b48b91f509d9baeb851e07240781cb40e6cb160afff2800ed0912f64bdf90a9c3d8db9a3f457c64617fc0ca22d3beda6f56397bdda3a0bafbdb632e66596a33601022a3fad38ebafc1d7098df6250cebbeeac5c83e489edb38bde4dbd6a7c99f87c01e7d2067e36d6c76c3cfdbf334d5873ecf7b486f1e14d9b167627264105e6d5c115b7f5a95818915a6d92cab455a2555cc99d9f9a66b98979b282eb5a18622e5eb81e36c91cc8162a0ae90d4ae91178599c5216ec2a8731880b070c24899897e2f5459d7607c38e9df7f2ab5f1abb458d071057333d4259a2a03c2f75b14801f264caa7eadd86ccaccdfc275b66b7b7e7583866b1ac9f6c4f2018eb320f1ea1df77b0b79d66971cd87c8eb78b62bb6232d850ff4077422dc8aaf84c9c21acd7ec87a3dce87c97187f801d8adabf2946b2849f89c90ec59 +SHAKE-256: cdbc00ac59bb7f5a3debaf3a28842d0bed85287a4d835a179e84c32c9a04fb24f0cc018764850eb26838d00353cb7c94798d83b8cc97878dae9bbfe6690968bae614cf4094597ed25c622f926cda65557bca43fc2b11d5bdb1bc853a332d9837cb86d4334583010ad9610f87adb03634bed2077fc27ecdb2aababbfec0c71047455c50bad87aef23bd87616dbefed3af6c55fd73167baccf1cfaf8996d80b43068ec9902a085a34251d318f2302a8d0180115da333d1c82fbe7dfe33216443e8e8b5449f24bf6b788945a295ea03d4adbf2a313a72500f779666e5955a77004cc4b10179e70fb15bb9b51973568340dabcfef59f07917909e6b32b8be9be6ef8aef04f5bb1a36c25a41f9c44498eaa400a55e2f1d61791167c5ae21f762d905127cffe8a27cc3354564d7c48575e3d860113da9ed643fa7c85cab7a9f484919a82b5f61c520f2364652223902f8b2658673186548eb705639ed9bb21e8b3f5283839d958f570cc6f5c31507c3cac22177244f241235aaaf9383fda56bbf438c12ab31975ebfef8055f18c9d01866289fe5769beffcc5a6bf7ef943c3e7524bb8a6bc98964a8aa6d53c071f587759a93128c3c40dfeefdfccbd4e6f283bb98eacdcfa6f63ae214ac116ec5943b6105b878373703c62cba5777bbba3686459392be84dfc5f7dd8778d239879ea3d00181f83a5b6668d8d5492fd4f9d7c7fb00d80 + +Input: 95a6fbfe81a870d114546048f04f143c205511d36c7e85dfe8297e0777069e5c94b6b591456db0b07198546fc10e7ba44714bba7a2f43bf606491b6e2c61edd71d8cdcd035be76e8f11263100d6cee4109472226b08cec9d68e384f3d86b205466bbf1a95373a32e8665016c376bcd94dbcf1ab75195abbc08fd1d2971a0fdc4b70be9bd2a1b0f6eb283c277bcb6bf29a9d7252730b76dbbfab62854b24e1e2fae393da84050ff98184637c4772fe7dda52d7babc215297aa43ee155459b1500f1a56029e3769f93b72e20fe861e59411947ca0a44eaa91b413575f58312f4223380939cd742bbf346da7939338e0a3293e982e8b988c7995e1c3353efb2de93ba02d313e0d6f16e7624c98287631dcc130072944d79836a2f3cf4c95bedd81303b530cbda8914f168ed93f74a16a7ff3ab6df6cd354427203892dcf33098b8bb17a807fe14ac0e3946fefa9caaf9d09 +SHA3-256: 7ea96818cbcaff6e7f9a3307b1a051a16e1b4be242c0d7660f24c4a9dea4b5db +SHA3-512: f45b206fd2111bb8f9aa316d659d54f6a4d9b882527132a03938b6457888dc3ad7af4f838c9461c1a5b3004899f8b17ee58123cb9fffb8eed8e282b421ee1c00 +SHAKE-128: 35fb2070e824ffe85b5c52b49711e6324c4078ae11ae5c6af95c1ebe21f7726e72bb378c66fb1e6feb08254884f598a6a4fc2f5aa471efc26c3fd320e1b1ff6ab7da88384467003fb56799c783f512ff2069a9817b1f9067056481a053d0d199497e29e4d6e99592b1d9ff3970e16a47902565636f1d049b47bfe6c247f4d9636b41336feaa6983a737dd901617961f1cd4f3fe9af5d0b38716f9d9f5d2539755ea06cb5cb8737560ecb3526dbfce41a6fca9533fd26895d855a1df5351ed5d0b45df176f7eeaf5949362ec987cc13627bda9a89916571984acebb0329cd06bd92c4b1d453b3607c24c9136f50b404838b1815f9c6b700600d9078a9576b4494d9462016409754bc3bcd682068c169b1419a3ca86a15a000439ee7ecc7f5975f88935d139689654218e44b5957952c3f3a9d983ad06143dc3fad7c38d00a003556104623d89d9816b54a14ff2942f46b97203bb8be485bc967d774dee58c9fd295fec98867ebc45240daff66425e2b4cd671d2f0f6932bfdc9fba5f590fe56144f76f669903fcd79cd2e6b6dd5ffe3031716415a1226dd873429ec5a44f2af7af5a425ce8e729359c48a07a096b6d552747cb06fa1acb66afd69035f89a44a0bc846af2f208ab1a35d79af22f1894770e3516db7dc51587c8e1e216ec3e194e7828fae258330ca182250782d0d1d3061927bf78acfb4276c8b8bc8548f123d8d +SHAKE-256: 153deecfb74084cc75d54714ab2438a33d067e943f9df46cb868697d9dce1fab762427806d2a73aef78dee77e410bebe21d5669223e8c6d6ac209b8d17f81f4578fc1af7e94b7c29848b0d21d53589f9fba93b317a522a278856b6512c742579e59079c705c833d7f61561f1b5bed4bbc6cf0f0c28e1a59d5e93513f860adce944a9d060ea3eb1de4aacdf1e519a507cc9abb116f56af00d57fffd2bb480106e9347ca42c4bacfb5799b6c8219b4f158630834728e003337944831a5d04f6e11101a3461a32af2cc15dde808b100fec839759b569f412e77a095dcbc9825ff45861576e8ab1cd5f9dfb906296ad713259e67150a62b46182f3372e5ed16a4ad0551a344398f8fcae9268a95c6683e0b317aa6ac6648861f74366885ba05d8a546ecc219397148791925c603985d3aa911e221966dcdf2f53ac3379ed2f0d5a614d1143a2dd0ee6f1ff96fbc4cc89dcfacaa070186c21a1e3b570572ba4dd8bbfd38f2756266b95d22dd2fca8f9cf8ec4ab84fd3ebb4c97435934afc2a9237e7d86ee37741ea07adf3a2259a027c6d037d0d1a16d0c4405e9453b366b8b55b69be857329bcf3c4f694654398d4794c26e047f2f2ad1d5088b4067e1f42bacc5a28bc8de2fbc584ca17eea4a5f2464b3821fb69f1d70cbe4280f59bae8ea827cb2224330022a1e1ff153e36fcabdd43ac2acfef3f1b82bfad11f80d13d05e5bbba + +Input: c7a0713f693eb301685dbc245b22fb5eca34681d54909847f950b7fa45d42301f9d61b97d6a40cfea74b3b3f255f208068e87e8a18295f854aeacd264cfa7b3b495204075798b48ec1cb5c29211a77dfd75537efe03fc65267ee819eb0d766e72667d50c38764ab07ec67bdd21a9736a6bbe0cb9d5a8f87d73b0dee330ed8614e4f4955a408d490bf182d5eb6fbb5b041635769c40246a86272b85f5d64429b7067252643c7cb438e0a6bf4c0b5a1369879e2a27aa79ac660b524aed776f404b451faf1d3a32b2507fa34f875021e7ba96ed1c3a1130b91c553a3cd4080c725690e732fe8bb86db55b194197dc6d3276a6f1fec02b177b2414a769d87fbf4ea1fb2c3c597848d2d1e33aa5b4f55f8e33b37b0a28d963cbecffa41d2138db191411e7b6af9408ae59a77386e2581fc1e9b196a1505d82766b5bed1b1793f54af13fce56bb7d091076efd884270b18f9c144 +SHA3-256: d9fbdfd7c7c8eb34c094a5385e92fdaa230e017f7e9dcaf97ae4d08efba3dff1 +SHA3-512: d94d058cc3702832704ee2e258c2e9b19dd60654b53ab174249425aefae37233b358148da09bfb0a7fbd219b1df2f1aea55f66e9fb2f6d4c66c105823fc2029d +SHAKE-128: 74cf31f7b34ef2bebc394b8c0b8ceaa0498787dc455b7f8679a1cbed8fe3b45ef84e349e0becba371a0d18d32b6120a0492b37b4669add7b04e50f8e10b69e765cc6562662248c523ffc330e77d92754e92e204e3e5cfcc6c95c359dd5cad459be0b4b2d3dc6de446df55be27077276d1727b89f2cf3d6fd9fb1edd2328f15ef7d7e17c654f51d8b0f01731120fd66a669ae8216b32e861f5995e0ccf54d174b1ab71ca0dab30f217413e15c500541d409e9ec3c375c15c91b3ead06a16a64d8ce70ae7e0a8de82e51118243e5b02a9b5953bfd4f85f57eb4edf00eff6ed2a90a5265a0f5980e924711f77c61b80378c89ee1a944296a1efcf8029e8d35fb82c56ecb6646cd6709c57fc88288a3c1843167cfe61ec1a26b4c565240a3fdfa36ed8cc1c64c77c4e4640b938865c06973cff99b981baffafc112b4a3adebce1cf4d17a8bca9669756ff3f4e3a353cc383428894fe707c38c39823886e0db165f696ac78a3aef49fe655b08b51928c1bfec35da79ee7f8cbac35cd819335ed41b0000ea9388641900d8f973858292688af25402db491f32d0e97c20b4392523e6ee6ebf3ec65f80bf447c3a4dcf3735507fa5fdb2b741dd864ec4d25ac1a954e38b19141fd49445e5f9c1604a671a83c98aff842c69711eb4c7429dce2210005a844d2d364995a84e7ba4e6339e545cf073ec4713f5d9d1b59ee52c3bace58071f0 +SHAKE-256: 5452d3653a1e86c95efe73edbd75518aaa3887a68dbe2e3cbf13fbf44ea51ec58a9a273d3d53d4aec5096b599a56c0fb00faae80a3a08e16aaa98e72251f638360bc0793404d54be7375db7ea46494b8b073a204a2187d9cdef127992e936c6c60ef12152141c48eedcc421ff0daf26a85248c0c99e7f39d01c36df837ee40e086a9facdd3a04bfdddd45e681948e028efe31886cb86c7a155127cafbccc44b51f9522f6b5663c77d9e9489877aa840a2f649e535d07d103c0767b10618ac5efec3a2502640c5482915748c3aadc71c72974f41681de30722ba12cc20f11ca4217928b5f887f36cf073fe4076d65adda37abbbbbbc90b401a4e8c37163579b88831e77c8e43a301f95918ab70d1b2a7b80737c1eb9651321aaa9344e9184f125bc2792773fe397cc48dbf795b89c82e9ebd60a80b4367d63c16709622bb90484c84f9155b707e38906aed6522d4991e834ad89c446cdd0094a736419f3917ac91b0bd606042e8462fac53277f19a5eb425274466cb4e7e6cc3c540333267e16145d93d59046de08ded93b3662bb49446ab35c8d4cf236251ce4335be9bf7f57a3ed4bdb736289b5e30f4cc4e33dafb7ac113534fe8b68df69c5a5b092572481cf1ae758972494f1f2702f475c375cd91c7ee589e1cf4a32199e7653cd2191b3ba4a69ef5d82d265faf03ed8d0b26b794365cc4d6c5c14c99aa5b4630806a89a0 + +Input: 7794f72543ac73011f9e65ba1a4330643ceaa90bcb5cdbbd9d3770d05250fa82c982ad38c33bae338c7e34d813934fad5dc5fc626eebc149ac95ca5ae7e2320cbd41227e2ce010096d1c00764955e029ccc2665997b1b5b3a39ef90400766c2b4b3b42c9952fcff6471445328f1404dc05c021896f5dc59b71eefdc593e62f9066f3b2247e88cafec228d49c111fffbc8162f9f3528a7ac4101a7eaa117f247f8a564b91c85126619795c781ce0496a17ffd04b8db0cb579c7e60cc590619ddfe6c113a129df815697498c9c6f753549a795858cee7f46b1064eff5a53a15dcdbc3cdfc457968070988382b56c4570f6f761f56d2576c270eb2eeab5f9727fd60ebf48850a1206da02c0624c519e472b6cb139431167fe6d6fddfb517ce84de1e5991bc697a2bd2da3beb037884d3f48ce130eeef37f8b857fb32003683ee25d51a8cc88a14b2a270eee8611e0ebe687aea1 +SHA3-256: 54b41aab4506ebf41442c4413ecae5719f2b9e6c1eeb6d31104ce96935c84cd4 +SHA3-512: 565008baa6f93bfa782a23c0b29572429a569e4fa4c9c909d400253b6e6de47d35f0065330a25722127933a2183b42389081c576e823088d9dcaec91e0ca0781 +SHAKE-128: 1243c718671c6908324b8d30894b8f2730f9f060f17472ffdea4ad2da52f8fdcff08670cf45180caa8719b474d2c5d4b201df9768537684a5a6b5d1eab5eb710ea7c169d8c82ab7f54219e5ad1c5350abc98d2a21c6af0514ac28bea776f97c4015d2fc8440be3a7d4f9a8cdbeb74926ae7b3464e0d72292f88e15c6006ffb42bbc3b858a7e7e8f20cce405d75ae42a94a2cf12bd3af4dbbc87d0be235e87cf5c6a6f0216b82bd75e66ec46b1a6c8bf07431485523d8f95e590845f4f8a7ecc977c4f25733189d0e03a7ef77c1255e2bf82753773742501ee2256c14992aba8fba7b417db7f12faf719ac23271f0c3c719fdceae827de3867b87d61a36d5cc1617bb4fb77714fc4a74e7a271256d33bcb0c32a8514a163ad093a996497f5333daf23980db72eacfda73a763ddfb5b1efb621c0553382e54220c61a3e6d8eed9cfa850d8791e3883101ccfeccf24ad26fbfc98b608b79685a8d2ddb81d6fbe823458d79798e69f2336ce9b8e2f03ef7f5b98e31a26c1d03aa35e264d199de5c2701040fe01ffb3b766956afec1e8114432c463656f8c35ba6da9c5c4fce14be134ecf5522482045016341cc57e4ee85a03fc48a9ce78c29c28435455b2a7eb55d9810fea1dd783898c786a1bd38b2cd7602e712ce221558a749bc707c28a912eb8f16d672c07a125dc46999a046d1db6a83202919cb9bc4176437498514c2170a +SHAKE-256: fcbe62a68cf8b5dd36068152fbc6625d14f825fb3f2a4aa863ebb216d1cb384f6e560907edbd30586d90de49f97a6aab13424b0d78c34c307932aac6c8b0e2870c1bb2055e583d7e1cf8c5fa8704bf81aef81ccf0b236322cf6e9fd81afc55747199446aa2ede7cb9572a516a92b81e149868dec06c2803e93dd9b68d8c4f64d969fa77ac2985b6ee0411c2caf19753e10ff44293dbdb7ab03a6681927759c553c477fc0e0dacbff82dd1a2c8efff1d90e5297d95717d590595070ddb61855e9531a4797d600a735fbb4401e7400cf5b16c179a57190e295d59ad541d22ac993624f6c477cb4de764c7a921b71e35c0350227d5425613d9bda3ee35045cc3b7ad7d0131ee96e277668566a60b55709f063dace907db8bdb75560c61e7186ec9e5e6f0fb672a904510bc178f84251cf372ea26f25d5d4b979c22eccba9e6d45feb38f7762706abfd15b6fb45f05cb72e0f2556dd10598d65e75be6089c1fa1ab2f17c379e49de8429c34186284e3abeb0482b5681e441423416e84db3f7e2fc881fa491733906bdcf891aad460db85eefe3b3782a803c6269675951661060673ca2dea5d1ea9eab42d10822410f6e7ad0246ca195c167bba159bea2f1703484acd05b88e41534a572dec23e112be55ee5f6fa657bc391b4947415bd3cc2fdeec39d9db2722699b531494ee3d6f61af6b3a8ac5bfbe4281eca6e97d3948f35eb3a + +Input: fb7b0094f50c281b81a2651e6c66c915dc467e179ad5670981cbf1db39dbb1beb62450106db2c0f472369fc8ddbc0322625ab4771d7f702b0c8b641c7538692c631f1037aabe1f74c25ecdde0702c9723130c624fc2d11ec5bd04680f950a9747c2709e685814a9b8fa28c256f1a2df6120c0fb08c08716bd53454390b9e3e90c28bfa0fd4fa69bf5e61a9249ea265d365905b797c104bc3e829d5fcd3197d62a389ba0cbadab422f5d2c32e9b61ba9147143925f668dad1477e1bcb7ac7d48f1cee162e53965b5623ffaa97b180deb0a274be11cdf59e7bc25377ece1811322d2943626ae4cb9a7ef303e59fa98593a30d1759e84c2f7ba0cc374dd46208b42e9f1264923ad2199a85a2766a9a0c14a5929d337b5f59e1bd4a87f477922db0eade993889f1b8ca64f570b29438db7f4cd385de432c038bb8622111e6da91ae2a24cb84044c54c68d19ce2cb083df06561274a +SHA3-256: cde2fff0d26c119b17be046fb7b34a89effd445d6c6dcd072e040609805e3a0a +SHA3-512: 534be649085cf9fa56c0a6407aa8cbc75163695ec693c871560bdf365c2ca37f82ea543d5f504f7b696a8f4330b739d14bba2321b18bc3b4835305301bc2c559 +SHAKE-128: 61c0fdcb6c331b110e8ab65fb664a7f3080a031251b1bfbc2648603c1368f6ca36a999a3b328a260b4295cbdf995747fe7a696474d8a241fd76b535e538ea1d1f98e92d7175a8b6983a6aaa3ea9304eecc60b111871c8a4dc1ad0df6f4c7ec8b2501b7b206265bb367466a161b2524dc39d5097df8ac84d74566e3059dc64c945baef1f358fb4e391674cc6008e966536d4add5a5e34a967101720471a1b87b18386aed4c633e46e6d3e6c123e9a8e3d860d6063cf0856073fedd29d502f983c502bc3fce558d0c62b15960ddf43aaad8cb7a6c8abc28cefa32e56f2550513fb6139176fb7446281a01c4f14eb3a80be9002410af6447f8e88c1c3f58f9e9682baa441977bcd3b78e070046fd5fd161f52eb3294d379fddce657ec4cf61d4aa6d55b956a84624a027d1e18b3d5259a1a8710f0ae65255f909640605e0bf91ab2f747f1db1a38bca9979a525f54ddbc0f8dbcf6660c654401476a5a5bbf63f3e800eabfea871b56f57df6324431c96bf970da44ce24c29cbfecea256c430937e6d8786e3cbdb2bc7e4660640a71577c0bfea1de1528ab0fd757c4dedc2dad94dbd056f1b3f09a40fd9d041b9e7a94776908c12527c9cde1a4db520bb49cfa8f17cb8535582303083e2ed85064ffb9f90d878c64824c6c145bbafac8886147d50b9125adb7592dbf646d8e74e38c38e5ac6807dbeb93690af629777d22007eaae7 +SHAKE-256: 94e9f65be1266f0a6c4b98dfbf9f9a960a792bf570e500a7184c6bc78385b1cbae8eec915eb9bfc319109b8f378f01e06ad1ed7999580f813957a157fec005e95099c5bd8a0ee0bda386188cfb0fa4f12473b45a5721ef285f608a47d667e08888d245638cf2f8f88d668f50b9d41da8f085802d1d31881b725205f73ce31029593d96d875bd00e5d981bf559e44fda90b16d49c7f5ce18baf605666667e813bbf0fdd0d26ea1a6d6f490ae213392c443290122c36471045399650266ecc90b57e8704259834e92ebedef651393bb9087b3439445eda22649bf9f74307649935822c3bc246090b539a50f1f4f46bdb5c480bec961dd6781f2d7ef8ec71299d89d87fa61798f491ff6699014ef3166f592932c3eaaf979774da00170c2a90d7bd2ac132678a46ebbe6d96f7329d51109bee6aa76121d5f3a1348d1cc81aa972c19ae914c7c0de62f3673a22ef6080afca08691f5e5e3c84e6e6bf1aed01dea503e857bf8cfa006e672d7f866c7af7b7d2d9ed51f1db40b90b62a25ecbc27b1174fe5eff37fd8544b8ec3d63bcbb862ec1bd7a77116ef5ee433a1448e6649b8b580b06d5a1675608fb5b89e4495e7175881a5aed0e3c4869db2e04076258b3a7aed5a529dba5420054213b355afc7cf0a3f39b0aa3bd2329d81961fe6921ca02dd68494d57ca5a51ab849230486368594f64a253c1bd2f0e0911031c15d4fcc3ee + +Input: af4291ff05cd1dbe1b80cf378325d5c62a53872ade8480a991c641b3076d291fd46f34349045f606d40769cd10e113d4c7583a8c12000110ba91945ee6805df957ef782565f313a299eff9c7a780666c9c42551af910f68c24beee6e74a8bfed6706584a73a482b54ebab1dba45c742e1af40dc296b7eba66278f853f081452284e29183dd1bc4efaf07d1dd9676344c72cbfa4be91dd22fa88f6befb96756b750718f22f74e9ba996b3dba0f7889be697e34d098183cdc7aec1fcc3d6f6600089bf290d6ddfbb59d3b4443a85a6970df51a6e2a4374f90a54d7f99e6df4663cc7de789149d5aae272203e0819a28b43099035638a080ae2938c7fa8700680bcc72c8360b7288b131fa04e87f5feb07ebb254a17f0fce26cc3d191cf1457e7e50d09b4143f652b1e69aab0f1257e5d9155b2959bda4692f2ff8ee8c9ce0eaa6d4044afac2ee01137fcd4903adb21597d2fd17012 +SHA3-256: 577065e0783e4bb3328af3ff6241da6d88ad94b43906081d518c67ff4fa5b70b +SHA3-512: 7bf542c6d00529907e5d789ad098d166a0d15fb5c46d7913314e30c2ffa968f9edb2c7d140caaa4ccf22f5e5915e6021831740b4aa45b39ed6abe8e38518e73e +SHAKE-128: dd9964cc58d88c6cf3889833af45d068f4f940a7e75ea7c3b976e642a21010ec73b6d8b0cb9950988265ba0556e13090bc578add588b79e4651183dbaa92695b3d3023c6590ad019afb07a72d33b0358f88b3eb460b9927e935a2a211b6a0ab2cb700c3a66be415d03b7babbb3642cf9ad4e0421092fd7d8e435f30f781dba9af30e76735d116de9fc96d7db1c03e8bc8dbb1de50986a396c62b4914287adf0000b652a0bb9e7aa82add02e9b9bd57c202791b44b1348d05bcf99c89a04b1c31a6ca1a24e59721596551362076407ae8cfb37fc860ad7374792d892e41fe590fdfef40e693b2cb9235973ebe2c71d57672e177eef20a7e60852f77cf00e37c7af070e2a00aa9188e833205cfae4507980066aecef01c53a0e80c070f5d1e84802db4565c03f8afd3b1d2d91803ae995019b16aac2d7fb108a9ecba8626be6bfa4e9fe77586e12558a22c8398075035a6f758d449b44d44f6a7f85c9a881fe93078726f5cd3098268e506838f0112cca4ae455ba209704510a8f02cec7f970470c220425720f19d225b5182665e40330a2351647ef9728f0af679bbce0cf81825676b4dabbf8ae95756af1909feb0e813478f56f5f40c8314629ad29f86fe9dad63cc9b0dfc8bfde915b2f91768fe3dae7a46bd6495433ed4394a85507d70b0bdd0cccc569e130134ea598c1c32247b2eea2fc799e24b228729a1c1354e0ff2d7 +SHAKE-256: be08144a3fabd93c6262924da03b1866a5751560af0eb21501fff4423bf9a5e94de42b9eb95eccab1169c88430ea9f60f05fa2b81c277cffcec815462990baf5266e64cc93b02b167941ee5ede5e507de05f3ba58508e47bb7c6260ffa089bc7b5ede76dc389f731585dad489a6f805597365acdfcb03a1b119559ebc1543233172ede172e3ae91d76bb65a72beb8cb75768f4e2f40eae585b677c3c24812f7176e508be999d038615e3d01706b9e6341618e574b4c453f9f2ff64a59425ebbb617aa5361aa4b2b50704051b69934de8f016cc6de064f4567c38dc20ee24b9948aa1a20eb57ce0b01876bba3037c325ce9e8d472a977026660087ee44019f2e9f93c9c139f855f2e72f58f8b4b03a441e6f8c731af826185a837c4690cba2871cc284a1098d296715dc1fc3144cb30d3f4fba2f54e12b38345695d822465da406ece9a0d0e35db02493c55831e7938cacc1864f78102f0794548156d70cca48bf7eb831cfdc4cdd4f43ac1c5f13d8516c5de5c2f3677686e5b598f448721cb7e301096c0014e5e57bc2db3d4676f9ce366e2c57ceb3beac22b59606610caf134f84a8e5f4c83d3e591bbde4e7ff03c045b883b035a7b003eb8b586cb06ca070dc67b0d3266235a4eacb76211f383551564d143fc142010ba8364f354fbfac8b24edc7355a6410059cfb2eb16c3022406a8a9c2b95d7e6e1df42abe50900e3ba4 + +Input: b927f3edddc9724152a3419828b43eea97fe0f7a523db33e217c5cc898c1b48979ac36a97d9d0f3feaeaf776252377a0f9e1e3460581442a23b737dc36acf704ae098d02a32e021e0379abe4056cf3630d97c95e457f00b334f4e1f90dbb3cf6aaca8cbf865cdafc4a8de021017477fac4f09813e553a8d853b4c86dfdbacc2c955051148248e06ce9b48c8259c4d747b094cccc28142d7668c69e88844a0f45ac6cda78d5a3ed8432ccff2e2c944067318e7d21af0ab4115a62a5cc89183f1088ea4d15024ea93629e3bcad347be8e1691aaa76c52f9c0582eb71ef8d6eee2bf03987c5725e58b4ec0ec91823019815c61309de1b30c64f8cdc0092224c395fc827657be3f48647acb2c4423e58b9f9c985f62decce7f19f7bb67e737ac88ad513dba8f876df1b6a6f9ab6b34fb8b5438bee59cc9342473ae35063978d008a8a90d3b04d35ebf5db7da5e990b88156db3d5b10e37 +SHA3-256: 87f9b8463964bfc3a30ad91ec1c8858dd356a1cb9d8c14e2b71da6f9eb599d40 +SHA3-512: c37aa982b40c25a6f0082ebcbb88bb7a3ed098c3697d4efb7623260417e4a84025f9905189b36b69081646fa89c6b9168e89e1f2a25d123f77b4ac163f5dcc0c +SHAKE-128: 391deae3b6da5ffd593319a700e2e517fe6b6a690c5f1739f18b9f39244118cddf02bdb8cf27c6125015facfe5118fd32bdefdbfd7b572e0e59a842a05a75da0b84265fce402a7f34c0e8e951793e9fa7d9616252f45897c4c264ba8acd7ffa54fb0802926f331899c18e9dbde6122fb441636fb63ad25d275f8aa2a4b84e62e2ccc60f3c3a11db2e1aa2d63a249907701795e49d82b3983dac7ddc5cddc567e421091a6715b1a8d763b964a7f2c1566392fdf44d00f59a5902d13b62605e75a1c9ba8559c1bed7500870ef4dd0b35678fcb932e2063052dc6c6c4b512e9c0815ff7e184add20103776d8cb67e1a208022e357e7caa5a88fc1f041294c160a9d4bb418872f6f9dec402071d4b19051a30459ce1f8ef768cf5190682d12b83af766a69812872ffd326afd7152a0f794b55b173d12111bb609c0a40b30447050dec34cc6adb6c1513268f7c466bf8610c5c4737a2b54c92404a6cc36475fa3b0da139e67b840b5ce46eac7c21dcac6f6926af5cbae75a6c3babdfb7e0b4109d893a01a99cbd518bfaf14eb90122cdfa51d573e33c39720e9c5e5fa6c7853750bcec32f2ab87c6303f417a320b41d1bb1db1b663778de06cf7c72e00e42b2229df4ec14b79167e69c78027f0f861904aef240f5e47ea4742249b4784818075ad464df562d12df5003b8a53a2aabcca2936db08e17c5351590aca4af1f961abb1317 +SHAKE-256: 220ff2fd6589543431cc7f5120e94e9d1f59368b6eba1893b6f737d63fcf264739628a403cea4fad44466f75bbc3b60b218d3a65f2cc821281ba090adeb2699275bb699521ba298f53a16193be9d55e7f12105d17e403bdada98086c37ba2be92c33032745403104c3b52c7da70b6700b5274f42ac392404a6d1c3729f64c88a608f129480dcf7f784d1b83f0b832b975b34109fa1edda8b70f4acf38b6cd307e2bb6de8d16351400a98038c4b36f6487454a5b0c6c2d7796f432021c345f41c77407d515e103cc777f6be9769fa33b9901e0b4e951e64008317ec7207aef10c240f36fb6b466a953f8d208f470fed19206dd02af12c4fe996b25f47b69689f3397b25e8fb5adf220cabcb4f0de96446995fb7834cc6ea390f3ee8996d7cd156171adce25bcc8de56dcaea7bc551ac40b1277ae94a27717b1f0c42048c26f902f604f2d9e1b6efae38c135474cd89789f1e46e595ff3af2c2c075b52a6e09f19b0db9afce4431f99046f69137ad1e21642fb425596ca5e17c5a4dc0d43db7878873868ee9ad0ee9eff229302965c215c539cb2045f9fe2e16a5912e20ecd9a9e51e97cf9caf238104b037398009726331467f1290c746f7b5361ed6a439fb8572dc3ad893dfed025e977c482f2888e59b312754cdc74213b0aae29608f06bfd6ea397c254cefb4dff4b21942ca5d7bacf867e4bf0cbf3eebd3bc0842e4904cf9 + +Input: a0d634a847faa5539ba5d8a6fbaa9bb08764a7ed9867f25593032b1318757a5a69e53e412c3d3b600728df9de025a0d07317c40fde0df05c7ae67a98e3623540aa49c07a7afe070be3d3e5ecf59a4ff04a06696ea79c231eb7d9f89a66b2d180c5cb7afec32a7c4911d8e9992ab89f443548acc2b6fbcd96fce368be49cdac2eb66d2ceaf5e44895d494e30a452d83efbdb33dc983c109972a612b861f03678a1b3a4b33e2dbd6eae1c60641daac3b68589330efa1f0476bb886c04f7766c2ed2f49a9d6951f0feb6b2c6c09f91f8950dc622d821b235d6460cda6ad1b8ae87da7e2ec32f1d750ccb5013a424514271eb92d0bc91ec86533abb422a0701ca829fc04cf6a35dd961f40bc3f1ff24de6912acaf9cf8fcc533f6c8a1919be011f50f5610f7410a794628b2cd96001e124aa0ccb405996ac5c7224e7b11c9da82807d534f7cac2743e467490ba697b3a975d25f1b869e099 +SHA3-256: 410227df0e70469fa7cd6c1c154e49eed3237fe0fbee7337c02ad9f1d92d3932 +SHA3-512: 8a450f2b8647e89f59717b45748c5858ddd1f33575940d561ae812feeb3e7577b973e2f330731f22b631d410602070fcff7ea5cd94c10df2d3986b878ac2fdbf +SHAKE-128: 04e575cc692a2177232b99ddc65824cbd21b5edab084cc054292800a02bc94ed420c0231aa9e9ef911e3df2a37ce201e120bec879785da304975bcdcd6f44675cee82f58b97eb2198d5b299df7f7e6e1cfc95034a844080a6980c0bb0f3bebf355af30b7366c7e52b3ba93b335cf6162493e7e071866a95fbc7fd4229d2b03f22d47c75c23d94b18cd939f2f96a542bca08deeaed2b7fe25d7f3bdf62914ba2f920701ceadc111f9b310a551256f927048393ce57e60fcd880850f8ef2f93e4c6e348f335967de41c31ba4183acb4dcc18f606ad22d6889375fe614e8f8a7c35896f2997812440f6075ab0c8ea28c6420f5bb55770ba56f29fb4841129ffe5e589bde701d5e93c5c7a79c8a2762d1436191c7c59518ec67bcb52190dd4ea5fb5d42d0260e67cfa9e35066447f5a91c8c9106d5a1e78323c34714263fc051ae2488a316b4bd2e2871c30f7e5ec7261d6ee244473f296bd12e62008e6aaf0b97fac882a3ecd44a31c126d10310b4d7218132b823fd6c439f1a84958f2f5a51f7f233b45dced977de853a00f31418db6996cbf29acd2c16744975092dd3302ba26b4660ae46ae1cf65b59f765ab3bd5322ca678493df56a5d8552838e164af681004d1fb4615ca57d0c7326d48e0c025b830c0a8c536657f517fb28cacea09c020f3e34d7b5634f8710e59bb917fccf75d6e2de1f892f1a2c7f92936193dda48474 +SHAKE-256: 0415c21f8079a4a81bd64a78d1306dc682bed6af53fa431fc44db1097024a503dc2f2f842595ee6fda2ab47d26aedad809bb7a8787cb5c7e999ccbc6ff1b0087707eb01a567b357384971e62a350cf6facf6fee335e3b999c36ecb4f9130d9534000b6dc6da3addb8f4e93fa4f09429b52689ed83aed9d46df0c2202c39a6520784132c02e6e5333541e1a16e0462a8ec257e0428fcc9fb4347a24ac7c10b6db1ad1e08c32e5519a170cbb78c25dcd0e21b3423c1268ce39055a79ddd7ed9fb63066fa160034461554b349276ae667851a8cd9e322be5da4eddbc1a312679076c46c19ad2c9399026479ac11a589da2b33ecf073121c1e2aec87baa6824e443183da038e3039beb3beccc33f3cdef375990f7896693b8e7508ce68c2ba8d0de867151fdf9af940f5a35e10dbaf41a8b7f66157206d474938b66bb80939872497aa52686f48bb189754039f68881f965834050f971b24d7e11b6a050eaea4bd7dadb8aca75d0e88ed6545cb645674e7f0dbb542a65086cf09cc76e44b36fe3736b07cf796159965e2825a99bd7fd709cc232696c4a9c8b4a74650537429ef13d7712d6bb3209f822d7a7849508e339f3f4fa57855f970fa01b0c58a3f50ceeb7473dd829d5badee3e9b0c6f8ff3c7a2605bd663d43cf80a236caf245eaa43676342de7561e22fb9b40cc9de41ed6aafbc3b6fdc807ea481ab7a14b9440cfb991a + +Input: f121fe4fe376ce93491f66c13ef89f95a247363033e055bc49c371a3e5ebc3108177457b06c095cc6b09768133e9659bf11e21bae40a1716620fbbb612e912efc24d2cfcdacdb4bd5d199ca040967ead8d5e816b5f71d9428b613a2fa870e6356a6fb201cfae0b3e1116e88317a35da80739c6f9f1f07b9ebacbe5c6cfa8f1f94fcb696bd8c8cd45989b66b4e61cab86a5f2fb106deae2b526ba0f2fbad01b456ff543f48c4639875eaaa287b5f0d6f963a1e312f66f3188f8f43bb983af0467422421c96d6806f1b188af1336813d44b595d91dadc013f891dca69b390374ed76be354fa46179786e95aedb549feb89aff468f0603e8d3ca50972e1f5d5065d1ef79d511d82df0c740adb9ce419713e561b6c4a7b3fa94b72234fd194c2db42a7a10e68cbd2de23fa9c1bf94aa5e477f1a2489b67cb2dcb4cbfab465e8a3e0a1d0b3ea742377308e347a840a036bca7861b7cd5b37732 +SHA3-256: 6818a2f2f72fc5737806eadee03f9ee133dfa6d0ce8bc8d4c9def4d73422eaae +SHA3-512: ec7b479dabc10c94e0c0722b5004163f0efd15359aa1f2d56bff4b7e5e8a2f1808f974e4de24029439a3c8b99e99ea1dd92dc2d1d8c32a7f6fc416edf2fe5cd7 +SHAKE-128: 8ef9e9b8dad444121b088b27cbaf83999bb232f406049a39c4a4fd3481d7458c370e211cdafeb74a688fc613f62291c598626cb7f477040d2f375fac6eced66c2e7bae633f0ffc3a18ceb32416790873a8a34bbe4761bc40d44e69125361de9e5b396d35f6809b52bb643f8a010d8b8591fd3a0405d052f8a0484165ef5c81837ca44941e4f3f0d820b1b44ed8a628630ddf7c15ca49347ec8309d49cd9f9dd4ec63bf97aed04111fa50286ed897587338613d5ab88c6a8f4f474a5453eb092ae279685fbf4f52fb68abd005bf0586e1a2edec09ea7e70cd4006b02c6256a00d47b7f644dc8a591d8731d77fa116b0045cccc247496b687309334b35db7a905f2ecc67001081d76708ab8ebfcdecbf1a8c77a64e4bf9ffcf6d19f4ea9200ff19193f8aecdb73c2a11fe6da875a3e14d2e3b44566cbeaad3d1f2eef16eb0b168103b30306f0fbaeb942eb67182723a333bfd05dfc2a2994ed42c9a39eaffa210f7d2bb46425881687b08733310b4dad5a3244f4cf29a13497ee6a8913f901756bddd1f4f0193df644a99052c7d14f32a94558f10d4979493cdea21021ec930118119ea3e122b34e7ecdab755c34a690f7f77b3bc6f2f03552a8fb66bd794d617ce00e0f0675394718d60e80e9fca97d2b22b66fce6a7ee94dc25478477a2bd914d5d3789d8c99d98ef6480d82939465f2ab0b5d69d13e9e58361d3a078d4d23ee +SHAKE-256: 0f290efd94d212b9e9368840055cf65f235554ae86c848d926f6e133a84d672f180d4ccb2652d34484a018ab9b6861d13e663c45ca139daca7869599765b0ca5c6960bab022f81ab316dc98b00a1636c240ea4a40bc9924a187e7bdd99624b72fbc1b2c194fa8a54f83116b41732c1c75ec51947cbddc5bd0d6c787d0bb29879794cbd0f1d59b19075adf47e2c877c3c3786d86b66d2509f71f1585597b37c8949434642694313f3bc7c0f90732662e62bd73663848c274403f55862acb3eef31a5e13d8b73aee88686a2d4c8bf4c40b5e8c08cf7d04ff157b133e63a7097ae6c38fd470d698eb326b8290d6cad0e6d7e26d28d75a59e4336892c5a3661f08fb3549949854a0e48b0582695d16fec512a74257b5f49b1e8f57c414685d495528b50674605d65cb22515d545964c810318cf2aaf591f6edbd5937927f1acc7e7b1522eee7178963ce0b49fab472b039f5668d7c3e5327bf5395991c777a77485176ce414aa307aab79817f26bec5f71bb874e54842597f347d0801bd90463bd27b45bb3763678b06a6016e6b0b1b37990f68e71d6a3173ff5f7927b4d2822d82a372e1544c019683cdbf13a78a71cf87e9c388ee22a5ddbca42187951ae886786b76a2139c8ccc39ecbf7a7c185926828dd5edfa72739dd0d796e2f04bf1c0e98a4908501ea612393ee9bb88fcdbbddc2661bdbce17c84ac5a398b79fa100e350 + +Input: cc1b0b75acf83c3c8f8085f81bcb986ad336d5295b599490180e0bb8deacd47c990a65e698830348aa42727e5dbf7f7162bb4d31b4fa3331b111ed278d3c59d3f669d646ca7e419393e856b1bd13bf8cd7695d45ef410b69bd53d3f1179510d1b3fa207f31b2f35e1354ccf2072669e030cc8d57a2937c3dffc29fa4452fd99cb149573d7a821a67d748b8428cdad11c9599f493860abbb50bf86594c1b51b5d8ad9864a154220fbfdf063eaae765a98851d38c22e645dedd58d9c2753e47812110a375a07786f4a3c1d81f36bb2e9d176aaef75cb6c2179474ce64f06090047dc41ff58feab7af81b06ad73afcec22dea22d3ec706ac3cf4a47d089db6130f0b05893e5347759f082d8e026652f2cd5813446bbf502b8a6ec0f4db255006ab9cd7a659dfa33f370805667bc2cfa690a0b868e3751731c9c45963f510b6f53121d2df953e21d8d9dc65d5a7b090815117f902cf0e593e152 +SHA3-256: e12f07905f5b8504c566dabe6ba77b117a437a2753fc77bca439adf622d923e1 +SHA3-512: 94588ce33c8a3c769c1895a2edd627e1b07d4dcda1c7a6ff677a994c265c690f5acc6fff57ec75cb5f688fa0ea99bc6057c3ff9a2b91185558fbba9b731cb9ed +SHAKE-128: 95481d3c6846424774cd3788cbd2ff4cf0168d32e496044a1ece2438c3440c4c190794a9428403f672ad66184c806a6e6d9489844121c13785f72aa7c4e1b6a9d0bfe281d9f4fba252fd9fd106988b89ddd913934bf44fd38576b97daedfe6427f3a8e1d568b488a85a60c248e10e4b135175db98f1bb297d11fed7aa7c532c443f6abd1cc42455a51466b6cd2a3a70b0a66e0050254f3639eb2c18562052fc8d2b3b1c0ad06c5428b8743343768e31451790e8facefcd6cef67e38aa9cb58c787e1709f6a48b7bc9e8f891b2ce20448442dff774b61d41541c7e99176a0b585f7d4b0e719e148eddf3fab19640f0fb4f86e04649364304ee1e232301864679c0121a6f1e9909c42a568b6a142b2b53c4b43b6e72189ddbdfdbc475b005e992287118058b949aa76a55d6e28b6cff834bfb65c913b98cec5667480edae4c087f0e21ff6ced1e3f5fee96c9e1418010471f3d66f28e5001f6ac33855e75466501cebcd602955b8b35a583e4a671f81d19ec9691f6fdfd1ffb9c86d7d153b0a1b7700df4fa5edcf2b3fa56a8e472606b62dca396c6d9e50fe3fcbce2543488cbd52ee61d8047b7072df428e6f0e27e472ba4bcd9f857fc21ab694ec1cd4ea1dd61f9bb3cf4b118a8c5aec6eb19aa0e3157803cd9a04d0b59eeae97dfa09997432baad9b5fd91d7c4f128fc0825e7c8a289e01b190ca63350cc12ddc2e89c61db15 +SHAKE-256: 33830802b3bc62b49ecd126d89a6098b4aa7dbd87acb98ccece093d279f5a148b23ebcfe1f7842bfc1708a0572f014872a1c1d63601dd9043057f3145c7f62b9cfa3c7a2c12d23f93dab722d1d9a3881e6cd588b6e5303e375bf5561d2048111f4d27eaf38ae572bbac4aa707ce66335c5085b553346beac077f79c97310c6e70f8e019e8a35ae9b55c2060f2e1b0b3a51691833f9e396526f8d3861e21ec4aec7340350eadd0d754b577c790e03452ff1e86908cba523273c5ec7b0f9337c8d0a5f1075aa24249fd6a253681fdc472fdd14d78e5dc33b95881507cdf3ff2b2d2bb0ef8828457d22d3b3656390b7db27814068820f5b51100ed11acf643a943242a19eea8d57cca19cb67f1fe5463660c1178852e676d2283528906798b5cedf23c063cc135d67362f46d05c7ea46787eb5a280ddfed3a23f2c51a3787a504ee9bd70e11e9bd0d7db3bc9eb0938b8d4798b335d8b1ae1d21c8a6b1a4c676c0a0f017332e7b40ec5118edff781c5f6bd67d2cc2f3f1fd71b51f2aa52bf8881fb96662b82f938cc5f8083697c67fd959c21fdaa2e1b918fe281ad6de128f97db2c3376972453ac96d1d79bbed9262c1bded2c16dbd35bc150603fe3d668cc416730375f71945e95f20b29aa569648e41dc156ee555a5a5e33fffe340733d1eab6758cef9ebcbaa0e55dd8452708d4505127ef04940a77a54f55620c1000c86d00e + +Input: 125cd8bee8999a8cebbd56d484cfef419c45f0be7a2a8cec88be1eecc4fe3e8e8c03f44568f77b685711a5524bf51e36c960ca3410e0dbc480c0e337c5641d7de1a980b4cb7a0bf5583481d1956aa9b1400576f63db36fb680c40b48c5ae20b46e9d53e02d6d04ae6927cab02d288d2adf0eeacbb20d2a04b9755f2a7832915175a4d9d173c7b559c0456e3f8325a73371798b5fcd38e549b3a314a88a72679913da5fdc33584f1c98200c378d2c36b12bdfc7a41a10e18c80288f9b2984b187221a6464416dbcaad066bb42ce2238fece8207e73600497c4d5f09d576e3c1a0143b6f09798063b0ef62be972a7cc830d64fd8296f86b4078bcd192a418c7b26a6ecfd4c10cd52f28f160b38180c9ea664ffc97510cbbda56606b909206a351ebb91622213c6fd8accdb594ff08abb8477bc3d309e1ea938d964a9669ff2a3d3cbeeed786a89784670524dbbc52feb8c5a097bdf57dc558985 +SHA3-256: b9b22675b1335cb5c2ac6d544d4bdf3f7badc3030f1d851625c3e2a61323ee5d +SHA3-512: d672cfd599b708760aa020015ec70bd5fb9d1887b1644d9b6a41234025362388613b3cf712f8df244ab574cb4912e7aeb7086cd8dd9ed29280f1f84cf2fb7739 +SHAKE-128: 9be70a6fda7c801fd98a965b96db2d41d8db3bed27c2fe62585219921bf92b371a0d3d658c609f4f307ccb72fa647213b847fed8a098cceee08dc4781cfa3a8933af123645e2a90eecd7b7fb6c49e8ca712d98c1ea1286edd40ad72a709255ef5dbebad715aa2c34536ea7e5db974ab20d8a57e6e4a3a5d73ce5e950c094506e5c85a9cb3d514ff0df4d6e595fc597a846b00012723cf37a17f6ed3ead84e4df2763a8f3c7c9f2b39c68820fd2ede9c6c525acf9ee0264184a13128dcdc8abcdefc1d4ee488200c5838d1f6d1756e064f456ec6601970fbe524e031db70a79bb218455f3803146be1e6adba12499d57604022aeb1fe40baad7737c33c9e52639d5335d23faa1a441c28f3cd41e53282169707f360c74de40dee0723d9fe589f9c6923d89ac3037a4c4dee49df9e40afcbe5c14df3d4ee23b1bd90b05f3152f98a1a6b86379eb64838ea330fec186c8cbfd8c1567b34aba708dc0634bc51f7b0e747b0b81ef08759bd58e291a0378e2dc86e99a9b083900ff7fea473e2aa324f0b12b86804a062f49d79794493b2821e09ecd9ebc69565422d503a7ad84036929c998f0ff6c8dc5046a44ed2eee8bb486177c08be59551728d9ec9edc67076abbd50ac6a108d97b368f850a718b2012e239aec93a36f1b95c27952cb1909c689b927eb285ed2ad427d79a5f7068e2df00ebaa9a8548d247530ddb99bdb5c4bbe9 +SHAKE-256: 2f6e5988df1acface9078c0c38821d3fd3371455147ad63fa974e0fdc841f6f0a1c7aca5590e81486c8137213801b1ab012954db996926e034db89b15837adb8f8a58cce2fb6ecf94006b66ce7c338776cad9c45a2761511b11659d3176b7086a16c892d86fc0df96f19a17c4ee538486c3b0ef0542963f699026a727d4bd928b6eb9c457e7290a9a7eb03791f15eb788793608949898fec95d3d69023243cc206c33b41108ede8256ed99065faee258dacc1627e8acba7d7c3bf4380fe3df358739e5520ecfa69d0cf05c31be52b150b90c0fa9e483e68da2f802e2626264780e2b964eb84db89816652255382720101b78317e6be050cb835c70dbe08a424e0877f3c0110e9c7aac09a26d6c586f11cde9f7b274074305b4cbcc0e455d11acb5adadbd40bd10d59a3025ef20f6bede88009d32afde65b35c6246b2f8102f7c25555e061a88aa0353a5aa252c81fe0f51cf59a53b332eed34ec1e5f6bead8a898e1c8ae117adf374efc975033c4b5a86a2a84277c8a1712149097419891155933042cf273266e00362c6a1f0050b0cc17d20a75225c2a5023982e1db75c23219b203131414694890cc7bd476433044293381b46a1e2f8dd63f4700f539df9214380685769b44db28579673140bb8f6a54e74dbbb723f05b5fdf02aa85d0cb9ddce76d03817630b7ad7061aed590b984d50ac31efc8eba46f217941010547e67 + +Input: 9e5340932eab438def4b1be4431a35401676c4144028fc0949ba1b18cb40354b6caf36ef31e4301efb00be59c06ce307c5d8575bc6eb6e632c788277b0eab86a4e1d97054c6b21735349d69e3084e2d90ae641c84007f5d9e02510ff43a72cfdcd3e9b57a0771490ae08debd6bcf38995d6ebd0fd1bd40273ce6d37bc3e396c06e44e52bb4f2f4e378122a1b2ed8c41ffbdd8db259d7b7cd582b3dc1fd3437aca8ed1d5fcac096fc22d75c71e7e2bfc0eaaa01ed915f90eaf8cfe873cf552615bae30e00e698690bd765b02ad2f92404a4e03c8aa55fcf6e78e513a7e4c7d03cf3dc3ef15b363af41456587d5eadafbd9c42e821985f391b11216438e31e236429f936a53a74638b39f62c83c59e4291491d3acff11922b06721ce17941797ba40d73cf8cfa2b9b3c2473d41c59f432668bc13ef5ef699da1297994efff8ffcabd696cefc1731a90d8dbe3f92326bdcda25e4db687acc5417935 +SHA3-256: 17eb0e9237549b8af61407ca9a4b7380d8ccb53aa322a93a2bb5f6a53c685580 +SHA3-512: 9b08ba4dbd66f71976094c54e91b4e9b25ba9f8b1ae2c53edfd35bac1d43b24681dcc4e35881a5a8f880edbfb147ef0da27d122b4acb31a5d87ec5e411ccd33f +SHAKE-128: ae2b528b64485616e75adcc02675cbd00af6318b6a40e5a780f1c70c614bd9fbfec01d6237dac8a76c74d826e67373b247bbfa74f3b5c981f9dfaa4bd2d8345d42e6c67f046900fbe767e52ed0264b14c87d11e67aadcd08b102ceb2bafbe614afd5bade7d217262951aa4d7d104524444f6ab5e90f07848ca0d28867f978628a5e302769982ec21fd7d0982ef9300316f41cc734de23273ffc912b5de1a436798839efa69020f7a698889edc60ddc8db27fca1e0e031d1513fafbc9ede7812aff3164fb68e2dab6cdfd9764d10e0841c1c624f2d42997fa44a59b61855caf077e448e87bf181c5d7f98d1b61448fb3c1159217fc3500c748f8fbb13eb5b17a4238d8b1f1f26fcd9f5a5e0d1245be804347345d1ad8757ca14d1aa691da6048848f3a30cfa67790feccb59fdebaa1e861997f77cc12e532ffda9560fc4c7288439d1ffce99c8fa3148adca61da9e4da3d0e3cdecea405561d74ba043a7fae0f2b32ae4ad2273e9706241ca6745575bd8f809043c77e3a2f1912e967ee29c25d2fef76565555891441f3f6290583c97166fbbab8b972d30bc4c51295a6d3aeef8545e0bdd236761587d9a458d5a0438cf5a2bb7a314f671fc40cce494484da8ebd24777f8a4cb816878770b86643cd2f56b24a2ede571b281d157d37f3fa83d1023fa0715d6cf353d3efcf3faff0d8b06c4a3410ea44e68a8ea31ab49cf9931ce +SHAKE-256: 33ab9c33f4562ee349d7513c48df0866c9278af2dbad73c8a66c4c99bfd09ec32ad4db52f0854d83adef7e8e39eb834d702a4bf76beae7dfbc685860ab38f6d315891370d6934731ec6e384bbb83b868a84022526c12b24666b4051ba256b5eb47ce0cc594751a81cbbee82806cc33b9f5510719c1c6a01ff6933b87b8550c91e6d7bdd2bc73f2baab48aa054981e7f85449cdb28bf679748bb106eea35fdf3fef3f08d4729742f34afda8166a1d99843219a3b44d3e7a38b0acfb0e130012505cf32d3d83d7f761ce8d4f019abf507069a1a4c21dde5cd5791a73a025e81b1fb57323c9c72b2f62f4b5a651e43e7658d558a0191680a2f31a13c9a5b64a79e24485b594908ac9574759ab2a5e30532167b8f5c55fe7510a718966af96c3ef3e4809e8af4631323d903c018210836de61f0557aa01072c16c876f72a767d2a0d67ab4e7b7b999582cb4e012966a177ec52b8316501ad3139962143246863c0249d3bc5db8fd9a57546687fd15598ca35539237ca4ca4c8ea806489d74fc5d40f65f7e96b9f8dd5947ee7b1eea13f5041b738d7e7fdc6a8b498f5098296e5405a96e8570fd1f06dfe99764573d3ee07761cd44f643e326a5acfc8643a128994af133598c82f2e0c4b5efb43a978d2e0d0cc67a19f463b206dc17837d432d56f6a0113ed5a34de08519a73c50b55b093d5d1bc20a9113701cee277f4b915d92dd1 + +Input: a0fea55c8c9358f0504ac76bb29fedc52604222ab181f79b710e21471e907de6e9439243b6ebb8aab87b25a3443a884b457b6c4126223f2cbc6f91ed47e25c7f5d35944a8c128b385aad820f8ca5a997a086463fcd8f4504c42409dbdc23ac5dd17c8b3f48004e64e093727b6506f8fae804d983267e7322c20b88bac687db7fb22bcc6221f01ec565666d5ed01be89f45f809f5dca87443bc2ad1bb2f60ad58a88b55ba5033221a6e1974f8ea017b728c6f2957a30c594a8c25bc94d046fb27bff766da92730b5e7e3b7196c51c17ad4d9ee8e64ce14afba226d5bfd3c638d3cb8ad0079b3f3fcf6007b2776af0edbfe43b82352c892a1b202744d4e7224ec6938ccb0af6558cf46e19075d09806ed7a3ef949b00bc00e10539dc78e3dbdb9ec38a87b7bbb10e4d28bb15ee7073c50c93a3cb8052471f2e7eab3159849c794691a55714c408f851795124a5c3dde4e3d524b81c254b7f8b39c9bf +SHA3-256: 833b10d5871ba809385ab2ea77eb9fa944f22c22c5c6c50cba6d841b7a9ce2c0 +SHA3-512: bab2dcff692037fb334dad4d1325e5e504ad1a2ba94e07fb7ba8946856e97926118cfcaaf8c207e1bf843eec656692762aecbfcbfda51556268cf3fe17b7f261 +SHAKE-128: 8f562ac719aeb4a7375b2ff3446684235487669cfab0b4554daa738bba7934d2a84eede036e839fee7c7acdf7cbe0e1bc1828d22049e7c99f8d3e2e39ce9d66e0d875780475faf79e0f85ca5e80473387b98baeb6664aa675359fa77d70f84919a5725990d5d7e84a4b238284dfbf4305897a9921f1edfb9a7971d136ba8d45f44c6ccfdd7625ec3ef472fd8c660fb44f27a0d17b2f9116efd5d3ed7a0b6b8839127e524fa0caff6029accb09818a22b0ab793ee5b87667c36bd68f9b2e82a1b63d4042fbf8336d4c9770e7666285ff85000f7841bb27eb5240e8250efda646f2baf649c1a1bd526ccf8f1758ef0b30517c0a918295924bbf6764eb519f54477cd7a2613b52d4b1bc794802bcd25b77dbf24cb58e0cbee2064f29d37c6f99b151468e38102aa55d0579fcea9f7601fb8e8d1a2beeca49761f48cb201613b9969a795ca3feeb81b7dcd082a2b36f79acc409be6f6e49305e9f63094255441780d2884302e140227a39796891082352d61c12a27a1823e2301b8ef93aa26b87842c1d2e86373947bda0e7bc67befaa157fc3f6e173c076f0bab5c06417a39c0a12b496b20fad4eb0ad254569758b56d9ffa05b286321074389f4becc628e9a60dcdec3164062b1747659bee21e855d34d5fc671010a25808e44033da4ba7876fd087c0b9ad09052afba21d8ce73b8806abd0571ca8bfe9dcd8a8a3d4a49dd16408 +SHAKE-256: d64f944c7c4bc92f1c13134d3bc8a994a605d7e72fe02e4d4fcb70d7c4a6d33f4b18c3142e28fc615248611a46716ca123dc09c7e8ddcddf6cbeb42fe93322ef46ddfd2550be8bc2271345589b0827aa7d554ccc42e813fdf23a72c95132495054b541d44de4499419a15b61ae4be502c45a9f979856a01de316fe9e69e58e259ca67c988647e745a75a0c9063b9432c68b37707ffc178cc5ceb59c830c2df6bf052390618f7b9ccb79b2194bd5cee6bafab75d695742a6a22289719132d3ff98cdec60b295dad8d2cca19c540c191f37b871a74a170fb9d5483384d6fa88d8d5d9de4e73c4d0b3b507fcddeb116fe149082dffbf9555e72b85aca9d9a9f6cdee157569d59778ad3227f1558a0984002373f7222526db5a633ea165367ebb8a70bf92bdc12aeab9534d9b09d37d0512af7861c4981272dc93dbaf519ea5f83b91fb3e166caa4e131ea93cdd41594f8d705ce5dad261a77af1c25d94787846dd2c207ade42a98fef07e168982fa4e52b8ab8679d0cc8056870e89cbe1033e741a8bdbb7abb43f38e86d0601ebf627d08346091baeca085bd9fdcd0ce1a626391d68cb1ef35e286921f5694e0c50e3b6c4ae2966595e9054247339a000459fbcab447d9f461398bc0150d40f6f17eaccc524ea9789fead23783de6c8b9e8d2ddff51b84adfe2b116bf206cf672bfd21a7807f4ba98313f329d29cd5f2f507312c7 + +Input: 33bdc66ba51f023f843db1a400176d2a36171869e248428df9fca11a4c8d282380472de2e7c45342ba75a8b6556e3f1e62272ba962dbcf9eb4b83acc7e00e382636d037dc3ac24121de155dc638f952b1c3ca8c9665d256f5aa3c865c00dd29ff136bb8700843f66a847f2ae0d625285a01d85664d8551363b1511156c852e0de2033894fd33a7efcd5661ff55551a18ebd82f7ddfc4474e456298076781f725065682efd7e3547286ee1f62d5c924ee8c6bbd9f0cebfdce64b50315d1766e438814b9d3ff99136e9873ffc6990da89c9c2912e0b158e9623e6a0448aba1db0b0d569ffecec93da04c477417624ea24fc896137029830fded5fdc319b554206f008a4e477c07b71fc89ad03a086d7e3ee56ac3bd9c7677599c354834ca2d9b3c7c8e9ab1829e5ebcd315bcd0b52535f04aa6d166bcfdadb802bd3ee4c865995ff5882fdf76ec41e3a117d8218f90af86fb1ea9c2fe94c0c6a684c6a5 +SHA3-256: a3121fe7e8a0b90d4f68586755956a3ce1ffe49a2a03f57783e16549a831e0df +SHA3-512: 55a55365afe00794d34888535d340270ed9a6f7231f5ed4193432c49ae1c338966603b3dc74228ff9ce8fde3c42404c57f8313c5aa32547212a6e858bdab0f25 +SHAKE-128: 472d9d57e2040ae9fdc9ca5f62a545e1eb746e43fcd04df66d60cc2eae07f158eed84735024c5233b7291272bce8393e10a39899684d96b8f85e7336ec174790122d7f83f046f4bae3b02cefb520ceea668084f4fa7d50fd86a6efad4a7aab4db3f7a0d4e0c3cc28d4626f4a65be44f1ad9d1b0dab9ffeffecf7243b5a03d04bb9473df57a05d86a276765dc775a09e85c09bba99584c3d8a09ba07db273bde63d4d243fecf068c494cb73b78794af7fb3527fbf2bff5b68a807598e067b01f6ae78867b7f9ab1bb66504caf0fd1ce3c2a305a7b3480e35dd3d4cf0c39350d711f6f35e441a3269cc10edd89602329a57d89612d9c931c7d6a5da18dd83f26cd4aeec3bf75a8df62974aafb76c21c2b61c6cc90fb16219c9bb1894e48c80073abf392056830f2e6d77a9809f598582e94498257b78f48f9c64edfa707b66021279485f181fa3eea3335bf5c96730f56fff52f4674c18c6cffce4b5bc82873c615fa5ac972d1d6dfcfb631fd6a9fcd1584d5ea79d29876ba9ecb593adcc003d0b4c102b81b939f46f5043c4772d4562af3ef37f15f11a019e3846d6ab545cba6693dcb8fcb4486b7553fd5a60123ee6033b863d557ebfaa496bddaba54c09a02b8097dc86a463facda6d6e37d945e3249507b6d2a866b1de9de85cefd7161ce4b6985b26ce544ef1ffadb46bae7d5d99f15b26bd4a375274fa38ef66910ea60f2 +SHAKE-256: e4512c4c293c86f677286b26feb6b553441facd3b943aa8938f10f77eadc5da395b6e224532154c938b14759cf3bf79881255ed58d96c880b9fa9294e2eed57f3e13a87ba31b95189c8a696aba82954f0b00a8f159f4628caaeac10f943c81fb5b02d2bafdae52058b72d86cdc0722910d254a19ef0d107deb6446e47c7a6330d8ae774c2a16047eb9f325c284cbfc4e8ea82186ddc60435d2db23675fa2105845a53086a59d49b57e80cd9159d58cc0e0b2a1ca1263291eed50e631383d68df9aafb19a675790ce2bf00f2295e2bae649910419ed037c17141d45613af6675a24e1f2c3bfcdbb5b153a62c404039e7e879b9decb1aed8e078cd9355ee669e90720174618e3cdc7cd3df51198d9a2b9c13fab76a33296693ff7d82fbce6b1f3608f16ae8461e3c343e59e143b8be635e6e96e1592cb21676fb7028c7f44f86d3585fedd9d8ecc892616ee7f79370da979b5645ca2c4644c3b21ac04a3733d53a08d1623bd9465fff1de423e183b27ce99b33074423d1d8b533bc74a26afc5e6e271b1289e008342626722ac81bd7834dfd5317c481f622ed028c38def8f3933bdd4648e19b8621aebe0473e932d6f84e7017f506d9d6c8d14293d6826d09c55e7d536f9f728c54a71703ef83f2e7c7df49ac56a38bdc534a98c926cc47cefd191d654ded63ec3753222a2205d01e659cc5b0bc3150e7f184a8bcfd732c04b069 + +Input: da359e0a3ec24ee762d7513c5805568593f6b0e0906435c7204e426928c885d71a762d686ebf660034d83aa1b73519517976e8539d5e1ea19caf9689234d0e25c30a4dd1de556604d69da9fefb47c05525f83074f863438d15792f2e2386a762b609ea001473c3c4f8af55991bf9b31d55b88d1b28e97bad74c713ad40adaabd825257b487b0f9f0fef2f0f79ad80212beaca5cafae6d3fcf13c0165dde79006797a507a70526d1a235464bad101d18a1e1092ddb65da8e39b760b992ecedb0643487ea7b253bab2548160bd673db399055da70753be94b438705adf9fbe681a45ed72223125611733c0dfd249f494ca2923ced53949a51775caf4e05d9232292066d6d4c883667a34cf2e81416ae2ac6e672d258d08c5162b3d16b8f5eea92c99bec546a0c35a346d1c0add0e7b10a064d3c6691d7000a422659e25b6a4775b7fdee5cbb74945183ddfd9ddef216dc3d165d8243fbf6c9db7a954c600 +SHA3-256: 1a49c1fba7ad52c2c2c646a2c0ba5205f744fa407f7d50971213d99ea94a1d56 +SHA3-512: 98ea655a0f357d4d053804955a745d1871a7849e3fe504a32bd367eabdbfb000590c99e7a012d929086dc50eba6ca98d2bbd3cd17647e6cf247d3bb846608158 +SHAKE-128: 955c845d27c001b82de66136413f01dd36036d97d14b63371fb374ed4f738e6bdaa38560dafad203c9714c2341605315811698417dc2ee647885e1942a23a0ba1b2c6bdc1e0f36d20e3dd2ec1c2fc22ec0c8281439ccac015cd37079e799762fc83b9278436046194a80bad1824ac5ff9ce5158f8d5e073aa536227e60658d9ba5fdf4bcc7f6ed5e1512db9840b834eebef03cd0cafdf62865545789ee64360bea8f04d1200e2042361faf3ef569ab45f4128a6abe932d39b54fa9a557cfcbbfd18ee0d35903b4b9c245ad3f894e091051a982d4fae4998e7d4eed69de9327db1e604c48b49f4eca04e72d3ecc9304904feec9d813f9172c04843a31b2897b9f2fccfc75e8580bd2ef7f0454bbbd8374c22cc1aa0fdd73054f299d639d104f0a4dffd0fcf5788812bec374b9a4146b802cb14641e804f37d61c1efc2cb585a78c220bb6b06184a0a4e69a254020536d010dd7aa563d835fa6202b1b2a1aabe9ccfb2d48affbc7a36c58df8198c17fb7e4551733668af8bcffd04f5841769167908a37f6ede10e9fddbe6ed86c341d340306f18c1fde7314ca3ebaaa786d54be6ef264575b44e7e208fff9a8bd6c6e08d81b6f93595e447be96f27064ab364f4df3c415ccc45d6b5294fc830bab56ce85f48862eca3b4a1cd58a334d5aa8a6aecdf43b11db5f690c8ea985dff5df7fd0fc298af2288fb19568b51500edd26ebe7 +SHAKE-256: a469a827dca3fdffc1c1170872161d8453e643603b2f750af934b5469da9aca47628a15ad1fbbd52c7a9091d2dae407144e439fd4d48719d40b330d979628eee99b29f688fc2c007ca15174547f81dc41c2b2f0802d6a74723debdd0eba2c6c92504167173e7a5651a822004e7da7b6cab52065ab6109def151a19fce5de8bbeacbaf72441bccfd141c51821a365df31c4bfd36042a2ef3c6d144a110d718eb55df74d8a2f999998d2225964697114ec878ff3d26e7dd54071d3b4ccbe911b4ba7cfa52e2f16d80f9d98bdfe416fc6b0551b94cb5243f8da446bc69467ea8cf3fdef442e003e0941c340e2aa6904426ff1f72cb8e6b939ec06914d9afbb24a9b35d3f4538bd913589bda6248d1e66bb703a807ba3e33382400559e83cda61e32c4de5d40a6dd179350a47a4c7de4e7046dd4309f1b649d92d8e374c49b9bac9184e1265b4a32d3b6120b1aea391b4f0d5618471458834120cc398fecb996e977a7cf71023d5e5157ad6cd75845a3fda1bbf27938df6818ef3a9424c7f740150c9975daca01be972c6591472236cd69de621ac501c31ead5701c9477ce9823290d73e5970976803099559287a4bc53e56dec0f4d6e2e2fbf6a94b64a3104632b0ee541898823aa3f035afbec4ce444be3044febb57dbe89bd6ff3384957ba589249904b1d660b734caecc37bdad86d2aec9dc41ef4dcdfb36bbee9b5ebe34344a + +Input: 2ed8edf286c81aee2b8d34f163c0fba7cc99ec284b9ff789ef214a86aa3f2530593324be5b42046e39568d4bc7ec04430fe07d98ff75e0e4da7d2f0b8157073bb643216d1c1f771c687c9a05ee9ad0c7ed3bb878daeefc979e9e22c41e2ce31b17a8436b328344309a1a1f047f39cf45829d2eef6fb84cfedefe3b7c2c848f3341c7896ecc5c5d30df84ed72ccbde5ea61607b68758ac8c63dd63a72a421642d5305fe97dd68a08aa8ceda5869a376fc37995598231c496061243d87451204c917ae3d731ab58c06f92518c5e0ef7f43bf3ed689c652e7dd1ca4a85aa0ed01a315c561c435dfdd9263a4e438d1b381394ed2c98525a6962263b68ac0296932b58ffcf807e496bd3489596887eb471eca94ea961b1863254e28f2833b9f5af5869787d01ae7e626274f17a00ffaf70bb376e9244dc9ccad3efe51d5e8d33a6c7a3dc6f6187e0ae8c65bd7c634e0828e7a5efb53cb4e235f487f8687e2c5fd +SHA3-256: 614efad7e4b514984a66ca18fc336f9abe95e12ce959c61a85cdd5a79df53fb4 +SHA3-512: 2e88584f07f95dbb50ff26d31d6824db259a4170afb8ccb3919bf795a5c460e2bc97208d20e94659629f9d2b565141e2b485a63505f92cf1f8ef719e976ad876 +SHAKE-128: 2b4b84b7036d23d51961b48554cbcee7695ae56cfb7712877d7e284f53627d81d813d4afbb5f3548a543d96c03615e453358b7c2c68616a7720d082cca5f250124c78ede98ede0041ea655386d0c2c4bff30860c8c8ec8127d3f01df90d5ec53c5e9ce099477a253cc8b1da84dd2b575703422a0cfaa1a97d5e9dad67b7a54afbe8c2ae8b8895bc65a8a2574a336e27140a5caa6185edf42a7fc66dd40f1768e650b6429ed19a78a9361f06f75565ab4ae475d1a539a1c7388b127fa948b0c32eb0ccada4f0c782ebce2f647e692445150cba6b07c33264f7b5a99b7a951f5db0feb01edb0ac2b3f9da8a1f4e3ffdcc87e5c96e259e7fa0c2dbe0c64f970db40a8fbd35402434333826d7d65a23f1ee185a256c1d4ecb221bc1d91ccf997fbef4b18a5af1b4d6a1519d93e225815b37a6ae3100eae5aef8a1af40ab026c772012dafd503c361d495bc0ade18ce03082f7297a162a6983a79cce2cdd04b082833d96ba607b51049c7c709b5da309c1d9fe833dd7be5acb5954453cc584230fce145d209396fbee1227657cd51e9799046001040b5a4a9cc4404fe232f2c87896e0222108e55ca1525c00a54e9777f271cf60044c4a2ba046007fc5b3f87f736ef13670cf6d1ba4de92661c1269b3109769def4e4b74ac44144462ac756cb613b786bbbbbdfcfdcc467070db8da5a66b8a463a24de9da2b38414efabe8d2f5353d +SHAKE-256: 8104bbe785add3a91033acf96261e4759560471eca4e2cf4cda0fa1cdb456062870962b5da1a7ebf0c271d8f1722363ab7c7b93040b8b814de97cad6ae38241a431b0d5d882ba552c9dfb55f0d35734411d5bd31e6f93e5779c3595b7200a9786f7f341ec0910c9f0bae2e0cad2e68869459e728dbd7553a5c100b37faefc9edfb75a3ed3118c259f51fdf66c486cbf8e52a4b7f54081893c63de1bfc94186f38a128c2f53fbbd40a904c7f0646aa59900bb7a7b11c6e010b3fda5a6bde05bc2b16fa4e716642d6cb582d0dd0c7b0afc33a285996e633e5e9e3da8498927a6fdc422ee3ce5a2481dcef74e779da0d9b54b3d5a39bb280c6c8f494d9169f185be6614758d950cdc0d78ba1d8b6a89d65e0a28cd56c0dc8529296c6de753036d2bf1e2041968f0089ef8b58cfb6e8ab69c8226b0fedd87d44be98244f3a10e4cc4796ff34d740b4accea27bd5afb9c914e7912bc02ef4d57b67cb511d4688d7c69bff546bfdc73f4c1c977c61d700f6a1d5553a091c911013d764d2215bae06ba1e7f822f77ba130a1fdcd4465a9db47b5b7b5e4fb75d49a230c1a4df9d3a3502a38a1b8e78604b5de719323cab05ab0e21086a7d20066a8014a00e9a2f75e91b201aa1fd177e9a087e0ad8acb056af60482b400975ff0d4ef6480830b18e874fef81b7fbd3e17ea5234910ccb1a10a5eddc6d725cb82d16f24050c7404fd6cc29 + +Input: 6ec3f40af6cbfba4ac92898cc7c5949d5ddc13e6398b40c38c9168e5dcae0ffdeff3f08a1f59336b06baf238d5b6c9add52c7d94f5ba79b9a1e66e7165ac683568783c402f114019c222e0c39eaf54951e32f1ba8bcc71b6ddd3c1fc24fb2972b16dd74e7aa551caad666b708d0bea5412649d82a1ad578f08e5e4b42644cef8115a4a4e9e4da1f42be26d91390a52492f01e5d7763e29f50602e1ce8c1cfa6d52ed89641c853053921bafc5904cc31ef022425c10bbbc16e6387070c7e4d6abcb3392510f4b5c92148273ed3f6df409a26751c61745147a617715a454144d66a424d0ecb98ef1731ba821fc205b53f6e7db27b3840df0b8cf87aa1279d4880adcc4cf427ace3cb9fb8f1bdc48b30674a77692c6934ab4f06df45c3c9bf6bf00fd777055fa225ac3b676851cecefd00528e37f3a59245ebee18acc3a971842a3be1e88f379be9a942c81eab139c91d3ba43a59eab5a6c21d4481567aa096a8 +SHA3-256: 7fb6948d5fb8cb19ab6b7677ebe107406adae052417c5fb257fd388c7fd85e07 +SHA3-512: c5af4fd05b88e2b06ba270de6faef8cb95227bd98e14ad6485438adb94166a237a185916f478ab3e244985110bfdf42106592980557655cb53b8bb673350d2ca +SHAKE-128: 9a9d3e15b3a82f9b01fa4979a3b396061349d140eabdb2a2365da249e5d317a18ee3394755e4d5e3d13c237635c4877740eb15b73ec7216dbb9c2dcc434b65a8e939450af48f43b79f02129ead63b9a9a396921c871fb13966c85f28065e8e411bfc075d3eb86f9a455d253306186b24b155c83b63aad3119f328e21086fd36f07f2c95bc19c6f5e08c10483dbde1c6835833512cb59478dfded32f429e71c433b280bd3e30d8c25c5af7ca4519d88b68c059302f5690d0e9e5bff64f8b0181c18eade66bbb43739e6231281bd7a463f2c97487454e509e19dd3a7ad5116dcea8fd148919e9a75f82a81f39be0cbd441d23ea349a30c6f2d687accb27848168fa5b3ddc9649977cc1fe6a79dbe51c8c5f37d86a0162fab3224b65e685cb6560b5f7035e3e460fedb4874c2922279ebbdc67964d9fee88932911adbb33f88d604cdc994c495cf9ecf4bfdcf5247f4b5f67709c577f49203ff6cf36126f3feadc4fe2a9d046ddfe6d2a4ee2b8b198c7d1623f085a33b8a3e6b552f641b2639409ec4471c30e1515d9ceb43382ca7edf2c8eafc7e455e699e86c2e92bf9b70ef176c294ebef125de0ccf348aa4ebf2c6e5f06bd2afc91ace8f54a8ebec34e7a4ab6d8c611682b5b9b53a2fb0a354bfe51b7030af6ccf710ddd51e11069f689c01fe3c7bebedccd4096c2a0d567d40cb3a223ceb69746f5f7ed10c8c8b926d850b2c +SHAKE-256: 5b043c9ecd94df6e419aa3e20a6c3d30132ba3c9aeb96966c117abed336eea02f9374b0d6f8bbd23a8615f9067491520fcffbfd17913010112cbcf58ceee837536617acc96e1f4fd338f32bef92662dc36208349c1de66f6679c8db6545507fbecb4afebc963c455dde414e7b2d0ee25e03fb0d6aefd80238ee2b94d38c8720d1959783e71015cafa7a41d38f0ef49dcfa0e07e7fb159e07f4ce8a4ba542379e5e970275677d080d7d7e4d7a241aaefa702958d5d5f3791e5adb5349ff2db5085cd32e4a75d2fe431ec372ac5699690098b44af947e27b20b480173e9551a6dbd6b8044f05a3325a1e5cacbb79c514a8a8805df21bdd0ae98af551c57103ceb236608c37e008861acdddb9eb630d5af02352dc70e9503b30354f30a9c853752e7b660a5405910864f38ad90645ccdd31d0fa713d541be2a9a36c3ca57f0541dc7746a1bf38408fca0a6546f21bce523f6fb7cf4e4087ac63cb58eeac0d96cec813386c012023046355323cc21a4a6c4204cd5287253e30e6aeeb2ee2af100c176970bc41020328dc81285b26b59619e6bf30be59d5c9a3774b86dd9cdf5077b1a0eba6dba28d860104ce1a227f7eaad68f5e5c64309428b0ba837e78bdeb0ba0c5de87f61f0865896d39d1d27f6341a6bd8de49b4c52c42dccaee911149923146804f9a259d4c0975f0b6385aeeb3b24b63dfce6c1c3d2c3bbcd891e00d3684d + +Input: 5ed5d5440af752724d74c5c57512757eb0f8e42b662100504d7bde40b688311292d297d2ee1a2e7627444c103e41f992e3df428263e9727bb728789bdf8904ffea0301317026524758905d262c23a07964fb7b4e20d9355ae0218b8e5b26020589e1db3b77d5c7953459e0672ee133511ff487cc36e5baff1d40a92e70d944b80d09434a5334d5a4c9806a11fd54c1924ee9f2d6ec57486b41b38f2f5919fa0426f4556df91db5064eb929ce539186b65251338ee7b32596f3805b286854d958460777b5131ff03a817c221cbc1dd1d6fe12b33b3f0fd08a853453a763c7ed00a33425851a25d32896ff2afa7af279c4e8bd1d3b6d78be1bc9f85359debcce83813438c0a763ca9617c54285f8365fc511fe9b006d310f83f0bed2bdbc378137d9782fc870fd64bfa6cdbda4fdaf9888759e0ba63394c666fa383be16ae65c16676bcc55e16656d1a423bd9ed0a3316f3c095c5ae3db9a357ab6319f9b2cb920 +SHA3-256: 36af2f74ad55a72062ff75c6a1b498916fc5bb04b52b1ae6952549d21101f8a4 +SHA3-512: 3b3a26019213edf69901f5e8052340ccbb4418f7ffe0cdea27925d176d59304a020d38f5b157ee0410d76a94d7bd50a85da53fd7fe970986496d4f2392544146 +SHAKE-128: f761c91c1a89dc1aa58f42ce0e69d42186855d4523d9ccc59e67d2cd7581574b1975436eb430cec0db2e8ed5b936a2adf884ed462b3deec8d959ec03efac0d997418cf194176f387b8c849973e0186877107d9ff9b2b0783cef0a8a8a52fcecca2e193c8181352edcb2b296e0c61cc6ce220576ba536b14d4f7c6dc9fd08813ed6f3495256f4b7e40251fc3ba98b0fcabad06b564209c7b96ffa6e445cf6e314ea7fa1b62c42b3b34b9d3260ae3d5548689897ccd6500941f6ee06ef216933fabeb2dc6414a7288a3d6eec78776b38a9b99b0a2b81bb05c58dfafd1d6107b6f149a513485972fcc22205765f649bd019fbafe8402f140caeeb46132b5fbf7ad5f0911033229590103abea38ffab1dffc9ebdf3ebea5301edbc574c135cf36162d2d975fbf598a488d97839b8ce40976fb962ec397fe0768da8046f1e270722ed7616f7c59cdc0c427ea26deda94d394456c7a2a1fa25664323ceef80de2e037d8c0aa160cb03b536e71a749a3246277f9b6305a94b2c0708b45f6b75da9afbe269826b0e6401550b86742ec082a188b147df07828bfa31aa8e2be6a0d4accbf4fc0de68a1378a8b2ea5550b581a82d6367f413ea07119a309af667bd466b5bd049b2647e74416f415ec9cd60600552df7396baa1b4f3735c0efe0198e0823fa9fff3a71b223bff34c92e15e7f0670a728b258d8e2062fc9672995fa54e077025 +SHAKE-256: 23751e41c4b31d226a7df123ee6316910b13c60bf7f9037814e6ca27535b65cd2f99c4a938c32c78f7a5008fa4f816baacd437f039170a7e593af9ec1740899f5847afc542e7c2f8394db0caee1222d3b1b3d8625d806c7e3093dfa89c6534e375432d6417bfc42408827b24dba2f7dfaf785811d55cfe8c3713bdb46690da76503f71da9ade3fb2a8981745931e2a4fc5ff9fd54ff031627850b14f058fe86e6272cecb1d82f78479fbc2b07fabb3a1be1a42f14bfbba184029cc6be5e719153dc4058a30930ff9182d6869121a8dfc3b9241dfa050c990904ae35f15c435407def57bfdd022aefccdd0159a33ec1b8e974b617c77aaa2730a959e80ba4df1f45186065aad5521b00f7936b7246b17fd38cb735b500d9ea2f98655829b6c0d8f9efce3ff04fb6eb69eb27d97385693a6e238f4058b345242f3d6707b7b5daec8e9e4f462609c332304c507495190cd267f58454c55f05f3eafea74cb4ee9e60c2976d62322c65ab03d6a18048e9400fcf51f11fec5c3f6581d78b84d538dd34619eabbdc184cdb91501183939391c0063e1fed6b06099fb4883551ba4d949ff87a9e52f877e94bd2213a1ed3e30ccaa0a12053bcbca0329f2919d64a66333243088afdc8ce65f58609ef748b9cff44f3b4af5bb2742b69189bfe823daf7cb28529fc5eac6615e5beb3df1cf395acc0aed81070843cd5112444a05edff0377be + +Input: 93c220e7af9a04d2b69c2a8321aaca20196c841d124240ca09c2a6342dc52ca088945afda0d33ed6ce3b5de2de8701f98b3927bfeb7d9aad128ca5d0723e2e013c3f96810ba9480c0b9a004011ca4ff4e5b81a444d63361118d49e956f1dec08a97c398a503397b5167efbcbf78714d5d4bc9d273f3fab3c46a6d2a43634d88cf43fa2841a18e158d2bef053400f3f5782b13323a96f7b80464d38bee3e737f95ee510a0b8a39bc3c561d5c48e99b5fda6299ede49d1d8d53a952640bf86d9c5df5dfd24e46b93822ef976602496924951516afeb560ed8e8731b72efa1b387619e5902e33cc3f0c40b4ce4b4be9312f391e9fa9f9c330a6cfc625ee40452eeef53198235f67ba2a2e25b83f5f29dfac216c6ac7cb8117acf8499dacd9e84048c7ac901be429c797a1cc04da1dc6cabe950d8638616fba422c8701a999729e0433c5dafc2883912ff272b78a531ed35c06f1060892d0e1b8563a040b99057584b6 +SHA3-256: 39a6f825155d913beff3039213712e0e6a8bd1b3f4baa9dabe1681e28437fb04 +SHA3-512: a0a0437ee9ebfd657500052e09c1abadeb1ee68d9d249837d94f7e8532cf73ed42d7ce3667f655cbeb9ab89a95424473338d0162ff657e53c3b9ae834f7ff438 +SHAKE-128: 3e1d1555943005f60e03b53dd7950926dc9c841f6514206091109eef603ef923145ea788c2471db33a66655c24b2f6404cd2f9a3a223e3fcf7aba5171219e5c3f120eb7a8345b9b50610fc66107d9420daa8c9d8c522036109e96b0b0cf89ab1638c4360eb4859d50a3722bc26132012f4395c919bd215b847528a0bf39152aef3e896e414a8cff7becce02e52dbcaaa90c2b8f227eb1eaef551ee73c3b64feef7515882ae6fb189fd06d42c5b440bdc067711c59775408d476bb104589b2fe293a2e101268cd6063c5b7d4375e0698be17c4ea7693a9afaeae48267d703b24bbdeeec0f48dccb3068e38e01bac05af092defe69f62c969acb7315f0bd77c326cfe6b1a5ccfc2dabd308345186e85615654a88456d5055fb11fe1458a66437a2d188c8c51a833f8a60ca4f8744d3ddcbf47781173a3e22a23a1b6fc4b3f771633d1fbd12a999b53c26995c9290873a2d822be77f2ef27bbda4c83763088d46ba11f05644b828bdbc6e879d5a483eb986bf560b9e9c6c81b689c4f9ca1e54febb3681237a0f0b674f49b27e7d12d937e369e82e1992d8fcb2a8db916f91d789f343e079c1275edba2b4221d0f40b9f6ee5a6c58e0618a58eea28d781239f342fbc0c30bef0d2fc1e97d45800bdf66f2b6a364710014dbe6b89520196a58c9771824f3d28980213e9fe9b0b2c18d8f564a13cded86289c8d495d0f37efc00d74c5 +SHAKE-256: 637750aebfb4952c7396bcf29030a91363656b175c34e215c59fc17beba45a8811616950211b510ae6a15d8a2930661d11b250c1f58103c1ca5f9fd693cdd36e44bc629d5dc455202f9d99e676321ccaf51cea7599d729d4b9f01edff6c66593ce24fa98044000f5aa02f4fbd3c881887dcc96b6a3472a058791197c43d8eb63cdd5195a7fa19b9452cf99a917f85241d48d1bb32b8b68c5ee84322987654a95080f3f685542d561f440971be3ad08686a786b52a39c5b9f782899fbb1fba82011eeed10f1866fc448f80932aa6c1d738020c953e119ef7f253a0f348960cd7c46a2f37477d05e3ac15f9e78fab88a8e5f6de8ebdfd60a545ff612781680f725f2926ec06ece14f63e4cc41d0ed1c90831f4a247f91d15eba6a2a40f2c773b44a583e125cb1064a5af1b46c65b65e368d5771525d59a152f7bb364cdbcd57777314b1bf4f0348cde83c61ce0cdd88b4ce90eb7b8ea5e8925e963e383d955972392e81aeb675bf3e50d89416c4991b31bc1abc1e2260bfd17f451adc26dbde1a5dc1ef92113ef48acb1e2fd9a822edba525306b6fae6e6845a382b87d2c5bc4150e46e9a17bcf8f048f849e36e9aac877310048ce73dcab0a95b433a2b289c638a2b5ad33e428c32e7576d1e0a8ab732b08d3a71b753cf1854ba48b1469d8dc84bf2f78ef59d1140a154731426bee4a1310d9037f314348d86199cbe50c302e9a + +Input: 0d60c256b55376b40c60fb0e2cf3f84255259c94f3a4eb95837b4f191a135f0f070397ec6c20d535f9cdff9f9895d9e076fc4fa594461a15976f648ee62b7de5388709ca06c701b9b3e53a2ff27c1c6763225e6688f2ebb26cfad57f4de8a946c44fae70e272fea31750c9a24b8384231becb45f64de07b0abee34fb89ded50cd9501f23536fcf30083532d3bbb925c8f7dab79e6dbdf10f4ea018f4cdf3644f933637f7960b3790f8c0871bf01baff1308c19db30f53586d886c8a7bcd45206d050b9c0d510b740b2fb92244f4ec0e7d98c51c1643fa4e94b48e1c976be1abdc418b3aa3d7b883c713be366a5704a710389b0b876fa50acdfed20053e2a8e5828695b06c093f1d5889ecfdbf4d9f560f9991ed91fd6b21066b1342712acf99bb9615ee48346fdce7e2ddf069d4cfb3facef6634b7bfa422a18c85121baadf15f621f801d6531a74a5883b112c55802c8c67d973e9ee9bc8f48d695ce1c2c3d14b24 +SHA3-256: 1a096dc2cb1c41dff0e48c9016c3fe99fbd616a9f0bb2354fdd20645f8c69a6b +SHA3-512: 8cee6944c0bcef0003d725b2bc312c21a9d67efd6a9abc19573d9c80394792cfab726b16a55c898555de8e95d7a9da1b2842778531fad8c12a95134afc162bf6 +SHAKE-128: 71d09897b0abc35aa7603501ac64c289be15ae573f671d9f10baa0d6465652d6801e55ca88d8e39b4c6481ea7fd6d6c53d261c3762e1516570a575036608c66e11fecc0f8d283d38d568549ebbe1fd77c96df45ff39a263798329cce832bddb683fb2a6f8f5d5d585ea6695893961475c6c91f600d3fadda2b00130f74e5c71daf815425aae6f07f57f99ded8cc669cc6ddea5f9d22adb6eef67d6f4fe2fabb9dff4ca537cabfc188386e65ef69a5ba38ea932290e1e28dd5b99c6fae3cb7447db6e519884f7e56191a93efa6096c60a14c5d74bb9ee6eae2b7d74cc0a20561bf4f98615fa6fa95b2c47c5920e96a5a7eae8efa73bf4ad35b514f239ec8a7fc36612230a912a954a8104461c9c5e059852e7002536b3264eed1a693888898b476fba9a67408b150b3405d58a7d03365a499ef31f00356e237b0704af62ad81dd8ac0295401577de712cb8d22f0b20e98bd4c02777e9d98495f067118f5a9ec51c4a0a7740e4c0116a37c5527d559503f604759af91b10d38521992532a226a1d565664e52f0e17f5106c4b31a4c3cf2c9907e06858483beb8616e646a59109947c478445dc2faeb89b717be8805e3643f2bf61e3a142495e441531012be2f47b958d2afe8cb23fb94ca127b3fe36a2035d006ebe88b8aa838962e7d96bb407f74d329e6a8f3bc85243777a4f4e11bd78cc406272f36641203f5205aae07ab934 +SHAKE-256: f861ec157f5055854b59fd718de43da6605aee5b1fd7584ad0a0522afeb15a87aac83079e1f7cce049198642657abeee98b980f78f02d632f1ffae56b7e6dcbbe9030de8e1a0229194090904942782f6891c5ae450b547aa8ed3c95bb4d8ca340db79fb9f57ceb50a3ece65078aeab7846f38151ab24c22b0f9146847144e53a5813704a3669d743bc8f67422c8c894cf3a1878681c1e5cdf7bfba756b28466cbee7b61246cff6abf5c38114746c20078c7f727fdbb97e2d23e27e154e7b817c3d3b4f7f2b44a94e062faa449b5ccd818f01a65feb0614a4240e63183fb08dc6966eecec0f70a33d7b8355059f7efb7b5d13a6b9a59d443bb49d877cf827cddfc32b6ef6725908496b79e7fecd41b075b4c5f752c1fa234931ef45703ab659e1c83a2df8f6e24ef7cc86ef0c3dea431bcdd52760a66126a987f08278aaf53b9e0b60f75376097870813cf5c873e8679204c15f7dcf4719f28d8b938394bc782aef4f4539d77e682a41d756d69ef52c4540d55e0edab6c3b27cba379456c9d738eeb2be1614fcb7558158c2d32126578b6f81c500a02a8f8bb0880fd3678307688287b19bd166f9a90761f9d0f45c1e16fdaaf1e2f9d588f1b6925eb89806442d69d8059a45765c5bc3d66a7529606e11b940a22888349d59cc368ce8a241481e0622c0187a30a50cd3e1c71c62f340dd82e8e74b373725d7900337f69ea0cbc9 + +Input: 710ed4d47ac42ca31de8b41d698d765f1855ae15cb28ee45645c394dc3ea00bf4b7687ce75e3b7209ae49d79d4790f40fb3dbb85823a96c8ad9ca51d54d076bd58141fc75a48d1967b23d68d46435859d3fddb8486faa014a52c26a10be47b6070e160e81757b0e45db408937dab52bdfdb95d805638a0ce9d95728ae7989054f9e39c7decb29ca904874f246b090555b39a55b59dcea6cb9611d79ffb4343e407b10ed7c3ffa7efee7d134019936011a2141d1cf81eca4d7add18c06e62dff1e6741ff596782940334ed74cefb349736933dcb00d1cd7084f60906c045dceeb354a5121ff867827f04a85947135038f6b8fbed7614ef04366193ddfbfd071461b1dff32e638e1cb5d3e0eec19e4bcbd2c37b666c68fdc32fd7567e552c169f208fcd8e6f406ff5f1c5d4b92d3bb1393d510649e286b698a65f4c4b433a0b07e0edb2c87edccb7476d3662ff05a96b3198dabce88f9533984cc1d35ec5fcefa9fc766b +SHA3-256: 5d700f858524da4969719d5adf2c3de464ea4e8dc9629aa861c609ad5c972575 +SHA3-512: 1d6a1265dba173c7a37e6c7c456b694e5b3c246ed5160d93ff11acd6a73b4cd0ce5c6dedfb317dc391b886ad84c5489b5f55ed98bf19eef9f8569b19d821faaa +SHAKE-128: 0c3ddffca4cd31e8cb41f7665c86ef00abbfddbe1d43944350511bcd02a18a5202966e75322a99ad90185a4a0969a1907ec185787718625d4806b7f790ca80719b23d2144b2724b202429269d0c44723a2bcc056515399be9dee894fdaa73633c9ee557954e59b90fcf0b958cc933768399a23ef30d424d7e1740b3e649ecbac510dcca8fe7ecb19f4a279c9e7ae98cdac41ed0e45769632c80297a7f5c8839aeb415da421a19e3bf5d55d83929419cc3c14788fe68368a51dcca927a924a1b7e728eefc21ea17c091575d6f7a1db391486dce78ad6e9a1e6a7c8a566e92a6ed59cf806d3428ba57137219b07e7e1db22ac5ff6cd64c7dcd2842d8c36ea35b045793040042f0f08c92fdfccb2bb104fe52fda607093f6e318df3bce6e413ef55321bdb467e80c8a65654fa399dedb9794662394fcddd19bb0953dfac1f4c9a6b92b12ef04dab1d6f973691c4781d56669cc8c57fe2b43997de80740fdc02013b0708b5ad079f7444b1690d4fe76ca697ea0aa470cd982d59fc555932a55607f6bccac0c336a75f7058abb7bf82a8694b32f4533edaaec6d2786c5c4a65faa393d6b7df66796a052d2b773f6f5fd430c0cf53bf5835a33becb51fba9f0197be5ba5bd09073c07931bd85353534b44358860b95aea96a22f0370951d48029b42f05c81adc97084fe9f41ce52ccff1db3990eb726616154a58c0a809de5f2465ddb +SHAKE-256: 5d873df505a5041ea0d6eb21eab4ee8c36a8be5e127b055b2e27f774a38fc7c6df53a8d55c5b4cef24f3a40e2736a9b283cc29b065fa15e083b693cf37c62f2311915fbcd6204045af8b9fb70030a1fa6a0f12fbdc70d730e7a67ae5bf2407d21a294917e83077e0c80f62375c783ff6599690a42d9831a5d34c0b86597355dd98d8c12fb2da5c62cf0684fc22f68d9ae0a80539bcd4f24e5ddd202378efc2d68e821115ac3a7ea42d5d4fbd6d627599ad592c1f655d6d55252e9233e6a0c11d3a187aee930a304ac0f812beb1351c16fb4774f13aba4db4b83b875e4d7516c5ae93265993fa96947c96d5c6749c0ae34602ca79c6f8ee15240c2c41cdf72116e894935ace36ba87b2ce255537dc1fe4c0d05c923f77015af8ded25cf064af7f76bb70cf089b9c43cf35bdf46a828bb1ca83f533ba3539a5cc29a4c74d161beaab72d4141ed8f5aece792e3b496b402f76523e6c3920ab5056614c4442ff25f7777706a9ef82485541ad2b1150613ca01bb95da5fbbb7db497d08f68dc58bb92472fb12b54e7bcdf3f29bdd00762ed02a7ad753975131a1557b15110d039da5aeb35203902dd80e96f2923ea6ad43046019d19e4433d374b21150c5a453f588e47f242bc5738a58151919e3a7c60dc9d28a1cd3d70760b3028c65aeb5941ef457b9b23c849789abfb483c8e543f2869f56b0dcaf9988359bf4855dfa082618c2 + +Input: 3413a6119b3cf2932f471cd4f4d7936140968842d7c1945a7b48dc3e0571b93a728f1ef4251a03140274c7a2af32227f7e2713d588b803b4fdb865d4396a0a760bcd888d964fda507b173cb79185d50ea844a51e182a59c677e3e0b08fb4dddaf3fb23bad8896181b84e162d32dbf083027f08618a58598aaaa3f498ef4f1f8ee5af145be8ec2b35c3a633845601bfc66c1787f088e17daa5992b31d6493337c856da11c26cc3d29ffce2c11a0034923483df5f8a9f7d5955f40d1ea9ac51c1d8344869133cd875d8c076d914b03317dbcbd6f4eed72145819f2757f4d955ae2cd38adb19b85dc0500aa712e6945460a8cd4d3f09edc83398553f601d9e7a19e0b8a08c4648a0f3fabc94422ace8501bfc602859e4191d70dee72ca3bffa9c2febd08df3b2e43f17c4dd5b8324d2052d11c126a37fa46494864a6a2cd618c22610ac3dc27d1839443be8699683c8c358b0c3c5b25b213bf28de404be0b383e3a1749887c +SHA3-256: c1cf289ce40c80b9d33ce479fd6ac984409d45bdc95a72c4900f88e05e80fa68 +SHA3-512: b0153258f3f4c196d85d7c0f89a5896f61edb621fbd83db8275042a7d36aa46248732c70fec94505a222cd2934a0562257e05e3874963cfb9d38a1f07fe5d239 +SHAKE-128: b7ba7f37e38e200b8e917df97b3eece431d9417f2c51e0d211b09fd5722fd66bd21e2331b72fa80d08694c2da3c32754aa08f928a41b9a34f02e41b71e1dfd0a13b69790cbbf6d90809e09f52d5d616e86064fbb3d76b110bb0b382e0d3c17407e1bb9017104220b13c03cd58c1d6be9628c1522e22507ee6986a1c59485735787e91c3f6a840d36514bc5a5fad34500b69bd37e74ab1ac61b23f74b11a4d36451d28d1c523c8eca3cccb2cfbbfcd2942251db3fee7dd32f54c9bc81669885e24484ad7191fdc794f9a93b661be32bc32e5e427442fbd2277dc35a3dd0f7c2e94bf0f34e064af36b9939d7ba186e44bf765366f8a81125d32f3d09a340d673647268de56be3f313271220dc3bda75199ba3bea60a41e9a8ad100f840755553e894ddb2ccccac2b90d69c855e15385744008875af5b7387698c0d08f9d03545d22a494cf0782e501b904d9e84596c1fbd638bb28156afe7d15d79aaf4baab9b01ce9e27bbacebe61765a88f658bce51fec2d0d46da99a51ee7f26c2670211f821e0e797b0b97155e2b859aa02fc3dc1a95e1fe186c1110b98725fea83f7589223e3cf6391d184f7f0151fd8b0ed3f3c8a8fdca9c35a71463f0fe1329cea13b69d313b97afd5653f7f297ec7dce072b05897980fca0978d672b265c5a55ffa051fe772e521496b6d5661cfc70729a8ce48b473bb3885e90e381373fcc9aaa77d73 +SHAKE-256: 7b07eecaca4d33d2d6f0ac5adb4bea8f5ee4c9e7638f769c3da5b34735aeeedecbeff302f6bed4ad7fb61951778251dbe5301e569733a25c645e50e2d0e724b07af3030ddd8db30b32ed595cd4f3464202614689b2110a726cf29660ca72ac619c7772e560be61e972d4acee2eca344cfb3dccb766f26478728a8136c43182344608cb7324113fca15b27967bd5f779d0654ce7e07fc318ad8e1dbc2d1219f912b73662a5ded0553415af1f280d8102968f1480f8934debcd2d0a27e1f58d029a41c16269d3bad5ef8b7c42b2942f2d9aa991b8975c3dd26d7b7a527dd8fc0250fe3ff1e4c3564194d95f4d755b2ff667912d158611e988420fed197c918bccd23c074a010772583f9a902d592fd84bba2fb81b3b3e6b43e1b4aa7b0a75f516535af277c8ea3fd7d9bdf03d332ef101fb67ac8603ba5aa9114ba1c82580b1c54fb5814de43024e5db9d330b98ed82a9db0d63bdf36ab722f895614d6dedcd398d046c7165b212adbc20cc66f04e0a0e7dca87e82fc10d2ebce13a94dc24a7b013885f49524ebde6ef7b4aec0849541f99970660b4595f75ba61e8afe14bc7e4ebf52f9ef60f89bad7541692f102ba9087007ef360f7e0207666827539256b90da0a69b1b83e5450723b9c589c8b2895e1fe759aac5f34c957ee4457c5f9cbc97b29d9268f30d8eaa8e4b6b5c6d386fee22a0f3930bf307524a1e727ba5d2dd52 + +Input: 1e83e1b93f89eb5f1d1c2d578b1da7ef19779ee3d0452889ad4c162618c5c3f6f6fb2586b10cc14ff2b8b884ad28636191788ae02befa11cfc5a6f19fce541fa15cd5323a9a06bf28680c2126be3227fc9e8edfc59d2e30439989f5007e6571708522d9cec452e623994ca40413aa0d5d64d534743b666556f2ba57d0735f63b90d35bd50b4277876709742b17b80263e3447c95760981d82939c2cf0cb0de9b32aa977ae600ab2e604365fa96aeb5e94a49645ec1d76d4a75c9f05ce2e7b67a1c4aa00db1d9c35f751a152cb1bd555c3b00b01bb9fac137b3488eea241374721b3d3d9a5b62879a74299bcff2557c8c2f92f36972fa545f1a04a9a60f5ab54fe72a28a3f5b36225320ca07fc86963243789cef12db8fe7c78e4d751e9dbe08f5d1a2de4a49affb60f23c7837c19c13d931cf630dddfc6f8d334967e0b88fe92bf9f17340a33b08605fced634e0f6e54027a4a7664d5d29475e6ce738b3e6a8c2bf43d6a2c +SHA3-256: a18b0c0f20c5ab16ae8ea8f7ba5d207113a37cb9128f1c20eee97029141c5a6b +SHA3-512: e46cd8cd24b625b760cb748e30ce10636c7d6a673c3578a6b1e5c94c7cf63d5a771ba2065d347a249b44498f045d8c55288bfcc7dbfcef516809a135d59fb40e +SHAKE-128: 6268ade4d2edba105002b96290e93d0aba4d6286c67c2d113c679146c746296a9318e6036561291e99a771eb956a7b6fa0dc35fefe40e6382dd0b8ca4e64430bc3d50e7361ed3f04f3986692958ed6424b41bf17272203c3a7b90fa9f919ff28a5c71143fd290a546b08bf71ec29ca70aed60e4bc751c88aa132e68739781295a29b5ba091210211c4d4933a438ba0964bfd0732177f14424f22e817ed568a88d6aba4cf775af168edcd4b9ab06ea4fdb2c4ef876cbc0324b8da3abcf94e42e98993472793eb9e98d3c153992391bf58fcadc46993a423b8b42812e6ba9b6306116c1452d78465b055acdc96549b6d82b06b5721be08711fcef226335980eaaa83cc152b513bef3b8efbd0a7a851dda835ef80f6cd73c5084a15f965dd4782cdbafc112baf732cce5e1669dd4f3fd51d0db2fb3369a7fe2671cf80bc677274a54653da2773adb72dcdc933592fdd290e8d5d701fde5e34cd9b4599f66ec658af0f92edc8d4c31375434008d1333de530eb7395267b45ecffcc300ec01982ac3a8faf1623df28e4b14b0d975c2fcba23eb1fca6fbd9ae1ded5ad4fb6fb9722a9a54ce014daddb7a90d23ef966900c58604243f6b0dbeaa144dcc192eff378ec33c8776596c05a005023845b53b260076ea140a969f1f6974680797ab054a86e37d06ecf7152a16f41488079261fd916ea5579c35ada6809e96b4d8cf6f0e755ee +SHAKE-256: 7b98def75be857c276f6069b4ed0a02fc93df15136073dd1ef1d4b4abc6e1e02dbcd88e837bc97410c84ce40d82a392545eb00685ce520aa8f5e34ff4a50d66b330368794eb06166ec4441e518a288aa1710e337b6d3619a99345e1c2489522c5c9da8e28be9e1fda40c4dacc9dc70545eb02050fdb8bc29338fe6ab87c48a215b773b12bd76cda4050f3cc91c0176860b12b6c18fd0e7591e9d18d29aaca522af45c59f45b3cb65b8884682a567df0b7e106dea403c04f722f6c8e70e6d247a6b759c060d1122a3c226e7975a9bd897cea98c038a889402f6c677548c49958dd8de7ac2756d62ee39b78a029dd8012cd53e55f570cd788cc4d602bc38a7a043460e25b14b96fc80556c993c71d2a5f1c26942c780240918add13d413f435edba8162f06559e0809aa2dda45c005f0acd384b647a575c2fa920a5376f39aa4d8ebf2ce8a843a4aca30edcb7226569905833e0db266c01fe61ad43d9ef92111c2324bd6f9ac85cde8d8b6199ab35a451299680f834d9c5747d7b9eb4c1dae2fdf1c82466f7a796a15afa5b43e12f40cdd042326f5ce5d34a9e17303a0e0bdfc1da87b697dc132cc0d8e821b928a41d97dd6482057ae47be210039294725446c3051d6fd174fdbb99e53f20b675d0d558d0e06f9c10213f125f72371a549711198db0d817a26f5fd7d98ad3b90caf1af18f8b2fd1f5c83eb0b9d29800c1fa1d8b1 + +Input: b49994a979589e7364a90c3168a499d3cca99d33a2f02c33815b412aaee7c7e8d78675d6a93c5f41505f02577763967c2c536f93e140d475ce1515350b52de1266e84f0d9b54681c0971965cf0baec5da4a01cb72f7981de8eaf98da7f13ca7aabcc1b61dc00292833bd8e27da1d5f1a85e97b48c02241b6f9bbaa0cfd343485b318da4bbe96adbf7f42ca4a5b907e57edc7f168c3d42dd6e6e58450c08e2c25d7a17535ff6601345d0752406bdd0929e02bf461e69aeea4ef55804995bd1d117eb98e6fcdabddb5d58360c5d10051e057c533b59a2d04a79b0747f0249c03258fc4a1b39a91f54e67a093e47e5f1920b5ba00d9c5472977bdeaf9e7e3e61cd2546a7d9368eeccfeb21edefe9601c6464af4fa073a59833b39cbd3686ce1e55e6b6962a0bc039de97b37f1d1e3117dd2a8352f25374c98b900e332011aa2dd17aad7963d1b3388861bde7ab57d5eb8f52931133c37833cfc56cac80e8b1d1e4ebc8fb70e5443 +SHA3-256: 6ff2d8b2e81283f01758814d7a37fc6de58a0428e89f7f4cd56e72b4dc7adefa +SHA3-512: f4076fd679aae1c3ac4af58400872fda0d6349244b830bf2033a5187993099f29055d87f0216f8cbfaa24836271d823066ad030210362368a86c3322273a9994 +SHAKE-128: 32f719f88333daf261eade9b59e570d93424a002dc813ead1cc9a20699e6c805c36c6a68321bd9bc808586e560c49b2aaacb82e6bd54990d1e059c9801ee492d9df9fd07afd91ac035b1364cb03f7719f200567dcca86a6adc40a28c5b9b13879ae355ed16c3c4cbdfd3bebcdacc9239c33ed0ee5db7b7b02e40ef4e7437007d42f247e8ac20c117ba8f4fb25c9bb491ce2c9ce8045d09d3ac2ed153af5f0739e5b2cdf10d2a6e2bf479d9a2e6474757bce303e4eb2a541126a12528baca0920d1d14872163a0abdbff13b8a12678c9244f96025ea7c97f2ec33057a6e9081394a7dc62d72b0ebdc0fc32e1c81037ca0c08c815f8a6598a2fba5d4379da1189f987887c9a01270e449d4cb85a5d1874709cb7e8fe3ed7cc23112aa51cd27df17fd92b9fe2fd8887310e2268f8b54ff72de81c0299ff984baea5ce8590be3067648fde25f4b144a1770a9197ec798cba4d092f847af804cf6a87a581ac48ed42610fa0f8e4cb4f6e02b4cf7c3de7ab500ceaec645f9cd8c58e6cc2e30b657c11a9d518023b86ef39411cfaf2482bcdc445af154371b4be5c33a3e9f28c57bb8241956b6a0cd058f75c763edf3badbdda75d5d917d18570448ffa51401e7e8a44acf217d901e60ba371e0a82402b661b77762af2cd60e833e6d49b55b45cc050cc0249718736370d3616c7825a2a2828444f6d596635e7e34aeee15dcb828aa077 +SHAKE-256: db9861bf49e41992811a0a671f68dae0f3da94ee063b2c2f3a26d729302312a8a7871c7215f400ddb8008c083644e7ba96d19c381a4d354f1965313a28d0cf93ba3dfff44aab2123ce3a79b1705b98c0d3511fe4de1d3f0e76ac9d155a25ca607af61ab1c63cf5538947616ef5bf4a6aa3ba6465bba54df46b2ac14ff64725ee3636c3bea7056c06eee23d67d15d88e437c94671b01e1ecea55e9c3ac35bdb79eb5cdc147d9be87ff5e9fb52f7b7d3a5bc86048390fbaf8837f575fb5ce8b55bee040c1c1f90fd1f389a802da596133d83bd33fed6818408fc5e722da4179cc34cbd822f09c80e6a3fd263c098ec7d71dc99bbfc7cb9b542e3b6d558e1f7ba16dc14d8f6675f94409675d6bf669818856f64f30ee4425fa3fa39f43792456bfc47d2e82ff6e4327df384246abfa397033dbb6fda454562075f1f3646d8d5f1680146cffaab0af88d93a130668148509b807940f6eadf50476e829f168b1ab968414bf1b6ed8b824fe09b43a5b51ef5ef05bdf35da1c86be978789f1108bc151f3231f3f82ca7f13c03ae216c360b605582fbf1d8a87954b074ea2c6d906ab506a3c49fc3846535532059520dcf99600c82d8472430507a5c81c0c2b631c3952363793b9c55767b8057df4b1b7847ba69c11b3b7ea9400ca2a1792da759796d61b0299397ace012d0c37eede54d14c45b894d3c7839c30a59e15fcdb2ace1f553 + +Input: 6b84528e3c91b21a0d393d7040cebcaada8d1f73be40b2bf8309b41e25210b5a3013f4d09531571317aeaa1eafd266b603b5a356ae42ef4d59f5d91436dabe4ff01a68abbd9e729eb1c1d712c9ff1df783961b3d098aa3c5b83dc5a2c952dc9b9a8d97fad618240e7b7118025c6694abad6cfb42855245a3c15a5408697a38bed4827abb63a9e32edfa7be42455dbb720903af6c4a27d371d85421f2032f0bca5084004dc4e4c1489f28aa97da9577be4522a0b357b2f3794ee755e209562e9ff33677fc56fb19e7896a71f8cb99274ecc1fa909d480d67e4b1112d48aff704b42f06eaf9d248b61c71dee5fedfd57d382ece853404167642dd70718d75bacaa5ad87c9f0ffd11e5980af896c242d6eeb840ef07a4e5ca854ef270b2e4e7222a00c05d455d43188029b7b5c02b3593b3d44e58a2107aa36ddf63c8700ce9b9155b8ca99b981c2211ba770d7216879030c333bb268b29340cb23121df7609914da0b24199acf7d4 +SHA3-256: 41fbb99b0a5dd5c5d6fa9fa8cabd19188f69c58965ed05f1f319025df3c52d49 +SHA3-512: 9594002b41e7de3c70e12a97b3d33396a9c056b869137cd5048522205276b3f4adfcadb677984803e039a79feef8ab6b4c26768caf903a3aa8b21c907072ad8a +SHAKE-128: eeb112de75aa7847cd1a8b5c28dce7364c36820209a75d05dae6b2b8144710df7a858ee2514f3b9f7c9fe179c2a3fc9b7e21c1cbc0e20b2b5e9fa35dbd610dc79645e90ac071ab6d32f2c711bc1dabf03f25f095ddd7761004c014ee12b76a6d963004d5ddee6d49dc75ef2e33f7b42a5bd4a0ca62ef10ecc8c4a4ec578b4a9c54a4f22f781e8ec32107be43e3b7187cdd1e9f49f21f1f78ada8e979d162fb33c05cca3306c5967a7b3e4d19a5aaf0affa88042f70ff4b75c8d3ca93a1930a6124b26e7fa17c07ff44b02d1053297e139a19b41556379b4166acbc2b41d4fc572753fde2a47ca7b46f152a927dc1ab167ae00bab215c8684a9ae46c06d237399ddb6749d3e198f692c9def055a4e5671c067bbbe359ec9e49ade22b8191760e709cc35ee8546fc1b1fef3fcd7f704261e5b57ab3f6d0d6753ea43e82abff2a3f6e2ddd09d23608413b0b508f290902018c3782d870b98379bc70a5e9647cfe15d67b2d25ecb986b7dba880ad9ba748eeb7840f3d30fe0e0770dc7f77b6232041846e5bad154b1002adffcf893b3ae68398f1f1546bae803e35432915317b82616f0ac7c4c864a173295704353b8b39b94ae2fdf11f9fa1b182ba0790e7bf842b23bc901afa2e4277153b3af80fb6c411e6013d4d47e1cc03598d5a2b8ad79788f27d7ca33dd9fb34319dab8aff50b329d63040570b6737cd1f7b5635bd583c89 +SHAKE-256: 2c69dabf55635955c472e1a560c5826d802da7ee59e31dab55a550734e3ac69ea78ee59a60bb8da7d003a541b0d8de0ad34c13bb244654d4563462b1b97f77f5969cbf30ca21b75896854269eec6a792f5d1bd4058a571916db8ff196f4b525d304fe9356d6f4885d19be09f0422d2a140e340fe2c3a7674ed97d5bca83bdd52397c0cc0f42a992da1078cf68a9837e9ac2094c29403ad52e10bf82824a830be6e1eb54ce690cc0bb069b37052aa23cc0960f42c29107e2a64b7faef3412d6e40d5e5fd7ace4577e104c89743be94f9fcc68cdf1d87abe27334815aa0498c33a96a503fea0344a9c01c93dbd4c72e6d59a899359bac8aaf794ecf9d88ad9ebb1f3ee0f2355fbfaa6883eae0c5fb5de6adef78fa7e86499a4b8ea2352a256cda01fc02be095e854cf68964d8daa002e2093ec29e85f13b08df39548f51bcd78e158bf7f0973a0f7db3e572a93fd116e48070e193d499d93ddca7abd1c467eb4d6b517b9eb39fef87b60e3b08df1d5de8c283fb860f51db60dbb57e9ca95ce7925ec1464e203c7a3be44d86ebe3ecbea49a5d535e8c756f2d3a6e5f77e61b02aeb1aaed06859073f2f3538ba7db6002ec89cefba0529dbfb421e70d0958dc67b18bf742295e722abeae7a23f1521339c7ac137dcaaa5899d65b641c331b09d02da7a22582de1659d2ddb0a81fa26f7999ec3ad8c3c92e0cf1d95decb67247ed846 + +Input: 2055e246530f6e1780cd77b476baa6020c585da2daab1ccd9e41179f5b5d9a1911c3630a0dc074874c2e96459a8e62a7ee86054d9c8a466867c0a00d76c1f2bf57fd3e5c18d9490c7616295b94ae18e7561b61419bd4a1fd6bd67269f08773e455e85664567e541d1e97577e7ec9373764fdca2373a073a9aa12bc54bece937c853c2aaa3ccb2fbb46f9033335d8cbbfd04800692dadf44972e212c142bdddd5ea949b213303037e335e2a9e57c4a1827953439021ac2d3b7462aaad99b378f9de0a8a6770d511e17128a885b7cc90a2e41bef5e9173da7a5cb964e35e914cf4169412bb68c6db8c12a8df1db1908a10c0445ab0e60f3ffafb9db4eee91330c45fe713372ffa648f3345cb9229787e0c355f6923646a5f4edb88d0c39a104bdfba1430e1c06f7cef1ef0086f84622e38f774f05c6b672bca06c9335efe0a17dd3441a58044597ccf5402fb580ee0e2a36ec41802444dcd8fa555a463996ffd8f44df76bbf0dc85ec +SHA3-256: 7341ff19f7b0c2afa7c66a0ef9cbe0d734cb20fef053908c06a2e8a28227be94 +SHA3-512: da146795e82b046d736dbe86b3e5cb18ccb1f06fc10e2a07feb667339b7067136e8612797bf90f7d76020865c41c12a826498d672cd2c635742ed980282d23cb +SHAKE-128: ec0891253a89d47dd76848bbd00705021fa87baf9800419d31a643247479afb49a7833367caed5a65fdb53e8ca87699ad590c353c5cd895f5fb93ce615136d62e815cda143fc04ea9a8694eb6d3e710b7bb0dccf152193bee1d6268e6eb437cc9eb80301a02fe7aa313d2c2346646d3081ba7cc2bcfa94dd0025f9367fdcc9bf9a8efdad7c197e6dd96086c13ca763f4ce1835f10601ee158975f7c0a397ff26cd79f4c754b9cfa3680c79ccf111aedde065c700cb71694e7f101ed6d33c2b6bec8df0b0e0b6bc1a8d6cfec5904173d5432615e7ac57331b764caa4b564774db2da78dd4f762835232ef50c5aadd66a13edc3d523113671a13ceec767d8185c39e957e5a9dda2d9b65fa68d63c46d7b907fb5b0275d2720bc95e4d01577b7ea72b7148a0d030ce1e3d31024bff631876c0625788fd2718e1b5122c5b91fdfe28fd3bc753c02c298a3df522df12a49cded49ee283685cac5377faf99a2cae0521c823af47914c08fc68344cce1b1979ffa07a65cf456f1a365dbf46c4d4e9d4b3b69dda19c7145f0903f64c5b11ef9634b1d4750569ba5e2ee0eb24bf0a546d9c04e21061b9c04ae894616c89ba7b3d8ad616fbbb441ff04eeb71cea0b6cac70b089eefe95e2caba70f2ab7cdbca20e49b426f074e6fb0f876a209fec8602b34dab5cc7c82a3ca91b66881a28f015eb85711ec0d91ffe8dabfa10f6c4c4a1994c +SHAKE-256: 4f75025e677295e39e8fb9a9e4b53d231ce1ffdcf723f49ea6989deaf8feab166244193bd4291e469feed9443065aa478401f3e8c2705ca7ffee6fd96920050fdcd40e80b002ad9902db7a9bec1e8aee0b8087bfad05036d5f2f5763cab58b1df1b00f11afe28fb0fe2eb3231bc375d19b246cdf0d6afc864cec1513556ffb71ad74c9de657a9013f9303a571d70abb516e264d587d8a95bd87c690a57a60a4118f49d31ee5a4f4d11dfed677a29c7281eaac90ba98fc6d1b50c0168fa74ec2ceb297158650169c264bf4429735131ca3b48cc40ebf2e3fd947c6928b27df5607604ca8bb0fcbca15638f090d3fdada71303ce2ae5e84a1f4af14c552c541ab9354647d85bbc196384bb26271a138d138619e8136dd0d22e4a0287274b2258e5bd5e2a9958de70a26d97e7b69876f125527e07579c7720ffdcd08c068fbc69027e33a5e1b210f787477d46bdb7a3734d9c404afe9c034f5b734d24ad608da2669c42cf58ea2700ffd60ee80a9b0f35e8fe8eb64e1358f7ff4751cfee4bd49c9ae51021dcd8d721e1768db00d4526fba42ce2d2929bdf346b3749c833df2ff48c85405cec843ee3785daac3e519b63b9473919d50811e827044eacdc174e35891e6c917b0f06ac4db65f5f6331a2f457c52ef0085ec4ed1b2dc085267f87c93be7a518f7758d983d5a9b1a6458288425497076d8c46c4835378c12bb7c408bebe + +Input: 0d437fe03c456e85b1c31127b9ee903c63e740138fff16625030d3da087ac11f10bfa1b5110a201c5409d1ebda8b2f44a8a156c27fe6d6d7871e7eb89934d80b43ac2d0c8d525f034aaa7fcc1f0b989eb27b2144dfd7623db1180bffbfd3b51dd4c66f33f0003210a5c19a52e0b6184dc1e49a8d6187d32150cc5cf42d0dbbe2a16369c5e2324f711e889489e40757e1855f36a1d2a3689cc9a1df9198c9e7095f12c56e2c7149845d9eec980e2ee3c2909f9755aafadfd54b188342d19f4d61615238ff8d3f978695b44251726cf6f12c6da231ba64b12fc5f23bb9354db9717dcc9a9c26e19798e74dffbe9030cac53979bdad59ad48f39961e4793fe8617f8cca31e18d33d10a69586e2f4ab59b2f7677b88355dfd53419cf9c333b57788b2b9e2f44edc16bd11072f99bab25e89bd10243dd4090eb0000be3fef96ecb98339e75ab3228a7580ec5e2bb1c72d8fc0fb7e0f16e42fed547d37bc0357058d07c8945bea1a30d70fbd +SHA3-256: 6c0be55984a5c555d7fb89e5b2ba06077423adc324d3685b88eb58a9ca10358b +SHA3-512: e16fd08c234fd6d6cf07aeed8b75e5425080bf8b40259446d21c12a2d8f2549aa4fac70888af9fcb09e3bed2345295d03439aaf7df5e8a95cb87bfa719666026 +SHAKE-128: a8ea6c5a4131950f85a08f4d02006b141a4f4f43454b405de523810f001b32fe5ccb76294aeb5cda44ff89aa10cba14bb22507e11b8e252881123e83c937a5703900bf2d764a4f221e90c170d326b66f42628b929cbe9d263a4a36fb9e659354a413ce782b5785eb1fb3b5a60ae67c02e7da620bc3438f2a3dc44fd56181f797c0aaf9eae1ce637f11ff2e276cd004f5bd51f9077deabf7c01906440456447baf45c7860ac71433d24adae1056b0b375e099a6f6e7e19f99c14a5416ef875a46685c1148146298c40f5c4bbbbb38b188b371728f2c96d0e0a1ede3e0bc71972e5162657947783bed3de8c682453553fea584f2626004d0e6510c9aefb9d76a0b1757217bac4b2e86fad318d5f69ba3dd8c495869ae986615955f95b367cec7b7ccb81b1b434d08e77f9b64bbd5c0acad1337bc40fbddcec249b9eed8ac76875fc584f6aef4042bf06c58bff3bef785681bc174481e24a36e9d8f7a5599063af7fb09364eb8d3f25b6b9833424360ec7fee723f752130ed7634093ab5c20a9ff67b42c876bdde372bea60c08052a91dd77a206a2801a729b650dfd54edce5107dbb227ef789c653cee3ace3513f1d1e2146ad02e28f9dd642d5bfee96d3c8df12e643f6151568e553b50adce04c4ae412b1ef04a3411602c8f6bf9598a5f45e72b73c9769b57b9f228c07fd4798148c98cc0b1238da9abe3d62fb097e681fa971 +SHAKE-256: e43c6da216e6581b9f0ee8af42fbc7fa5cdf47fa339073bc4082a9b4b15c358d9c3d14420c8c0baafcb27babaf717d64b41ae739b1f13b024d09f48008a47d2c07fe3b6b78b93c11283d329f70d06702de0fdb88957e60ab253fdda6d2c5b1b731d82826e4597a1b396453bf25b5be65216c4057e8bc8d8b241091f2606a4723eb957c20e0bc451787899052046835a4a6482a21587130a70c9fc6eecda90a13efe798fe114c64d38c6d63a60ecaf7c1e945ce827335343a50e33914c7e5537e4e9382960a6a040b62c2b88f45d832328e7fe91df0a8c760371a148d2c1c755c65a812d03ef588acd909cf7b301a24f353bcc38a234c5837d8b38bfd4e7b6ed091e8e21f540e89f829842ddc21e79112fef481a19319e7063e5344ff7640b43465246d4afe665186eb1de796b07b3325a7567dedb43580efad9856b7e7eaa31040f1ee5299acd7d258b18def9602bfba9c1bb5499c33544b7e71056070d36cb15a778d75cf947e89813256be883b1d6deaa9fc11cae4ed4071ac5347c813462be871e81b6df4b11122fb21e63d691c3c854206d7f2365b904b170456125f9494b1e183d6206181124280550943dd042ae1f501e7f21a44114952186deab362a907126392c2b6b136f7231f697ad8b500ec1954a5106f4f75ea4e1ab282048139526f31f7a64932d2956db7854f1cf33b4782927275e819aee4e02a0689b1108d + +Input: 710cd512217036b40fccb877745314cc01b77cebccae192f35e14ec76e58deba05acc816701d64308a210f782c7b4c648acaf56c7024e73fa1a504c1faebec3fac199e3af7f391602bc0bf57a3dbf2dd97757e34cde6629cb6ecd9213e02964e481bb8a7637f6f3a07832e8974b4969a32b06590661def82619c453fd1f53aaf75701e011f4366184f599f009a3642c8c43fd9b8dfce4c6f7ca309a86b663418010adbd6f8ffe53b6ed7294c76f611f321b631d05f533dc5a8abbbc1db382f1aea39c02afc432452484b55cc1a17ba2adca738ee4eb3b3d30f2739923ba010daa78aba4a88da976e01782fd1bca66cba4dc33eeae4100daf2d4465711f5854301159b322d73b86d5aad66f6ba90ce0aaed8c86fa09eae004c7362814cbe55188cf8c4f7c44bcaca56b9a3f5139ab5455d3d26dd237898d6f5b83aa930a6fc9819ece36884700862a59ff06cc4dc03f66a1be2bcd2fa6ab0a2a919f1e3f41f9768e4c8d3d4a2fae1a8f9b +SHA3-256: 357d8f0b537e0e1392ef6f5f3aba661a1ac06ba11dae7cabdb72d6f866e1b893 +SHA3-512: 52b6f1015d222103016acc3d27262e069bcb6d06aa84814fc8787d081e2dd69e92b662e21032d28ad87ae966e41a0da916084bd3096fe4a6118b48c38ecb1c4f +SHAKE-128: f750d174e4b7eb8c650ad3fcfdf1c3d61a049f36a77e02984ca2bfd2a78d9692e3d2f965d84f70dfe88f42e7c043cdd8f9c4918febe1eea1ea6030a92802f7227f8cb07f962d23b0a56bff3eaa1d072b437a074470e1845a8d8b37d4c1a6841a00881a75455067ce3e679d4442d7f51787caeb4b5fab9677a9213d014ec0c69ea3ebb8b4d55b3ee78860e34b199f45e5a548c81bfc689507efb997a8fdbb814fcbbeeae7bf4d099d72e0d7a996ff1e875004e364a2bf7bb66a1ff1af2e63327c320fcb9d185f9ed9c8e45b67f7f127826462f042cb8fb8b8533583b75f0a54c7761711fedcc593633cc1de75a1144353de183d280a89842b31be1fb70752bbcdd53f557c7cd003bb492ae54b0a3a865c7e4f3c159be652dd76a805af1b70db479c0a5a71eabfdf3ed7902506715c1cc981bc67fbd26eaa92270d274e043cec5d00909c8d283effd2c755adb4afc03da248a92bd6fa22177007104b1860a2cda30aef3b551da3fd65f76dc0e3628105980200612a2a41616a82a1710940e7539494909471ed5dbc2e54213328abe4e1559c54ec452d95c88584162919cb8df3d965db11a9d9b2d44dfb3ac07278292708b00a4a01ae22f7b422283de8349337e5f90a296d3e1e444f2e45c33267c8cab487b982f944b1d589380629870616773f77ee2a9f2c0fea2f2a6b0dfee5bffc4d1611bea08a30eda090b2424bdec88671 +SHAKE-256: ae3db5e77b79c338dd2174fd7024b70ff326c33b5e03867969685a6c52a89ea3d416a63617b8776c37852cf900e36f4a30b82f866dd5286252f35a323b21b3edea52e5590726d73bb38c5a3ff3263eed114e6d801307948e4a1a99c08e0438ad15f435c4cc2c7c35a017fe7b74a3837331e5fb2a2ea67d6d8e55f0155e36f694c028623b0c3b469eac9f6f44e8bbc4749e912057a1b9c222a8b65b35244998dfc9f14ac0593d3a90376aa74000c1dd115cfa8f3ac2aeeaa1cbff060467cdc8118d69e195dc232e3c34084698ece4738aa52d330648282fa7533b7f8f1602d1218a93ed5dc45b571f2d59ad77ed4ffcbce0ba518526e7b5037d410bf93a46905ac39776e28d32bd62a0bd959ec17cb0088da53ebb8c64f5517d83155c2c69a78a9362720becc8ec69ce6fced9078db433db12745be27f351ad5972e97bad4e4a5dfd83beed239a3a74a30b2ce47bd24b478e37423bd9468294714484db1c69d89ae18346b1670931874486d1c93ac9f24dfc41e1bd6b5b576cc5692b6e9ee90593ef03755ad163106cd071589f44d1f4b893cec2e2e3995adcb8d58bf763fb0ca91a775f8c6ab274ee9f8f17e2309c561a75745a0247bd3fa4aef52d1bfe42379db6c2e1d2de4b15a2c0a9996bcb7ecc46e99da0b99f9ac082dec4889c5754fefebf0a74cf1dc072ef314b5537f142ea22bce2a603ee76844759c4a500a3258e5 + +Input: b4932cbf47ae4e31784c9d2e0d343d53b62ba90377da1d758d938413b14298939673cb43866d99b901cca9a2f11b40e427e01eb037e58a3849e880e62bc6f868439689cefda8ac14d3396d967e43a77ffde594abcc96fb5f15a1fc752583c273d111db508076c3a07dba67d5bdc07e2790070f2233c221294d8b61a20c68fde27182ece43b9bf55d7dc018e158388443497dd01f486e47923b7130c79f6d49392f9273831a465d07d35e2bed7237ccd8f28a648e8a2f52e2855bb14be998934e8afee14f48f8b6489cf8bfaae8216e9aaa0348171e6435cc1ce517c233f1edd3ba472e817e35fd23a93dd63a5fa02075022070c7819bb3cf66d008f6fe67e2cda14d836419b5749a4d4bed6938a045d7062ef4a75d19f5f3336b799cd3b2f3f2b04050a6e83d7f683f5b5c57ab63288f8f3316a37a70a6324f6726289dfcb933fca1953b02d13205e1b37766702d472ed3bf7592f846372c0ac9719d09ad181445b7bbd04a74f31c9e36c9 +SHA3-256: 59be679aa585afb04d991db4ee1bae6ee47f2db092a82c3187b75d56ca2309fa +SHA3-512: b31d536705b711d66befa70dcfda750a121da6ad752c7974b8bce4b06508843e959548a16adb3ebbb940c8d2bb6af9f77d93fd4e4cb8b917bd0ec1079a4aea3a +SHAKE-128: ed5035f02232f4342b101654142f57fa8f062b16272204667287965f1e2ce47a587e9aafec851d71f7ba2efda0a9f862b3375475347410a246f1eacffac53228334eb429d659ca817158bdd430b44e2fc74d42c0763bf32f0c66e78a9b695c8c4c4900968757f2c2b9ca08263ffa37aba31de0579ef6a2a5445877dd1090996db7819a2b5e165d20fdf825a9c6665e73b1f9f60eb96a9b66e0234f93a9d0e7171d0992e955bab8a9ea08499b199d52afa1f30970f969a97701d470147309139d3aa0ba49afc927d06f72d3e6d79e201c1885ce934c930b53c86a552ce1147cea3208ade1f36a9b27f63be4c2be46f9f1b5112fff79dab5b3697df09ec4c56614cfd28e0c435a0c07fc50c450ca9a65fd06be9ae90c0eb87c4fb8ce45dc687b784579093cb59d8e30535fa605fb6de84a2981622a19ff5898aed7ce82d56644e86426e5458c6ba64a40726a705eb51e16a150e2dd4dcc7c16c3c432ceeaff86ea6c4ffb61678d3e558b96d84b2c69d3f98eeddb55418fc654bf43fe04c84822a9d5fc1e150a407f692a43aeccf29f58460bfc9aab92c78229f5bc95fb201dddcffd87591f1d9d2b146310382e6a7af24794ff1d16a88ecb28fb837157031fb7fffdedecd1e0602a0dd1e701e29e8ae3a083e85030c6200a57ff1829d64bde316e6231b2d9e3a27d36116d286c78cf1beb2e2039534c33268d97a2441ee8b08380 +SHAKE-256: 592d0b0dda85fdabdce70eae293c587755c716722ad29039d2710e9a62edc9a35f36f77d3b5e298e0e795d22af1fea2820934a4bca5758998851970f01dc089a74c1dc1ec551e0fe8a2bf2883d6e1770d2531469ad6fcc938b59ece406516031cd8343cb21aeb68600bbb55ea3e7ba428a89669c20b03d607e70daaf24f59f343704488f8cc1bad59dac442a955fcd0e21a49fa697230e2fe546f57e1140c7e34486ddf971617d2f89f3e265ae19bc354babe871a0465ab1583195eebf5ce5f6428720f10270647c7823cbc0db102995031c99ca5226c206786c277e6e3ec5d36fbd605dfa81d9050cc725d045c9a0ec796c30bfa4e6e5abf588ccff47f2bf570fb87e194c84b58e501502bab04844cacd545261c010fc25f397205382b3d345496fe13e6a8084be0b1f3a6b850b0c703d6ee40c63c7e9733897f69e8af1c33db3cb524faab13162ff48a981a17fc32d8e900b6b0f1015c009d1c3f5862291712734be9c2dc5754d62284b372ab6e0417122254191e6d83d981714401914eea4ff5a920ef2ff41b8a61d10b2bfac36079a336cd2ba85614462bbf1d188a8bbe4484100b83375d7708a2e2088c0f4fd43746ece2f8753ee4e1e5c795367fef072876a70dd15027bb0b2b8763ea4d3a6579c55ea58e030a73c1997133758e23d259e50b94a0e975074a6cb29ba1e97fa4aab6242d9788c50f8f552fb444cfc9728 + +Input: ff41e7ceefe8067419d94ee62d81548b71d4d4b79e096a1cae13efd163fc4767fa0f54a9c63ece8608e9852036bd5538a27fc475cc0a15f04d95cf553123df2668dd67dab79cc77f32266966ff1eacbd180d79830d78864d7fae65427fe57b2330f64c7a6bafad7db0a90ac8774fbd3118555b18552f0006dffc490afd2c3d96012724e3bc5b059c4a9115fb70740626045dd2759443db5a871d6aa9204aa4b3cf4f823d00f428efdac01000d60c9bc5e2185ed6f1e95b37466674d9334371fd0a454d1ca98ff6e9a602998d6abbd2c8945af77ad696d6d0f9276b69dcad3995136849f323d7ecaecd1733cf949e35076221144998bc07e42cdd91d587882d23f4b424377e52f960ec74aae61fdec839e13fd598c5883837539506e65890b434975714b939b9b113656f8af65ef142f22ec74255748c0ca1d68e7335935af3bb90bb6fc4ba1a56b145114f869020ed9a6cc9463908b8ae6424b3e82db1975c83123672fa273f846deebcbf48 +SHA3-256: ddb885156da787ca133561b8c5b7cdd6cf60de2b63d10cdaea679ab05dae1a41 +SHA3-512: ece1d6a1f4a8bd44ca1fc1bdb1707c9cb0ddcf230a6dd85040a2c277b6102c44e3a5da362d3bbb7693c3f2d1c51881fbb5f92cb833c0463a5838af4253d326ee +SHAKE-128: 83bdb49701ad3d050d0be5e45e97d7980c345fd7118ff2c7260d2be63247bba70a23dd8a460af5cff0092a9e0515025e1e249094fee81d17ea69d927d87dff6f2a5f88e51008a016883529a3f9b8503c49b65af545bb699e34d790044e754885201422339d4f9b86049b2d9d0281d7b0a07d2ed110536fd34a2d474682977a68e9cf6a031d7c9ba9a41e985e47b6842374d0df17be3f2ab8ff1c362922d1aca0b84744d1aa195a97d2ef9e61ba9b7cf7e316dcd1297b510537230692fe0bd836ec261f1057343a7efdd734e4f5f7a5d8a9d0d3b7d7da0cb40734e3f88bc5db0c736ef5ed5ba3f722f8c22782ffcdaa4a3a88d1a1196610bbcafbe2969cf9b5e84ab281fba2d9e62f03a12c2354bbd589becab5441c41a6d058bbd6e22de69748de0faa7ac21da1549295505f282cffd53f88578220fad3fc3b4e04f49ecc2ec919596a26b9f44ed8559c9d5a58c4a436112f009a43e3c7137b6a3929126e501a2293c13a861db9da45f758a772aace2e993a6ee5f308aa948a96b2a2f2bbe8c5c57f881348f6d6d357f49ce6b5972007c78fedc77d50bfbeb01c9dfb95d436dbd3b5db712aa56aa81fc99487f11bfabbbc080e40a2720e37938952ba4ac90f3e6e049fede15990fe1d56555bfc0144dc54b30607e3d02f017c0f3756b497a61d87924776c1d88f132e72deb4b10edb7cdcbbacf946f891b24af2e1496533e4c9 +SHAKE-256: a94d06cc13940fbc4b3eaa011c4a2f5723f784194dac0b23aa62300c21e00b9403656713c5cfa08d03e971aaef3cd9320dc319602472eb3ade45c75173a3d4a1861e82529e8ef03a8941752739ad52c4af01b3b07877d5ad6866053e45ddff6e0c8c3aa5ac5c71a4052622338742f817d59a1e788d467def5c55fc9d2d00e3337ba40561d39701b96f9d6c77ec6090a12577298c09731c65274c875ebac30663edadb30ad8a301f87f2ea99a131789272f9a630a47a9060ab5079b9f7bc1351f4bf1a078f61d9007500ce4da0f2fede68a3afdc95241087ac68ac84a1eb5796196cdd32366c48bef950f95f5c0cc4dc61df7112e0144ca76c9789ce46f9915765ba409fa5c27da958c55763a0eba2f32e7a606f912b7cd95d6bc7a8e248fbb140ba3bb3e6641dd2026888ce9ec5222d2afa9112a1975882a147cbc3a19bb887f15cd9257e3972974e6f3f56972e50ff02470ca39bd8401ba8c316d436ab4723b371548d966a7e880b5e486135c22047d21d6ed60905f029457655b925483617a9d98469c8137e55cfe94e97d1e9aa8a588cee3a022a60472332829527ac7d547e4cf9453eb50dacd1dc0810acf30a14e367ae5e0d04932de3f44282f5d760c8dbdb4b51aac9b502c3ec21c7b24bca50426bc7a95b43a01fbe06438505e6c81b256288595bdf81fb9dc4758c0cde7a8a7702f6dd7c12fc6004d5b4dc641747edd + +Input: 8472676e0e14f5171388c1698e46e2a32ab37708f201e7b5246f28d2da088e7574bd6913384fd861981154c584f639ab4d209d7299d9e161afc733b32da761c58cbc7c8a3ec18ce24ec49593a5c9a1c54e074ed9ead07bea7ebe2d551ce41f96ec32b3f70875d4c3375985be67365ace8961b03a2a641bcd139e9bb5aeb6f6d67d3a122a1aa2c1a2e4437d01d38d1ffe35364f89424103a496eae3ea6140253256b9ece36ba074e8d95793c03e188fe5a0163d48e9d05abfcc0b5dbf237bf263f47fce34644160bb3b3d6d5fba371e651d270970a71c4c29f3dad250ca021384148d07fcad0922671872268f085fa185a8918c12ec35a34525a31975c9c0504849678347be37ec37141e39424a45b10dc311ca2b1df3cc762f60949ab1e4f75c3b313ac15db02982ea4ed04de69ef97729173e55d9759cc7397a0a999fa7a5c9603693ebc6545edfc0f3239e7f8474e6f72794431de14b83f37b04dcdd2b40fbb9b51d9190f7a6ac8f817a539b +SHA3-256: 468b2515d935d0869521b3104c926199a780d34f30f56505291bd92f890e79d0 +SHA3-512: e41e1634754e107dd270669ad30f717ed119930f26528ed8c5acce82c261b8905ef24510a8f112486a730565bf2aa5fcf26fc9c735731fe05e31af49ff808ee2 +SHAKE-128: ec40140cf78c90a2ec2ba14d9b357ecebffa4244e59c6ed5132c803245ac0f8a722e42ab92222e5ac1302cd7ce4c3d2f7d40810a7713a22157668c95125f87d0b942ef27c814799046b1220e9e9847a9ba0fcdfec75ab7409cbd21aefee7c2753747784fab0e183719d177cd3de93c425f229264f5ea60544be0fcfe7ae450b5da9adcbb9bbe8f0f670aa7ba6529cfc51b6393718fac8f4cae53194c2ebaffbf9269467bae6684b8892b8799abd1674162b3ea264b2beb83a4db4bf3dd45a73ed51100701bff8ea2fdc658805b55eaf35333b4d82867bff6b9fe186fe5132128eb5a92497d0389d70533a5f215d34a22c62d1054b9668d68f671f49beb7d47905d1f5ff1c6c43007779188ff95280a7c3af927099d463baadb7690d9979abbf522890960c2c3f4ea70307ac19af6e6cab88f0b1d3124d7e44dfdf5df8787e651e396dc49fb6a49edf75a14dc46e57b9570280e01814fdcbb352a4d4cbae4ca70d63f446c5829caff791b26c38e8d945536c81600ad35baf4542f3fbabd20770e888857483d97f364cc9585898cb05ce186fcdeb27024694d830a179eb723bb14bb263b9e422b86f976bc6f33ce532a7ce719cd40f74c77f0f73b6bd89cc639da53e4c1f8bb5be8fdbdf78f2cae130d2f27ac3ebbdd22ffe7e99d8d96a66ca96bb66c1c636429a2313f6797bf1c5d71ddd5f83de434e5a86c6fde1b73a7b87316 +SHAKE-256: 01e5119b2f6058a2ec0a4ad9c431708242851d44fee1238fdf5f7e5a20774e649c56bf4dd5948d856c863de621f46a84616cbdb20b191749c2f0413ef4108c5045dc9d1fb01f0bb480505f2fc2b5751a4bf6f167a268507d605c2ce8a8167cea7984907087755d095de2892258fcd3e6dd25ace4359958d1320fca906fada17f7a592e63d44617f4776091b10955b1d5402ccbf8e11c623f8d72089fd5872b32e63962d1b4254993612c7c07739c689cfac0f838346bafc453e49f95ff6854e5a281ca71719f7a7b1ba92e993e23d955887bfa617fba7a1b0c4f139e25ab4622ea13a98435800f457619835e5a7d7a769fb3ff8c7195af28a9407bb53a29bd469bd54bb39d48225d47ce09e8cdbd2a0a5ee705ab77b50a6f7686c19f27c4a40eac29c8a610b2991ea81e0d25c1798a97ef15ecf5c2ea84b5a4dfe7d75f1abc14a1a4e96303021a7b15353dd16e32b5f246b73235260758909e4ddf8f9f7ae0d90b9390832f9e5172e5c98d8c2049f2e86702a2d0c0d45bb52b1a82e35b48399b332f93934f1e7bd57de9611dd24add5dcb4344ccf942e361e41b3e4e002e6238e02130e005fa30cff8d822deea166f0e36dd9c4aa0dae10fb7b59f291562e0f7a9dc81830b34319217e6771699a58226dba67efe76166218501ece0b67ef55676c04d88f292d39b45bfca9c7916cd7e1187485801f5e7164dba27168ef6ea187 + +Input: 3d5543f7d2bd5a24d45d961345899c0b75295e3c4b9c66d0be3cf28e4a020d39eb00b228ab324014d7067802d8ebbd9f8f9df193e87ea48ad6cc115971aa00c78f1a5de4118ffb45b0796c51a3fdc155674f8c88cadf2ac33ecfff1256e1d4cb92dc58180fa77c52a3ac6ea594dac94ef95d29efb5f998e5e687294d7752cc6c59d5c003854618915f0e398577fae58c7aa1538d586f263e90ad0daf2b5ccfb9e1a0eec6fd59b4b9994749b3e4d33be8e78d9b12975872b447a14a2cbcb7f59a57cb5942bc96b8163d6c738f2c86b436b221b9b6b6368f4af519909fdd0ae3dd1c1862911926725bb61efd57815b09fe980759edb2b9f02d73cc4f6ca8510cd3e5c01c09bc15b6141f76dfecabdcb60db8c99f017dbcce8c406da45b75909a75f9b6716f20fe474afc56cce5c6e20ccf1e09e5516b17a3168b1a4e664c09c92fb7837b21c964995b38c303d788e03ee7391a38e6bbd27fd3cf1d41c0e5afbb9e47cc928f0673dc8fbd27888874d1 +SHA3-256: ae38b8caf9a9b6e8b6e9ebc1fce9e5126ae0642d372a57bc05b7ff2edd1e91e1 +SHA3-512: 188cd44ee8aa6052d0350d7511e16ddcf1c8e062f43e8796f3c896570fdcdb8a0f021bb98707fddd77578998f3ab45509a241ac809a922509fe99685729874fe +SHAKE-128: 34831ff6905375401e4f122ddca2c05536a8a4a79c382b179ccd4b5b97db244ca69d513543d2eed6a6be5fefc79a5ac3098c4c375b9f9c27e8c5cb6fa5b9ecd0d9103e92b0c1d8d4c9cc733992261be1116f5fd89b8d3f60bb5c58a0a34146e0285da2717a730f5bf7ec17d5826fb7376f6a58eff6a8c6a6aa6348a6e735a671aae388a1111cf888a017d619bbdf067a6eaa056690691b85435c5a42016aac9502ca314316724f7cd9db25dff452b2d9010558ff563a4aff7faee31a7bb681d59f285e29da0a3c864eb72dad54ec6c3aec23bad69d5534d3c9ba52f617867728f705dba937ab1707c1a886e8e983b0469a4db18f65cb47df07c2bcd0c2fed91c50a11e8aaf7a61c5feb9a6debe89d31d11c70e3138962529ab4351d1bc70042ae3fcaddc5b5fe711c1ad6d4d1b28ba808f3e7db91764e19ef231a9defe3573b2792a75e13ec0bebf35c1ed94b9901c9c62b5a8561150c870287167843ee0b69ee4226c8acff503454a24c957eaafd4e94d5cb201c4dede7027f55f718667baadfe3007ef87d134b5e499268cbd05bfce752c0d7c2d6c535e9d17171421eef1b00f7dfedd864f1a496dc0a40ca0c074f58ca944769a2c0b0d6363d88621f1b5a2e24990cfbea603f840a30c96c4c83b9823f4069d3dc4d45db3bf384574f281b4cfa8a58c1718ee348643fdddbc1fae6028cfb0cf91a8c5c25eeee07a8617a119 +SHAKE-256: b869f7ae351b87711367a931334a1065067a601482cc016d2399c5d64e33c1fc406f367dab48425e0e882f15a1f26ad82fae56aee337066705529cc9955e7147d269be2309d17c4975c0fce1d9a91b13e667616411205bb8188136e4ed627203c893bb519b8aade93007a30bbd1e7b2c1237f70ce35929801318b71a73f16848c5c7c0e456670931a6306b96951c8b3bbfb5e657643e91858903fbccd9a6b80911cda820960ab77a245172fed854f7571595c09a498e57840e65114e88348a5b510f02ab371c4e36c20f9bef1964c5a720a599f8f05df1221bede09603243ab961098a6ef728f101b8fb84ac8e72725c1bac9ce7edb4ddde99f1d1e427c5d7af473459762ea919a288289c3b4e16ad5bc57c2d65813cf9b5efaed09a42d8820333c7178a1ebdd03213a5e597f2027ff020497a21bf8b58657ed08090a61dae2ac862a562fdb35b572062d9b7726edf0ee465645d5f18db7e2c026beb9b12144911985a5445508a2c1fe6afda935c6b3c953dec3f13b31b9dbb6d37e3b530cf4d729a1fff281e6bf6c67d7644b0b047ec299e62dd328503ab12dc1e5c217d8580ab4b9d2b54b5327ad574af736d2be6506c5ae45bf417d3f25621389eaa4b4b5f5118aefb318de74a548ea8016e8df4f8eb009459b7faae98932b78d57607abb33248b64e43fe30f11882ac4c06be7efddda89e4d1da5f7e180a1838d68ac06fd + +Input: 7f093c2929fa050470e227343eb4a8274a92d42155940d85fbd4fcd1fdf8f1d01e50e43cfa21f7d46e14de288a73fc3553d6b1f201715b817754874af0878ef56a519a37d9abae25508b8db113914664be0492a2f0b68956cdf416b3007015804bdea660d45e505bda44a72126d00680cd3628f6085158edba7ac195c7e4f5bb8d680386c45c5730ce400b1973f523c8f49dcc4c5fadad50b639e92ae64f0d332300bd57aee67d623ef0deb964d80a64f64ea6ea6fe79bfd419a724c5314da0a43dc44423cb308957e9913ace45dfd14fcc25dd37c8af696609b52be9506361e325506ada208a6c61d8729b41ef8eca78c9040262d3f002ab6fc260bb66cf44c25e752f5e7f5d84537b6c96bd6a8579c435027652199c639551703802366739ec5033626e15057d3867608198fd1c190678afbc72e2f7b0bcd2541e9bd9ffa0664544a1f61653e9b06bee3b623309d5fa85cf398fb13246f30d6dfbe22ac94639541192df91b18c1296feddbb8b131 +SHA3-256: d9549743cdb94a921e60f3329856f19492c41f59b7da8e5f48db5c82e2871b94 +SHA3-512: bc09c36b30a5eef73dc56302bbc8729e708ee78e3e7aae2acd5f01e33c6a1cf32220db2b9c56de23f60ef73f47e51f0fdfdcc990bca23a5ce9152299128993a3 +SHAKE-128: 1e703a44d498b273ae99e8dc83267cd30c0fa04d759c8e6df0c3ab9291c2a32b1259892ec59cffdcede0cb2a817c9d5be473618d012e76cbbed9bbb60e750b3d292800c015ef8bae84088044be61dec55c53af6edd24f2b2ff77509e374c23757477348d9989f2becf275dc1e78bb93d6342cc2bba49a3e61ade2a65bd4242e3595db783f0c905542ffc2674336f7249f05eac7df5fe34396feb9f081e4dc33b92788101eaea79052cb7f580d3c77c4344b9fc1d5ca53f1233311a164ae9669eb02d71a64ee27b9574f727e6115f94255257473385efc02c40f513424052630fd50b30e76ef81d93d36ac5f579f38b65a932ceef0efa1316fda43660471024d03b4d95228a1014b1a7023308204c26800abf014f6f6127b0847155706eaefcf2f3c3332216cde3c1d921f34675c9c095bf5d0ff6bd89dbbe96f4067f1854422a1e3d7ce410f5b79c7e6129941da8df125efbf3da5f6ad5bfc408d8b16ad6efbfaf21ac0f0b0b48714e9d45b00d7691da76f42ad5cc94e04e4609dd416f5024296a5fee0c626b58e4ac3ea6f935f03071572bd30411ccaae53b940337594366a0bc1cb55204236ad08ae39825c5b482a3271fd1a1efa430fc3d2af87c212adaaa20c3b20dd9fe4cce80485a6e83dc79d1dc9eb4739e8a7989136e4679de327f46b7b5d29d8b0dad9ea06f59c80935b204ec7b10d78e9ec1ae5ab25c0e5619dbfc +SHAKE-256: 8e169144ac47b224d1d78e54ed095417ecda2307d0cc15770a5d3366ad86b6087d624abae8c62a9cad80fa19bff132f8dc8f586e3009af4a28ec4fe4ddf72f00ca1acb66b00b9f6504ef2be037725fb269449c91ad1d0b8ae5b905dc073f2454c11d41c8cc990bf001c874318378fa967397ba2449c5d01012354237d3145f64e9a8a01354036f5e113eafcdc85881e038b0d16a0f21bc35c18382c7d5544a9880219a354aaaf348d21844d8dd771d6e5b48cf3d514d1a55e6e456cab28a1fddf4d8c42366d9dad236d75f5373e54fc70edccb595d5fad5aec724e607262bdcf2d0ba51585450cb0b3c0602cf612f224a21d4b9a503e1506b52633a5baec5324818dfb2bd46582b11e742784f268948c7d33bc0940060fb7255c39d533d853406815968d7432c5c529a8540e998ccdfab1f5eb58ce3e808fb722d6f3758582f5d2ad4638eaec3b7b9587f633d7c05c79eae629f00e5c31a6b67f0462331c128f5a8c6f6ea5676e4e7a0b2d5949802b4a07e08bcf93f2a8b426238d230e08889ca04e491c28820ac6825a33deb6146cd04466954a713ff8af4d4a1d1c8a9d873fd78bb8bacdcc2cddf776c7983eaad111e1e370662251fa0df1d5c72ba8a39168810bdddaf0a4037dd4fe0709bfcdc6b1d8a1cf24544502417c7a7a96cd8c2c0eee3a49397feaf1655c42ec5cd40ff9cf2a325f78f6a28b98d37bfdecdb652317 + +Input: 79f55736f6eb47a4f6f08c34f6bea1ebaf3054ba3a80692ae16a33af62b72a963c2a47339f57df99cf4b3f2b41d78ea21ed13d110fc097f3aa53aaa665b2e5be83fd22f5c62b63f9ee7f34f399322b5508571c18e37fedb6865dfe8c23be63ff12f117f5d18bf1b370afa431fbfe12edd271d22c30775141f7ecc47502a9f8871d5001ca73c15e2bdc628746c61696aaf3df4dbd6efca1a25014582683ef1d6941c6d8996f710c2711d86304abc7ba96528f57706b31dcfff89b2e127e56582159de8ef5a63def90b9825f5bc5797f7cb5919d5d451110a7cb6d17fe58e676e3b6a2f3089e686af728fc1ab62cce004e228a04f7912558838f90b1ea358394ca872d12f1dbe43be383308478c51628299a99906ba6d879ae8231f2966bfa035f17f4a566a9245e5f48a971458c2b439854d1a0183c3d9e9a5a9c03beda15f4dd66d3e832004221c2f516c2fd857a3e263b442419a9ea7ad3171bdf55865169cfb18dedc221ae11b4f04fa5f074105311 +SHA3-256: 350fc2df4d21bccfe57d4b3fa5ebb4895b34de715e360d299e39f76149a80870 +SHA3-512: 3b2cadc5fcc078f3d246ed4919799b35da619cf8db35ac731e9e6a2ae36ef8061c080bc44e62e7e657618df83607f651c5227c6992f727486788c22ebcc4736f +SHAKE-128: e1d159ed87c02a784fa248b430fcf6a26b7f984046c83c16579b6b3fb2f14b1273a80fdb7d07187e2a935b8b121c389b92f647ce49f2481f944b6d61d763bc961369553e4230d6570693ab95e41deef5d2f67a80b3413425e71767c1853ee25c2ac02cc14844024ea2fef7d55a6c345b646b9a29d81aa9d3dac9e5ddd0efdfddc732b3cf2cb4f603cc99fa8a7fdddcea891aa9fd5e78afa5972502e9e351f200a67ae30e76982482dc05f2aaebb2d42f188ddb38ad27ed177d38af420f48be91cd3b99e228089e83354ea30654b17b13b7cc141bc3d732597f4e74b0e7f74afd9b8a0410a1f82257f548da8b5f41e87fbf820cb8fb585ae62e63b280959c2952bde1c8ae816264f7673ffdc39d2a215aecd3edc47cc15e8cd3290cb26c39e7f75ae57beb8823c1336dae6879c528e7e5cb72b97bd8fb5553b0722544e1aafc74afdbd511ee698366a42e9aee9a51a93c3893e5b16f05da5aa2c758ba0218a54a1f837cac8bc358ea077cdee3aa50056de3854fc9aded4d9ae647e9cf3cc152c7c41c556b08d9d094c109d64a831c7f956926c2fe456aa58952df717721a2ed3b17f0fdff5bdec760ba091b9aec694ce2c1eff2207df7f3831bf22f8385ab2fa70afc78eaa7b2054b37f324bc1284cfd89d56dc693d8c81a2f620b94e894b1f281cbd90602ccb87b36a257a63755829eac9053c36b6a710fae4486a76688feaad +SHAKE-256: bdee6aa7b2eee31398991b9aaf2a0f660917dd34bab28d653fdb005e983ebefb571ae6f056399a43a6af2577fb0a69d5809448067c94dd5e7bb44f80764ea84f02c454057702b5d47ab209224a05facf2fa9b3285f23f413c4f21a877644baf4be368d391d5b63763192561e924f426850ec2e5257e6547d3f0955b607b98e58e8a3ed0ef7d096429a5f5dedcda71d1966e8d23c2e3e6002754c99e612fb719fe0e08b4ab2cd48539be6fdbc4bcc2f3c5ded25e09b5726c2646a553a7693ef8747242118080bcc8b82d839977369ae3e09f26c212cef8b453b995ae4a27b4b2cd555860ed05cac5681efd7458ea70bfe04a75446c72b2f1e489de672a22f285afe519838a6640c241ac49780a4113ea314b25c644f6a603a3d6068e94a896d6d876c05691556f8f6e042386c12f43ba701c5e4329331954613a44bc743a4a456a389dabdb9f4db2291c1491d8b1d822f5a5768f2d2da7af7b3681b29610f60a5ff32ccd68a82e47e6948b4f2a2eabfce99ae6a6981deb09101e13c676dff4deb9790f240fa2661688a3e2d7996636e47c0f7a96533df69a2f07f76f5c9bb0f4293679a45b8239a9a5145554d960a7c3370c3ad2d102d85d90f96fb8139eb060a36de622aecf8776d390d80ac0d93a1ff81ca43800aae57886f187bc680b53aa24c1244ba4d92c64752144b21f4cb4499c6992e3ac11e0dee92fe5d8fb41a35ab + +Input: 3e7a0fda6a530ac6a79b6645f5b04e28e8f27f17274b0eab84c27f0f7a9521ac3644007e3c7ede7f4140966fe107763b1f1d92f623115ffc066213a937b7a527adf708a5e5134115b0d5ee592197dfc9b401e22a4ff79f9316d8689bdbd240fc7ecebd015188a0e2b084dc20607dcd88c5b739da22f0ea862c362fac742068f5506711cf225809538553b5c3c7cc03554dce500aa08f720d58d56b81245ec830de792c3c418f3b091720b2996a668ba187e1119253e8c64478ab988cae8b216caa90256d27a55971e2daf78b49db7f62862005e5588772617b1120d40c48f358f3b2d02ce6201274e3c0308d4e7b64e6ae76b4e9a3d899c87e9d04691ff52461d4ad660c9d582e95cc56ce5a24c50f19d88138005f5ca1d5e1b086065b885933f05848b09c2ea12e65c10b69e821097f0b0b2c0a5eb627e7b14b0976cb67ae52ceafc25b97309c64f7b65f82e3f1c61dd781eb6c26915b907a8aee14669b7350a8e7628e82b633e419fc7a614803e1f256 +SHA3-256: 1c0b5de0794087103a9320d6aa49834db340addbd6adabdb257dc5e9edb29bd2 +SHA3-512: b4d63529d9bf830a5b001ab4ae8fbf7af5228dc07b07c2b7b98e8a21b89700418d5ae22c9182b118078a27c80ee81ddee3fb5b907d56b60031dc9ed12615c3bc +SHAKE-128: dc57451c5cf77e85ad4d2bf4ae79a810708bc252ba6ffca1b1b586320759d11ac55c7ea5d555f4acdcb74bb4c6ca91722c61a4a873046c8f018a15c4a4ae0920b289734e5a3b44976495f2ba4ee97bf65b8e9e42f3412809b8ff12f0f4b9b989de40ee79ad429fbefe6b81f2606d2ef250c0d50ffd2ac8a3be3761f702468acf9af0c2a12890592d66536cc908b5a34a768ea29c57d3e63a395f4efcd4c76b4c188f1ee621a67184d38e7b5ee6d390adac0ef0075afc5b3230bb9c6a17d3797f713014c02b6b9060889bc21b3021e946a5d1978b7ff1fc418679b4f3451608f1cb1aba35d94f078094aee5c89d3c61a782899a6f8fca313de96f7df42b106a87ece413bf7a54df5ab916540e21346afa83a4e78779b2bd86f07d7487af3eb8e6445398ea05375d4d7be10cffb64675d5e1993997beb9e53e8bf555e92d06324ea7c3d10b79b32de2a43a39740cc3aa68b667d8eead4fae011dd54329f8033348f9455d16d9482d266032b4c5d818f2b2460748e7316e943497c927a18a686a21d202790f0efcdb8741cdf4cc0fa6498ebbe5a4943087b94038c398b0c0070bbb010ccfe7b67c6582e54d342536394eac1bcb1d0a11e9e7ec7cbfdfd9ae0305c4b6a36c386f1bed3120b5f7a36f153bafdb6280a88554c329bb25dcb2dcb91c8a63fba7fa9627bec86cbc513ad6a65b42e58a4dddb6655b9a71d51ca6cdf37ced +SHAKE-256: faf1b5d5e774524da28933c3239f1c1f17ab48ce5e5ae28038cc492768589c7651ad97029bed08eab761eb06f6efbe8fbec3a789bc9adf91a9a8055cf480b448cf3284f588c84b36bf93aaa0e0cbf7967ae1b55d30b7d49a9b126fcf38d25873c4264d83fbbb908b8c59c9041eb70a2d90364c018858b8c178baef18da38f4e2136260ee9bf16c6fde1d18164dddbd74bb70c75e6ba24b9a532e3b4bf58497b20b0392ea27fb150d86dd9c66e5d9605621122e6ecf45bf7e5685a1be5d870249b22c19be13699c50b07d8a43d90cf535985c8bb4393cd2ef64907a443ab71751931bba92e7aa0e88323a67fccfdc6292061a39b9ba8c08d1840e078859619363d28ed3f36d3232281e3c3c100db8cb739397470c9a3e7302aa54fdf3f378c58a5a7deb52048c364e16ab08079bbd20d3834ef473f259330df12b69e0e8538661d440e84e5680aa679b65217694174fc81b7a502b4b33245a7b22f7e3d562f7e17ebd170efdf5634fa970d3a94d3590ba7d54ed3b5ed07e8d3bc6b527e89fd0cc6d9b1dc29e3203a18363cb170f6848b1ddb91ca66083f1763b61388655c4607c583f4e34d6f7bc753297fc921a7bcc602635818c8954ba92a8d491a405dae236c33c9d44e487d5827613160f7fe0a5cbd8c8f55e98ee645d4d63c32efcf387ec2fb272f3b09a2a510e61fc8f0d53c4731e9beacfaa2e86e6cde3b0fdef146383 + +Input: 53051b8b4fc5a89ab0c20e27f9f718c47ace170b6123797b82f83d65506aff8aeb2f8217b074310eb2d37d2b8846166ae91713aaab668606253c79f6192a48f0c241175ea161f5078f7c595c481c6c2aa9ab64186cc1e23fb3e5a5ed4291bfc90951b4d501a874656302d3b79a9bd5c913d8a9e58161a09a2c6987b629d1d5caa18e023a8cd2525e4d23f960d74a732f64650837a8a496cf3c5f9b7362fb15c14f86ee30d7f9f4bc91554255bfb83f4c8e866949e42a154f9958d9d549b2f347b332ca54d61a88c22ebc3c8f3db75896bfae01ae250e2c03e9c4ceb9c9fef26947175394b3bb0ba80a27e6ef6aeaf4ed20d5c7657f6928d2e5157d3a6d35038aeb70956859d11a2c5cbe7e98342284e0ece2cfd33f110753a3e7fa914e74d85395235258276d105000903d6b86c2c4a45c42d63343cda1ea676ef0b800932f23f180dca17d1b2a291ea5dc2978cbd060fb1c55f5fe099ab871f318faf296681d65470b4de026e00e7fbafc5a6575bd7ddd02 +SHA3-256: 07fab39d0e356808aecd2c9de72528d3f867ef599e7fb8cbb94051c6385a726e +SHA3-512: 7f863b5ebf33ada96fc5919bc92bf9a65ebd37cb6fa51cb1abf832116a9a5d577d608a45683e0d829cbe36c23c8d30e9c4a1482359de9b932ccd74cc34b74fdd +SHAKE-128: ab93269839b28a7a7fda05d4ff918745f06538bee7caa2ececc062e0eba70c635d4d3dee9ddf76894dad964af32619c2047afd4bff765628814aa711b5c14a4d4d8626a83c70ecd9c13dfc0bacdae25c74183456b19a743fb4b6da6aa4f85266ce807109b73f2bca62f0a5014be736e1a408cadebd8b73c5e2532485a7477e63aa45cd124029172fa2f3925aa5178e18c32674d487524fd9a765f986015ee18c9e1d202f8bc1637862ce57698b89429af882ee687c140b8af60cd1bbd6e5678b58218d4dd4129e7f664fda82a93f2f68624c2eeea319feb934407b5a7d428007154875a63abd0f8645d2fcb12fa776ed9200c4e8c1ac3ffbb165e7138fe6ca9eb181266cb0e98d1773c1c31055c0c356bda45185205f2016f0dbfd4d5f47c9c9cb733568f6ef3752b0fb622ac902b19b635790a3ab32e401fba8c91a1426f8b11a26de92b6ee475678f63a27e59b58f91dc03f80457bcb987a4698fe04c1705ba17dae89096db3f55433de4d88c943ff9df0ade0d568a658ad392105cccfd69d62513f91a4ccae08cbfa07074718717b9777a7105ab8f58a7ee26a63035af912fb6268a1a2bff91e3e4928a75de118fea3a35194b44ff7979722bdbdf12741c1aa213dd6dcc4d714364fac0a07dc9278b2470c69de469698717f541eabcbb2957899fce17fb34b98112e1edc8048155ff5f66ca72b974412cce156b69f8ac8c1 +SHAKE-256: 8dd6e97ce78d1f9157aa7a45bb308a3cf873f6194459454c04d7b58608d472d71444597de1a9319055bbdf499776fb70e9cd1302832f78c3a1e565b91fa3d18d867e6cb76251aece710a1532057de929f1c795a04a098f66ccf047d8e31b75f983b4c8f73cae36d33688556c70a19e7bbcfe4d76cc9a14fdc5ff166f7e0ed34c7f0f8c99c8d08b960ecf4e3a7339191a87df0b97c87488b2019f03375bbf1a39c6f867008e364e417b4a8fa394276e34bc6ebf3a0f784b14fade577016620fa655ddc9aeaf2ecba970c9cbd1f88dbdf1e3ff1c703a2774ce2a5083881ce7e5a4262f38cb263f665d9478efbb5147ea902b2bfecff75fb24947822aaa27fcf1d14eaabefcd9e0da31a2f330bc3eba770c6699133667807f5e99ed800aa3a7aa5d271646c083debd9f6f3f903b81f3ba15773cfe01c3194fe2c6813cda2cbee02e71bfe3f4b1a7689eded73ecfbd4cca9a8bb75ec25566804ed74f97914f96c418ac8e3315994dc17452964783c904a8043e3cd09ec7cce5e4b86ced213c51bb69b37901a61208821ba37721d6a0cf559ca0ab2e25f22f12f4577ddc9265bf91cb5d3dd5a3453b5d5d626bc0c76af20c8ea16c31d5543f5eed64f3cad4d96ce103d1f093e5fcd51bc38bcf0bd12f092e4f2f904a575153c98306269a583c4d3e772574279e717a8aa41a0ee1ad74b1fc04558fefb2d68243c72d4b8ea49139c5f7 + +Input: 1db4d3cfafb94e067507938858fa4573864709efccda1af4ed62250a1a7c9d70c6c30b1e3524e961fc4dcc131b37de34fe623678a39879dec86515ead0683ad4a6a423dcec529465be9024459a097522ba904f1437f01da34bed989a2b7b82b9e9983ff17d241ddb707ac653900f2f9263975ad6e94b30d4678c6b00ac809ac9e5a40b6b0c96ab1e27c5bd0bb8cbe05cb979a340e5f46e501e2a55d096ff4a878d9720ad136d93f6aeeb8b98918843a859bda5a65c73cf38bf9733a56c523bd22eb7005f0679a3c5bd0ad776563bb2e0a4fab8af45c60664dbbad70c3f4f3f6a3a443f85a67c96a475d131f95c3adfff2babed90a5677ea2c8fe6c66bcc06d83bbb8b4006704d5a7ea1173baef6042a826d150e7fb0b8986223afcb3148ee208e670d0485439d8e3355298f545cac093660fae653b72bf3a4aaa6c17d80eeeb289b3c1a93e3ff8e596d589cfbcb5f2869b7cad1dbd3a9e434f51e72aff6ae2e2f10253d333085d99e89e3d3d264627128a064a +SHA3-256: d4e05ef94ddb47885e96aeabf65bc9c53ebbe65d9c85ea76cdb6b7eeb9656b41 +SHA3-512: 4fc7ca976cf3ea1836c15f4e81b7c85031833f4781b4a32eec1287daa92636462bd1547f767257619e4248bbc0a683af687018a3e0e3aa883a339ae93e0bd636 +SHAKE-128: af93ea7701c49591fd65b0dcc4a2f728072728b8e7dce8c06173f481f451a62a8a5054b56e4daebef18a40308b8849e556d646f4cca015ad87cf09ac9dcf7659b1c281ffe7c058f80339a4879146ee9063cd1b3bd65835540b1cba47667e358bce6551761c15374f651dd4eb4a6c04d3c3e544fa6f92911a8f77382d96a0b25ce9f4b91ce245084d699b6032fdace30a1ba21f1123a625a09c5ddcc3e9dd00784f9bc2d8a85798e4c6d51012df6d013b6132e51d030bf85623119889b1dfad4935e1bce70f34db6590dce4b06d264b4c411ae5b17794f1997aca3a982bfbcd8608106c0447d37cac40408212b351aee54a9c502658771b8782cd0c3ecf53b8501f9eb5af4b2cc1b7cbb4f7d949e26cad2ddc9bfe7319ea4ffd4642df066dd7678058222ae76708fbdd12159e8d4a797d7477bee9e88cfbc938c17d148a836827c99edaf3b2450350038d42b68dd8b691082941edc6d5767c720491d647872094063964365f9174b4d03e0407a91398461db6263b49c49745f868a615eeb53712624b342d2d55170293a925bac930463c58ea51622a7023bbfae5d3cd0cf5051ca5fa0d46b73e8c7bddbecebeead3f4d0bcb4468bdbc5e5afad2ab384aab6357e071417b955afeea3af494d6a16acc7cc13a93cf496a0f4491751d340f98f3a2e7eb54332b6e18cc4ee5fb3198cd1830f32702275643df6ab26ce5049c695c746 +SHAKE-256: ed886bba79a7b38bc05c22197b3490fe46c12bdd2488084ad0942a0752375fc4da8df0ce393cbda431f15ea02abd514a1ca2eaf21ebba072ced38a17f2c39a8881f013ceced1b6fa05db38e7be395d0a569b68edff474890ec8f125afb9dfdec83e910179d93362ec483ad30a498ca198f3e84125f1e4adc81b8bad82b951e948b4e8f84aa1d0cf7a32c0d44d40933ce587d923c943fbdbe7c22386a7a65630566dbe8d3a129ee2d8778f87c9ac5e11f083e3f4ae3c92df2ea1b29e1a5356bd0a9c0270a86b8022d480282c17e0e23c9ffb8cbe74cba309f6bc151c607bdf3e55a4d4be7ed2f23f84d3cff1d3a422cb514fb14e15deb3be31adc3a3c0e7c2a70799c4e7339b181b86cff1ae6b04b9952fdfdc1a29aded29a2cc44941bda0c38b98b26f1a0f42d47e4e1bd2891a1dbbd343c332ced96031d9ea91048c504cc3b6f89fce428e3c7865e96718eece7d60d037ff1c7317eb0fcb12a27a05739c50aeb84caf7b609ff2ed638494cb1b65294a817e0fb33ef5daca7260ed770121a8f20ddc54a426c0ff9d996a23400a038b90a1f7b31658e6b15ada3417741e9f21c4767a0fd6e3f212e2af1ec14be99ac6a56f3c1d0d0cf57a8fc9519bd059324d85badf85caeb4d4363cba6f3fb11558ac1757c867c450f40fdbb6dd9d5c7a74ae1294d2f95cdf2d31fd169149220b243b15181f9481fe58412e3266f3c77613d14 + +Input: 063db239fd48d35b4cf24be7205b004e04595611e82560e49dbb5dfc3d84edf8fc34eef2663cc6c1fecb4888e020c587cf0584b5fed5aa657e879dbd26aa04ee8ece8969b3ab2037e5d6525ddabf44dd65de734edc59bcbb729f40cb1e093125ddd035a9f65c6bab5311ea5012de54fb851b52face08e9ac16869bc7c03297c1013facc2c5e41e44e8514ef0cfc5853e64d1ee4868900f8b4dedd19e0b5670dc040c985dd131a2605f4168909479bbb3cd3af92a77ce7b2603a221d898b46a1c9b4ad696cbed1da544d3ea45c2375db6c4855d8be80ed5ad0a4b392de08477de3015a9a591ffc1f9cbf29606771ead53779de65531d74f7993355fddc00cf49a1f4365a0c8a31c318538fc75a254dbb9fcc51664a27174f9382952f0791c753bfd404940cf200283807afb7168c3340407103c756d400cf171efa84ffa3d2e59ef4cae152effcccdf874144815a8bcc9f9e2129306c759da903e512ecb61fcc43c23facee1c8129403d98897f5854d1cd28d9f39 +SHA3-256: 553d970562ffe3b686c6f9af1453aa2c0b2b91ffe9f668e07fdb4211e0938984 +SHA3-512: 117af462be8ab8e8b5d88504208761c7aac4a8e0e66e3bee6516c87b40dc279ed08b14b6ab241fbb7d2fb025150b30da31600b8f485657a9acede8272653def3 +SHAKE-128: e6c75ac15183be41f6f582d60353ada52365ffb43f6cbc9669ac59409e720025adf5d410feefdded9b34ff65f85739ff362cd55d7da2218e1b46d6d484b549f8541c5933eaf470a67f6b4bba6fdcf1e3bf929410fbf8316f13ca8072f03af9d364cddc763826a3c8876555413a008517b91302fa3380bf15a34b3f904fbb153660788954f8cc31cf9a67c10aebb710713f3580fa9d2f2a7e3476d468855c8eb5c60b5604d8abb210330842d40c77294c275fd05af821778b71446ccbd2e00dfcbf2ebf21d31d84fc5eac3725304cfc9841c1a276a9b637f0481d2770b89d69c574cb9e558e6b163182e13a9a1f2125ec84343799a45dd3a3d49ca27ed7a0095eeaac6189a41016e8e2a07bca96320ddbb90138c68af46c9ab23d4a4e27a09a6b6795c4f36121ca7041dab7cb2d573c5bd2780fa74b9af1e7509afcfb9b8202615481f1b7cd28a29d486cd16c04c6bbb499a3788c66fad80bf83b7a2f6dcd636ab343dcce189509de8997ca43150ffcb216b2db81e0303c6710a69fd9732921372daa21e96f0c29c4e406cccc119d6a8776ae02c49b0851af603832d77a9f341b22d5de05c80f3e7e91717b6eef311ac39b1ea4a2722e018e07ec5180b6cd8a63690b84011204993bc3202775935cc263342fc2ba56cbc60eaab55e054d5354bd7daa00199f37e3d218ea39a067bfdfbd922aa264e60d6cced3a85cbc1b9cd950 +SHAKE-256: d4a76ba47fc4495f0e925d79415c7c693a9a0a0148a9d83a7ae9e1da36284780272dceb6d1c4c08878bd1aed15ae6876d3267c4f7aae224485308a687e4b710db5f8d6beba864259c1382626992b4767d016f363425048d3e06b054655dc9b9dd625c5664421279151815176279060bc391635d7f838b998f6f7d69e14f1dd930822751c98d4d217a1840f87532a414f0733bede11d727cae37db0d71d6e734bd1e68363209a518e29cfff65978d11990d0f264fd46c23b4109721ec87d387db320c3582ad254bbd618db27fed5c13c1c46fdc6e8667f5f4ddba233f098c7640b48b05fef4a33bb2a3abc8515e21bcae94ba856857d325dd24bca610e33a87883e2b9c34fc628e95d0e936b0082cfbde06bdadbbd70f11d05792aceeed87e91138bc05e0fda08c49e7f5320d6b8058d40e48a54364f2499f19a2ce4892909c0917f04cad80ccdd95bb702d60666102718f56b606b5759622f0ee9ccedf9978c8ea91137c0f4dc6bcdfb82dd9e8b711a094029cac9b44eb1db64f203b3c0d61392b3b65562e64baf3c1033122bc980ff6f0e7006e67d24d4f383bf5f66d0306c510ba8c6c80e91eb8ae291df7237e9eef366bc23926b8bcc7a02622c8c2f56606a6a6817fcbd618d69549a4aae4a06f29e55fb590f96ff930f83724c1dcc3780f37bde595ed3c476775012e7a6c4e42f050def7c3f31e5c6d3dd49d034f515c24 + +Input: 273af4b52cb785e584f5626ef0c2693b5f6ca3f1ed3e533259ec2a41908af89026647c1a548248a96637c4f4bb965164780bf94c7e19658d6708ac350186a5b9a622369c49926ab3bd52eeccdea6ee373947b71beda633a7d073ca00925a968016de2fa0cdf93c845dedcd860db0b2d0713ff4867706d2131589da3dd075d12f9f4cc0718c3e0e6df3043b7f58350063fe741fa5db4d1cfe618cf6e2f2c1deb46d67b9acf1081eebe8b941f90500180fa90f8fad24143338c46a06b16195a634c92d5b5d80a19fafaa2dd74fde5decfe76722013252496bdf51ca2e098c1a41a9e9f1aff12827e548d37776f38aac556e60ef18dda9a8c3f3bd41b87f8300430c455b6ca321920fb6848e1156cad7eef650be77c28d67752ef80753fbfcdf5ea694f37704544383ff55208f22914adee265e5628f785e66831759787169eedb08bb0f8da8dbcb0860eefaa53eab0cdc4a07312f33ef830e3d0ea54887397f62a4451ee9c164d0cfa544be3cf05c18ea4ef8673da5f +SHA3-256: 415b8161c4bb6c4819ec92468ffd5f51456742a1dfe9bb521480f2f66d83eb47 +SHA3-512: ac3a70eba484017b27826d1b4a244e51e183e25adef57ce868f0d40607a9fbe1aeecbb6d14c4f43b8b4e61ae23daaef16445ca26a014f9ba9ca745e892fef13e +SHAKE-128: 5e14083b9161d5ff585c5a726772814d9178e63d4a3fb18df5c2fb8ddf7a4792b5d5aa6b5f3db662a1a9870e5afa78c8a885b1e9ae260c8a3c97ffe3324f03ba8b8bf9774b8061fa4d425e25c0b265de94d93c9c3f5b645516531c69a29390f930903c988f4f53f6dc40e4c58b6c665e0a8559640faa99509df7c97b9d8e6cb2e33ee5fec3f6bbc00d92f38830684643ee652580d75dc434f43c60c63bb63fd1f7817901b718f149038199322d646796e2fe3ca358e3c57fd521a96f375180762dda5160bd7224c35ddd1fb074a910ba637484f991245fbb1aa4a39504bdac30bb08472216a3c56b146209ffd13c2cf2e14dda96d09bb05c20a815e0da8a5cca12a6f4966668b06eff7571449c54f8143d05c5d711377f9dd7828df1f6f73769f1ec9f0d04b5dbd93f0bfe9353e0be5c93f80be106c708fd949f94af1559fc6131f8b34ccb8e0df5fb21203ed94f9fc05a5d8436f2ff6c7597759b4452f76485e9b5c1b79a38302ddefa58bdc05156010fb6cc1530aae6cb64f7e7d65f5ac4cd05bb0b9a9c73888e643bb8ece017d1e9cdabc9d2d35d8a40007a51ff039803ee6d32eb1e0636be5425269d7bdbbf4cb0ff09efd74cddb3ada1fe2ffce90b91650ac1fa46a8436163d69fb23a591d31eb89e8e0b2f0097dd535444c71568496b5aaedd1000dad3f69f4ecc6eb5d88e939f1048af55bece64871ed1cacd2a28921 +SHAKE-256: 9b30baaa96a20fa770686ff337a11538d18c84d34e0f44d3c12c19f5bcf3bda5cf767909d46b3329cfde7f8018e146691f64d4a7854a6566f233d8a3fd85eb0b31f2cf3c652b741a857803823519afa6b94289dd85a2efa92133320ccf4bbfff1f2b0061b25c47e8e924ac3c99aca1f64f3346087d8545b921234f96edd09b7dc7f6acb3742b70fef7f64a4f1d8dd75e47b5bd802957f1369d99a3884b197e1fa16e82035b49132083876e6c78cfdca3a20f5ea008a529434d37be7c198dfcc60ba7edfac3b4dfc02c0f2c065175455188d633232aa3e060752a8b7fd0e0df58a5dcef5e85aa0b90ffd68b1856d41b74af252c3a840e78451b395bbc50948d7a2299779b97ba312d9dedd893c0aad0b9f59f6f0618c007bb3a9de18df4b9ad0a5a6b759f5f4b99034ca6928e5f3c6666d1dfeaf038751eace2a8ada6602533b20cd4e11b77d1bbe74fdeeecbfe51fd7435b3644110e6a3e2b35eaa21a06cd16731d5515db9354b4efe2a2c7828b0235a623d2c334c8c70f6d196a798cfbe2df2af5203ba8ea0ad4d9bc72327031113885a4edd0bf15a244c6ff774464e01561caf1689092d0adfa719d150478339ed8e927aa9515858bba9e696877e492bc832a601b4d16d51da4a2aa2e0850f8291cda4678671ec600f3c68e83d5bf39eec7bb03b5648b0fbfb58c1b24522b10748151da559cd5b7352e6ef23810a4df5d914 + +Input: f233dfeddc26b55516a7279418ca04fee102752e7fcb74d1a7def07d60cee3d52edc13921a5126895a6777ef439d31902edadc9f5352decb95912b44828694402b2ef67816e36c0a4c4c3bbe909ebb467c4408b2c2ff9ee6d620290e484255d2e0ec68d5c46cbe9897a468319dc02309a32d6c9f827a79265d43568bf439b655b9993d50fe74cd4b931424e0741a99ff72b3fe2d8cebe266060612b26693fc6f2dcd58a7d34d42469f742add897179934eadfa7af8b198a57bc36748a74c374a3ba8d224dfad4a2d5dadadfafdc4e1e2f99e9d4d5b2d60823a861ad4b5abf85fe6a4bb16e2d505e4329ecf422627a717fad1f97128f35534cd318a162c56613a4197406e109d2bc5565d79a1914b406466f3562e0e519f1ec4959ee69602534cbf3889250ff91d3ffd1dba1af06995903fb7cdcd443d0b4428786cced5912099eabb156bf8b53850c92ecd44a3258c2d598eb004421de65a7287ab80aceaec46ff859bdae0164fa91110fdee6ae2f6f6caf633d62a21 +SHA3-256: e9fa38cf69a8afa25a7473bdb07ea88833912173e112167d2353e8a85c3399de +SHA3-512: 350532d93a5326e845b9615ad5c7df5e37732e2c4243dd54f697566778d157a89c5b578cacbe7162c58ccadab4c7e645f1fd345efe3ca648054cc564f6d669b1 +SHAKE-128: 029893aed5ba190c9bfa2d5257c27c05278bd53f1fa9aed898cba91fb62b50baca41146b3dfe0bad9bea6442f7302157e3f0e1ae553d3f20fe7ae0af5eae1d04ab5c649df00ee7c7e81593ef7c590a3be261f8b8f757c7e3e0aeba511351a42ac63aa848b0d1c17e6505153eb3a580b56d0d0db9a7e6f2747d9ebec9cd1e6183dde2433f40223ce79997fc435c3d8cc7f73ae0ddef427f23c7e665378861e904e56ad4bda8c4f614ed1aef37c506e091f1d24f4cf5ac4dbd289180dfaf95deb1c1949c62dc42788e50c135c5334be1a50bb81bfa228caeb45061ff1d96b1850dfe438187daef7f4ca5db676fb4cdca4717d7af3b8ae235dfcba287f950153daffa1ad2782e7f2bf7539f451d398758b1ddeddc20a156029ba4e1f225b3ed0d5e2cf86b36a4c52ce8233fed771053315e40f0d6ae8433c0208042b6200752d91d214b8ae6fe5bcf7eaefbe00edf2b5757fab27bf7cf79bcbc6dcbf52144c9084db89a8dbf8d729a2b72eeda6b95b7fd2ab95cada881c42edaf03f971080332d0a9196182d3781f61564efd482057e8bade64b83f29a503a32abae813764933f889436da8e8f1ac19e8c91521d095fbbb1ac20c9e9cfadf4172a6bc26c211442b26055c557d04120261a5248688297fd2dc034133bfb8cb28b559cb023439224c92ab693cac388c12d0a59ab0f8408529ba7775e10829c44359666f0d259fc854c +SHAKE-256: 2ef6f572076dc81fc29646f53f39fa9f1e581a79e08ef72293f1c53a66b0e52fe3edd90fdc732b294901286f5dfa3e5001c9d3e9aea7bf186203693eb9c0517735b6c51ad6ecd02c1b6252c187f658feec33eaf65f325e6080343aa66a9425ceb0098a5a882bab968b259c7f1be04ac65f72c098995b1ba55f38049461ca17253009acbd75b6ce028cb29db87747417c8bed508f170ee71956ea5aad3bcc1b9a5713a6bfa7c06cb98ed769e976cc9214e185c748d7177db989d718aa1ca476fc2a41660bd9c92802a3352a55154217a2a44fa4082474421f40bc52a6ee8e468ae0ee05d9264a9327c628391d90e77512b81d5427c2fc380e38876713084a3ea46f0e622e7943bada9835c2f6082e6831e7c316f37628fd1230cdcb0394aad6d2d4be0f7075824f375a4b446359035514c9f5ec9dadc58050e396b80154b026477573256be53d86e7cefe387062410ab766c67213f7d3d37ccddedab30cf6c022826680b66e4bf304859a74e3b2e2bb361577a6060912f0fe1cc394b1e8cacb8c35132d998a7ec336908a07c052b061040b1d8c4c99a5cefc71e338096acccf1a309289fa2b65b201778ab252983e2e713a3719950549c64a9bf794940f0b8ddb032de080fef7de10752de2cdde8fba483fcc52b592a97c89e289814d1d674bce5b95e5999e179ddbd8b03fa04cc9cc2342b849855b486cf2003c1140bf238701 + +Input: 6466b51f6591e479624e49209e2fbd595678cff62cfd4a5af9e2f26077396d602f4d0356bf8ad612f9b700111a5128e6a86b10bebb56238992a98867d2f93f8bc4bd8dcd928201f51ff85f200400e19d77d643a9948793e2d1044f608e25315930f8cbb09c79e08e06eeac0d6ff30f44cc781cf1c84a4049609d6e1d447797ea110c561525a74249f999b6fc58e863aa3a514dbbb6350455395a1e766a936e00259c773256bcc1f6fe6ff0b3b3919812932234839926032397473ccf185fc45c112dfa5c0f467fee251260c42a8cb60e50332c273b07f3893c7974f524116b6c44054d704706a829394678f38d06fc7613bd6418de1e83e8d3260647bea6f4d21e111ccb33f9b6bdcecf04ff47d006e31eeec3574cc9b9a8441515296bbb5d5ea08e74f4603ec4f38d98b9b98c57774bf8b3838239f21a21f235bfbeeacffed08bdb517cad9ef8bbc3f285f5956b8e21f1d2844698618c3e4033e1a2d2c4166c3413bdded6b8a30e2278719f9a159527e0aaf34f459cba +SHA3-256: 63518e03bfd81240756a96a681514b0f6bd6742986fe0e92b47b570c15f7a821 +SHA3-512: a7e1f722fbb84ffedd05ceec49c812f8e80909e02e0416be0cdaae37d3470d41bfed8c1118410b397b0e27b01e453bd9ca1cb391fe4e2e0424f242e9852cbdc7 +SHAKE-128: 7134614fc9f7fa355f3983ef4a72fd3682afe10084e71503f0856b37a8ebe18471351d15c271fcae8107b4bfd45d15c30f030ad3c50e119bf20868ba24df8f8538d05fca103401617bd083ab015521c8594a76b368753b0a379d7db7923271127530d11554a389cc0a7d45e708f0dc774d94cea84ab6129b9a28fc9c44b526cfe0082da8fb0b60e83c538158a43c32741326362aeb0dbdbbde5303848ba320f6fce8166cf2a25dccf9a81d69a879eea8e8f0d564e09e3c56c72f0a6f03c9a286ec9981c58b33677df399cc866c79c435dfbd77338d0de0034e14553f85b8c9f0dac710a4c0f137a23fb5f371b7f260923752e8855a9b8ccb9a6523d87574180a57db35f22b69bcda7cfceed087345d4927fd065fae4d303ad8f642fdee9419b492733e84c1bc2202e5cf746989f5cd2f3ba6860835950d0906cc5e8b2e6f2076e15b474361aabdf8bde41c6ff1a48c79ce18d7902c8058f3e1dd277071eaf6d0b3d42023450191b8895fcceda16d7d32b043f8c5d25e8e99ec6d63dca9c38f9f914f096febd752512c93c6d6eedc94ce6b72ad1e84c6f58e069d44b58accdaef9b72a64770683e365e70759b635722d71091a012782f8fa60e7ded07e2e43966f0463ff50f1586a659731999bc8253ad74209f65acbfa004961cebdc0e64257891eaa00172b27db638e5c8e7900c3d2b175f2cbd8a3068a3b59240f28ab65370 +SHAKE-256: 226c7c529756b8ad6a9e4a751bdc8b140b6de02d76a0a859974e919fde99d1f78f379b9f49ab65c636ce7bfc096d5df12cfdd211f8a7b51ba472dd79f8eae9df7313945ad153dd193f7690fa27c2bc9c7d23e944ca4a2a92c6c062b891c4f409fe8b9bc54f91b65b82686b3441a12eb8041beb9780647be7e630772636e5e19a0d84735bc1264129d6da469cc120104ba2c44a471c77dbe37f7fefc01757dc0a2140bab536bf4e43c9f8e60b7135a48de9e2c943f38b2a972cfcca12933eeaa06e370c4159535aa55e8f43c01c92c16dda07e8c10e28035b66334e60c3830e6bb4e225f4f925b9be300bbbfc79e09cf24a59167aef3c2e2bca8303727becf04da307076700cc65765339a24c4d9a2b269cb169c27d1fae981d8963b87a810cc6af1882c2ca19a79e72430be434c6fc7441139237db1cd19edfb64c123b1d78a71f2ef47181752def7187a4347af8953c64d38991fdd6d6aaf80cf02489870e4bc76a6c5bae96a6d4732d42e0a767d99e08c268ea3f2daf34bf1c9da7901bab831a6d51818892adcf8c7409a3691396e1a4993d1039292387cba62311079b3445bafad5b82a8be877078dfd46587464b197a2fbd441e49f0000163232bebd5cea9e3de74287cb8e87b85f6f919e9e2229863ce2f48ebfb4134b967f8ff0c5aff536d10237ceca8c02436706c09dc2063deb3aec39c02abdfe477e42a8aae02e90 + +Input: a3f013605c12ef3625c8eb8b5c22dc37e11ac67d9aeb9005361f3d75df76e850df0175abba89663b215ceaed3c52aa9c0055555ac07ed266b985f39ace2d4e978494678daf3b0b3f00dbdc90288e03668b976d9accf74656f0ef1c6003fce1ac40e7647049788ea01b9dc82dd9b2c0106d1d38d3bef72d2d36577c310a7d7ae3b878c8838d023162c53de11e2c2401e07580066e16ac496adbd10705f848980ea7c8b2d3786b643afbf7b28b2cf432043cc8efc2d4351feb0d44dc26eb3884c399cb5eb6bea6f02ad3334e50ddc30fde9e98418f3e52edb53bddc8f15a447994dd1bbf8f1f36aabfb11ced082888757688b9cb2971f06f297afb68a414cd86a2768fc52cbb6a003808aa989a83e577e0398bcc218cd5844841d5e0348baaf7a1a36dbbd7f84634c27d6ae3a47b3ed4a692adc3b937d11739912c2d2e6d8f4b5c296cc1d2821d65f3456ec12be74d348226ac04fdfeda810f3484c3d3c4fae840ed77fc5cebda2231bea73f21dc0d0a426d1d9550d4de40a4 +SHA3-256: 48bae6a8effd7de8a539b361c3ddc763d04fb4094b7f267040cad37dfa83d854 +SHA3-512: f0e4538b0e0973f072348352e9b9143ee109a8ddb51761ca597ce9f5fa8778d37694e6effd97a65eb782920120a28208b15a2bde181eb5d7627834606363a31a +SHAKE-128: 0f09fb53fcd7742616acbeaa6bc4f633e9899c3ee11a4e0b69529b9366be341851480e7729932994c4a5f0df728e130d3c1e439d2fa3b6b2d25e264bc05ac37b4e4bc85eca32f78ed0f8a4b89290ee587402497172a4f4b27e0567b7a5e4cc6876c042b37381fdacb52688c232e4062a2d6b7bcb63212511f055149cd8bba6d88d547005a963126a362bcb143be51faf068ad6cec569fb705406124693b391caf90871c0c0f828adbb12c1434193421b30bfbc3af46d4e9e645db6675365cc8b222726616101395a4aa0fd22b4c5036714f7de18226aaa7c2bee9fb0630ad63c80442bda67645400568e80809215f739ca4141eb696da726853af41089691da6b5bf57411443da571859ee2401f25985b49a8532546261758ae72d37ffc2c9bbd3b29273672ca72d06ee84968da5f66e22afc03e460e68021b3e193e9fb18baa04fded22f2366ce444a2658d137bf6c71148dace3e3daba821bb79aee050aee6087903461cccb14ca6f7038791d3ead6b37e1bcb8f93f241d1ffe9a8c1e7cd53502d92445a174b468de13cff04b82cc8f2a372397ef3d4e02902366361f9ef2e80c942f25c8f83cc70ba2cb5f2ccea050a88ec5a36aa69cf291e5e0ac263ae9e57c6e7462567a7d24aa295dd3cf43f5e4a6cbe0c9a1fb418465c75ecabb15da54bcfbcd0cc5a264b45d08d08b33ede8dfe22ee836b51f8fa59517c50b93ff131 +SHAKE-256: dee56ccf964425b5bc52bb6143a06fd786ea401f5342bf453bede8f8baa42b3cdff4e63d636726d05854099cdad117112a93f18a2601968eba0bf60794e824f8a90f67c16750fcf931f1d40df040aea62e030fe567542cc813efa9be7b299399a499fbe25c28b2a2bbd884abf1cd7f9d1fdd7c6656f5a6ccdab04e12597364dbf536239042628ea618a63bf5bc7470d27d67e77611c0ccef7d28580c213f901e254630b09ebfc3d17084ad7236a546b5e821ce804ce59209fdfd61a8a04de07ff2df29c4648625303df7a34d26c0ab857cbd2ad8047981cb8a03fa688c4e107433e552d04df07ca3ade2505a19aab14ee7c77d617402c30a06ee33bbacbec35e5b01f7163fa8f801d63a741068d2a324ffcc54064ab00963eeeb55931de38b7837181cb5f784cd1fda72cd7add58b4e06ba8dff08ff42782e851b7119b0c69a68abd186be8ed8ef40cf2913eaed9a9fb7b3e6189e8d309c39d37890d465d466a77f66ccf155efc84bcc23799170e7da83d4a467a663e51a8ffbc78e3ea27e7b24968da59eda37b03b700197847ca38ab0837c134265048cce0eb0cd3335e587455ee3a5ca7144d49b42081781df32372eddd70166c4087d1f92bb1d98f25938ea62de81c99d25106162ac7f0e33195308cb733c7d9beaed748f7428edca5554ec13e4be9d0c043fe0683b7db1638be2f06c470a922303f08c3c918eb6cabc187 + +Input: d7e1f14b8bc81a0719044f3d66cced791958c6dcc78f2994dd572e6d506eedd89b03a1fff42f558a0d9e41d17fba11de88be029ed34cad29036c9da599fb4c4868ea777a23a0f6017fe342831299380b5dcc2e1b3b9ca4dae523058f0f624edc7720d02fbffaef7d1e155295671978e7ac8799daa328151c439c37eb4a21a9bd17e697e4314d804ba51a39e5d487eee5eb1020b51fcf56997d7dc3bdc2d65c6f441dd0baa0e729f8d353d4f5850bb03d5f5bd6e0c7c26d0c7612960b41e15acad0b19b1636ac9d8e9dd6336b41c0cb782cb281bc09f927f523b3a67feeb19886b6e8979c568f0983b22666193657ee5c26a71d4c18da0288e5995673755afa2555c41d7de38ebac02628ddcc84c4d5face88aa1e7f6c04c8c0fac4f9b86ead615af1689c3eb7be46657e7eef3ebf59e5ede53da1b197d6e884400ad78e88453145d5de8050dede4d524155aa5eb12a9a9238977e084b9b30e4f662e2298946718a742f79a205d614eae8785e70f49e9b2029ad47661acb8495 +SHA3-256: e48e245ef0cdde3e372bf40bc5f77dde9870b7b67d6d8812928851bc952c6456 +SHA3-512: 9a6584142ab2c3a76d1ddd49fe5d38319a234e22788528f22fc1535a21c95c23127f68b238cda504a5f3395ce0251968b1a3a50b3918f3facfa5e15e7f49f81f +SHAKE-128: 9a00d6a91c3c5c566482db22ffbe6fe498a8275a1158cd50fff33e6b4fac3248f34df65955a01df0dc1548f8e97e3b75cd4e3a24dff94574e70b90664f002f5d99f29e5ef78b7cdebe7e50b6197d980e422d1048fa7539b1defe20b69290f28ed27b92cb2d7c272c52b020e1fa9c0d393c465b0d9c98f0e98682063c5a3dc03996353646170be1268f580c59099c0fc65ccb1faae5eb09438ff8d01d6370d09ebd02bd25f48eb7dcee717bb007313cf176f38fc0aa528612883a617792f4ac25f50ed094cc3ddebd22ac4ccc008ece7ad943f008aa7394881e36d65b60d96b069182339044f60e2794b04fd047809d3a33631cc4fa15e46d6c2296998277087351bda0aa30e9801c35fbeaaa78b2ce410231f10a76602062d416b44d62a075bdb1ff723e707a42c3e322c20708630dc1f79408ccba8bb05b72a4eaee44baba9383343b391aefd79ed5c08afef24cfe9e8e0cc3ab627e87ec4eddbc59c808aaab5633c40c9e184681e1f8e81917d9baebdb9103fc673da7d3ff037a1ac566c87a457868dd3d64755cb19e9a5d13dd7297f0e5aa3ae157688d571d68aae34ad14f309a6b762edc74b06eb8efe84735ea65d24bb45b935339c45bf1fc402d9cc484964cd22f06bd31173c1c0907d3a6320beee230e1b02ef40d7cbfeac938f3ea46feab31b9b8a74ba93ff927b8fd2ec70dd8d01892c5fca43bc553f34b5f42bfaa +SHAKE-256: cb98ddc5707de770fd616a7b78e3e6fd33fdfce0f8b164032cdc42bd957e0f90a65792052df20b47f1a2073b1636265c122cc8e19f4a592fcf4cdf25d81b244ed21dc06968dbbbc9b0e4791b9e9dd07390989511e1edd305bb75feb975c8a6a1d76da649bc0ec8f75d316100fc584aabd550ace25a64520f17d7a7b2c510baf99eefe32c177433cff1779aa7fbf6ea8a852a743ff8a3078799e82cf26dbe8cc3343104046c2ec7aa144f0d6856243e9507b4acd70aeb77e540eb8aa475a8de379c1e804de9b631dbae1107a0195803d8c8ed4d904e4e5327a5c250debf65e56efa1ae3fcfdcceec17e25bb2b9b4f050d5de7741665f7d362681d86fc31a692acdda00eafe1eb927ccc6472497f5f49cac64980a9ad959764fdb08777340796781cdc9d4b0aa4c482598d4b51de2a91280c2d1a474a6ebfffe770e932a3785abb7f9f94203399b26eafb4ab61f4e5edf74bec771eb1e0c19b0bd03f4f9c7bfbff35295b7c575a79729d1935f71aca546dca1cdbca00f1109d454a3d5c74178c5f457786730031beedb703ed6cc2b976f0b328e06a4f4e19f76c53fd4f8105b5de3a37c73a1b5b5777c2ac71bc88dc93979fb54d04afdb11782c081824beb5c11225f8b6fdee81df9f85459d11a2fe1bcff4c33877a19cac842787ba5c568595561ecde9c58f5c0e748e143adc63d717d5dedb81eebfd2c979d889fc970baf02b2 + +Input: 6a7d45a2d32335609831a01256e6db34c163fd108d382e1004350aeffe77c5bb9c03e949d9e5f68c99de869149eaa8a3a6f76c746cb308264a6b737826a04d7901598c159981343d32c7aede076b1b39c06ce4c7e5398d40b2da05ff51946d73de923b69894a4c416b1d80b8c6a08da79597af31918cff619baefc935ade9a02d590f93f277ca95ffeff465f54bb11073bb8ae2fc915b3532c29f8545182bc8555c00772d86f55347c501870c771fee37e360ba6da3d310ca8f62fcc46d8ef0e21e42ff093f54ef500019f4d4e570acc168fbf083030c0fa955d6820c542ddae8a3b330663f89986cbe668a6cb09bba6a53033f0fd43b0ae780e222d4bb586f083e1c8e89f13c37428b63d8531244aca664b1673698c6a85875bf239ba9d2024cacf893b70785a27fc061f7d9d840692b5e1707f42951f12f35f60726798c9b3a8c05a5cc0ca7a48cdc959cf5e8ce5d9d70996e4e3a2c91e111340266c5745d8c5084cfc411ccea0e8d234b84b454df98353356b56482fad429a +SHA3-256: 2e6c67afec7ee6e031268fbe1d2cc893f408d2057b1707de5d8f526ce5741a07 +SHA3-512: 86ad882feb50b573bd9abe7b63751b30c422cd622f503318c84be34f75d6352b72ffdcdf10aef6cd72b99da24ee72767683c3b004d2a238f0d1e6646bf0b640b +SHAKE-128: 649053433d2da70c980b5112e31c0395beef3781ce9fcdc009143e9064df49f2f2853dd08d621057bef14f7edfe36038dd5481b64842bb759206662f224f5e4d79f8bd8b2999320715766c83a75f362805e4b6f63017b3b918f823d7b422d0854b0728d3dee04d8537c34835deb800baf6bfa7ebf02400e4241dff4e7ce1e1a8a85ff898944897fde6923ee50695206f07badac48564311a533d9b467f9f5defe88480767389d10fcef02832bdfbb7391d25c83f2d62849f0c4f6e65bc18e27de05dcbb8ef7decfb48610d5a62028da1b2abade742a2ff59b61161a238751f48d3adf73b246f7e4f56cc82df2754d2ff1d280e3d62b6c450bff71102522376c49f517913478108d45c9e57f005c7523a9a85ba3e0b138146d038c4c78065da6573ec4bf975e5db9e9405836853c45e2f2c39fd3739d1e9a37932ed7c6765ed31fcc7da3808ef3faeb526085432ae85e616cfb5194e6c458c1a8143ca2421450d935b43110843ff6876d6dc09f98dc6afa42c716656446e3e5379a9ca7c94ce8a6dc64a7f25fb62b7a18ba3ec8f3d7d7e49d5145dd8ba026b441973251c7a71382b09e2123918d6cb2a1eb4efbd6108bfd495d621f02621b3c447ccf177f4915200aa287f0deb871b750c2c6dccc4b037f141c9eb1437c2f6878374f557c13283568669de258d24de9713eab06daa923d56bc58f2b60657ff56a7f1ceb07f6fe9 +SHAKE-256: 9f877e6ff3ba10a62587c356289815fbed3f956d2b6b50a32297db8748776dd1381102fc6e09a19faf73a70fa74533b2532ffe3bf1766eccba7b8feb038bf0a1b993f0049fda18820c11e564806194e585ddc8ff0b826007b09f1dc47d8fb0b652fbb2df2c6bdf31a9130a072d2a2f4cfd31851fd7275e0b7caff67c3ed879d3b443baa2dfc99efd9f93e6739e6afe09e0fd9c6be78d4939f86b3b73f1990b189f60a8730d8885b43a6fe79f7b59a2e8ac3d9f637b268a621a33b90917595e98b56cc2e91bd48571aa50577123baafc76b95ab9e8203199cc34a8b90a8605fd9d563a572d80a574f81bf2b40df34c7632b0cfc2aab34c29e641f54e64176cd18d1502a9201d453d1c6c287fb784729080dc9705de7b90e85386839b08f07a42f606f4b828f757d68d1e4eb33b421a09523bdef1b41f5b4fafef5371f216a15cffce8d36186c1eb3eb7343d480d9dca3a282098c1690c2eddf9ea6416ee6700576137bbd1dd396baa3533c46d0b0cdc5afe1ef46621d4f68ddf1aab5e62c5e8b8cd4b5c9f11cbc41c54b05d735d6c51c36d6b0be28369e248dc32fd901aa8b813c29bcda8b96d3a05116b749938c37b9b5d949ce2794319bcfa696b11e42ecbae993554530a6a404139970270b515ba66779a1848a68e94480689d4bd008d3a386dc9f22af347dc8640f6d0b51d0762a7d43b0ef186811a30a8ab218b618b6739 + +Input: e31ad7bbb43ce2961c0e604e05e8d2f40419a2c9fea01f3b8eb559507ea58e8a13065c0406b4d75cf16863bb94e1811d6e99e8ef8f6f406405ac3342dbee725a5a2dadfe482a94f2a17a20923c6bc5538f587a6c5c6d60907c3704d6aa6c8751df99d6319216a133abfb421d782132a71cde6bb6e4dae7473adf060f3420c6d2e18bc433ac88dc9e3b2338c72f870134638b26eed220a9da5fdc1ef059970709076eb1375e670945900a679720d23ee5c35f033f915e27339240c722dfe88b7c1e17ee676ec1d3095ee9556f39fbd1e6f5634a974a7bfd4de9bd333ea24a9ffb89ef8c5b5b57c229b747fa3a69c53eec0572ac560b86528c964e9c6dc6969f76815584e25250b6c33bd4947449d66de617bed688ed37e982c6f0710d6df76b6fd9a7745ef21a5bd010291f288766323b881a231de8671919c33c5f70705c158ed85376d24198ea9f69f915efc334637e851048779e302fc4044448a3a614fad0849d43efe44d2f07b82455267d59ca3ef6ce7bff2cbfd13bdb3a65 +SHA3-256: 3d66d13a8b691114c9e3ff869d47c8ead189d70000d460a0529ae71d875a1720 +SHA3-512: eba2b4a9678d1ef7c75cb634f8a913e077493e626ba07a83cb0952d914eea5ad6a8547fe650b23f92581d0f273891da6d040eae3db46914320b50e7311d2cc7f +SHAKE-128: 2af04af8d4a578c4db3ad42443c98246790d4ea41cdd53260758ca04b0238dc63d59eef7b661cecf5323d3d215d9d5719be5e758f16496ee5e6a06902a968ab7c19c273440d430630378f95767f9afae7df7fe3245ed7d297233b5f184b771edb2c54d8b347f77bcc96b448ee4dccc16522e9651a279fbf6deaa33dd9de9970ae624dc913bad3a9a572ace599779558e6ab5ea816bb2612c618a900046f5cd4d69ae78588fd4f07fbc1d8fa808cf2aa343e660a69f83a5ee788e84c8fc9daec2f80e4ce4a09665225d8e5741f90b0b33279adf189b09519ca057c1398a33718d7e4409a178971cb2e541e651682126cf0b7989798297140ce86ad669f71c076253f01e9e02baa22e0161171da06146bc5a22c90dbda967a93f4415fa00906625cbb34ce22f2242f75c37fd063f76f619654b91641428af5981c932d10d994d55c21c2a1d7ecd73fe15e2f85f02f49f9f69097035046d42ea604e0ab336ad6c64e6243feb6459a54356badb02c9975d2ee8ec588af761b44bdccfc3f595ff7f2abb35781f1a6fc22131d452f46980a77625a3acb2f1b2d279b26c929dd85b88e0c29bade32137d7c65096f15b6c1b18f2ab7b68053032f3334190a4b94b6a497ac0ad0eae1c953072a0cacf5ee99f0b8c34148da5fb6ad5e92dfa309cf699df58617e0ff07a3cc6ebaf02f8c77e150b57424110c0a24d9ff2d9857f31481819b2 +SHAKE-256: 85721e53c19cc2f3f3543580d56593945cfb88b55534249f81c11c96015b7beb8919ac98beac721fc35195c95e3f54c9a3523a087419a02fe8991c8de03cdf99f9a8197c1e789eaa6fca7e7a2cd89660f3809127f0c9f0522c1a4691cc720868e07adf8a21d7e1434bb7062fdf9ce7fb4fbc4474c83eba1282367fe9fe5a63a4a383988d55f9a8f1106302a70410e2c69688d01b514c5f7647cb002ff4b07a6a1de3c5552faba22a6b0c87ca3fc1ca06f58a5bf24bb0606aabfc7023a4cefe295aa7a5a4ee661d97695776f79d82a505b645ee1f5074102b64dee4fe38858a1cedada98b86940c8fb1779f5890e46c30339d2d663e680bcd588a714f18aeb5fd61190dba98170b60cdcf9a2e9f710c47c47438b848e14a0437dec2c70ea9d49187d2ffe027164e986db0aff2a0f24fe5e8b45c11b490e2eae8b9f196adacb8f5c0260f1483211e8ea9d564a90171ae564760d00dd77861bb44623c564fba2934dfc02094d9fbd215d9106e59386525d45bffbcb02d4324a5d1f4b45d553eb3efb17308a1014b93c7ab2d9d5dbc2b442c3bc597073f7ae247c2d69a75184da4a3eaa4592ad199c9601b883f74beb39560002ffadf33f3e21010fb1658c284ed9ddc27b2ab22c08f79d9cf7dcdbf2856085975e088ad0f5f1d4f0c3a1763c4e9dde06eab2b8b2eb4dfd9425b51f8471960fee2f101b93e527b79c63be7e4cf4bff + +Input: 7f40559970c22945901fab05555988c6c320091a9480ba748c9f03110952ef71fc4ae9225136bcc96a7ef04eeae9e7644733d15ff7d2347669646bc184669eaf50ff6283883e28c9032030c89029a9bed2fd1c3663b83fc15825b8b50cc1eab74fa6c9d4e089fbec75d744d0aa21a99733b71b4be494771dfb9f60ab7f684e582d7eda0761b2daa7d5a696af8b92d0af4dc08fd7adda0d00297eb54cd727185b9255ac0b9bfae7fb3570197a06c8f53f7f5e7d6e138de72b291d37bf8c1d3f1effa1ac383236175eb69c601b6d297ec9bc7f434c120b24a3c616109b19222598304522d9ff812c6738214fa977d4edcc17980a66a5c40baf7bdfbeefe4797f51e938adc9667840f32cec404a621a34143627e8b8c30121a47bb21157664e5e5b8edffda5fd91cd8adcbe789b07bdd74701544d158873c5baadd54490ee45cda3d442ec519e0744927e0defa092b5bcb5025ac69476a73129476edd14f82598fcb386605ff826b3295c9ed8120cb6761489fbe6e111bb493c5f0d521f +SHA3-256: ccbf6d6a9b4327b709cc6a1686d82da72ef585a424eaed5bda2dfe56ac8174a8 +SHA3-512: 6913b7c1798b71b2587a6100cdc0dfbda6ea5341fbd99f0ae0bf34bd33a137d48f145472ba435569bbf235f5232ea37f0b0dd89e126285d60ae0f9527214aeff +SHAKE-128: d14a615e8b1addf13b0a2801565d11a9f7afb89ec1148f7df09552755ba234558adbe31506ebf56c51325b59a18e2d4b88109a1861063745ee36f8cff7d54975342d4460fbb4fcec2fb8c60e53c9a96ee4c645531a055d4f94cc187a4f16281a0d48d91fd180a5350f30ac50ecd08ab510e247181f9f2af3d51a0b0019235a82b93fb6fba56a6f948cd911b1c449bb54080ebf88f59a3e52723eef6db8ec859770cbe7cae788fab23eb156e1b65d08e71a41d38aee6a14ba278153fbf50a1e7e810d1d7c8fec1145c6280a96b18b93d033e8894f8d576a035d34376bdd591fba70ea48de838ce9db91b7359e0b087b802235e91980b5c5b7ff7c02317adf3c0ab6ffa09f2e31f93dacbc0679bf8671009a8c1c63ffc8b3b9b5a2ac61dc46cf31cd43116b650ba1116aa7477b5bff7d2fb388b097853e95e35f2896aab8876276d89b69394a0dc7b93fa5843da4069341ef20ab5257bec3609e3d8f7b014fbb014ab62cee207fcf699a4dfa66c874e7144a87c289ec3cee5538652a5bd8a7accbca91b0dd5f93643aad49075965736906f2718cef80f5d8fc63605cb9d68996139f58d5bd51411c9bdb6136b984f647068250064930ebc818dbd6d2941c0774d2491e71d08b0d34e42ec4b723e36d9c158038c0a15a99478e2da6714b600666c2e6298d95960ec58f987c2c55a80c9ca255a198df0c73b00971d903ad9602b87f +SHAKE-256: f25d1615ae6931adaa58cac66b0ccc1d2c984b53cdb776ff1dd3227d03e1bb6ff1ac47f99d01d293581c85bd6175cdf02eee17c1e57b4c270709237ea67f97dd871bef897cf3be3f1dad5dd48facd6f1c778a92bf0355af3f24ed93586e5b82798398f1f29f5a34c1b7ac3eabddd1aa5fe607126c8c693e409840ffe968fdee5e3a360737137ddea1e3e29491adb548b1b255d8f85f4943b3a2029ae46d4cce1e14f3bf49c4f3ba7c7de3c062266a0fc0a7c88864392f3d542e1548d7f7c4c67ac19c06f37481313db09adce6b98a826c066c24c6ae015f892bc4b85a90bd2fc74c4ac80b30ad32f4b9b4dcc771198886a1485c621b55be680e2b2385a1a89dd48d7bae87ddf3ddbd12534c74188392902918857cccf5f19ad08b519c061a86241789f3423880c6d61129b6d768811d8ddd88384bc32605511e10b835158d546e1657de9e3a9271194814392217689ea6f2645a1a68b12671854140beb80a1403b8b3ffd27e5d367f10e7dfd5a03fe2a94e2f9c4980b40607bd68195f6583702c04615226cb5aba8e1e0fa251550e45acd6077b1e6226a8f5e50c6a242ac144838af611b6e07b23913110f8456fb4f185126620dcdd1eca962d99ed20fd70ca37574a88396325353ba25f171d08fcc2712d70ad0cf73c82f31f0b51ff74c4611bf86d4a3bbfa429c79372ef5ae01c4df093405fb56200c503ffbd817029b5530 + +Input: 8c389da24d19a880bb42a7085a65cdce736f7dd4f3f5d1bd21a96ad5b73939b3eee5ff3f39b8bfac77c1ce03455650bb41908ff01a7ac5d31be98f7aef9983c36db7ed882ca99be7adbad9924bb1b86599072cae8c3b14a4308c3797c26306f3f2a6ae42668aa9f57b8933d666ac0f0ce7cb1d2762ba1a2db12314a562134a98b56fa9b0d1ae1911cedf45e5b2484ed992346e4de646f7599dea8ebb0edd13ef839aa261ca69fdbcb68004f8784c5900ce31b157010786e96fbd74702c510f1bb11000b46598cff063eeb10b7821b86d84ada623664412858abbd3b10b2399837fb78e014af556eea94a4721286145dbe79f4093ddf499dbe5dfe6ca8383997474f73a3faa7e57e8e9d16329c9719901d65b98cd696913ca5b63ab7726a66fdb966a5a4fa850c245d10687c596af4c272d65fbd460a9dfb7ee14b8430f51a29323e35f4d5d3dcc4e2593b01ca73330701aedae4d4450ef2c09d9021af9fe76fc1e13ba9302c319d6c7064c7a06deba906df9399dd18e14ed8ef9c09c44 +SHA3-256: e470674845cfa5ecfb3bd85eb91825a897f9f6b3d4600a7732854e69e80ca423 +SHA3-512: 5168aa57304d56728dac134c325fd27b8df58c8f4d3dfcab4214eff6e4e203883aa26d8c20dfce3677a99d4f25376a34225fe091765a21ae2f31e6e8cc282606 +SHAKE-128: cf5393b8b011a3a69993f1bcec86f627e4ccbaafdede01d9b387d14240463a57e876004c6b68892b3c7939a193f113cf7f52dc9ddb4f8e538ca2ce7872a373f952ed380d2b51b6d04bba0d0c84d29c7a0116b7d11590a25b81abc9a77407829d3d6697994a650bc0b56221e70826709911a2f0dd9fef45cb2585b2b8571d88a14c8b5a241519d21207399babfaa6b187a9960fb71fc65ddc31d3fd15a11f5022c33a5400aab3cb91a8fb9ead3df4d46d321a4465599200c4f6feaf12f0adef7e34f3d27b198aeb05ae9ea20a53aa4aebcea2aa0fc0673faa1df65228e8e284332cafcd79cc027e67659f11cbc591193d98f05d3c4e512f3bcb790a7a4501d7b08aedd750443789bd79a10458a880ed5bd7c45075a620bb15655fe938a6e7e9fe5feed3066ec05abe53db3ce04d53a6cd7e46f064c6861484c6e26a8f722339d184438d45150657f051323564fc75af91b25b12828a397d3f33ae33615188d4971a459050d4c43e0ededf2ad7142f570e133b7b473228eb4ed0b17ca9496ab7f17c61fd42050d95d95e1130dc70f35497c1cee24ef50e82d16e2f603ce6490f1ff7e5671f4c4b956565f96044658bddee1aae4822e2d74bddc014a71cfd2072f782863f1eecf40ae6a849fcc695225551e81c654ee888e7468645c3ba735d314974b40dfdea55d7ac31efe5fbe38c0a1b577f63fd64f4b086c9d383e8d2085452 +SHAKE-256: bbd43da18bd641c6dcce368753e484a4036d124c1e78d5e9b8d6c63217e6f20f163256427158434f3785884116ed2eebed3d7011121bdc8873876570665269e950472da4e603041b23867ef87b39346382c49b4247779c412ebe5cab7b1ef12e3b4dc4cdb13ea6eafd21990a9beb179e1cdbcc3b97218e30ceb8cc9252f4de7aac1cb0d35f51ca8c517fe1b32a9ab400c9c96f3c76b458ae66395f61115b8f6ea76ddcf1ad69dd5f5331dc304c113c5ad95dad8a48396323f83bcc445407c5aca3c0274389c12957815456a94114d75dab65eb41a283e66284055a9f591cb29578aa5729e0e9b8593db079ad57f5aad8d2c95ebdbc4dbf57f8617ca246320af0617a0f1200faf7e73541178a45a7dee65a14941cd0664e03632e73fbd2e234aff217a1bcb30750ce67e5f7dcea38cc2f75d34d31a2b01ac810265b375ed9d490812c4d64fd655554fa1f29f2778728f4b53b9793d313e90e0f0a2341939db88f410694326bbedc282e2fa137a200b9ae3b1beb6225c3486583533623e777297c69a5737ff24cce06aaeae19a37892f472d772e105c5fee6aec6664988702cb7da6e65ca982e4857bfd01505b1ad86bcd8c2205b9dd051fc7fbd85702c0c1060a58dbd3587003127e55e6db5f3754498ee587e1591c5ced6cc1bccc7153661d0c18e953d4cc2572651efd25627a547f67ecb991200626cf0e33b2b11e5860b4e1 + +Input: 16cba47718e34add507dd192af933afe28338dcfce13e944f3743da80c2bc1754a389eee1949b4fb17f326dc85495ff30994539859b537d163b3d24c75d80469e9ba9b1cb6ffd8631b04a0479c64a6d9bf8b2f65ad5753728c61a48c509cc6d969bdfb5f35223081a874218fb4ef3ff43635cb6e487c945ad990ba2439e4ca5f8e1a6e802163aa3da6426ded594bfa48dc42c364437552982ae5cdfea9a3f6d1c9a90439fd5d514d2941e362cc6d7e767d001dcdf0b05accb9441d9e5140a041e629a16893b7c4b22c2684ff37dee8b5c61a24b0c9385b0f31b7a4567ce1d0303d3e3e13c8a35e047ae7848821624b9f32bed0f818c16b573b9f83bdc412f8a4b682c1879811585b0342db1caa70e6a7f527c83a693a5efc8fd027f21b03d5d4716926be5922714a0c11e1479800f6838a0e0ccb797ac837838cfe8d68f426f95bff50e2fce90b41463a739407ce336ffb6359964317164af107052e998024bb4c8b17eb59d972c1a5248e9f86fe1715ebc020bdf506592a0b0e6dbcbb1c +SHA3-256: 6a513ba574bf90b759f32924f95c19db0a19fe6b2aa51d27e5c935bfc2edba06 +SHA3-512: 417f38d3d5e1185b53ed0f7ac24bdd24d1311b6e5b865fa69b8fd1ad4fbf81ab1fb2001bea3ac8b324cfbf51406ff3e61bc187bf1df8e973a9d23f1586c725c0 +SHAKE-128: 6aec166190764fc462e38c0d9b4f81511ad59e8763ef7b1101afbc718a7f145a06fd9495a9bfc2d5109605a2430cad89e2c2676610fed22fa3ede665451223334b387763580463741d045ef327c91ad9f085ea33ad0bd6e3915b91af3554c11fff65ca38416201206d09e3fe595267a63ec52487feaa9a21382ec818f43e6309c12b424eeec47321ef261f8a4ad85e54ce8ec7a5c0eb3fa60eb4fcf2d5a0347879cb7953da6d53ede146d1525a81e41b5f21e34408f1321360cdba4f4799eb8350698e6d3f26dc8b9de8e5b382b074f56e210bb583ff1e06263743bd8b208ddd6d42ef074dbc55d28297640a25679665f2f09132f737c83139de12fdc0d5e84ab7e0d8943af1c38ba81ac5ecb66ac86fe78d7e69c0f70a48298926981c53a5a4359823fed8aa7c159f5f778c077bd7c44e02ddfe3532657b85210baba709a61bf456e410057e561702ef67da0a93460a5c181b5b948295f7db0264176d289bd555d7e9a509bd491efb0a27329da668e180ba22b84ea3638b7c8141f57e15080b05217a0f94b17791f0613d449b839b55e0c1dbca66df3f6b6a853a4d61fc0679e9ca2aad0a1d82e5702c3450445968f2c8abb9f5da26f0ec1ccd948e0f318b0788e947258ff6ca96486808c049777c8fcd72692612fb9412ac3c46e9229e17db38abdaef3f9d18e991334287068ec59c557a04a0fcf7fe3693e9a87533ce3e7c +SHAKE-256: 1e80473ed498ab1b6689fcdfe5fb11ece7e87af92cedfe1b0f6fe76facfbedc30f563645584d39398c9d809bc5eed39781ebb438991c32482f74a3afa0ac88d86223de301e6d3fb0c664173250d5a50231c09bf6a6a1567b9b372120132519aab643f5349df970d00d5b0eb965f421a91e3e850f0081c6435a6ce5a44f8d2828bc291f2204b9c05b9e58be222c3c99dd61413828a854332593188f5bfccd669a17226d703bacd1bc1d896a4a13c35d02f17b34cc38b1881db6fad9b2e07a9003b8b7e5002eae75471ad867129e3215624bc2f85fdb2377033d9b74bfdc71538fe4659d81c3c4e22100fa7b403a275c02455f32ca08074e44838eff84aaa1ba4ae1217bd4b06e19d7cc69bb7edad16f279121137385959fede1f872ce30bacb6349ca3b5b057e6c8a021d21f20e1c532a417aad6e17faff0dd603f0ef55c5855f976e102cbe17a551efc3d6444f7555f9b35a5f5b83649cfd6993f105d577dcc25d4d1f093a2a15ffe80a37372523992492972aba05459674946e16ca28f690c1d61db4a29f778a55daef66a776161f533361585f34a96f6a502547e0e7dce008b538873a3b6c91c9a61e46e28f450df7e05ff77afdd36968f7cbcb859801ff415240ea6b5b57ccc04e53277e3688e9136ae0a9a3f175b9cc3d9207a419fe93393a18ca02c4c46d25c4abb47659ec413fd8555b7fdf5cd8072823fe80079f3eb7 + +Input: 13626e24e7f6cb73475e1703a0492abde215f508da99c10118a8ffe4a1522a4878a0cff4b1b84c978da82f76412f4cb66d070d8bf510909a7622edab9e6a567d98631e8a51c3b9018c6bb142f5c10b8a18e5b1b97a5092e4042f938e3b45851c6d16bee021444460536f7126ed90b0a3bc0f0b66a5b52ff6688595fbd60fb0ff7201d55287f124baafc39ef6a4fa97cd933f8bdfd4d8ae20e34c72940f04c061ca52f0d883c174ac2537312b2b833c54e7a0acbaba23fb26da34a29541742463d0ac7d0a55685549e494cf5c4eca7fdbc502fc3323c758a744215d9a3bac9aa8a85582b3865e2ed7dac142e248e7f10d0e5a0bc4c1cf630a031c4be58435c0995638ecdbc4de34ffc7679b451298407396b5700f3eb26c665fdff6e4e72fd36c6b5c52473841c3ed23cf5145ffa231e790f8c965c142fa2f09e321e352eeda1447fdff1376d1653d20b4e71b51b892c939badb9fbd186e8dcbaf5c63bc1e46f59c2b0b90fc9d94c14e410b2e27b0c5de5c5180750b0ba5d52154fa756a94bc +SHA3-256: 31afe991728b1d1f659bb611fe00ef10217c00dc1badb90a1f7505c43ebdb1f2 +SHA3-512: d0c77f45a5993348d744dea2e222ec582902d2e73bfdca7c6e9b56abcd0385fe0ce7f96dee837094e1f4392e01d96e1ef10131d45a50dc97b56147fc37ba69e5 +SHAKE-128: a48aa632d6bd9aa57d037a5b3392beb909e8b73e4ed2ff18c6297939b7bb44c633c79cc9d37c3d85fdd1a0f58b8c77174e71d198569431656bbd03fc500f3bb970048ba6cea7fc9a757cf0dc3fd2ed7428c7fa694c30ea77f3956e0f50cbe5aa4656ffc73be2321b20a6502294964246e13e01fe774cd1f9b2b163950a288bfd719dac09b0133c7d30041654728109b66b76ddf7134745e0cbcf741cd834111d18d39fe9c0f3d147afa853aeb415c91fa5b46ac83d767b97a3da147348ad334231c9d64174642554408e28a1cf45527adca992c44788208776c75e066c3a9c3858e56955c7112bb092cb62fafa4489f6834c650d78c4bf19715687646007597a24c35f985c79bb78d6d1bc7b93b8d039a017e597510c2dd60be032fe9f9d18663727ebb75cf9fbc49fa2e5c1d76c00f23f75ddde8d7ece33fa979bb24cb6e581fc5dd76807784e846987adaae31339a99e4a6f88a952d2b5ae5a352660a43e4b9f6257ef077e35387b0e5dea3d2f4c94d4ee70801f523166e215a91c1296763a96ee813c81f245637f8df158fb6f31ca063e70b13edc8d45b3226f832bf2fe626c2540643ac119150727975c064b09ae935d54c28d500aa1a1fde56374d91ca270c2134e5f058e75752f73d9ad22adff44b0046b219408f36007e1b23c2f5d46566f3d0bc04c8bc50ac4c2dd2e6ca3532ba5d7a61e0cdd018b6e0ea441c26822 +SHAKE-256: a9b7f03341bf9354a485e20201c4bce4c1d8c76f5440c74f8f136af53f3fcc03954b152a735e42690058a60af90875e6f075db1e485b5d06821c1c31e2e85d63fb24cfd734b75e63e0615d0b9db3dd1429d210399a36d3b84091fe89195fc68f2e15f66d354562c72a93a543a128f52409e1c3c2a01bc28bac078f2cfc34a659db28a6f7a890a9eb165a31535a2e20ef647c081676be72a136760471ba29c07b20912f1e917a67e4ff2b52edd641bb5c0ce1d857e4b584f8ca5e38ba9aeb9d2c767f11f43b949557972d8b8f0f7b1c49091052d43ec824af44039b63da0ca00857b14090c7a522a7974b0c4e8b58bbc624e2141c3170242764f9b8da4a92713f9472600bfb1a074cdc7e4f834097f023f78e370aa15075370076728fed196d78ea4279c098cb34562c84c047901b8d84922564523f3f2b94dee2425559abc601a9293a0a4a094852736cfd9addb7c4fce42161c2bd31e42b096d4e1fafa89d052a244b9e4f435d8c6a8f8c0b5a184d78d48d5118d64f8c26253e42a81f178d9877b27a47258aaa3641b6bddd8b470771a82fe9f814088d3c3a1d754eb5b3ce1215e94392b23686c9976ae4619b3ccfcb6d68d6edc96c1e22bf1c82569c64e6f2d3243546b2b5cc7662cceb0d177d10cbf5c381347e0775c2fcce6488063fa36a9ee376ba062fed0120143c702a55d86a6eb0e62a1e49bf2866098dea103f01a4 + +Input: d4faec5b5388b6fcf211d9e2f9029edc54a8abf16caf4cc20fff48b7cf314de06433d76ca88f500ce93a0921838a2918322e82244c21fef69196d897edaf25e0f47d430c7f3a9d4b7f24e3037e1580fc390833eb0b872aa202cec873618ba1b329aeef3e7c97361eecdd35aa0719607c761b465725505087699237f5b508993ff6e4e4c252358c26ff9ad12b17709548a685e71857b580e286a86ed8f35834926cbca6dad1915fdb46ba315da0b20fe34be0feda2332fbf47c751f9a026e5b7c895e07fa834cf69bdb83c5677fc2b40c68a2d1f5e5bda92c68fbb0d33597da93a638048d79de0a428c0a4845e007db2659b3d7758e9a59ea45919aa58f9040e9ea1bca94e1a3e6094d5f335470bd9b18b2d7d2ec4755fbea06a01ad043c90e13f07afeb1b571045c050b5c66d08eeedd3c68a38aa5f97d0246186ba93b623a806f0cfad913acefa8117e349aaf894e92fc4c61f0fbc846a504bd0d522cf1d6944006d091e83e9637143c608047cbc0e1f8c20fcd63c426320c5fea65e62460e3 +SHA3-256: f84fa47b820bf7b6d334a37fde581607a86cb80971a8217841e9a704fcc916ac +SHA3-512: df221d43584736e871d43c72fd1aaad6fc00b2af108c07826eb6fdd88e1f9a136444c7c211ba50e70c009a58d925324d2a1f1b7534310ef49f03ad3c265cbe12 +SHAKE-128: 7004ba7b2a6e45deb95e33516a9734a96220c6fefe9d43abbada5265a867e47d46d12eb821d3a389066d3a30d4b794e16297d16147556bdc6767f8aaefb74fd88f5086b097b6d39c5a1da8716e545effda1ba4d369c85422609ac854bde1b2b7cfe9e3f119651825628c9efa9b63f6368d485a4c5a2385eb83c9b6363def370b1c7969946dae468034f09a5688176534592a0c9c7f1f05cd999e015f76cdb23b085d90c77dee43896251574af8e900d3c2612dd7f281ad58978e390e4de1dce4cb9420417d5d4d319b4e78dac86ce302399a05c69179f6e06188e68d45eb6fb864499f395b172915e464064764e71c0faafbf765c5fb1ee253f82b378f4e37410b7a5523f0b622400abaae73955d389ca47ca2f7fccf1b87ebd77e46286d993938808a0244780072bcd2cf849e27a5bc8d8e5e78bbc25d6f963f1d8f23be407b7abc085b14847d4f47357dee77a9c428d609cf8f9f6ddbe61ece39dd8f252a534c401562ee77cdc947fcada36b9658f99f91d1fc48b946af467113c568368d8bd8f3d14990ddc7c370844f7d9740fbc63c6c00e3fb1e5b29831a743f6840ea3adaba0b0fccc0c5622f9d947e9066d4284fe2c185b3900b70ac056b7238d2101d76d05db48be56e9262bdd1b27c651c8931bb7b026bf6bd8d36353d2fc53ef287bfdcb296e3c8d011d79ffab1de2b85879157a7f2d2a9b93029095ae1fc24b82f +SHAKE-256: e9b1f94a4b6e08fc50a7f4cf71ba630a6fef2790b81234658e4e2aedd9848c28f2c2857994bfb8eb7acac04616819216b7eed04d7d6272e5aa8cd0581d005560e418b1fce61d32d6744230a19a59c30163f2999cb49f6b078cdc271a1549a590b713d97a773bcfa654846835f64e2e940a5edcfa11b4b40cdcf730524bdfc40fc5af459cdf497ff888553de6367283ec0ee9ff670b590591cc41d4d8d6bf27072c6c314213c6179facc677bf2d0d3cb4a23e76a98507ea15f463fdcf860648e05c3b1566dd539b7bdd9e7f13f898161c7639c7e6652c1618a3e781c38691306c82686b85602a4f79522de823c1385926d9dc2fd8b5a909f6e0a2443ff412bc78a2a1d96ea97ccf7d730f8e732fa7033659d2fcdb2615aa6aaf604585a604ba7d276ae16c4d541fe42d5a19a17e24326695befcdc4e38ac7c229e870dc7053dbde7cf44d408e046011204bdf6aaa3db198cff29401082ead099dd38551cd83ea72fc8559040449e73c40eee930fb11f2aae85ae60f10bf24a8beebdf71862c8aeb9d8880ca54e97e4fa3bcee97d9cf7659bed111be1000cbbfb1ba4325e50b26b1e46eaa84c0a5943499408dc4722593e76992aadca6ac2443a8d2c138b2ea428e72e214619601a38ba52ba4af291e1b513703f2cfa02acda2b6700f8cb4e3ea54b8c3166591ef3331671ee7d9b07160fba395fc302a306e25aed15ac9081b84b + +Input: 5a1b17620c248080924d42e5a5d0017363f033b148addab4d056fd5528cd6050100fdb0bee151c750782dacfbe25a2cc030a765f9239d60893c569c7e11f0322c7c3f04ad66c15cb1522f0f99de091467ca4c0a62588d2fd328572933950dde840a55218b6240482959cb1c5268a8f103f0821c7cd2d4dd6d40641400566519cd53a56ff44a4fbc6f59475bc06d06a4977767e839eac40227bc420bdb768d370e2d586575453386b7b320d16719376e8eeab38c6c9f2e5063c791e5879cb91e5c3687cff7e8820bd6c4e8ea7a3f18056f02a756a39ca77f101be573d81f626b58c09eff76b307e16441203b40b921c2f82eadcabbd1559b34ba51c10104df9093513292ef1426da6067453cf29e3d24898175735e6f64b93237243e448ccfb5863b8da81877bb0247d0f2fcf13bea01e8ce047c9761b46ffa9144a0edba748551b062d85abb0810e54c2102aee69d1e1d3a79d5ed3b1b61e97822216f338dbc3ce815bb07eb71d2db43894a936350b22a6d56c171aa385ed5187ffe953177fb846 +SHA3-256: 3a89712ca3e44f5453524009158731822e39f6d7b08896faa8ec3ff222a5f5f1 +SHA3-512: f3ce3370b8dc903e093156319b3f248e9230be20a31c8f38b983e42dff057ccbe08a1c88776b1c9e8ec0225e47f0dec7e6943e8efbda7dba552579483e57333b +SHAKE-128: dd5b047fbbf9916b4c2ad5f76eb4efd94a78585776ec72e7aad5a47f78ba19f99b7454bae2ed240a2708ab20dd84a6c1697f6e3a4b87bfa7a49d193de7d8179c5e476913c1d375e52d4329cd3b526fc5102da95de2b38b94c7c10facb2ef9bd4f50492cb1bb81b214820702b8545ab039e416cd684dceccd6778ec66569f4fea6de6061cf8c320c0629ac23b7a3b727cf7e0fc89734fc1f35eaa4c63e215a49b4e50d62e6404235f4416cdbd128c8167401b9644aa6fedf9be19e946678e5d5999e37062c64e834ba0a32688502d9529a33e181b8f489cf38327cd9c834a08204875f0785024ded83f0198def6f892539f93084d078cbf48ead7ec598f42d619d6dbf5d0381c0e4ba8f3a05c75dbd0a1ad9b0a0151c2cab8b594a0fedac4e97268635905b040cb8431677212ce4587c2e42d16656834ad97886eb46db7f18ff4460aee767961e0f5efe625a9c8185bf5655f1f4ab031544dd727f26415eb895c11a0f8d210426a363bac633c5beec765a070455d436e1f21ee94549d06244e0e81a59344bf5732629fed54577a7dd0d9b935df06ce229e711ff48c70fe460544daa110eb5657f9c187dc30c385f35d9553480b5e815d79ca56a786e684b69afceae4fabc4f04652e4f64ad81f178061e490c09ceddac7030190f42538b1b94174ac29be6e04949df0eef20116a4140f911c1f3d3d2122048286d24cfefa82305 +SHAKE-256: cfc83be8cd4d81d74eefbded58e0641ac2827c9310d37863fc14549019f4d2165b4460849260558a5be85ee371c60e46704691b08333b5f748e1f170c85872333ad04bd9f6683852fb1ecc5d0f8fc8e8fdc3ddf3bedd3260df0b235cc0ae74781b4c14c6583067ddceaf6b8ca84b06cae0c9cbff52a5270cfa6a96522c43fcbf24fe71f1a29300218c017c47aea87d076274c2f8f6718e5cbf980d04ef39899114e65d705d38e606e665ceee590996b577be3df02da2927a31b2411f075b01fb7d1dfd139cd21c31d172101118b03d843259c033fe044105aa5a2ee7f9f2f56c85a1eeea7a89dea243cc371bad692aebafb1b858adcaaa2c75bc63e33914149afd2fcf24f5546c854a00fb4ca2029d818056d1dce1f4a3d3403057c49d4961e5e89623e1603447a7d9a95504a6c428adca322f50b044ccd052fa08d36e1d8f6a8a8d16280275c8e2b1bf2a1a12bd165cf820d12d6e177a17cc0951b31819fd0e0d05280a7e4903d44cc22f59a66c57e9896f93e429ff9111195f40c22acaf4b7c090ca94ac0d0ea6e80848eef9dc3089a00c086e7d7292f24ca3a8c89669aff9a627c85d8e5a22e139037f7ba5c562180a2bba5f8966760f0e647274c67340e84bf2c0a4a7dfd41c6d58b274d52141d33de2e7338ae60bcd8bc76c1fcc7d9cb3f4ee208bb369a8917f95b36d6c2a7d6f7d2a9dba19f57accdcd24f54325a49db + +Input: 2db39a02f3662414fa04be05f1c1b1539df2b65525cf2688c51a9ce9089e36ff11fdc01a141e096635e27449213df1c0db794321ff3fcb0399394b5859fdca055eca580e74d130b7cbb0de1aa48b43f3ea40fbbdfde79e3460eba3cefe7c2ece380f6fc967c4ebc7476a84e165ff4bc346ebdf66cbb436aa4ea90b55a4491a73861081fa8a4b3816b615b2fe5029c736d213f84628e55052baab0e2d0c423eae220815634ca7154f61dc1cac59c56b1ecd4555dd1429b34aad48dce477e1bf2441991851772dc695e2feacd66d2c182080dfe4cd0992be60605bca8b4a178b1460fb298cd4fd2404291d0ddcae8627736e0530c3a4cb24e700d90a88a2a75d55cf7917a578ff359077f3933cb00908c14502de54efb2a16c6980feec94435b4ba147ed08910153c2851a114c38757f273add752779568152242b031a968ff25d0e3bf823177eaf68d7524d18dba88cff446f48a0ca9a6c8775f754d328ff3d60eebcb98bce415fab1bf6f26c4b404fb80980f34701d9956f4b9fbfa8e125b43d95e1 +SHA3-256: 19e6a3959284aa4d0d99eeab4b5028a19d504af3ae6bb0fadd4c879bc23470e7 +SHA3-512: 6f3d322b73e366c9e2e116fbfe2df5c97eabe702dab4ff2e58ba8e98ab2be776a0df3cb8bdece3deddb4ee8860bf6a8f9f91d9b3e3009502381a52527b0fceca +SHAKE-128: 8d4e06233d8edec173ab3da4861d240c4e051e76f52acf0e636f7837622ee7bd54c5a0ee72a266ec9d437f07dcfe4f8b3f062b3bcf242c6ba506f777116f92b80ce336cbe43b35e8533fc8fa112b4c788b50fa10b33f3afccc182484dd6beee11d39fa5614e55ecdd17d7e17a69ebdb071e7ce846efc36e752880a6788094fea6403dec3af98b49ddd7b9170edf8119b1e1807cdeee5630c7651db4da2b33e5432bdba0512b02a0b60008b29347de95315e6784dd07e7d7042b47b5709aff29d2f9ae5e9b37f9d4a42dbf276bc078bfc738ef4f33cf8d15655cbb45e8813f5e3f3b2de438a6bb2da2a52630b228f500bbafbf649686dd6a13efea325080440e4f2f059df7528a5c16bf4f1ccd45a2d53ebebec9cc33e060c385052bfb3db1e620503dd8f608629e03e338436bc742f9d8e3a570e1b4753201d7de14def010af5c8d091f27a3d332c3301f96b30df94f90dada1607829c372492768e69cfb9a92cdda1bf56f5d220aeba8e27a121342d4ed7c6ac98a7920cef07f088aab6b3348f9d34b6f330b063fece96ac04b4574c8208479e57bad1e69fb4977a177830587b0b140736bd7ed930e1b2331da9bddeba2edf2bbe111fe07d44b43ae76a684709ef41bee692d55e2c2afb10497dd8b071274dc5387b8a077e85bd7463d8dee6c8bf4d08026ed099ae1d7f92b8db28e6f6aa33a5492cfcd752c64c236086aed20 +SHAKE-256: c6c7d668d23b4b6fe38a2ddbcd7b5f896c9808857bbc1961f80d36ae69e01301727fd719488c980ea81eae6190ff47ad611e2ef7af8a88401909eae014be578b47b7b541bb19af9668baca24716eabec884f1076639a41321378d64162ba31fe0df463b01af01ba8ef7f43faf1a1ca16283ee232190fd8e5504aa7d4c59c4cf191e2401ff17ab605b8da096e5b2ae6f9682963eaedc5c32cb39bae0df1e84d15707f19a737cb80da87e1abff0348984f6218f487b69f0daf78f2f9b132592d256048e9b92bfd8dcdf89d7f5e39b5b4bf8dbc0168ffb39ad793a4ea6924fbdd5525c38a8c5d5ab54d2e5d9c909f634c205be79f01bf1ef25107b7e25861965e183757243b2dd80baab3d247e2fca959d6d12980330f02ee88818e3b37f02be7ec15803472f24a635de68244eadb8259c824c7e390b85ecbaa5e78aed43236b80f45bfaef5a148fb4bd2ac7005e4a4fbefe4662491f3de237e08fd03ef024e46d81dc3d333682e7af14163569446969d5f7f579af23297389d05842024ddc826204cbefab077d1a43aff458095843a8011c20f2f9b4973d7aea9960574f4fe1acec98cd70481fc2bd3bf4c2f79160fbe3b5edd606b63364fa0198e3c0d5d9a3afc78e2ae274343f035ca81c8251e0485285d07205e8d27cbcdb8596283612bc1ea22ccd7aa889dcf28fbfaceb98edb4aba6521583c8aed4edd62f794afe53b3072 + +Input: 06dea577b3a09d8fcae0f83eb084e448c9037b97230c56a0d7c2bfa9c0f02aef3ad17e9440a74e6eeb79a7dc09b44c06ed6e9e84c3077dc6c20faebad1c67567bc198e78f192fa5015585111284c6dc31627f6a344995218415d6e5aab5016f22c96755076c9ea7897c7b801811cab662494dc58ad0fb2ce461665541af52f845055e22c9ee92aa657dbca5250e8c4aab6aa839f0f9740a042218393f4e424e79f06b8bf33fa45e65d753bb596bd088d0c9ebc1fba36b985670db21df1d05bd7efb1ec140ecbd5ecda88e1de275a75ba96146dc6175891cdf0ccb8ac88df6d666e19b901fee624321c7af73cbadf0673a9e4bb518ac2303fb5baef2ea37602c2b27073d14665c9138c951d68157d297ba491f42afabfbd488edb80484e8c920c75b4d9264475cf7a999379ea3823ad9e4c66d871ca9bba1efe8d7457102b18ffd6057a74509490bc189af17348140c88d2049c8ebf75215bbe2a6ae99d2d1e0efc913b1cb8b2b9ca670a2d268369ea57a95890e841e559184b4348fcdb673b10214c4a +SHA3-256: 3ee10b6c9bde66fd26760edc830d24b23a12c9ee90fb845e2e66b61039531fa3 +SHA3-512: f123d185a90bd97b04563709be0b59becdad03eafd4e121f4b49df3ed25e03774e3c61666bc4133fef5779c0b52796041b41db1ab66d18ce7053f4399d6a6e89 +SHAKE-128: c41bf9fe4d41a7608f9affb7c7b08327f7007110a0d254885db22bc973bd50b9a5b4f4033bf8bc9abda0a202571a35033850ce01c6a283a260617a93739ba98d5f88327d0e8128ecd5996d5d47a8f866ecab19e1eb53d10e3cf8c531206d229964bfbcde6c4fdc38cc1086e6f70d1f2c0df0345e4e3eb7608eb398bfc4c68b99723e94109e605b43b2928c2bf0cbd222e1907e1f92bb09d84288d4c9a4a603ba3d14543bab5229cc5ab6bf4a6a75359d5973663b9bb868431de709f4fcdd4db1eff7aa4b1a575c0ada85aacc24e5064a3da89e82eb807643c6b66f3e6570f2e40a7d97e4c73f41fadf0c26794fba6d673adc936bd1c75b9a0be0f426a604f31a55c6ad2a65bd7f149ac8c971f5d6fd74f13f741f5d29fd36d318a021c8d34e4fbadae9256deafc3080d3b73c64eb1c32f73bd9a720ae4d3a6a64a9905e01936e44e8c0f882390d40fc9d3ef644c793ce5e642a8f0ff7eab75f214bea46062d0afdbcabb950d108c4b10f098196ad5621785805a44af9816e619acecc0c6498080988c9a6f830cad1a7877f6f7324af0fbdc6d479c5cd3f33418d8cd85d769cc85b3a9d0110ffca11ad532ec8d23d656e55eab03a5a9b57741943c63b3e7ee4c4728508c8bdff4966d420d0a58c3a3f73b92f0a3b009ae1fb8a8f9538d2a96aba99bf421d73e2d51f27819b22e0548257540af4fa4d31e5dac0dfa80ddf0adf43 +SHAKE-256: 78a94d55c5220197bbe4a86240d2d71d30ea3f89e47ad03a6a106a0e08d1be4006cdc1face4629a7c262c9b7497f0b78cf7abd8243d6e2b743f910b303350a3f446883b632873a1bd3357e533aef68cfa3b26b6839c922053f3b3c8330529fb5374017bfc8c4e28a2addd8a10ba87547df0031481fa808366bb85cd3446d50113fc0e7c5ccf349f08e525fe683a03b0379cfca6a366c5697479cbaa1602cac302570eb7580a7336011d2e9654b2e62d1a8324eb720ffbfc5c6bd3a139e95d574daa0aa2ec52892e651eb2b64e7f8e10b698a929c1458d78d44a92b45d45ebb7a81c160b88c9f656cca11564e7457abbc46e7d5087145e9e37d2df9278778c2c4699982ad709cef3a6b749d2ad750bac745a0ad455fdcc33fb89dce513cfba2df4c7664f068da8130a380ad0fd3c9295d4d54b3e46dd02de87ff87dd35f946b05dc105c15288dff0f113cd555c5ccfd3fadd3210aa728f265f15cc52af6220876901cc65eb0284e58b4e225c133e3a729d8af9876cb02bd71e526507bfe487f9812c1510c18d2446e66214e7a6e3867e7e6f7f7ef49cf6e9a1fbb3413a04d2a20fcb3ed8185b74b9421543aa44985ceb5cc6c15b7b10f142f3697a806bb784a4fbc228a4059bd53b3bb3af32f557d19e4cf9ad197c692c13b394c85f2690cc98da0cb82851a00c31a477f76f7275dd707be101710af87946107c34815091654c1 + +Input: 29b61423f55b91d6ae44c7bc4e30fcd28b2e7cafef586a2f18680a00f16c9a8aadcd6c068bc955e82646f7acf00a3e13e15b609553137391f31443b65974d9644afe0173d75f57d3d797b7b9e41832b652e5f4225eecdec3ed6142f900b8b840dba5a807462df1e06a46f347ef54d6b0f0ab7c162d04b1f120fedc4926b77f799fdd821683cde4bbcee95479df0985333d7408baddac4c98052e01e7b90dd33cc963b66501b8cb2772698ae4fdca4e0f28a73894210c1cdcb388130de2ab8088e41920fb1b966cc8b9ed5f3f880bb69a40ae9d47f0d871d790ec7828536964781830eb37981b4af8f7a78a9aebacc95ab96e75e93e817e1878759fde4fec88f4d8c1bf4f113c43bb73f9fee95f1ce0e5fe79511e7f7d29621607b11b91df1f4a27617b323891d3368281dabc8056c20bd0d822eae2d03c799cba783545aa9d9d505ea0ea3a2795ee617519b0b9d0f3f0c92b57fbb8b021fc07b68db1b2a3365442caf9ebf8fa85ff4f2719b936c83dce87a47604baaf5ef80c7865d3ae08ab6f60e32ba7 +SHA3-256: c45293b38ab6c1081ec876a7763ca2aca46394f9f64014884ee77fc206cebe80 +SHA3-512: 6def2f0f59595193d82c0cba8d6f3572656de5657ef333d26e476e86c89b218954fd9b4e4c5afcf306383e4c28a48fab71b7a9e6ea3d2f14056b048bfaa8b9a2 +SHAKE-128: a76a5901740448662e918d04e4123c07bc2e5b089e5a87de357cfaf0fd0040f0933ac8796a0f79281e83fb8368aa88747b4468debe75f4b3401e3b21df60f9279b04941afdef4f62d0106875b77da75e1449cdeb3dd88c2f204503c9a9009607cca17929a164eb6e164e131aaff091f628e92ecbe439a1c7cf3ad6536dbd71e79294cbbfcfc3410a420ebf05ada8e5c59cc0bb52a6d543418821c8fdcc89416ca5d18a0da5e2799928bca94cfe100111553a0dddfd4bd632b1ebe77ffbf63a9d4ae9c82fc4df4b47920307380ee8e057c4433eb7e71ae60334fb02c4e930bcd03d442074d5c18b8a92b2808043711605a4b874811e6af646b40eef437fb39fb8f0ccb0fdd2d2525b29d2083f58724a69acc20386ed1d0b6741c0c81b98dc6a4f73c7d69b666f3bffa2e8061bfc9de2190d6ab6036d2000f7000951c491cf7c5e6a52d7b2c6c435dd26a82fed355edfe99ee0938d784a7a6e80e2e725d106e950765a323b6d343c65c1fa666963f8fe12120ecf95f9cee360339120107cdb8228c47581669925b0ce8b7367c39fee035a811b7387f93067cb4350f1cff09be4c7b63e7003b950fa9aeef604d5ffd6e0acf5d1ee368d0b206876c34303064d7e7539f27779e3e62a4022200b8eb9dc45813d6e9dd012decf24446961608a5baf636d9c520dacf13158ed3f30da40b97810b0fb1fba1d59004c3654b2aab4e64338 +SHAKE-256: 3b1b004d076ac315a34b3c73fa9fc634a4786ef0f2a0f667957c88592214df3fe3f6a1cc1e0c5afa2e6f400845e2c06f5aaf1fa6739f3c104e96af1358874bbd787066ded75eb1c300acae90820828347f29e9e9da85f35f6b618e43c6787e5889c33c5d112d68d579b3d5f72bcb5fa14713fc9a968b2372bc8fa330b8da5cb300c32bf7d1576aadb0e2743ccf73e097f8771ddb8598d1906101062f78e2274a4c14b028b2849f014f9f8c7d625cb29f09fca2c8dd04fc7b5d2845be47986106b901b9543358c6d21148a360b5900f984508de24f18a206699c1eaf0dd31d59a04a09322e3321c9892df5c07a9e60e5aba66990ee5baeee317919e2b735b358ba7a6380482f0c25bd2d215733d1e4151c21964fbd5710ac456fc508f264ace4c02bdd06308ba9fbcc38d937e586e28dcd70146ca53f26c1af8e1d094a6d37c2f98cf62f0cbf130d69e984a339e0642422f4e7628c8dff4532a2ea7d66f92a9d32084239bd5bf5f9c9e08077b440a1fc6d68547e25f3c27ee015d1ea1b07888aaa1800f7e1853a83de0b882de3a554813acdb9f5d0176b8384da80828632f83a5e7a33b1765fa8c1ea015a11b68d0a9d68ff9ce953fe28c91d99a2b33e7cead83be3acb38cc7cc299c5b4243cd0a495ba276d0f1786ab710ff6d8b168f841d623c5eb83c44f9730cd2d6a7415aa4a865f46953070054d6ae9f87977d03cad4d1c + +Input: ae3948274283d3acd981ec5a74b76847c269e21bde741b6a0f1799a2039a78f030af8af0a24ca2dfc7e89ce5ea0131a39ba729c813cbeb4b8e45f39caca2169813d95e0d3d94dd0a4ce273828ffeff0e46c1dc27bd6d8135fc1016076c1fd38b4f59086da29c8e244905ec7fe216404f8416306fa613f156ca1d7a5576733f12a35fa83dbb4ba3c56b59bddf2066581d62f3bba622a3f20b6775de3cb23a8b1b8ab0976d020cbe2a4d24d0bdc9146f31f5272036a5055e07613d042c1017333847ad38c372fe562aeef9bbbd0e882d482b6744375f741d68bea2ac83b9d125caeadaa730e36d2d261ca87ef9c238c468e2ce2ab41e0a265bac6b7bcb65fb2123b562c1eeef50f9d172fde0d3de38b5fd996612985b83deed0264819eac16173bf588e545585f87e86256ac536a0ab68c6df54b9a985ceab91eb798bf8c413e3864e85ee2ed19dbd8bd3551e0ea7079cd0751d7c82077a711be3a3f778ab8d06b6fc8d90a2e543ab230df8ea663fbae161e667af9708e8a6158af2d625cbd5fbfdd0f82665e +SHA3-256: edd26b4304aa09e02164092a1824e45e059d610898f269d4cb555743f98a86aa +SHA3-512: f5883158090d2281f70c5d71b4c285769f7c480c9dc530bab91f2a3913713d8124f6717de07810f7bcee2e47c4faa9ca77a9ef7b828a88c0e507a58c9eda1703 +SHAKE-128: 706f1444cedf1593b7d726776d7f8ecb8818b8a51617a3bfb12357e9829ed1dfc658ce22e8f51bf9139d81cf1296029c1a424167a63c8fccb84b1388564a26667d7701bdbd64916e794ac3950eb798cb190bde9da15194cbadc767c1cb5a705037332c4ddec5b98d52c177e9b3e921614ac399fd37a9ff9f7aafb2bd7eb8b578caadfb1494e37868a8f4958362f873d0b6dc674ec1e4206bf6c4eb7e80478710b3aa5c0459094b42dd7db7a531ca4471f9f3bb213ffa44443271db1da878ccc2891d467fb67c560e3b8dea46742a5d9c9c1dde648fab63e63073fd1ed6e751b6046e96d99f9fb8978ee1330c3a85d3e041ff6451df51d81ec4a7415c6bda6dc541ea3ef1aa3c44890d77dbfc67f76d1704dc1941894ab19d4b88fd0c7b5ba8a16bad50499f48fa4e28b441e6ecbae79e0155774785ed9815ae7d11703ac6ff267ab30e1ac42a8ae140d5cfcb365089114113a05d258068b09fedd35ee5d0174c24b5cf40dc95736500811df0f62cd46fa505b304d3a93b24753ef0008e09d2bbc0c5be9f6385c4f0d939f89e3196e7d889c2421b1befdb571d903bf7d0e32063dedcc2ce88f24028880f7108bca816fba966df6b2b3ce3d02be2ccd45d53e19b63e5fbba02e1f426bd3cb775a391ef1bbcfa98eeee705e41927f7fee08650be63cbc3d65d03e9f92965e9bca43eee85af9b5667742254f3d4b0ffbeb4787ca3e +SHAKE-256: ea93a4746a7361ee436d5a5b1550173f628ace591a984a937225a6f349861a5cf14d2e15b141fadb4b99f8a5d18c3b06caf103a6e273d70b31ce7770b4906a12367189054a21b1f0f2123f25d5a100c7fcb25135bee2924bf74d3302f982053f32ccf775563241569f9719e426ad9cb795b208dd4997966e3c50470ef031fea50c2640fb686db00b877f67b5890f75fbd11eafc7139aa6975092b08da934297c3ed22301ff408e12054b79606e8d579a8e30509d7d5bbda9b43ddeb85cc20d5a2dda7b31d0f34d853b984952992b90d87c11780d4cfd8565a033e54a44ca655771f4a6aac16c80302dde578688520f50e5fbc044cb36529a23bd71c74baf6f758237bc45c84cc65e38972fd523e1c05ac365a43968bbf3fc2c340bdcb52d2ef74070c7e6dbad586d5023c9edb34b3a22452292813cb1a328c8942128bd3ba41abbe8034bf80a3c50142f964d047559762171f9d0d99e2069d56d11708ba65dbfcd4bfb914c489017589ff137ad9e53a9b12530df89e5b7284da2ebf381f3d1f15784c9a53d92e9e394fb11638498c8643deaad4a197a377857243ddb5718a6860a75858c3d4adda906bf0cf935d54c3f2ed894e90bb3b17e1377c99c5edbf00a2b970767a729507a55c7a6291e13570859d3089d66537f4561890663124e2b23b020572746b4bd7b328c28ba5850fd18c96af7908a98e34a341f65a2ec036596 + +Input: 68edaa7ebbcf5989c64e4f9a346cfce5eba91736de01a15186a44245570a166c13149cf6d8883434a0f0f0a2d8d82964913d1ec4ad13db7f9ba7fa59c0224d2297ee9015defae2a925506fdd7090b0cb94315b2f4044977348aca9e0fa56a0a0b204ca670cd8108de0e6031eddb2120b6dd8069332e4698ec29d4da1aa8c4d573aa2476fc8d544585d2fd5aa8634d1b0683bc4c9dcf5aad05c88d20f25af6910cb2475dde1d27e3cd81b3532a5e06853580f57404983e290415f0c7515294ad83623b5122d83470022485c297ee1614b2997173947ac14d19927893fc698ca9024c66aa839bcd193e1f812beb62fee038107c5940d1af3a6c40a2907b64b77fa18083911ae828513ede25d0a1bf783dfc678f0bdbf2b75792c931e3a6345809e2dac76c417bd195912e3c40b8020fc2721f3c961f40de14b0195cdac0243d2c858eba9b34b737ef98f9a7a73d7193234a969a919e41949c3aed2672a6a20d3d4f5cac333cf1668cef051b162a4f5862555cd4b42b66f0e83c35b52ce6bcb3b726928321acca8 +SHA3-256: 16229285931b32299f0554a9b27ea21607724bfe2c36c79abc421aacd5a4c285 +SHA3-512: a7a5a052c72cd4ee39667d51deefb383fca8742cb573cca6a9053756d7b391f88053effe1c1e9a5bd0ff19d2f8e0256e2f87e2373076a69e217d4c34c32e8d11 +SHAKE-128: df0f102c9e046b38022aa3823792162106ab28a86b31175b7060a81733ba14be5d5341c3ff42a387f2434cc73097988cb54378cf3ace6277145662b37e2662a421b5d6edc08fc5c8cf68a322e6440f65551289e669aabddc84ed8bf18a28830ffee571a1585124dd0f392c159a385ab784c273f0d0dd1b7b7b718116ab461fc191232f1205c9723063a46343f4e50c5ce128cf19f5907a67b8a1ecde245a9c5027a9198c393193577ff566978fee0434236b7de46ad7ef5b975119e99562036601c9178a07d5fe63b40385cb638e3d594dcdd171ee28f1267ad0e1ef5d3414e672a6a24df4f9e8e07af17fbf57abc5735d61c2f5467e8ca34abc6f73669707a6c33f76230c8f285d7319403369908e85f138b4e768b7836a0cc1b3a5ff4b71f65c47a7e77b0ecdcc1ff05dba5a0c52e4f8af4a3e9832df5ab2937275e06e47d2522be1fe2613ef55db04154016cad7d3ff87d781cbe46a077d5dc25ecdfd194dd156f57ea2f33a398a3f08970b802e5647a89f66d139b864646e6e14cfadd8876cdccd9ecdefe32b0ff944fc457c7e2044f512f72c533706811c758bc8203483fd5f36eed3834458ddb69cebcdf78bb6302c1b2f02306906931d68203ea123ce3b63a8b4e429fa36fcbf64cb26a50ae5fc87b3de63cb7e830aa1de9caa0ce3c46bb3eed7f7db4e1b1bd0e5575174d195cad6b005f7ceea9af0754b09f556a677 +SHAKE-256: be29d1621d863d606dfaf2b4dfd027ae1dc0b0d737c97fc3b80bfcad5a2d374a46da96e7d50c2a2f0045ab05756b2438276ee15fac7c403e349578732eaa99d354f5cb426120387f60da60a3f0695d620b8e07458d1f6f21ef05022ed0f8af81ea3722ec7724113972d4a256437ffbca9842c582be98957aaf8acfee2e3e67a4fa2f02c4e1c5f92fe50dda5976ece38830976510bf8c395be03f5ff4f7cd9295af202e8cc263820548f9233615d348a4d2a14d079dfba3c51fad5006805bb287437c10787f7ea8d6969b0a75410b8dd5c055e4eef7d029e757d5a372dbb432836b4667724864354b2c2ed29eb8615f35a617b5e589835049de622952304ee72b2daf4c3d6527c9f73835905590758d9c7a78f0721f0a5a3643887bae5f8d94a22bd0d42befb2b1d49db1eb03b3bcaf1cc63f96cab0549142a9c3fa79ea6ed736a1ce1b956bf2331389d22738fcc1be763acc520138f6b788241c0bf3a83f0c006139e2d09d155996cca21db5a6587935bc59b62f88cb18d494da0ea0122d5fb77b6ababec457b2bf3c7909bf0cf5136505b6d02dd3bbce7de8db94918ba89426ac266158728af6838ab82b1ba1addade600476074775fb544a0692ab397aba7af2263679d8d5c870f92c2790b0b1223309d49d2e58019601e22b8a03c0f27cb2987139698ac61b7c5ab86ae2377689ca8a019d8902477a7a9f6ac0d6634107f4 + +Input: 7a147b6569e0de1e98b7d27f86e794a0315bc9dcfacf0489917f3853b4e31963e0c585737af058f76112d96f10dd73c26cd124c383e161e45f31a3bd0921feb4e9d91c61d3c7fcde1f799b6a4b7d1382eae55fa7ca797f2a2ca666c9fa07f4507f81777c8b095014c77e782eb6dfb6b7040d378a7c83454e73a27dabf87e476fb767db3a04973eeaf3fcab6e4af85c1f37208147410624b488fb5e64c1ab1bcd39638e3234922b9d9d6d26b515db2ff12761cfff3913edd72fb9e50704582bac13cfe67e62d7fda45bafc5059950b221837c19d661aba5dc58250f800457581cb7601bf256f02815583dc8d2f6a797725697ee66c0ca2515c2ff6e42bfeb1dbc5dd750c9f2b1284ca2d65d7618f9b13ca150ca0631c34b64cde5702981316e427945207b1a0eb3d688fc4b541a2a168fb9bf3669e76b7ce1e767373ca31b97197ab6bb27aa94913ac0598eb1effef781151e4ec49786ca78545b6c8421930bb6ae1dd7160dad5144c5083b347042c1761c25e788933e8cd04b46b2119bf4ed549e0741c1df18de +SHA3-256: 0945695bee2d7c9fd9287b526174e27a0575d01db79e7c9a30feb5ab2884e18f +SHA3-512: 4d4d793e946c2f70b0418ffe97a5325d94eb4a70e619d833339fd9ce10d8fab09cc8a3b537168478ec4fac7b15e122735567f7ffddcd8bbabfb2f60f8106cb3e +SHAKE-128: b1935ad6de79d96fabec45770dfab1f1e000cdf05e8280c6138df24997eec2b8778a41addbe3503f4fe4221217716287c6d1bda4c5e7b042f9d951bf498ea19f7eb96828d59eb0e1920874d0e92b01baab48e9c901ba32a1cc1d2dbe391d86e0955d981fbc6329092716a94c5ddc1b411591245209fb9a9c043c590b204cc662675788adc8145f0517718554af37312e84751ef5613f16c00f8f91dc085bd1df939763bbf8e03d7e771b7bedc1fc428c9eed059b28684588425f4a4a84bc56dd585c0fd184a8b32bfb756b5d1af9ce55013ac5c266f941c74f3ee0e4a34d2ae024f3ac9ddc9d127c89ada33c7db0a5af4c5fe72824cb0966eed3562c16d83247e2004566d114dd436d4c703557d2c7976211ac31f1cde308d622160b22ec3918d48d2d699f94e5008906be3e6cf1104143756805889dabb2398fe2c7ffce2cd4bf00bdeb163603db6896313274afb37508ff9b051bc2ca2a514f0d92f31c6ae1cc37395081325f9d1b8e49f123ef4cdac8cb9aa1e6c728ebedae716c8e7081b350ba7927e2ff0f67ae5239abcf29a3b7dd87df2cf261590bd9e1c771f855e84354387035b8ac11d7a22365f64b9ed54fff51f3e5958a140eef8ceb11775f8a0ee7716af0fa01eac64b40b89772b995d3a29037170928550cf585e2df8c38066b30b419c05520bccd8e19e979947fd2ac17d096377ca831eb03bdd47ca2fbeef4 +SHAKE-256: 8c56e33df32f944f0f6d1f2a7bfc5348f9c76b03aab9f2b8c3a932aa40c6a0cc6870d06f37a49f24da6bb9be56261c6150679507f9bb6bea6025dff9b2abb6e36f513c192d289c1249bced411e31b4694328f0da2fd9dd0801ebd6f8f8c280ec1dd04b6702088fb0372f8cde7e5b7e18aebb5f99e4b7848cfa2132098a39a7ea3734c6bb4967544fcb7a37195db546ed3f1fda095e05d1bf972763e040aa2b27a3a1ee6f32cb4f21860f1f2b0cc6face83dd949554ddbbc60a3be7db0beff2b24c62a7bdee44198c8290c6e7fb44f0519127618fd573ec481537e959518cbe592e6dff4548def7c0333404eedbd61ab6716d69201618f53ef342606dce96494b1ee53eb6128605499afd84de233a6ceb6c1beef543227afceb451e5969c7458cda48f9ab7b23691b1e0f8bd3a9189f587198d03d68af187553d6c3b653c6d3c70b3268aacee367897d82bd5aa10fc9b09744a473869b145e39a68ccc2ce5d586fc4bdb87a117aa6089b7ee4b6627bb5da27e1f4e14fb751ed86c313b4954e740454927e530cceff0e15a6fe4ff5e59578b0db0081e6b928ee06f5b26b6d41c2165fdacaf7965cf54ab0d7354508fdd0a71c446b5a3d5aa732cf19d6446a5200aba4151e8f863770fd677cc96511c0c5e3be434f5b05556777498529e2424d43cfb02e752276880d8b55d69c1479a6e5ad9557d822b856dce37f326a944e19f1a + +Input: 8b62ed2276bb3c7f6f6aa4345bfdb2b1ef66bc89faa8c1bb5175516269a751af57626dfc9f9087aa6348058b0fa302933a0a6971e2ec09b18c8ad573b402a296d4b7fda0a4a8da0d02bd411179ceb1259656da22babc9bac18ce42409cc6e4390c0e249b67b886602338cb4191e5e51f331196f07e4c425fa0cda51da56f13bad1d1fcefcf4bff8a3d1a3d84035a82f629d73b8a9a5a8e4d684d53423923753f336ed7c67b88c44e78d124b8846caa4a0b10e99df571c5668c74136ee6c9741fac0c2a47dd8f56fac58e2c77ad78f18dddeb5258d575110210411c6887b41c94b1e446c55adf40ff11570f5740226386e4fad63ade9f510640b662bfef09481b6f4e8eb19efbd12ac2143f1a5f58ac7fc44255b101da94cb5676d75ca1fc04c7aadbe83ead268887369a5be872b063c1d76d5a09b7aeb8eb4f301e3882c88f638396b7cda0e2890cb7c439e4ad59e476c73cddbbba5a12fc26e0e7cb51e7aebba96a0c563387238b13be75deb5d135af0ffdb45e4c58f0704e792906641586d2ca235febe82fa363 +SHA3-256: ccc1dcedb1d8aee5bd47e37e181b96f3f9d3dfc9649178ea5cbe7ba4065ca160 +SHA3-512: 532f1a7f2bc4fa2b0e8797676c0b2851abaf2416cdb7ae063097b209db308ad3501f15e79fb2d5744e8c1601ec06f0b408f0f29dda11473330d2d30dbd616d6a +SHAKE-128: fa7434808fd360a1a46f22527c2393c9d922b63d956a1f5b0b3825a603dd08d2b1ea063d768fd0a5088ffa2e841190eb4c264859f90b64a0725ce70c609155b0abfe22699e3f8e2e79955f180dfc93818d535343d50f2f7967634dc6b8db5add13abb4ee2115e8bdbf1a77ec812afb12f79d3c639b29768706f5281814465541498387284f867ece49185f7f7bf0279d0f5de3e359760cdfdcda6ed19cf572535d225093a8519896da5ad56ea73c43a4d52a87e16864c7cfac130bf4cea147e030ec3d05e34aceea3c8371f66de73dccbc99c1b5dff9c70f43c65b24030559b052001cbae3515ff4128dee6e9b7979de0167fb24c12a785eb3b6b425f8a93cd9ab83a3a0eb8758fa6d4056740ca222f5c3ca4377dc25d1d531e662b293ad46992121af84c5823542990a05aec0a9ff7c3689284d40ab5365b96fe73109067e9067262dd6606777155db16528cd31b5f460420c92550e6bb22068e552adc6f14088aa84b15c6ef8cdf27ac542ba2d0e430f88a70317c6dc82bce2628b12629f07f32c9ec86b2613db7a5a4e5406cde885d5fa229981b1b193562fad324a9eaace9ab9e9cb9d273bfd9f96ee8681f72f7dde28fbac236921ff1d388540a19932a5418756b360eea52beb68afa6fcfba73f5ea9b5873b7a90ad67ef9818a06b8d841dd9da654236c77bc7090fccf2a4672e8cc968816e9ae9b767fae24f74b55eb2 +SHAKE-256: 8d5917d846f8ee3b1f2ca19a963890bb04d25d6cafec48a0b1f1a739c725c838b1bbb94d8a4c51195f7894e82d0ccef822c98c5160818e2ef6614a2a75ec05e326d5eb1adf7b7fae6e838864dba71a78da10b9d72aafeb3634d41cf7aaac5e196e20eda168b528cc19a5cceb47c0566b2e002e7ba5f2922b88943c8947c2cfa3b0ee18025d492cfa971454d15ffce6aeffc3c301bda9c0a1e6d5b397feb0f39cc524bdbfccfe7894d4dc7bb8a50d63222e2c8589813123247cf6e0cc9c1b24fb15c51e89d4f321f268ccdf59d1240ecd99527afc2f404f902c8296dae07e4cb89caf21afecafb8e6b0f545822b8fabf386a1505712834b760ddda16aa8dce7a262a717760404944cf3f03fb50eca8ba58f265ede70eba9a0c9c69372c071af54ecbb9456d8d23cefa2c9fd9800c492d1424f3559488c8e3963049e07dc6f9092588cdc6864a592f638ce3354a4ac5a04e1fe8e0e20e1054ed0901d04193f9c688d0c8c08eabf521eb9490050383f72bb3af75159d8623f2438a3717b53af826fce325baf312de817b403c7b5db5290706cc4ff4228bd59011989096e6d08654d1db51ca3b1357e6d949f20df94cd1b8481af6be42702d92a96d8bbb72994105a0ac10cb90475a0b80d829a5b851a7f405340cdda82842fe438b9d449680496c50b6748e1db1409c119d9b92e628563c8c3479b2edaebbfc6a462d2c5a0962a9d + +Input: 3df71463db0f76c708f21cc1a9c05420a0480c1150d4e0e7621b2c1adea238bad6e57dbd51ada652612e18195ac88012e21644104588c83ff3a99a1104870af1d6e9cf81626841eaab3a738fe420384dfb77f416f1cba702bdaf4dd9afcc492c71e9b0fdab4bf228b4d79ebeaad54b5b7b77eb52331930bea8258ac89033e1074f8f29e4b4a4cfaf5c7ecd46a81d93b79df5a9861ad7f19cdc985417bca0ee99a972d2e486df93e8c90229ac0c2fe37ff4125405e8b7ae3082ec18dfbfabb490f96c2bba32bf9fa7c59d9549686a9479f5ccc63c580fcc01e323ef84c809255edc625613f07b178449610587b655b38abb072eb5d12ef3b985ced2a9228cc1346c0b0558ab21306cc20f2f7958e4f12d9c75be15ce7c5fb0bf967b841f1059cd89d3e16b521c6ad84dc1eef512aa7e888ebdeae092bae3d56d11c3bdfcd8491e3b37dc76cd5d92f0bb126e7e39c0d1092f870d2c54ca02a94536e5c27e0f3d4561e929d4c202ec79120953e67788f973f1f43359ef257113e84067b266767c207dbed5b3e9e1f079ac +SHA3-256: 8132cbef7fd40a14293be6518899994f5bab57284dafbc15b635c49b1b2a26b0 +SHA3-512: 81d5f661663a713609e8c549ef8a1cb304d38a34b61267777887fdef1da5dd9c2773890c58a7c0a10c248413b7438774fd2f0773f23d690c45797bd8168447ff +SHAKE-128: 6e0f49cbc22af8874eb98b2aa49595033e53aa3eca638509450e682ed6410d5977c5ff1ead2adb2fa4eb6db02822f4d48346c24f272d41da3238b2312bd2b9d5c09426be39bd1b42ebb19f3c2fba6f8b912070b92d2e1b128c53b592c9e460d80ae5e6193124f4cf2f1be0ea33e36abb59f93a99dea952f653f3019afd6bd9161367d0bd9db79039abd5751af07a47379b07d3741f9a2178cb0640e0a13a43fd5fac407fb57a105685bd771e9f0d55ac86cdc4402a4c2eae1515bc05f05e9bf3ee13014ff1c4e465ea06ada61f1a73dc34842f1272018ec70f47cf39026e1e158f419b3989fb98a54e3070fe65c16846dda18ba77932647151382719f6b2db07f841cba2ff2374c271d6258e067f88cf1e9c86a8f3a63249bbcc9065a2dede4758e48c9ed13a0a64a78697af9a574adb5438aa9408d5a70e9223296f24acd6852cb5b20020963ee7af954f66bf9734c0490e269b3d116553bb3238a7b16a76e2860470f7092bdcfc28244fe6a043ea41590cd202bc3c717b9458e75b1a1cffb81b78d2d008347c14ee60871771678f2164b136992408fff07322fb9943191f1c92a05487720a1c5cf343a2c88ce3ae6cdde0911109c62f7f54e55957ff273dfd731c93a3218fb4cad35ccb5a9a7bf6a7307e76cf1c8390f93610ff545f87986c9abbc4414fc6d186b3218cadbdc3867159a9b97ede724fd8b965c2f9463d1c7e +SHAKE-256: c540a118c334ab0f74a1713ad4492d34a685f745af92e8da0edf65853ae53fb0820ea6d0d224772b23a141798f3bb6e61dc4ec944979aa4df6b5cf91b68891767787405ec9a088342feccb479dc9ab88faa5417bb189d08cb1fee811a9ddd8f46d7302cc845261f9765bf0ba444c566bc9c0120097b5e759c1940e0fb857ea5e03ba27cd7d738ba1ff3af7004a12bfaa967e5808573bcf60f71db7f84455c799a89ed23f3951c47d9b874a9da8bd085a18392036fe6ded6c75f81b819e8a015006af2b53a5b5e9e57900e542816f15633af74b17dcfc3d49edbb5a8ad7314fcf1070b76048a100208688a70438d48e71a3cf5af54d43608c891a91c43ead9c2a2e9107207c4c032206041194702b688cf2413ec14094599b7b87cf0a9056453ccbe7f5d44b9c790b6c8c303b5e95d69def684c4a0209b6e4e420b4e289f8dfac69e5d6ed07aba81c53408021b5da75c5d5d9d14a90bd3f4cd5080464ecac030f973ca026d7b0bc4d082ccc070794b27a542dcc7a3f804f6388e505543945bd19a402cab12f8542a3c0f4b6aa5e0716faae18c286b51d43b6b94594e23e15101bab6456da5304719b08628a6b65229b1daeecc9cc3fa1d6e4390731a0d7c69f00263581707f124a21a88da8cabb5fca4f81605de1c231fd95a2bafdf1e88bfb7178334eff60f919ecb60865689db475c609f1b28cda0e268b8119cc4426dbdcd1 + +Input: f5a1887af9b02fabd048594d5c5649cc3c077e34a4eff9677146fbb84e8d14609f5315d440c1ce246f8f8a0a33f58db6e0fe2a31d66a1d2e2b82279d8d38b0e0b2381af396f1642d9140a31702ddc36d6a5a3b36ce510dec9d85fac0a707ff022f8126c18d56bc5fed4e61b1acb10d7cd642db58f7a2c1b1aa0266b47725942c97ff08204129fda483e63e8dea31660afd31327b340eafc56a88e47ae34ea759c0dfbb506d13929f0693f7a73513bb16e1e48b77e4132dd62aca4b3a408f77476aa34189de868ae6bb3872634317a0286c798d0d32f450db7017c431683480259151c86594032d0e2a181e4ec45e0c717efbb48b8e486c85c76ea90dd3024c45742c8672efabe56a3eb6521b4207f55f71d6a7945185a559f16e748e46a09644bdd1f70a7329170341e670d2554852243032745d73195a38cf57808bfd2ef669f0923446df7f2a7fb22a56344c2f89844ba2e5fa9353b571bfc2cf1728d1fa25e9ff49c49749d40a86227b066c616b6040a3660a8b51a48817462c7e21b2b873e6e4c32ecfa54c502753 +SHA3-256: cfe20a5670ad6f19fd605aa16fd9c191e5fb1241f83d9839400dad1a823da402 +SHA3-512: 7441d090bb6ab910a7e69630cb736b3d7154f3814545754acf3a3a7304169c0c23224c98055cd1294704d3b979cc1aae8ec5fbf2b3344dfee0caff0e54951abc +SHAKE-128: 81a346f66504e143f7ae9ff8a9774ec95d9dc74cd183272f4e129a9da361508d261449586c0c61af7badf9bfb0099128e04b879d6fc585db274cf4158f7cb73176dacfa17b267676cd9b4c658c6c5175f5611b29b9920b136688abcbd4bc5f846e82bfb46d882465fcfa6b56b21597b49d4596d987a856dfd9317a39cf13a355e7cb2e221bda0f2220f10e5e8d5c16291f85fbac2f67a4ad383a9b00f340cd58a254df35e395559558d096bb52e54ab9edbf97ad682083101c6a78245883426d92bc21b25e1354b18cdbac3119f76757cc78542aa7658e61f4b846c4711018234e9ce093037fe09ae7b094f084e072bae634bc6e8bd7b720f12d1935005d9b14b513cb9559ae84b521bb7705084965e29ef1771f9c243f3aa821864651a8f777d7fcde6d068adaca7132d00d9f769e1e5353fd2418774375b7c5a95da7bd3723b417e41956e3e42c3d19facfb4a5affbbc9db692d010cec5c97776756803fb02a6ad4729a7f701316fa459ce5064278a40154e2b7fd10f0868426b4dbcda2efed9c4cd621ca0a87b226692cc7170e1bf482907165cd35503935cfb6362c41e30e30b32076a7c1a17fb6a84cdfe0a4429f776b76414e89c477c5cff16004821d4b5326bea81fa182733b2db6cb9831437646e9dc1995044f5a5e503b8b5c947e88983c5bb3fc093d7efa428c8637460694605833d5788c5a4f4d5972757556016 +SHAKE-256: 87848c358ef2fd8372c76ff942aa2c1ede06eda00cd442715c5aef0e86b6ca35949e7cc3a763440d771c24847dcbb1bd97007f048756008d81b462762e5f222c45b3b657b50ce6c5b703dfad5b5eef13edd31f486927c93bf4d0b360c81aeb9d8826831c2ee2155797198d375a78057e71d6bc333fc81808cf26bad65e6aad9f97e12fac281199d0a5886f85089b07e71a42909172a56cd29834c465fdd11d224756688e85fb6dbb4af5561e7824b69e066ad8475b632ce17f48dbea3f3c65808dfd16036e2e525b5fbe5a506e36f6f40bb7c7922b38d462fa6463199d6742ad9ab83e45b672354f93aa975ca7859ae93e391d231dbbdacca6a9cda16e59c2110cb02c21264252f47ed1ea62a543694db156fc97433c1cd688eb644aa63e05fc56a2b2ed158cecf349a37c6ad1c122bd2a63edfe63d83323475cb754a4010a01d7d43177c80060fb01b87ffd05c8f804b1f9f059f7dbe667c5d7147500dd003da0d9db71541a8cf210f610048098b6b686fac3cb6dc8e120d63ed2e1e8c249efe1f1035c240c74bf34ac4e96b47fc3cd75ae73872045beab116441e0e468db5a9f519adf93e68a7677bb22da09c571deae23bd80c681b54aba86c7ef917e3226773267afdc69892ce358a8bdaf31826de17cc648e62e9a7b0e2b81263c867b1227c68529d3acb7bd41de2a072ab740aaac9fb538be7a0a2f2f59061ea69fe706 + +Input: 3a4af0a5292741a7c97d2ea3715107ac96445154b9d3e863fc6f90ee70d717dbc42e9892c361ce0f913385bb4e4ef33a632ad07acad91a289f0d49de7e27625e95a72d28d53fbfb94d3a2e24f21575d0361e160e92b2ce9aea4aeae7a343e7597022e198fb9e58f8e2688df21fc655e7224abf06c20462776d3f0a5ed1aee49b5231d267856a623ed9c1fecbe4e136a9ee7fa6b23a2f8b7e8cd8beefcc9c04001cfc89dba50ed610e43363223d3bfb3cb67ac04c3516e63e13b6e68bacdd482aa02336b7062795abb043951ba0a608ca94d5521da3fc90b4804d3d9094882e3f4d15278ecc7e0945045e3d7f51193528791c9302f16e105914dc94b0e5d927f4f2df0254df91a93b1319dfa04311296e9afe19f233209c444574f310d6de16d7d8c0c289b8461fd599ceb0647b7dae6858db52ace9c6c4c80735b417fba412b32b6ac02a684eb09242cb423cde29faa45249ea0e2e5c92d195ea5f7ba9292e46b0a20acfd4f880eb72f9f9edae95abcf03114e1a53ddc10974428291688b8261727e6f58212e9893ea3b52 +SHA3-256: 1376e9249aed022502d6536cb99091ab4038a82b5efe05deab15146ae395fe94 +SHA3-512: e0df690af3d6a3dcf9d18f78f04b17179cc9ee8ccca98f37e827d74dbc52292e429290bb9060e6d942c910f2db3fd09562dcd14cc896d9e7cf5276432525d364 +SHAKE-128: 957b5de6f3a27a14fa51b20ab9059c7fcec15bad0c364aea964417c25f88a7e2f7813a0e35f0c7e6b23be94f2802ca25299e48c1369cba05e92ff6a30b427e76de21abf575baced63c2cc19c3b4b6aec41aaf47fb65b923fc3251481bd4a025a0c70fe70ac0865f1b705a449c7b646e807d29f88a5a9aaccd3b350d016c4408f6ba2a89c5685db8dc98a595de1d02fc4d4a03e10e8d7b4d11a5ca0c3c811d895b986fdbf5ba1acaaede703c66f3b77c8979431252009cea2210541f4073bdd9f9c0a4bbcbbf1d9a2145fded61d50121c8fa78841aa8a946c94cf6815d10cf9935e250f3ca3cf05986bedb32060adab9d9b88a43d0d1f2acbe3a7094768a34c485c281195237492b6bfa52500fd83da8dfadd3c53fb4e1c4437cd302ced0c44ee83a1f026d0b064ec62f745362fe3dae0bcd1ef23e48037fc2d499310a45c860242dc1f5e483b3d618c8cbf141b81986a82c9109852a579863d3d46f402300e655641b5eb40be3257834dde08929ecf662217dc58da062d9d29bae5b88e74ed7bcc846583a53e87b99071406c359b973052634ace5457445f227c5b602cef699a71771fc02545aa638238a2e81dc6c30043f4a5929a636caa197369959e44215e6ab298a524d11607652ab6a9712e1ae7236df7487e5e4b30447e8c75299658e5563bf8538a78db187cccbe975baf8dffa636340947325ed5ac9900ee4a87db04 +SHAKE-256: bf6bbd0eedce120a22173f54aa61fdf3bc75683d125ac416baae9ae722f772a361dacf5b599ef047888f1c3d6c4d47bcad970bec1ab80eb18cd15cbda54b2ce65178dc9fe4358730971fdc908429344ef219dde2ad69e599a3726f7e0a308c584eba43ed7f4d683e1dee30fcd189de586fbb450f2f5e2299919ffb6a59f3ac0ee20414a6a2dc5e919ce5e754415bfd9c6f719cbf4ad1ccd5e5c861c6d8c5e37e1fd80edb66657cec0237a6cb45724b7e9db2afd8532c6e022846c74861c01d9fb5674814f70fdf97baadbe05d56fa3425e2f896f5a2e5c73238d6fb11934f88ed382a4bdc835f827af74c32d0bf1f0fc4861be3e02671253977a3e30fcb76caa1d99a76a3e3b25691ecbf8ddc3c1edb8c844d47ecca35cf231eb08fd6b641fd053f434dc1e52bd07552eb92c78130d4af356b2e792896c6e93e0aee758ea012437296ff3bafa607e2ffc69c4c3afc67c18240d58f0c27699acdafbbfaf6f81c0b60acaddc0d2dc0be7a144f4fa8194c6f33995d3c15fe3b63bcc3186dc80ef74f5b405c36a50a15ac37cb7d5766e77590c91153caf53e4e7f2fecc53f5fe1aa990a8bcbeac9c03afc13b41a293359089d9c1402e29033c8e409fbb2f56f5df77c2892b095ee9b4ecf1ecf9973c93e8f3c9df67dfc513da9b6b06bc34ffc5e7c4c19b396397d31dbe0ec494eb1a70a0a1c6e5ee472f92203e1bad6d23681e49dc + +Input: e1c921c68d41c7933a21823335f625b4e86c3ec6ed83ea9c74acbd0b9fe5ae40ae187e5024cb785bf9ab1be9ae16fb35c5626dd103c05012c4d8103a5fdc3bfc16d1d04679620c630fea30ed2a3133ba21a21472cb49cf8881bee184e5acf63470575169829479004f0782c414d5d492c259cdb7d7931db3e48eeba0ddf5ddee9bfca0e516672a7f738d3dd983c7123a5118cf4108628343234d6a46e72c1f692057b9998ce1bb85d0e409f2f2ecc4db9bc2a83bda86ba89f9f17014e27e6b5cd123c2c61878df96494da43690c813c6271c3ce22e8339a5d4af5a8016878c8c44423c26e6c69b03ba065cdd498ec8555501c71af6670805aa40e4a91eb458d2f91266b2a8cb42d64f293e4085b340ca0ca3ce9df77b41366ff9e66c1752e9caad9f9a2e327abac28fc822cc61fd656baea3bee892ce70eb9bd975c090c22d6d73294f4a1bb9caf63c197acbeaa1b9420b05966356caf9f8920bbd1ed4d4c584876caa8af7e5e803788e28bb6a7303db743071245c3a79f22f88e6d415e39009b5e88ff71aed406eb51417a6 +SHA3-256: 58945aec00f1bc845a8a8f2cc1917b811ae46a692170480e04c289f508c5a7ae +SHA3-512: 9499a0fedef7d0016467a1a68efc9aa27e6a5b8a917391dd29f6aa2c94f792186d60488b712308a116a19f945aa0ee626e3009aed2b5aaaffda25fbf38736fad +SHAKE-128: b596dd197274982a211fbbba8cc31ec3f58e7a34699bc9e0013098b500845c074ac7cc993e618ac158797afe81978c28a5002a9cff10f5115d2d414cb4e2eef593264f127e62cbd03f7b1c83f6f57ffa0f744ba2742385844458367579c48786f6fb08d5f0f9e6625bb0c5653ab429d49503d5ce18b67242654b18ef3988d14abaf889d8f9b39a6c04cd48ed71878eb91a8f1ecff0d732d316e4c7e76c0fcd3b73ac1fc4b0888ad296fae87d0c8ffd27a59f482da043c0ec84632c249b26e3b9edfd18eb7aba8c2d72602cf569ab924a9fa3fcd0d9be8e8e30c06d9e455f278960099305069ddbe28e187e27a28e468441274555754ea714d6aa67f6f9c53756b71a3c8da0b4b34a68783825cf7cf1b5c9e703bd4c92d4927ba3fc12e3baefa812af098fa65cce43fa1174e06e6fab579c9d872e5f75c14e547417a67a0ba26e735d96d536668a3903c6e326403929c558a9c89d994d7d6c722a77194d2c4c6e1a8f5c03bf59896486e6be433b408501c37f8cc32a46b043a745691670d95d99cdbd122863fed07d94abbc3dfb3e71838089b5af5442e466c1873d0e40555928eab4c0bad383974251c920460a69d568750b7dd3fe5a5a955832efc4900af6ffdbe2a7cd5061753b89014c1443f6169af0a9bb50283fec33dc1c85b53c612c00ccea6ffd4d2c0301baa8c645c6957963665539d51a4496d92592e038932f7d30 +SHAKE-256: d14ce4ea407aaa340432dcd6644392dfdf1be881950fcc12463c63434e5526016250793933da08dd0d23f17b49419072ecb216947ca11a01c02c8c7848ccc047d29ccdb50c9d9bc6e4ae86aaf95089363833e6718fdb83c99cdd38fa4c5ba25ae1ccf6f3b26a02c4c0a968cd54a92a6fd9c50d439138a3d189038a0d9e64079517bcdaa104f157f9e16c137a5ae0e09cb6547ba0a09202ac2416df1ee662b13319055c1c2db2d9103096b7f6293a46f98f3a79f587bb50ea575aa3637f57ee99c5e613895b249f198c0c5a40898c16adf44542df020f4e8df430198ad05f31aadb8a3d30bf0564cf57c29f56f4cf6074aceb9198639ff1e273d28329cc18eacc481e8126a6a6214f88715667fedbad0f1d9eef2980e49136dfb0d0ff2c3101a6d24e6d2cc38cba98d8564d189d526ee627e78fb8e1de90383bb4909785fc5942b3cfc763b237982769a63bffa130b05e8bf40fe63f1a2bfa12cfd4736d8c836b7dd11f00f43691b5b6b20ced161b2797dbe2dac4afe793999bca208c2725148b302ff6737bb3fa5d877d4f43a88ec59ec266cf16a8e25e202434381d477f1261e4df88c8be6d061b0a8253339cc6d0bccc515cba38ec99416522ac01e41933bf6b67fbd2855faee4bba9cdde0a758f67aebff44620a2bcd6d8e62ca7289890b938e77831c3252441a9238f52ad263f4b57a85b17f34b0394ad1221c1d7617bcd + +Input: 2d7e340c5992de30a18da9d500d4c7791cb7917265846db7a1a368d86a3dab6d6d9018c64403961e0d59289d8403f498d5978bf2e11ab8084d79f9d243d7dd7521c065515bcd41a4e897411347f18780406d554fb1abb57bacb586ba3ef8aced462a59fb74e2503f8aab7182bcae6714e7d3c6e1e28890b418ff63870223c915cf8c375c2107dff152a3616300463f40cb74ce101c8a0839bb88fb000f1ddeb76d80121dd79e8cd8e0decbc8d0444e2e649b56aea12e569269dfd431ef2a6a16332994feaab30956948776325f58d1e74eaaa408974d248278c02c5fcb94e17451841fd69aecd8f06a4262d4c6b03ed96746adfda38b476c9e7750a1536964601fa6625c68f70d384c28d4aab6d63436637c69440dab709602fa082bc1cdaa59b8a73eff70261c6e361648ddf8a5f6288449a1065c2bfe4760c921a677643224a08afea4ee8e971e2fc4ac1295839ef51ea37b0e8add666a7ce51a9205035289bf7382953704368c36ee9ce77e3dde31b7c06f4b5fe1b746608beabe0015dcbce640afcaed5ad017bf6941cfaa +SHA3-256: 74f8761d31c8139b13469557e5da3af8b577762d39fc47d4192f1eed0ee3b92c +SHA3-512: 7d68a5cb8d26c2c6f45319c15264d51d69f6d42f578ba4a8946dee1dd9e77860c7bc30b7e5618907b2d62b1597cffbc427f53564bf32a2daa1071fcb9f3158f1 +SHAKE-128: f73f5f368d86f9a1a4de508dfdaffcc872f144c67566d53e36895311c056f79e729bc6098dfb910df952a84fe915107f326e958714d1823d027433b17e7cb5a8130c41458e2b243a8be147b84932ff47a6a1d7d300d377d6bbbb2d9376291133b588fa9ea960f22177e4db7994abb87f444016decd8404369a55a154a9d73bebc339b3a6e098551ec02940d6dcb63e0c9c34cbf16737558f2a138f60d5aab4baaf3528f0208848f609d7ed8f857ec8a34cdc08c88d93f145e7d42553f6496c021e258fc329bde7870d278ac7761d99d17e967e9547dfcdd679fdcacf6c163ddf50aeb5c8fa7f2b8961b1ba3465cd1ef49998f576227bda7455b2129ba037efd22046e9b6daf92d484cb19c60935a101270c1fda39d0aeba436ccd6c7ed9cc687a878858224f9bffd9fd074039967b2029cad5930a90c52e30bd3b14c379cfb385c3ea7ba5e43374fd8aad3a5bc1c641c3364ab8ccb33b44acd6c3ae631f688b9da82001194c9d60bb260f117a1eb9e17af78ce5aa72508710cc5626aeed2c7a43c35cdce4ddbb397c46c36fd973263211c8664b87ca0be17c652f2c0bba662bf99628d1c28f07f11de1a28d49d594bcb64182f72f918612105a790ad0bb056455c6889a9a07b465266be1a87b6b4405f2e0687e46e7f0f62020d15a2f93caacc692f558bb46baa3ca58bced76ce2d0dc71be1dfa9c3ace9a47c618e9fb33f248 +SHAKE-256: fb187b473b897d866196e18f88150f2b96581caa25aea585f1927107ba353bc1fe8fb1f1e6a09828fd88824d47d2b5f2bf5cd756f51211c770a7d0e1d89391cad07b8b56884d38650a2f695ca36ee8374cfdcc961664edcff246756c6360ad5ee3851a4030f5881a7632218c6f607ffe4b88cd3b9dc4ffbf5ad71c85718dfa9ede0404e3ce9308142c77d9f0994b1764ae3445e37f3ec34d9380c0c9b7d7c18dd8969ab3174970d48148ce1bb2e6a53b37c3852d4e32088198e507c6702c0612fbaedcde2ebd134186b91da935c243ef3579089b362659540f9d7846ff2d597ba209753a5975a1ee2b6cf229bf22309c4dbd10d2c75d4836b943797a7dcd9887c14590fb37e185e7eb32c19a476f1b7488828becdef7fc323d53acb7a125367625032f6db439f1626156e9513372a0557b79384e303cb7c4ea527adc08005a2fb8637ad079255300d3f788a77a29000c9547e6927bc109dfdd9803eac4e67be32194415c0c2c1f5042a51fcfa3de15182b0720bcaf47f743fe81a97b2fca5c5b525e693e5a1bd295a006fbb9b58fa238678c4d8e83063a15ef2f02a7b080d24842771d191bdf52533e89f1663d3735aaae542a82295e0134d4cccd95315b669975d248cdc5e8e64525f0a02ab51a303f8bcc8d9f47526237dbda29cb4e16f13b5119d244452695caca1c5a2fa02f09c4fde43668f8f2c1999b28cf86a5c08a73 + +Input: 4644288aed84ffc12c24383a71339aac98e775dbfd43482524a8df3dd99e5df181f23aea9cbae39f780b05c823b2f0474483eaf5fbeee87704eff7081817b14d93b617d9bd7726a34261eea5a8a6fa64e9d9f0a7501ab543e2c1fd60a74ee5bfc55f2a432cde8c6865822d1a2f59681a0c7de93f96cc39517ee0c3a13f1f873ed53c902eb0dd554752c9da20e21179afacd203f325f994436557783ef98707ebadb30af2dc7a0aaa120031ae52ecbccd3838027f38a223a18f285bad78e4bd5a050b17c90a1ea3f2442987678762ca8a57f9b5d406f0e0f0e626939612208efcbbd3df3463094c88dcd712947310b2ca8cdaadf7b5192725ccd4d593240c7fa320eda5685ff83732abe1bcfa16f644568d50ea886e951f291b9c57fca8cd5a2d86ae6470fb2a2f141d8f40d3a54fbcc09d76a57677f963ee58109284b238f0f3f421120a26dfacc9cbd0a4cfb2bb2516f053d692539465a2725af6e7d5e5ce1cd15d8079ac78105c18ef3f55229f5629eebd375d5367f108ccc64b788e4c13c9e7be2505e915297defd8a1b39e90 +SHA3-256: 393f4d54c7bc96b2790fa959333d584215507463265d0b513de5fd6b456f727f +SHA3-512: e7db0a035bdd41f85366951dd5add7e67605df7a0ca23ac3be177e71b5c9ac936bd6c01a0491a97b7c3e02e234aa672f70853df9c768ace9c5aaee2eaeafa002 +SHAKE-128: b1fc316bd98d531694e45eacf146451cbdeb42f42aebad24c64979c079950490919196d95adcd7710d90a5ed16200b72434d4c2fd169e97b3fb5092bbbda3d41f7d19fc8e84ffd922760f62fdccd18978b3ba9d25404c8408e2cfebab86238081315c678597323955baf89fe3e496da16cf064818a8c0b4a515f66c3b6f174282910901f10f042b57e02ef06ae38b2a3fb2cb44cdee923c545d31ca60e739e6a3138fefa862fcc9ba021e96d6f8e2174d6c6da898439612e0483f2d12ce5f1addc5416923d6a572be2c85878705cf1bb3b782ae93c8b28c43ec132c13b5e606372e797ed27f7fef54fc5b691a4d9b698b797439718307af9ddca256441f25215e86c2f8e5758998d43427a8cfd034a26511c07ae534f1de841cea6e69c0963539b416dcee0c573c6debb4dc6fbcd2ae634d4cfbd59ddddd6fe5d6b6cc2396a030f0aa901eb5cee3c2af6d7f6af0907dd461deeb729913b5663d3fce09021e18c6e3d82a503f5d51cd5f26aee454c9310b1a7d1de6707058073b567d59e8b83d27384690c6954aaefc7b44e4ce0d7cd110f4e9ecd3b77a835b0a4ab097428f3b4a1f60c7f241078c9fd8c54db2fddff59b25d254c860c9fa5ee8197481f2b672678f0e287e2f435d6d31d3610b284fbaa8f7d5375ff51712d63cdc7653f14c54027568709054417837e7fcf218bbb6497cd80520233cbb99d618dd545752e79ad +SHAKE-256: cbea31fbea071dd2df595a77674baea79f636bb090de0bed63f7d58a2d5ef29c9e95f9711aa15169e6152db8f64cbb7afc341a587f955410e99f83f4a3b25608778f6c4e3d6c01dbd5558c6810348b838dbdb338a996bd0f8ab824c9b47e5d039be845d1df1f28f8c0f69f2561774cfd12a2ce8654f7d393748ed5230969534bc6a2b2dab21a658b87f031521a7543a0da9912662fbbad5b9049ebad3b1aeb8cdacb4658c39d739f57c7424372f52d772264d102200703d2b507b5c0b4cf57c6cf182d200539dea6b4eb30a17c82b73446f5f3e47536542f2ee5f5b40e95c848993e286c688ec4ce243cbe3f2c1b3dd3fee022bd0584c856bc33abce447d423765ff69fb0511e25a94abbece5af5a12de12e6614b32c79c4dc6fc2f599ef5947ec682d890c74c9f1019fa8acf12c0851f06212864b70205027c23df3c23ec96c52db218bd5cbde63b132417d061df9d1acebcc97e323e0cf3354f53bd336559f8783fc7d0785f24f87bbff15226a584f4d0d640d2b22fc75c464dd3fa3fd9e9e18d12d0a7a0bf1a584827db98ade4ef93532da6b664a5ede2bb865b8a501b4a703e88ff138a26081ee37a736c9b68bb014e033da050c87534269535f5d2c67da854a144ec9032e31da45bb9a76ebc480c3b267db63fd1a0586fd58ce345ef39f0717103d46dc703b09449bbd386c82a48a39528134579bf6efccbf552df12cd6 + +Input: d7e9eaab91857a014ec93e8a44a61c454ec8051f541e4fd3e99c7a1f70ad423b87dc79987e4336f2868da8bdf939ded0858c0fd94dae0fa495b2d36a82e029a258657d4049f4250d76842f4d3782e3e53d54ca0d533b6a0d7b4f5cf09fedf4713d7e7fb8f1387e2bafa66e384b10fee52716f3e1e6f2580392ad3e5c11c2ed0a686633279a32de81e41aa7a304621c8f1290ec35ad0d6ec64b3d4b8fc3a43dfe67d5272b048c1702002271f670646bc64256d9335ff7a437733e3cc810df1528ad130ffa815db46f6a7d08e3e2e61196286c99c73917d1756ee87d4c3ea66ca35917c1189f160d789aa19cf64ac7c2a7b5a738245683177f6bdb434aa0b0f674b78e2396e216ac6d14081ada8d7f62403cc4791bb75c511495c024e93b1ed81d7914845a635af1db74b4f58d9c12e0ca48fbbc4c85cf1941f76f9511ab5657b26e4a8e2cf21c1aad74bcc4b9200f85931ff842ae8aba372604d9283617f41723588779e798dbc056cf2620b3dbc3b40a1e7d24b214d6fda2ff273f58056cab4c2e9a858f8ca300a176ec7fa84b28f4 +SHA3-256: 507743309af4f6a4ed517f43157d5e3adae25e03612037927a5746167fb15076 +SHA3-512: 21eed916f6bd9fb6ae9fa1ca8d425ce6ffdf310cfc44c63c23c2e330b8ef48b4b1a33fb10f69a235fc97e8d46d5111e4feaceb2b9205a7087850d5137b8521de +SHAKE-128: 193568837006f0675e8ad7211594c6f6d80c609ad801e958d3cde45dd2b4c9e5837cbfaa4bf3165ca93f012a27e20fc5294dab4faae771e0fa38bc9c511c20f75abe4befe0229230fe94b691d1871baa7c790b6d620d727b33c9b407907c10734b25af0cd2eba4cfb28ac736e7fd89403b505756bd710b4211cfe3a61d231eb379b5a805e7a02648054dae0c3ddc3d163358128244e159424c9402c555a5a66fc98ad3f2c946410df452f72f69351513301239a65effc505e3c3a77cec236db034c4116b9fb3c3288db78fd97f672cfd6d3aba98960ff735683bdd67bfc2d8ff61c31aecf10c395a3a31968f79da366d510bac55eb7fd750c127b58d16ee4f3d1b1598add0bc26dd60021370948e09c500a0ef3d0935ddddd1a5077be84bf1eaf559f720d5e2adbfec9fc6d58cf40922328a3b2649d254f2a25c498a0e40b3a84abeeb7b15c1deb73a561ffca0692ab759955fc77ab163d2ffcf7252d2113e18a870327d1d8288854abcabf167d05fda1334c163d4171b9ade74a32a07a12e70b494a180277933eb13773b646fcffc10501370c6373d34b2b33c32bdbaca61d0d0e829373c010da71faf1c17196b1024bb4c5a28428f53f229f04297b56e53f6ebd70564020be8e3f25739de5990dea115199782025e37ae6e9e799be46b763a1cb629c19e13dc95e96f67ba0757adf4cbf0ff081a7abd0d738b1899244e94a2 +SHAKE-256: 7745eca85db88e37dc2b5231b1673c4cc7c71c35e3d0b9efc3b238e3ad7fb9826a9b6987f1a7d28d4b613c7b11788bb3cb128ecbff69b50109769c6881d1ed64560d051ef5026de1e57fc46979f8826e874cb6a809e4301eab2e2fa4935e6bc76b9e80419c99f3402a8fc6f21985428db6aeb6dd9ca66161dcf4cdb111f1bf9ce62d2ee5c31aa30ebe13603d01ed887dc60b1f5156e972056c7527688362348f1e677235dcd87c1ff122d99c0202762c8b5c1548287aaf53fe5d07d42882af0988cda148c59b71429597f3b179ca53caa94f4a0c064a8b5cdb72249b9e60a796f433081bde0d95a2b7d7e50010f99760194a2ff5e1f14c2b1b6db7ec71fc22a49f389c41552472b8e198624cbb6ee6d0717c5144c7b215937c8db5ab048db97921d8b0dab9753539cff30277808a79dc0d9fe067795b07ed3b4a1dbcfbc5b39c37850971e5b1e478446783901f52cb048abf937867e849188a721b08918be4509a24503808206f11aea662286e26f2c0b4345edd1edb84291e4ef68b822e367da6927cf58abc32d822af609bd9be3378411d8b85ff191783e9ee1c1210497a56e0c6bb69e74f2bca54a62cb0676496ed1d25d0319a54804acc8b191e8d7aa4f4eae575ec41f4600ac3e04499703865b27713e31865771bf11e87eef8cb546e95ffb2898dbfa0e3ac1afa8bed65fbbf74e7a11b632e6e7de004bcf131537f8e50 + +Input: 90da290aeb99300dd78467fdc2c04d1ed87e7665af71c4ebf052c54d37a68bd59d21bf9c59efa78b0a1bad7c6a5e4025727868fdb4e0283ce7881620e42737ae9c9781d60fc651e6988c6715de14a681bcc3d0407a9f9fe30d3c9721b2093bc6c129df5933f90973bc408edd963c3f542db7e6b4f9ca91c0b4b7f79a3dbe913ce52f6c24d071d5f52a0a373f6487c85154fa04327034cca8bf88fefd908d9440c94f742ad6ef40885bf99e75513a61a4d489410ebe91a724f7c397498df52770f2091c88b7c2e9e8f9b30fb31cb3ad5240ea9c8e4b0ac5aef022755bee74946843fc57e899d336e974fa90ba5bc9fdf171ec5d5638f3a6199d9cd31ccaecf2c4ac7878cd0e889b196aee9c3c12a5554868ee09314773509a287fb81383eee61fa986ace0976cbe945d0534e57c3f0839673611b19917f1b5d15f9290d25ea0d0a9d70cdc12dab14ee1bdcb0c9d60424d88c225b1d205f8911458c5896a41e5c2e30ee8d4841c032c301a614acb9343d15427bf5cd7e83c5264ddf3be4f119ee78833831f6ede94c6a3c86016acc7db9b +SHA3-256: 5935affc9b15ad7fe488e3f724a5783e52d33b863feb22ce0971aee053d461ae +SHA3-512: 8de4c52bf9bb9da481a55983973a44ca62a270185eb076f54307c5191a153c459310d6df0858248599a8dd3f320f5aa7f38fd8dff9b41250f38a4ef3a2a2b031 +SHAKE-128: f806eb93ab809535ce73a70fb759d03f8c1c510c75215a79c239ede31e7f36b90aff05a6e524110c53cee00789bb9d72381007a0d9966c59d722b5e79d060b32cc289fdc7f4fcb1ff2ddadf81084013a1a1ad2583e955772aa28f416f4863a03c45e592a6a923b828320f73fc4d567b1812d1233408b10e22ac8b12d3981d717dba4d5c70bd6083a3b96cf772659a4b75d367c6800f7ce7e8359a3c1178403592d3a5d1aeee5a3d3851d41ac8f9e112c57ccfc8c8bc36a7d1f3dd719f762ae8d5dc016d3a447abbfadd9e0681466d3ac9013b75b6c3c847840c792a6baa5e92b7088ff25ae7d8869a6b3e4b705e184e885b00dd077d2a317ba2c492fa41fd039f06d62082a57586d5fb82cd140cc362b98435ff0844074cc1541a702e9fa78e85eea0cb144bc0e8f5d2292195c19b2b66bd1583960319f66bbcc6e9a7bf1433344862e8ddb6a15cafc71a399f7480e5c1a4663372488e6b1a963db63a29e80e5d79a18a4bb5b3536aa7c6a7e1b679de3214b93aa40c0bb3cf6c4371864322eee5e63f84a1aba45c04fc78d913b5a5a9ca5e406106ae6ac3940b6b54162debb6b1089d9ee5971720b32c70b7ca3ebf37e195be28f3bc0c7ae35859aa514c398e7ab429fc6676847b6cbb4698dfe77d58b14bb5c065356d7de985f5c49fedcd6147ca0d612b2daa6391c89aafb158368339c72fda9a90b736f32c209a118895882 +SHAKE-256: b55bc28a85c43b96addd5c61410f04ee0ff0e6b50b5d9517cf3b30f609052bb2e3c826c70dedbcd67f852af0fa2794552a790e0475e7765456016ad56a1195d5d1b3bb8760ddcf5ba17fb3e4a88c4740bbcfbfe2ae16c53a5350b526e5f9b28828ddb4e7ab0b8afbb722124d7b62204ea4a5a8ad57c1bdb13014021a19392eb697505b65b148affba2888223af60e12003a1cce6245e5224cb174a0e761808c265258c07d32186966968fd38d042377b7bb758df5348c24ddaaad0d855d59daf5c58a6ea196aea5a827232993c02858c79c15fec83a9cb26fe8627a419b05872a17c981879a5bb0500191cf943522c5bd11327493f8c59c82f093d7eda78584d0508d94f93fb5e7dec2273144c2fb8e74518fe76c69c543d0fc165a6e68e2cd6186462b5153f5927e65f59eafc2cdcf6d50b50dc91b39406b9f44b907df780367addda8c038708a2776ad69512c8219f7dd764ceae804678a922dd2a1f034885d7298d775104593be12d56ff303e658464cbe1991059f62ed0162f9ef3fe28ac8cb3512f51fe9857c88f90824692fa382f24a36f1c629824d2c34fb3a4925211cb2466501b91fa79f6c76098f3df25f1b114667af6b308c8f6c1dc5eab56b12a4fa672cf20fb15f1f2520b47301a35a40613c2ff797c8d3350526c02646730c840a5e36f46ffd174c3a203d4e34ce7b70e1bf7203199453b393154882a89b519 + +Input: 7b3390819c7586e7a59a64bdc529e5c3bec452b1f1d9130482463c45686dc2368b0481bae88c5d80c34adad229497a8d3c6b3982102697116c444e4de964d8eb1375fb785e33232d40fcb020aed7f2528025cd803b89d0acd5f6115a9eedf34cdc0e213fc067043492dd63c413d17e07fec07e7b16df8761545af478352fabb07b7fc8950a9d4cdcff52beb0646b319d9ffb614f14fa675b06aedffe7c6b3acdf9b8a969552d81fba94ea99f19b969496ed75d86ac196b7ba1829c421e8f6c0256783a8813c25362039c3ca4c18d255fb004305043a2b0ec7aead4aa1245c43c7722589586601193762735c50e603a5d7edab6c717ad1b3fd253385bb76b118275fe83a70db915f49dc35ec0ac3d87c8bb02aed4f1653c101e0b7362b6134a9c6b2b7f2265c8af2f0cd677df886ac9e1420b945f00776e1080791c5ca993852c6e260092eadeebc879b00efdc01cc051e54a48171ea09539657028f743bfecea77a4c8b981d86ba447d9cefb69860a7087515365921ad8a80afe314196e298fec17d92ee4ec7cb0b0a5f0f3894aa9164c4 +SHA3-256: 3450d6c22cbdd680a07f45518cf25a3fef46601667c45f1257885b53d5c52db1 +SHA3-512: cb8612ddadab8ee26d9fb128c89c23567adfacf11d551770a29db1cf37646acf078efbcf665e99d1adeeaf5156a07a968669236f994129dfeef634f644a741d0 +SHAKE-128: a4784e1abad8b37bed79c22a3939b997d0dbe41ec73e60da140d168db305e9d1b95bdffce3f1357cbf22e6eccc1ebef9e7e589171643adbf5fb09eafff3b272d784172f557431f2ea21b0ba60bda2a9495548db20a98394fe0cee66b9ef80938dfe342bc5724eab3b3f9cf23fbec89def20daaf601e247be67332a64dcd9ab97b73f8340f3337929e12f2c505c34f16cde182992f81295e7ea0b6ab05f0c4b776b50882113646981a950f50b793a24cf9164fa483c3cee5277aee76c54abcbc90fdd3246e831b516f94f4712bef1067939f04c2c7ed189aeeb269edf104a0aa5a54d6cb30b984be31b00ff41e43b24378a129275117cec82e458b5be09b0dd2f504e188057766d7cdea894349ba1c8c1a590d3f7e3e9992c13f29b8e6f31c53a45b852045c931c8342780f8d780887dd5a07f1f621d5a41f3c9e1a6386c0f8c0c40376e4cde308c2b691ae13abac2b9d1a6f909058487682be1c91a63430a65e878628dfe312731d78b027dd4551e67baeeb2d9a68c2fdc16adbd3d981c37be546b1a23ad327cbd4c75dc732ef4586174c1854dd90d260ceb9d750708b5b488ee12f352ca5829695d721e5849cd615f6dee85cc6d6038037e216dd5b0ac21170d6e9718971d7bd1f1d89ae657b47a735974ce69213220aeb7e8ce4446e8c12cf8cfa3744ac1ea4efaaae18b98ee704b314b7a541f01afce7ff5e5d50b4528990 +SHAKE-256: a3f7b68bc0e6d6c8e6097b3549979fc3d1617c7fd3788b86a86caceaf6b887c02c06bc15da0a16c3b1de93a9a57b6562d98cab0049fd440b844f856ef90f1c20f7279c35de73a28b8e896c857dc13931909ed1c4f04361e0f2809794535c81159899a20d5369a14dab4ad9925881aca6a65cf13de7ef3ef16710815b3e1ef55be129c0990d2edd501e9020247ce0652f5b5c59db0e16fe5aabec161db8129812d0bbf5df0a3c343451393c8e76b96277814f9d483205dff9dcc35a3401e2b540804b4201d4cb94b6c514eece1b43e1af7ccec6eac26b40d96896bb4a70463b3cedd630a228eff16790910caa18a8973e6108177d8b176763506c566afe8c1a59d3aa7beb82c76313fff62df4638b2a1c529b79bd1610827fe5ccddc906611a3e482c0b9be99a074c87d1c013f72efc36e697327326ee3e171e5a3e63c676896e52ac29c9f39e1befb7d12afec3c8326ae430ff33f07020c6977b29b5728fa1c19214fc2838405157e4198bf6652500d6f734120aecab83c16af242fd67a50b971802be8f26fe7311d380c33a061872092224e7cf18344569a3bcdd7c8c2e7faeab97de6d4638ba74ccb25e0ed353e190dadd1a3cb5873b7374c631cd198292851084c68c5b2250759e12973210acb3545c05199e4f7557d025b5f2a5d357a5f28ae4a0cdbbd3954db1b884301f989513b0e454ae9ec4f0c1bb5713bf8c59ecb0 + +Input: bb3f53459778f0c0f5a9192868e735f5e2126bdad7840a7053a8be2c62f178a731a800088ffec0142b0294b8b04fb8c4f170635e458ae5a985d940e2a4e6b7a10e4eb69a638f4ac842ad78d1ccf14a4de413ceb53dd201d3eec40fc110dc3f4cbbecfd1eb8679cbe6dbe62a804f8c82e0f9a76dffc9b125c3be7f7e2674fc6790b2808001de6584145c7ee97ff7493d818a7d9642c8015643035c0b5609917f0e8089150382cc37cd23485ae8e856fec49ddcfecda688c984e4df605dbd56a85d7788e266ff8c76b0fc296f25cc1b64358022e62a203eb959b5c2af094df102b26ff6e83a9f76755bb00756f9cea94de0b4e402c56b5285405f7180c267f942d2db4a0737cc27872babe5aba80625d262e04c424d224490a4f944f2897e97201afc130953b427aa5e985a5dfc98d64d4678cab62b808db9d65685aa8ac82ccb35a0b232c42e218c794c6ebbb101e6100d7e87fa060f461831e8b332e5d5dc3bdae93ce823b55324b5afef37860220cfdafa8f36fc062f088219174db851e0a34989b437361a2caf408753b9eb05d42ba2253 +SHA3-256: 0f969141037ce87637c5ce8b1932e5465a0f6bf9c1b6ff91a37f92b2fef957a0 +SHA3-512: cda666dd5fe282dbf592d99a797a5ef8d189446e7ce1cb9bf7f114115b810602b327ca4c6c347a8fd49fb49dd82017d1c6fc32ff26a5e40664a6580930a6aaac +SHAKE-128: f6dd532d02a69224c95e8d3bfe65219b919fa5adae83410dfef4204b0609f2d1ffd402eb24551cca9300d23b62689efee929cbb799647da89230ed210b71e787dbb6d003b4e9adc8eab57103a9cb82bbfa6175441f7cd5e71f37a3e8d4d5da7d32b4371ec8da53264330fa458b3e07ae56081e8580c4d1e56082ef1806aeb46421639391d4795d28f0ebf635d99ffd7acbfdc457d88b41b268743f20972bcbf1eaccff81cf9dcef9ba9ae7f087972885f0ff391fca6ce1dad088f81bcb7ddb0e6b49c54d91b0bff7980aa56d11f61b2d84af26acac246c00756f64cedf090428298cf89880beb96da45d6a4c03788004a02915873fecf5b8c60494573ddc87770526d279057741568e51654fdf702a08a8ae6815f6824555799592c6d601b18ed0a816f7d3bee88776d265e0444b1cb01eb40a445eefbac3c4a0622adba07dc1a735c96e3ff330ea7a3501f1d5f0709f4f815497ee1587a9d154e2d8d59a52be7f8e789e51801ff06e919566b6381e502f29b96baa32666e14798d141f396554175253d5170461ce655d958262d0788b14706b42fd6b847c5c2be18c10f954a670b4abcfa68263ecd2310004cf875576363ab54773f8fb989f55d6f3e54d554825503327400dc981fcfa4727cbdf6e0ab4650ff76abf4d8714c16ae2e494b2e7c74a30cf8aa98b93c4367b1953d55176d7eae938720d9f80151742f480ab09f8 +SHAKE-256: a0a8cf47ef7c53541b0579893f86fedca88b43de5f4b78ced9cdf2e6b282a6e171fe93c98b6e2a53447f1712700fce05eb32309634a368e1d1b2d91381eb88b5c25cb47aeaa31d5da36e1e225a8bb2f54ae2328bcbca872727766894574fe93ad32829ed91c9d6a4c0871eaedf03a8e731a3c6f47e7d19470337bfa4d02b2724448123273e443b44cc8c5bb8b0766cb2dc31d477a14a4b870bf6ab41e5beab3ff7fa57e90be6cbd6e250e67bb4bb09f438c615e976ba6a5a67cc222edc71f5874abf82f30bf29d53b16719132c19ef29a1b7d1ccb56df4c2a8a0483de32936d7e23635dfa4ca6ef4c2ff6ba5d3c2a7e40d58c533641d7ea5252c84973efb1fd18d1ee9722908312da864d02dd9459515390f92e2b1052f64c80bd344c77218339b56d371bf0cbe4cfdd7c4e94018e631138d201c6c488192481d6c636e14a62cab74f0b6798fc447c6635fa444e91dd6aa5d0a88cad66c9a1593037f0c9022b4d170d95a5de385403c5a38a422ccde6ad755c33257a323bfe75aa331e249ccad5c7d4c7a96d14b625e5c9162b6de58e7bf60944caae0398f49643379cb7c5c75cf1ffc3e14fdae6d6598034b685717e1514abde8148e0799158ea418492c1f069be98e1cee64c7fd6ebd1cd8b2fb79bf7a1c175e555d0b316610d36f33f37072f6511e402fc38e13b829369ccf34c097066ecc6a92e1e0918a36ca79255c07b3 + +Input: 727401beb5fd6523dc357b50461ca505802b9644963d18bccc0e608a1bf03c6bdde33d231f35dd658f20400bfc82e0478275b82cd49f1a1d4965c09a5accd42987a978ed8764861fa26deee8f8777891483b42df7c517b98d3454f4d2d47fb699f01f10b8785d8ffde092c64ef24348392a5c4b3ca4cc88f697e5e365abd8ab353c6af866d19b067b77927e8e67066f1462e0d0df7ea073319a848597fa79c8f320d46f07b88975f7f78783a6cb1820a6bfa8a49703a43c7fc2d2da5685229ea2f319f252c66e683d4a05de9a3f6a5b980a592302d3dcb137090b91dca04b08dd273d34976ac5f0157e27da7b4037f4afc2885033efde528ab36dafd664daa83ef388bbfa60ad82280d3e060530741420b80d8f4470abdaf5a3f9371cb033cc66aa02573fe7a5e6d19c33278d5d5e196700bcb4c7a662ba09f7f6f56dd4971ed7c267844ec126b3a55682e9b532f1e7c12980416f9049efb9948babfde102c024e7a5245b4c9fb342854c5cfc7c54ad0fc9bbc2c4c56abdd9ed8e6349af809c5ce75ecf886410a6675ea2366958535400e9283 +SHA3-256: df931008b451441679dc01ab884772b527f4b3f73a98c816e0c95112f531d0b4 +SHA3-512: ae7669dba36065ca0ed7bc6d4e5e4190246f97b75b3e71e3ddadff44289aed85100fe7401bf176980674e22affbd73b2ff48721fee62f45b91fad2b33128aaa5 +SHAKE-128: dcded048919499dc0eecb6c1e3eaa087944e70ad8e2b5c9cd0f9f7bc45444d3051290bf7927d26f271c006c72a71d3ecda9b9963ca48767bd6539c14cfae69ab1e611a8309f0d4b7851143a547df716c53512540171f9e3743a24a0ec2c971dfade93c2f2dc8277f2dc96aa56810825fb31c452c0fcb14e6a1e07f9dd5854b0c4da97c2cbac2c8abaa6b807559ff13f3c8bb4b124dd53ce185c6e66059675a84e46464207fc007d89ec99787b70b09342f5c55fb081f7f01bd7d0b822a9af68511996603fbfd15c15e85697c2ebf3cafb8189ee99a0621bd9f23f7426890f6e1368f927ac8e646c86550ae665fb7eacd096caa7179da374d2a01cf319d9700c09af0c9f0cab01ab1b98318ea997a072dac975363a390c2ede4401817c94fd330ca1fc9aa58dc88d0707463779d4f49d3b32dfe7d78ca0ae63c9c54258721ea44dad31bb225031b104e4a18915512fe0db3e4effd4e5c7e7343a3b046088d615a32509fb9fce1eab12e14e3168a9d3552257935716b0c75ee0f3b72b5ed8e4cff158f6d8abe3ab5a5ba1898919501877d040efc223b679240001fa8d1506b34c1fc7b3dfc32b14a5468ffb04783f4c2f1e981227628e48c3d370c186765bfd2b53760d944ce0454810c39b344f82ad9b2128d859a2697844315f3ed780e7e7ca38d1a0b48e3424ebaa64ee384f2a7f39c7e887219f8f2e9ac90ed0912c3a1f75b +SHAKE-256: 30ade12f1fc32c8626893b8bc6e7c14c78078a28bc0e9ccd3456cd877c68adfe79abf3ffc4ecf3e297d042d6ef957e65af407d1778362881ccbea52c3ff04937a4e3f8f383d94561f35ac8287004039d9baefcd082afc55e8850d674b56812b5050fae36f1796114938b74f98aecccba0da42a02929cf8be958ea39042dbe2996f1b81b3464c6d168b43d6ad2accf4388c3043ccc156fe2c0cfaa5ea534ff8cdaf30c39b389628a969b4bdd1c15eb2425d50145e22bef574c86537f06fa4409823f954776765569aab2071be1351354442695c93b08a9466a7ba7d888b1210efae148e5e71e82f5c7f74061617bd1e833e3d44e984694fe3bf71dac1e20e68cbe40852fdaef0cddc710af1ef8b30a98bbca82912db70fdd3f204b1c63125c7bfd8a46efbd508437e8f50e1d7a0f7b076913ac8d104815e6424f822bb77dd7194f44dba1f1745190fe5ff33c7e5dc3c0dbe357eebcd6c3ff67265604a6999c22dd106d829ab123cda3a161ac03b00c66109d84c5d49380d1866148889da29b0fff9652f3a5c9db0b3a8b93813ae332d46264e04ba1d5305c1b0af95b33675ce097b4346ac1a20aa72dc8b1d3d67f14e4752f1228a2eca95e8990861abacb6d9303286a77c2b7bdd84bccf433118de4cbf5bd46c0a1cdbb6f8e2ec8d279a8e177d049c47ac1735b6a9802fdc8730a50822cef834a6174f443f850c5a8be7cd9105 + +Input: 963c9e70e33b9333313674a0efba110168fc0ef24ac99aac92cc139859188d1f76dcdd354ddea15cee383e461128c6df5feec317f5558b48839256783c47bc25483964e80ec7a4b521e179c3dedd4927c32e6b3dc19a5a1bd8826daf73f88d66c32d9c1845088830d0b2aa2c4a4c66bb5c55cc668332056c70678ff77e036a66ec497a07675fb15afc747596938c168d1a2f75aabd2cc2c1c271aca7e4cb79cf22285ea5125728d0eab0cf08c02a96d16cb653dfd8144ab48b89603148d24fb85fa4c430cc3190fc5783e9908667aa1b172f617d625559c7216dea1f109c8eddf2b86021ab98199a76b3864e02c56ccab7d49113de2e396c5a93391c16e349434d72cc84e1d91670758affb458d6f7e09eb30c4f79e6609986ead0b28c8ec07bbe8e700d96dff2afba2f6c0cf6e87d77d62e8426455bc5336ef393dc106731306a73be705c263e3cd1d2af38673da4fdbca3539cd5df79982639d8f2dc793bdc11a40e02d19e655b7daf044e9305ae127434868c31abe8fa2d540e2f2641d1b54580fba89f8ee4c518b1d229e509283689d8d6ae +SHA3-256: 8692828f27f1bd0340acc1669b4529e59e3ad5fa77730c334c7e3be3df59df41 +SHA3-512: 54a4604aab4e58928f415ba83712b0d706c196a9737862740cd9dc82c5ce14b78d1ca90ced845ee879785639680c582de84c1f5da78009f7d9fbfe95fe99aee4 +SHAKE-128: ee46ef0e314b7010c45e20fec89941671ff212c518df641958950a0bb980a8150d2147e3eadae106d5a48d5135283e871d133b44212b03459cba3180de65b9372ad19df4c5f1e8d534a7a7f369e241231cb5778e7637f51efe4be8c1950ea91e09f49b0a7cd340d54f825c4a5e89e5c3a1431db42e89f8856808a7ac76cc1c75e76c327c2b1618509e2cf9e3ca905d86630038f36ec9d0a814f8087ece586c2d10b273588579143c34f6943b61c07bc746d66740813387e739bb4685dc1290f2b210883b9869ca1090d644d9f054f7cbc5d36f39369ebd800745b560af2fc76d513ff0ba297da5a1f8643eb0a3c28356f8353ddc57836e5bc35c4b4ffcd799c6b37726c8211132bc5b9936d98eec999d69ec1dc3f345e3b94711caca41a5827f0148a0f3546247bb2012c6b48898287cf9542cf506d9cb6c77b1418cedc689526016ac6b9123fdb1b1739bba7bdede043e4753b67997030fb2f041996d0de13b0f82910035ca05e9e5ca8169578b8542f1c22d11ffafb811b4bc72327f0a6bb1bc320183b0203f09956cc75b0f3fa615d56aa994333643b52866979c9ff3d22fc92abff6199bed4aba9b3c4d57661ec1763cae9f9dbeeed902c68db0bd80a752a9bf99a2fa00444f39d8b014871a54af8240f90af917ba32fa0446440a054bb3476a1629362e97565654f790832a43186ca6af7a4379da368e965105a2cd22ec +SHAKE-256: b0e9a8742568151ba97dfe777331b20448b2858322ee3e41f860b2fe8ace4de66363d82118bd08b1a758d145a80df1947a95ca86b54f9cac41231882ba3db484a0cc1f294500460a009dbdb79be0bc839d13ed4af69e98afdceef2fb1c7215e3c51fa94ee41bf9a358ee9a9f9e1c51ec5218328c7d6a684814d88de729076ecb2d1a7f2db39fcab62893c7910d032494bfaf43ffd0564032a16c228b9242b59ea716bc1d809536493ec0bf125384cbdeccf40efa0ae264821d8bc3d4e65f4c8e6daa114f69b8ee186cfb6e080ad1d8d7e4b91540ca49687b664d967596a7b41a75025dce1c4d49c0db801ca62e670392967ce6d9a1cbb80139f3ac81e9d4db80525091aeb85bde25e7246566d87f55dca1a8b837cd81d1a5e6fdab04a031337a4ce824d9d321d957968b8d4bc5037379befb4905ba77afc7447fbb866cc39d311a3d0e797995dc5825976183d66f7c15c6776b88da1d06ddc1b052cbe16da1afc3278e906b1fe759feea7775c5556de4aae8c4a2670403499b4eee9b957545802dc0afea7eae3588cccc2fc502ace0213c57350470f43f9fa01a9225716ff4b338ee1b0271d6cf76c95e7cf27eea8c35a2f98206d79861cbcc72f25949e623947ad03da3515bb5ac5dcd748444ae82e878474818c4895c93a31f8e3719ffe1d406eec826d00b059dc3fed1dd9948c5c39b2e9eadc38de7d6c9a8e6cac4774cbc + +Input: 2b11c2ceb444c272b33656e7669b6ce9f8545f78a943ceb71a28d647cd53780e355aefbd2516314808795baa461f3c2efbe55ff892ef70620604841cb22c3a346d284a1c1e547c38b58a203ee02d178d50bf2048f45eb36c55a63c1fb464c2d9752b1a7ced1fa407456708bfb09bb958627aa266265f07662d3b222a51c7ec1adb5aff21d98cf4fc03475f16af1a7b88a9bfd667abbf6b863aec616b785046389a682219bfe32304a3cf8c1c33dcec579937963ee0939e276d5d5189cf0ad30e7332b17f4bba3b97132c44ff2612d6758a3c582c38a6bc6f4e590e4fbddc8cbcae08b53fedceda95c1ed78ce13e35c073e800b7a18d2820675da236577c1723904a79c4ee78b0e4ddaa20ade85303b0238e698294db892115feed7e29c8d1e34957ba2bbea7b966b54988f9f29e6cb9d29b078b18fa2d56a01a2d02af23c712a998a56f8c9d6feaa58989a5e2893d17dad4301de0a79496004abceab08a1e96690d401dcfcede9d3ff4ded49cbbf16419fb71a8373674c553c8f5834aa000976768f446f24534e9cfc48db6294617dfdd6601ab367 +SHA3-256: 366f11d73ed7009975be072246592395897a248e6e9475fcc629fd613f89872d +SHA3-512: 2286ada9d9e37e601aebfe2c19f3da6bec427ef276cdb01fb13025d3eda6078617a22a657a0daa3958df9f12cae18087bd947d6f1af1ada470d8df13f3c01382 +SHAKE-128: 7f8c7b74963cf9c17fd173765ee6570ab1bc1eccb5de390282d3068875a065c3556cba432f2d7b4677669f7f48a3187bc944f41c8acd61ccdc7fbfdb5d61dbf8fd34a060b82099ba81823ad64f1cbb5800463403e506fd7c426e71d9cca0c00670940cae04ad9e4e7ed492112185fe95c04d2028c9ef8d6917615786c20e92f5666a80e930a49516dd126e39fd3b9cc75da4999ebd0fe19d6c62cb21fc648e8b3adea6f84e65f5ab6b90f450b13256bc075c29c7353c2584cedf08a82d290527199550371e061d42687ac8fc1b48560fc02d531c1f0950ae8b388c505362a3661b212518241f329618fdc19170b778977c96baf833dc694678d3fb51f448ce9632a0e710448018ed885dcfe883a1ea1d6dc287c32ebb5fa5096cf43973d36657c895988de482a4521c974d0f04ae8634d5975fe0e24dba39bc54ce50a96214e37c9b749cbf2b0bfdfde942544038073bd6498498e21faec1c102a7a80e16cb4b50a2fc2d76b678f38a0980f883d814d9e13ab1f82ae7a8855a45b03c1d46224f96cc111430692cd58bec1c99fdcce05828034b76ab04d535c18aada18e94ffea96b970d71e60b7bccb59fe60f0aceee22f4826b32b7cbfe780b1eeb666438f4a0dbf90f49b34a7cecb7cc0c162936e15d4351467e40ca823f04b0ce65f1490d614ea8abc7dc91ef3ac70059bf58683b065fb2f0d5e64ccfe3ac90ab34bc52e0a +SHAKE-256: 6c75b70f0b05133dbb5b87b91864652024416dec1b005ca29b68ed87aa5e8f032ad60950ae23645566a35f48bb6b721f17598c3ca97dabd2f9b4ca969fb4bbdb6496d5540987d4ea45edf850c83d484037df8a93f83b5d2aa17d272aa2897f77d498d5cc9389e878bdf37970fbfd99f28695c1b8a751d567294f04bdba83ecabd3437658e769882783d7db6da8c6c82c960191258b4db4b689d4b714f72c5cbbe078f20d409c52e6e46807d2a335f549f297fa73a7fa2744d5357f051a8a1dd8020b951707792ada69fe9aa521bb2faed61845e65c7a65807dccb063c1fcf77a01770fd8357beaf7838b854e3805717b0fb8c45be08466d21330f341dd055a5cdfa9e148efab483ff6426252d5ad9d365a0867dfdfa2a504f667c89a825a87a0c75a6c1d97dc35406d28ebf8b01f246c18783d3e049702b621f4812af3b8c588fc546c2e05b316a944095e2e5beda94ceabffa9e48168bc7488c13084b33a02e6b355174f638dea84d5b54a46da18ed85de654ca6bb0bbb0631b8b51235e73c65ac7fa43420055f74c7ec5f7f8ae0c2019e052ffd85d46aba5b0aa3d8ab1dec94897897564afb02913adbe08e26820640958c51ffeb3e9f038d31ccd562955b990a2b3d6290b78ccc6d1650a690a6963d23bb8142b884d91e60c704f242a7ed2cf84e13c28d6808be384ac8d9202dfe41160af5d165a8218064f852e4f32261f + +Input: bb466809914a71891f2b8ff50d924a38937391bce04dbaab19e05e087b46bc1fe9e29289129fb1442ffe54cffa4146474b63880483ddcb8492294ce7607706472721ca75f1bedf6579db6871350270e9ab01f29ecd3dc3b2faf504ec9f5bc38a74ee9811d7bb76f1e4d256c17f686cf59480ea1698e3684737e2efe8f57f1c51445bef8018c8e7567d89530dde74781c7ba109811c001f48be2ee5a52e687842d42d50103d48d6ab00c5dd9ffd50108a85672ca8f26cf52831f0290995996308e32909408913b44a8fc5b60f8d36b7b3e87f983f0506ea0582ae87ca6b64e7facdbe1a9f3d862d86dcea1749e6afa7a70bcce167a68badd51f2d91576bcb7e573371debecda1587e369389be8b7de232e22e394ccfb24c9cf2e8f70f718f69ee6c6dda7302200302ba941279533cfed1278dd6b515f12fc128ffb2d6645cc069d773d156cd1aeb0e0722c3d5c375588b777020ea59ecbbcb0c1ea0ad6f8183a0c128667ed5d4ae699a29280f7eada6984cf5ab177993ae07d47d984b3155dc3c03f22898b9172aaa93ba249c20cd31ce76b1d7e3332f +SHA3-256: 6bc6167a14be9b2e70d1f3de36f67ae1138f7626005df0578bd401da6ce74d44 +SHA3-512: aa9cb684035e0f5b3318b8f59cd5da821127f7f53da319f5c861ff7d428d5add9fe09672447ca35d12d022da8dae019c823b36a19f35b89dccd70edf738906b2 +SHAKE-128: ce282d1b666a89c2bc07176e776bd113c6969c7ac0da76168bce22a81169633d71301dd47bbd5bdd77320a0e8e48c7a56d30c6185fbfbc53afe43794b3b69649083c716c3fdbfdbdf801514bf99889fa163c101a6b30b92b50f1e0951f23a3877c52f543568ee9a1f723d9b5471fc29dd24fdde1455b9f0100be456969372628b0d74d3caa9277a984aa6639b82f98f33c14ebd17b60480953f9dd1c0e6c6c337da940b04508187b8a7f0c09c2e1f9e3a7f044d5a36433144f3784633936d93208045ad74b3fa7f2edd5065eb5e4dcd781f4a7a7da490d534294e6e36102bb05f326917e813cb8e55d1b6d554a9706feb6b3bbe6d279844a47ce51e39114d51adf555be6a8da4f33599723e078120e3a013590cc38b8fc377ec794d23c72e585e4dc974e1eb71111fd330b83a4ca9c398baaa6170d2906c408e34e03582c1a80e1d28f54776d89dbe5c1661a272a2cc04a03f1142d8f2b9049d88bf8e547981053d0d2082d8ddb01de2a312843cfd82900584551aa36c03193e51e00d4020c313cda3ba5d0ad5234681ca2a2b8e63a1203a2bd80e9eb36f28dc1b573b128d1dd190df1da13137cea1c054f977c8a6fde73d14c8fa43832eddfd6ec4c5beca4759b3d463dff1922f7d1092275b05ccbab1340537671f5057aceacbc74e848d8cfc0eadbfee5b360a02f4e8de481b3aaf11f180ba205bff44d6aa97b2d8f00c40c +SHAKE-256: c5e08b5a5d70317f03605d0b0da4ea872e06ac695d79ce59cb09e1b95938eff075e03676523428e14d59d937012f453b5b3b20185cfeb7d317326bddded47e9862c1b62a6ddb72967fe17e07df75116b0d810928a7181160742774550ed55ce80b7758201410ff573639ac9695c16ca169e1504a93eb584bf69803bbf69ad81affe96408e1e1e60624837396d47ccc2b83446b0ba0088ba8e7303dc1ae17da9136589fba5b8b6f3373516d1c14a901b53d9a2cf3f9af118c974525aab8cc2fa70f8686de38c63685f6aa985e10255867ab2f62f6aa87773e36b24a2a3c89ef1b52935d6027a7433c30dcfd392194bd4adca2cd0973d72bf3d77f781729efd75fcfa499cdd8b978d572efd6ac4eafb5559a0121646f89f88db6782deecc22f7f58e0e0de0a00f06caab4be8dc4479f8da643db347e1dd2a0a3acaa7c1eb7c1417cec47725fd82c41d69ee25c05fd2c31319abfad032669c11260f16664c94df8293ac3729e63116f1494e35d251bb711e88107b81dc221b95eb1d9e8cc9fa3a9b9f9d878d99db4f9463c881aa4e7fb6b411f373c16fcf7a0a71e9908576fe79fd4e6037f8b4237f52a94f09413f387b3f363e398f0e54e7f214f9e2fdc01ca76b8f884068ace3c40892fe1d7e26d766242bbd3da7b3964860c25958842852bfdfa93038de82c90531020efa67d03f1c4c7e46c9207ec1bed93d9e1d972ab30eba + +Input: 96458ec8017a325f62a35b19fa2c1427af5d3fcf6dc3879f3df98ae0318a301ff0d29dcc79a1b78a30b7595f7e88c0f7e249c88d6a1d68070cab0ca74225ace9104ad50367908b84989073b1662af944e9f6dea4471e66227f209d2fddcb6b18b9f66584036b1a1c4bc67fadc89bd359cd7869c171cb43ea4aa1882158525db6b468d40ed53eb1c4d52b5a737daf5845a9405323cd4ead0d9af59d4754af163b9d186850c9fa105cfdc3e8f9f6e1dbec8ed40c83cecf8e2cc936d869004ebd54874ffada48eb351dfdf1de6e9bbd0dc6712514da109fa48cc6b7c11d9f6a0f87e4353209abb7059dcb13128b89589af01ec8708dec2ee23f35034856c24662d41ee2bfa36d3ed3a71c0e154bd8b18144eef7d864a95bee86645f4fee4adf889b422296b2f96f65187a753314a89d631dcb21630c47f74eed3e2113dcff457085fb82902ccccd418590e848e4cb86fc43cd5bf55c870855834f9fae48a783bb3e2071064d82b700f7c1af098a3a8399a07742aca0d7220318ae7b10be4a0078f72457a0eca0fa4d35128728a5b53e1060357fe2e29be969 +SHA3-256: debb9387c9ba69a1344f17ba1ee850830b1a432c37e9bcd7e9bad62a6b1cf4b6 +SHA3-512: 0d850be39cf0f3562d6d014932a059bc28c33e7f45e0cb3bd192bcded763cde34063bb35a858496f8a5b5f5edfc076248660004594a419a52dee728c3db99cbd +SHAKE-128: 87dbff9eb43e65151be75a03c75e6777f0344515678cb4090cf45f747cc9d5d471dce7abb7777c344bc5e858975c49cd50097f3757037326434c025d1f71991474bc1f545fd18f02ba6cee1e2b93844a50449f1445b234a65097b1b578af4f1cab23d7219036d32650bdc59575539e786db7856149882676ce859e84826a49a04644b4d50810c147eb165a23d3247e50a64404870f943a7a09e04f2d3578709674edd0cb664817faab06773617e25c40d5b235206d4c0df034284388daf60b4de0971bc2dac65d7eb2e109212efcf524663839ce0b93d377273876433e0b6083781445bd0dc7c6ed3b7d2f4ed48993027a0ffa0232f21006d76b078ebe9db1824428fb52055806c0ab99dc46b4be6b9b7b1ca8430977bdc84a84567fc47d14a153e8319224fbcbaaeb5940572b910beb067d41f6649afb5eed9f32f70e11f3ac181ed1b814cbcac5e4dee7220546ad923df5f2eb4fe9929673231ae86465d0148b86963480ba34cde2e1c31e248f31417e1f7886f136ee422fed1ceaa588a8b2906956954e1ff8ad8a83de816d9578fa6838c5c9cbd4b33274c5a87f917f1dfc20879a7d8b883a1ce767934990ad40ca428f90738769e62616c8bc3ce0a28d38ed0fcd87964af8d2b004c738623eabc6204e13edcbb2a93740ad24f093f7026c80dc126e78b54e0c7e4fed955edfaadeb5e8744394dc99f8f64b3719e643750d +SHAKE-256: 2a8ad41db153b2e8699685d82cce057f2d6c557a464ce76b8124c8137fdf886057bd39d8e4f9bef43a60060aae7d66de892b5a1d85a1a426349a66a12f6a1a13b71aee1881c2f0be302644a4624712c3ef7919ed93dd53b20d69e5eaebc6a46a4e34b27dc2f234470003b2542c4ae85173511005ddc444c4db971232e21876127df1fdeb2c102a1308f268800f4b3214ec582986a79d047bd1dff647a1d707593d803e92c231c38aed6baffcbede78df215413cbab9d294d3db6a80f174645efcfffc4f6c7c211c1d698a6f043f18010436ace0a9d13a580c40996f02bf3bd9a420e5187596fe676d9fb78d1c371ffe92686882247666297e1d52f2f1fc9cfb098aa3e29be3003dafb03a16d505a40f2cab5725107738986bd00b2709aa4d7164b9203dd65c2b7da0a6fa50941900a89e046099043a4f7a6b36fc865a4f51c6368925c90bcf4b0dc14dedd4a549794cd889a3ed96f2840fb6f8a7ffa34a8e097c8dc1de11a34efb7984d826332a1403d4f751b5122513f2a45313f336cf105aeed881b921e960dda136c6387afa3650285623e52ac29da124f1df0275b6da83b1c7f69cbc2c88d9a7ea5591ae9ae767c24ca0994dcf932e0a09e2064e713d7eeb9341c206a2c7a0ff0756629e637074adcda2d473a5572806a12a1f99a00b85ffac52d3c702e4779b2e54ea8dcf8441f421847f8bc10a8bd413afcbd018be000 + +Input: 32332960ac977c40fd4cb279e27e87aef962907b44c227d2f7e794f699961acf44c0684c980eab060c9319d2b2e53629e0ee08acf195a6a6fab0b57367178afb7ec3bb4dd6d3f74f747f7455333723272123f46bf8d7267f5e84dd4938f23d8058e27fd8bda33ecce74272f6c40185b19b7e4e3d3792f6a1429ba55c686a8a919b6384ec0d92a27b75b9fcdec38c17541a1f55caa0d6259fdac8c1270a5f3d427c0ccb488163d4b0b275dd604e8559440337b027268c06c6fd5d764e7176bccfbefe08d5e3245022f389babb456e1f7882b60e26be4c777fc25e83cb99b452667b9beda8331524cd3910944be9b1d163f8f825abff6fba9179591254fb3eb32b53ff4da0c5c810669e67bc094d860595c853ad13a3fa9a072b8b9e347cff8fb6aa6adc45a293c4628a0533db02d5bbaecd2d917a09fd07127e83792495d59c3854e9b455377711966841f55f402331c3fe1c974989791f27bc28b3d64dcec9f7bec62b0d7540f195746fbd5facb9de28ba7612958f654ade3222334aeb9a3c48c7d7aec831dc8aaaa4387353475a8131969a8628444852d8 +SHA3-256: d7e8d71c6238cdc86022b0557cff83b5ead376078eab2ad8a49fea2662298ed8 +SHA3-512: 425cd15a11290fa0c991a1b68f65118b01596b3dcc72b23a92c9c5057f77a3d8bddfa50db0809a7a775217eb2ef84a25fca539dc3fa45c6fbdd515667aa9ef7a +SHAKE-128: 54dd37fef98056417213cff89f4b09ccea479dc62ed564fb820adf4f27eaa54c7b3476295524321d97a1d2df61f88c6495ef5def5d51986b13ae79c2c87ffa37e365c955fb2077a7f0bf2e4cac4675e5decf6a4816b74c5ba7057e1aa3d19da2aa6f66dcd0d9a4ec4b30617f4c5bf24bd67cb0f47c535fa9623d829941bd3af4e1829a6aa54d04802776c73a8a563cf8c6046c144d12ae79b980e778dd4ba29c6ecd83f6451f2e321e9f28fe836342904733d542fc134821a34380756a980149aba1795490de7f546044c422f9ecb89722690ba7e35067b8ef2b0f7be86d3921e8b2d77af3d2d98eed5bb69f73b65cb68ed37d179dcd853f2238a3c35cc1edb94506cd128f5e5c3921e4856da4d2dd5e1645e3bb1143c46d342acc0524f404a112fa1a60a03489a52980eb846520411b7421f4706273cde9ef5a81bcd009ad736ab6b8f64a162c4cc6b4c8aeeb346a82bfd33991fb1e504a311f63cb514abffd8d9b6b6c4ae324830980ba09251357cb1f590e3341ef09a365e54fbc24e7014bdd22c6d7a72b7205a72c9c3e39ab4ee746c0bed97b2d35d24a093163d3dd23d94c3d5ce9db1ab039bc9e1ddc6e8d0292cfd0c1405b5f015ea6af8c514d175665627df4ab42e4ee09bdf5dab0e0f75f84accee99faa5c463e7d0a698c2c8253d4e0442c7e51011d0221cd905f42c122a513644564d8b24e74f0b0dac5d68a8cf4 +SHAKE-256: 44d047d50ed1ca7a78ae36e65d298d976cac0109355409a02bda73f2676c14769dbbb144ffb8a9ca71b27d36f92c2201b3bc46b5b346301072d314aa260ab4712564c4b18f07d190f2009cb685e07d5bc1019edd98c7324fb37b7001d85682dba601563cbedb44dec6aa56c266e8d9a3d94481e6f842dab82c3e0bf62fde577b462cc2bbe00b84f3a06ac38ac8593c293f49ed4dcbd08c195962a9c2b8437cc6bca326d0d74cf5871161f5bf9a2baa2ff40a8272d8851421c5d95ff00ed5b163ca56dbf484dbabbd005234db894621ba2f2698b86b6abe9271ed1745c877d0b9c4ab1d8b74536c6d4ed2a20011dba517c74021596594e45c689233403fc55260056649215635a65e3090a49912e14e191434afbab82b51081660b37378e5f2e9130098a2be19854eea7d8de6c2eeca9977dbf614fc80e6e99235697e2b4f1505480027b81f32dc530efd9af6856115c5b0be1d4190ad1e89b1bcd40cf6f7ea4dd3a32126a9fb6b740f7cbb96b2ab0f1cec3ec12e0f85effdc3987d3f378ee25ce084c7690e6826c4e27d83513aff4a0f0c5693ca83f702edc4cb12a93599505bee6624ecc4506a6b07ba481dd4557677fa57f155bd255a7b9c2f3552e17d4e081a27ddd3a7ab5f28a93daadde0f58d652bb986e7e02700fdbedb4478e5414458518c306011b8762c75ed7e1efa79dcafacca76b61a27236804fc9535e2e5ad80 + +Input: 68c42229bbcf98149581222e8dbb0746c175c4642334938e85a46296585ddff2c42a1fcf7089498c1d909308fce58aeecccdc82cce95cd03001331bbecf2cfb6736ec39ecaad60e8075e525374e028cf2cb60e99c9fc3dca8ef09e9da84e060066815ad42c2d77e04bd090755acdc2b74d5e437be962af782920f5ea4db2ae2a56fd33fd77150d2550a24d45b69c0cc239f3e33ee32d2e580f31b6cf86929868e1f29d29c810a991f6f9d16eddc38c601a3f8355de7ddf39bfb94985e87f37534dbc9e6b135738b8693e27aa81571b1e8c120c62967efb1e92285e37914fbccb0e342ab7174666561a492fe51f8ecbf32108f8ef8963704cc9017b99456ff9b9039bb098f24e599c0957b3c704474dffd786b590d3c05d36a8eeff31bf8ce0a29420f6a23609b748477ade61acbd39f6986cf7e9315407551238cc6e22d100a30caf27a8be863f9a605ee43abefa1d85e002c4b6c8afc31615e188215d64e0dd3e262ea306ed818c8c5999cd8815cb460547f7d3f5bc7ca62715fe83a5b11cce7de5ef33401f94884b4da649fe150e6e3187f850fdbe47f01f +SHA3-256: 0ea78c17b67afbe1ab8a2b9535464587838b1bf9915d4247a59fcb4716e89ec5 +SHA3-512: aee5e60abb9a7e2f333a9c671cb68c7fddb6a98760ab7b115cf63ba52365a5d73be0cbaba238050ae2492ef8c7cfd590928b10d719ffe33a0adf0ff89fb59e2a +SHAKE-128: 6d97249295c33bec0997c97171e3231fa7719ce6ba1c45d692e0a3a8080f2df4d543392ead22f5d635e676b8ef67fc929500bc537573d557194ed230cab42399c8f88d445db223c7cc396e98ab948c8b854b201b61219376e8b1530b28a0bf4bce4f175fbe710c36f149ea1838f3e221b86c2be685c29ea88dbfa41320ddc2020daa2dd41201eca0efc63898df74a21f0dff80130e51188196950c770ad6a389042a88e6ef224baab14808764da421877a9337c3f5d674e89aadf6edc23743f7a1d9bbabd7e9bf2850aa54c842196b8766af14ea71cae7dde8a75131b0c70550c6eac8db33552afe8b918383621afa8c77fac3938889d762066e86049933240e44e61dfdf55e2c65468d54ff8ab73564d81512fe2ff3d17bdb8a2559e2bb21da45dcdeae988fa8f73431fd2cc77ef8ecca1152a3b69f9b49b3fd660fe7e15de89c443c983f19167fd01bdcce280faa992bfce496c1517aac5286b34f5e9b6374cbcfbdfbb9d2280ac03331d4938186d927d8255e59e55df50c2301fa42c8ad9c858b52f477d3c4ee3295c5ac136d873b2f5d3498c486e08268a9fd70cb9366647294831e3a7c74811be502ead64b968a967c15069a1531d90a1abcd5799b6d9fb0c7453920cebf6f93e9b998bf0e4ccacdd74ebda205fec03f50f35877b6c121b5d5440b17ed697f611d55978151bf61eda1210950e5ac96b8aa02cf2abc1c53 +SHAKE-256: 33e97ed04cbf7dd7ad46bfca996ee8fbda1fedf3d52af18b8c29cb717843e265f91410211a0436365b2fe094ea4e2876ecbe08079c5029383e85b6bf2d3ab014c504689df79afd827a6be92669635f3b18a8bcc32f31fd014840148c2f389e0cf571e6bc0da85e0cce8d5224ab433a54de9b78c5c682c5446e5077d6afd744804df78d42123fd8e4ee11b602b91fc8eaaeb2330d8b166ca43799526f8a2f9faee7eb37fa170ee3e567107d7635367a76a3227288b7f62186791d91a0f88a898de6123a98e73e0e0751a463eb042eecb5ac7fc4ed36fe3b4ddeaa81864197bf0251408bf6f5b7152c802687964d36f388474b6c4eeb302e38a64aaf45ae9d425d166f16e99d8e5a6f52926c499c78adb9bd206a33da301c9e71e76f0e617c1f37a473a4c5fa8875f2269b070957d160f886ada548b7fd9d7e13c72237f6065d39d9f92808cf39e320c9f493ce02f6cbe58c79c9c04c3d9ff89d06156f797ffe3d6312c901ebdbdb596c0afb7795caaab8c5a8af2008e48fa80799fca8a8374ec813e05ddb85dfb0342309b43d3cee673f64214b1005062fca8112e34d6650b1d84d8be2de72a2f6aae52f100bfa235bcb19754d5726909b0eea17e4dec05454f78181a6556c952979b7fbd06857c368b901f73d4e7cc629dc5d2e05dda4617d52bbdab3ea11af07f6c40c2d85d1d6d804477e3bdb2f2f28cacc75a10a7dc53381 + +Input: c53297613290998ef167af4ce2c703397b13fa5222efa686da768268f2143f51b4bf0f7c58637749242641627a266458ad0a53ad7185ee2ac17e9c8a5dee4cf3c35376fcd9d41c41801384e631be727128a9b7b944424aa209f4356ccaee36537893135631b389d7b06af047bf13855b8c3fb94c15fd9d0ac759e578fde22e7d3486c51f2290252d5f624a1910a37c8ceae62fd6e833a9694af66abcb9a5c1caf153347fef720140e20905293a6faba3317d345bc73f17c790007ae373ef8098dd348564fb63d7bb4116d529f91a9f73befb0623c533721b9c56772a80bab10d197b45dd3ba9db1e207db7854fd95b711f6f150768ed9482ec070f706c5eb2a0a1b4c19a4a24a001dd741cfbd94e6c690cd66544f0ca81b67aebf677682f69534e47d4b4cd8fa1cfc7a33ac319a42dd853f76e2b3e2aafcf36eb41c54ba26532a8dbf20089503c81cf4a2125c6b16ad24aae0d8de4a5567bd4d233290b7ecd83d874105a35e2dcdab6d95c04dbf587c62cff9a6fcda531fe5ff021e55e9b6ea0f315120f0cb8e604dcdfe22a3e0939ea835c2d3a7f0378e14da5 +SHA3-256: 3988c97fc7ee15a8eeed62ba29f80a5cf9bc3ac1eaa0a2df6623f857bc405960 +SHA3-512: 30a2d6491ddd7ceceb51616c3a47bbbaa44bb86e249e65b864d0f84860e71377f5562a25488e96b3b1aa0615c6810f91ae1a439689555488f34b554a774542e3 +SHAKE-128: c16b9eeca6f28fc0ca38092774621f4765c6bf1062b4cc23dc37384f6e9cf62369f54bc729eada9844cb54701cb2e03d639c5e26774e541a434fd05578f8dff690129363b7011c8cc5349249e059c22c6e781b33420e03ca455a6530b5dff682a7e91ff0455cbde928750fa88fa2584a45a0006233367285423c0e1861df4381e67752aba12336712c823f3264d3ca928ea7b9e2e5fc7edb2f3d46b5b68affbcf4f4a14e292ef4179918d33481fdb3a972943b5541172bd50ea0895cf3470c6c4954a6fffc1370dce365e6c3427af3a01923be7a89c11a348a0512e287455598fe899b34cb7b2aa82558930c656ee2ce2e1265d0f7b7fbd6f79b1353f82d7b058335402f7c5b6f932aea6752cccf689991910379055741d237074f7882ffa991c9b5ac06550da118c839d79301a1c3037b2d9de8c5492a12bb5a6092e60b3e204c73ffb82c9499dd7b5e8397ca4f6e685811ef46de3647906bca388237d3c310c558ff4c3fed41e91c9642e307981dab26ce24b271e4352c6ba7968be1f6e65e19371bf67ad75b357b028cdc1589411733327ddf15cc33e9b2441fd37c341dc3c256545ffe62ab793151af45caf6c482c2f4aeed0efca3a27c4f8171f20b8bd8925db37c33245a471e285e4b741ac6d95a143becff081a249856a20dc51be008bb96388bedab5ed002b98c23195a343264b0b247da04a7025315d81dfed50b1e +SHAKE-256: a8ce4ec902d789c79532f5ef1978803ac0117c3e4eca7586ff2b0ea83b53250487fd30c13301c631dae3c0583e2c8e8214180f27aaf1611d5eff0d3474ca2a119357b8cd7a983c6efe4d5568174a3ed9a39f297b68c991e25efa5016e105f9b33e073ba5a5414d5ac8d4d9c14a6faa84d43e5379de9cdfd86dab5a25ac1025c6898aeb8135611a19c78d3cffa3e0d55b689fcd3f66fb8e7066e8da8ca78d6de8b56139564524af229527960dee4264ff2228db594d40dd670d23476fe075904079b79205be6346d82a80b24708368de59ecae12381f7857bcf5019bf5eae34dc53a6067dd71219d7d15b089d84a69fdc50ab7ddba714b5d998af456d5f29af10b41f11261ca266f668fe5744a11f9603d48493fdf57430e440315f12b6c0c6c8eb9c4f38c19bd555053df2a44f38afc26fbace2e5870ef26da593be72f10129b3deb35025d2c7a91e88f81f59930c221199a9a33cebb68911f52fb1a3e665d54bc49fd91f09d57f6e4fe514656019823e35b6fdb3ec3fe20974e5587922775250f313dd71d7e53e3b59fedb2bb249de1d6c57b97c7271586f97755fe154c6236cb86cfa42b831bd60b10daa91faa13f7a1ce464d5efb2d48e2c5d6c494bce340d69abc82a44d52d80ac099dc72b71a7774161ac74671827a5d4b30abf411553d502bbc9c4b098c851a49cf8c00b0e429eb88bd6413720b766139743e3dc2a189 + +Input: 6711ee7af398dc352a63f5b3c6294145fe61812a20e316ff516f5f20ba7e41c0abe38d941246fdb423160c34a6dd03491782b626d65236969a75a84337149c2c561eea967718f70d282c4d0a15c7730d4b5e9c5b15ed9b0c6f050489f1c163c4c87e6fe21f42a529e93250a7772ffac722e87aeeb0c541860703fd36abd376d838898689517c1cfed85feb3e37735a7ef27944801b77caed05c06b586d9e846c56b8c86758e1196acb0e86fa4f92eef797ab504b031eef29f7c40ba1a4f1d247a122964b9d86fa9706225c3c88aa81fe337b4d3c5493226b4d02ef15e399307ddf391332aac0d0da5e1b4109d03f06833ac09c6957c39f9a1516d9c1376ced36feab8b3561913ea4671006fedc676b186a926503bc183c7817c6a76616e85900516b5f2d518e56c03e22008b0df3ddf9092f0e6baa69aefd5c15747f29a42de0aed892f86e4d19293794c424b9b8ea73e8e1af6186e9a928fbfc61e7c8c3ba3a7ed37577ba1e834fbefaa605dc2783f73b0d2ecf9ba413688f5f60a660ef69b00a986c6421f8a4015cffc12d4ca50b810fb80c0c210cd719c19a6b +SHA3-256: 1724f0eb5b4550ddab7009f91a3f95f686f2e849b64d0ca64485a91e00647dd4 +SHA3-512: 229476d2266f428b243810b3e54229e207f224d7b584d5999d166a2f5c65a09a8018b7d2a39ddab27ec44d19c0e05fb7077f72932d0984f905138ca615dc60f6 +SHAKE-128: 571a5546a84d0f34c8ae0f3a6babc56068ef0e0b3103f04d3a4b0dffe28925b71fb09b602d8b310ee9563cac5bcd7863392a5b8db7c1620937450e8d71bcbb59f8c86446ff26a48b505a6c7ea4749fc9e35ceafea833fca45ae94f661995669758a831c668979aeec71d4ca9200af675716058beb1b2fbcb6d157edd53bd2f9d90311ee9b5aa70390808f9b5fde991c07b21757464cf8736a2a547ccc1b54436f4729ebf4668f48b3edaad4a2cca8decca60fa22550e23a078bd385ae597e5f9639169ededf01cf695d67244181d39057f0d65071bdb64a7545b9b0f81eab779fff3ee33840aac6a07555175c8441e8f3f85672dc68e2fb8f6ffb634116737a83f7b895b2693f3bc3fc53755aab6baf8f0742e5240fde38b13be9852ac3311454523863d583f7fee11ee486caaae000330c85a8b944df2692bd935f12ef024605c9a187395a9bee971126f58a52cf833932158e9ba230d71f108de9aa93b84e4788d9933804868f38c69a5a307cc4bf0ce9191cf4c9b36115ff69a5125cfcb2824f0c26759ed63bef9b5772d00ac7b6c322e71e8cb1e9daae248c32b47630730238ec56343d09a2eeb41f4b89d27ac617218d9bd52d6d6c9cb4eb3e8de74a0c491fd6ed15399b917adbd5448707d66751cc2721c3b665c41d94bf5a9dbd454582fe9c2dac7e867c25a16580ead40077d4841023dc3e1437192da49b4b00042dc +SHAKE-256: 93ef903e54fbca753813c9694f430c43cc2d8b9740bf1a634a0c8a7161debe4e1726a27ef5580beeeaf925a3244fb7b2fe819af741822f218ed568d6ce673f0acd11c9258c593f7a00d920e2457c8fe5d70e2eef5e8c7834877ac3d240a160b0e44b338961491d8991e40ca9e10c522b5d64f02c4365dd1719ed801498610e99b2b4dd9e6dec092204bd8bb32cc17617858f4881125e5da68cccd3f6e41ed45a7cf4300d3db773458b1e3c5d9438d9b36c29a7f658995468dbf898a38fa1f6d6dff973571617d5ddd6c29e5734712c0c15656db1215f59f083a7bbda54e13fe497d9dac8f3cec86494a8449180edc7d86795a3ee78d91962b493c516e79e67cfb80a6ee9e925b918e0dc4b7a7b1df10989ca9e6dea67a058b6452ffdc90ffae85df1b42a94898016a6463cdae58691252cf4a88184f2a10e809c72da5118ee7c154a70ae1db2d035decd5e86cbd31ca7ae810fa788f7646167e1def5e07a6d3def1f84a8320106dcebf530905ea10b760e4073b08f41a316b5eb1446e0b11a26124ccd3b3dee0bb3c242280a1a4a7565bd1411fb6113b7cc53adde6752bcf54b4cc599e4b1a5b2eff6b0978cd32b1dc080ecca63a33ca62972c164afc8ed8f99f0083809059d2533914c6cb5fe19267e43a61d57caf0b30d2b35e88f75d0b9a7023ac10272e5b47fff37ec26ba4590a77640c4cc73335bb3825395abe9503a12 + +Input: f31eeb779c2e04d9066406bb29b5758a1b83b37dbbb3ef41b4f258156c10712dcc62ded7209d9a67146ffe54f0683c40a734298b826b9cba047b10233a5ace48943303e06cd844b2eae22003a7dce8219d94ad43a647c4b4718a1b6853c295da10447eb72969c356b90a2acfa8de5f2481bf30b1836facd2d42a90cbb1e0d6daafb2f57b7381d8ce162cf671bb7814f074657e6743257e5d1e79958a2c5b595cb6eadb824465388da3438f0853a0821cf09604fc9d1b06d5f74883743a1340e62fe211eb6df59ffdf79769ab296e815012004cd2e48c6f6cdcbafef07afd178efda2e92041346b94cd12d7c8c399c2ced624a24ada583966e023448d1cbf455a236893f6ec20003c617b461315184c7f3d9146d62143178fa96c7f43ab94ff31a1f7f23123be65358296893cbdadd55520cc3568a7166b100985ad81c78e76e0cfe66593dd43cedc4fcf023b1072b0e187ad465f58afd179bd9eb846f0f63c0e90f4eec574aa9b37f952f6b8b7d8cb883c9addffdfe45dc608bee71125be8ff2869a5d66c2f060c3e1c6134d407b21409d8def871b4b42db9537e13d +SHA3-256: f0b3b09fc6d8ea4560098af7e4f3c707aedafc19285f92e1e4a2597355161337 +SHA3-512: c04a2969decf073a1509347dbbd457958cda16a2fff67a9b0d97169f95a4ee8a4471a5f45a8921a95093ab31155668058b450ba9b219c88c711abbd039f9f11f +SHAKE-128: 279ac45ac06a34d2ab754760e71d96b1da5db5b575a778f13e4c1b84c7582062bef51b3e0e6ee3512ee3636f8c6f19ad0d425f28fe8a7c3eca61c13edbeddd115065ea85cbc9fb430fa261f8ac5b258e3c033389ec649a5e3eaee776fba0f0f08812cf6142eec8935f43484eea8e7c39b833bc927e43ca1552168121dbe187ee8de6fcec95dc6b28fc7ed341787b819d09b94d9821825f72dd5285bc69e32f2c82fb84cb9464c459f0841d443de66a0b7373adb037c550aad875fdf1d2be18797c53dac18127c95b21e423526b0868d4520139ffbc88a7cd1a4d337fe44395f1f015a13fbf7c5f6950e46ff9c7ae98883a7b17a7ee7cca934157e6135a632238ca61d5c09e973d5987028af876bd0773e6dd3e7131fd26b3d4537d6d2ef7d79ce165d308fa6a8866a0e24a113bd0fa27a633f07dd10217427f55491feeb8e0faaa208be4d4bd4543c905507b6d2dd9e00452a82f491b476ed7d6057f5d93f4fb0395e598cae8920cbcb23e4adf40dccccfa971ff54dc794f70efd6f307e6e409136d08b8ad063bdd22c7186a011806fe1b2821f8ec83803b9f6b823ffa49ae4c0634bb500ebd8dbfe9dfacd265b9baa531c68fa1cf2e6cb7f6c096cfd97e675f5f51615338c44c5019520104729e56efb56e64c61b8aadb671d7efa72da288a8406cd5904c1c831144d5c8035d48ddbdfae84da9489487de3ed7283ea86a563a +SHAKE-256: 6fa458b61a50ac9a3151b8f3910dd719372ab02b8821f2706b0fe94a78af744d0942cf2ba7fe1b581249407ac755bc474b331ab241d1e9aca565fe6da3dfceb8e0866a70c0410f5e0c4193375aaaa53a05c9316cd573c6682a2138f4c9fec4912a2479549cab015b2a80ccdffe8207715af239759c37fc6a60809f77076252ed03b0719a7ca1b8b77fffc2bbfe5b0787f2fed45481e3b43b6ac29460d8699bbe1cd5d339f995b9b24c0203c10c55ebd94e8a15bf5e264a6759096f089a1ae7fbc3a6fdb76a2093b2c0cfba50b729414d49e6f82de4b3091b8bbd63ae10e5dfe419bc187455e0e16094bf3e3d0342db3a42deb0e23d37a7ac165edc9a70ca1cbd26ef002dce86495e91249dce436eb3f4bdeb098324a081ff2d6d4d7839a72ce8100a1d070bacb07f244955db010cd7859ded35220b9a409d689709b1aeb47bec01aa2e2bd48ee531560ed257d43c504d76564cec1eaff3b4db3692518dc9be8091d8d09f63cb08e1ee1d45f9f3962467fd1ef2692b7c907e706309b7722bd15fe5452c61ee9eb5037a29f8f39e058d2cb5e1bb198305838db79f43d1fe61ebbba3e132a32edc00262fb7bac58b23ec985c4266cd1ba24ada0b0bc70b9d10413e2ad46343faf71675d2c0a3414282292ba8c6fa0be4ea8f47b3ac2cf2e5580ab8473ab46feb2dfff994bf256374a169599585565f1bcc93a6db3d70bcbf81dfb1 + +Input: 6bad07e5691286a34c97c05406f328a0973c3fd40ad1304542ffcb1d08913974982bf0c0b885dc29c59c2b05d8aad112cccdcd9743db2cbf4266794dc609167f5b53b5abb39093467f8e2496ee1cc4b80b861a98276646aae80f7112ec4e4aeaa5d5ffae7a250091f703f0eaf3db9e26ab9f870009471680ea341daa5b0aa34f4746003a56504f7e3e7d61efcad17cc37e74ee09406ec55639530738f9870ef8cf2f8203ab416658ed5a3a46f10aab3a376e529d755fb70c60c1fd90f0e8918499624715520f3f136b4eda78e976c1a62f5dda7374d1d74f7008086f51413539ca41f25be42ea6f79cd230e72f5e60f2680be0a877fe35312d84c70063885c4e7490b173c595b41ea6d1ec17db0a444d78d3640d591796d7f171250a7a030a6c3bf67b4e9b08c3e2413938a66f2befa04068b752cb5ef050b1e98735d1a51257e7a0c58199502c3e445f96075944457eb7754710b9ec6a5ff2d82836e65e5a73a245da58cba09714959107cdb278b48ae467da762c09de12cfd70d40439e1601be318f4e67644cff8695edb64eca73be3e3420e170f3df5e2a8216f209 +SHA3-256: bedbb5b67337d5991c73efafb9c8f8993fc3c62766e9beeaaa00864d699826c4 +SHA3-512: c8e644c52aabe55bf86c396aefd32c79abb0bc0634969bbc148d0b32cb834d873cfb1a07d98229f9b582642f1ad28bcc9d345967273f6d6c213d96ac2c7f0515 +SHAKE-128: d614d1497c4ec81a5f759b62447ba59de7f69fc92de4d897a1f20fb3051975442e711ee6733c2e20e8507be76d113ed5af57a8f336be9d7fb85acb474c25b40688004c4954277e7440db45400b6a73843fa6335c522be4968547c821a3191fcfa93201d26dd349bfb54c26fe6e46b6adc16d30100cf37dbbd76b4dec04e63f8f00e35da8d80fd59442b17e740e76de5964eec244cc871d6a275aedeeaa34368c437ee1d9f2e5de7220bbf13c1c28e65772e9801d7586e0d891b6ca62179ea16f8d454efade89dfa6e4ae42c84f592380034eb6287e57817384bae7133925a99f37d8e0db693998a34861cb96483bec4b6a78f2e7dc3191ece7dea24c2b6ee78a75665c2acc76433a231d0458c49415b1e065fb8a6eb0a989a2fe23c2ea9f571681d322840592d2e10a0cf1a832eb0914108c7aabed8e0b6dfea22bc9398f5087fee6eb49e4b78b24a9beabb4d9c8cb23bbfb617f1ed3b3df6e698095138c735b127922d4a5d6d01c7180bf03fd72e7590df65ec2018a16d6a95dfbc5084dc26d39ab979a75ec7260064d025b9d38e216147210fce4cc3205bb5bf5aa3a61aef9e8a3e49093dd09e16639b4c1e72a5d4962a8e3f6a8fbed675bf866a60beeee1c2bdecf831bae515568549d4c3592316bcb87d704071dd25f8904f4a84805ea82514c88691176dcae96157f492386aeabdcaaf865cebcd5c155aad0fdc364e2ad +SHAKE-256: d565b339c8d24f416eb905a77a2721bdbb7934c73f94f727208cb5dff34d24c1f0797fa15523c18040e586e9315ec04f531a1ccf9690b5231406742f0792273013f1f161f98b1462fea06c3d8c7b478bcef749673848904fcd9854d04e830096675543d83dafa0502ea1db1c77e2a26f6e83b2d272f9413a1e5b95b0050c42b4d95f871d673fa761e4bee369244a97e0c4b4721f1bd2e2def0f8c01cdd4765599ce14bffd45e99c03dd5c5ff506d25246b252b5a780f7845f12c2e74cb86bd008a01cf5ead6c8ee8d58e7c2265eaa7656016b4429f773c3117b06f934fe3cf65f8f65d92ae7e5adc5182124d93fe910e2478c499ae10a5fd11b3c15e14e487fe9ca333cf6624b766e95f5e0ec55b8330177bcd73ca3e497ff6dd4fecadf20ebd9bbe234bdf8c8ec353af2c2b00802d712515ea466fda06d6863e251b22f49b0c47fb17b04f49936da1ed00b6bf5b55d294058080d9b9c2dd918f960290d883163aad71e2f597272bf05cfe127ec695f4b5652c68296a97f9d903c69364c38f27dcabd5bdec15a42e368a87304f1c952d75edee9973afe9ec1c227d9fd76c50242947be5f42261734fb449f9f1c5598698a8142e4a36333304dae7c8da6afe9e85255c6811523557854b4106d67a69e888cecf3a5231ff41d30d429084d7019eac4f94a90e6a55aa67b3f97fb4e3d0d4aa7928745c00d9d5f801c99e2f717a631 + +Input: 039a364b092ce5c609fe0fccfb0e299c777146fae04ace31b88c8751bfa80467fe77e44258f1a688f193b172bd9a68e28076e1ce57c62646149ff98f1bcf96d5355621037bd8524e4411ab8f4465b0324af81e04a8801f1cade7c9ad30cfbcbfd386e1ee01937445807725e55fc152683d1c93860050883495c6b22dd651a2b8ec16fb91d64aec69a5db8f2e94ac25e01492c3a1f66d156534a9d021f2d8c5428e9f54974414c0043a0cc3639d75101dca40ed4313634f3add07cc159bac217454e2370b228abb5a71013533324410341e617f48e48d3a27b611e7a4e50a2eb96206af273e3b75c64228b9b78c6062bd5022ff766e101d95d27facb81a39fd8e5b06290331bcd008407633c7b8153b7f6b313715826d0866452c777d9d629de29c0017e8b286d81ff092a09b0ef29fb01348e092f27330c5990c329e1d9f410a0c60088c3819eb24e2b66f98d79c0a46b36d86532f9ef18e358841fafd6048ff8ec96ea75dfdb10b790296061bac6d44c4e9234e6178321a704ffa0823d5ceaad3be08b50fa355d9f241c6060079705d2ac8c9c93f07e74ac2d3d810c3a9 +SHA3-256: a62dd10a971d1622d7d0201ff0b4814ca996f169b1b24a5f6f28a3763d2d4aa2 +SHA3-512: d1714bb1ce7efdeedfe215e3f44481ed2a58655d89d1c227b74c652ed48effdc338f6a2693ce60b4d8ebf6470d27b60cb633502dee784b3faa2d37f168d911ea +SHAKE-128: 9d58334addf61a8921a3ba567edbaed6668f2db1d48121aff85165d63456ce66593779dc529923d7e8aca6e6273cd252e67e32f7eedf879111544ee6f3ac247f2df7c6fc25383ce0b91817432b0036b06bd66e77bf7c33d9b331745ac5a413c4ef675b97d261d9db69f106ec087239a54ab310b28a69d74af57b86314c3659fac12ff02ab4a976964368f5c4c5fa8370fe7666cacfdff280869536057f7d806279ea5ce142820f1ad1a0c5dccc3f0503f0262f29c5124feb8c6d183965c2ccb8657ac66bd7469293d8984c452e2026b389665b607f1d18de7467fe5be7932ccae7160c894e48cc5fa4285dc1f6c298f7afc7dd28564e7823d0117d84641159671694c9a290084e56399976c8373d4970ee9da6f1eeddb35f5394bd9a7584ea9c9abf78630b41166af358b67ecafe02af14126ad866a16fbd1194929e6847a074c8435ec976b91f483f11a273fd81e437ea5c1eed3eddc3a24720c91689296af78b14cc5424a234c0db9f20bc2dcb82b70e699ac8e057761702eca61bbe9ff67b137cf6bef7ff7dbacc5f61fd5e21a0d0d19b9e333a9b7ba39dd9306842c5c9c91dfabde8c32ae9a520578c7fe144b77a45cbcd9d49adb855bebb7fb01f250a0e9f904ff948838fa3cdc1dda5258ac994b3f7cc546b1f33c416dbf0d9c310924a5cd44668183c373a47897fdb49b899167bf04ada7033ad36faa675ea64267cdb +SHAKE-256: 64048987391f68e1402b5c9cc1ff7199f00fbca1b364fb552d1ea132ff8939033994e39eb053a09f9bbbf1fe7f5b5e27df55854b5a4dff204bbdc0d540c8380c2b229bf051991e025839de3f747d49f78153ca95dee6e94468c1199ba902cdf5b2dd2524508663a9a4b74fd0e10b9464f19b1d7491231c0dc63629b23a7ca6ad131ee098c7048e2b9d2b51427696d7c6727c54dd57e2d999fba587a7eac79e0e5b4577d5d9d36af98da0312f46be08145d704ddee75ce923e21f179956c7a577b75a61556e11eac6c02d3cb97fb37b1e3b51f465474d24d1b9a66c5e6cbaf0cdf597bb2ea6966533f5091d8280f3d84849cfa58b8fc40a6b9e7c047f89bfe8f0c65b37f12e3605b09401f4367700e66d6cfc83006dbc6cd7da4493d1a46cb821fb88d397050714b79a0f6f785b2ff91da9fbf2b7a76ddfc290a5eb4f9066b9dd0b7ef3362fc7c243ea0b34901b0fdb86dd947ed421ce2231521f17436a9f278850cc3f8c001238dec6613674c078236cdaaf204ca79dd965d59fb60c7032a415957563cc91dbe20db150ce936755d7d0b1d1dbb9c63ffbaf60e2223ab3b6d33917e551aac6184ce9fa720ba0e08f7e481248453fd218593aad0c9d3e9dcd30ed8fae3509b2c65fd617300ed3b78565d860989abde9858ee3413139f5dfd22f9d8e1f914c1fd8bb1981f3554343650f101f6bf4ddb8d0a08b9b4189fbe37c065f + +Input: 0d1f2dd3b88b91f69af010ac33b8e7749a7cc92c1e5c2191867a90ced8f1721eb968ce3c46018fdc070b822b366ce4baf6ff559359fdea062e12913afdb5778ad945e307e12da0e4d9e01aa585970452732e7db315b185da83707d51108e35faa10ba7a16e2fd0d27e52bce42d134cbc1385f3976ddf2e66f5849c9a8e7640468f46b48dec7ceb53d19abab2682d01795c64517b369a0e6c32ad800bc96cf47c8246bd09ed88feca2e19990d671abb640d02c233e5a7e17a03bf5733c19deccb34fd96a48042d124af1260edfe4da2e6f335cd220022b9d815ddcd63f51de77218eb794a2c1fe620331cc89ef2e57a98ba7f01b4affdbab762f6ce29b617b518e8ce187bd30324993e2a8cd5d50af572f58052e3eccd8a70d84e6b44f73f7b32a69d164d6755acda600cf0e5a7ea2caf8eb364c6ead615a0bb65320ba26ed1f6cc7df9e296fd703fe8c85b6d273fffdd583aebafa5aead47573af5d3d8a50a4ca24dedb8f38317af4aedd63b4c7a4fb2cd71bbf479408ff46cb54f7843e1e820da9418f29c62861d6965440233c8d014f8ac690a2e49784c6037e284e2ae12 +SHA3-256: 5d8c1023b3bb0536be62e334d9e0787bd4acef8bd629d0c1cde2db71df0ff3b9 +SHA3-512: ba3a06c4b754b7065e68b369cc558d5c94929e5076269bd9cee3d7fb41603bd093d8f38571c7a753c8dbead75670b56e3a728dbe3c050ed58225c5e5917f20cd +SHAKE-128: 02639386680ca2dd24a295130e02911f5f4d4010f0f7e85e02d40fabb402156c6f69c7840c76f5bf7be6e6fc9ee2834f8fb8565e375b52c101571ddf765aae99bc3c73cde175bcd2905a9b1010032fe847cdc2b7b405bbb5724a600d92b35f2f78ee1c22a7b5a795f4c10335767ea79f0a2617684af3a7ecba4a0690798e4a41568ff6031c06fe75aea6e4ca792fe1e06d8fa158ae7d3f7da5281f8c09b3257aba529961f569273b1d3f00d694bb8adccb3f3d7fa8cecc8d07f743f89770e00fb730a93eb7b428ead5f4116f4dc88a69d21bc06a2a08cd4a08974bffcd5714005bfe1373eb02454687be7bf88030cab462650163f112f6b4b33ea14dfd8cd3975a19d7312d497c48076a6304ba167d44b70e3cb62a7a0bafc66e25338f56b5d574941fbf488916d7441a3947b94362f0906899a8f8fa896088df91519991f5ff7940d02dcce2c223e8929e2fd767d56384d58de03cb7d3d3d4c540b63071189618b98f330b2c7293c0a0f9c6ea1a06c8bf9d9a6fde75f7946e9e17d72c5779519e18e2df3aba20cb7fd403bd6aa5a21d07430ed6df3c82d8501da548846dbfaaa5a2d4f309da62ec22490a1678f283b50f37ec309d4fc69e8d9f3ddf7cdc0f4fa895118c775effdc6fb958648475eb6c9024250f7cdace5516733c1e2d34f70a9b26c1e6ddec01708a29f27743f015722108a1f3719639a6de6feb3646147ee1 +SHAKE-256: 4ce1d4304be042443ca67feb700e4bd8b7413f4a1e3183c56f4553714ba9b095e403f741596bdeb0bb0e1de0fb5014cad9c0fbd7816cac6e1e7435465d5e5f49f7a25bd1e7e7fa8869622aec233e85d6a93fef721976f1c4138a1c023464d6db9cbe714658a3bfa0c62c6a858775bd9c444af4269a71612f53f73b551ed1cc0705938a8d925b2fd3d1c1343ec16c0a60a0fdb31d5e56592be5aadd03f2a01df036e443c2e04fb8c54534f1237dcebbc90f76f9af11b24db7b957abbe9b5e8c82f3a59c38845ed1a88b2e58e74485ba3e2cf6ddc104501798d5e6f2bdcd5dc582a18adb81b737f502645d85e90b2b4811616dbc49b175a3cc84b03966e8fcbcc3e2e68a3d16c6d8f1ed725a977ec1ed60f05bcdef007301b3673687a686e28da4a4baaeda3fbcf4f822e7d9001ebc1f92efd8cc65bb8d93f3fdbd596394eb6513093a81216da249b8c86c4f91bf118176f13bed383b5f775b7bcdbadd61d0cbff284848a85901ff1f81e9b9f49d0c14cfc63337778a1dc1a2d72dd1572acd441ac8816abc6de6138adea4e37b70584b1418a25a90b3e98ca354ba525857f7a63081cd3a2e84044ede0b3e7c9978e0493afe372959f694d94aaf95eaa33a33dbca5e3aed81001ac04fe6a6d2347523ab8944cd85495782a96d670e76aea121cf941ddb5dcd58341ef9551241c274a2432773e301000096c0d285f341cffbd32a2f + +Input: aca91804ffb5e632751397c297bf629503da0113cbc2c2c21d1b206e4ba2b8c58531253c89e33993387f81d43476ec850322b49ed85d4fdaa683dcea0d19aa0d00f56ed126689828738fa125ef8634e37272d657c82c3dc0da8b7c2e423e9024561b0757a7cd310fb0c9bedc2ac79375950033ab9afc8a003194a1875f3369a83305c6ce13626faf7f6d0caec2327a5475b46ddadeab98bfbb33105d38e63dd487c191bfa94b228f6ed8fd074b958a11455c75439e370b51ffdee328a3efdf103d999d604a974317a2b10b69c2485877931d04e0869488b128ce33d52f091926bfc7c89edb56349eb17b029952505bacb331c800f773fb001244379643f073d91d28ed861a5fab461835bc1ac0f655be509a49a305969ca477137ac1274d519c6e15ac9d53ad4545c27c11876082d6550abd417f71cb68d92e0b0857fc451b5fb619ba0b44c0222d4e2b829de6a6fdabc0c2fc44bc624b2ffad83ec3c889a037bf9d78a35f02d0d764f0de212ab1554a343cc725444736e839fe2864479044ae0c9c69f3f488dd2ab7c8b4733d3967856410b49e1e9a3e851e29b4e3fe857f56 +SHA3-256: 1c2f5a4ae08d3330af63c8b2c59284f555bda28df434d9f704b01d4cc53aa18e +SHA3-512: 7ccf3c62fa32ddf18092835aa6b19835755a655244208bf6378a644b114fe957d658661c4f7faf2bb805e9c7e8907581e625a7347548c821f4a16262d3e7189e +SHAKE-128: 81393ea475aafcacc9ab2143d9af3315bb0aa878ae651af268f6dfe9120cbf666bef635a32fa4d766861e4ae603fb0b431ea4a3def9313615cde9bc9b81e525eb009ae4f6bfdd2cb4abac7d4ac274eafce1309caffce625172c3624d1085121ea28813be51fb74107b0c17172c332316823d298d3a733c8a3f9a1a4cb7c5f8fe1272a0a0fdf6b4677708488d94cde7d8900336877c79ef427160acde082c30bb76fc6ba4dbfbf5dff9e705b0f17563f7ff20cb7ae220f1f2596c4ec14eb2470891d4efd6ab94a301d7b701726740562df43fc3890bda88169bc4e0a9a1df93c6e6b06a455e6e6142078a2fc116d005340977c124eea6425838d3c03b2dd750a9be2b9eadce477362ec84be98d058c8ee140b6d4e927c9eadc08ca920e363e3678145b08a6d379c7bc6c5751f9a0e1d7ab5adba7807597d0baa20d18c87fad29fcfa3d238e7b41cc45df68a5fadc0c14a6953c4390a61c00ab0d59084e00f1a766ad42033c24ac11edbf891a488cbd5edbdd03a3eaf1abb2662018dea84a621587ec1f5738a159199f6625999dcca685340d306b92be682ee3f40ff4a893955a84c6774f6bf62072886664d4afa9883f4e0d76a6e7acf1c752749cd918383e9bea87a90afe3211f34f1b7b00c3114d83d0717898d333caa02c5b07528a97937a1801c34825da9a78c62f88e89617a00b95cd5c7260ff981a3cff762e2b74a4a5e +SHAKE-256: 8e4fdca33b1c7eaeaa3e503addae4bb150ee8518a9aca3b95887d984a7f9cbf746f96c55cbf9530c962f9e795bb19c9ed574d6a6645fa1ed082c55a833f95d9215bf97102736175ce68eaba6d73528c2969be977e73d7f0440b1e7e357d04797e7ceec0b681b1fb6d36e72f851809857f142dbc09f3638025ea3d8ebd27fa4e4a0e19858fafec28333a73cef0bd75ccc8cef39c064925717a13672f4e252f5d3e23153544354d9dbea3447c8f8cf33890b44d1bb791e0e3f9349bc886a2bdf64ef49b5b5d7f62074cd81499331600f280e6d78ff8a293cfacd3a582e777aedc7f58fe0d4eb40dd126c7ac578fd4364796f33288ff3a725ea969c18db0fef752f6f09d61bd5bc94843e9df898d25b3e30cb2cf12668752106882c4b2e14bbb4ce1b57c5e048079983d07b918f0d7ea15811cbafa31bd003899ddddbb89c30b54f118053901fbe9c248aacbb9b4260f3e6df9d065cb7aa15c41bf69097429f8644b01dc890ed935d7fd44eaac9feb879e8755c657c84acfd2680798c78c60e24fb62e9a87fc264d52876edb748dbcfb034e9e78dc8429e234d2b141ca3e31abde1838ea2a36a608e67caf5847f043f753b3625b8b0004f47d792d07a7f03a555b740cf3bb5302d3021c5ca3845ab74d0c3ec6a7412e81e7ab0fa4150b5c04300480f92654b2a0bdff673b46752b108c73ecc6868299b879bacbc39d39e50bc1b68 + +Input: ac779185cacddc70d7471ea7f4170171cdbaeb3e1d29d1b7c8fdbd7e78394a3d4dfdc02183a8b309cf32e307ec1505ff7ee8d5657eb86348ce118638d3a9acd91fc26c6f790bd283e652a131f97df6419274c7076ab7a35e467bbe5914ca6fda67d217c2aae68308015d9dfe91547a4fd87c1f20a90e2f13246160dc658fd37e69fc3a17c84d0d1733f8541f05b017ea12a4919a5102773c47eebf9ae60a9022b0c0edb92cdfe1f4147a703c53434c399d4d34b0e05ccd0641d6c9c4bd04c3010524c829f5333e0da3470f78fa831021749572e3597a31034a018c18842c662a81d3a5dfa10b632171f2a672df2964da7985c2173cfb70375a3b4213157f2ea5bb26f2f9c4af9376fbd8dd18049e2c06422c774078260188b39db7057e3e695887a3e2b6a173395fc1470ff9a3830a1b48868921853544c6e412b29810e375d4078f77955fc1144e1edca7bfd66dbaf1ad12a6de25b87331bbafecf8274b5d577adedce96472ddd02441ab3d24e139517db3b43d14785d5e5c033f964c0551e3e915f3529379b4f739e640a667a3c65337d483434c5f959b2c282595e8ac3e2d6d +SHA3-256: f2fdc56a3580e7c38625ef220d7a52883796764d75b1a114df9ffa16ccef7ab4 +SHA3-512: 6a83da096c828b943f0545676e5c8fcee3abccec5fcd2c1db96a7a4ba65ea049a288f4d2610e34e018bae9294e62175701c17919aaa8f0108cbbe587a61c75bd +SHAKE-128: c7e42cbcdb8b8520fe4eaa878f2dea695c3fa5148304a93f8bd1decc7d3458aa4c0d346fbb87277362566a1761a64cf7942d94f0d5c8a7577ce44eb7db364cbb0a52add20ff7de71051bfeb0c21097db4454d5678adbe9378c78413a70307217f7517eb43482ae758a5d76c9016993a72d1c4aa5887d1bfc6c3ed05e50db5919512022fad0acb74c2aec16a56b47e6d79995afb8ee77b1236649f023fa3ac19bd55382aa36d131dba9054bbfb5ea9bc86d03c4c37193b9aded95ec06f9ccdab9431f1d1768228edce655c5b79bc71bdde39ef1cc8d63dba44c7eb132ee5cd2cd26e8df751e400e42165983f8ece7e45a44640947c13fd55631292a39f7dc88caf822ea71918ff7886d3286572aa38be92844ba70d5dd9d6a005a0a1c19ccfe885b636f12ae2bd62b914d3c46bb092d8f8495dba085248a83e461fdc2a5cc92939e221ce54724ce19fdf4856010c97341a18440cfa6db25dc6661ecc624c20fe6c368c0f49e5763f095ff7b1bba2ef032e3c92943d39fc32fe1ab786273ab8c90f2d22eb6757e5a472ce43e96cfbebd880aec4d33a52308beb0396c8435a6466cf35796f7419e47460f84937f344dd22f49041a4ae9e026052b1a7b9e32356aefd746847ae47c600667cb59b74c1ddd38385340a5cd44aa53ca1930ec70d0263b0dd90632c3dce4a994a3b56fb4f89b0b8fbd61f27ba49d0ebbd67ecbfa28fbbb +SHAKE-256: 7e75746cca99fff240baf2703c63212f2596bdeea6df3a05ecf5d5cd6a012dc6fdb52f76e2149b83bc9637383740e692d664ac6389d97f5098b94b70409625d3d8e84e9672070ce6f170fe25af2c6366eee75b49c27ed2f92bce3e7e6881da793cdfe31db232d94cb9936a455fb5714854b570f7bac86bd670490c3ba5f304efa71e276a876a8ab96ab926bf792ede9139e53d7e4e0742941fe3fb919f9730c38ea88947b18d761a8f7eab48a7f205c2143206f52109552cd47606df20c12a14a1dbd8fcf31207066055feb25080e8c66c17dcb952d8e7440c7c2afe63c7aa19ebac1075ee5b2ea87b5ad2cda204998390db7d78aef74ec02a6fbddf5bf240bd01923f8602e5792ac57b691363aac95a886147086a7a231395f8eb4ca575638dc4304e3653f8e237e4ce57a72513c877fbf361488b09452058ff92c17c007fc41dfb50b6b6d6ebd2e24db6fd94bcc318d3fdb051a49ab9703184d2977eb77448450918a4bf5260046dd28ea6694255954d7efc84ec05ae1cbaeecd71e158ef6856b631c1b7ed779b7d36db8b50094ef5a3041ed23c13b9f56537135dea7a1a0a8e6ea30139b0badbcd4116fecddcca54de5744c8fc24042f79a3b88c576a1d4562fcd8e1642f181d74483ec2cd0efdd0165a1ddb46436d5a1a9658457ae47207647aa24de5a23a50e7423473ee0e1aa9c4325af9e8590fa9200ce3258a8ca3e3 + +Input: 0b91d48b6c7c659c54aaa1ad689ac3638019d5d02eca22f3c26a077f7e9dd5aee23dadf0a8ce0db1cc488b4ed2e5e8d40adb3620f8a1c367bf489536bd906c68084828a44a87b8c893e8b08d6e1d1cf6de9809084be87401c1d3407595c60cf9c0e6083bf2af180c9ddaba7220866cfa49f604a3eabb53072382f3fefb234f0fb554cdb8320f7b0425449705e16d2f0cd231db2494458b21e86e0b1dc409067744d328017c821cabe47f4550201f76bc8a7d1b52c3cde48a81dd045c0f78821b1468e46149b2c212b7ed0f356188a9494ab0a230daafb86b01916b667653553493a54d41a132281223838dbd3ba4df99a9ebbb013fd41309c8ea05797153d6eeb5cccf6ecd0dc54a1f2c5b7114ef6b9813326bc141a6dd8a119723f3298dac104db5184665e1b59eca01d1e32898566fd7e1dc2042b0b827d7f3737dd7b141d88b8d54cb53755f87f09e0a7fb3f8977c10bfc961b5f6285e5375ad1e46d3b7c93265c10795a3cf6fc0a503c042b2e084a85be1031f1161f0e975dddb2fd56f5ece1ebdb84b83edf6120dc3ad93d0d4979fc275fa40dfcb3e1900e4b770d1d8b82f07 +SHA3-256: deb888acae19d49c07813c91349b64ab0d5e497993734149bb9407e075ed38bc +SHA3-512: 715ff279185a66adcd81f2ae5f80373926806528f030dd289d6c012601dab62dc15deb6e34ebf2f0677badff8d24c820b0b798236b1a9cdc8c2246c74f9f6fb1 +SHAKE-128: f10c539e4328b7653ff8d143b41d067e802e7316eaac2980cc4b1075c58b0b919655edbaafe7d6eb71a8e8373b4d3e87b43a965830f8830f238ea3ac9e8facfb8c367c588f96519e9023a74301a16f36d9c740695949f816c0d925722dfc86f1aaae0727e1cab835e68c0a79fe83f2413e854e3f3f039e348fdf4ebc73a1a4b06dec1ea3f9a3295f7a2b2bed410ee657df076708182db3d03e856e180c1cc49afee2d1ac9c709d5eb0e770bf88db3f9c7e087b9fd2d7b0850c46e3bd57cd93197f2bd924063179d4f410c270eac979ad7f0f22601ff78e38223bb73f83111fb92708e28296252c90c6a2853e3c5300eefe8dee84feca04890f208e1bee306f9f7067f1d8a5de753b0d734d165c1ef41ec1e08df20f360a4de3d2069d656aaa4b9e76cbdb2eda0b757b4795d94ef2a686a34cfdb691400e3e5b6572069a4554ad28b810f6e7ce5b3d8ee3c43297027e5306ece40ed51707595ba743b3fdcfd0a0b8eabfcd7708c7fc863d6ba9b8d4e77d8044d32311bca388c2b3203e8c7f822740e257056c01501c982d0ecc6cfb70bcaf2751c1f5c73c6a676de7dbfcbf2b53ad66c4ec3fb349d63c70703ec346e6aca12ac8f82ddbcb83d787e074897240a11c0b6cd3c865ce89dc4a4e107f67925a142ee5dc81d49fa437b9f47d7fa6300ac5c7024a4719cfab4b7c9db2e849359b2c23c2b6be9f2547e621b68a968436ef +SHAKE-256: d6773bc5f6381930f215c14323e7b3140de74927cc5ea5af9f64270be8cd5dc86237300fd4ef802b537b766a628975de67c47476670613f8599cfabbfb4e0f273c4120a8d7b1f28584447b66b6b77289bb0448973fade5a7de7fbcaf69fd0e09a0faaf0b2e410b3c3e08f469f3574d360d7278de0f9f4d089c01577ecb93f851c0b9659613747f350201198a37e361abdc08bdc6fc5d85bbb9c25abea178b6003f14d2d120d913b1f91f9962f3e1625223227ddecff671655743c44a165800a0a68141160260f628cf20a9a39af9db1f89da96cb0eb038eff318208b8dec164255df289c769f1f221feabf4fe0a69a1a9841ea684f2f1ab8fd532927127cce67948e8d60aebd7c6a50378c420d5c7b2660c1465f45f7d26e9a0eafd6b5390f4b75e9c12e1965bd0c5d0be2729017e2299410aecda7f5597beb1b6e18bda7c7b629a150133f14673ff8ffd30d49600d6d864ca598433a656bf4d0d37b5a11759e837ec39d11288c91123fda7b017dc9a811fc0f235f5344acf3620daec68ab21d9d7c6ff986b6a7ac1f69c29c858309e59fc3bec48af5f434c99e05ddf394e63cf86e276deb19d861b83e6f1e093498fcb3be0dda172c432af7584750fd50f19418670e854b7a4190af60e0f896b386f21e394591536e254866f9ff086ce677a96e2360b5e19572929928e8b2bdfc023391e50bac81fbfa1bed99d1fe30079325 + +Input: 49c723bce35f180aa15b854e5de2843b55cf685c7187439dc33010befe018f8231437c614cb64e9237d6e4d0e659f833b00d28268cb7375bf62faa33899214c105c580a7201a27abc6fd77c8110ce0d1973eeee8a55daca1c82025194769130d53cfda1e18e7bfab03a977e8c1ff6e59b87cbe1afbea9777cef76a4f58563756f5081eac70152846527422b0b9bea7c8b5352a5b7c33cf369c763a73e711d6f3e26e0ff653d6a9c7d1841747179df158a14d2bed01147d1f435a2657a82c3365f6974f0a02fbdb111e6b376757c77b8dac35d7da4eed6d749f161c120314f7cfec1f60fe14f1d2d0a1f0d0a92b16767497baa817681ecfcd1ccc49823d8a071d59d074cfafed535c646c0bfe2b0659b09651931fdabcc3cb1b830860e0036b6ce3db43f0d45096181fae2e52b5f3a49dd6a78c1d52bfafa8d0df7cdd9838e0edbb33588895bc20c226a2cfea7356ccfbebcfa9ed0227fc5c2b2b12235aae05a10fdaca3d42ef6f509e707470b58c9ede50b20eb1f0c08f0c7c50ac1aaf884019850475842fe852bed676ebdd14f936871d7f376bb5ce38962fdd3b4adce6375c669084 +SHA3-256: 7a744fe808527b4d3ae4fce7726a3cded3c7697b391d867a145afb7514a80f56 +SHA3-512: fbb46380983033c4bf6b1b028ef47530bb13af9e58baa5005d95c9ee067e5330fbd971ebd0c5b2feac23168ebfb97e2ff0bebf6bde89fa9d8d7c8104c328098e +SHAKE-128: 45d53a551d17cbd6924a35e47ea7c2d07ce236bbb0915cf8cd06a71aeb589b888297298b9dcb4e91828f44f0583b90cbd61316c1be7792e047b88d308493d2438b30d41b752b07789852a83a2577420f9d909cedf4d272f44a99bd9e49d157d493286e2e55e80a7e214f304809f608e438a9373e4a9f1b39bcd33b615d700665032c7dcda0241cab2adae5157daa9b111a8a090c256c4d1ab8b3e85469004baa8687a326025085f68355424ab20c8eb5c8d91305f7ab7ddbfa8a2891d4b2f663bf7a454befdebe15d31c6db833006d3535e063c34d45e1c37c0e64b69958a46b7768f543c2fe767719c15b33e89ce25b034ec1c0370d2a52c9240cc5d92b448f2686c5570722cd6fab5a8cc3b007f5dde0f13571bd056978c9a3a1bae8dde4a09f98e79464553f39fe071cfbca5be869a353ebddc37efc8f0868516f5ea07049838d87e1893e6ad3a54534ad20e153a84faed659ac59171ebc01eb9ceaecdfb4f94ac627619f9943f63e8e2428a59c11fcef5c2e7fa4de691e072b83fe45eb0b0ef557808496209bb66d0c2a8523a5f303ecc4cf846f1b30fabb48400578e74d98d3dbc42f6ff3012e5de6da38c2d69d45e49d0a634efbacfa849d63ba7b8ada19520a671b166e906d3f7d73d05ca62e5bcb7e4dc672f0e3ba4600c131ed5e40ee41f049934616bdbfc560c28338919d05ade9ee2805797e855f36ba5d67b7cc +SHAKE-256: 6c16cb83647687de388033a8cfdcbe46e15738ac0a97c8cb63b4d946ff16f95857d050375f29e739e4967cdbece077cbf650dc4f163880842b2d6cdb7b92aca7a304f1478971ac563a80e25c2564f524fbec79a33262cbbf2b3129a815950e4a929ad698abd0a74820d26eeae419cf5507a95cadde12b587b66178126095873bd7719d0f4986214105822cb822be451f866f8608be9ebf6c66963093985f0e60b6b65f38485f0fbdab08322d04db380b3b88eecb0496bf7457551df80830346517c307b67d0252e22542c2930dec1da4e536d7c803d1fdaf400fec2a3fae2c4e38fabf5f0d8f278a7e7c5f9df81447f0ccd9553ce32b7d56a4484bd782bf1bcbff2411c8277b3a043eccf4714c3dd2a3cf96ea55f9ed59fd994e99298d5e22368287fcd55068a65e583cc5033f891dde03637163cf31203658ce1437604d61950a2ed486a64a99ccb2e38640f178386ae33191e4ebbf753d2622914e8f7c8183feb68da87c546c329bf10c4adad1f22a069859635e6842128add6c3a0631ef8fed2d13b51387c9ced1320e6b0cb4607178e494b25c93fa34110b4b339d9d1ff5df5f8fa4fe7b98b9889c1cef2f08b3494a16badc164811678cd268bda3f380ac04735a3bee8b4d671558857eea0a69aaec01f4151a68e5faa3b9e162d47a4392da4d30a44b4bba92dc003df012a452d157053c3ccc8a669e44e65cfbce0c6d7a + +Input: 0cfa36fae999c6b1a2ad65b67a149621401f1bdd69412d269252be5feb17a42a60683e103e2b66de2dfa72ebc5ef72f9b1b74af1f8e0e6863a7b27d92300e45a5317826f670e4366999f6cd911af9f6a09a20e23db34d30231a96e0fe962967217823f6498598d6909acae11d4ab201a26616426d2818dcc86a49154fff5e1bb7fa733ccb300e8b9841195841a877adc77722b196eebd86f77c6dc9aabe4176a8f987bad20d9dd05a72630fc5411aa90a9796fcb587a112ea782606efe1f896611863bb6b413f0edbf5e352146c7c57f9f3714fb8172437bf720847d9106f72260e49cc50c25c9b3b88bc2597c1f33120d532396fad5ad5adabde8cc0f129f6a0a9b4defb56c4b922f53e4b76bd82d00eeac869d7af62794c659d510a4bf0e9a5ab01f7d9bfb30ed9ecd9577d56b2f27c3eb21b9c453399d54cd64962c8e10b7faa86d161b316795e1751a24c195b1a97dc327ce117cea1f1c07bc29d3072f66e021a1fbafb238e8b838586b386f3519e45ee3ce5e4c4b176b53703f964dce2cac85ba9fb580947b47af85ea89e91336a7eed173b990cba9bf753229fa6c8326dda46203 +SHA3-256: 4afbbba791ffc182e5d09a8cdf3f3712146b888b74243997c88896ae20244824 +SHA3-512: dcfe6234dfafd5c8df0f3fbe1e61c3c68e02733103aa3372a0503c3ec7eaa44ca452539a2dc84a5ea3855d25238551af70fb44a1b6d20575ba54c88fe765fb0f +SHAKE-128: c5d20bea850e301474da64b94d2f05eec0f9c5e322495731c588d8414a92e4565e8fdc7e1ee63737d871daf10e111f362d2429e171c8e23f8f5bf4f7280142d1894b46418acf25b1380af1010cad2328511896f4f2a68e7d0643dc70b04d3feb13eed857bb003ddb7d1ad24c36f1f13c975055092fcdf3cc00fd043789643688d2cae534d157af1c3810d57e392d617ac530ec18d025253b817b78f4eb9baf859ed427184ce0f0379955a0bc07e4ff9d1c44b7a130c4ec37a43c0484a30c5c5e977ed315667cf8da119432398497756da5618e257f5f816413fc48c07b755d378999d7b7177bff80500cc70025e4d7ea0bc24a7caa31c8d7ff864c219cbc79a3cf652a86bd91f54a8a021af057ee1ae859cd67ecb08f8df0b1b12077aff14ee716272b0ecc8931d3c4e8bb7e55f79c741779c38751c846ff7cdd4b2b761d830d4dc8e0d4e37936647ebe44cfcc1ae90b53421a0b68e8545003e045cbd07732e9790a90d2deebd4c2b77633cda8bf3a568dd9d79bec46dfcf857b01045072bf82a1cc2a40593bee9251191583abc79e644daa3809dafbf90c36b2706dc34b512c59435809852c3ec44669457b4d5640c10adcd4068770cfc71d63ee68a1b8273f99c72a4cfdb2f5db4fcd47d25da46c80a0c40f34682e0324cb5772315c38d20b621adb23090d2b33582c4ada8cf4434e0635648b079613753d4868153fc314bb +SHAKE-256: 3458e94784777d96d124270d80289091eda36f05d550d0629405f88e6cd2285604a2f4584802d7bb9f5394ac6c0756a91f1126dcc02581a3bb6d38f1871f5e7ce835a123ba715ba9c74e76df0a6553970dbffa2129aca71e660ae5d0252b1b313b444dcb142bcc93077f9c66fbc0db9c6fe3b2adb155fffefb328abaf5bb487ed81ba6bc8942b70d40335a0d218f84ad204d239712ea9117cbaa9d69ae82d5849b7392843cce19c0bb76af4de276072ad476c6201c40634f9c9958668a939c11f3da19ab025f5cbeb32a7481b31742d78840b9c446521c8e0d5056ee38700843c647b287c509f3b439be1863858520b54bc19a7e63a840f892c2a11097bbc0c670fe47c9670249b35d71f6f5ec912bd4ec97efa0184d74e3c8b03a520c1353889b62c16377d0f0a1b845000f310bd501cd2bcad6db9e5474bb283a916a1ce771c32c1b7fe5c2cae272f98ff172a61009a7bd9ea1f30f5d4e2ef17341bf3ab4b2e161f73a3350de45cbd11a7f4c1307ddf7b3eb5c17c73570bb308ffb46a7784a854a33e9794a06521bb13897e83c168472356674bfef974755e0fced417012afee215ec3be12229e8732446f3e12439ad4648adba74519ae01cbe057ce9fbae0476cb3bb8ef913fff6e261fd5c09c744641096085241d52b330ac94ca757fe72713944f47338a25a288ec4bf00c9cf15801b0e8bcbec0da68ddcc655efd4668e + +Input: c43f520822ab87a54f2517e5db9e68dcb3a5e5007ca78fb6504fe98ef0e920a0a304571278c7624a81255f1210a7e3290884ec9c7dade4c502654bf721a5e10bdcf9be9ada5ea077128129e37d4d870bcd19808340c9bfb88a7b29247e7684585b62f50ff76e3a5b15de5fd57696120cc5b81c25020b2e5972bae29c8ba9a26cdce3d2835d8cb16d09ff73c1f0f20ce82ee7c222f2d6ba9891c3cc062ae110ecf796e2771902c692f4f1afd93d3423d72dc503bd28b1d6b9cd143537a0a4de86be389038502395179d9a706e35b15579465576a7f5b30dc4bc2f8d0ac75e5b82146eea01003dae4850eafd7284078c36fe1365bc7b5f3d71e97e10dcf493745e8b78547535122a9b9ecc7918c822e62476aa84eab6fef203e6dbbe61b1fdc07112d62a01b8b24842e414a080ca7abf7bdeb50b04a42ccb39562d57ff19629832b2bf3e72d74c45122de7a640e6d08b6ef7703fc05466320b547569b0109ad950bacf69fde2b600bd7c71a693b00ce16091e7aaa6287b9e51b12c1a8057da5b76fe01f40226d23219031e18bcd3bf8fcb4b39ad75026fdb7cb186dd1910dc7d28bfc9bd1d2a +SHA3-256: 6e16dbf8b15d67da697114dca2b6f97c116edbb2c0e985be9ad2b9e3d6f00494 +SHA3-512: 89e3bfdd95b46cd5d67461d7e1108df41ce7fe96eef08d800d2f64df48296ce200694b91f640d4236572ef5e63298667948e4ef7d46912a2c5f2cac5cb4d965b +SHAKE-128: 0c3ac08518a14a12dcbc3969dfe14bf2425f8f16235b3d38d5edc2f72e9a6c32f70467d6da172cf5fd0269d5a0393c6fb625ea2896cc60becb21b7e38b8ad2ca14b1149d7defc7e4e60625be6adbced3ef33e9f7e84fc7c3ef9f8fc9608a1379d21405b3f3305f13221f175f26f6df977c078d5ad215d4714d6b35a1c73308578973d291c8e619af12663511c0fd708d374ac6534b82cdfe188bba303ffa231b9f9793371b15b833f167b8f93d8977240456b2afe159576a19fe5a43c83ed798ebefae338f1faa7c3c9bb80dcd5eb1291c85a900d44b59befdca580347f9ab1e6097fb6316e084a22a77d71fae60202a6b8bae6ef5dbad640cf9c9bbc87365f68a3e529a6dc13cff56674cff0c37105123a6f3f23d5a9d307a9c5ae871895659d2bf877dd86099fa2bdf6a6d25f12d2a575c97f268decac6622b81a48bf0fb9ce0248061cb61dca3a784807720ae10c1e6c316771b2cfec7db6372814a0c37d9837773d8524156c259f8c1644593214c6989eece5de1403b63b9039717c872fe0a8db17ba6b2581e0bac110c72cbaee53011bfc5fa7dd6b3ced0565736bd9bf0a734790cfe7f7d47766c4842ed129e57134cfffb188a1702ecad627cfd804ed9a8f195e4be7411361d747054de2c4f61a37dea7bf0ffb60f552ff4ba3d7f983161716c1cd617e922cebdf4a96a6994311b7f8b9edddf579194b5d325def71128 +SHAKE-256: ba163ca09a10ec8387298f8528803e43495b2cb3ce8c4ff9237792d97b1e2ab05a111936022be2cfa0b489bde68bfdf1d9b1df03f963602be77df4974e6420f914a0536510cc1d796c9bdd3cb16649c9f4846e1197f77275fe71bd138cce3abd76c76d183d3eaa9e75bf354a828e82bf0502a2b80a0cdd1691911eb3ba28c62bbe4d236243cde1cb6fc3b51950b68a35f7d9b8704acc6323151ffb9d8caf2e71dfdef3e66580d29b9fe07f4cfe289eecae45dbf3bec49ee17eb3dcc67be63fa19b0f0638feaa5ad2eaafd89657270fb08de9adc136eacefa2143af9855bd22296d230862d28cd6e3a2c4669bfe71e5470e39cdd493ea530e9b839cd505d97b3e0d8b1c9d04c9c216189366595fc949881eedc7952983d16d619c6839ed08075f904642598e9efb55bd915562d45c415c2174528a5f3b304becda752d09eb598ff3504749296f71b57ab89e291c84ca06e7d3e699714bc6182d3cd30d009c8e6488c937e6994abb51fcc338d74cd96020481540315531142e3ce306362f12f787139ac3be2efefb25a81de16b500b298ded2fdc3a44cf1255537433296e7a684360abcb81db4afab90a2fe779215cc600235fd430245ad07e6cad71b5ffb70657a925ae0b76b56d35094ef631b8feabad41b1e4d280719d4cecae6f62a4b2c4a16d9492110727ab637e8134cd3907ca9b3ee430b3616064a7e9d13709dfca5833 + +Input: 44f4551dc63fdc076a1d6bde17ba40ac91146fbce81952d451837019183fdf5e01abae7677ec03e2357d5d1523d2941651f2911b8b91dd580e0f599c7c6a9c00681cddf714157b04338a90a0a8de87bcc30b4643d6c39e42e2356ec18d181d7d6516a11108cc682799552e7b3f230117cc5e0867f2ebf43b64acc48e31157f53ddfc58c1bf35340f0d5e7cf23ea61f53ed0cff4dc626a42bb9aa9ffb53635c21a04b588312b309d20a5d5d22909cc7a7bdbca030fb70781d80d03466791db1c1571ddf44a61b63ad0b091267e8f721cb232efc3d581442ca41d952504dd149d6ba507600747b90a0387c722d793cabc16be6dd3fba8036b7e54bf303f0d68fd1b1396acbc2c06e237c0ff6d3041c7b4fd6df1b8f930a70f837a0f7e389d025577f515db0a8a2a8ba8d5636539324ac823d9ad5af68012a0980376c298412ee4017318af9d4dfc5d212d718ddc6b88ade6ffc85e9e9b2d5983f9934d419e9b057e1bc3260099392f00639f802f5a285a7267bb1c7ec356814121cacdb21343f538a2454cf0617e2b38709def8d7f7f7d098b7f50fdaeb842bc1372bdd8551db65c3256179dc05 +SHA3-256: 7de3302e7ede529e874ff916b62f49f5180fc3254ebeb4fc0721bfd24b79951e +SHA3-512: 66d12b130527f05859ee256a582d373d0bde28af93069b763e6fd1cb1b512d4fe3834b3f4d0f92f06a9afd757d421615acf546e938c6068a972a878e40b880c9 +SHAKE-128: eaa733a8820d87f297293a88a9e0fd7564146ffd750948ff5cbd89b7a98bd48b3d53074fc47739a7bad78c2365a6cbcc62357173bd2b3b54b0ce3659d20f123c8009d928c84eb9cd3e7672979dde3ed956670de3a31793ba8af0a143decfc924f4a9d8f293081be593abffe53701982ac5dcfdd3e4f639d6193532da879f88088e86a65bbcd492deb8954b05eb140bb1b1bd02f70bdb29e3d0f8af55165609e8b431a75f266731a6ca990e48616dc1eeb48ae2811426397cac99ec9bf2ea76c5cce2dcac0f6283f77810b0f690b9785fec55419dde20f06e25cd0913c7bbd734d21b57f1df1c660bb555c8d713810ea5e1a12c61d82922b9fcd5b43fa67ff43acf5f0f6d33c119da097b5fcd7324a3c7de6c46a170c484cb29dcfeb53c9c48da8448c19f5ec577923edc0e55874f5d67ad70a3408cbb48c09c6fc865966520acd6499feefeff4fa94c86459a227bdd39694d14392ab7a54fc2b42e345d723724cdf0e289f8223e69ef9eaff8645af4788312605d6a7a94d0f863d97bd06815289e4c1cc36ba5f2b6996c93a3593acb8d60f757891f850fe674a3d4caf1280bdb2c764e8b37868c9e75a12f474adb8a0d8cb601a04a2c2b588ab678c05b82d39dd62a9db4f1ec5a9e9fbaa613a100da47d6deb984bbe451d83b906d647fea81267948ad972cdb85dcac26f9f7a79f1f43838f47c8fbab0e03e70e3bfc919150be +SHAKE-256: 35fa173d7b2d4547c3b1f768f42f336b4b24be3e616d774dccbaa09ba49aaeeebae23f44d3e8c5532991ad8855846ec7b32adbc5a503d06c8a6e0a311528bbe6e4d8fca7f99e2773d8fabd5154c5ebff1f829287a253adc2c8bd766548ed38ce396e3052222f192e61dfa06210145d67fefd8b259f79484d6ad4098d6a74fc16010b2cd6ac3ba88efcd82cdbe21b86527dde79dc836deaba94a9ea30d74db94d359bac8082a59d900d2a7d5785fc01c26fcdc37505973f181bfff933ef5e78a5e7c9785ec832cf5f198bdc1dbfde5cb02cdb68c0f31d0b7a05cc93411fe075ccc84313ee1c03acc001f533f590cc190b72e737e8c01e2acd7a2b0156f0df5f246e0eaa4f16c7fd1bc2042c2c204b7831d5eac8a043301de21c6e9cfc40d876c299c1bd1f5a5a8f8834c0712ea9a395ace6b75b7f4b2483cc744c7dc159c0d1a691d70072a2e5a0733dd6d7fde7477d182147588d5a574313ef075bc29c1a320307652ece6b7967a1a41abc42887d87a40dacc68dbc8a9b20ccecd1785c9bc175d5d7cde6bcccba0c51931a32041c49333120d1f4352f5a1a301226fdfbd0987346ac32241e82106ad272c1fa6a02afd4fb30f9a54f311bcc9b87f5516741adc8d1d80267c4a89e05761cbab8d5697cd0e22a78c3be1ad869cebac27dd821fd72f786aefd7efd5b1bf5c1af22f5f05f4b10a4f7ed653809529c060f41a5cdba68 + +Input: 354b48f32d73667f253909bbff35cd20eb3c6a2f6a3709212ab9c0a2ec49fb423b9175283b4cffd1d836ef20a63faea00103dc7f18b116efd4c49f5834dacd81882341684074728267535a675a6415a536a05376cc278677aa438286ed0ace57c4d5d646741537bfb2f376a0b327080cda767dca1a30464c4d81fff416fb7e4ecb625ffc95ea1c2f592725253a872f3c84e5880705e78ce0ce40635566363c03f99e9b01b31bad4791a1c6573bd0dbf12e23271d2b70ad6c1951415bebb24de93814751b3c5a0069aab1a442dd201f1b983a99917b5ceb9d0c97896c0400a1c548e2dbc8ac63c2f401a2b6688a76b1cb6a563f32270c93334d6bdd50312443afa70846042784a401651c549d1398478c0704c6e6b72f8662a5ed38e65d03253c339113dc429c182f8c15bc83c54318c273b7019a25cf0b1eb9251d31092cede1f8dee316a8710ced8be21f37f1bf7b2b5616bc96a1a07cdf5d931f06b47c017217c5596eaa2374d3eb3f3bbe77b5b4e1259ca025575d612d90dc81f6cd128a1502790284ff21e6ef5acebce822961369b7a7a55b6a61cd75336e3d99f80c3b8220e385465cfbe8 +SHA3-256: 9e957b526f12da94e773f67533798a52b25938dbbdd38b8c2bc85c2aaee28991 +SHA3-512: c9cb6899f2ee9193dd89ed856d8488e95082ce9ecc20ec40b16c019ea0c69de83cad7a4b079459d5f3b3463470094aad76afd6b73a1e4d1b50d48828726c7d9f +SHAKE-128: 24014841c302eb1aa4f4b8f7386a0d66b62506df18edb7fc6170348b6491ac88ee60a9dd957c05e538fa947f7d1ecb09983843729be68086af94f4c8be1c12d08433cbc5a767e822fc236b06c70110306e38919046a5356a0a2092c045913082bb692896da625659f265c5da91ea4595d244a95fee0bb8ab24887db39fb845893d7a39c2a23d9631ebf44eb02b861fa263fe2f9f452770f177195e90633f78799fa2edb3a4ca6546e7ad14f8211e7c524cc2f6d3b7a3f0e4f55708f5f3a9ac943d80f26825da5d2dfacbed1bbe61ea662b55242ef36be18a823a5581e54b24049a55b1a2f17cdf91c74141f84923e6ea7b884b02c348569c461389f9eba1bd78d9d487ac429968ef8a7ee7a86f17beb6ddd2c6feee03bff5b0f2a21bdeff33c875ef38471b44fdd9a34b73f93d2983d10dad5f3b57581534ddc1b7e7850b3e9be653f099eb8a216e530cbde318a5a3f36d8524d02a8aa8d33a2e31d5da795481cf3c668c5b76886209bd9fbd021378a7d0b66ed6d97c1679fba6b9def8bcbd194e4fc798cb1c665e87cc7bd2fc1d48df6b7820766ea730976c063b4bf43eefd26831dfbcb117f7bdd1afa7222c72e748014f8d05a75197c41582edec03b467c252492cb071c278c019050b43b48a329ab63e0e06fdaa5bb4fcaec63bb06bcfd3d48b22b9538cdc15ca543722a204ad13e226e80305a435ef9db8423082b4258d +SHAKE-256: ef1776a55335888a90c93226a41ed99743ce812c2615ae439c1a299b1d8143bcc984b45990c7ecccccc45b5b6ac1ee978833d6fedad9f1ab7d5ed7abcf72eb078c571646d803bf467dbbaa775d080328e79804e0adcf5ad621de4e8c35b1b20852dd39f56e0de5bd7fb7732696bae4fe2a660ca4477684bdd21634573fb6ee59e37b1703df5b23fddaf9b535d0f8c8ec1688c514e47dc83fafc9ab81882833edd9ca13aadb2dac2ea2d2c4fb8745e4928eddade1e1372db3639bd183d47865153277c70b102c1453f69e8aa5c9a906f52a27e220abb152700578d31b583c5f9d98abc867c9cd8938dbbfc3984f390d4ffdefb01cd920f3e6d5357d9cdc4d462918ba0c2ee94cc07929a56ce71595aee3008ae1edd6f4c98b27ed54930febfab292d58a4db7b6653d7ee5e541dc7e4d9732a05c895f895a5e2316855e36b6f0854817f2bdce7b6d83aa114054516ac49e52d9c3f1ffc53d63184675134c01d498f193479c3b334c2dd8d52c2f1a02659b778a531646ef01d78373477a6cab883559bab262046497dc9706465b8edd992e496cdca9f788184337b16da85dd25a9e1b16063463915289d7322c2728f99c276353548da0eb062bad21cc692a1451fa16d99ce03564f5eb2c69050e6c3f59246fce019c57e54e1572962215ea3e51a04bb8f4965c1f4da15b3930bb51e12d0bb83763982b9178cf861cb1e6fcc499e0 + +Input: 5c8a2f14262524075398ea143b7fbe4d1970cf5ffca912e4cd10b4b1859a66f93701fdc2982238a451f121a1bdb8fd83cabdf242e9030d2730b19428b194b6505ff255029063764ef746af5e658554a906586b9500da95313ea39edf1a77d594c88cb76f81f871421efa018ad43c2192b348dadba73be803bce1b993c6e49f13f428c1a30000225ba0442a57e67ef57c7ec6302b55d7863667ebc71269c890c0fdd305c68156b3e7d47e669118262e58abd9da7e2ecf9fb0156fdf0f0bcb38b043ef751b598bb4766fb5b32edca7393dacb78b4f58a2d10e9ceadb80b589be66eb12359f8481e3f7860bb1b56edd26ac0411fb5b8bbf26ae630706b5b851b35df22b5847a9dc79346224ca64cc568a61ad8a56791899848169efebbb3adf51d6874715da4739a7caed1101696ed2911a871e92105da3b5e97a4fc5ab76085a997b7bd44dc5bb832133952980bfb7e0407c4a0bd249e8c1b0c2e1dace1303e3a9465296d054187614b9cb729312a56f8206d832bc74223d6824a26bbc710a70b8dc4fb57af530dd3c16b6200f3e402adb45a6161cc0370f0315cc5e2e7c2753e1f69884676a65bd8f +SHA3-256: 3065f947ec1582653b36acbda534a62e06254c18122f4f976a1c8b8647ae84fb +SHA3-512: 0f6932287b85df833d7afabaeb10fce24c02b6899ac0e4190e12743135580fa9e40c6b9c1e3cbb123762ffba78871c5778eccbf8f08d2289318090dbed013624 +SHAKE-128: 299000aff5bbcdb24b3ada77e32de9a88748966fac85c971b4d7f51a6d3645f8495e4eea9bb2a4ebcb0cdf9bedccfadf0ff6c52e6d5cf9d75408526e8557517f532fb51e1b906a2a80642e47e60ee862482f14ed426c20ea9352521f49c6df81f2662bfc98f7f969acf0a0915147a4555b2db2e756a91bc25d2d6e5c536ef8990cade7af4996ff617df43499c5ec5e287ef8636549bd66b14a5a162d436f978ec150fc8f9a40ec12cf92a38b0e065c611a28ddbb8cb635fae07238e90e7a3a7a56f2c4a9a53f0975ec01642074d0ed4864593eccfdaaf371e70bc1f2a4acc6bbc0b480704c7d16bbd7ab7fcee3ab6b461c9e73e2c720139a4411688685ce6a2333aae453701e5d007e34fd7d2e0b8f2eb511fe2d3bc3ec60ed9c691172cde3b82c1d9d8ebac70b13b1f372784380edeb7ec9f3e22b5ee5d9b683368909e07a214f2b4670b6359c8d33f547e039c3e28e3208b2879f6427537d4d1e3d052ccccf9f82228f068619b840bcc44d8d385fdf483fb45a8159f13446d74ff4fda4681fd4f8dfa0c166c0a0d6d0c67c8202e38c85903dc0591cbd7989e7a5396379772f271e2cf75e8f320cc29b058a2cc2d010cda7e89eb89ef5a568c3e655a6a192c099d5b8274f28888270c7ef255178a9979af61d8650396151c74e37615e9a6e65209561b519d3f39dd06551098a9547f9a17e1fb1cdb1137c2febb98cea8dd92d +SHAKE-256: fc2f48467e634022b2a9c0bec100328efb92fff7ee18b8bfc25fce6cdf8935bc4020562e0763ba31a8414452d0a691b589dd2431cde60e30bae070aae6783fc3f7200c78fb4015d01ccdcbd5a10780fea8680b127605f0ba7d4c81e86eec20c010536429232f81c443b5c87575f5c2f4b2a20d87f0693ae6eec60256ad51769d9b91cb3a281dccd09db1cdd8768ac0df997687d45dcb8b8cceab2b4c2262255e43d46403fe7332bb9eda695134dee92b8b9116f35b0a9da251361516dd3d3e69a9681224223fba585d55d3f9d228f1718e3fe112002337725a2663aa3a9a63b49ac52247ff235f04ba32286be13ab2574caa7bdeffa699014d72f38b7bd9cc02c5f79276006f0617ceb6e8674d01c9022d25071ca4f02a4cbdfe30821f68c516eb2daa0256811e57a9df9799221a07cfa1c040f39112b8cdb48a7d0596c0b3909370a8146f95a8d4ba4cd22179357e9e6fe94bbc7c4cd29db286bd0f9dd82af491a234f8816fa7cd9e68e3b7e2bf525b6cdfbd7e651380c22cf2d4616b0baeda283502bc622a4962b2f47b15699f6c517f213f0f99a4566cabf63e5850458e13b25b40cb42688b6a2357293c80e552cb8ddba6686e965b79d2b2935447648b6a9e8d3ad6b7f15fd9f8f2d247df8fd3d822edf3c1743f04b7d8cea638d0a42241a1f1effe9d2ec53e31ba032298da0b5232020b95bbe25fafafd9db04ad912d1b + +Input: 89c80913c88a49213f5289e3d62145846237847f80b451d6c0827030820c8ae12321e9327af53a67e6ea74ce5d16700fe764bac7388aa0d7bf75e4da97309f3d75958c1075a5761c9da6b52494deddee12ef14306fbc61fdef716ee3738f8ee217ed9cd24bb160c3f336cd7c107f59480ad4acd79d1bdea407254de5c86579f4b8421c3f47d6b78e2e6a42e3aa6736923df757ea5ee3252eb78bd20fb43a2833d8689aa2f8f6a01074c2b3ac585f9adfb769679dca94691052dfa5ae8433519f6453d1ed64264a0683f5ebe3e3bb3a0c7fd5e6af2f4a628ba8b07a993e004e038453cc1f6db6bcbfee73feb56da9e8b412844bf63c108af1fb0d7998da45082eb802f76953eb56cf1dfd4a3b011718ea326946079ee933b34f73038eb41831e065f8dd084685ed07b4015c6a9f0e003610aeb396cc1cdaa1e02e1b6c634980567a19241c676b50d5e0d207eac23bad586d63122b985bb638a3e6fcec319c5a73abd4245fc88c537b446ee532df0a3c2a9ea218646eecd0edb48fe5fe8d19f508de275244964e5e995e62d941ad26f5ad8b8f43c8b3729e25a7d89383558f89a33cfb0f874cf33cde70 +SHA3-256: 7d5df8d8a47ee90d5292bbef5ab0ae9eef1c8cfbca900730085abdc5d80a23c1 +SHA3-512: c924f7d2e2369e2c06a899232ecde93d79af57bd5069c5f611aa8c85b0fb9be61890d41ad634fcc11fcff1eceb270e22363872b4913e49c8eb19f8f0fd1f5b28 +SHAKE-128: 12e040c9e52e643d8522ea9f3aa9629fe90e98bf179bfb90b62b8245b3c5967b4a27a72586037dc36cb0915dfae3285bce2184cf8349e3542c7e853358e11ae78ad9e8ef8506fab0f33684cda340da1c17163609968ef57edf40213bd4d993706ff2890b7ee7c6e527a7949ff8233ac271c8e439b16e639b2e9213ad3d1c7e5dd06f40b11222d519dd99e9ad398ffbe787a0eb207ce8e96d40d29358aecc9940726eeaeb16dc6208f713c8d4c0df2faae04c1950d82306d274ccc055a033e41745b569fcbd54f5fca9531c955d269961607c5d83afdff3c085a2443adedb0443f52e128c705153d6179eb440a886d59d6453ff5b0cdb7aac9047d00f70aa8ca8a3de9e69d92e82601d849d57f42d8cae07590b7be47a6563ba803ccd2dc14e0a1f468d8502eff5f7fbad81a09f918d3294a63a7786a5244732231ac631c95ecd4c7ea759ade5aa2113535f87b96eedb37f46d25f9c963c65f7160d5b4780d602741ffb904a0ab874bec1b85ce5e05505e95e7e7651a93f72c4eacfed251ea5d166f9cde88ed061a70b72b36d4f61271a08c3166f7c0a64a5073fa23cedd79c92695036e468ff50281cdb7661b25f8e65105930616b5a68f514ddbbc34423c330410ad8fdc739c1f381bdd96e782571b017d63ff0044e3cd971cdf3eab577bf0849334944201949d2adb48f913a8f11b9cc5afea54b7187c7bea2a0459f17cbd4 +SHAKE-256: 3de8ed18b7c353ed4a2ded25673257829c3e71720f2364c8a73c19e96dc86322cd6adea19c092d65c63a8da6205ae695dabc29a622f48c5fa89d8b70c6812c1b9cc612cf8c2f1cee80893ab2b9347d713a242d13dcf958c6b809d6ffacf8c7aa6b28f7ca158b9197df969e82fde88a9be38796b58f4d49c7e8a1b6b1e53c15278cc08ceedc681f7ee0d1e06302c1c53d7f590777b81ade9f35de189d9d04fdcd876ae92f6616821bbb3b52898b262390f29b136639d88b993e51a20e49534081721d5aacebb13dd6cd0a1a6bb3fb3f2045b7472601bd1035ef245cc6d8172d31738272d9405f4cd33c136da97cda8baee54df25696a8ab2636f32313f9dff3395b58ef524d5d0e411231959577d00ba58e00579681269b283ce4dbb624532d103243781e9004dab956303cdac60a6544ece128ca0ad5a213735c351efe0c87e07dceb41edbdf451c5ebe283403dcb267d6f7b784fcb3d7c21ab8c501d6f46ef97431e4139820fea354737bf51c95dfa71ac70cfcad901c980b91eb12d891c8410d1e58d363439a43f7553baf30e39a76bdb06a70bb4c59c98c03666652f13d4e3545160749f43ac836f5c94b67ef61478ddea6fd8c835af0ff1171ed4348e9a040d74d8e9a7d25e5d2127d656d2ae5a5b8b5c353a6f28e7b7d4bee7bd6aa05c3e3aaf973159f7264b0b7d4f47528ddd38b9c6ae05703c4c81a86ab6f29b4dab3 + +Input: 5a0dba9fdf3100e85d36bba331998a60babd4d82f143b8fd56230668215b4634a99b53c67f1e92288499ca9347177ef7f37d5b62f100aa7abad76cb1dbcaab11479829a73fcb99343a04ba1ba0e496e3748903fec7bf19d7541740720406b1c7b8121685a19d291606fc547fb5f7d18868e11635147071ad35a81d57ce06a5a2b81ab92822cf13efcc24764a2025bcc767bd3dc8d202f07bb1f4ef2a318155d286bb0f7ad2a457cecf322d605ded739806ab0d2a1760ba0565631bec92dfbf61348f55727cdfa778def2660772b9f9fbfc91356e9ef942adcf13ae0d6f4a9f3913089cde7db5b55a6dcd7c9010592db7973b764967d1c039ad90244592f1388576dd8cab6389aa468ee46ac2afecd35ec3e1717a51ebc2730c0829b5b68474ceb6a650dc063f200b29b35d68dff5645113d82a01faf82540dd9fd1aae68ce542b5d0ba6e53d7f82a42fb2b7760eeab6a5c473cfa35f4fddbfe18c2ce560829c5b5ac0de9dfe5d4aac01d218c8887183bfe0e9e091db8496e2b66658741d02cfad2b6df5f1cea4c0f974478349c3f0be6ba07c6f07c2c3a5cb3691cf246e19f285741ac470c20df56749a +SHA3-256: af9b698b84926b7704c9e92f914e3b97cf41a719d62d52fbf557cedea6283e1d +SHA3-512: 15436abcd8e668b73edcd56fee1f4da5a9976e85831bbcc9ad8883eccaa913b06ea02b2ee73072b5059fac062a596c85a17ff45ee57dcaf8092a88cab0497fff +SHAKE-128: e45388c924e13d8c2b89cbf6b3fd12e352dc5fe59ae24132e56a50aceaad4b2638adcf48b4138ba113d6894473e8cb983f90a7bac70a0d31d4213335e80cee15a41a8a6ecdac3054719a2e273e90b6306c76a8ee7f76f55e89eaf368a64bc5a231ee01e70a35788591eb355ba66bf1ae2ced2292a58de60efedcc68c16aab2bc112f34a7a9298594c189d25c10cbf6550bb58d64055d05aa57b506b46d50dde7e5c8f1b8797940d4050a720a3fc41fd03789b76b0f9662e95ad77d49aabc134fd7c187ce129d3543a680f8937a04e185bf599aa6cb35f66f8ab8ac7f3e21a3a38c246529e50af65fef76865e110967c21e18ff5761d4d98ac6d771fd9c15d67fc66c83abd9b63e9c9617a8bec15501c31c9d587250c70f4200f1e0b5fc2b7fb379d3ad5cf85e068d54bfd816c56418daa952ab7b0631ad097ad20e940f6ab2204721b18edfb192ad43d73c91ba72185e8b058d43acc3c6b78a0fb1ccc9a39354a96a1aea43e81ad2c70e10c1df1b88df6c2b6f69acb27a0744233195df1652fc81cba76c80c84f2dc66cc1888452f902ab730904a87e8581753b78105823a686a81176ac0fab5898ce99cf9192c4f7af1958e9dd70d659f31b046d2721f6b3fc9b99ff990c4f4ddd2e8f8d69f3bb746c1804a761d8957c8db56166d7bc2fd5b96c3aaff2955c14be81f56300a8f13c8a92c58d0acdcaa1326f6ff63956463351 +SHAKE-256: ffba04f89d1d0aa4cc5ceb95135cdf885ffceeb6bb4b7d5f93bdaff851d7369db750d1162555f59fc8d97799dc3a051a6eea6bd4d77b41785f37dc268c1a4527fa622a5ce758436819a3925a39652c6bc6cb7761d7f57b2bdf3e3d56db1e52207095c509125ce17cba2b5bc48b2f853ff8395b5df0a50923c507da886cf5ac05719e6c6d51097185d3ec3360aecaf173f0965207fa969fa4016f0c39f35f2462652287b4d0b517d473a386a1fee56d2a31d37a444238aed88eba4d8a9ae2e056811122498e60b3061c132954a176d1ebfb342015453f1d2b6b0a3576731aaa27642b1819a391588e9016561c08b1a27f59c3c951484292cddfca9ca7ec3810ce2daff43325044ad172d675d3263597f6c80dc4f3971928befd40bcbdb7b0c9f91e9798e7aad5af5916c58ee898174facb870d1b4bea6ba2d80aa1d5dde3e110f4a7fca4305fac5ee43fc5a7c5682d6b013c8159e364241523d01717d896fd9cfb8cd46f50d42dfe662ce86055b1ec9d64f6b71df59297977b8c5d83c8699ccd542a7c919afaf6df01417c9694ca52a15862db185bf7009f5d6e7eb9301a075545baae2e4ad5670047e4b4aaeb6056f00f08b6dbc15ba8a4aafaaa55ac8116234cecfd4785185e88babbf8d1fcbe84f952aa8a0495d011a4e8daddc23d635f1220f180002d41d63d635cb013eb9ed3382698a65b2cb3c009353133b8a6bb4bd37 + +Input: d8bab2e9f53bcd4364ce17e304ff93aaac343696e1e4acffcfaeeef6bb15921beeec489be47ec6c6742fe30c70b76d807da97f5c3151be9fd12789b721c8bed05c509d2ff9edaff67c5686318f6931c81e99a9c4ae3deca14285acf11af75312f14518e0f82dfdb8ccbed2a5809390c7b94fba3b6d6383cee702b752f4e811c0165a160e856b1458b67346ab44b71533426e88c1ab2a45e1e8002499c2e092bd9a7ff6ac6887216d8c061a1ef898264cd0eec46bd2e91f0dbebfa2fed254f2f1a39079353d4b02765131f764b3e02d4672a00287f04909d762f0a8e95b1bd6a25f6dc628c0628ec9524868c643e973471e21dc1b0519a926faacd060e56b630ac97be03afe1555155479dc8e31353a73751a8a274cabb7dc079798d4e49f79e23696a4c39842b5be9635e0acfb5cfd70ae09bf2a587ee6866cbdefebd36c54871f597e5d9e02a3639baba06e34ce02aabcdaf83858f308bbe92eaa2d469c4f81a2453221a728f2f77b020287dbbdaf4c95e57220af7058b548fd275d384e6a6c76ad258591e670154fa3003b454016463656997832b628229fd73b4bfb4c56ebb5af3711431f372f742cdb +SHA3-256: ba24cf1c46972822e1e8886ee87a8cf62f3d26314d43b412c3c759fc44c3190e +SHA3-512: 4a91ab97d4ff35b53dc42d8a5140f72548f6c45ef7e7d1df787af5f5176838ab1ff3f4e389bec99bb57348a7b945b326aae1914bf30dadace641df2735e7b2a3 +SHAKE-128: 4c5585b63a5ca3019c8b5556339cac8e7402d617fcc9e459edc9e5dbb48e582d6afb9d7000674818cff94e8c3bcd0c824b1e7167537274c6b96fd8f0cd67ff687d7fc3ac99db3b4d59e0d88514a49597a36c81376596c0b072bd25122d91907eb066823495cf0cf0fbb420edd55f490ef94ab9bbe0460296421ce2da179d5e45bbc51dff7fc4d826ec5c942a622a0e82aafe2ac8bf4cad4e4a355764f688c972ceb79468f288151fc5382672195bcd48e3400b16118ddd137c263ffd503b658afe32a71a8b2052b2bfa2b15fd5ae36fbd552b3691d4529e89723191126fc74735a979e14032a42cb26333951f3e0fcb405a15db656790d9aa74bee907201a4719f26956740ae889e808dd3c6d02f5ced3f4a9ce1546ae5f8ed6b5340921f41cde7f2234d635826c14b8617c0ca239eee241555120ebc11902eac8dfcfca2dfcfa0ec328d407afa3b3a6ac16ff472c6571796a8e14d1133bf77aa3f9aba20f0e4be26be1006ac4c6ff5eff00f1ef438412d0d0908dbefac4767579f3b25cdc565ee71bf766a9367a8676a696fab13216e0a75dad1effb45151f3aacde6749db420fa08b441f7b91c3fc1875e0fd23425f6c2aad01a086f7d7a7d6899f2700da8151803315eb29bd3ae86b330934415689c5b24911a01ea8ae94f8b44dfa2508b14a3e697e24dfda2cb290e5b655ed12b7f3cdc9652d988519afd49c417f470ebf +SHAKE-256: 099824826a71d14430e6312abb787a210abcb38ebf3d6e98184c82834bce862fa69559fca5c11d5627e84f9c7762609cb9e98132eb828bd514a564d8ebec8c99f89f9b4a4ba78db967fb44a35be514ad11e0df2cc2f217e3a493c347ce2556a65d77cfe7ecec8330e0e83cf252fe30bce19da1d636596fc80e3735f162e49e2442250677a8d94be272b2c722ba4e88a9549ee6033e92da9643eeee50c38231228acb99b3bc3ef56f2b181451ff089b8202cf8211686cadd649a166d4f606fe9d25feb9f098fd885cbfc66aa65ab6b8f1374368f43cd37bb66879c65851acd30dbb5b6aa5935a2ed4fd3d5f8531220de8bc9d13c2448314273dac0c4e23333024e265b29f4d9bfaf50576e8dfefa667a156c6557345a418351b0156b5d92f70be0367cf459115901a30cbd663a42a19b9e24423ecf9da36f4cbd2b246bce56ce286d8de8a4901f4e26dc4bee6b1a2d4b9d6529f0c7f5c15d963d9bee8d22155922b3c90ded69883a038fd5067b8c9aa42c5fb8dc6100f33f7ef0a229ffc925a7e8b2bf75e80398793168acf0d57c5dd5fc1a2cba5a0aec63de8421857cc5bf94c7435b2937add60eb751e3bdac86015eb48ebfbe99922447574eea8c2b5c3f4d7ddb7df461f4fb92312e1f2dfe232e047c2bcf159e6e471a1b2a0867463e121effae07e28d4cd64b1e0bced4b727a9ca07944ca704f9de009f5d8d7c1a909efcf + +Input: 11c79b87032c20cd7f3da817b74b67092215884f681f117a3ac67fd20efee642986ea8db9f738c5e3f37d8b86f6f572c7cd9e9286b5c44908569d4d28746746abed61c119eb741c727cb8e7dea2745d646bb81eaa732f5f8e52b3ee58b921342e260df3437162dee31ba9eee39ee540aba185172d0581b0c4a85819f0bfff6f306607ecd3ef2d013f0ac4e81b9da5ef12e45fde08f9ed8d0003a4cd1be0fa25550804f35e1db218ebc5396e32f9cfe1aac115abd19864a2a2c03cfb16740dc83c91107c2bf4a7999f00414b5fa585a6e9b2080d69f59877872d77d426d3271f2c9d5d924f17b7b01feafaf574f42c00cda69822794ba6d285a50fd2c022ab7eb0c63a4bab21417de5d6b3c5916fbc14f746608a03ebf112bc7b728a9e8f8f284c7ce84864d59b1afba11b67fc4cc3337566917f0c38cfc7d5bbfd2cc01d2761723bc118407e8f2696c320a6b714374d22b5fdf355717f5ad5f44d28a287617c0418789912cb9ff6667b4052c32cab61f0b2b5a5848fe731d5120f6578a19ead99c8d2b5bac2defbeb8ef8aa0bf2a625a25ba7f0cb5c892752cc02c196ce648d57e205a0b4e83dba29956169c +SHA3-256: 46f61e0c3fb514f2ffa27c02e90d6f217ac778d1cd0a75753fd0a5f38157ed82 +SHA3-512: b76fbe28d4432ef367b9a8eb89a4c2aa6d34ebd09660f6ec8c92d1b844567329b71c13887047e688efea82d6e9c54377b0a0890db67f12f14b1b9dce165b7ff9 +SHAKE-128: 99206001d54279a2e911a83bbf32bcac933f62792a2a790d1b87b3475249d42ebc4e43d25e8995207f229bef6e2d26a18e9fdf671b62adf8edeb20c3e65c4247ef8d3cd093336741c5955ae0ef098203128870453cfbd5b5324224d50dfb2b379c8d8c4e4f364b5cf80e4c839a36e09461e70050621359667cadc5e035dd691e7f5a94ee1f5ceb994e8727547f5dd6776dba8d1bbe5ae2271e2334bfc1bfeb4f69dffeb2fd0e59cca0ebe40ceb409ebd63ce87212ea09908b934a92326ae1d88dfcc517bacf277ff999ce470c9cc42b0de9f81308df63973bfac35ec0ad3f288ff00714592543c2ac91e637591e07b56b080de67e3cda882a113ce9f60e6f0451cad63a8397cb299fa2c669b561f7650fe18e5b19afbec54b2c8b6aa9389cbb170baa533e712a9b01ea4f59b41c95082361cdab5f776542154ab545a781b9d14fe879be376533325d1c091b433c23b76ca21dadbb4f8adeac0bbd1fc59faa2624a3bf039880d971d16c091c28c6d09ac419c97951fd6892498287a4c32048bbd188f955873ff1eab07613ed041d60782995759fd5d03c95d8c15a633f3b488e1b554057d54fba9f8c418fe898a84c5b135c501fa6521f317ce65ffa1b54bfdec9cc2d0d0600f050ce593726ef6c96d90a38db4559945a0423a615e6f44b21c645f4eb1e1f7f709f3fea9e4d2bcd1e7034b5cc15aec2931a61eda7b4ccbc4fe60 +SHAKE-256: ad3a7249942329ca43dafab636fee31329aadf277a86210a58d2d0c2c991bef9e7294b4b50cf129482faf5d97a1c508c2e291879125e25e4862707f6320103300b30b171a0b6bed9f124ba9aab188b186f02a77469b46ed0277fed513331ff0107d92db83330a2f8505e824316b842c948ca4fba6510e9072e4569f0fe77bf234fe60e8202df85f41b925b9f98adb4a9600193d0d81fe0222bd9cf65ea7dedcea0df2b9fd5203eecac9578481614d48e297b9e4f371ffd153b11dccb3254cee91677fcc42fdc4373e0201414342be7f8f5018a1697490a3333df6c52200bfec5f3471a0b8bfc5a777e4682e4e8fc4965ef78fe42c86bb563014ece248b805452a0a570fd972cb03bb65d93d6f43021f42180a07049afc21e449af6afc5d6539d0e4c6b3e54abfcdc4abd7827f09037c2ff09f6aa19374cfb88a54090a8cb93bb46a8b395233520ebe1fa655731cbe9f334446734adc29ec762f2989f500085a3fbec5a4ca27c3b097d7e576a1eb6d22c36a69f98cc81c338db2d11c8ca16f276d0fb20aff7ca066e9172eba8e3b13ffe8c1f22802bc5e5c234228e25a780288db5d897c665bc62154cf6511f7ed0091228f9404bec1e49cd83c78fa0f051238fa67dd89a812d1caea71fb20161d63afc7f9019ef123818da33921ee53695b254f240277d1adf6ed89c1074a5d1b581d6eb684dcc0517c8294ef3346ae8dcffc4 + +Input: 5483f59fe603c8a309c9db96ddbdd5b782ae878036a09c50afba4091cfb3e4174f547868f5c0339ae0eb6590470ab07bcca5277c8d6a9b8ac63fe616c322827b75fd8b6180b21274c3a8580f1dd826ea746999fbe37940ab39bee5c3c8f7c9a1565163ef2cff32d3112c004e22bd960b8e3c74cabf7b82ccb3f8068a163511fd4db5758c3ccc546d206de924e885c4d27f75efbc55e34bb89e4805b42cda2afaf80c0b6f0eb2a97bbd78a399d4f5c528aef2ebe2566a36d369c5732476f8b051b28755cb76671625bb3090880a31dd26a9f431ea4839eec3d13b974b9119eacaea7f7fe464f7228db452e2664a3919a6a7d4eccb73900190b77d11dd816a31ae56da367309f606745d4303c135f868af5f77e0dd955f1d66a8d17ee865483bc4b832e68af892a8168eb2e2cbb3f7d369be4dd992e8608842ac895306e830e6fe68019a60bf22a6876e35098a628ea210d752e67cadc360955a4c21965326a5458c01623eb60dda8192bb5752a437edaaf049da567d4c378f342755c3116f0fa4bcdbae9d9f6e1c1d063a7ea41e0c8f4b084f9805a507c541487bb672faf461a446964f40801f473fca133658c7 +SHA3-256: 46d72950c6e5563a5d7e7e80cac515b464e96508a1b392bbd572ebdcb0dfa301 +SHA3-512: 447604c5a058c93b71cf5d714a34813335e0ff2be6236927328c825fd42d1d5611ab8905d839b2aa27fcc788035797ce80f50234331d4a86df2ba807ade68afb +SHAKE-128: fd5ae52623cd254721a6e1ad38b4e0ca84774f0d19869c361ea68f4c6eb8e1e915cec793facb4791b2d59ad6d79ec49b831ad33dd5c894f344be2b0ecfa78966021e008e4cb858ae3a72467dbcafb19fb3243fc47031f57f72569238a8c0bf9ca583accb2c44ef892e33717d9607c690214e222de04adef490d05e6ab948fd2732be828056d77b6275c74a46ddeb05a023933b387863b7f2002ce7c1e69cb0e123c9d34314bbf87a0c6e6c49eb4b385ea93bc1c2c1024b6ab50a2985661ba6381257ab9ec0d0802eeba83582aa7271d09063260d9e06a3043f1cc319ef7c3d07455852c629cc1feb197afab8fefb458b79045d0165cd231795816655ed1a9bf2f6684d191ef389cbd729314955d7447c4c4355213b21cf075ed992f9afca765c47f6dba333085d48084268ca144640ca7b3b00e540966936e52a0845f4063ac739f5feb1463b3e14eefb62e882f708b2532175ad5ab64ff9c8bf9b4b941ef57a8e9dab350db8e59f6a67592228210fd3f2ab57156091d7a4f294a74738c356fff49df7ab4bc8ebd0506a64fb4b1794421376cdbff6e75ba216e5d41777471501a13aa425891a708e27f1b8b9318a0f2ddd3b9718d548d727aab9ba4e143ac451426bd968fe7e84f4a73f6c469cef0ba4c74fc19b27f965e8080fa6f1c681f8f8073da572e42730c32cefb4d9664c823836349666589e9f3b228598c45ba93eb4 +SHAKE-256: 51dbf26ee171b9fac8a762ea8371362b599ea851849e0bb3dd6140a43842c2fae6869944be86f4f21982e08ba04cef730da705cd920662bf81c39f61a8cfc6f570dc01756b3bf4f131780bd847d9cf63e461bc5b7ef1aaae4821813897da55e4fbf38b1d3433f22429a8b08ca39933821e105a6fe9ece4ced6ae3576a14b1915f3825a932b18cd3657048816744bd8a9bfd3de4e903e97614a3518f1d480903a9894ea9e41055790621b144631f185fde79dcaaa382ccd31bf88f36430d9a7a2d7b2e358c9d3e74e97c870c06eca058e0b3e654d2207a2778de2c373f024a336ef2f798d25d7408b3843c861b8be1e3290419efcb3e5c02b3c3ecbdb00dc7f7171638490ae3b59b8b024ec96ace522b6f236c7f2aef6b02445ff09422b7075a29425b5c5ff3dc5dfb2ee951daf6a8b6a18eae8c95a3ca3f24304aa6719e24eaf17c558a90fb2141b2f76ec9fc6deab914e6a8b6bea73cca420c96fb0f59e6dea89408a7c6fc87a3639082ad0ab075df67a22fbf681c16c6209c0d26e0b9ac249a043ba15b9af2c8b04c81cc70f4d793b044fbe2fc87cb2ac56e9128e5d718c167a5fb784d82ed883e1c6f7b52b0356c84c9c7aa48930ab74497b40915efeda37a8de37b1d741649e3fd0e5f5301f26221ac8a83efa12aedf0f6f74e097662343f1a4728bfd4f730a154fecd3baea2c9bbfdb1d2ec43238263a8c3445ecd56aa5 + +Input: 311f729d490d2d2a1301551e2004f61084e3c8cad08d57fd80408603ce6772ee1f89303079baaf36b6be884be33501d57266c63fb556967e989e6c496b27f1a93d0e85540adc16ab85c552b73e4e14c51d081807e8763849b3f61011991965e6b46e0aa644a8d3e131b724954d72a0a3e9eeaaf6e34790c48175e597b7689d8255ad030d9a2567e10c1e896f93d5329975515f49ecd288f4ca84a88b2833ba07206d08272e42285fba5149a13582f392870f11d254a515b6af13ca17664036523525084c26acbd59dafe8324c12b3ca4ffa722af9de00ef08a2ac1b8707a778bd768379798b1233e14e50473fb0a6fc37e8379597330812355d0a9b8dbb43aa915cb3fa97d97e871987113277b36b9f6094db893015dda8eff8b2470e82913e52a82c769f84872f9737e59231270bcdf55ac8d84ebd9157966971bc91a9a0e2b5d1b9b6b3380b2c50440b1a627a8b2914e76fcbed0cf73687ba0a85029e4cb1ebeac4c1a22aa4c3c31835436b73d87eb8b8a34d4f919f4831230a6bdc93db5fade4ad066aa3f413faf58215cc51a1c56525efe4031cb7f77c29616660a36e1f4bf28d7d9395d6d4dc839e09cbda9 +SHA3-256: 2ad16246e73b208c52726f78a621a137a26bf994c5e85f9acaed209bd6fe29da +SHA3-512: efcf452757b25af2af7c5d078a6ee4c5f9153df85a3659511ee0b298b940de4694705b585de505011ef1f285b4b3bd6bdc828efd0298694abb9e4c676cb79821 +SHAKE-128: 0f95dbb3bf82ea2b1e9d651a4eb888f4260ba9ab8040bf7fc9723407e0231684dea0ce263f6cc5cffd826f08bc2c3eacef4a13b7ee4b0654645352136be9553e73473f3f8292f74309693fbca1f8dde8833d9528125f40da5dde47367b972d6a7b71efd95d415c926ddc0dce2433d054fbbc2088cbd58e3f335760b562a269505dd043789addefcc8fe7048a9e890f20f5a2eca48241563475bf63535c01ae54b4cad00e7dd4640157c834089f8110ffc13ba41bfda600e9ae9bf879588d7d2217c35645781d8fed66719d604080aca9c08e693a2eaf37f349aa7def8bfa4c9c21320235cbf19872d7f9bbb97905487fe2713e3b2871cdc26bf67900261fa83f0fd21cea450155fd125614b0675cec3c50f07bd714ea64ff9e18fc564954cd14ecf5bf136b17b3813a32f88c064a22ad9f14203723c3d029af1265c7295a1807d7322e70e883eacfd3726b555fa87e8aa41ed570a818a8570473ab3d12a26ebb18b9eab20f8f3283f20b69d60b9f8c2eb817e73a6ca7a65fbcd63ec4e83c02ac386392a94e84fce80fa7940e030d2736fc160ae9463e86f562820d003075b32be9a74f6dbe8228819223217d9fc5965d1ce4f979647219ddcace0f244378b8ccc3d200836aaefc7a32895f763c6a106321ca6b55e66b5c05acd8c5cbbf310de9f99b73746a9cc9c41de4ab9496e24007a234a495755b04e130fe568db9289bfd +SHAKE-256: fcf8f7a9363387f9132262031c42d0937b21c574943927da732ec62623687c6efde62e1ffce359a27403385930b3761951e4bdf34905108c16145c3f9ec868d42a5e0ff438d26392e43b435ff286608c3b003bcf2c181babedc206d2239cd018b322c43860af3fb09cc136e0f460e1d7a9f95b3f4a0e0500fd005e8b3ce5c3b349ad0f0877815e8a8c9822685c489c3fd72e708000d737ea80cb213d5080c5403bec71393bc26423984612c6c0b7d4ad9038f5a89f839bbca2a15509d7be42fd7c3de3f5b60fbc7cf122b5e2a9bceced23630d543346d882b6fffad68efc9dbccba48ab87dc0ae1ac50075ca71dae039b39d9773aae6979320705e4418ba761d471b5c2cbc0ff00f0540cf3bd62256897da29a6454c1aab67aa5e845d02e7915e755f442dcd125a48ec6813639648cbbd993fb39a45f663bd8986d6917b59b6a8773c5510e76ac353ce8c6d62abc25674752aab11a68e0fa5f8df29d6372ac50776a2ca6259a423c3fbea61e303ff9a34391bab1c2417f1c3b215b0d0cf70fdc1ecc3ca4079c6e01a6863ce07668df53fa4c5d8e5bdfd020a39622e76bfe36f053e5c4df3f293e6fa423d102ea05fd4bdd7f8941ee4433cf0d2116f585e9fe27351b49ac49c3c3d34c7e139215a213981d06ba4b52c128a121ecae8531913f77a996a8fda1475a4dc5bc3aa514e3a7710341fcf4f1e70cc7a466192648d23475 + +Input: 6e10ae04b1539b6dceaa726e36637b772d993f8ba06de646913106c086ec436ccb8e353fb8e7f0dc31124c8e938e4075216c5fc3da4f7bbd77804bfac1d36c478b759a37070b8c48bfa7d1bf38f493e4c32b9c710357f1411eacab7afd66474fb7a3f70c13e8c53f2cbd04ff35b5bbf11a7e2c1884b7a74cef2c45f23a2ed47d8b5c71170e22537022d334c1acfc6a0c1e1158174776706cf874e118903eb445c4a680bbd40ec789b7dc6f74be6c2353f695cdb2ff23b07f55fd8b1fec265ff48d179adb52ef83fae6545e2d67370e9106a8147cdb14b0fd4cd75de794c5fefaa5a9b56087d3b69dcc706a53ab931c924faec3cf78f2a44c0739317e3638139e7679edc84e9adde4a779893cf577a33d370b8a48d07b1837b59f5fb83815451ce2d139de4f9fadc82ab82d8b997c9104361cf3ba7ebb8e001de40eeae35035f36d813b978581b6404f6e3ca6d282b407fe6761f570d8167f6311deec586722bb4d9fef66ee146b092d4c1c74fa37c6221c7839109fc10033ab4c00a1be8518973fcf5cc274336330139121c4fb386f343b00337864088ac5ef3220125394345bc90c4957688085aa8295893dbf1986 +SHA3-256: e29f57c73fc4d589acaec784664ea420dac6f881097c0e6cb45ad365a2ef4734 +SHA3-512: 6c19bf7aaffc9a6f28c305acbb827736b688f65dc407c830d2fc5d66d7b88ce70b6416408ae797bf4c1896dfdbc3614a37ecb27d0467cdd15ff4a31da607db71 +SHAKE-128: 1ca1b3440309fa17cc879fbb89b609dc8fa95bf0fe7f1968f91d7f7d2c36661bb8e5aeb2126169dcea1411e0cf052ea47db60cbdd68a1c76e14e58cda263399228aab409e71ce0bd4740e19a6fc7fdd336cd19c8b7e2a818ade1532a4f32dad85f680cd06c8feb1a47c30ffc83c48798848b5940341eeabf20567ac3f405568e6ea2dcbafc17a60268f906f2d0180d9aa4baa4f346726ae53d08032fac2b1e2ef40f76dd040481c83ef88dde8cb03a650498b93a6fbfb8360a385089c3528929a3d8df4df1424f49f386f179ac3a0d7b926b5a9f9c490b7b9070335d507aa77406728905c7f4a9edaeae90e8a0b27a885e727b3f05c1dd31934911a24b4923ec8d9d17d4a7369fe88b8712544fee0777a72a02e99136cdfe8e652eab772f49a0cef2abc9a3845ef39890146337fa3c644ea8a1e758e6a7a7a168f64860b38f6e93126f33abd46b4197cd41defc203c69e8a2cf078227cc1d3f229d747442b30e9598da06ee281c8f1c88751dec0897b9c15bf9f8578d3d73925eebdfe1275849326f63ab68466fb4b3b4a0c7bfe0118638bdd05da217a78bdb3636e8609e6e395e3ab2d63f575d24885884039c4b1699dea3d7afb317676b3f71ed06adbe30847e4fe5efd29d5888986e82f020e7c252cb8c887c8b80b01c487028eee83a0521112a4440fd6cefd071fbbb5939a6be73b45c9e6504c28fb6cd78df9fbaa3a298 +SHAKE-256: 4feefd54e510007102ec356043d442aed1704ee12402f29ad2cf653c2f1f1d92ee32e31c8db9ef73fc21eb3f0c0bc25727e0c7fdaf79fa051be3979dc12d0584e96c12bc222a6b6df4ff468e792f15d6701be48d0e8a1d1916183ff8d4c95ef4e5ce7852f22ea8e82e59c0964b1310d6e48548b5fb66df8211b31ed7c963bf5b03a86d04137e9272bad48696465c26af0e0a0324fcb5c8bf425d2a33db827ae7cd17554b01cd848b45fcda62e3b5f4ddda2abe20ad8d421cb9b2eb9154d937172f523e540fbda545228b47dcdbdf8d661066f674cdd8005a5dad917d2de0e27572c1b934da5cd36642739c84e2bd2e3ee54ac0a700df72bd1f8fe13158794c36d1762ff395a3ff83c1f64b95617fa0b0e4a66a0dc92679fc4023580d25f0e525c4bf4ee76a5712cd21c0a2b77500f5b423b0a0959e97fc7cc0ac3c71f1d3bf69895412f83547073248c2a601f890708075fb561276dc10d2388443fc2e1df7836a8252fcf10bd59ba692e5b9e39b9b53a812f78cb09b4cfe2dacea1e48ef7675c75c3ec64ab053209fb365ccac3593444b234633b3c6147fa27871bf0b3056af6fdb1c30e6551e4c0357408c49f8d7f02c3551e576b897761c120c8d24148f2c448350aeb504b834bbd08c05ee40d9003bc873d3a6f9ae28171ef098e4172b4e154b4982073c24aacde5b84b15e0144c1bf674b35eb897ea8ddd2f3da69aafba + +Input: 890817ec343f0b3675336ba8089083822d5767bbbeef6ab7905b3a910b582c03f64dbe36cdfadde5c20705fb1553687ac193e22f5cb953d47456fce75bbf8c0bc48f89b57a875eb69aed9abd676ada7be12a04d169e96e75fd3defee9528dc000edae4c99e1f1f2d122222563cdf3f9c17fa61d455cd6afca6afc80a35a7569c677fee4becfbdc1c8a4b627421857b05d5d9d647367d533582373f5d6bb1d7f625f342fb6f2649bac416a4e5686d0b0e3e6273b3bed5d21322007517fd890c4f27947d4ad53b64e884e9b17f5b69fbc92b3af06f949c0de27ffaa63a27d349916e4f9d85761756c86986aa02f8a72f55ad0ad833b517471af562c1fb393ab7a1e84aa7354dcbe55d93c43b72aa3c5bb484e5aaa789ea71c5cb77fe1de0e53c0e50ae64339aaf68056b0c7d86e263a5c2874dde7f1fb69f278537a18f121ce9d5e2fc6c548635229ed62d22b09cb02c19a38931533ff0958077134125b8a85b452f0046b239aa95872f9bea0ed05010ca72a6782e911a7f87f5b6f3993914156220699ca8262b024b3a0c8a3de59c6accae895e9f79b4c518c22c22b22f1ee35f6594a1972fa76a5fa31dfbde28314c1f +SHA3-256: 2a92f178990c4d600d414f3c0b9c9ca1701c4bdc106e54e7006913e8ecca8106 +SHA3-512: 470f2c86ed49a7400257f7482aae0ba1b2be238e79b18d809d41fa0d8730cb2aff01720d1e971bdf6b9fbc489e005df8e50a3e6134b368c93e7b64d1fc8ba7d7 +SHAKE-128: 051a637a633f36e5d219447f55f1ea0522658a26a968be5889adc0d936e560748e86e8c0b45e4aed240fe152b85dd1e28b52ffbcf3ee177c89cca8c15fa9b381e95538b26be54d92bf148b6fb07d54bc551022664c701ab78cbfb42c916f3c7f06ade83bb7b85c0f53987ec5c44b8912d0997814d8316fac2e0593cc53bafebe4f798171d488159002a455b85adda65ca3a83fbe6b9d3f173a100669ee4d9ddd47ce8cedc940faad1fed6ffa18e011502f5f6dd517f4648f4016c1956889d4faf3b46d58dd51717316fae114541fd534bda877b222cf9e55eddfa89b80afa709c6d85c071963e257e6a6fcb8dfaf54ce3c775330b9ad8b129c63e802896a498e5c01bce8b2f71a9bda5fd8c915494bcde4a612e3428a045dfd57647dbdad12c7ac8aadde673c4b43b75eda8ad27ae954b2524f475dbe520a08a696c48f2ca24c769aabdbe3525cc99a38049da3c8ae230203d564701354219da356a844ee9b0bda9c90ba9ee7ae26066acc7134d5b8afcea4ad0458f4bce739f451cacdb18bf8a306c3045f3bf268981db5f4deef42770f58ad20699f53bb043bd222c8d3b484d61e4ea3bd8b6297edd36dfb7fc5e3d0fdfa115a5fd52c4041179adc5fc6d75eb63cc0c8b4b33f984b1d0f72accabb7d3a1595cc86087f9d1636b8dd3edec1a22432f81d99858810892e739e76cf477c7fef889d96c60cf953f3b1d00f5f2583 +SHAKE-256: ebaa5415440491f02d5a8b055e1c7914f9d091c6178ab00979e544c5cc69500a8bdf3fb582e9caa1cc1e50173838283384272bf8a65d770318a7f6b12a08d3464e9951ecf3ab7a5d62bbec6ad7176c8cf8f18325da3a9f3b89139413b640a58cb793936fe2578a98b51d1f75520a81185c0b42c7ceab32e0cce63c8bd4e7c9953a9ca0c384efac3a219acf1cde839c29dd90eb67cf7b251c9af897b525990b6cbf6a7d7e76f8fb46c20ffbc9efdc9b5e149e78b871aedfb31bb633b7489b31972365d7fc4a32e1f0b5c50fe11039e0833f445efc1a05c9651677672d35df9bb240a9a27656f04de652540d1051bddd7b19a58d128c16c14fd76f38be3130a2680262bb9cabf8daa3c54dc0cbce905f2cb72a9ba009d6e1c86a09ed613bf9990a9439d1146c988aeec4bd614a66024ade5b865ec59f47717233bf9c0712d7f2ab8e2efe3a8b59e4987e05b31ab7e75a135096e0306c3f46eacd114f38b4c694bb64b6f860bd3749e5ab5aebdbe14d0e7c0ad4f0e152006c5e2dfc48483a13515488e4c462abf8949e5ece3d0ec983ecff798e8ff29a78bdbccb5fdb90060d20608f2c8a51dc7469485201cae1e9c2175d9471c704553e0d3b6d3d11e6ee281731d85851e8b110f4cf67f43be731a13999392f3ce206406f250d39eb5ebee8c4b363b6eaaeb1f67ca512a988ce736f47e3b9c888c8ea5cfe73ee88d9aab32bacec + +Input: 325fc965eede4b0c81171f6418f5dc2f9264f6bb4d2a84800abb21d30e454d2372e5d3cd65daca73dc115d1ca06c2fa96f7fb70399aaeea6f70cefbfcffa16227116fd0677d7d8f0851871ab0eb820d4075f1b7c5c11b1e7584a4a7840af3af00b3ddfc25a43410266237ecb05930f295b7165a576a5a1f726875f22e88c96d272844bb63ca117a4fdaf1528ed93066e66bea38ef207285eaf1bbab01f02e842b2231b8f12ab139cdd2fd1f98af698b936fca5d7cd622f8eace4ad276b47a2620caa8c6a8726202c9923ccdffa27cff3d4a1f8d3425d727a5160ae3b1076f694ac683477e841b737c14fc4759b3f3fdd13b2f4c22632d79e598a44093b0d434ed97fd810764fb26672ab24402def8b49b035cf0e0b6b059451ae4c330ca54aa7e8070a6b196cec620577f4eb6707635a0fe0373b36a25c4a53702438879408c90ac34622e74677041eed7418e904d7dd6d709e14400e660b459f75c1a1b1c3e1fdcd4955d2fdf676ddb8131085165b94e2ae4a9bd0707495deffcb2116ca3f8e54969f8361b51122926077a6230ecf69c02e28a25aba96bbb43accdc92549d09b9b42c849f4af85e526d50968eecc16aa8 +SHA3-256: 7eb14d40ae231c9535b0205caa479140d126b9efe6e85a31a7f78ee015d12052 +SHA3-512: 340de0b738b6bfa44f1405745c5b686318f13cfa39f7d50eca45b0ef636d46f57b96a162567d9b026ce4fd35f631ed0cc3742b702044854049e8066c4bfe362b +SHAKE-128: 45315b0a7518ea8e35e79b6453abad02c731bb3ea27e2d508cd7cd4a604c37345e18842280a26fc328e7af89464686b133167691eda3bea6cfb9d1e639e0ff46087d12b0b6ef2816f909b8f52ecb22018ae70bfef7b4782487cb187e46699555eaac43a2aa2e1c0f50cb515a7524d1116fa98df741b1a6dd741fbafe116052f7998bc77018dc18ed16eaef5fa0fa95caf9b399f36d12fd592c8d125029d57e3f2920ae91b8165484d4d7ff76ba874833896af7973338db93201ff5cad2d623ee8c739ac2a5a39598c7b49cd347e491b203911ebc3948d351239e0d122787d5507ef5d5df33b49a7b39fc2ffcab20d860e4aaba9b3bcd6e78818cda1b073f641f1b4b8417d5506c10bfa2304f38059a32da330a5d902da1f8b365cf50ea54b740b1fb60dee60da0af2c1be06a1665125ffe227be6fdba3b818db1f36a6a43970bb17d3482184dec43b26277bfe4cae980d6afc5c3f754f17b510d5e570876cb7009c13630faa9967a8b6edfb9cdf537fc65d2a5c0f20f42dc0f157bb94492268e13dae8be28de6a01bede3edff3c6662e4495aeca3158e9912607bba5feb39267a1689435ae9a20ec914b76eac50b91c62de7cdf236fbe9643e78ee17ab130f2b7ba88a0ab2550a086d2b4457b51ba0da1929370bdc17ff8deeed17afdc7779fcb0319dce077ef52e14d875d1ed20fe1440e4d50572dc05401d0b65f180aae5b5 +SHAKE-256: 64d8011e69a13f5be2841050b63ffc3263a39ef7f896d79965e1b201a6f3b172760dc23d644ce822a0dd3e3a1a5dd6ddcdb5278d2923416640b3502e46545fc643c50cbb37a0d8ccbd93667fc093bfeccf04e42aa183e3d26c99a8a97ae8787dd07884a327baa49fe59ed93797ade9eb9de3a5823183a33c50de24188c90914efd654598798279b615d6319607a247bde4c9dbf1842e7eeec429cb3f534aa8a0ddcfc21fb32d4c5356de361a38ccb3bfd37902064d5d0626d37abe11a50ed56bb0ba1e77fe0483582a96bf816ceffc62989fae306c0dda7bd3bb5b6f83725a4c27a871a7dcd2257c5af5dadac6ad125f915c166e75f8ba469d1aedbb72ee3a49fd33dbadfeb40e124e1745d5cec8c2af94fc1902164648ccf8a2add8f672d222ea0d3d35580d919918bcfe5a8738ba820557efd754688c4bd342fa4a4f920b62b8deae395edec3173660cc2ccf9b5003312fdf4244585a68ba152de1c421c39319ec28c1c735d3009b10cf07812744f4582fb2cdf1c7349156e617a11be74672f6fb80c47387d88b70fe3c94e3016222a2d27aafa6cb80d8db90701b17d48a1b0fc6abc6230fadfe1d0bb23c1fef1de23453b73d2429761da2a70b5e784b4bbad30769e8559f5d265f542853285733e33a88831237f728bcc776afd30c97d3a1055a525c771d85682d1cd3c696449693d1d3792a404c3c213e87cea9ca969098 + +Input: 53da1f33b72ad028900877332f0512f80be8e7cf565557e2de58be31bf976143a00028069fd437db4f402013ccb9ce7e9157ac8f39509e0b27fed3ade62088e188bc26af0a75ad0bf99937d6bd8f68631d011fd956c8512a41e512bdde86329903ef9542a0cdf6de92d07a5abdbd5cbdee63ce5a63ab109535edcb3dd5890e92d3e44e79e94d1cd9c9328b0507f32c5503332b4816bacbb38e7d6acc7ba81215236597b9fe2652cd4d25820908621032213f4e68b88cb32e98e10fc4d243c0d57bd252caf12ededfd9a283c3fe84ed25638346fb0878090c35e29f807535fb4b74006262c586d98043fcfacce1515327585d3d071e76021846544cc54e1807580b1c1fa2c86692e34a04a74d169478b02464cd911d7fcb928e0cdf941785cce46dae566451687cf4c3a8a9e41d14a07861f51c552269162f959b22fbd6b32ec7cd10b0308167bd0c714c50bf7d2be0f1512a2c06a6697efb65435b2e939771d519c12a11b57622fe40a3f08bbb8fe176e56bb58d9e33f905b8aec2c65af5635da70ab54952d89bb9c993c1d6fa2b417ab7ce8cb700c94ad61fedec4a85f173f896db043fcb2abb8b8a911deb64e276c5c735 +SHA3-256: a05f5a917194140f132b32f9b3469cd80277fa919ccea96879486ba5ee91085b +SHA3-512: 8cc041d8129100c884e407453be22bb26f76fb40948d9a9db301ff1ad7d3be77a8998715cd76fc6545d5572962eb8305f8af3c0421175d23ddafeda7bb6cd3ae +SHAKE-128: 6e84a8bb06acbfafca75faabe11fff24c6070a0b82cd420c1d92fdd935a0f047b94e26648be69c632bdf3aa0d0f52f88e1eefa8199255ceb3b13d15a0fbaba74aaec8abe278950e7a72f9f482141798f003093ee648d58c464495519595407c67d9c198b974c55392493d217dfefe8337d5d4c2013f958b3521d13233fe11ac66e7a77bd81cc4f26cc6f4fe8473e3fb92d7fefd1faa20adaa4559ecca22f84a99ad97b68e9be3513257f47615a64aa6924f2401d051989eec4452a8add1d05ee1ba8a345358119f1570b210ffb453b9cf201b166e76843bd5677b146ca49405e8d8554cde1763a1d7f9d38caf9093880f940fccb1996465c648f63fcd4dd3c41e6a2fdfd69f86d3440d7da0229a9b6a61c7b0b4a329204a35813b37def776639e466fa7f63055dc61e9af53821953874122971ec62ffeab67f769718eecb24517473d0a17fb25cd98604bf6f708eb0a93ff4275328d97a65017b97d3b824399b7769e5fb10162c33983bbafebba282779e962205ae3ed57b892dfd0b66ee3b8ff47f404073b5bdad2e42a12f66860aa78db2bce8a18e34431cb23af0ce599b340cbd764b90af2df856072b9465ee26c9630bda052b0133160bc7d52308504022425fe08844a18e285d28e7622f4f121ad69214184d792a5789cd4d3bd20b55d6b26cb3c6a4d9e223f9ccc848379843474a67e65011334b70a4dd9569820b2994 +SHAKE-256: d0a79b4f8f2e670ffe564b4ec2eab465f70a8f9b0f8c721c1a55501442968d64fd79e2424c1d275eda288d90eb0115098bc57297dc38d7035ebc6e699dc33c3827682b8379e2e0ded3d7711384c17f07d7746efb21c81764acc6ce4bc9373374c01249c920677960be72a45b795fe22b7efaebe9608f8e161de62ba9187d6cd40c9645f01e3b85b12f6b4855e9b3ab0cf34af38ea7741ed389794c972cd2935caecc62d4802bb619aa629c3458f8d78c3f911497fb3dc6ab71831745c25ef2ce2e2c27492da7d8b1a8dd1ab5e580fbe1a07aacdd9e705e6555228a4988dab17b51843b849fb132a3256f5437b75f6e3d8ffa6be220586446a53b6aedd3cad131aaa1960331a034332465f7a02dc16b82dd61620fb4d02bd42f0f913e579fd57bfff1b089109067306d6e6d874ad44eeaf5bf72ed4eeafb235703b8386748363a89411d18e549ba39072fcc64151397f5dd0ad9e6518d9072d539aea79b4cd9af1f4a7050502149bb9091833d383e0eb0a254356308d0c7bef497dcae2b0dd9abe4590d480e3958bf976ebf877c4c4bcd10a609a705a00ed4fb0c64651c749fe0ccce0c487e420ffe19939facaeb24e303e595ac7a67a7938fbd47b1e554f5ded74ef5dd91f813a57385cabc8fa47eed53b4eedc8fa13daef08e11d8834d85a990129be5864dde91f04da38c25d3d58470a7bdea02ac0f6195e5e0983c367a3d5 + +Input: 004a5ebcfe6a71c234a240fb9c60144cb978168f95a34b4f9b5753d46a6e7953323621525d7854e1041690fd5a1a57ab5e430a6e608edf2f9b0ed6626468bd937249d7d79922db43a935af1bc850a038cb7ac44eec40f87708136f114646d78650133fb3a259bbd8ae2836059f7f750ce73b3de6f819d7f9f7cf945b9f791a96cb88f78c46c2c64e368f4f3518e8b5f0a801a909697cce8a57c4d337c33a99b1dc9628c743ef435fbd374da935a6706524e6c646f197d2d2487abc37f4534cd0797f94421cdbea6fac2470be362a30497e0bf11c3e2561347dc20ce7ed6e3707a048defd1ceb0ac1bfdb853bddf1f2b7c23c4ef4bd4ff3ddb0054fe64b573ddf5988329cfbc492326022a9df41c7c7ce7bc52a6bd859a2a96001677ab8dc35addc43bb2217bcb8d31fb7621bcf81edfd45627141f494ac6ae9e5328e57bf2af3c1ecf3ad77563ce4ebb46b6b7557e0e85418b441c94a891af67cc1fa7d28a59afcb5baf806eb38586b5eae7c5e6dbdea7fabc92cbfdf1a1b981d57b415541676c3ef54c261212e461845ec02c12253f7a1145706c89d08d80806358f6886bbfac89a3c3135b08f20998becb8acb220ec177201 +SHA3-256: ae875684cb784c3575bbfa9e01203dfabef996c66db5729061e86189385c6312 +SHA3-512: 92a50e4dd0eb994ba3fc0961d7d4d854e24446f2af7632dea049a39b3d144d412e258e4167803623680fa62b05950ffd5cd8eefc6a1ca84409c7e8bb154f0b91 +SHAKE-128: 7e6e968e35494e96b881901745f70d04ed9790f9d30aec498a9f3fd5c1b22fcf18099ca4feabef3bcf5dbbdda252a8af8dbe72aa0ea90d5e01b889867e4895ae2f0d958618ad531dc3da5e76d672b1d74d915c2e48b0b58d23f16b3e2f0609a2972ddd0af3796dbe5ef12b5d3cb215d48725fc658cfac56b9148a508dfbbabc601c06013074f389026e52afd7becf49fa2304b3cc818fae59df0b4b17de7330b217f137f84ffdb11c590dc417b0a2bc9faeee3146d436e3e06bd5565c636cad692d39c51f8b104d126e0220846e2904f4b293df93cf0d835e848d1f3d00bbe743401c19f6fec5c9611721304b8dff84e4b6a9c1ca3a8e75f4212bfe7263c9432729bc7e50dac8fa91aae038ef2e01063c8aacf23414876956aa7c09563542a66d80830dd560ae9a7051a66c3e8d3d9a3011157733ddb61eefc423a7a51c0f8066b0b02aa1e285908f1197b69ee6878d7eaed509063549f3a4efc532a1b53f5123418348c4d85f2a5319bc382d59a3225af9102b943a7b65082c70e6a194eace5abff0ff58350229b97c3a1a6e69caf67769bb2b9b29a7056d5147e3d440f396ef6941f0b4c308c43deadc1826061e78501d6eef28ae1fdf0ab9462c0c5e77d9d966c54cc70072d4a5d2d3f1fe3ac6cb74c4d852dee97fa013c7280066d39d840c8aba68365040643766aa7a5663bf41671d36d207ce74cd23b71dae234310a42 +SHAKE-256: 76357e53eb1a19edbd8a0ef55405ac50351168ff237fbd99c0887d15f4dee3ee21ee794bd5cb3edfcb33ebfd59e42c3ba86aaf00492d6563f50a94ece8d23c58a66eb69aab50337abaf7eab70d453f8c513a1a6c7006fb7ecc10cbc23c47f92a66043c512384e9d9547ac3431355cd62ce3b5dc1fbf00a89193e8d470ec6797456186f7072d7712e87a37ff4d56fc2098bf05ef1345f2527864c632379fc471877eac9d88e8b8be4d184b43fd34c39de01de99ab46fd466662eeb3af89d22b27c2e7254a5bf7271c57e8cda7dbf4e82aa8f196d021013eb25d0e00f04a4bc95a206b469877558972efeaf3bb23fda409205756f7c878d6c30c97fc5630aa8decce0b52f33caefb27780a2693234f5c70b3f903db53c974cbe21cb03df67bbccb39e773cad484fc7b7261be3c107ca1fa4eab64cfad80135707c2f5571c1dcc80bbc7df802cc2557d0155337457f851e1e9948161d738b322458c727fdbd5758fc3fedba1840a1b7789aef44209fcf8a1b96f9579aaeb34c8bf5299dbc85e635712a1df6e8b3010b1f67625813efe49c2da28e3f4c634e2fd92925d780caad0b3bc38124aa1f8ab6c2646efb6ef774c66bd8e47155c457921d5fc4e9d119c0315065e449273fe5cda8c8495f608d8e5a880e3b03f1488adba72a7a314bf749736d3e6ef2edbc793c63b16c574bde1736d2535f24acbcab5e8be65486aaddcf782 + +Input: 70692ec1adfaaaa9d1233a75464edb1835c26dac0fd2279724dd528945d80c0806f1d50dcdc2f761066a4ce19599cdf25ccf7aed12662a4c0613ed57dda5cfeb9cc12be86c233bb09b3ab5aee3374eae76b4de4824fa27924b9dbbdc025eefdcbeba5893c9d4ed62836cb6c8dd2c38278109f74c2f665895b485f3b5cc4673657210c44688e89360bb6ecbb341998214281f898ed65702b6f768cfd4b57aadff3b7f7ee548b7f72d8f878b61dc4efa5bb977ed08076a8d49d3ec0e26683e5789f95a7ef882f90c6b93e02fe5cec7a71dd9061998472888e3b68841ada4ec2e8bc60765cdacf3e2acbf4dcff2bfe505f0adb6f6f98320af17488579b54fc40d2664bca96e193d240a8efb99c189e18dc3806cf4add5b3cf29c31689c2d91bb98b8d5ce274db285ee99b36feb49bc350b00deeed5aceaffbf211a9b40e70333e61571b21b5d76eac5bec93ac3b51ad90de10bfbf8884ce6c21f6acd75a7d9de8bad028cda496a5cc94e136de32d1a66b5eaf2fdc2a3dfeb775569ddcaeffdcbf7ed201cf131550fcfbcf811918042ad827666beb4eaeb4722005140c3de4e8988fe24d429d6326adac8dd1cd6b614ed9de084a49bf +SHA3-256: f45cacd1f4e2b4a16f695e8f84f98415c9fc4d075a59d4a3301e9eda1fb11243 +SHA3-512: 50526d671c985252fd9a31db60b0ad496e0845a0024db1797aff00db53cbad30072732c14bc488dfeca4f29bb1b38d2df740370f2a69abb59a437048e8a3dd42 +SHAKE-128: 964b0be34277f268dea4554c573b5c7962404dbc1e02689b406ba22b8b7a947d9d9fd80da4e06ca625128dfa7acd1c26f05665fd5e40bca1758b3a332b643dd8218b0e2b3e19ed3cd768ed49cbc134090adfe874ed559a93cdd3a9cee42c8c4605df10f71ae4ee58c4e7e91aeca5ee6b41ad76c7eb74068cf2fe3eac82e85682e1e0396ec48389399ac6dc4aa60984f35b739f427a010282bf0de38c590b8a39f6603feeacfd6334e80efda7a8ca05456cb038c63f6a323ea04e3cfab621fc948c898116253888c9b97b39e63c5d88104eecd273eed1cf6641937a86926d7102fab775c706cdeb21bfe6fbda66e43e154816d53ad58dface799141c5d7d143f561f8f43bb8e41c19a806deff2272be65a75841218ffce79b4d0ff1c250c678cb017e367e037016c5cfca2ffe118e6ee0df3dae6bc816927f950f8956df14c038ebcd687313757d6a8adddf4438e3f02667cd391a12372591d1140aaeb95450a34d777bff276d80d748af96cdf84a55a6f4a69ec053317f69fddb5afec6286027495419e371a0c2c69357b2fdab6e9e8bc592f351143825a752276bcb237178b92b9b562a7efcb6275fb8421dd74ea43001b8392a464d37508b755529e8fc101851b8d7a57269c979ef70047e874b67b196110f253c18f10faa52edea796f5d3ef54ba664fa74230416d668789dddbd66b03b2d1b49b7d92b9278e77d825d8500 +SHAKE-256: 3174c2beedf485f0e7de3d4afa71c2ea92207dcd3b29c76626328fbf15a0c8ea0121a143c3b5d6edb12aba1c3af20f2ecdfd475c5e27e9b998b33e1fce1751c39df17a7d43eabbb230a51bef18c553ea70238616e1da15c5ee1cc8f21fb4f45b018d549f750c890ed5147e4a2b1f4c4d403ede330f86fa83bf0ea0fceff1c5abe56ca51d818381e6f4c631f449cf7fe3a73ad1e98d1d7453720e64ae4f0b9009a8ecd8520d8b3f07703ad83fd6bf681b43494c8b1bef85e131df76df174588f093ceeffde9b642955412c0f9fa59a7d4abd32aeffcf0d8779effd7835e2842393da0dd519f14d0d89e10ed8d098570cc6b0d90f04b4a90a1a18d5f07f70fc1e1166917806d493cf9178ad5f5800f919bf0d0fa5f986d477007bed3f68c018b48df819fb1fce1924b7f728e482234a0d679a8c3ef3eb2da7f6ee2784b477571bbbd14fd198145f1e9a29a120ad6dff8027395f8693b7d7a0b6b0eedb78808fb69d593b310054ee44b87eddc2c51501c5d97788d67baf137379f75c5b32fb97e20a44aaac66490c6fb83aea56cb8b815fe5b956b7012aa90cbf23768a839041c50e64d80f5b86011b8860b7ccfaa71c71126dbda5c946841807e498ad1007dea49a0145ade669195d3aaecdb04d741e55c990821caa362ed261f901b7485fcdccd5d3b552d1d52d9ee814eb443d9cf101c5bbc051d0c29dc433630e32de86fb041 + +Input: be261c10e37bf8ab2071e613db09d1c5dd1a4715169b89af024885b226c45ad6b731917d33cfa1119c553a3928e6d766db8145db612516ab8c61697a68bf3071178aca1355b2d4e3feafd5005674ba02c80b3fcd5fa4397e96db04e37e982690ccf4a944d29e0f72f130c5b4e9fe0c7ceb9a4bc119369792d49ccb75e2f821dc57801bc8da8d2a16bd09f0fca911bd7c39dc08b334384670031d568b80ae8002f27b3ca1eb99d8674ca01ed6289f037c3f57f67cf15cebf765ee6a2bcd1e702c26f2052ffcd681d693188cdcfbe951e29dc5530a2a1cd3344fbc6122d8a62a6a97dc0a1e57c76f0336b90c3cf17a60ce28aacce8810c37af1302e8d5aeb153adb65bdf4fcf930aedfc9482212bc7e20a6c5107897948cb777757668d8e1a6d06bb93102047320ddb29cff39c3f65ecca631630cce06e493d32d8c2a7976b08977e570838fb7309a8c0df6081781592b3588aaa6f25c9e4ccd8f62652af271514d0058cf93c2dd3e30c6f0dc6a8fd32acc669eeac9a8ae918144e282b10cefd7db1ceac539b2779f737ae2cf0da8a65a51c95a6560336444e7d43e9b22ef7b2d18b54bb91cb26b660f137bed1f369e0f5c08db62b14 +SHA3-256: c521790a233a269a553bcf72a94fd6dec012a6bde55d977660d302a4118a8ec8 +SHA3-512: de5701c82e392cf977dc580ab7bf0bcbf88f32f3397fcf0fec6f5b99abc4b4eafb33b2e1738c74e6d4322c3154ed286584c21839e65ab36c5ca2a01e22aeae94 +SHAKE-128: 7cae177adf11eabf6d460a5da6e4ec8a875f153bf8e74367d0085c13e7ca560db7d979e2852077a23ef526f20916ce1aa4bd10f18406e7c820ddb3b892551729e27d8ad47b2e86475cdcf798076bd6707d9b4df80f21cef6d1d0c61d36e7127b4b23f1c264f39fee2c2e3b828c94c04785e9a5744ce65a6670ae2c25dcdd258702c1eecd39a3d142f0c4e353f9df97a3d52d04c6a855a9b75ce8a73669cd017dc2590f6f3c630f86a20087bc5b1dee352f3ee2bc5159197451087bacf0a282ea211a337dbf5a9938577cb864d2a21b4c36b191fa36a63091cb0bfdc3967525ec5668d026400c331713ffbfac027a24d6472f7dc0e2008820c20f65c083aa2fc24658f9bfb57d865a6e7eb4fa8aff3d91e8544b219b0b4455382f34ceea089e9ee899b7ab301a02c1d5ac3efb2e7f3d4a2ba0639dc12e4e0362070753c6c5d6f71cc50a8dfe2ff6800eb8a9ec521e9faa191acd5ed6dd0bee129aaeee1797c3718292dc5fcb8a08d15030e83cf9b0f3d9c1d5ae6d7785a10c5bef64f2dbae674f0efea5cd107043198e8daa6634f5dc4482df34d00d259d09ffab0ad695a5347166059f7d643d5dc1467d9c3fbb8e77cf43d669d59129a1ffb88676a0f4c05303e2bc881efe65d4538c92395e24da69e1e6fa893d7389ca05c95763b5bf071f1e07f362846f00bc01e873e732945897d4652af835e33bb83dd2287af9b03d6562 +SHAKE-256: 8cb418f1b9ca1c8af122c9ea1ddfbc73881e384e2b4b3acb3d7dc9adcd7568bdf42a744add5a579eae523f109374eb55ed95193df22430591fa59e1faba2ea09c0c101dbcf1ad587dc71c82bfeaefd1f68093085978fcbfae52c9dc221d146496c8d9c08e06e485d879fa71ea535e8b7874f9b633859f8893e97235f9a83ca1f1336449c05477fb82f32c6d4defa811ce55c6b0b7f57c57c0122474f0c906a37488597390b208b5ad9f14296e6111090940ef0f2796d6d5c1cca86b83c1324989f4d22baf99d30f17fa19e795798660b8f70f54a9d7b5414c3cecc5ee9e6be9d7c78a5ed296627bc8e436658c7c0a3644dce286afc4b2f7c3e436fab862f101ec904f6784ffc4b8ea8c993ec53d245a57a7bb7bd633fb2217bf5dc6ed8ffe1b79bf2aaa7f7dcd2c1adcd8e007e34ef6420237941f07a9ba825b9b07ba3c4b47bcf8df1c270b35b9876a1233f55a06579dfda0ed3f7742eeb572cf9668e7898da202ee50869f26809e18fffc59673e11d901a918c0c09973baaec956f88436e566f1075d60264c1b0c247c9cef6b2842fd6c15e1bafbe390fa9e8d312343e9014854eb82ec7299cf5689d64b31de3fa18acc6090e011d8236176fa79da74a9078fe37538070c655c6b1c95b50edd4647054fb0320a63a6f820001ca05c89ee639251232ba1e207d3388780458f85b22cd9f4861c22a79a00d3202d6278b3c08d6 + +Input: 23ae66fdc58f09f355bc24ad89a041a9d88d3c2ac77496d18ec3b404690254012e7243da11328ff50b40d6a1cf84911797b67ee52de8ef306261092caf9f361e75c75043ac3dd429a040f9c21923d9bbb9281b5f8ca38cada35bd10bd1ec7d032a3a11d1a33a47c5eff3fd7fbd65b02a5f3a0572ef5df26185ace8a9a5714952b8653989154a692f0325b418baa08e6d617674ce14d9955a68625b63f9e4e0f75364a81b97fba0ebf738a65ed6c3847b9216a5e8dbd52418d9c568d7bfdbfbb3f2951199ecfb57dbd95b6669ab6ee92e448aeee48fadd3ea6a2ab5d1c4ec032299522c37f0cb493b8a1c72fe561af4961626d654c9ace39f1d89828ce783f62408c66a01ef069c8ca23830e0788b6d5065b082ae3784308e92b773cf8624188cba79424745cc5bc5e2c18b24f562dc7da40a1d3621e182b3e8b190004f78088e35faedb88791e7efe20255a1a3812080a66a6f6937733c7766e0d14d4d3bd98e2579b046204daa9a51ed517921d4894020b7d824ac9b0afe268352747dc5ffbabbe1d244bf77dc36b8d50e7bf00e8285be9d6042d71e82b432bf8f03d80ac46fbdae7172053250eea2ba01d045f7e30ca56b86c1346e +SHA3-256: 78c2349e5e301a27982af0e09d74bc220f01d8b52e4169d2dad2729eb082a98f +SHA3-512: f630fd47dec8ccf3a88edd9989808f8efc4aada7e7d585a8ec7c854d074573313a3e4b8ebd5100c0e3f05ac756ffd87cf3df906862b4200cc1f88320ce2ec50a +SHAKE-128: dd8d67406cda912483a6dea5a787c3348d4cb3d0f78100cdbf14d82612cd3bef69661c9ff61fa4df77a269d4f194595efd20d654be78e6acdd1b303b7c2c4f64150194aaee2b0c5d9436d2ead3b2333faac703d6157d1c5ad34e502d6f1cb424ed914ff0df59eb0fa58e6e99542ec612d4d7ddda81ebddf9289b5ea649a00bf749987b25673a012c1a6c83cb95e983fbccb8fb65aa2c7694563513dcb218f3e3d88dbfaa17f331201a1399e1c895bdb66b4b20273280863156fba39441c4a04798bfd493f2bb6f94a448f03d4639407f39e191015e77a477c08dd3f35456d132e2b15603115412fcbcbe0e4693e0ac211b64fea24d356ad57aff1ac1199d1b2e81d6fe689988caa28516cee8b28bdb7f7b9fbe97c1609815cb5ae221624dae5d46a2fce58f68c5aefb156c0ba4285c8f054d05731abcc5b2b3ab688cfaafe26349afacc8b605f67a014688df0bf1ba9e55eddbf0061a76ec34fef6aea92229cc4f9be78b590071c2756230098e753d947a8bd767b5a23ffac4a696cd65533aa327d66383470025fd3f66f317eba56effbacb6e72f02da58cf9be98d1892b4d375fb59920ece36b7a34350f4145347d346625933a477a5a3ee9a80abb26454ec3e9532326c28bc4ae6d8aad8443f9ede5e285a3a5513fa84a1e77a2b9bbfe18766fe0eaec501154667ed0b45089d1c481a2bce76932f402f94b497b614f9e8983 +SHAKE-256: 8cf0e5e86015febf37b834f370e036bd9d54c3e94b9974016509139e1e1d955f146d7e5dba35a7f5b6aaec02009123855b3d2d575968c8a6789152a6cfd3051dfb2a33e1fad0f533a8957ce7bcfe248cb29d87f74809cbdccb6b97bd4ca44d95f970969bbdec03319c7b91a7439f4a3aaab033c592a258ad02c76241afeff1883387263d6ced88e23ee562cee255a6682347d14cd46c5ae3f66c195e9069d668b4cea6f5d46bf745f363f2840c99e466ca0e715341cc6c2113a1a38910781dfb8666093dd507409cac67562e047f586e2e3ebd8eb0a7d58af523b2ceeae5240916de9b231e06f964b73bad27edfaddd0aefdc4ee29a6614dd51323e0e9500e4bf249202a2582bd0ca2cd318b92faa3e36ba37c6370c6b9618c50502b116b11fc10ae23462b6584e19c348761db86c44d5ec477f0c7532b7e33c067b5458f3e2481ba494f3c7b834c1bb052222437300f4133f123d2c754b66c54aa16c97370e81d6df72a6e6b065090f893fcb05eaf374113dfe83ab66a4c58244cccdd30b6f7b56e3fc069b872302a838d67b2b57c6d3692797d70de34652221924f57a4bbf283882d6e7a27342a990f5e64308135047b9742fab5d544808b7c86bd5b6a378a373d6a51a23e8a0212ae555230183308bd85a8327ab6e0d943164f90da8787f6977805ba7254f0470477130549b4250c78ed875319a1088a979c54b8489cc9b2 + +Input: edf9747313f2c3806c5128a863a10bb789f28c721ba4ea92bfb58d187c561628ad16301872bbdff47cece5a3239480e94b7da2a3548465d41f56dde5a3b358d28acc96bd7aa7aa88e688ce78cb01b690301678352c225f46543c8424b51e070e315e4995c74a644cae867ab5c437d844d7b307eba5cb40dc35d3e74ff6e07c4785c730f14b71b8c4e637da4b79a77a8f2c04a81175f866cd1f2ff61cee1bf46d4523d01c6351399c18157a8f15d9275a14a480bd493df357dc0d6db31670a5a275adf68832053614c0006405155f6c75710e1a4b2c61de403b6f09d7873bbf6f0012f65b5de4963c02b589c5400e7223f569b8fa537d1f25fbd78935ca3e960b7452c347de4b284d993cf386e517c3b7c6a40115377fb9ed3c862c110748d08020c69aeb94478a94becb20cbc1844666f8fd3b64723dd8326c5b9fa96610a4f493be226d5885c9482c9d26ccf266e8e3c0d2f4ab64f83ab6d1e6c2ea6626ed3ce262212906a7a29df55fbeb295bd3d0f63da06f87ce437ff897305eeb6cce11cd2d01d0c8760b73b25482d3f49ecd97d3b3fe5134d92c3527e2f2a53064e58ac8d6f9a1ed7c59196bdea7eb969575b7db3e1be4953a7d3 +SHA3-256: 3706da52cb41e2484ceea804c58139a79224f1d0ba646684f20f2966481a96e0 +SHA3-512: 57adfc4219c7616e79a0f9eda39f5a7a158990bc6674096427f47c09f862873ad0a8fcd5f3ca7b9c7fec5e269934c54f8134aa52c48cf1aada8f861e7ac07878 +SHAKE-128: 6ba1955103f2fb72b10e9ae41594ac8aa1126490ac0bb931e9670f6a2109f8471555b08e0a11edf5ac9429f47434b31470f607916ddd0b80fafb0eac1def563ce1bbf0c6e6ef082ee8f7dd04e15cee283a4767b2808ed1cfdf952bf5c763a5b412fb50a091bd3735c41147c880334b5ad6aa8d6cd78e67a103b55311d7fc671d92781f35782d0fb111e98536814cb480d5179b027788f4db08181a9eb61ad91507dbaabfb8fdd40b162fe7be5c00b9353dbde207430c8a6e0c603825efa716f54c6c13552c7dd8d6439eff408b464ea0ca54642b914f06f16e1189b172ce95a55f9c53c8fc502e565331d20a5a451aac4ba03b9db5cedf240e8d1f95090673bd1d969a7f075f1a559af34b025b80540dea6ba3c67401994564da3f2c0d257f664299822a6b829f70b7ead43a284ef2f5f047bb51af118fa2d09878872b4727847d9574d27aa066dc4a2eae41164e64b848ff2fc18a2e402170c39d6da5242eb6fb0da764ea405f9da6eec392fc6d871ca9396e7de5c18308386217e909cd1e6f82b4849cefe52aaacb01c41c0c2322d9e04f9f400aef3b8375c372cf04b92c3df974c40a446180a00630bbf520211ac0aedf26218c1470de1f9fd771d3b505f898b32b94152fda6a4f6492d66f2c1c7c98c71671983e892f0523b7ccd042afe7b1829d97ec8e9348f14fc7af1e3e24104e9a9f1ad977c8d97c529453d1c84757 +SHAKE-256: d738002fa6d2c752218e200d3f6aadba0d709e050d84de5ba946bbb81591bfd6b52bbf6a76dbbb5d9c6814d95ea4c22c1400227509bdef6ee359a589a16404af8529e536e62a3ab59010139488dff67a24b8c4cc1de82de846356788ba2d4d5b3b48d0f5f9c3c3ecf6ca5b21e21bd629fe93643a88a70d070cfe64efbfbd1ce71f30d56248b458a5c162d2e6d79f07983a7a74299824b92f95318c614a3205aacdea0ffed60da121eb903c2a0f86d4ba741c9ffbe8d271dd5c6fc488eb56cfe0b652e8d1b2460a34471b9bd608f46f3f50c5c50029dc70e6d27ceda7e9764a2cc10c601228def86fee915f9b613e8de18c04a221095154821363ed9c10b9ab2fbbcc1adf0858be0240f75ae9581773fbec4f57f156127131cfbbabf6651dc7e066187bdc1bb9642aab31cc480692387ed52513b982518d0c0fe00381b014cbf8a773f6b088639826d5f75825a846a6829559512e324fc36216e2c2d0974e31375913921b7a022ae3f1ed1e5404227eb0a6f7fa3114361c9769d4e3f60a2416999b2266f5ac60051738119ec7b62f02a61099676f4c80385458e50b4ae40705b9aa07b46e8859b28cdb3768b8c42c385eb03e7442d2c7293b67224dbbd888f18c14d61bf0af1a10ccc9ef62e4b94f3b64ee5b5ba9ba8b1f73f13264744ae10990d215151554363f16754d278ad374f0f8e70c0ce1d2ce7bb21609fa508adb3c09 + +Input: ae5307b02bfcd20bb27df1245c1a9dcdd5f8eb4a1611cec4ca707aa105a463ba4cea37539ba05936d18f42370e7a2ea2e429d728164c71e1352fe5faffba43ca0d68d063c941127fb05ccb123ff4969010d6374fcc7e156cca94b496192486866505ac00ace5b06d3a83d0c186d91177b99dfb66b8f755f5a00ac97866eec91ccee4be20b1172f0635534cbe3c3162e3f2a9949196600bf49bb801d2c12a7458f3d059dea0bc4aa963507907f5f211199d815a93cde1b053a80a49762211707a37b199e933fb3977ff687b60653e381f3263edc09035d8451011af9c8a1e9344efb610237a8ad679b161b664658616be1ab2ca95ca44fe6c347093c9c2387569e50b8ace4e9d44a2aed43c26e29ad66f5d58c4a61b5c1c234dd5a992b36eaa7f0bd622a9d23e092801a1bea185d1dedb8a16c71a8e7783fe4a745cf1c6c3df7141fa6ed4c5f79423e45d1013e74be6f6b4d4fc004c34faadf02d2ff04235b77a9dbb9a411d12f68a16fa3e97170720b9127f37909e4bfc00f18d105c61a8bfb04bd2ebad12471da4ce24afe3b56ada3e1c4c384c7b29ea27424aa6a30766e453df17c12696bfa5c71fea1ae79f5e6f4e96ff1bc5be6243e1 +SHA3-256: a40e491bc1fb9ad904c97303954c62aa4debf654e2faf181efc52348de93bd75 +SHA3-512: 33ff01249d71f5edf556df68b91896fdf3f5009f808a062b95fadfb32abf788b1ff9ac855f44d534d1a4d3ca02d2c5da271695233c4dc50c6756722389ad3f1a +SHAKE-128: 6282228b63bc113b1a7b0e674ab90a9163e66e84e09064bbfedb1aa636555777bddc29c5e3b7de4967babdea07d4788dd53983c505636d81562297c318009d923a0dc706015726b8a6327f5233ed0657ae0689d65b2e26eaf5d6351ea3c784e5cdab81b341aa5b30757b4ce93c7aaad815579f5e739d369d5e4af1e2056659cfd859033479eac2217d7aa0da1d7006403ae8358e0a886f46315ddf21d887b965fb66dc634a4026f58d3a6d31aeb19688d03e9abad4947603113c7287936da359404499f05235685dfacca61b0e445b8b8b44733b3dc0c85a45ed09f8241e6ff3458bb97804774ef59017918ed42cd64bc6c0b6a77e00eb9a107abd441192b03ddcbf5751514fe81fa55358eac1c57855f3acdfc68ab16b5c1032106fc385d11db2c72f2e741b336980aefa57b3a3e18897a7eea584b3029a3ba19de0582f65bd58d5e7332714e417a490c9d5d59188927feee4d2827590dedf37aa04ac37df0072afe4d352fcfa36908628db8bcfe257d052f5a01f21ba42ab8365a78eaa0906860bd40f3ab8808ca2eb3b2dcbe717811f05439e7d20c3122f4fd88c9131db84ae97d41eea07160d65025583d79340073bc17331e5f93716d6346d423380ea177c4021442f150e5fb25939598366baa0e47d1a1bf38cb4af5c9e97280382aab68854f7c9d18b61a7a81dedef248fd021feab2e3bfddf8cf3ba92f888cd80c714 +SHAKE-256: 956855d896c57ae00e3c967b0807127f67c1188862f62b2d0433643634e08f0cdf1b9c90ef8d9e5cc11cf142bf9c49deb88be641554a10ba8ccee2e70fa73c08174c77d7ed9443ea3505964779180f27cdb638027f8e869964bd5e10774f0e1028bfd520998509576d6f11f23c6f383fd6a7fc2added81364fe5db1fdba26c316f0e984ebf813c0bfde49c2b08c3415166308c881a1f831d921aeab9fd383eedf117ab5dd4742c495637256e4995dfa148be6c99fc78d69d2a240e7b2367deb5f33b75f1c903475eb50767a213a48e8fc9b35c0ff9fed4a714dd834b88b35466c28233bcf7b3985478bfde28c49cd86aad2d2bf2ecdce7da0dfb4da3cebf5ae3ed71fe1b70b74c62407004d63b12380ddd1fac5e2ca7afe632dbdba5bb0d8afe9b120bd3ceecb92559706736bbf9941b2f3143a2fda8a89fb7894a04b5bb2a02070232b0e85191e0f790971715d88fd1b74b324dc014a72a3d9d1cd57d6ab1a07b883b6083126151f01a20b23ae65c151003dfe1c9d8efa2415e1a2d4ad0b10196c6ef11b3b65523a305de016b0337ba8747fadbd7df01ca4ea96b9bc55e61fce818bc58c6d7b76131480f6d3d75607b2e535b3399246c46f7117eea9958ed4337c152ee7d4aafe7e24da828fdb041832cfd5a35e9e6a995e6a1c9b6fcadc4a8ae1437380d043ec41dc86fc88d0582ef0ee00c31771bbafe3b259c5a265ffd48 + +Input: 51bc633773828121ca25772b64776580199b042cbd6a8827f3e9224c942451082ab226d16ce4ae3a3946fa349431341cdc82f7d60a2831df09ab672335df4ba1c4c1572880d103db966bf255c96b5616fe9914afd0ccfba27d9c12dd962214743b111de96b9f6aa5983176d2af9b4fabcafdca98e4188421b2d0458eae4818484415e8009a1443fe0d411e6f5688469b8cfa9b6f5976114ce142477f9d93b23558138e7e1f0c591ea95a0e26fe30234a2ae66c8a7042978b4116614bde53068d929a9346ffa06a60fd0c3a7b688e21c1a8c631cd22b81e6208d028e23d89f78b9b85ef8bb314a8628366cdff9c31c35cadfb7d3d1fa76aba25314b5e7259356d8bb871c0cbf5df060e3c1965551307fb28571e550da2c2ec751152e7377e1b74222e18043c2cfb48ec6d404339d843e5d708045f80f53869209b5e4892c870a65fd7282970c22b99af43c63753f1f0224c7807829bd7b1faf5d7766baf537be4ac933e07cb474657ffa24625562c73724d3e5ce86732d80e65a0a7d0fcc8ce60e774e99347dd0609fd726390eb017ebdb6e00fcc21b7cf137d74c53f04796b14482a54d25559acb149c673c2077cef58310658e87ab47bd928 +SHA3-256: 17da9d43100fbe33617e152b83d6e012066e17a109cb450a9d64999ba7e99fc3 +SHA3-512: dce0819a549331a65b8f123f28c7de613eccb0da5b7e1dc8d264b10415636e60263e524a01df6c427eb905f10710ca60cc07bbcfa8b268c54e9d445acc5ae752 +SHAKE-128: a5bf7e5b90c788e3ff10ec648d8072840ceb3276791f2ec64d49767b109bd9c5e51a7862d4aca292472d14addec93ba39dc0154ae93c049b21484a11a62fe47416ff8948fcbc3074a6a289477e4f0731714a5d394feaef09531cceae6428e98dcbffe3335908e2f38db702aeb306850c67b9370153cbb4412127dbe39947a3b39283a3111a5d4de2c29d014afaff85e0e3b2625a15110ac03b598a877c58c52ed25c1e6dd9750410186fb869d0e2fa93eaa7fe9af3624fc4bd9077ee59a7da192a092d3243f41cf354fc95fe23c8282395e3535ebd3df32174fde653b6b1af4545325a96b9c1fc3dc9202e61ef03cc5357ad25946b62485468e80620904c31cb9b9dd071f0f3eb5ad2a3c3693bea2a4c3232f680d2cf1cfc8a5fca1a7af40360b2c22c373b558fa276e87692670b48cb0f3cea2d6b69cf3d33f415c606a8667b7d6868b578c53a59ad57d666ac78b920edefc195e180be072c1ad3f534f3c29fb7fa2563af16a34506b1c6f035c3222f84dc27b2027c04c5fb9838ccf54be3d18f4a86082b238e5c3001db5546f853b453ae09f141543f1135b23d1e626bef604c56b07651d371687a7e2c426e7c28db0e92d12d5e5a9c191a487f167de1d496504e802e7b9ef61a01a2d1e879a3b08c5f58b32b422dd87dde855c8b8cfc57cbee2e7d51537a3ed9b2875800e46b267264a35d31a1da53bb309649fa570a89ca +SHAKE-256: e778e94f133a1860eb78b8cb7aa90b359f95a531efce829cc42bf7f107a06255c8bae3e1260495adf3aa5bdd632d9856bbb7463f67aae6cc848083803dbe54db72041b94f7b6617328a67277656a0cee832058a4d65c925b4a6c4c0573b2d56ac7ba4d47524026d7cdba1437c10a2190a7bbfb550a224636dd6062483ac0dd1cbb29aabedb99d9398bf9d7ac93a45f88216873c452cc2f1ca2771f9f76ff287b0aed4af8ca0fc0a33b320b39fb345186826840fe1bed065ecf6331515bb04456919aa26d8415768c10201ac68e5fb234785eaed2df2fcab1e858def4848d698773352eda6c4d7975f2677c13efef0451f280eab71a00a8f669ff177d1e0a06ec0760eb2dd75bfc0482505ddfe9560a28455a4674da8431fea9e1fa2f86eff4b8ff3533a1ad986b1f9572c0aa9aa829acae00ee223383f8ed4aaa6771ba638e89bb5caf7a3473e4e676cfe6a30ab387af0489fe458d79d25a0dd2e1c337e7deb9e642159721c639a68bc315c58df800024a8f232fe783461248e8458ca741567795d6052c61ef9d3d8bd83fa947010e4ed3513ea81ca990d1c3bcea63ad7671a23558da7600ac1e7acbd92a95e706078259ff544f7491f2f14fd168677c74c5030d8495ad15991b57282aa9af7695577e8e18062ac99d4edc28c6a1fc4c030c5e8e065b45d114939405e20b2daac1b996a187a13a025f0a7f62b63e1c76672635 + +Input: 6a80c9539de86884846cbb32adf2a4d486e45f15541fc5f0ddb4e2612c0537ae899eee562cc9ca1042b58f3ab94a42533ff45da686260738b72e19373ce5b30dc7f9ecf54042a5e2274ee02f591a629a12022fde8267ce14031241b27c20992a833e72c16657ae23b1e390c88e918bce80f38b61c48fbda39e5391e7cf1c1897ce02e5fa368095bd8e73b18437bae9501c13f1311472d135e2bac0380a112ed99ded2edb914149a0610e1da0cfd70f4bce82ae5ff5c36717ec565904e7cabecec569ed17aae19a1ec19d8ef4403fd4617b407b9f2bd6eb6702b0425c9a81babff6b0fd0f3ffe645bfd0cd024765cbf932ddde8489642888dddba163bc6098e7e81f64cd130a89f6e41f2ca393fc26579dbdfe3716884652115ad2bce855d4da2aa411998f675baed3257b8d46ad2010d4552798992b66ae480fb0a8516e03ae972ef92b78ee0a687c062bf1908b0425702f0803518da80b4c297ebb9a1130962dddc367f2d556d5b1600da7ac667126278bcf08b8c0a85d312e51f3c030e897ad0125f6c107b32ea566d57dc8c1e1687f3d78a5ceec32ffac1967e609aa9913a78057b734df163e20a00e712a75900415b9e69cc63445dbb9fc8 +SHA3-256: f759ff0023bb3864383dd9a2bcc23c378fca02b44f4e569f4716447dcf01a7ce +SHA3-512: 64cb03171b17e4d19558e95417ebf015e44a7ee630c07c3b77725330744df4eef3ae02833879c0e8dff2c8dd9bdea79276147275e80d999c15fc44a67bef5844 +SHAKE-128: 5628a948da4d76fdadc0b0a5b282bd4447f0f5e805f6894e40c04e095e3af8e88950dded116524b5cd085d1fabdef72abb3b52dadbaa2020fdc756775cd1b7f0976fdde0d80ffd3e4a2d4f3bdfa7aa0fa163480379f378bc3b9cbca2712a6da77c2168aa04ec4eabfc3d6a55422c9a54123341a0bf1fc76c5dc2cf0de005f39d88189af920324143a931b172c26cde384516a5f0559c9fd9b2d94a12b8f0e604320cc8d7c5870650f3845132d93f183ff77ac7cf6ba0a2efe42f0ace47e9fdfdb922d186dd7bf58faf81fb5b2aef387555ea204bf37e921f43fdcf808e836cc4653b69f49b1a61a613169db0cd0b4c126852839fab173cd5a7c7a789e0f63ff204d4958e6a588b69077aed2a17270209bc637234ff605915d6c3d5fd7aca3df80de543dfada3fed60e22cb6a29f931121901d88e9b484d9f0320430686107fa2f38e550d6cafb7fa90562a83f1fb12c9d7ef5cfcbdd3d20e254e98865c78782d867e5a3c4be6ac7fb5f309ca90f7b795aff1a30b561a07ae7a131d8039e15b4e21ca23638f66914bbe9b39bafd98d0b04cca3d3daaac396d409d1830d3023b7e2a849c9f6f6bc60c29b6b7542d32c625d981e126248beb31851d418fd8dab7890fb3cda9a89a9270fa91d051b4cceba63f2da05b3910945ea25ece17e654e278b125fcddaa1d4b28bb48cf91d884059acee0c15a8ca3c48d115440625f8715a1 +SHAKE-256: 3233fb431761f72724e30d79dab4eb7f79fa588a7391c6ab41ad0cd3fe87096469d5fca2e755c5f899ba15b5de8e10d2e16a44c0cf93c0c561d8e136ec94247ea5729befd55119934b18b146acbdb8f29478b5f958268a06ba6d1d0982f8e55340ea2181861b3b09d41be39553ce802a54b54a48935d17d833aacbd1f6448f6973111991e529171b2710edc972b2932de56fff0c055ea2a93616b6f9b8dc7e821dafedef6a26d0e1827d093c020e57ec0e1ab18c538e21fa8a40d99071294706d3deb945b508b39628de52193796b5f74c6ae0280c09dc43ab76fc70ce9d7da79ca70c24574264de15cb22cb5a9d8138b24877d96bdd58bd53bf68d31fe9676bc1337cca18cfb5ad91e9288b808cc6f665514ef2a1308a901ff5121d65e3d05a7a8bab5f0b3cdd1a0d0bc92afba079da60d6a3b570f279ee083bf9176754af52da85baabb646fe7afc661c4c34bcd3eb426f229a451f2ebccdc62891a9575f6c5b3e061d002254af5abae1aa86a2d2fe3a533f52341c0f3131aac3ffddaaebda72889919c00b6da40ced07b9db81c51979fe5044c9ec6e83bb241d1e5ee5de081704b265a348830b2dedabfcf4e99a4979c06243935391262a204bc1d2ea416cd99d941604bb1fca41d9e95d913f920fcc18778d179c2d9de1ef1073d307a2a21d962311c7176bdc47b4078e7299f04bed09381c0dae467bc2dec6a695efa3c0 + +Input: 0e1a026018e6dd62aa6b7b445dbaa8100543923842c276186501c56b00e88615aadb5edbb289248a9a76247ebb00d49774cf806d0850a6125a42cb9ec36b9978a3195c11db9609ebd65077cb0b09b52aa0d72cd5159288923275dc04005f2c1bfa313206e43862dfe555e5debcddc304c845f3bbf02d3912df37e2e356e863ed6cee6eba07581eaa3eb0968c5fc036bfb1226e6c08b7652a96af40cb8eca74a3941eb901c738c439df002d7071c544a1f0eaecff21a28e2a41c6fc3442c78834ee023fa7a074f2c1a0eb71bb905fe187136e24ad4aa8a2a948e1f48c39bf7593f21cfdc712dbe4824d9501df5cc7273df92d59079a04f1b9a03ca31272ba5e9cc3a47228208417e0cb02d0de546ad645366afd78e2bcc2b3f1eefe55a1db513d3bdb550ca093f2d7929f7b7b095af18aec1da9a2c79463a433dae73f1d420f8a0f30218a1a9e1e93fb3f04c3094a4bae8481bb4b2d0483016587db4c5be2cf5004af9f52e1e141aac586829dd6271e4d572ed9e40f5a9e80f37b4d647b2e9d818f536218cc5609377d9b04bbffeea66e3b5d3c9ca76da4aa392629881833b3ae58f50eed8557a0463fe94e351e4b39cb5abda7aeac0bbb9f113a29 +SHA3-256: 7f63be8aa0814505869404a1126f6602be2c00832732cca64e327e8021cbbdc4 +SHA3-512: 57f13c2d767a5672bb82011d28da74b996bbe0b8523fbf1a2c4a6bae31aee8d6586b7af4d4522938bb6cb97e8e8dad248719be9db1b6d19b1745d6f19b70b587 +SHAKE-128: 168a0b4ee05a49e2d94fb6c052a9cabaf4ace827efda993390e97cb39cb4e04774185c3fc952948b60b81eec7ab4f78aed97437fa4294787a2fd90a228a8faaf8a5acbfa8c8765315ff280cd1c2a8dd3c7849b66163e2026a29899869dfbc149eed3f418dda3516396c8026ce59636a75897539120a2f57fae589f4112b192a75741db1d722a931001c13af6021f1bc73a694ef99c9733fa130922354b035c6ef438eee1f860b33d65c7a0ef94a3dc2b48d23f2d413315b89cbb38fac22c00d33a84b2f7eb28cedeb7e1d333adf3e5da3d95b049ad1606fe1bf030a98235d31f75a988fdc43a548e938b02b57a575d33b8fde3fb5da1b63e647f8c26723d352a406d3fcedb74e11cf0d5c55bad86b450646dc10afdc6f3c175d577f6ed7077b42dbc6001b92c4679520f7c49ed21d6824880ab80c43eb829dc11aaf5a536abeb65b9b8622ec0559399639041194935346ab9a7c5dbb2614d387199cae01fcc3724d7a9983a6765a0d2db2458f563e97075e768141528896dd5d694d1b401492f8600f350fc73689a94ac2180d75b48f25971e2206d80bfabe00d72854afffa7f2b265cdba47e84dd3d309ed69cd9ca00da61c5a25a990f6a61e5acede343016901f34b731b04c1d83967bec2c3df00bfcea9257034eae086b9a036de6f97cd30b8fd56643219a231634e5b5e6491dc0cb92d77c9a855c21956fd4924947c09a4 +SHAKE-256: 994702c59f3226a1336ae531054ba669642272577229208771ac1ddff8eb75a979f049ebb279eff2b3e2c6f3d34ff4bbbd7cacea6b3c43f56d42149424969251bd96913470f6bb5c1c9968a085409738d6ebe9963deceb0be4ef4f9f79c00d588b35528cd8bab75fe4593bcf2d317b7413ae8c296d54d29576ba258cbf08e4acd3d96995266634fb994bc4f0e7634fb6f48f824a839c5e6a4bcd7f661046c8727ebfdc3137fcab7dfd558dc7471c5a06a76e98d84396f58a4613b3dd5b14b9823bb06a2085c38617b41f5974bf5eb4f32697ab1a92e8a91722fc1e59a008b6f3a4114b460b0fd94c9fd3af851d9469596f7a46a37a11dff948fe1b3998cbe74e98707e7d2e014f604d7ecb8cb93d4974852ef146f04d3f2ab9666786cfee4b20fa73afef503554774d2b4bd14e140ba57484364263f495402ec48cc31d4721be6fc1452bf3de05c4d0f1a1cf794ffd32a4492551ccb181d46e0ceff878425eb4ff337f5dceb849f38f9fc937823615d47ff965b858a7e3764c17782f3f4c67c2905067f5649257ebcdda334b818f984f7dd09494e52335399a1de64c31a2757fec7122404cedcbb2dc9ee583f6cdae740cf97497391ff75bd3c404b2a2d9eb25c6cc3138df4a70b843b66d8140a40303739495d614937da6620adc4eb69751ddc91a712b40ff22ad11448721b32357d1dd0569cdae2cafe16b183caecd242036 + +Input: 63b2c3b447a8a0b39fb643dd48648a28f61ac2e3834a3db1608ab1220592f633a1797b588ff7378a0a1a7367646db5d458398b48ce88c8f378f89ec7e70d6dffd378d1921cb25247977531935db30a6500a79a3b01ad1f107f4fe02fa06514ca6aac7442ac802278f60a43414f4844869b5f186f8f7bdff8fe368823fd737deae0f1a85961d5fd458113568a7091d432e64c9f2d245643e254793901ddc8bbcd4fc95b8c8e82437b5f54457e789f7839e68c6333888e6862e5092534ae26ab3ccc73e474877330cc4176a10b0f225263ffd32ffdda3670384599e3e0318088d9edaf0d6ea1473c5c16855ec59a7e4a22f2af481541d28296bfe6765b3a477075fd5d8d049e9de3f1dfad750bf1567cd56778fc4676c4e83c17bf25017ffe90f63caf2ab46e8b249aa7d3bf8afd88e5ec181757627ccfc2fca618ba072b64f0fa0ead1470d90de28cd022e8b5dcfbb0c0c2ee14143b3da7c85e6a830af1a4eabcd77b5518f25e7d7489c2d188d011e91455e06676698731f779708486622e6e0c41b151b530772c880daf482e1436662e0525936e02622d92d6f8a7cd39486931fe36c22198384959b1bf0608c5945e62acd5d53869d06e0dd6f80c98 +SHA3-256: 1fe96fbd2736177cb5ec675cf6e6f265a7d0e87448ee7d42b60161fdcb845304 +SHA3-512: 025ca502631b3f1090baa7c690d8bafbc28652a30ac36672546bf1ffa1d92b68f5b27f7f3c1fa161310438ad4968b213216e186a69b9c83f05391a6d0547a4dc +SHAKE-128: 89c039aa97e0cb41adff3a914556e55c857b9f8461633ddbf0f2bfc02d110624f94d47e56f3477896bd2399d6b29d8d29c9144ecb79f91781b7d0a133148ec229e1f626472418cf170198a26f16636eea9a4a570c8de820498eb05d9e56261505c6cf250616ad9ab3162c3c275ed45c52fccbd3c4c2f220b52018f2f4c52104ec5165751d48f0238faddfb05267d909ce1c3d72846fb9712d81664c0b478166f97239762e4ce57fbcbfc1092004ec834e3aebce327eb7c646cd2c2ae7b38ce1f19c1bf668a6d50c6c6403f406f69a9c3a277fd5b4bd3a0dd743437719bb9e257221eb74323a25ae8055877dd0145393ea9f01916f8f87551b53bd274ab4787a9c1ecf974d570f256ef776cab8f93b07aa7f5199e502d9a4123787e5aaa798cf854d1fabd9b1d24a38133693eb4f59748e34155cb78448df69359273ffcaeb8e014b830ecda68a2fa0b53fb752ea0952757069a7d2930d2108d712dda67fe0fbedff7aaec416da7e172258fde30942f38e34bc607f8d3df7a73eb584b26e26694a6f178617b19f3753c948e9810de379bcca332849a562e02b32d1ebdddac8b986cf6610c11c7ecaaa559cea8ce160e0f962ba600619c799e4e601861be2554be0abdadecbbb6e278bb73b75fe911235bcbe524ffa363bc75d20bcde05ba6c544a3fc3094b9bcf056e3e8fa428784c860f53ecc447ed3ffc6a300a89d1b712715 +SHAKE-256: 3effa44e398f72cb86a1c010cd54aaf973d8b670af1e7d41a01e2846ba6f6b3fea2c63d5fdba2bae0586f212cf5041e5f082aed2a6fac98f52828ac864781a3ad1f85e160e13666912bb71c5b43fc806160ab1be0e48f0fb1d5105aea5bd9c8ee287535275c818b7c1e6ab1fbda7ae7e710802f3ad2bc0cd031769edbb45dfc1199e4bdc3c74ee875f4dab3b880152a5aa802e5f7a2d0d8c7e694c9cf4ba68b0d2d12ce730b67e0e03c3c6cf22f254333991e07aedaf4e335d1d2d85567d8e6163b7ec9bc78783b3aa2bafe69d93d66a1e0e4b0e7cda4b1a9ce695227b2f822cf87e7971d2429b1a9191cadb8698073036680c9b0aa37713ad1e2e009e005a4352e4c55bd18878b8bc99be0bdcdcbc468ee9b7d5474aad7375fd57196a6cb564eb3bc8c3b51d5ff1a0fdaf2fcdbfd6b68d3106181ca73972008f8f576a1bafaf42d8931ff097229351ba59e8221f0a36214012f16d5dc59e5d5fb9f92fe7704ba9641063c363d2d476329d73ff9253fcd637c906517ae60bea83033f0e23aa3806b6fc6214e15ce85a5b13398e03514f48d468aeb6256d274536f116724ed2a600669d663047198ad436f1bc9dddd55c33a061e8ee40b4395c2f5930cf51206d502e0ca5ff84dc65b57aed2e3c91db185779b55134548bea4fedaaf51b9d4160b578de2772dd1ed7789ff6fb4e8740c95070191e654b9d21e013ce438852428a + +Input: 1ef95bb0ad9777ca5111ad9e30842022583c6114ae17ac533b6f3fe73bd4943bd556670e01be8e5b85fc977ffa959043228d5661f804f37e075e708247774e64cdedff198f2914113ed851e32b78284b2e5dac156315ac10bed5771d1100784d09aa73cba29351581d5f829e914e0ff1d0f49bf2c4efd416eba1f0ec8337ce9238d2c84a3205ca05b2d0f14ca65cc8a8d898d26306a14f43fb9cd4f29bbfe97ac41abee098c4a49ba3bf31b2e1fc2942dfe9a9b6a41f1b3ea0979df23865aaf3c27f2d7e1a8a11606d8fce6b3085807bde5a6d40102cbf138517c1a7f623e18204bf54a6c59c0358ef139ebd7bd0dee3fa0db93ec20d3db30ab6120f1c9c58af934e7718c78a4e8f71f7a8e95cfe74740f74f5de8cfc586b601d28921822b8746f0487cfd56f0a97a77ad484182241df7efc3c86390df198c3a1b8981239677c7dd3d96b70aa7df2f9b2ad2e4496f77a2671eac2b4c873b9ef1fcbeb3d9100b1ca4c98b2a34c6676688dcb90f5d91192885b0b5c4a8da568cc832c22bae20ada7f2afd4ff8202c79da40b319134e83eeb113cb090bad29b5b3e4305ecfa83bde4b7e48a98179b4e6e44d4e0b32ac28d5a978904fb0f50be40cc97d10e7 +SHA3-256: 0c354026a9cb8d105deb5169d9c2dbce9537af04fb52d8c74d8683570d1a5efc +SHA3-512: ff3572eaae59c95fb0dead2005db00be219fb2ddbce474f6c5095423ee0ca499d89718e4ea8a968e21f35090ce5f76e935d7873df04bb4ee0cbb3353ea8efcfe +SHAKE-128: 55bfe102d691cfb12b15aec793bd977c234753250ce08a54bd124155aef6df0259dcb20ac53babe14086b8904ba6649bd6168fea876ef7c59d65d4227128a0004a0b5e40b8f0fdcbdbd6c7f74cf2aa0e74297727631db3da2e1d14da54f0c1d05cbe511390b898a63dc689695474d69ec9bd5d050e6881deaefcf124cd35dc59c78a2ae8bb246b51fdfb8d8bac48b2a1966badd7bb64c4bc5ec4e69cce3a5e001b8e332b8b03ba619687ce038cb50e820dbed14767a8404e3b9ddd3d32060204362c36430e0c2ca87749bbd3b3bc9d7f5b948f9d9c113717ab0fa9c4150c2365a2225567380aea8e2bbb2fa31e91e3f2751b42ee971405714f1e9fd3ae3614c6ade0148259f9e8f6fbc27d322d43420670d4550347a52de3a43f9f73709140391c1151f8a7821574a07703d78fb1ff745015d1443f77aa1246b9d53625f55700bd3b9869a6d063d958e94e7a391e9857551e2e5c511e1e79821c2bcdf7eb262174ab07a115f7274b8d1f7dd8bba9dfefdbbdc3d9a82108471ebd188521ea2c94cd9326f484bfe03e9fbc00c96acdaef2f825d04c64aade7ecff37c3e409033c3a8625462c2949467520bc5a8b9893e7481f64070f30cb52bd6e90a55e24f08bb74f5cb1b395bc9b89790fb1a3fc90d6ba1df4e450fc3a9f0702ab37dc841a4ee73486ab6d8f692a80bd581b0c6c9d6e7f7c31c2179f0c31a0e0826ecaae8a150 +SHAKE-256: 4d10efa75cda8081f2013b67b6aa6f10d3d3c9076a0f9148c3cdacbf047d708d8291de7d0208deb94d87432325a992f7d90e862d00cc4eebb1856931958768d08201f1ec88af7800b99d221dc845d700aa3d4518a6018a84486cb834e003e8d787a2023c32a34ba8986055cac903808fd2a08bc3249eb62ce6e72f9a9c43d44ac101e37915aac92614619d005dd9750071535a57bbc608befc0cb4042fbf898488a78315fea10a91748493a52c1a629c08130bad8057dfa6df85da465916944db967a7ca7b5a2b4f19e2d2dad1f1b45a7ccfe988cb8cd5008d6c5328a94caad2f242785a02e4ff4c5797daf4c05060b02cf75f0a550015782ea0bc382391075083ba66382bf371f5649a184844e2e444f3d7e57543e41432ecbc34d27f939987364884111e134ce73bea9f43147760ba4128eda8cec8e9ab8c8f930236a200dd7e7f7f4158d8270ef9c47c88782b68a883ead8b4becb595b4ea1fb462877796548b83a89c2c0bc47f192b90df6817c1a80ea3b3a18afdccc7ceb63c8e005e29df159e395c17172f4e26b067c6fbfcff1889027e228c2f39da24ac0320faf8ee29d2eaadc8a04c758ce499411f72f1098b8b4f5f0275ef6c927784c9a5438ea41bb221a05e073fc08828a0000fcf5170faa5f56b202f8da6e26db03fbb9a72fdd8754eccaf26d10553d8d1a7e2b6006bb297373953c76a257e4038f831cedfe21 + +Input: c6152e58ba1b4260d33e5a433fc2d80ecfcd95646d680db7c5f6890b3ce8daf0e6201dd2622c68618a8431a005a7aa651f4459dd740edac0abebccc0da4e1d311b569b8005fd43f31ad79e56a8ac8312ce10786c111a7c25bbe31284e0ddf8e9c622f114facd7ea27b02bf4243d29689c1465bc643740e34de2e2e243fe0e9c35283674d3b856b1fdca1232a54d3cf3883216aa75155a42a161c89a26c7d6e35504d8eae0013c5fc055c8f1a773c043daa9fda127106ef8c8aec9a5789c114dfed6cff32420a50019ad9611cca164acbb508a470a2d5c19943d2777f00cc891e863d200f8d4bdb2fec48b0539d44de06755d4d4a11aa9f12f001b7c3f8db33c808927f51b71b862e9112f755c5562ff19328854fb07ff3870efd8e71a6883ba50e71b14ba8276785dac4a0b65a48cb3ebb52f9437ca5000c27113ca863cb75225e930ae5947474fe33cb5d1a0e496e177123b9709869c000efbe241dbea3a0d64ce7da69d894fad2f9dc62b9cae800dbd5c7d3047c8d703ae36894d77a21e0a47bbfe851f16a24b87ae4632bfbb7c6e4aad64e9c3a3adfbe51d512478e10afb374992f538f0b33790cfca53f829a5c18222019e6b78236f14538822ea66a +SHA3-256: e497dc9a15c8364734c858571abf283d684efdbffe4b9676fd3d3c6b149ae0bb +SHA3-512: acd7ef2fc2be672ebc4891066ff4240f1f6dba3d59161959f41355e89bc013b4db30d17a4f2c294879a52266f50e75234f20c72c7b1fb81af950ffdb17e5a1cd +SHAKE-128: 55e1c01c18d54398473d5badeb5ff69f94036044d2504496244c55973b195e30023fa926fcc8b7ea9bf96a3df929bc7da544fadebd61384338f1a86695cef6b80e06af2f0d6d052eb3873770626e2342d5c891bcecb120d36354c58be59d4829cc1ded8e1f9c96f681085b227fb1ca24b3672d1a8a398f306e11e223ccb28de6aa802209ca8d3323d26ee32bc800d8509b2a4db1345b81e50187e69c16e657d76cd8676af515a6ca65fa0a5986f626740df7da44b51b4d9e6a181fbc745035a454fafe94a2021076702a69a2574a2eac8d4634e8e5ab02b7661f060dcde99664518f929f5dfeff301a73dd23547b51dc41020523a7fdb905018a55116becfe2eb4b5de94bd32a0fe903a1e9145e2c39c80689ba4476da2d978938285cc5004bbbc9a2642840b58f7c6e0a9307bbcf7bed212bf0db2fcaee36dd78663b66c2c1191e2757a51ba0b42fbc9a3eab4e900dd896530aa93cd242df821468263c433af070bab3ce07081437dbbaacea8899b3417eff0c3938f5795ec0326d8a40dc337cafbe8f14acd411b89581b15e1f50ecc25ff09935ff75a7e3c11f808c09f2c9e61d9ceb714bbfd5fe3765414f3c22f1ca042568b367e2c2c66ec8e4fc33e211cc4e7ebea0b9066f431f18d5a1cf103f02a8bc4495ad39ed65a9b696c011032966d0d4b59fa29cfea5f0e09d833e97af6291d394f330b4947e85b71bafe5ea87c +SHAKE-256: 8a6462552f57ba125fdaa54602b4e6633f469c81cdc05919e6db3da791ece7dc295676bc8c031dd2d205c8e949f92bd7898ea26a6e67563dd8718d5f2cd5e3d571d2781fed1af260df3ca99b25a6314328c833961dd41b8075a793d78aab1edc2754881062ac93b7df1b171b74795879e2080282b46b11c07273f7fe03df6157dc676a72b43d6cedba6476fb0ec7c3e071e35c662d43eb0d792a276941a1a049611977cbe77e3224d81f711d4106b3ce66255b73563f86b97ce8b535dc4f99d1a9f13987bfda1404170546ca1219616bbd54898a8f359c765870c3d78e605a27b4a8a216e03e5aabe2eaf629a7b66082e2ec07f7846352a30bd8ca5c3c0ac43e477c8fbe5415746939d41adcf361f03fd1b006429fec42a24598b7575414c9c407e2ca326e32fbe6b703e086ea5870c5fbb794202c4a8d000f928de4e42a8acd69916b86e5dfa95e74651275a1ffcfb20ae93b8e40d8b7705f99fded92ad25dc4cc848ef40dc82395c654bf8fe7b4f1ed70f4a828186a0b228741b357d1c72dac45b2073a5ce58fb7247012f60fab823ea4a3fb44d22052a384da777c14a437777e136fae7d2ec3c0857d53a4f1ab1ac04756fc3f8ca1b372c4d062b2a0eb36a07d7ce5c22fa53da8beb4d3eab8b2af1fe1954919e9b50739d055ab52af7bb9b59914a33d7db9ab28c3fa11e0ebf09e9545ea63877651ab9c7bda0bc040aaa66 + +Input: ff68813224de5bf57ab7adfb9d7bf349a2ffc4694b169a0b14280ab400b9d7882195a61f5dd42dcbf95c7fd238cd0867325f3c51ecf0b30e14c5826fd5175c661f99e8c3fd31cbd253d165ae37bba3346e1f2cd8547dfa93a0d68eb87db41169a40e0d5471f90a65f71933e556eaead5d85935efc32e133c640b666d4f6db028aaa1b3025476d13c8c2cc7e905b9bce6f052506273833af1efc89b792b812828aecea2e563f7cf6c29edbfc498e47aee745a8aef2f2871b1742d807895f3a6df86df1ea25e0bb018bd969d731d23c2c5c9b9b751970e36e62101a952db5f631da4d52a7d0b5f540e32361300974a2fb71a6adf1e9f8b402643d3b4d7fec6abe8fe4fde18c419f6eb4156474adf3cd3219ace00fe5acb23bf8795382dd7c4f800d0e41b99f3f5e6abe8e35b794249e4fd34e03f2368d9f098fe2bf92334d6cff0d785ebfe0f8e217079f04bd69d889046f7385ba609a0428e988e1e6ea72acb3f0197bd376562682b69f2592a502c6947a148b8e7cdd1a2d2a6a787cbaecee097148142a7275372985cb7611605544ec3a127e3f471be77abb9c1ee5a1e35a4e433da91f2922187ace997a664b7a1fae99a1c1fcc4c4587017044bfbff38264 +SHA3-256: 348111b988064d39d8393cfa6bf5a9691a78d76c7f6e3d1210f33da4606dd33b +SHA3-512: d4bc58e9aeb2df4c61ea6cab58c3afa8b78c55d822522c89d42c65fadf71eb4e5c02d5a74f5660acae0ef6ae893d0afdc0d46b9304e1e40253312eb642ff98c5 +SHAKE-128: 6394c24043e6127ca844f7d70f4966027878f615baa125beafc3d3a7afe93a6f9951b74358d9961cdb765fe6fe3ca37cda56dad0db789e718a161ec0295f43334405cd9771e93d1f8f9b5d781efa00e97b62bd2b56847644a6b4a187bbbcbf0eebff4d8c7b42f42310a2290374b82c4e3c3f631a93ae516efd94c957f9173092319ee912df99dbed55a9246e0e6490eea008ac96f95e2936b311219bfa285f8e8d5aca2e9e64c70c1e5ef7ac6313a02cd9ad1c2dd0ee0de333827d2220009ed7ac1502a1d6c03daf66a36fe4e280f949a4a8f7542843a9a5b15f32d55eb715c0388a80d73b10e88b376fee0e0ca0d0e3d323818bc755a11e7bd031be78361ba0031814ae02177add644f3d27c7281e38ea497b16ab99a4e4500787d1cba55d530893c4aeade98f52c7d66ceb20543313b4fac9249c8be1057e640a84df9a718cea034aef725cec062391fb72dab5f382e32dde8421259346f6393921d2b7ace108428fc34c69fc0495b6d7de233fcf8284bd6b5a16991a7faa93f2bb8a5a20e82a16203b5d3a906c12363f11e52354a4e83db9346daca7373361824735677ebf01bcf8f9e0e2354ecfcedb631f6f41f80aa8875f550d7142d5698ffdb20238e1a73f6584a38d443360e5b4f8baf570cfc2a0242255998090f736d3b2035574f8d09e8a4fdc7235bde513396bda0a28fd1bd8c73953485fc66d6c99e1a8421791 +SHAKE-256: 0131a264608f1e1be72c2e9c3c88d3b8857a04d6cafcea749998be7b597890f779a9a68c994ec04ef97280dee0e0267314b572cf75bb8f041e9695bf233fa4533e66a590edac1e44c280c4e249b7a5582443a0b8080c6ee136f7e0850e8e18449aeb81879b5f5df2db9634400687719b3cc92aecb61e58ab2718f048a043680b1b135fd0bdbaf15ae24d1d2fc94c40848b32faeb42da803484505e80980ca77e5268a74ff18d2e4fbbbc8c3c8081396983d8ca03df66fc37719ef54aa17aee3429dab07f815cbac81ed38cc7982d90cee75c15fc01b19144d420079b2d37242621263f2870a18b792f38bbbe80534f9e7348a81881f6f0b32b3f7b7f092f028fb0105b87a6d61ad0097e6968fe6e7385df1c42c24a47cfc0c863b819908504b70cdbd3529603727302bcbd68685a1f5d6ce1c33d35bb72982aeb853dcc1c134ffe81de92ca956349cd0702646dc6001190b6f970edb8091837c4171e609df2d6f8174be054271001dd06f332a9f8f5d0eac4c70ff878300d7587f2b61ea3cc6f0a4d0dba3e7113424829ae7d1f89a28ddf81549a3a4586b37a721d6295498eb8512b84de6cc13bc175f0a7d894f4f337e23edf71365370d8312bcd3162991263f6584161ccac70c4dbd3e84f03609a7a82018eb8f2a922e33cbfef8bfda563d392e6609c6982fafddae6be81f701188789a12d5bb4abd638a49a327a660985cd + +Input: 468b8fbc5ac0237f5de28a0af810e401fdae51efda3c31b54150ceb50613d783d8ad76ae3c466da04f84c02658a69e70b198a46b5534c118e51662db4ee1ab17fed6c1b15bdb8cbfa0f0b7125c35d2d14df3edc935ab49a716573b36993304e95712cf2bb7c6eaf7c14ce36269a9c9e81b4e6915bfa214d51416c8a2241c37d03f34ad17a3ceae51fd60fd902bd1be24a472923daa6676c89b1539424c4623bcb89a5950c645f88c19b2591fa2538ffe366ee6434080fb1e00ad33eb4923d75cdd9a666c91fd1c46beecc438d25ae295dc567ff8297dda94f7c5045f13cfdf1aade9ac51b0dc9416f904ad2a15501e0a85b4f6c93f97c96d1743bb8461eff4a5cd7f90fc4f4180672f57e54afd70c9dbe53d6f339426fa4561e60908ef9ae4aa54c6d29905585bfe0d225bb881909ed9cb3c901d0f66eb7da6b80148cfd38feda9e802f92c2bb3b30fd88024d6f8396e8606e83101634a46291607b7a0d611e2d255bcaea1bd44cf42f0877e04e187c9f8de798d9b3cd1b7757856ea99ebbfb89e65b32f8dbbd86d18ecd3a7cdd20ff9883c72c60ee298732d0ba752502865687e77879cd5202aef6e30ce722564724895dcfe6196a01408e727cdbdc9db956f +SHA3-256: 633e61e6b5472eb51ce3d034c2b0b14b05cdfd9ba4bfaefddba1d11a495126d9 +SHA3-512: b1bc7a489b407991ed622219995348f9d272439f9ca68e9e5b789f1a63efcc34e4cf312c2cd683a728f9891309dcb4989c042643c484f22139787215eb89e6f2 +SHAKE-128: fd0e96a07a88869855a1ab7751f3f1ea90e7e4a629ffa81ccd6d0101279423ee28449b59deb6fc0bb69111bda90485bbf6d801c257c9989f9265dd32205185439e52b7be436825315ad4ac2e196569b89859acb2c2fb8aac3c61a4aae5c0f4a935e8bb9785f2c4e9690185e4b71d1c62fc4c426ad0ba6912038c521980103acf514cdd72505eedfdff52b8821738eddb29d9063d0a247d71aad0a1d681a5874de41654198950c00ef4af7538f4373e74fcc958988306b0f143aacd8e99bcc60152c5136625387fe5223c594d213959ff9154b3c443993d9d5a11b8b46657f1170c31c883e01ebe6b35dc367c516b6c4040c8be2c1ea3618eaec5fd818fce3f0a9ddbdb3d6deeed719b91c087ea6e4dcee20742f0fc0ddf9fcc556b20773e82f86ca0531eddeb0c2dfb6d63e293ebfa8f678c421b5322f64f101a91ded899836ce7be5956c08d058b0906beac8e9117b6dcf84cf9afd53e6e16436022bfd8e60bc2d79569ee2fd7afcf69afcde7a6ab42d4c87ea7a403443a3f9e4cfc4fb5fa11346a612da288d152091c94789b06254fc86c3577c45c4bfc85315a00fe03e36afc564fd1888a2265121f856cd8460fca9eabc58395425a106c4c9dea5ca967e6a5af0f081c90558be7534979f50abb52ac5b7643d67e3dbf603ac5cbec38162318d147ce8d88e3e0ca6157f94d2f3a93ae1676e1d2255a53ef7de49ea885683b +SHAKE-256: 45784c867676350f8e3a670fe301d265b7ac811dfb61452b3b73d3792df48b9e5b0c1988690c1d43099baeb739988fcf40b60759d1dbefbc29bc1c03f641d0d82e914627aa6063d0ed11cb91fa6b1834dc66db50062d67e06df0df5efdc770687af22731f3bace387f831f96b8066afcb10a8b51420cb8da48dacd25c2fcab37ea10322b4cabaeb53bd8e8d5cee7d802dba1fc32ad01a955cbed57159d3aff0ce58bfdd41ebc8727a630a158dc261820d21470a43f3baa67e6728134f02e7b0e60bd75f7f1ee0917704658163c2e50fca94f5de7781d13c6e7af0a56e79e83e8a50fa17017c67a463d9035f1275166033c6d478247a755ad2e2d4bb89fb7be9f38b3cafefe85873e9ad7bbdf5ec800ae1fb5820a3dbf95112dd5adcf54ebb26e6f6b374cd8be7c0d9ab23084ea2d9e5f269bd3afc7f1344b329f95daf841d7633f798c0a330b7031c7a69bfd97a9285ca2accf3549ec1b5769bb968b7d8bf785292441fcab4ef3ffb493d0219cb7f212df125aacb978ed7311dace3792cd74fa96bf95e97e411645181a600bed008e4fb268fb4a2d28356ff11561dfe6d38f1a5f9611d7882a0bfdab091c83c6b66ca6a8f08da253fbe60dad2c72f31c171d090338df27e9c688f5ed5697cae800694aa0bb9462bb923dede6a80c458560e0217dc70afb37ae9f8f56349da900ae531cdc6b82cdb1a7d923e6e4b8c4016c6b1a + +Input: 0f52bda5ec59345973e39247ad2ff5c15b81c91016aea5db9f50a81e38e7bb8f404aeeb5bb2cf470d048dbf6eb27a30a115ba3dabd2d37fa64288501f5c1c6ed2b8e9841e59dad2197e9b31381fa133c79566b3251686b5be5c513aa0f1ce9689498574cd9aff42e66c8e9f3d9e127676c2d8eed4541312eac1a83026a107329d0befa3510d9bf2dfe498cbd4f1070bace8777c67cc141428580ce167532e6c199abd44f5d6d4abded7374a9da9ad962e96651469f12ee19c660c3e044ccf1bf2786b0a85420e6e43cb6addc6e603ebd41683136dba08ef4aec7467943d5e348990cf2572c0ebeb1cefd3b8490800c38d55a7ff1ae2359410a5f2c613816844c26e1f84de3e6d823fe4c58ed0cea50c6e0c21623fd31336bae5e0cf53b7d4819c3e4ca1a2bc31bc42372db7eab08aebd42be2e1731c8f9eae28374746681ff1f2e5bdedffe0f356099b5306a7e6d562da9b678ff7dec4731710e691147a6960f476b5313d1e9041d574015cf80e0af0946a552d0cb9d4472d7bb2c353df4da0b37aff9069e38ef3080adae82ae62372090478c26a02e08f0180d359d361cafcb834b620d7b31c141bac4c95c630787c0e3b951b1b14351a068efd60f2279c54a13 +SHA3-256: 80015db0f4b39ce678af8349f337a1e9e25424998dcc9a3a0f07cf8b857f0646 +SHA3-512: deb57dc06f8c0275eb88c0ef221fc01502b397daf89be24c1accc61ea3ac4275ebf2b1e66e8981b30a031a8b7d16ddd5d2a8a443541304a28be85540213fe348 +SHAKE-128: 7d2269c6f98ed440570db0be876e1252a59a6b63c4324329277aa3e1744c288d107ab0c0521dd7ae2a6b820d12618d67f3cb38cd75ab49723831aa094229880cda1d107020f397cdb4fb73e3b5c246fe66d73b5e8e3b94fb7f5e1dc1c663a247bdcc6c75cabe067105c1b9b93effa4b8821151a50081df466ecbaef31479cc7f3364c9f8528caebb8ac700a7a6d7d6646e24b59fd7bff83608c96b93c8ad4d3ca50889aa5eed9fb69981403c26acf527176aaeb5c4f3afbebed3aee659d1f68e9e2368e18dd19c3e24042b3a118fd81c465357f102d06fb00f62d62a10b8654c35e6fb9980e4308c0cef1cac378c4b9fd9ba77e3f6f6ff613e1f159436935b9b344cfa8f32dc05776682503618f7d303a115e923528d61839d34a715bbf5b76410d0dd1d158d374dd40423d19be908c1d5ce6472be01bc4a1194b7c1df964d02fd1b0e2a079b8faad0d6ca44240c3f9ef40898f5096fe9bbd77b322a3a61757a6d9d1e8f674db6d5889a358e6625bf2082069f73afd4e007d9a75c794a8493ed0c474fae298e885de45ba85adfd13553b9444623c9a85cb3a3d7d4c55f5d53517408df63b469816d3f40541eb5f64b4d2410fdf34b73ca9c5a0cb8d781c2583532a042cb8cb423a1bf3bd2a1023fe19d622aa1e0a8f072d57ab313ec9a5ae0fa0f2ef506b1142687894b702457ad8d11afdb7717919e1b39a08d86c2fe57494e +SHAKE-256: 742db097c802137221f46888528642b9da80368a6982122fc05c7e61592ad1ad00e2354bd7d723b60751a1bb3168f8f93540568951a08eba6d8c04929b1abbfc767597cd4ad684141c2e0174e14906294c9c60cdd9078041de790c37ee6d0ae2e18f603896d0149ce75f18d543016f19421d254b4530e9ca7cb3d3bf44590d33793771d5c395e87a32a13a78a56351ec218ae611938d2e2e550aeef2e6b4a4bbda6e6aa8b6ef3693d84b92088485b231bf443adbcbe8025adfdb6519b62541bb247cc33b73b9a5339cc6d0c2295b7def59a21ede3aee7b3da889f1cb1e1db6e993fdf6adfdd81d3fb846b83a4ce58c3ee539003c31c42c85ac53fcda3e4c1f8cdf3c296ab2ec143feceab1bb9e7057e73b95258798d40510d40d9841832ba02319e9080d5f3ab24841f646538eaa115862b319ad6b55b1c99abc0d25f012b5f499461c3754d06d13f4ec59e43544b40654a4eaf643829ed0eafec95e5a202f5d8b0b301bcf9b92657283fc9133e0cf3b9b1b7541b049776317c514b543613ded0e159770da3611167a0b7821e20589a95a0fa1bf3a5ee983a23ca03348cd686ec341754932ff31fd3c9c52f8fd0524e3cd2c4fcb17267ea18b66cc8a1431895cfc7f5ed6fb5c52e48a5dcb8ed45811d2cc1095f6f9bcc5893cd47bf587a2c86e11b6d4cf6c448543e355698fd12971ea148e28c3ede3e598dfeceebf5b7f49b9 + +Input: 6ac8be4cc9f0ba7223f8348fb9292b0a08900d8de0446191b2bcceac3ae530a1ac7013e558f61dc65e879ba97434874d6633087bc13b42062f932469ff98942fbe8c3f133624eaa8a94833033d6c68a0b163f9ad95b060a4d67bd4e4b1331138ea605ceb6d2781041845af4b4f795c057b905b8d1fcca232a8b615fad972352b281e6c3c2b3dc9be6d45e0321e0d0e77c75597766de5172ac180e334fd6bb61a59589f07e61fbd26a297849e985426c8a1b118ffc7c9d7bdfed57642cbc7dba1b4998d4cdb9aeba2a4c06d136726e36d4a74a3d4488b3cbf246b6bf1a55a0d3725aca4d1f98c939f8f355c0cc4356bf8a347884d5290689b3dd8da95a629f860271b1d41e8e9c0a6f04ae3102d56058e2bdeaaa0607960b2ec3f8af58cef56d7522df4d6c45ddd17f39e8349de0decd83bcfb55435e6a479e1a937e7b941be2c54854f8c1a0ca271005dd5bf284db4383d43543c12998190a2eec6d4386ab8ac8ab57db96ea3332cc4b2afd1e8d31016d47933ea2f690921d8475759c1a7c15f74c945f50d53cbe74b61ac7cc6909245802c7710591c475e2fde02a4923ba51f81f3170e57c273e91f279853febfe6e37c2aad643ebf9fabae00ad6be2dea23bcf4b +SHA3-256: f51935d013780f423a687d98271999ce3c44850127fdcdcd3181ef729828f4d7 +SHA3-512: 98d002c797ee5bc35a5867dfed873ceb1950e0f712ee932d7c0dd17494e2ac8402bd5a39f48bd610ad0d2ce53498b52f53347da870367746c4ce70a66bd22ca7 +SHAKE-128: 470bad7c154059faefd5b6373baa71fea7779975e30a6f84164369785d65cb5241db3adb97fd1f74cbbf3b602e98baacb75cc34e6c60d02c73ae1ffb861363f71a084e50696c1f4a68e768c66a7b560dbee500d5cc9757f126be83a40c215af182550a1f93bb33a9e32f6fd5cf4df6c75e5faa185491be869cf232dc643e0869eb40ebb79cd721d4e429ee4985d91eb4d90ce2ce89326d26f6e0f892540fd8b3811f28c5327e9e7a097a32c91d0aa6b4400b17468c17d72eb44e72fdfbb52307c25b02c1ca6de77e2e3449226b63443a13695aa55588fc39bba98545e75c7ec4f6b51c74a4bb5eccf1f01f6c2ec40731a651b30e15c740f7d18cc26cddccb56bf96f08b614d16f15fff826de9f45dca568d14290ec9c5f60d829ec7852b6e899109b48a0c50ce43353dbc11d82d6c4e254990eea3e7e6cff5f6b58dd41c45438d6f8ed929bc503820a87afddfbc6580250ca47ddd1a410f35aa671c52237a790d3adc0f612e1f8e4c4f17d93800289bee58dafffbefe4bd5cca13ab8581163ea08e115a665c63ce65aec9843d64d7c5b2afbb802055b80fa16c2f4bb4726f91a1c09f974838e6dab3b5af07c53805dcbfa78a9b971e12692b93227eca01645f50768e00b6381f81577e341b4e21ef41709302736e399ca7027430c7384984dc68c9531aeefc267e25ad3779c2091a35fd1cc52f310ced71434bfb81544077af1 +SHAKE-256: b1dfc6b0e7f81ceda9bd58f3b75ea9b4946dc86a7fbd07e7a13ecb9bb104e34574f6cb3853c4a0653ae88095cab5f5f3f7bef8a103f690c16e9b62b8188b2e7d64c72bf5e6f30ea5867f722d395fb2dbf34c09dd3df0640529d9ffffd089479f9765b9c40fbebf6ff27c95cfa37ef8be0b24a57d8a6370eef95710d89e88e7b5e6bb905c0ee02b0cff8d9c7d91ace6daf38fb9776a043ac7979346de7a9548011db12e7985f0bdc9f1875a6fe05ca0a8db692ead9288bfd71d161221017d3ac4a29804ebd68cf11160bebbde892c2bd6030261f2caaa35ea3aea4c18722668b516ce1bdb0ba9d9d727ce8a1254af7f80c247e3e40da5fa4a10fa69f1382524ab4e84a43605735e8acca64420bf6bf1e1dbe0f813d3d3cb914e1e396cf0afd433cd6ea056ef772e0acbfb407c3ce0efcd092fa4e65abc83d04fc46754b2f4ed81396a25e8ba2816a8553221d48f10c0c5dee6b6ed46c07ef118403880f3771603f52c49130bed02f61f06e277ff2fc2b0cde0f6a1fc217a464ad4a3506bed074a2331149e645252ede565d65150e1fe10e47ce63a08d175881e2b5cbf6439cd02acb209be15615087cafea57e5bf52e80be96fdbf1a30c232d68826acda45b75278d0226471fde1ab0dd61abe93ba20aa050ed919bf9977b0997ce40322eb02ab8c9cfaf4f876842886713f461ff6e2008f5d8ce95c40172a177c5c87eb91bcc7 + +Input: e468c626abb0002058871b228b678f1519d032ed77afdca657c579d58099e8abce35fc6576d8adf69040fa6007ddcb7b947deff1c0c6f83bea834647c682dc129c05620802e17b5d0d68febf5ff47fbb2f92c7ec8589f1a40e967855b57bdfdf16f4be402ad404025688ac86a90ec497670491b7430eb008900f58d4237f6c38f99943c25af57c1c7df1645c3eacb2508ab374b268a17bf7a20e8c857177086b96766201612b3c68e415a09882997ec7dfed968ca644fb8765766514cd8366ec464013eb3dacbb62ec0b920b61c27b1dece0aa277622ba34f2e7c24d603213ba2bd831b8bab8afb26c9a7193a7bd194f0a0488e60056835b440024714c18d60328df29aaf5c9f28783c9d7ebf12e86c942e2079e69b84ed6be99969d0c5b13546ba73eef1bfbf00b0f6a7c847043e992b4d8fffb83859a4b4ed9485de068557545300c095826fe30a280c9575dbeb92668c90d7e8be7715abe9ef1a2e6ece8b526be6afc9c7eac98b5f52e1fae70ec9bd2cc026ed040b31dd7ad675ea670cd3fdda43927bded41e4312382f08d2f845ab8e1f1242892e3268dc48c0741150628ccdc22b201f523f46ae579b23ca845235eb5c5848621b597387c90ded7266851bda30a +SHA3-256: d5b5046879c90cdb052aea7369912f75b67c8c2cdd7d6195485551fae67bf48f +SHA3-512: f4d7c5eb8016bf36cf2c239c735d133c1c900d7456a15c75206097c869a2c37cd25468fba909bdcc5ae7a6869b75ef7a4eb0d5cac978547576bd8fa5b9f1bdff +SHAKE-128: afe3b36802cf8a75d83f89a05dc1fb268c4f767da17e5a223859d91f3a0be30dc425b469b23e001a2f2531c7c767e4075c33a19cfe128e2ca1849cfe5dc35b16573e7f416a53291dd7da4858b5e67a219f5ba148fb13b32e81a61f6d323810e7af353e74b430da60b388bb05ffac59a7e4d0b62585c196e7ec3285549a9235f27cc2c310e493b9572bd520d976f05c80e85e485523f6dd9f005d59cc547729e23c14ea41eccd0fd4d98313b4b51d42c71e759e6f1f5349e77d97eb2e802eacdf9d0bc8fd684b2ec1bf162f320f46fad3cd98b7d59af61af90921a41956ea63faacc2045e58cf6b296d5627c43063fe9300aad29e2f9a1479dc2f73b7fad9b3b9e952fb19e04cc8d88c51bb71bc0b5d9dca52f0c3d5579b91df051c9115e1c6503a10e4d8dfce74fad92567d950723a636af4883b27f275c18610c5c096f8666e8de9121177e222eddebd8c4869e353b0900dc015075f58449ac89d9577fb9fbb31677b017a9a0e9ba87043f444aecaaeea4cbea37d4c7a722ccce6b7aae41f4e5c617a49b2ebf58877d41d452d7732ced4f33ec3eb70ffde826ffe3b2755e23ac43026a1fbdadcd434fc151bf23e8ffe7fc146ff8e0f4a1cbfbbb9ca85f9bada6784f8f016088acd3d2b77c1dec04c2abb5c12f62db95d04c70f8828d041e4ab62e3bc1a536321bce3643c46c852922f5285f61d82a35f92c75926d21c0a852e +SHAKE-256: 500d6e374bdcb9f850189e5b877f7bd72a0e24546923c9e7683a45f29940fa0a23a4b7b7e0ddf1e5174cb41f1f76e427caecc37da78d07bfeefa70da7a91a75e246810c165fb9b06de8e612793a8838f7f1d591c4b17533e846891d107cafd4b6f7ea3231d7f41e09f5733af146d27fb7e9b6a818a1c33b41d8112269bf04dc610427644f13d74fdca39223132b166c8101ab78e1019725be8a1cf5423fc5d3e1e73d6da809c9cdbe5ec31137e47dfa9324889d48fa885d1007eca4aebb0dab2eb5afd03bd01bc8ce0a3a27076ee366c3d56c6e52faa9c597d490d5b8086142d26da66dbfbaa327b585afe378536fcfe1ad7efe85018c8cbd0b3252057d39099faf979070a11f12e1a64b4eef61735b66be4bd3365b14ad8f44b2f06ab8de9bfa47de972bd629b584879708b186bc90a246236fa00707afe3cd2170a9fb899c9775516cd2fb9b64d3184240642e2fa4c8b0b7b3cbcc4233bee37a96dbae228a4f472ec36b9ec1d52166e8cb63251e8f97d3183940c033279e88e9625661584908b81699329c9c8e0df8e79e6633c54100baa6f169a1d77fd3d81c30f39aae60f3366ddd8ac9520f41121e7f652d125736d407488278850561517148d2bc6adef0f51158200ec7945d95e4349e2e7d5ad7e15bbab9c7ff729e4b108ba7b7c6a50df53aecfaea3111be12f80ee6ac559b9197c91c92c41dae1018c024a3366f353 + +Input: 052878741c9792dd4a3a3d70585bfaa39c50cf0a5b6a0b6ea8b2418a626b3a2577ecb35bb60548bafc34d9c6f73e29509f4056c5ee0dcda369368def73b783fef9e0652c0659955fccd98d8e85a77a73770f2628aa5bceae000e859b6329e5e60becbfa5062613ed5085bcca86a27b5ca057b09c89fa0d46e448e1ec95099a3627ac1ce21dc23206ee2aedc08b7225ccd35652e2ff78633d0a675e07f9fac333beb9dcf6971cd5286728f29b1c16f3e834309227a8b292db144f6df525b8ceca57d02eec80e805e8f801d5071503bf8475dcbf42b419f18f42fc2ba54a028f5415fdc56d7cc2be1d37e46b6d562c5672c40d529826f7d9b9c47d132e75ff0d4ada99cb08a532dd50bb900253bcf13b74ba5901ce61e685099e2b4983c639d9ea830be05555001c9c9a2e0558f0596c3f1bb47a3653171d41fb7cff088491fbc71d5a2fe659bb791be5f432b075b4d23887e045541fba3914cb4dd9c16bc2a452896d30e07841d487b09daacfd1ef84a44b51e17d6c2ef2e66ba2fa3134d76d93f42e9ac4049693d9b507a5aabf08be27939a67d373d7f38651bf6187de0e63cc1eb0605f363f380f3ec6fbc1dc063c2cd4d39e1f2c1d510e416b52a128259babf6ec601f +SHA3-256: 8a86803345ff71baa2898b7ec8ae970fd287de6ad70e5c82f793d3d7515d1963 +SHA3-512: 86d28f50241437b73f009e0df6f3ab85c985b562def3bb6590c3dff88ec2d8bc614b280eaace69dcfab15b1966735429cb555e6d0e613034d6509f8b18c68637 +SHAKE-128: d976b96fb0cc072fe5b01e7db382063cb5f2df303330d59c272efa45d024e8217b529384c7bc7e573bb5f8f09df40b3ff4544d8b12a69990e1ce5bc19b559f466b33fb62efb5197dca06a58186885065600f191d0f8b6fce6d91f39502ccf9911b2020150db96ec20976956544ceab630b8092feb7974de5fcce1e821962b6fda4993bdfb05300d7b123e5ad2d4b99ee650ed5b017368fbe64429e47892bfe148d1d4452cc91c774d0b1ac2280e16cb6c1264bd380cc6dc1396ab1c02b2e98be685c8a201a869cdd927bbd8b7897208374f5d4202fb701a05f9c16b3ba54e5670fcf664149243a2c4aea369456a9b919ff0749014bf8301570bfa715979a0fdfd6d075d15af69f71157a835c898737a5fde47368abea2a58c28436cb59a520f85d08a419ff4db58506f8bd219330c671cbfa833f99bcfc294e8fc8d4b30c4de71779adb66215cf6b15880e08c2a037e4338a2ffb29cbc93222e1bc810531040987df13d0b2411df31c62e682dd82f72a1b43d546eceea8e9c7b4932b277117f74ba610e2d30a3faca7d4e9c822979407f829a3bad622b6e96c9d00a9e826972112f838a4890def023c2651537539e95495b5a5583d584c3cae8e67935f7499177fa6b48cd2ca77f90bd01797dfef190ed86a132c6536b1ce8becc88cd8b1fa8889532fd223b2b7ef4f975c26902c4018f10b2e386d21da96df065a06b15ce7a1 +SHAKE-256: d5f7a76cb4a5ca5993275efccbb1309fbd2e54282fd5af683503493a112131e38d41b6425fbd0e6c8dd7f061e4db7f7eafde5e2661e7b72f6bceff59dc6486995d020308c264585a13b2777689429a25d83064c9279e21abab43c58012498441121db738bcd7a6e065ddb87b5787cf29900500cebb6914fc3c099c69dfdbe2d7874dbd447672087f4d78a84e1c16c713173ac2fb47fdfff1ddbe466fe9d2fdf483f609347aef9c94ad335233045ba6aeb2f434e1218164d9873531ba5d5ad8e4558da26c3e58625e3b12842b3311eec20e635c9a15fb470ccb45b5b080022a980a9fff64960b9bddd4ee849bab07bfa0142d5d7d89a448420255b42fe3517988b290b5a63073a2fb57fd0791e59ddbfb4a63d24adba2dfcf01a3ef3fbc53c0f95f127ac221d50f8918ba8e1a7e6c042fe89fe958b3f693b61f43e0f6f6b8f3a1c224942f133d02783091ae8249e57c6d0ad253bfd9c8cafefedc45990474ca9bb2249baa0ca1f3beb805464962694293cb8b905f0aff13390831078333d33ff5cf980d9b184c2de7c1b3e4cbd0daad29e564385ff66a17d9bfcfe71b1a9a44c7d8800d49552135fbc7d24fe01ad59bf4714230e66ed87dc0366db4d77c177d7a58b320baac4ff94f6ee183126c691e6ad7afc4f21e1982316510e7688a0ef07798c0e67cc27da5f5706d569c6f5f2434574c71e7a2ff6aa7e41f85444a06cb4e + +Input: 588b18d22a0948d96a5f947d33f1999d970c558a219755d9de014379724c654f2054d55be3f8136ce1e7901fd35eb5a0ca7b85960fd0ebb3eac2924b02affa731ae6ecd2310b70eb0d1b49414373d086adb330d172513817998c2db2e187c08b582553b10505e3c75fe93b8fe4cbeaae9015d099ba6971e640139d87a154496f24dd2bf6c0d5afbbde4b60535147b35392aafd0f0e446f72600aa2953cd400e46e0414194007d585298382d9cb88d97abe5e538506181830356c0007b5bfff0ac4094c7a95a6b939f833bec3963b4d37da40378d35b2303deae5b6cf8320af0d62690dc6fffe7c8308aca9f5a5365dee5ed9b8fd5058c141e657cdb59c1330263629e896cdba9b82bdc559583ab1b3fa2155e4093d28df570374024a9361e929e2cb1b1572cdb8a2c884041f02cb9b266fca72ab7a4efedb548794cb13ee6c5a20a7bd9bdb14b8c2f7b9eede4078f42478346649b1ccd317f8d6666e2fa8d3aa8eaedfc0d5fea2dbc9c7b0d14b989f211b955418da9ad74c7b6918d7491005a618f86a9e8e90e438573391766faa3c88a6b1f5dd57e958e33edb31b53b836d75cba64b0aa16f2f75501452e296952519b83e0c1971a4adf291228aabf2ec818cd4281be5aa +SHA3-256: fb7b91941328b746ca65f49cf1a5b15ae9e2044c8c0a92254e43ac24c96a8772 +SHA3-512: eb3d3fce17ba663fab1681635f964032e2a41609dbee234df4e0eb8fabeae981ecaaf9c5684d4e3d0ca075a0a4dee849ea6828901d5ca39d8275808c71a623d8 +SHAKE-128: 8451689339f873b86d8a27e3e56323ff0b313f6342c15afd55ff9593d1131d5f4f8c192bf426c9fe754ad1b8deb9fdfdae9241c8097f65abe9876df0ebc07a3877cc4265ab7aa641f98fe49102626347d40e35db8a531d8687433f83ffbe85e8f7fb33e098e88e18bd1fbc61e82641b74b7cc8a7b27ae1b1cac28c3c2e70299d7545a6c9aced78783809bdb10272accb8e706601a4cc0307050591ef20189fc7fe5888f575d10668975115d53cb1b157601dc4724fd31810758af8863341a4bdf2bdc5a9f663c07710b71e7ac3f588bc7ea342fed331f87462da288ccd1b5f7d2c7213c8094af58fe7f2e03c601eb7ecb1252ae39b24b376597217a8aad6124d1bdf385d6b34201a62f6902ab4b695819444aa38b80b31b50862bf02c72e57cfcc73e179f75ca3637ac4dc18ea5cfedd0aad7e017c5d439949341a5b34519196fc3793afc505c17803016d03cd939a852c5fb2d4a5bd10238bfebfcbeff8e540e4e64aceaedce7251a41b5b08a5eeb85e539592bd5d5a7260dbde4a86ffef72102564ccee65cda58590ddad3f3a2d9e16046ae0591cfda8ff280b12f398d51a69db32e1b23ab356c748f3d9d02051990b0420cd49d79884afd46957dc2c404a64cc7b16c189c2f8c0f989762087edcab14bf00cb09faa1dbd03aa70d73e2975ebadcd64fce79d37931cfeccb66b52a81e968c91bb8a8f57af62e78f74bc3ec31 +SHAKE-256: 4546c8bf6a7146f38555999ae79ccb6735fbddff3d6fcf0272bb3e7c41d26baf96f1ffde9709813c9610372cbf40d7fc7d0617be61ef1579811ac1fadda1304d00ca30388e04a1dfeeb12d27fe05e503182420a84c36420b3d133270f3fdbc84535ebe8500a57dbb11070713b8f4adc63c04a4819155d4d4a8238d24a2d3cd5afb37b609c6105c21ad3abc6f798758573c3b728d9dfb2b2d8ae04f9a061a27c6db7080c389f1563eb9e1de028850b06d920fff426ba81b6ace384208556d896fe09a5152e6363ab91f47d3b4747b175f68a0d3d0b5eb4cfd589f8263d535e61d41e4a73bd8282faba90c4332fab362982bc3eb35ec8da0a6237d5d5fdd12d56ce58b445c465307c8011c34c4e39eb1e4a7622272bab7e0c541368a8c499493c69439a6126bc45c35a74db4be1ceb5cdf8a8486e4f7be2487c5d8c7b9044adcb788a7a434d3de5c98332273aa440ab698a01b59bfbcd9d476ad7d299c38a79975fc6fd867d454c65fadcc894fb31e31bcebe9e53b18e0b6b9f68138064cfdf2cb7dd89383628ec148557ad96da6994c23f7da0171855284dbb74dbcc35fbad615daf132e257b024d8b413eee89e954cdfa4cf171764a529cd7bbc618d143d9aa760d19c41382a169f776db783e68187bbd7b17ce1eeee3931312f6c77740e2c8d8877f07b254756bdd38bd278008034f652ccf8491c16c88fb6546ed9b996d789 + +Input: 2a356c464f2b73e17155a58472d9c72d3e9c3827247a708a04c61d231467594acdbd29db8646f3df025548bad45ed31c33e4138ece4fdc1df5e1b973b1c2e66bf9f5c8f7c851470a514b52c8c8f9e7f11eee03e7249783ef0e4e0ebff7119db94abc7f667843aecd14854aca39419a7d1676a85035fb1a5a83769143a9c2589ff1a6558427fd031585ce7deb0a6810e3a381dac5c8a4ec651bd5027365d5c1bf31b3fdc147dd3648dfd45cfd0d015217220f0a0e59787a9d57bc677fbe2204f5325918e55b2a92670ae2fff1a573b78d3396d28be544b4ae75a78ef9944f4565a788d63fb810887c24c1adc16fd6a5b50e3edcba4149f0e959f3cc54873e910fd8e49b7522aed9fc07ef06a171c780d6b19601ce3f1014995b8ba9f868f733a87f74bc148312b2741f89cb559772d3a6ddaf3d83d01ebbd2a06646c228105d44e0eea9398b907a54851eb626f78c0962ae5faee81dd75dbeda907a0ad25157f4186e0d05fefffb840ecd8214fff883e5d8a2bcb6e14d789b50c48bd37dad86922c0d6f5b21d563a9e99525b076010c5e52feef576732a414f5c11e3653c9df212dd2b359cdb1e7e5663bc67be88715ee5e7da6253b5aff1d9619a19f574d257e17c4a1075ba0 +SHA3-256: 2024a961aab0cf91adb92ba9d8926ab0cf953b1398336b3ac73fd337ec8e261a +SHA3-512: be0de68286aa9cf357ca3bc6d0e8479a512faf1ae14f858576be7b6bf6c619a922f47a68fbf61ec5d8021ca4ce28f08e433beaee1d9467dab6f6f3b48789bb15 +SHAKE-128: 7838792577c9b2a2f67d9d6be15bb7c136d13b5d7a0ee2472c394ebcd05c56f461b5f5e64c8af796086df97124255c8ca89d70da080d7e41e2a22ea883b6bb4857c5d377425cd447372e3276cae78537fd39628f4ea14a195434eeeb69f1d551d1bcb47e2ea0cde0b5765dfc421ca584b7e190abeeb564525695b144fcbf14f4b94972f7ae7036f128e46f7d8a6eedbc75b65f74de4b3ac70c16a5f565f7ae9d0ca8040a1db830580fe44bd37d8a5f62490a9dc1899a5013919cf57bbe18a9b43f18fa6260d5a2b6748e06d5104108f7a8f46ed1d33696bcff3ed1ea6498cdde4ca714021ba244c46f38c47564e9f34f42bcb7a9dfa6a3b4aad78c078942b5ddda196d42c13f5915d39aacbf682b60505f5d8f5e50d828a64f3a41e3e9ac1d0303aad6a49916d4f233ba0a9c81594dd62295252a14ce42703d18e2fcb6d86f2faa779e988ff5593d2d20d848287d932004d9cbd735b1a9b38f5e48ca970fa735451dbeb51c3084f427cb92b060b57aafa1118366a68278bf69bc5a178cd109a3ee51361fb309fcb21e825acade58cb9434631ea53d4e18c0882d4c7b9d36c0530291100259ee9cf86b99047eb9b793a55bd0ccf4aaffb62623ac1e66f775f43187a38f2630c181a324e9a6935654070fe2cfbf5b5f7eda238f7ab22c94d20b7ebc947263173a6725c9b322ac4448c466810d23a9326cfe0eb4d11071c327d108 +SHAKE-256: 16b3d2929093d3c744614a10e6497809e304dfc99fc5e8f8b4a76ef1795dd72664d6ee13db3efeee6b1cf5319b08e3dcc449157e8cce46ce5363b671b7c7b15681421e74c844bddf62af115435eb84eef836026c868d22c60b2c098714b47498f0a2d9c7fa9d18f521aba37288dc3521c1b6847f3680d79bae22052b069be765c05c8ebf7e32ea9c2a1268f96553037d7125bd98bb31e9fbf2f2ee32c642006661418812fc45167c3a66e9d0f47b6c338774792249663bbf0751e90371aa6c1b3b64c21d6f7bea5e84d611e3cbffdbad44f0d42a1d0655f736d4e9fe928642ab50f4f8e7a0b8e0d7ddda046d5c2ef638163a1c6e8792e4ad4b46b1a7a5c6353aae320339dbad56b15008882e67cccc52b130dadc07b344769e5bba8f00e408e39f34fb140943357892765b40fd3067623b135d622a75ae861f4f785718f7109b716a9d9f0750bcc1784c32def14ac857c297e1f9244fd82eca9730da297e9901b6cc0f033369012c53a431d41b87c3a1260fe6ad339396767a1a8effca8402b99d436ea6d7310ee04b5fadfb87475f99210577587a00853341e20dfbd6c53e78e9d39ee6f9776e7951151969f9f125d0a6ed91a5fd249c1a8a4dd183371c2bd81ce4a2fe95f8c5f37a20c8e25e24de9325ad531fde70e80607074afd3d12af0450defa40011dbe70e78f34aeabc2cd169281420fe4109ff72ef1073ed706ae54 + +Input: 388ab05d656084264bd2b47820184eb2a3f546a13335dec58c79c3d8b604abf6402b3c5d4d483d43f02637504e388d297085090b7f9e5d48515c54d7cda11fcd4ad5823d7a387c08debc38990d859ef0e879bcba73450aa54f45ac86093f5d998fff522395f3825dac12f3cfdbccf99f5dea304f7ab975b634b50d6dfdd51f7560d46005cf6bb735d35cb56776b06014e560131d8474e4184199770e514b4395e2a979cc9d51c832e9014a6cd467a5a49738521918b944a2cf95cd4e0b3ef6e98687c2c10a51eacb3ccee278b66a93b3208b2c8a73ef7b19fad8e454593804d9dbc27023e26bff8e7cf9cc8d85102a79d2da54ba7a1c51dcf8774ad77a6880247411b5446a0821050eb27f354da38a727c059c0d9e350e7cc604edd10e5335f98954b364fc41a752e7842e66d9e32991d4aedc2bf6b34b87fd914f726e0954ad8eabae101b866ecff885d6105b095a3dd5508db9cca7f7c688febf82a6f7ca9f340e237d47ab74303293f51e776f1328b0df5b660d5bc2e4cc78d70db73c80fe9fbc8cf656417ec6a4a702bcb42358f6af705bebd74f26c7d80abd90d022df7f10e66355cb2d5fb4b1bcdd3b15b9bf58eb49f3a9242bd7434b8966adf3545ece427c2b7859a1c1 +SHA3-256: 44a1bb69a67aeef6ca70ab777b18f0760d9f888381d6f54ee581afe4a3fdc087 +SHA3-512: dabd8f52ca31877f26414ca538443fe8c7d60822c068806485a5fbc46eaa351b04c017a20bbecf60a88af9c8de3139e836d1bb322b8a5868daa6e2c88e2cc0fb +SHAKE-128: 0e5b7f88db52a81fa6cbccd1d45e5170494efcf8f5ae136a12fc9dee14364fbe751804741cf6f7b6cd6c20cce8e5c15f4849a9c117e5b9a81b2b04d868b47b64d07cb3f1274c9b80a322eaa95828d5396c5b758cbd6f446911337b5ab9384abf8a29651ebd1de01a91a9acc11ecf32e86d6d864547afcbad7be937f5fca42b5696ae5ba6ec46bc97fb5941fa066055f5d72cb33a14b07e68be6c551f013324c8508b55a300944ecbc59633a1be655e35314a5759bfc663a82c1c7e543a2a3f89b5466bcca97f9bc00a6ebe0170c35e56dc3981a0dc8bca151c724f8db573c58b19ecf6c1b2ab8b0ec7bacf14f862b12df0a15940338e45bc2ac950144c232e2a763667d8dd8515c641f2306a3e0fd90bf1eee68fb7d166c40539fe64cf7e166083a33481b7306ab21bff9ca1cbb97e0ed7a51c77451187285e0ce4407b4dc01c76f5a08e95e1a946764e39e5ccefc1543c30a84cf93f82813c6ebf889bcf5819054b7a4be4c3104a448504683f80f1ab6ff6e1d01ec8e57652ae62bfdde7e3dfd4b71f840c0e25a6aba24d24cacd74dd92e06f79625c43d68aa2f05952e51a85496c5364c229eee0296b9a461cce9c4c18df65138ff639b3e58504d83cd7583655bdab578205424e6cf27f54136f02c5a9daee21097e04dfc9111a558999ca5a819abe461705be70a10def9e6246a365ef01b206751ea0297fc8fd7b8f9c81ed +SHAKE-256: c3fdab9ae16e2bd8057205208a91b2a62d0eb303ce6eb5be949a94357a2b31d4c048ef4c3a6f0f7a4ee8fe2606de1a3525caf1985ff343253928655c41606fe6aba604c2906f4a73ada8e64d0a325089569428df784c8e4a3e6885d24078acb12018fb26842697823350a003d9944c30c0a93f4c75ac3f7c097b01d5217cb08e2bf98ff928d744aaa3843d21a091be0d8e3353b3a397e166c2b575f4af8355c9dd8ffd20efc53841ca3866c9250a9ab58abdc24707f104d26463786c28b63d21c1d8fa371208b30bbc45a31ace2b3ee843f93f9f101bf25ba2a304615b1711e4504f582acc6178a12022b9502f6e7d625f363068ea57fb428eea84d2673e5e69a53c7d57fdec4aad8402888c33433e0437ededf20704e881a7ce9effc7b97aba2efad3ccd1ea8654ba2d2ab1d9382f966e2972862b3a8f8221cd51062e7b6b7b8a552954d3eadffffeb916a9bdbb1c7ffe5d8759158e358ef7af1666f4c0cb4162425c46d2b657217ef156ca87d82ef06361d19889c46ca3f01df997d9aa791c584ec26615b7ad0ee94059185f371afbebacfa2f682c680c6f0fd6dfe4b5132f6bb85bba0968fce37ecb99938e811eb54af9e671c9e335edac7051d8dae33aa3827f0763f231880ddf35a9fb05321c1788b31917ed7bf91abcdc03d39576916969c235e7e4112f4a75a7d55fc59f28352cbf9117d46754bb3b7da05cdb7810c8 + +Input: 426fc389980b3e9eb00a56347fce308335a170aa49ed46bba21b81e4f493bfe95bbc24343ea7fa6062657eee750cc62694ecea335a7ba5a9deb388f9560d84b51ed84668090dd1d95cc7795e04f0c3e69e5c2387447170fe42c36217ae1359fa5151965c50f15e79cd0dd4503d6ccd5153ba2459cfba4e9141ba4c972e1539c260e0b8bcfd5875dde0e61c6da5890d4ceef9d600be5cf7a3585421ff34a45ad1a5ec05bb8cece330dfcce6f8d9c0ba8dd210f65d9ebfa0584a30b5aca028b492c9e71d5fcfb9a2ac31e866e94814e4efd122209593084c10bf2984a0eab13236210c729140bc0c042c3d4ca4c8814039f799139023979914712afed7b713ad8e3cdcc54730e1e73f2dc7210360e3ba4a66b3751e10209bb777636ae45f960de2b66b801826f569834f3a26d66ef5f238efd38afa4eb9f3f89c43fa7c00c427de8a1a9fd1b036379b01e00fdf9edc5f1409dc0b24fb6b7326f60b148d241ebfb3fbfb37e315c8a8d5855ca3873c2ec12c43c3a08cc74c880b8574cee52a6ac902abb7d802463475b7ef994a40c8851d911e6335a6cbec3efca12478e388d3aafc61914762ad71c7a67f10f498d3788bc1031b9679d3ae7a2e3f4e7ee25c08d09bd6c95668f5cd99d0 +SHA3-256: f0b87945ea36d101fcb0dbdce3a0e17542a6f73c3d28bf1b405ab03c98780da6 +SHA3-512: bdecb75db800eb32bdde34d37daa8c6ef6e37014639c418bb63ee4f803c79b984920cba983143e9c7cd96b5169e1990b56116fc5bfcb0c9a2885461aae4b90ce +SHAKE-128: 667efb50210cf97456c693c4c5afa0db8c6306e1a02b1cf77368fd2afcf89dd3341484022f7f8533378750372ea07d03743b2e6e0e08185546135110fd0683b092e283cc96c9a99c9dc11284b6f73dbd230611c0f1f29a9a74054ac5b2512c97e6835ac06c385a9af2fa6d6c3de82d5e29cec9d8f9159fef886adbb02eea392025c5b94be6bcb106cb61f5da5fdc10942c11563f80c6cee973874a881c585d6c7c60c839f97730b07020246f88c18e65000d7b635e327aa71513b7f84095403743659b074fd254af80a4fd75ad850f9c6eea73c7849eefdca6649ee5c67884296c7a2c051bfe8d66c5c6d3b31ee254dbaea758f23b13e956cfab5fbd28f3d49e733b1c0fb935e2d86662c30afe413815826ae275e2b8fea40a95d2cc864af89b093f31dbad7d4ab3dac9484e76bb4a83170ed1b0d3df08f6eb5c679ac53feb9811b4c697ab97ba4cc2c86d0154a207f256477a01ab96137741e9fcd66e448c08da3a03890f54961bc4db29b33aa20251b9f041749848d0d72a770038aede59b6843258a67595a6c86706f824eecb6c36ef4f5596858a295cfd85e1b88f62aa9e354f69561c0facac07f979fe8e75495fba1636350b8a3fb1a09a07c11be7867bd525a278e527a56228f311427ea1bf7f3e28b27fc36c01ae93abe7d35b6206f9e313b6e37d163ae42815e02493c19e5c2f87e0d74b0d46e366fbc3fa53fe6c6d +SHAKE-256: 0713124a25756b723ea120e8582714e96c5ea0fbfdad350cefd9ee2025a2d2dee859d51dc1d773cdada1113c53a59ce7172d1187610155a13926966c6a1821cb1c5b2484267b92b7da5a6b5a6446cad7a881284a97f2ab25b15b21d53e1964d1bf049cec6904e0fb9cd8b0e835f4d7bf0402f0a568875a02912a9c866547a714057e9734aa1cdf9c42265bcca3465df3144421ad08af4c112b724735dfa068506796631b8f4c9975c578626b98ac9d5e4d292a5e980cf8b4dd206d8f3109b625ea99607bd131ba067dbabc8f9b8c27d95c5de5c8376555317a1e747703cc29b41730fadb1b37307d4ac548152334f384a55d27e35707f925a0d304a1602b047ba5d1dbb79df0978118532f77a548e54d554948967804298f52652fc86a81f2764202114b97da359b1d9e1de99c2f228098d176b65abfd6ddfdc0aa04490f68e9f111c27b4515b1cfeeb8962b5842d194490bded19be7f082f16ad6f8ac16def2803986e1d3052d0d21bb1a06128f691c31df699a4380e09b7c4009b2eca22c1b6a7f393a3f3828e3b25fef6bb48119b648be015f1c245ad4220d633c89d4b4c68b403863ff9f6fced1dc7594487d31bdb478c2176f73ed68d2fbb1388da171792496f69e0671b31745086fdd5bef77de398d89345aa57d62e068e754522608c202e8a2a54d493c5b998c565e26fe83a23daf82193aae68b2409f3ae461e09a7c + +Input: e35f594f413c5d5f7760f76061605ef51611a860b386552f95272836a9216b8bb4d9080a0ec13dba44837ac907a9d34b14791a7ed36f9d1d691647f1208d50b9f9383bafba9899e5a2a6610aaaa5967d432535a3bd7c3aa94be2ae1e469c90922d0796698fbab7104bb045906a73f7340528b86b14dad90f1ca1d37c5d28945329d0d0bb4b70ef501471ae48765703e961c1f5b25a73ab7312cf9c3f95817b041c9917187d22a7239ce56d5e990b135898b809e77dc443119b5dc611448c6e55e42b13882465c50fd026fa598e0f392e5551c64e9a09d94933c59455664febaf3e77f1c8c9ee86a95e6b345a1be493f2847d2abdd98e459fc7d4a52ce44c3f3cd0216ee2432cd563a2f621cc9f743c6cad55239f02d3610b4b20b5e012398011b3bbc0be7b1d5399c1abf3824f696e1da03078dc9ab095f3608d92c748fb895d73e3913d19b4a6a826d964c85835dfc72630cb2faff4a5f445bac39998e49306db56d88a5619cdbcb94b43eb6c1f5a406f00dd860570d403a06a4521d00cd4bb6494fcfa34bbb980fb5ab6c773ad834ed452c2ac302c8726228a384a2f34d941723ae192507062e12b1dca5adec3879e760acc3bb1a30947a842cd0af75fcf3f14d8631a5dea98247f +SHA3-256: f0371ced8b1d53c83d79f0c12f9c7eb51ff3395cf8193818728a1f834629d422 +SHA3-512: 8dff95fb245f204f3778895d9f907fb04f71c2d218fd4fceb8f3f7de52ac3c18486a9d95cca8b0dd60f3e11fb23d60be7a1f7255b51e0ff39455b2a94e2f6497 +SHAKE-128: be7f6404f94f2a45680a25a14975f5e48568cbe119f1038f1b4aaeedd62dddc6ea206dfbd81fc31f70ab83b563cb1441521cd42c850e134f9d6a2fb2d9d24d99603a891a94af8e43985c64bf8ac8de3d19d7fa28ab5a92682c1ba4c3d81ef758b6f603daba26edb5298e98d86b879701a1db43520884ecfcc1cd8fad12982a0fb2b3e1ada57ed383429318e1d884de8bf76b75742463ac30b35e85abd977d12b2960c59cb27fa1e3060a23e5e5f430b417bc0a36a5c04f8cc12f1dc24bf8ecb5ec3fa96ba3ca20531aba82baa6abc5d3c69874e121db16412ec8a55f1cd42004981c71e6dbe0723cb8b6a0b499973fb5f2424cdda52335d3b25d7a5eb04c3e33c3889226948b6a41861d54062c00a3224205123761ddeec38fcb11ee8e99107f02cedffbce42f796bf9b381ed00969cf37ecea9d27bf42baab6efa55602236c5e50e38a8e3b0b34a5ca039609bc6222eb15d0b878c68a417136ff4080867a5e1544c5c3be5b659761851473df014c2b585783a9005d02ee9da7643560081f3a4814623a67b4cf5d611bbf76e2424025457c8f84c85883656744977bdd8a1e666790de33b1bdf0166946eb3b566dab45d588bb7bf35ac5c284ba380717d25a4cffe13d1dd741ddadca4ca208af993ceb324705cc9b8e96a19daabcf8a849cbe56c46b9b047d9338c3daaedd16f3afa58a35c0f9de7a0912ec1228b412f139e66a +SHAKE-256: f14c26049f0c918d86f5810cf50ece65307b20cf8e10413b231982663695f8ffca09b09c504d7c76798b2f28688ca005e055bfcf34fc6f5d8d0d71a4ea550f3eec2d67d51483e4b6c9d9a5f9dca6632284fd9c99929b8357dc96356f6bc393743b6b6d9f67781f45ae44425941f57bdea2f69f20f25224b2192dcb37cece2c367416893c5e604f3c70a9f68dc0edd617f2cb2c0062509e52998afeee66aac9d27a0fafbe65641e50a585acdb618051912c8d3bfdd1a83beb9d5c6da945734a3877e6d9551e63ab4af42b575373402528d582129799e3079e6c0d8ba52899eae277d1ca574c351d4f3d0b03c808b8cc26724137eeb6242ec86168f7bc6298f487c81fe3456e4d59cf70f6d4133dbb62c45f5a939f137c91bcfbe98e174992b77418536b9e63b5a2b4200233d0c25f6828117907349af38bfb52feafe30a3098b9d5c73f5851df4982698eeca17ed1922925beccc26c195f57f174de9ce17ce889018b8c7fb143327089c73eb561b1f6b263e8911f099e771c43bc73f8da1c86fb819c4a184eb66da3ff1b5e10f78b8fe715e7c34c44b5d07e526733175de01eea3fd20b5753a2b528b0f769ba9a4dcf6abe137474ccec5191e42a99903e75d51adb5348de0626d4d614620ac71a7e8e26c5b28c7e94e23d08b6ceeb31ae91d9a2aaff4ef6416fbd9c4c128d86c9ce16ac2f2ef2ba18df0210cbfccade94dcc795 + +Input: 288a40d07d085180723f0abd3fcb73eccc8bc076e7e168cfe0ede84ba86a8229bf3f1456adae9e1c3a57408da430ec2491761c1c114da67a3e6368dc06b86edc8b748c6f85442b3f191ad0924248fa7542c7d02231ae85c90da5ce64a6bd7740a621d7b9c1f106293210bb166edc2a6039d180bf4ab9b33f32e1faf5b09908c8c7f43f74e0497f9b36e360fce7a8bae824f83cd57547a8206d305d522b7de3ea011f1f986c73ed83528bf3ad52600ed1f4434f61cd2f9a5971defbb25d62ed27940ed97df7b05ec7b3b2f23d474544716c726cb3adab3f8123400fcef6cb0fcd9b00c1954b178101bed74c15b0fcce850c43a4516f66721b70798d538ad85706126e46194b6ad5e991f4dab682d9cc8b8c2f8bba387e1575dbe5d39d573d6e07424214c6e74b09e5533ba6d88fcaefc996abf0f43bbbee17f8466a22cc324316a550501a8dace6a64fc1c9c10e6e56e79b9d905fcba7cc50bb6c079fda5f3c2596398087b83b0f74751f97a88c12110c5a703d1a3239ba8e3a148128bd96dd949d516a06ac196a36c491dfc78953362d9a613c32f737f62168c194e90e7bc0624914f7e771cfc6f8def06e4156ea1a319c76362a930e30762faf6babcfb07329b5297aa64cd4a15caa45 +SHA3-256: 6cfcdf957ec0fc26f60b5f9aef850dd936b24f029a1d99c8a84dcfef062839ff +SHA3-512: d4de60d90ce1aee11d30b91ecd1d9f9b35992d7b6773a1637d13b03e0a08eaa3a80f2aadfe10810de47d963ad35447d765915d3b4b48ff8ec49c2e2dd262214a +SHAKE-128: a3b6057d5ba8860dcb588eb85543cbb7a0577fb988f2eb73ce8818c29f7e086c9398827c0e95112f9e4ccc19cea74bd40c49fc519af53b3316cfffee883e6a854894405ecc08a11cf2c3e2856bb325c9491f68747792326f5a09c41d1e5b0d016843f4b5b701209abecf9067edca5bd50391f70016935d8bf97c34b4f00243b955a96d3cbfb1c1e8e6b32a795c8b08350f434783b71384f17abdc0de51733786eb05de0de423859537f4b493889806ac91d9a14d460cd695ec2eac29fa8efd2894630ccbfc69935a82c876757117301d6d0094f47db76e73f8614f4f679ebde50d656cfa1e90cfe06ff653826c18e2e3659cd019f12ddb9d88a97701cbda1a59abf11fe2e354833210f3e372c21239989b515c22ba3b4bfb5222b4b5107e4069f09f6c3a2d5537e41ca07799df231b7281f499aa223dbfde90969a510690db1e5b8552487e01ca3f1722d8c304fe873eca1ad567ac6b47b73a872002177db538733b435e1fd67d134b647d3016132d5f7fa0698b539c368187f25890a6e88dd3bd94c5b5e8768d906605ee6cffa18a5ebdc36169f8874113c0a43d78cd72751f127960bd6812f85884a1445907b0bb9284f9f0d59f60f31deb4c16425d9e23d3030f748e7760007ab10487890cd1e7d8cd1762a6aaaba3957d323e7401e07e190543a7bc00bd9966ee705da7fa343ff547ab2cee6095e8c36b05b378e1d636c6 +SHAKE-256: cf33f3e93bc45406aebdbe80c989c03c4a9615830fe84534f4352e6565e124ae40186cabc1025df9bf8637c0107329341dd9f6bcb542e3453d3ebd6c2e060c79fa13a01587a95870ee1bc35aa5726c47e830c0eb619ecda12e3eff8a2b012e62ba7107a8f1a3250bc47d5fc43a2437df8d2f5d8a1e4dd8c36b9429c620c323e8dc80f2bef5f197e5792fa5936dafd4c7b76df72b68489faa3df46dc5985c3756a79ebf636f7886ab56d9581e1e30353cfc7de57442597af7e6de26a419cd44a7833f063faff6a71f9008221e332a57e83ec64ef2c43b5c6e1fafd83152c2ce79508298d9698503d585c46ed7536e684b99898cb5c04b3532e364e9dfafd0796c1313c6341e4b798eddc69b6231009fb21425561ca63746cb1d089415c1c24320fab89cf039fc25a1dc1d8c60a1deb126c43c0b49dcd468388e015404fe002d97dced216034a04c489b03896450d53249afd87e7036102f8fcd86306e835de2b51d722faa4d6086cf67c313b87eed6763d16e0c6a635bd0e1e8f4c06dab55c4134991be23b971b4eb823bc899180f197992b1592e107a40bf6c042554f064887f519fa97962b6f7783134853b76fc874299986899648d7d8c41ccabf2ed0566bcbd4938c728485b65346530ec170d3694e1fc662967cb51304bd5744efdc94b6dd0c817bb0ed3ad40ca1ca9000e11acf5fd2667304d69f80b8878dfe0c82e3d6d + +Input: e4b274d4f3ebad86c87de7b19c1131ef6bc5c9d9c550304843edeaac354957e70b34bb36ca1f82a134875de9ccb9a9b6f16942e0def4da2e8e845dbd0e1875db2f88735c9cf54eebc9333f8fe3f4607504a9c372a442f3c420418856a375d90a84a98a74f9a584a8741b205b7a7b6fc352e7f2efeeefb2d2c40ed1112fe39309e44c6147668494cb36cfd8642d543183ec56a4b0e353f8bb95612a28b839683708c1103bd6b58720fc350c7cd5eff548b28a8373388419acf7ef3b415de028b68465244a7b13fa406c9265a5d400196ae6d51c541f1e78c2a02c133ddd667074d7faf9ac39a360022e53714bc76c12e3d1d1e7ab97530ddcc5ee85289bb050a68a0cddc169bd9fe2350eed179acfb93c6016688614497049d223be3c50f028b7c8670ded12926f303e28eb6f8dbb2d20b0ee9d0533edde7cb726585fc071420dc6a7d96615f819427f6f247724f2b2a389fd665fa3a8ba40a0ae49dd3877f398167103fdfed635bc0b322d261fb9fc8b7cbdd6306f995717189e24cb5723ac43592636900591b28ccfa3cf6d9db1876ccec1a69fcf387a1200ef5be417c8a59eb95b7b70f54a03021786d3b3085f931721b2ae6ff44b2c2cc6cbd1c1b708eac510fd2974a0b6075198fbc5 +SHA3-256: ee5e44a25b7ec7d217ef5a9c6dcde7a7c9c1a61d4b1bcf8e3e9915d3e3bccfed +SHA3-512: b18075b727382eb32c795e08f62626ad485486a38e924b646ac3ae690a79b1ce5d892e79af3ca23b343936438858ab9127a7d006266faa32f44d0546fcca4b3a +SHAKE-128: 5e43c51f407bfbf17ef552e753e48689943b094fcdc371c4a72e044c91e48e2a5a543e1fb1ed217415960069d80ce58270ef7a14d57f8781c942e407279871cb5d55db4cb5af1a0a289400b1394a4acccc2bed94f9ec0ebdbd76d7137326909b1361e660f8c1e1cf3a672a41bf77b8c6d364477815249d98826cbf9604567684e5817639e10ffb83ba43e8d84254a033b1995b3ece9ab2a868e76c43451dce269b9a86cd1a093baaf3d8b2903b17398e74cc3f6790cb2cb145f73997b05f796fd2a725f070670a662ebb18f83763c3d60fd95374fa95a26ac0b39976e655644f900454d1bf13835068724571c6ef73fb08279da77df8743ee23455846173fae0655d903af8bc56ef191449ccfb30a6b91173f171a645aed023c4a9b31e144faabf1189b255a787aa5a071a22733afcedb61b094b9c726ea29c5bf1d0909736e4f6778bf895992d8bd0ad7bb1d1e742c76df08c2981fe7db97188531eba0f60bdced89ed592076e31257037747bff8f3afba99122fbcd509006cb4f6e03987487dc0a8426888d0616935e15d9c8ef4ec234eac61d9413bfc518f0616fed59408df29819ad0634cd1786a68ee1b3e17f58db943126eca1758d65ef6d06f7f69a75f1fcf8d98f0f154dceb20a3847534d238ca755b48e40b227ba2dca29df64ce326e29f311e6150c0169ac87120d179f3c0de7a080fcd33224e87a5be064486b88 +SHAKE-256: 6577c5b08b205263f0817ba9a0143737788ab67057fce0a05ff49fd0b203c299e36a4b9160663d687e11c2758b704698294de430f1fc2307f63e5d253d9de57d48c4df90f3b02d93ca678800cbc4198c42fe9a1fafc2634b115ee1657cbc8412bae9ff48da59261e0435a7705298e7246e815478ff597f2cf4a3b653130f487766f5f9380dd4e4adfe731bbce10bcdab8cfa1c4355ca2688cfcefc816822e08eff1e71188d83f5681e6ea2d6e1d582a2d7cb587926072634910930eaca5d16d76614cbd8ed42bd9976d7f4c72242eb7c0fcae81ac72c2315fa7c9b2842ee387fcceb47ddfd94ecab2e4f81a336c9872c7ba7165a62a4dd6594986b59f37c379b138c27ab3b9d928ce3e5df1d09828493ab9238ea1f36e4d386701cd154a219b9357d130456dadf0dfd5f65a0b0eefaea42be9770a3d5ed24c31e956dd7ed9391dc054555c13b2b869eeda2a9c5eb6383adea7093edaf08f16bc4fa34f656393563b13cee635f773c3ed96bdb66cc4aa64da86553fd44e35c7aa3c128891bb0914c9ba88fd64df3992d01205a0b9dba6763fe70dec3f444df22b97c86fcca2da530538a1fd557893a73ad3d51b1df8db19467b2c8737b61a409a2e4bd46e1cefed8b4859eb64902bb10d4913c067b40d9f714f1e2848e2ca6031e5c5489d2c98bbd65e74e1623196d5d84161c0b8362d9db14c5c89e41790da53f52964ec6969b + +Input: 64b6dc4bf2d25c2ada9d1ff1728fcc2a678c5482e0fcba6a7fde65aa76d3b4792971495fe8c8741795aef6a3f4e2bad3e16fa65d93a9daf1c7628949891ee4235fcf0eb166627821beadb497318c5f5e6bf52411d3e79b7d2bd5d16ee38cd7ce4e993d25ab47da4302bcabafe15e651ce51390dd96140911cd07c990f7055f8b2a873327a79190de7b88c7e10916e7fa8d0efae70018d704e8ce25484946c17813e9554f3c2bf1ac49083e285ca7afde4b0a4df520ffdde63e5db38ede6ccfeed1e817715fec0c6f7117e629ca74bdf8a75b57915ea8f71c352f78b9ece13ce82a32ffc535c8690eb9456e72c171f3d304ded2beeee1ed98d4013373226e3da825b3d1d2e42aadd97296b7057c9ba840a0b9f1c97f055c57aacd3e1c948aec7dc826794e6503b5a91a0bb7c62744f61b2836bdcc39b5b42edf689b21dd90fb0329142283a9856344c5da5c0996f52e028dce487f3fc177bbaf1155f4c0bfc9722769d30888c0bdcacc59eb6ebeca4bab7418a16fa8600f6cc6b14bdbf9e616fd6f59e7cd773388c998fc7f40729a34eaef96d44869b7a0eea7cb64ca3eac02efe08c9584d2611d7ffc00bced356572ca8f594d7c80396cd03dbc32525c250aea66a05d67ce0134d0462a6021 +SHA3-256: 2ac590e219987d88a7f00fb0dc30077c62ded8fed2fb88467de0070189929a0c +SHA3-512: 9c30f5080adbb2426b59e701484c519445ca4caed469eebb98bbff06109fa331f663b9bcb65390c744271c25c83bbd9f2c989e5cf502383cd2dbffb00e2a9ce1 +SHAKE-128: 77ec7bdca874afd0d205ae9f5371c295d91c9114982a98e77be26cd868b13401c815fba5e0bec8d8bc38b060161eb2cb7ff8a18a5807f486a85ddc133aa97d0e3ba5ea28b9f5da9b01c751cec820cbc8bededfd69513eb09f26931b31b4e2e77fe6056987c8ea72154067b0e1a511c4bc61c20cc6f90b4997f703dc292d3d6e5c6ddd5c3b48df190941b385337102fedca82fec425ab1ceb7f9972f6146d913660453a9dff075a34a14e9cb565cfdbb30e2c51dc3e81bb7a8fd173d1b7e2407fca7ce2829cdb669945af40f58336a6470d628a806f657342f9feedaaa54364cd2d223d7fe6f55e03fdcb51043422aabf12e7fa20a82ce49c70e8d7c816f96c9a1f8033dff4366bad9297d61a367ade20ab324be71547506fb6f099e376532a3a5673909e8e2b975d3ef01657c1317de8d6f2fbfc8e47663c50c2aaa02a668cc507e00f6f6ab130574f92a9eef856628259b4a7ccbd051b1bea67fd2f51e207792a5ca7ebc7a5d4c72a010ce45acd9baa4a64b24c2278712df153bbb2f330a87df36da2ffa1030c0a149f69ab076e9abd932be47428016125129669e11cc370ec10514ce6455d297260758303437ac00235ef6ff0d1833c8fc4e981db9a12dba7bb5fdc3ca18d396950fde003449e42a2e303ce70d41f627a3ae57b370cf13f9e6dfae93b454b7bcb6e81c7ddc42a71dba7116c8df79b75ba92c5a88748ca2241 +SHAKE-256: fe82e0b1a041795c12ba5c783151d289ca558f6a4286051a60588d268c64c84245b3bab5782464b612d4ab573ed361c9b186f31e37a7a6a65e3131b925bc84a554406b3e8c6cac71751bf80f22985df6bbcc54f5ca84727fac183b55b096682721b36ba2f460a6701a9a604f984afc01c94040ab2fdb319ff552fd8f1767aa52fd97b4fa18fe380f11b99055c41298f394faee39872c9cf140ecc8b208c086f3e4bc45689bf25bb4caebaa44ebc3878d59a22bff45548f2f9494294551c250f22156b076b65197b6f12011319db3387ebf8d0a42025e4de6df24aeb16c94b668c6e4c638e0df82ff171e5a6881358f79d95b7bf589e4c7e1936cccf0419e5bbf9e91736faf915ae68fe6b3a37483f493bf9beac17475009755002ceb8620de5c6ef9c2010383f5266371c218b208dcb28f55f49fe3895c1f009106c80ed39feb04886d23a76c8280e29b41d53f22562329f5128f7891ef7e634a860d6db15d8258d0ec68439077b84c652c62c132eae6f3afa871792ca956ca83b21c2ac1366bd76cecdff9333701bdf49e8e92147b9d0e9e199fb2f0ff160fbc78ef3c3f46de64c8b0b475f98a0d01c5b851a1a6d998274fce9ddd8fdbbb50ed9aa1283d0855cc85e6097ae32270c801c47c67a0923023070768a081b06129057c29d2c3238697a750bef11d132b59a484a0d27d3c03a94e9ef1b1106fe1c39e6f9c9f6fc2cc + +Input: 2a9ea0a0d6a008b539a51fc68e19071ce0658d13c12f5c5a2c05a7097d52b4466c21d3428c2bbc63561bb4c156e2474b25c03441fac38339916c0fd8dbdd8fe7092e19e1582b958a55bfba6b0fce9130302cad3431d0e4fa948ad65cf968168c9ed8a9a9e3aad2f6b4bfdb14403cbcdea75a61386e624eb4c87c2cd581c9026d9ff26c152596ffd84b3581c3bd6a9e797f8e292276cc97f43c1d62c27008984709ed1aa22459d0d58c52266a2b1b37a152970ac910e886a41fa9455a6665bcd524b48935ddf844d0ba72a86f3f4cea4e01ec613d02ca8b4c050e8dafa516e0881808d13fa187efd5558a5e7a7aa3247145363bdbbbb5116aff0f437105c898b570610230a308fbfb96146148e0ced4ba0a62990fa2d605e19d4c9afce44bc2a55cb94683010984b19473b42b40f712977912402e7ba6abf4d951768a2b73107307f6654f9d530cbb85976d7dd3808bc8887b0268b12a59b59b21dd12e0a274dd673cfdaacbab2aef8692f846d7b8a4ec080dc1eda7a2c1581d92d7cf0b9d076097808aad44010d9241cf2af3f8d8bb68507e611dfc2471eb7fb4ad339cbcc79d813d4155e3486a18d83344926dafda9e1aec526e9a3e09b9d1eb8d7e46109a9d6d49a25fac7f085feaed1f6cb1 +SHA3-256: f9539896bbcc99c791ad0f7f079f6266cdb1b65e07d73f88b52f6c62b5890dd5 +SHA3-512: dc5a65e2a9d7204fbf39680da247a5a944d2e1406dd768da20a9eebb31fe6dd80f958a6d39c02deea5481bed65055ac28734923c33d230159d82bb34c54be6e7 +SHAKE-128: bb9a450532b66310b6312e096bf8ec3e91023a8ff39c70d2d89ec2a8cfa6553209f782526e4b0ccfa3f3805e64b70cab396406f560d92c8e86dd5445ae6af09598cd80bd19e471b232d3daaa58007ecf2f603375f556495ed88f9815dc1bb27aa5348c7d76e58d9769a8218b555048322d630b84ce6cea75cf0fd9ada0328f727bd9cecf537720654c5fb437e504ea5469e388cfa5ad424a97bd3435dd56d6de591d234d5687c024e0a6688879b2b355007a6cf05eeae3778d934771d14dbfe55ac5bf370f4e0e6864244ea25dc7d4ce5a7f498287930d2586e1374969201cc1cf00f7c19cae65d2cb94e5f551ed20d0690f3ab06630703c8af2bb76362d0b598a81ee86ab7d7fa9657147b7923cb4ab626579807eb532a75c261badcb37c2947098f9b3fd236ff194dbf25d40566e936054ecbbe97071f2c60e2a5d73d5809de539d502624c88577ac717b2b32b3b55c484839fdf365ee6a49b9166d14c49da1532b5af317db3eb889ca31e92cfbe3ee4f0008d7408fa05f4b8c646ed055a90f7e21f441dc1826fe3ad13fc54df118f0ae3007d729f6c4297214463101dfc50e0a37077e4acfbdfdc56f68761fb6d69dcbc87da1f6f68d6d89b8ab8d614ee651f626dbbfc0d643d2f72c8de72ced39a958d776e09cec356b5eba79fc4e1aca23f508aae0d8f7c7af7295df9150eafe8450fbc46f1b71183e95255d3e1a651d5 +SHAKE-256: 8e1af05970eecee9362a559c92e26657949e0e4fe2e982c915d2cdac45f2995502160dcc1a885aacda75d587956460cf2d906c149d644e70bfdd441ae8cdd75041be16e749efc8921d606245b89ae68d4a27ee363c301c6fc375406def225645d0ca19d4df05c08bd59f7a871f458daa573ef32568345b47aa68504a05479b924d0da241839ebb77da7bf62ea9d2e3ea518c0273ec533b3d6660254e7099b9f93b44dafb70aec536e2c0fbebc545e01f1f1cb6fba6801153f445693c0b768046f60851da80a15a4a7964ec6a21c3c0a3250cfdfa050bfc5457e43b37306ae417f0342671abd315c00be43d083e1bd5bab3b1a5f65983942c558e71e9a6443aee953d7d5a6779dca7d3ab20cf7e0d38beb1ad43fec3c4ddf995c32f80e453d96433849c3d76941f83c4ecf6b2315df9b98a8c219502b3e456a544d56fb5803ecf0685856a5f35e3d151613ad42f7430d50bd8457c7f02eaed813dda2ae4c16ca5b9ed89cb9ae231ccc5c93e9cb3b995b9624aa39a594d1d647a5d8193c7da86a5f73330fd15dfce3265b5ed7072fdb19005fca2d6e0b7951c5e884b73e88e0cccd98e3187830d2ddeb9a8fc242e7a8f479219c41f1e1e0ab9468fe1f3359fba9d18b4a16de3b51f63d43f5ace991791822e6a07d467f0833fc9a8af530eff5db603e907fdf23bd7f120a53d244bd1538fefd208b37476f5a931875571135a74c9 + +Input: 145d013efdf7e5cb918483548e447d67b558c4145908135ba3d06fad6cff12f6ba3ca91757fbf56f6824e0c4fdeb6bf652e6d65090f2a3bfb81636c99c884978886bf64e40aaee1d7f4e7e0aa5688d588dc78cee316f00f85144c68d67855c72b074cfcee11bdafcd92fc1e00b9928724be807e66dd156c251db3e2b5f1be71b415de1af8e26fce6df7ed467284d56726d75a26f0463d25e6b8db8723050ff7819efb43b90ea258db523de9b1bb907a7164495f6d75fdcbd8cce9349f060ca9f709883a98a98cb55e4320e97c9da1a4a777ba354369812a48e556501d1ad77b90fc694dca644b0a4e7a52f31477e71b85eac27fc4cead7a1fc959b6621cb7822e466c935c99d4f0d2cafd1886109706d5639a206ae8a7ae6d3d476b05d1102593172a36cbfc450e53b1952fac35cbab5d3f0d9d6a862a0199ab699e69556034f74f7ec62bc71d3b329ce7d3c151619633faf385470e1a023cfe49ea3ad3d0564af5bcc3a279c2b73c5909bb1cb0b976570f02edbe4ad4fd04395dd9c501e4b4062519e61a6d2e97b0b59b8f81c049936db4de3ed197959b4f3f913d7dc5e945f57f1a01b3ec76fcb504d55df5fd22521d01378560ffe141108a01fb2d182bc1f812eb6608b226294f8c647bc8aa0 +SHA3-256: 074d8a98959349ba18b39dd4bf552d1b7588296359c08963599990e7a058a29c +SHA3-512: 9bc5462fcefe134155d97174fff1313a8103dba8dbde0bd54895c7e74642c257ac33b78fd12c713155f62a4b8aab0177c86440badb526c1f2b493a687bd68482 +SHAKE-128: 93304f4f9535213ad7b6e640511f54badb95a3e2349797ce067037455836ccf407091f602a0a8452a1280e5a6571745b58772ef876830c37fc86497d684d04017f8794e0d4fb553b39a563631a2d5299d34c82e0879f3597b353602fae106a2d96d034bf85655036bf2a875a4739f5933744030804b8d52a2f68c7a87bd4e1fda95e4231859a7c63613304eca34f9b7fa9b3f04768f28a3e1a8dc6194e7b30f5690a9665220975daa5d2ac827b110cc275618a5a6130a0ef7dda08b2263eb761f4c918facb00b16ae03d839e89e5d7f0399469cfc68ed2f08f30dd4978b34251c6c4c26c4985b41c6be1b995429b08e640f76cf98d627ce6125597f1259055df01716c7b0b7ee61132a1d82fe2e0facdb7799b5f87aa304c52c50c7f32fdd3f9e66c83b71bf5696c179c14482a6d2f50c103d68d714f77b87536f0918adee40b752ba42852b9b51acbfdebe1ce5d9e73afd3ee3d85d5aee27c543bff1153406d2726f79c119b9d445e89393c4932e4f2950fb691c1f709e357e80a87cd25ec3fc9fff5c377cd953021ebcbef71fc92f4713583f72a13aa6ea2f7fba1f76c238affbfc6fe4996ed586febb4b2261b53358477b9337746f7494d2ae2a6f04ee7b630e7aea179acb21874c0be1c21f45ec0fa15442b944a8d82e83121aec55eae10250cae4465132b1f9166faf00a391be338f06060ddb2c649e989db169b21b037 +SHAKE-256: 5ae546f8d4f48b2897f50c322fc83f0036583a5240aff3a8ec33bdd6c4018fd8399cfcf214540a05d1f97bc04e0b9a586073532f88ade6cb6fa01564f6aae87358f0c2c8ce8b8cde37a9b4bc66e78666a6da84768a86e2c291cfee3e115836c6f74c2cfdb722f9eef81c30260c4d5a2802c2dc108755ca6783e9f647e2a6819c22790111a186e1f87be5a54afa353ccc28e4b57b2f597d2e055d2974898128bc6c8d1f055f368fb88959d5a43bd27b2c85cff5bf888e4f448da37157ad79f9932877f57e7467a86675ee9dfb353bb0075a8b587a696294c44bbfc4deecf73c225b757a212bc034fde13da2eca725f6d8a5512f32b485f94ec94c656fdfc78d73133f04c9334fd7a29c31ac1e9744fb1f93b04b1130f692b09e00b16ec6a92aac5e1182244f1e2c7bdd86b8e5d6128f30075978ea3cc156aebab64ccd2ab03f48dc7f7976e77b251e664d16d278919677ccd5d0dd01203dba88242384983129b8e4e167100502be0785240184efa81388b05cf2cbca05582e877409317dc55d73cf25c4daf821517a3120ed10150bfd2a02026e468b241538b8453cd87829a6dd9685ed53172fdeb51cc7b18d79a324b5d31f88fb10fe6bc01b3230a1f12e75823f64d71a5507ed6d8b8c5e056addc26e404c6d23ef5b48284c2a80fba15c47a1a64a9796d057a94d44a10391a4dca530b2d25bb37ec8f2087ddc51090f67087c + +Input: ec21f38a415500dcb8c79bd6d403fbaeb911cdc5b871b63d40593da6b45018c52e417b8c3a157a54ce5f9a3de4adb147f2fb3465a73f5037ec6d4b6011f9a0ce702e262afc95a0b26e11cb685b9229bd10ab01352a2488f01d93dbadf715fe9990a8c694e5f8517cc3762fae63918d8491f2409ee0a9a7d8c4d3f77e60d36191da8a27fd6b53d7481285a5eacd98ef3a57d6a1a853d6addbdd531a5e012c10de75d146303c313488d2e5843329e188c8a786ad4191e36eebdfcd76cde4379d4dd92b7cbb54675bbeec1419d23d958bc7d4a1238262997a0dc987f2908a4a17bf18de5945418d819e70d9fee7a62f97c8a9cb8f0161730858ea8b4ce1739ee1f1695413efb9dff0ea9ac870a049df605405f256ca9a9811dd8aafb9f4e4579843704cf0811a33012531c200db5ca4745c7e0f295fda9ccf15b24dfd14b373d68793e6b74c98607c2cb9c207a94bdef140d8427a56dc6cbea1e9d8a6f47f8630c7cbaa56de2416e29ea199473542cf1ed6615d8f8973edcfb3632dcc7e4e548b5ac890d32f50bf791537c4c08a162b966e5c9e712c80696b33105df9d4fcbd0e05528a46c0e0d6fa2f8f46b98a382808475789d1bb9717e692eb19df285d63b36c2a57dcd7f3d49bd3d26fb8d1263925 +SHA3-256: 1c31808c320a186ed73424518009491b2c6ad4d9fe239636c2ad583850d4a12d +SHA3-512: 21b95d358d179167c8cda19a8a43643617b747a674213750dd21240a5ed8c430cf68b0baf4b8658baa719e29639a5034e2c26394f6da33dad78c72967c5e9343 +SHAKE-128: aa827e953de6714b5aa46f67fd593c9427f4dba19847272f0e5c4856b50ee4171b7b0196d72e41add6b4e6e5abfa30ac13e36f3178b59e78e4b668d636ab08b9ad5963422cbd3c70fdc272f178d5f8fd493c64f002342b2339fec057ebd5a257af82ee1390db3f899f5d063a6368c21ba47dc614ef47f77c0e38d59cd6f6e76d08a62f906161cc5a0ac0db4185de75df00f0ca5ae497ff9a43fb634dd2bc86862e36f27571d02545587bde93ac1a2525ec233b8d7f0af12c12503425046d52c804b49d9a497bcbc45934d60241a57cf449e9dac692aa04f2f8f72f3737bb3b0eec51e2a57cf2ca770ac500b2a61e6fe09c6ae837bb67aa2ec91ec8c75f84c7eaceebe7fc68a27de0390c07f27234b7f02734218d852e835a9cd54f66dfc83677f5ab346e12d02adc1c4dcda3d619194e6644d37ac7f403579da795ef0bd85564b049dfd0df014ceadc7848b9b98ba4a5c988fa19de73c2b220c00be277414e732a577316ddce6c682c869c4feb2bc69792db8c48fb1b6f890816ae29a7c11862e55839fde5c19efec661d925ce59df2b1278e4b63f3ffd6035fb943a32b2657a528c28495af0b4e57f90156d8f3b3d011e88cc5936b781ed80510536ffe42233ccdb7642cd1f35ab066dc8dad716f1ed0594ee89625805ed00e985833981018877404812498f3a819c05903abc77e5465f781d9eb18dd1489b65c4ee9e5503a6 +SHAKE-256: 7326368cf444ded99231985d5ff9834504232f244c96028f8738eb9fec0c1ad180f3bcdd53d7f38cf8783c77f8bb25f9dc295296e90d5dcef8919b587bfe9ab58ff86e68abc6e107b74f7a678a0997b99c8cb5c692f2dc3643ef9676287825db1174e26faf690ceaecf8ab209a615e7ca425ebfa1356d999efb6abf622b9a5e4fa5f7faf98d56247e1b52a4972c5e10acc5a9ebd23643b708a945928362622afce08166658741569d441655401f48a37c40308fe834e69a2934d3ef235c61089b65fd409005ae7bd7af60491baf9630e9537ccc1ed91cc2a245df1094e7dec09f06b298ac9c65cb0b25c8292d6286e5f77e47ed544be9d35520793544794733030b4ec515e144cbc1790e4adade58ec37bcda16e82860c92498962635af6d4adc42dcc83a62067eef4addd0e303238953134de74d9fb76b3189f2238fd1780aa9edb1bf8c4db7c80348e001a4314268911b6bb004766d55ccb1d73c1903b7f73017ad9f89613ccef9658bb5355ebe5cfb89d37514459c15b04c3e0dafe6614534742e319ce7e95ad7483dff0f28caed6da3c0642c9c8fd7ff403243110fb15c04ed2d2d48a2825430914b7e4d7a5464a2c880cbdaff03eb308d21804f8d6f1e0a00fffa8e82ed31afdcc7475768dc188b8d608dd9ccfe7652726acf9d6726494eee23b188abfd2c785c25b089c84fbeaf27f76e7b204f61ed734eeaced43d19b + +Input: db2e181b97e326fa029d9638262363cef9fcc402a095d9688c6ee0e108edfeb956f3d053a18c790092c88abfff57210e14ea0c57f50263cbe009695aedebc98b90144ad5bcb3f0e5556395d7ac1bb8dae064219e0d382f1474feff369e1c4b602d78522a5c4aacec4bca5257189dcd7d9bda457eb2bac45a6002fad410547a01ed6e39104faeb6fbe61e1f6547904891ff8db37e157a44c03d61efd3713bc43c1417f2d1b5a92f6facd6f00afed08a0292fccd7f72b7a6110bda4469fa04bf66879f428b91a6fc7b4f3cb2124b6468078843695593d30141dcdfb30177f0148d42fa0c59fecea55b7dc7f09f2176412219f9c99861cdf13a92a87613291c8c76db09569d5f6268037f2bd77ab901e4c980c717d4e347941c46ebedcfed897c10c48aee0fd5a9559e16f231a717f97450c857ca5d00a551061b4074bc5d8552a78e8569ec6283f1508ea7488b8d42c6548612c227dc033f5622e5f6bd1708b12b06af753d464a6a5d5cd5a1180263814d67a2c75aacee98cd42c95be7abbb172692dcc006ff4bc57e0d3f281c2c3a2c496b0842c90070fc881a7e990992359b51f6878a18be628e5334959ee6aa625403ec0ad7c12d0ad0df8f5fcc3839e92b3aabfb3e750012fc4c8ec7c40fe6a399af +SHA3-256: 27bc8d95be9bb63598d858e827a248733109efcce307bbf7f6028b596bcca6e6 +SHA3-512: 2f7be32705e48d0b6f947101d66d15b85d43241d56b43a8aa6eaea306a72bf343ed1af5816df70c5a16da7db5a11f6950be1a0912944277d79724dbdc2fed972 +SHAKE-128: 8d55c09fcc76ebf9a3d76b6b4d093778267d3712c7b538cd7f1f5ebeda8a8169a8b69abddac802f3b2ef8e616e6863f1112032aaaf49ec0199426f325a0c02aadd51522f4464c2d4824e85446111788e4096dfd3522ebb944e10e57fd4d5085ab3fdf2345d26cbc36654e35f502a2a39e86521ebce7f1c0c1eec453137191f5da67e821c69401890f0c33137aaf25a8d1a7e9f668ed8a86351324a0b80c6b605f3b743e963f5e6c9915c53d6e32207d9c65da2ec89afee1f83030d5d37a2356a75e2a9c55ac45c80bb6f13c27f5d5374db2c53f4d28c6f0ba3e87d4401661ef2b8fde5b4e5efe089b73816bff94ecb15b7badcddc3eb44dcb8540d318e53d6faa89ed62dda63f03256fca62871ce4ed41bf3696ec7b371dede5a12d9cb34a6a9b06bc9149d805f0f1b304ceaf0d3457d428344fec3243652f44791b152adcf6baf24014cd56ba6b1d75aa67bef8dad484b2e173530a97f47f39704c1564090d6795f0b5732c17c22ef5f634931c40fd2b91d07581e29351811c6bae1e443ddad6c9c2f2941b18425111c2265ae70fa2f5decbb279f38c6878aa153693ba35f4a60e0aecbd6050feae62600cc720b07b6de0be4729ef34d9bd67b8df96d50c0de07190db430edf954c9f06fb9b04ad9f980df3b8f9a6a1931f40a177f362bb09049766c01bdd233c09e09b48b1da2252310fcc65192842d4f943c1f5fdb32082a +SHAKE-256: 9e6ac3fcc9383e77aebd6e41770e2f782cefcc8d1e6ca052b38e1a956d386c6a556dc12f9103376175a3094dee1430551cd8a04cc4e755c5f1d94b8c75ef725b41524ca9ca7ef2307765e0d5dc11af310dcdeb621fc987a88f946559ba2e2e755120762b98b22a37c51b67cabe721aa8ab2bc113e2fd48485475d32b97513776cf6e3cd3c99ee2fb8a6341aeb03854270f97f781c3ec1b57e7e71db682117b019037bd44e0057de0ffbef4e1fba03e36772261e59602d5aab49df483580e63e1e0b341eb8d72643d50d04f133e3abaa9a398b1c3666e8123f88ecd67fcbf1d284e9f871eb8ce48eb842f5cb345a9cc1b4f97f6fdb04c71c73790c58c92b293c801c037724d1267fda60dd0d6d05018b48be62551c4f213e65532ca41ab0007a6e9e4989980660c836505f06e86d3420fa27fc069902fa4f4d455613018c6eaa70b4cf8203495e8505eccf78b58c419969c53fd2569ed865a8115ffdc649923e0b7ea33e2c830bcfecaf849c7867135519b094be7a2cf5912e9058ce012a69ed0f4c810ad97b5bc32fdb2fa4628441c4856e9e881563a6bce8e45cb709418c0bc9a6e80be2126631ce03d87ad911ddad8cafec733c1948384b4f849ea89a42c593d79d55be99ab8f9e1c37a0ef5c09df3183a8f133151b8ac14f5d8adf9568daf7e77bb998b6a5f23c814b28cad376629a211c77f118c44d309925f72d372da7a + +Input: 93744fd07d7d39b791d691fc1c8671156a1b0335163cc7dacdd241dbdcd18cc1e05860be9032a027fc04840a7c43e3f16011e49e25fd14bb578f49e858d402bae3195f09a2e4ec41e62e4184bd8f949e918b7d4c92ed2e9df16272dbd218b90e4a4a2e979de1f4fb9f79c1a5d890fac89f7b58441d2ca1c6f4543dd155686eb2c3328866fbda83880fb7f0803c7103668310189611aba43e04bc01b8b20802e8bb168df71bbb91f75d7b5ff4f6d6f597cd457e3237bd1ea50b436042b6928ba16e4ebebe199917931c58ee3244d4eeae164b2c3f77c23924c58c667d27f3583fe5d5a9b752ada13b488c7b239070e4f96a68ddb2a93dbb6e1e2925df3db39f43f8578662af31d7e9f1e610a06276beb08cda42d6b1e946242a57580f5798e28f0a51e606c21a9207df275f367b63fc3d32e28edb8e519cac87590a9563ed4e3b7c945054bb587f063db61376099d6f887b5b48c877614b0d37f46c9bb50352554e5402dc017163c326cb2ad965f2521f41946905118d29c97c9c0f2c2d58b7587c4de77e217ac0dc40b9784796a33ae45c701437f68f60b7a5b0d804a41d6285ce6d5f6aa8346649a420cc2ec9fa6545f6424ac8b7a2a67e8b462985700a5f397e77c8e6fa181c3250bfab8a99e23fdeda +SHA3-256: 21b5d21ff563ed8a29a0c0141ac43f5cc26243faff158f2f33be84e0bf49bb54 +SHA3-512: 2f85d2fe4fa4314948dbac0e03c9d399df6ef93b7c9903b774665cc7f255d985b4f3c6f8f75d49884d4dde58af039fed474b11954d0b976d4ebd71a137a07636 +SHAKE-128: 0b95726ad716961daa6de1a85b9b0c5872b7716e5589df1869a24b5f04d828134bcc2c11fe62a45d1902d02fe19a32c17704feb1f893e52625373e05bf06329758ba91f1f9ebbdba6346ba60d94ae7b687b3bb51c6d05daa0c61b97192c77fba834a2d133a6695d44436747ae4e114bf601030c5f21ac4e2ac6ba7cafa393a7edae93c49719af6a10919bfecbf4028c325285fb0fc02509944506d474a814bb7ff191ccc639311e3aeb65a6e5e2a1f63a0519f5f46cbac947c67dc0dc9305ec942917aa90e6a4aefccda50bd011b43a1f408c17980c45e424712de7ce676f4afbd127de4f35b71a976fdfd37e2126cbb09a6a47194342449b65a4bdc70f54b76bf15c362eb70eac8e7e7f5f264ed4b658a2a02383a1bd618e313e28c690c807f8618c2b49ac5f8bdf2746ce8ed73dec21d6df347d28190b418c6300d010d3995feba5e8065de1947d0c3c617271134749e4134c9d59442c165f5a891fb34cbe4d7c395b634dc07af4543631c0d057b5fa0aeea4a7aceb9eeef5d06cdfa18109ddd15062ecd453e5a369bfee6296ef6214dff0c5065b34ae3271765802938fec36333b9b59c98de92ce476055ba42ee84761730682c22db5a92a90a8bb11f3bbd14bbeeb0921e3a29ebd31af8639385874a57b4048d5394695c6d44be47e6f18e156d59ee45735458b6dab61ce4ca68b286253e9140772eae53842c90f1c724d5 +SHAKE-256: d70bbe8013888eecd27eb7b3123ad98c01308fd51603ed876a4561c51b7d7c43f280d8f893b1902bc1601df797b3c45f2f4400b6dd99d9501b797a42234adfe6a31337f92092550651919c47ad0e060eaad6551cc8726ff89be253a96df4e9d6a63fb166658eab7b15ece3dce3559c970560aa767c69c2de00bc1d4bd08c23125db6406ccac19254e6129c4b81e90edd0a1985717414722a20114c327ff3509bd774b755a31ccbdcfd044242cc6d1e16465dc02c1dbac47b078e3d3d72cf9edaf5d84f62442c7d41c2c81ea5cc271bc73127823c4ac7c513ea0cbccf68a0e85d581846767782cbf7239a3e556f85ebe46d9408d1f8d659881489cfbe2924c4b01f825bc19a7ef3caaae4fd83d25e719cc524bd4a132f54e815e7b45760379d0f8feb83277b07ff65d4b0a698e3376b623b99b66e96a23707a344add4a7dc304529fa207485b1ce338f0245ff413bf1fb1b51853980fc067517b262510f1b063b9b8d8bf353f207b42fc056cd9bd48e78a94659e99b3bb24463cafc05abe46765bc1d8d1d931c828bdd4760ded7cd1963a7b952a0fdafdf99c5fb9c9ecd4d6b60263157adfab30344754b7db359eb7dfa3457ab4643fb4d2b90fdd1678693775c5f56bc533b5c7ce2229c58a1531b410f4cf0dc44cb2d8710ca3b85ec47daebf70e59fea0cdb213dfc4a0b8fcb53aab05d1ba36ba63c3e1a00ea611f02bcce5ce + +Input: 0a4eeef7f587d37bd13805a5834468009794d9998fbe6b50121007cf87754557e5c69793658e18aae9ca2563ba5c7fe7e444f7746fa8dfaad5adc88970853040f482117a0e466a976944c4fdd83a0095ebf717d1b7939781b18a56aa9fdb2bf55d108fdfe0e67d5200751a59b1c3ead6e7a77c9de569679f084e06b97e358c50f0274a969287c11c90f25d3fc04ee0bf70fa6eb5760222ae18fc2357ca33f9638441790fb0dce725eee36bce6e00b09368d3a4de48c12c365b575fa9f711ba69f1f5fb647705edc3c42fb8e4ed48496e5434b850929d073f62f52886f88c6d1dac2c703c8c017e2f32ef18085b962774159b7637b1c578b53b3f93a53c00b09a61556d92f434b691e86c9078c940db83d54d2dd459959934cce2c7bd3d45339941d93ee4f0b8228822b0a37879979430dddbc05baea980ef8c64c2d928f6828e6177a638d425f35aef61c50168c36d06f649cc56d6064e39bc6100aadda3c5c64204867aaa728830a9eb45c0c84fa341794d7e89ffaafe2451d841c73153aa138b95b088a729ab47fe1727a6cc26a3aaf71f9d6254b43928d51cf7603ecd101a00ddd9877d9c7de9d8323e38ed2313f57826c1ffb7f8625bd625ab785707a4f632903ba8c90e6dae616d55930d0ef00fdc85 +SHA3-256: 5df5e7ee932de137117767158d9989ba42bb91a6b8fc4b6a5d9215600b8f9b11 +SHA3-512: c6ae1871a09e8d0314cd40ed331dc4f5e77984c2824ba1893c310c8d26f7e7fdb34cd0730f3006be5791a149fd89a0a11bae13cb37b26800b46359e7bb83b87c +SHAKE-128: 1e489988215545383c0fb2db73c9bdce6abd7365459958abe206279c1846d272636c50133c1440a8b18a78a5214b4d05c85166bb475a19744bfaebb358c7108d38ab17651bf41e0c8a6fedacfaad00b65a19e1836763bd89b5a32c9b2a21b7c0264d4bf688e902de31c75d6ab8b1beebada0d8ed843f7d67239bae1070e2a7460de448dff5761455427d356a368be999d1be0b3675b767d27daa1abb2826e20816339d45b8ef1896e0b81a39afe294869db3d541f12dcda2f094a710a55c03bbc94b363e9f30fc2a60472026d0662c7f96916dab736f9f80f458c6af3a2374fa661cf375893e90fbee301604b62d15ca68b75c29f84f17458f615ece52b03690cbfecb71e2c91d84ac8607f3ea9e644edf6976cca86cabeb833b33957a84c23b64410bebb266fe88f55742931834b2e418518ba9974b5531f5ff17362ae45c3895511b0b0597515787b9018ddfa1b91d0e4cc19660808638332ad8e1581b0d6ab5fd9d7d749114063a6d41527f322f06b4c5069b80a5c70f218e5cf8f8e31959d0c4c8de9b471e8079bc7bde6e2fa12fe21a374137acf8667bcb8e8f5ed5edab83b6342bc12b3b33cc74b0b56d3584f28cb6cb085b240044f220c782932c33a1dc5cd45e9bf8b365c97695742c5bd46f4dadc313cfddcb7898175e811001c74d7d6e7105a3ca283ab31854a1a0652eaff69db7cb5e6b9b32baebf42bbe2e4dd8 +SHAKE-256: edc1f99bcd012a1984cbebfca245e208706ea771f80f273b349575244cf60101f0eed45d7f1f42f9ead69c9f0017b263d93ec7057d731ae6992bc659d629f3681d079e085d33e9952fb662292b28a6731a518f5bb223a4b8ddf391d2ce6fef87f6dfcd97a956b93d740d2398617f24b29aff3ec3ff49fa65967008e0d9be30ed01eacf5923ceb2f9cfe9a48087bc7608a931abdb5d557daf3eaca13b7f2e5eb3ffb7a26c3769cb318546430e48df773d502cb7faa031bfffe9b8685a014f8917c695893ea292176049bb5f26314cdbcfe9933958d5a40cab34f10ac4c2c051a19338530ca5c2ce7eaa493ac9e0a58a10cba24db76b2662a6afb2676913ad2d349c2c03bff3be4a3f39435248a1f2c24c0ad47c61f9550e4830cb06b21ac8c2e65d8958ab8e6d484be9cbe6354559ec912c327bdd866d9e183a08c8f79d87d7ce1be2b5d14db90eec1fb457e3f9b814c29fc47f38b2b42323f4654ecfff8b04e7003faa261203a5d6148da0fa1291096c7c942de68b42b0d343bb8d423d3624787d88e581768b8354a219d6f31f4949190b1c9b48b71d3e0c9ec75579a0db23789661b594eac56c4e342d1d96b2bb8c24faf5ab3ec932d768e6ea7b9a6cbae0e4d859b847b51ff90c5989cc42a99f8750d4c400a6a3fe861ce6976b6abd25e7271fd8b54f80cea1a6ee66503788f640be2f09aade1bd3a6132c15f5d5ef337800 + +Input: f58897f11205f51551cda59ef98b60239f7ad45c5c2ab42779795288226ad6a1363927279642424ba817e397b504ac4f5ced35fc936cee2c348b4c4c3c470a23fc21c0078e3914ffb34e8d726b482ef88da1ac1c0ff3bdcd99377589d55dad3362e194b7bde63d26d1217fa442b56c2931438197eca0071381c891bae734a95b3678e6dc5efa596dfa2a9ec6d2cebb495f51117bcc47458bd555e2c91c4bff2de629693fba30d20501959df6cda4e55e472bc46480237bb86d336651f8346a8c6e01a1f4c3b6f0da59f24181b94791ce6718d57aa3c0c8330abd0ebd85a0a2bc5bd1d3564ef265d0a3d4025ec2ebbbbf8a13fb5e177bdec54a69eb582fdc683a5e9a20b43ad5a13070e035d6cfe5820c0295320798f215a66c5b05f366d26d2f1f5f64668f476efb95bb9bf4c69d4c2bca09851f2bcbd3ee37f9618eacec75050be52fb1dd3bf5d8d1c0ca329b2dcc54c9d8e5cac8b81f75508c209eb121e760187a09f53191fe557ad598fd9245acd2751aea3bba2df26ef0cdcf9d3e53f028b86c8926e8f94b17b63160be71a6b963e4d6036893f16308abcc2644479b3dd7767a4721dea8e8fa76985061e88dd74a9fb6a9dd8071c391229fcba2cdcbd07b78554321382a8818a3267f40d73b791699ded5 +SHA3-256: ae8de1405cf8b05bdf368aca6c71092b9191b9d05cecd1e6cf165fb59245e712 +SHA3-512: 492312fe6b0becb235e8b9ef8a0e52c78fc8fc71c21a146343e76139215c48bf00a2136d72a6d14fddc718c238896d4a8e631b3ddb5b0fa3933b3d936672e9e6 +SHAKE-128: 089164a8cabd81dc48c86874caf9d6753dac5819db322dacf6c83145f78deadecd68de8c43dc748b97b3b83b34d11ed4b033f3a4d01f93d2087d0aa14dcb9d9a3191afcafcb12f80d8bb5c7ac4275d66bc50f58e67941dc9f5dc0245826f9a5b970d38a57a1cac206e0561203b29406901e9d435a81ffd453f817f5a75f5d65d0cba23e743369e9cbc72fca1c79b6415e6ed168fbb5f478cefcbc7c25f02ed600f71754da022c1aa2ac687c9f6d154a52f7642f370f85759d5d36fe2c0974ed086c2cfe2ad2be11e651fcdc74217250def92c7459e9b0c6a3c7221fc5997cc9db2703f5f1218a83dc16bdab40e6335ccf52478ad5df54540fee1045da44bda33e9a58452793abfe0c1c3dfce2ac08cee37878064ab02551284053c7b06883d6d5d332c2eabc7fdc59d9b5d7ff88b1b8cefb006ea49a9d0d95083225d590ee74f1b1b3f3ccae0433e5a364e7368de029a1404ec7f3370aaaadb1f455f2896720198a78118ce27ef3c04d2584535fddc1030f7604737fa9ff153c2bb9677309fa6b33cc74ef2fb423dd0f00d99fd6aa12f4d4d52de922cdc6ae727ed748f15f829b3630ae4210daf92ee57379d3cb9c7924f1d0788329fa9e4a8669fef546dd78bf35d8ee8080b1ad7a29b2d3370c8e680aa28e4e637df8205c89988810350bdc4351c9e264ac79950691e0ccdcf7c31dbdc855801c6104bb873a6d9b746ce420b +SHAKE-256: d9fc5139b5d52885d56239d990b4c97de3f29a5f9000104de75ed01fc5aad78a89447b37736aa9b87c49cd1433d567037f1fce3518098ef5064c6ea579e7cdb86c0b3eee38a5f7f99177f1c591f77f9524d141b896eb4368b703d0da74e3cbeef04c85ca4a15cb8510855f9834a4121a3f7c273caba338b87e8333fbbd9548c089da39d4d47e976aac16879c236b4d5ff2b1ee63fa51f44fc8cb52d622cfd60aeb06b573b1462780d4ade1b10f06f2a8ae56ef78cd6f84259b759115525731ff45592c5d9268ec7c9c640639d72d408f2941446fdfd61d527c56dbd64891610e1909e850a02bc6cb5c9feeefeba88cafceb244b180ec9be49a2d9f274df03cc9c5821a1fa906fe8730602318526210f5ab397a9a1a99ea597be291e65b0d377c5582ce1e8a530896ccd8e9bdd0c4bf171f7d131217d2f033f788042c17367d124b4e5b53cde3c1a8116821a74063bf6a2b70cbfaab3a7da1598ba3fd8094294134cea16b1a0d6aa5d07b2cf3f6659695a4887ea630f7af440fcf73c02d310bd9676c1b62aa56d4e1e7763dbd96ca4323be53c8482c1f7b4897e1855044fe5d9990899420565fdfcd6f62f2708828b1877f01c18e54efb005746274f212cbc134c5df741a763f55429f98b071fad1afb4418b8de457b8acaebe66ff5bd836a16b5d7aac967875c48cb576c227a9d0cc810da49108da85cd8b9bcbf6342b0394ce + +Input: e1448c56e1745fb3e57a55b833d91b019aaac1fa6a4d6d4ac6591dcd432f8ede40af8bca870baa4d1a80d66559bb631c0fe70e06c63fec8d39bba8036ab66caff5ff5c235d91cbd9aa505786e6ec28f1ed76230e068db928fde799f4dfaa37aac325f8222e4ed69273046fdf3d4b3d8938fe7ee4b9ca43100a932c3e053c477e2852da88d535842805baea37096398abcec20f974d7787b73ed82df49069ec39a5206c97bcf46c8f6e7a49041093d4af8101d3a7c796d148cee3cb6e389a4f7efdb44085fb735d61523715c38228ba83add965dc6fa4c07961bd0b843377c90e172292be69fd5b814274b484f1e5f3462b3cfd3ac3ab9e36fa5e1f274c74185936b3bc341e0a499338abc0e6a48340588cd69558d18897c5896bc5ec5c5978d43c14e6f483b70a16119ef49684500c4d787648003fc4bd23d7f687cb69de85ac28da723c34e27e478a611b707b99b2b217ad5555dfb2ed6700170aa452593fb76c6db747c84da6e3162164b14c569653dce6505b86b64b3e3265df875b259a141f2c98fd61b187ef8e8e99fcfb0c3786340701b2b600744d25da4ddef940487d8105f60296f2fc49cd4c31dcdc81265401e83c568a5b3c945e0a6bbf03700fa2b8ef6cc28df9d2ee428abd229ec19a90c7c3d44d +SHA3-256: 10cceada33309f79509c42b4bc162a8e3fca667dde693ec4d497f484771331dc +SHA3-512: dc1843bbdfe0772395bfe9de0929b7c426cf97843d940658af2dd0ca7193931d77bab8aa401ea04c914a0d063d1b231dbd04ba12c9683edb5d337c620674ad99 +SHAKE-128: f91b1e584908a6642b756d23103e7f02c55c1a2ce02a484f82c6e6707fb15b326523bb094f78f511e87e46eba362f790db4ed0193c240c3277cac62ec8833402a9b5517ea6e290c770edb85c7ab534bddb2708455f61bbfd5fe9b4dbeed817b09fc566a8c3061a4442d1f8706d7afc42712deb5331b5c1adac716c3227e3de8118dfa7e44633a2c893a2a5ff11f75fd884ed04d996ac1c8ad228714c6db8b3dd6b2def1ab060937200ee3a5a97704be6bb0a276b93fb025a4f759a736f9fc1270f157bd401570f62e90b05a6d2e7227494bfe8f404e921eb7c1278f9826f703824b542ee9b357a0d1fb7dbd2cd82a092a040f5e7cf968b47309fec8e335601a0cfe611789a161d552a13dcc335b12edd935dfb36856b865f257a9175c84cdda317ca30bc60df8a72254c1372bea1869997505db62d894ff7be0916f3e17972767155c134b65949a254b280d0b1cbae2f0702e3261c570ba57e8b10e16a22fbbab84fbb02865aaeff0c0854c230c2fb90aaa4939b5f58181bec077b7c8ecb05a10a46d6f625dc8e0174cc3a2810bc44686c72ecc60ec655b79064cef00bdbf6714b3635a65ac56dda0efe1bc0e9a2831ff69226119204970e850e92187c88234e62241ca1971402937f8abd9a3cc1b8aa308e35023158412daf5cca2000f02ac4442cc7c0a60070b50cbefafb8d8e94b0bcc2f767875d0dffe97bdb00328c76b9 +SHAKE-256: 7c58f3121ab3a48a587f25af2e132ef50fd869eab9952ce9c06cff6b799e7a174a8666f9362e4873074164557a5979451823b7b0d1ee30fc24c27dcbe491dab96f4af28e08fa55e7049e539eb75b9dc7472bb70cb1dd548f1404350d378457352e9cfac79b53606400dcf58866af8aedd55bf916b8fbb4d239d158bf407ac64ce8e9dd6800a9fcbc3b29f246cc1d537ba0a3c89b26495c451acc46c35f7480ba7774d72f5d1e2a1d1526a049b4aa8eba30cb0e23263b93913aae1a36e63b7c582bd7deb189e55b10c8f8c487a128bad5f212952bb2caadcf33faef2854dacb5a745ebfdd661c2b54eef5d2f9d71cd46e1c443bcb413a51eb66288ebca054d7a820574852b8fa56c22d077f9a220894bb0863b6ba3c120ffb38988330a8b837523c9cb4e1cfe4e03f3d61b4e15c049b175b7e5286f5433b5846719246a0ed9f055ed93eb4ae461d902d860d164162f5abbf6aa1ce33e3a2788072c6b5d66c4061388cc39aeba1a98f7c6bdd8f19a91efe7fcdace4c69578981586ea089c4e7f1e62859f07f582a21fde18618717f3e4d2db651468a54a1fcccc27dcd03c423145942db0fb3c5bfb1166ac90ea5aeb34a7f34c5a8987ddb23ab33e391dd512ac4ba5426ad4e672b65a21c5de3548b3e5aa51921ed765571f41bc72e9a86581744982a4c804c357cd7cb5064fb7d8556dbf92ff9735c3d103a76bca9872af40a4a4 + +Input: 7e2611292b81669b9ccd37ca0de1a45856160d2db246f8c2bfd717f346566b87046d1e4a41b131403f6e730b3c7a7daa412fb2e55eb912886d871d4dab186654eac9b5e3843ee76ca8e4dee167977cdf27dbde4094e770ad97aab1ed1a9be485dce2eac76c38187778e1de0db67b8fdf7ab83984b00089302f15d84a7c34c7614b47ddccc9ccfa13bb24082d5fa3f90a79fecc647498f242f7ae5811a746d2b1c93994981e089953ec284d669c1a9eca9d879888b2354fe1ca439568e7477071c37ec6bdb31a3fd562455d15beff2ccefb59a911d6189f74b18c593cee487e063bd7ec32a29492aa400fc974a86d0e7109bd2717f4ded25636c8a08de051b572aae7e8842f0b11b8d0aab5c753e9b7994a3c7966ebe070610f8be21008740574344cd01e9e6ef66e22b2e5f68f7eb259eede3b4a277083988505aaabf7116bf90c7efff7836f8aa9afd2e9cb9766d28f6bcbd27354172e6a8f5f7f6bb5b6c5731771a0395ee4cf3dc5a15936c6c07c47e8915f673e6991acfa488eb1624a53d72951be550c4817b42121181e56107d6875ec4c40f1efed48acdf91c65026881e0cb0aec2387a3340f327ebe940b41f637e2f23e2a6c50affda87a42557539d3dc752277d806bee8d3240577d4b797a28c607d027ed +SHA3-256: 6551ed29edf7f4cbc452631a954245d031b78a21f5dee6155e2fda5545c75f8b +SHA3-512: 7bb64b19057191f5a1dc109407b78e69ff24e2b45cb054e353d93b76382d2df6e620a238d0df346aad68806ab6375a4116b27b12c7bc23d5b67e7d4353a150e9 +SHAKE-128: e21fd71ca9971a8d84d7563f4192855fc45bde06197ada772374a4fe003778dc5c3cf62ca96211df6694085db8ea36e08da72a88e131cd58862b2bb6bdf62497c6a032a908f19f4a466c212fa0f535b2cc6ff333d7f75ff89af957dd08afe526526f96acf8d56cd1b10ba735948b4239275b04eeec6541ef069d565ef63d4e277f5c1019edd03c410049795866e67a8c213d9e0a0c02ff3530604fa36d55720a1e893545645cfae92a89a34f12e12be738143efae5a013754a7a84bc6f7a2cc1ae9f819b70c087c2f633915760959079365bf7042c6711d7ad11d5b7c171ff780ba60ed52805677f8f95d92aa8b0492a778fedf9361f49a842de249b3b62863efebce1e1a7faa1bb6579132513a3df64b02f25eafbeec1f28396c398b70f03af5178c4733842193421c4ef6ab63296a1d062d743552f281059b0320085a12e4d64c8dbd42a9852975d66a7b8c61f96dcb83eb9f6a38941dac4577058f27bdfc26b6728cac8f7b1fe450f930de5ef9acd8ed641d11b683bdc3e72be6555874be2b921969632cacf9b1ee6e1e4ecaa8bbb492608a00a2047ce2eec40931463c4245e47e7f0eae72fefb8fee337bec96ba7d27f1d3e178826164f1d2c36a5f40c59d18a2d1e184b58547bfa5ff93b271be5760c0c0069def021957f8724350e08687dffe0386570a401118b884dcd3df5634d0f84890cc07fad2ef94f542167752e +SHAKE-256: bef00eeab6ec2dc691ab95ddf71b4bcdfa2706c7b7d76c3142c28e98c434e6c98b979c81f17c09588393a8088fb6f468022c1b299247fcddb4eb1cc132dee0be837882a388830124fe0b6986ab96c3ce24732a2f9d55d7f1c09671f9d25606d50d5c9782b48f44c6f0ca1852941108d3cd97ab7e9e924450c64067f1b2403afc1cf94d87612b4657372009919a8c4721b33926f281adeb0f4e40a36a636c0031a25290d8ce1df26580cffbadc4b96426be3d98dbb0607e10d818ca1414f512e28dfbd87f01e905a19a89424140d054945ff9e9f5fd43af2eb77addd43bfb3a6ccd5ae032edf73cfef80830275f2bd84a848c5731ef0dfdc08866e813d0f05efd31b158e84d45b7786066367551aa1fa0b32379d4aebd56a3ca4153ea7d8513256d01b0c5f1431e9a4d57190c63973b0e6bbddff2acf105c6d0b7c129636841b81e1df005bb4d805a75e1bff081c07d743ba94ab0cb85feb03d3440a92bd81225c8042fc5f9ed18de0b3bd901066aa53eaee9a052cfb47de80e5ce899ba315a6729df9d22789eb2709ef3e5bf88f3867708c7e14c47080d55f4e35f87738d78fadf5bf848fdcce61677328d7099dba84a86aeda31891eb3b651ec0ff3642edb4f9ff0ebc4216bc94ce2d629ef867bc90405ba4072445e7de0390342c97273cca1c4913f9342ba98ced643e43c3fcc04b9259b2e27d220476b4b404b3915838ef4 + +Input: d79305431715aeb9f49b1965f42a4f115fc057c5e7de542a473452554a602d7eef7b0cf3e635d0de3a86cbcd93c9bb4e64a51d0b1591b8c1a6e8adf5d7ae16e75a92d26ce664ba3288747c64276597f347051eb811a5f2ad35b52bd424d9841d534da1a37f3719a9fbef9432f872fab3e82def2226d823002d14f7f7a37985561eadcca23fa0196626c2de248d1c124fd9ba9d1ab753eb572f11712f518fc10876324dc44f3a01a5ffbe1912838e6be2ab6a685c1a029d10cb6ac109f1d7c0ef91ab17af72f170b062814446ae36675d678e16bcfb3af79007b2f559b4f44aab2657d8807435722981702b067e1cde8b431cdd09a84be1661937003f2a826554a54ce58c021011272ca5e63ded90ff6090c546e443313640a23faa8297a2154ce38e2cc0fc6e386101d09789f7f8dcddb004052d7c4150176da8c085cab0718959a04d1972f3b9367fc2d4d79437923a05a229eb08d062be956405f7978b6d2d4184d6454e6fe1815e3a46e7d957cdd735b4b4439577c37eea5ce5a716cb54acbc8d840e60b67fff52d4ce130342acc06864e93b29964803be4751931619860b79b02c2bd6e10e4850b07212d356a113526065d1922ef4bafc48fa6b65a4e5af5605a2d146d0e0d0afdc8d0bea6576a64f17fa5fe290 +SHA3-256: 9cfecd7a040ae0794a394e8950e7b84745758ba85118788ccab2aa676e303c09 +SHA3-512: ebd88a0043b7c70b8a5cd9636b1892bace25b292e982e921b0237d4f06f3a1df8598a71594130d1b1bf7acb4e1cbff71b97a9184d443277824cfe4ceb9d1d686 +SHAKE-128: 5b00d7a8e5055e288fc558230afacc23074f2d75b498cc13b40672ed0d2913710c84c99206be27e646d785f34f2355c56ce78a17e90b71e54b9cd7ddb90464249475b95ee67eef6468c7880cd32deed707c77c29e57215e0d1d04ca21e7f03d4e75bfe94a675b4cb32c630f7572d432e2dcd97081a6e9896a551bae648803bbe71048a4d356521383545a741a91483fbf356d752914371cd4768bdc035d795272c7888c00a0a4077ba1bba13e7dbb5e5add5fc31665bec333486227421e117b12b8ef65040b9739a3a24ef382b66fd064564a53be12ff11cee76f624650c0a3e55cf14c8e03725ac158ba13971856780008d016ceb777e37cec8778f08682dcf8a9b48b7d02d97f1119b4b161be7172708ddd16d396b9cb6ecd3d159bd338558779dd996d8f721830c5280af737e9a5c0dcd8c9a32de26a34524f563a68c99b4ff4974ecdb9fbd1cf3d15a4b4e9b7776ce864ddeef464c8b9f9e8096052203053ebed168630d00465c27b9534ad82570fb9db4edc5b95fe4ecb90e91a768a196a3b241b0f27b27bd5ebc0e6e7ff1bc0a2dfe3c7e340da66f967ee428b5f77e8c1a606f036c0a1bfaae24e77f05e63dbb5e5f755d49ba8d14fcf39ad7922f8c5bd5905a5b055efb46ae9b5c583babc56fc8b8ff191f7436fab26d66a8ad9149c795c9052b6cad9b86c224a68c5028a4add4ccc58c3c373f2d06fcc6eedeceddfc +SHAKE-256: b40cd7e20c8e8f1dca5debdd31cfe76ad476b40e146591c2403e02ad45335cfedf43295f08c0ff95af59ff7c663031692f47c7d9c18947bfc13d42e9d46dad2f748e6ecd5770def84706a44922076e9be2a978ef83f80f92f639ca8dbe5ae6dccd69bd83b8b92606bd0afc370f78babe901fd2815cdb87709bae449a8306eb2a05c4c1f3622ed49908d651e45674496831fca97bbd1df45d9095ed39833b2586c9204c10961fc9e8955ae6b133dd6848ec349d8690ecd180580c3ff8b15a3734183bc906375a03d565c018617cb4c0772479f06751b226bf1e127f485504ac818c0b626e9ce64837b2190a6fb72bd54e5c7becb9b0c2045cfd7bba6fad457a257ce90123c66f1de5c9f5e637adf1ee00f927ad185ef57097116e02ef5231e29fed0d680937883c57cf9f404a9b03bc465fa2451ee849a72b886623ad4634ea661c30eccae577ba9a1cfcfce216d310cbfcb5355b450f7ce9a114af4fd558e44a584cbe65e2fc90cf6560135502ded17a27b3f89b8b58d0d3d603b240a12b170ccf10c35378648f8e7875d51a14047926c020e5dc8f3940836fb29422f5667e27eab27cc26fad67603ff86a9fcb7d8206f12176a805ef0218614d986abce39a3b932fcf37dd13ac0a64bd4409a2a2ac7b6c12e7ee3de5e8077ee8cba33e093a4bf0b6fe9640454ccdb9b00cc2d0fb4d18485e274701e3f98f0f816831f39f46aa + +Input: 27307e40885857ca1eb7de738aeec72e358524d4a0a9e16100f0ab8064d8f43d5d4eded3a147c3f5e83457093181dab376d491c8c87b82ba9d7f40549bffac7ed567da7380dbc842061e16a680865074060687aebdf100af5f91b67e60dbed6697e809c1381563656280461d615b99de65711d9178fae6056f64cdc3a467c4f44ae4f354e7b3df767d16ecd7e517497ba6eadd3fa567fc3eb8bb195a94782f9e58209280381dacfbd16e37ab5ad1be7fb53c4417ff002cb8de720c3db80e920dfe6ebbd4e61138b91dbe8cdc2d28affe4933827c4963afa25c78929bcb5c47b8a0cc4a64d0a96105b1c906a106d4e00e3bb68c1b00d509e69f88e09b2710249f9c1a0fbc7580ad6a597aedd004c21e9a33d1447721004f8c73f4c840f2d068019905bf6e256a3eb7f0d12fa7ef1f167c21bfb9cc6fb4ced073276f4272cb36603013e4f58cb7ee6bd41bd33ec73c8750aa76fd8a5ba137ef4e010688ce3f4a90d9c98594ab6902a16db6c680ac2c129efc3e5e73dd7e27722f23a00ddeea7287a37e7eaa5eb9ea9efe7b256b89d51a87a5ad2935845317e475671810bab7a983ff88bdf04b24b07e96baf57dcadf4eec641dd770eaef7c9bfa0cf340160884a12adff657cb8023869169f3e82f483dddc8d7c265a5ce59 +SHA3-256: 0f8a4b9d5ce645edd4b7b15553f6bab89afb5da329dab255394260e61d3bf16a +SHA3-512: cffb14381196c3809a5db4f458af1f9878ea5c388b8d75cbb95243d70199ddeefdb5a6012736f34626e11bcc975e161535bf7727a951f3787ded8e881481fb99 +SHAKE-128: fc532547f135988c2a888b33290f6c2e5728a5e0bb6c3b147bb0529afe86f2c1cfcdcda00d4553edee763a3138c9ba32aa6ae866eebd5ed77fb028c1038ca0265cc61d97367ab1dd3b0e48a86dd9b952568d8b8919c1a0e3b2b9ac0b5e9ef597439601ea12464bcc23e0425e018cce33924346c6aa52c2ab52c7f7d837776d82c42913e55a24a3fd405ceaa682afd4b82855886e599f1d6634d5f1b2dde8495142144de6e61a81ff64d6ffb6c2c8939d9741c79f92d1fbd1db59c4669b0e478df98aeb9d2403de2f124354ce4172697a7322d13a8ec3a38810a1e9d548b4144fc805a4278476a8accd61b1a3c28a107b3abc9693a1d3bf729962e11df7560b2ec8d4fce98a10e651077e05128e7232c9dd111f6fc508876bf9f3b3ccbbd650c9ae609a2d424c550d4d90486af30097e6541b2ad3eadb5dc952e46bd389055b3ff6979f0ac43fdd598c0183ab6fc172a20f9a62c2a3f921e244a619c367503e8038bee73e2473280699fa775bef5728f48df836adf3fc0a97eef252bb0681139e84f99df2d79f4ad739edc26229dab01c813180be86c47218fae684eed0673e4d16a4678da148882f39da47f237a44bb85bd72d0825a7f086403b113069da98849dbcd5bd7a0c303e7c05c787e4d5d5edc4269c377092ffc93f87adaf322f0d0b56386d8f02ca2cac86508a1b986c9d2968ce32c4436c3aa29ebba06c1a124846 +SHAKE-256: 48b282bf43c4d4e8059f9afa77e7ee6bea9fb84b58bb15bf040ffa244d4bcff81fa7677159885c86c862fd0510357d0f63691f0c583b924052770a0359c5fde45ab4ff7aae727e5ad4560f8b6afa36a70d69acfa3d22cb12fc4f9b6d295d5cf02f7198821c39eaa23052d90dbde6b79e54b9a54efea90bdab219e1ff9aa5d6ae6e5931e419fa0d1a2fe8d595a631346b7bcaacddd831fcee981ca9ce9a5f1c98904ada4030a1039be0463eee273b15c0541dc39664e5704a046b1d1f0b72a7ca35233bfa14e7860578416403d2de9c6627f5afa93477252244cb911cc3a1ce212c20cf9d2bb66bfb940c3b7fd99df8db2df718d7e68f1050bfd5457ae0d289b8e13c4e2fbbca659e79e40b9bf0213391815ba7b69f9730c6000290ab3a670b7255df123700bb8a3dfedbd4dfba063956fd3f02d247a6cc648116063d28de81376d0835722fd5c8e76bd3d4774623c94319ae968f29bf8ae2f99d4aea602ab81aedcb3b70fb807a4591cd992d0de6fd8ee39459ad11636530d7554cbba85fb3f974386392e37286aa2372c106d20baa8d7b8e217cb101e03ef9f75f7c5ccbeb10214797de0b477cb38ddcc4b2ac2f33f176038cd4c6db34e204ae0451ff0766d2cc630fe7c85076c95f26a457f93fc34624a1d27bac4006c041d4bf0ebb3bb5ff4bccab659f557f5926fdf54ea5d12e3e990131bba12eebb4be96796752305c06 + +Input: e61d3bebe9f35801eab9e3057e10817a37f87c4ca137c10dbfe957ca3f89fbd97716fa6f6dc8e7c5084fa76a637fa12826dca88ca430c99e06ec1a8877b3065f694eccad8ddf20d70b6daa6679ab18f68156eeefaf2c779c2f7264e50a36fb26567f762ca102378dc27cab4f2e4cc94a035c8b2f1a5f378c74acc6e2b5edd89a447e690437666c3e010abe4284a4dbeaf8fb9534297e5e8a2f3388abd329d2375a036dcdb8ad121c9af6c3f0a8f4fc376cc8f722c2de3f847db74c0c9b2d98c799c55865bfea378ec8b1ca00455b8dd06331e2559083c16400c51f591dc282d66ca4635b4ac4330de455d4a7af027cf274dd0c962370b6e26f199249a3e8445a22534b5819a2dce26a7958f645c6a713e92fdc16dd52223e5c1e0e1ccfc2840dfa7c2b49bb23d0ac65ebb5ad143a5f591c6de3f094f448fd2e0a74da2f7cdcda360743de7f0ee30ff38ec8a0ffffad137044b8b93c30ac308f64c97a9377d900fe07a530fc7e23486575346b725413b1e9af902fc083d7d68d268a8eb4a39c19d8a93db8f2ab910dd7b060f875d68e851fe1b69a8e75a64fbaa49c342c7111144c95511454d626fcf689a3e764629b15af5bdb6958a23f3e58ed4ba66ca3fa6777f2695ef2d69c24aa92748fcdcb588d48452c0c924175b6 +SHA3-256: 187d3e3331d3157198ed7e910c4d95a1c187504468383e607baa5548d7e6a5c2 +SHA3-512: bca0154b4a797cfde18ea0d2fe1ccb90181df22f85e86fe3f50660b936d42840b51078fd7a2b2009fcc4268b8b363c1595d1a21c6fe536bba793cef8cd7fd7af +SHAKE-128: 27ba1160e90da4382273490ccc1c381f044a82d11dd9bbbf0268d764d192959dbb498d9045fa4e005b991b30c31e8b12cc7ed90a7414bfb12ef92b0716a2282e072584681877ed1869ed5ff30ae788ea06aa561fef372adbbfafcaf7dec30ac0356b3571515a421728a9c9b6316ebd3db2038b658f2936fdb65ef22fc349632e4c29eadca4cd6e12e3b66bafd8abc46ac24f230685614bde3872b3b21200f6398e0d143a5ecb4a169872b0969e44692531d0124642e48cd4d0968d9e0041ea297511305f6b4976e6a34368ed26b65108830a6b439aecb5fa964edc54a8cec99f9100c1f101d5d98367ec04df399f714accc7111a8019f8a857d3ec1741847c96e23e1be330d67f7e0eac246511424b5ef41cb18649b202e23b41e43f991a2e49f507fe437cda923371717db33a5a6a056a00aa2d861ce2e1352cafa7e529e478d00c2994cefbb2d14ec74568d1df7f8c0f8ea24dcb05f3d0f98b30f36a60605d1d3d7be55c5d8fcb1a380ac2eb1abbbb25f28304e17ddce15ab163f5aeca5f12c25a908231ba485207e4471f6105f3894e9470bf8711bef0925e49ec58a48ee869ad8e60b4317215321e07161c713970ae692a008e7304ef6c17ef4e248238c62f357240f1065b35a907c326d528c8529b703a382bfea504eea9b390a522d45d1645f3f5e7d47f2ebf152fcbf352bf6f48f9ac2cbaa6d067bf072c89caea152b +SHAKE-256: a20f0ecfa25a0dc4ea3ee9f192bd368420558864cc242d76e168ab5f54eb9df8fdfb4a00a69a4e96610488a42902b1b5aa5e4f72a9f343dbe45515bb27dfd76c7f968c08b3e91695f69f736195d49fe7ea36627402c4c2b2b5e954354c8991412c6e8deb561bfa796a07d507b298182e1f6a19f52d98adf5f00e3f7a3312b3b7fe28b58aa4c303166ef926e4634b8743a92a8e1f089f313fe860dd59fd9a53f9b897f8be65737e7f8e2ff89545b734db4c349b3a00219e45ecd54fbb0c8090607ccad6aff0c571dc7abf198d5d1bb45a0167c284be46f2000d7af794a06bc25faa9be1776a99a93afde9e6f70b5157b049c9231ed94b9365712de8ff0b0d2534f5df92be0e913285e6aef03deec9718b039f4e35cb9fe54e727e2671e71f7df4f5873abaf8f994736d73dac6047702bdc7af7f66f6673199573baf06f8ac552be4d78f4db1ba8189f2dd230f47f6b14c974e12ebda61eefba1400a987d17524c4060c7f42729b5e6005d9c00ee503d1ad851d091df1ec302813f33fd4e9da4136059c1ebdee6d33f0e350d553e25390b03a13bbbe4dfc88a0068a039320f27f18aa460c9e5577431699387b75c2bd536c0fb000370f0e1ca131630f733b1a7b7a1dab67573ba9462f18f927f3bbdbb334911144f6d4a6f1063b18a4da596e7eb225309aaa547b364a3520b36ffb93654ff8ce165e02fcdd942b247aede4c7e5a + +Input: e8e220ccbe1cbb8d069b01c77d9d46eacc61c2473c3a2b802264506c86fa8c971288546efc6ac8fe14ba9c1a9ce46c28cf87d07c4c380ad342b35b975706b9306d133d1db83b4e517362bd00472a0a5eb06520cd23f039c43c7ac627163836681ca6b6e2e733eb0f6ea0d152ee23172834236fabee5d9914340bd743a458cf3daa0e937e229ac6425781db7378db711df0a6be6512f489822772f252ebbadfb1ffe0db369589f4d1b26f74e02363f1b837db130722d24a34be760d8bec1cdf6dbc9f924be8d6e2e40043298ece5aeab2331375f7bcb7f42fb25cdf6b5f8a0f520e3ed8081cbb5dbf6b61afab36f51769c395305717ca9e842d5b4ded265444491ab58765557375d0aef1e29739ff1e9d381e0aee4aafa8ae706dc52dfa0dfca098816e23c4bff7e83ddcfc1c3ca2f7c5530cc171bc1bc28692c51d4e917979f738674dcbf1da5d22e849255faaeb44ed2e0204fae65010037904090127f7afa2ac977050e516fd4436a8fa6fbfd8dc5463e229d7f3a0569cf89ff11253cae61aba47c3d67eaacfcea4139605dd495d72e91edb5e5f5aae9de4cbeada7393489cd7e222b14d20a9f42db0e7c4b7f0637a57def3686f786cf8b49d1d1719e90ab742bc84fd9c49eb40d952046a911eeb5f5032cb7961d788c8b4 +SHA3-256: 51f97563623fc8bdc42706eb06ae40614c916b9580fc86242db6cdf7f7c4f4b9 +SHA3-512: 41dba5e136c6c3d49a8fd76006b00f4aaedee5c378ad68027e221311017d4ef688c411d03d51112f5e7c059a01dd74a838f4bb2af38f752c76360f0b92792a83 +SHAKE-128: 2baedc8c5fa56a99a4f345d3beefcf7a40682da91b13246e1eacaa1dfd05b3097a7d9b411d769e37e674fe15844eb41a1ad154a136d4c113c29bf9c2ecee2f498805c50914b150a39a741236bd23e3109021638a305dba6325a9c349dbcb150296f3f3f5ce7ffe226b4cf99a41be170426624ed8816df7411d655beb7c4a785c375f865faae2c55dc9f84980c889845e474f915cb15c12ae43cb2631dce2f1d0e865b9072cc8727414a6d00bbe4b916164f25d64764aab0a70094534bc55c641c9402b88c7d03408874b665be20fff58fa5e021fed2c279f1ee7859ead7ee173f44a3e104d481ce2c718d86e2fb6a9bee0c535cafa12ddf47ea272d12066ad6ec8539ca474a7dae60de64abfe5bd5a2a2141bc4cf5c2b4d1f6b2ee3f5bb9cc700da11a57fdd00fdeb649c43745af6f0903e911a3388b25b7daba5499a958c306654e2b71c27bdec2ca306c9fc16ecb65a37947e2b7364a8b138c7f5c59ffa22b5e02929606a30b2c2c9ee8b96bc5793a7bf8d3a13ec669f472c4a052b37a24ca866bbca5689927cd8d6f373618a7c5d4e38e82055d906f47c4e121a7d56fa4ca953864cf4cb36621eec3229853235f0d651ee63ebfe393dca0f9d8bc2462b39001d8ba22b4201b3abeeead01905011cadda624280ac8a8e821b70dd04359bd658d3cd838059bede2853f63ecedcfece37b566b45722f2a7cf1ff9527a577c777 +SHAKE-256: 6745d503ff3e061f782928500ca062e6d4381884d00886c492c62a6c5899b0cac187c5bbe3f593bea2afb52e9a58934050e9e988ca149f2037578d76cd31728b1e901ce7281d32641fc0309841693b69c3659c558f16a1a8b46483f3076962bfbe599845115e4752216d5dc341212bfbfa14ce742dedcc99114c7b9e47c4a4e0c5cbd482bb920ff351937bb4ce6d1fc09e0915c6005f09312bc7465e0ab3fd2ea3c8f199628d761617c2cad4eb1f09b83e62270f57ca105666a40f8fda376e95c9917de5a090049c50be5efa6bb369aa19a8c099abec64b330d3b04ea8056f25a2851a7290e00295017560158ef1f7a3b7d3eab841faa77b64c9541e8675a56a3f5a694aef70946c1ed2c8e05791793d52521b0bc8896782ecec4bca6e584536bcd7b2c21365b101fd71bda6384ca2fde1819e1d21eee07e58dc46066ee30b1fba34437c7db373c60b8fed2e0c8185076f0fe777b4039f2c05a909c014c7f7517d2d8cb2291e068571fcd1611307b2c48128d7506704cd89b526f55aa77cad3ba367969b8a5478b9160ae15898526dc4d5685a2184c6252597e27aa9c2c6a90892e9608e11160a69c8afa3f0fb4522f394e613dc3ae03c5667a7c0e690fa0cc1996c1e434fd2ff185ecc8caae1887de628d71900d02c6b1aba83eca54ff04203d9bc097f4928db55608d0559941a810ba7e79faef70f0cbd36efc84791eae393 + +Input: b4d3022bcb91f04ac30fee0d98424251bf4d3da3a56bb59586a4e8fa371504532be89a2dd8755644050ba116906b81ad3b8a8cc3dce0eef3a1d92cfabf64f18ffe8ae728e0dd574deca6212fe8d81e9e6e483a8a2c834c9dbfeffc83ac2d40a3dbaa1b474136a33a069898cf8659e7685275a6814ed123ca9ff8070f2ddb94d8d3c4fdfa4c93fdc3504bc41de38e554e82f8d00b6b42962a3d11c8fb392652d97dc25f0f541723f54739149777704feec6763954f209a70b3f767719b5b4dd95ccd665d4587588fca31023abc70e0fbc6ce0040ab11a61a18b38e58967e4669e0891f20241e3d5e1331a80a4387564d59abe6027cd587f0c9abd0aaaeb2428de74708b6faca5f92d08d9e6ae2cea3a82193e240b27d455364e3d32fc7fd7620393e071305684c089c524d8c5949fefc7a65b814c161207130ae2d43473394446724fd98ce6b1ee179493f979b72c9ad244da0487792efb8d5693ea0f4eeb3fb94d6e609b3e343b2e9598f6afaf4960bb65cc659c23d2d725e25fa2e2fc4ffc79a89fbf65334c575704b27af7db94c9be07b2ce90c8201ac831ae365c6212f1a99852950432c54d2daa8c2608639d30e80ece969124adb23a29239288aa60081e3c1975aac27ab6c83e2318452c2d9a13d048e4d1bf113064020e +SHA3-256: a6e3f8528c0d781ad16f0a513371748381399d670f1fa7bb0a4f1461157a36fb +SHA3-512: 881bea53700f2b432ca4b905253737d54f9d59e6ca2bc312538f6c3b435869a386e717a6b8eb5aba6e1ed1b038eff85ccbf87670dd7c455fe0caef41d1d8f472 +SHAKE-128: 422a2bae7876bbf45c6d237fef8abf5f7d0cd5a58f4e013638cb57fd9a2053233bc5334c6f4c3116d83f84f0fda902a4152d56009dedd89ec45f3d870dcc92531351e2ae4da7d92426a31e86a45ce937c1c1a8c69768ec019341fa3c681a72307cfd218e12716bb668d39eb75e295bf3c7d1454fc8df0777f4673eec1016b5c9050745712ea5a8d95271b96ea18490918a5b6acbdfb8cbf23f6526a932059415829dd57c79d96932af942218c9014d96c4108610b7618026528b06ba363de76cdf9548084c55c38535acdc25b6a1bfb97004bbd817b3a3df3d22f81b75447116d1ca91c1f7822350ed1762344b796919c568b7fe053aa2ec9df921e32c4179281c36c03feb87ca4d09cdb2bd120e0e6dcb0cccb8e54d4555286a10023584530de28c14f580420e90b7b8eb634b527c9dc0d3cea0c4858922ab2032426523e3bfd954d2c6fd87b33e51951cf957a388254886407e161a83b9688383168475a87f196e0a5e33737b2944cb42d175efe5693f2de0289555f573de0f58f9dcb851787cfe79a11ef9913fb198d342d80faf1d44ac39a0af5a3d30445dde667f268cbe2f6e2f43d3e43a81259f0761f54dd8d22b3ecc88699069bb6c339d4ccbe58dba76405ea841548bfdf124485cf99ae94d766249dc8d1b05dcea4d82b0084dade144007cd58f748eb10f7f2e51dbabaa57eb77f55f93c2f494894fa8dd98929233 +SHAKE-256: c5f9e06a5b94001e4d3069e6169880baf40a710120cfdf186f931be3961d5a3c2fb19cb4e0282f22ce5c23d14fdc4efeca833af354c692fcf821b8a7a83fb2b8e6740968ee24f33e37be74226cac135f7370c024c1558b974bdb0e00c1b92aab705c33cbb0ca15e302d987dd45c28417341d5ee66d66b884353d5689126f10371b667d7fa9032082f2bd0c443e778d5c1b375b007e809a9013ea5c74b74e666ef44221756df4bc6f4829a39ad2b36ff1c5794b5b45ab279f39955a1c0a98ef0d7082b56ec2b3b81ca6b68f574146dc489ee2e46b6a9fd9120b0579d26d90723560b86f1b3e53c5302843a46f17ebfc4a89ae0406ca5c665f1400fecbf90f3b8926accff86b9eb3c3917cccfd3e715d3e2521ce1061b08cc0dce16c94fc82d3a708f9520e17c02862ec57ac8c47799d944a93591c18f6da7e38fbad41f559a8bf0a1f572caa22b1ee4684abaaa26ccead04db40457cb4ad3a58f694e22968f50a3b18b87ba570e229d6dae7633a36d8104835c7ff48197aabe22328db88e9f986c5ef138ce16b362d0f80fe2d4455efd718c3de382d2bd0ac91a7c03119db65751610266fe586094ed0203864b5ef04f95d2b5cb4e1fc1fe572373442c2f1d197d17aa3ae5f9e65a8996dad8720b9ab00dd52a643525c627c93d77fbba03befd6a3785c01ac6b400f9d558999fd40d70741079a76321b8c576aff70f60b6eaeaf + +Input: 6507dfc3a836e0675fe761c5ec3ac804211cdbbd3bd79786fac74bfcd17dbd6a15514c818390b773288bc0235b31c6c99e272d31fcaef739fdf9894de347930cd1f21a78ba34c3216a48987c85dcea8a6a231f109786f46096279a0ca179940d724811b7f14d43bd91e9baffbfde07f61902e2d9581af09cf8dac29a4ae4566872f93e9aa33ab3bb119a618684a2fd5a64f5bc5c9552ae2434f6a3c421a1ecfd1dfa3f100dc3df71987b3c4ebe6ba4cfadbe229c11936690a581c48a7e52b5028b0d489ae5b2cd0eb95f140617aefef344f585616aaf76361c3bb0428fa6ff42a30c0f41d7a2247d0da38172b9f05ab80356ff7bfdb5a44f2256a490d01df9dbbb1608bcbadec05a79934dab1d8f400ae92a90919d8b4f9f3ee8a23b6cae3cfe5da3b2a0b45c624d0ccf42de72b012897e5a2eb0eabbf4576542f6cab3aeb95cfcd9f38b3d169d37213c4cc5319a24b48eb12f54aa993268f3334497ad9f36bc9e91cb4076704160c3a23641ef2afaa88fc7850b2455008a80380bc34f87c211f57fa012af7155b5bc15e9061797a6647407fd73a53197a941bb6e15b2196bf2d911d4f404c586d2991d1c8bccde3b3d6949642602ccf209aecbcb69163e08213efe54015b12f19b7b4f308159c79821e97b84d99315fc8612c77f +SHA3-256: 206ec7dd35fde1b697ec2d7bb53008656188f8c111b24aaa86fe9723efe3cc6d +SHA3-512: 2ea140d263ecad9532762093bdb93b772b3ec8e384784f15464993c31cf00794b86ec1a264efef890727666b7d51506ab529483b58215f3cd21d3ca1d41892df +SHAKE-128: 5f72193815db9df9c95b07326f619c68b6c268f26136e6b1898bfe5556e1001a823742c8f1bce28e37052e7a7d1d3d8dbc0acd8f4d6ba30f59cd60c29ff3ba3fb022168225e00e57448cf950631a035b2563703963d4a080e5c1bf5c5778f8e200db6e5a172faef2cd403fb9e0722f9d32e57b4a967a22c61fc3db3e0a7d17142232b8f031cb483bb2c83b630061ce19c284814cee08fa1e3bf060861353b89053b1f9bf08de00255dd52789d99b395f02b2251500776300f6ab10557b932b770d5d5e7021a5cf0a071d023cd9c8e07c6adb68ca880acde116f016c8de9a6bc65497015705447f3b0ec746f01ae86cbf3aafec45cd41b3984a5c4ee8af8fe205af5b511709798894b2566efbb9c54ae86b9c43d10181bc47511ca209657af1378591eadcbfb0238471f41e016c8d671eb31cecc4ec7aa9ff55015d79fe2de2dce7399f6583e54382777ebe553aa4661ee7bc501b4611e2fd2b9da10e9b02907a6cb170239cb81bd78939794f800d22ab3a396b6f90b1a6217499e8f937560841d960fc2ef9415a0c7f045b24c5ee901425dc2664c136964e24d10ba8a47c26b2a3463422a5dd50faddd1c43f26f1f0d82e7f5f1ef35315dddd2b60280b64c4cd62adda1210f8616ee51bb3b743b67b47f05dd7832587035ba27c030f003afda3bd5028a4520c7c901a69dab456b314aa6d92fc530fac25f643ac7fd0351175ac +SHAKE-256: ebce28395b88df2f0a52b0acc1c6ade85e947da14d5266bdda229c64f098a15c228c46ee1d15298f25a91a7ad8995f44c1b3e53277cf21da3a4182768ead635b32613cbc2084cfaf0841306c09984b3f70ae28473b59fe65d78cc16e04ef4efd26acf70c1a67f85b784da2a779d6dfa5e0d2b8806e1dbb5069e0b52bf722b672c28c62c247258bbc7ce44a718f4007ce67a24d58a8cf2b430bc07ab17735f77cecd14fe1223a06a985d00ee06533f1270d349c089600f5b8ee99a46cb7400e8aa552c43c632c05f911bb86cb36d35511c9893ee1a3d635a83e35482e5d542fbe16d4a30ecd3c9ad53ea7b83fe4a970098f4e6a3cba363502c99b872ef08cb92b3366df4d380e16f402e811e2d9b7b61a9d0a162ba2437f35f1066c65da8fe0e861ea8c41587a18296094aa1853da201dee36e56c6cd0ae52e37ccd4fc3dce7ac1cc3c2a28d0e2b73f543b5a8bb967f272aee2da2b8426074081549a467fb4535b0377f96eac1fc9ee1f56314d52204c595651450443770ba5dae7b6ef7765007d314e50020fa7f7f404e12406673a52b3e46672826d603dddbe4d9ad1f5e91e84d23a729efdb4e73c26bfd6e2f69600a2ecc39097a5a7e4f1c7e60f9f050ccf2b91c6af4a9e9f4ab44e8d77bd1a2a8261803891ac60e91b605cd26835d0babb0e8e9ab0ad04be943cbb325b47966e133e59f6838e40beaacd4cb1ea3b0cd3ce3 + +Input: 3b7c8825d72798ed1f7bf71bbbd2ad0150df742ce34ccca2c7151a83df603e1af8dfdceacf17080f9c8bf6d33be1272c650fceca0b18c629d8715cf43ec53062014ae84616acae8b4e9154adb7d025f3094d45850da71bc91ca4f10d2e18a8e1da42e71723fc6103ae442776050a89dc84476a268e6e7a1fb4e01500a83eab7668b698fdc1648612771714cdf3a16e11d3d24f710a43c947cc39d7d218569e684031018e53894b94c0a1f76395904e966ef04a3ebec0d192452a1adcf30f7659ff70b0d8f24f1239b677037151f7cc4048bc7d76a24df2ce19d5dc7d76c0e6c096df79370bbb1c16331100527816c1f6dc440396a2570a9f4dcccbe637fc3ad1e0a9bb32e20030992e600190049190cbc6d503ae69a5c11fe92db46841ae26fd6de8cf0231eaeb11e90eae7aef0cc8ea98d0c58f3681bfe7332adfd1814c11bfe40787f74d67de3ae5076e0374295ab431c5a6461605942a6e076378521b1f9aa9320c21193f8ceb759c9667ad12f475a2efc062b3ae09b83b1a0072956f6390b2514278515e05939821bbdee89f2be1b607bd330146d6a18027c897916bd791bca24e91aedc4b1c9bd30fb46dea0a9b239b105c7f73efd6c06b063ee16d69781390e8383bac7dc86768c01630fc83013725f1bfe9c6c5e06134c3e1 +SHA3-256: f00a604f8ecc7f4943953fde9ce30cb7d803f1a657c891240ea154a5cff2bdb2 +SHA3-512: e5ae1d5ef3ad03b50fe21911ce08619ac70dd0f91bacd7bb5a85ffbc959ad7aeea872f69903f64fa29ee455ef5a55ec70499861b93f8d07ef6e46ed71569e89d +SHAKE-128: 461053fca799a61779fdcff5c8035cba9293933d51a3c60560d795aab4081d670a01dec137f14e3228997b77ee44d717952fcbcda0a1f5ce648fc83fa20121fcd536b1d4159dc80b81f1c62e027a813afb501e1e12709dc9c9572bf12ec3f860fef95ad73f9a9f8178080233f0e2403dfa688234711762d981652db87004457bc415a6f16deff2006eaa1d5e0f085b9e25e4b8b5d659782e9be818254be4c5cfcfba105fae37158698e952b28f7d2026c224813969385dc81482d22c5d3ada6cad7ebbafedbda1c638a93b43c2137e05e38deb2d6818518727c6a4523b4c8e51cd1085872cb900065408eee415d3c1744fa9db57b7b894c6a0c01a0ab5672a836614432cbeaea67fe2e03ea9715147306701b376060f320edb23aacd47d824df93b845bba783708eac2aebb541847e21a350806002635faf4346047498080018321e7ebc6dc6a8be04b6c1bff980d37c4efe6a0570a94e5a530788bb9e472c2a8984d140b1081b77fb5aed7ac41b81e29ce2821341355897d6494148afc4158ba7735a6159d1744fafa6c99c584f3ebc56c91d3279da26b6ae7adb293e36a55237c223d2c4ab470b80a095edc22fb70a0aea3726a50188f8d3cb2edfc7ce67934ac6703010ed4f48ae05ee4e9c8e80126df2ec67d42898108b3ada796614cdf3a0ae2d13d4c5895f91adbae13ca99b5521e44ada1aed666c9c0fdc099c41a58a +SHAKE-256: 56048699a68219c711552ec2fed9de656e52c501e5ecc925bdbfcfd7c48dd8740bb8761c5fc94a92433d6a0e39b0f5280cd43af26144c356d4bf96d8feb14f3ba6ea484a9ba01235e6330f6a15f1fb22ab57c9f44b67561651e2a745a7ae061c9035e1d50cf3f83a190c3d5e214c48d198b6a7f1f30ed7858cb864747525fc7661b462c49b90919b8bae8f184288a0520230e57717471b892428a396c652b708310764d20e81e17b4eef3479d3922716deb08b2767d7507b13caeff05d157443d678d96e086f4d01ad608216e75bb9e0750b27c934b4a4b8e02c6c4fb044aa20f4b02b2c3bf09cd0b60a98d248d1a5d967fc0c7e20085282e2ce4bfb4da0413ba7530b45485355b7556ff2e95606d8b75bc2522dff1ec283c22c8925f532537a67f830cf5fa14d95d3dc971e7c3497733cf31b6014eb8dab1b4fdb6c035a50a930f5c813b1b6267370c344eef2a39131e64b10a032bbad808182c4aa5f0532888a45ec37f1a3734c8756cb701ff16c5326d6ab131f11df9c8169f0f9d0f1e8576c9bb0b89e6666a0013baeede8357d5e502452de29beaeda345001f810cc43679905a043838b1b76d85797033b8c6e03ddc4fa384d87f99cf10b44316029c1b94693b9bc9cd18ea86726d6f0055527fdd92c278a10ce4ca4aa44161fdafab463b6b483be6c8b0824ef998cafa2447aad4e595f5dc53215f4c126031729e2fc79 + +Input: f7f4b8e8433607a927480cab21d263b1a7fcbd9f58c26b76e9a60ff99e34423a2642b561fee9331a2b34d59895226fe9ccb1c6d6bf32919f7139539d57477796f7ef8cb20392a137db19df15afaae54b4af2d58f143a364b85b92135762e1f04c6099c3e5ee05610c6b78d71c733fc9cdc89e7cf45de71bc7f3b24a073f7bf4ea7e7db1dd995cf8e067647ab386040ac9b14d5c796bd4617c7c4e95ec76e2750e8fd0718a82fc0bd2a2f671cc1e8cdab4d9f48ab76aa49bf1797d87c167ecf89477306eb4ef9d3abd96e1d9d99418ef4f14b8d8ed6a79eb14b2c71cb16ba6bf94ebc1e64a4324b344362941508d785d7f3d710b41d0564bbea58f0f6e843661ab6e187c15aa0cc0d6d09fbf56ecd2b5ad54781b74488bc69dbb90e5f06de6ff5e020ca7db54ac52648b76e47b68e17f35cf32c22ed16cd88c27e6d54e5a2bdb00c8450cf85a332f6221eb02bf049d09182254a32caaf37b697c69ad841d374a0ee779b13d709386530f506fa3593968250e61f06e4fad62889cec65d4f65aaafca7de615af08e59270cf3722c0ed03edf170c10f47ebed651a74a42d9deb17fb3e0dc9f860d78edff5597694baf6e928f20c2c1be2c157518fa2bef37d72d1e5dd4f03e63e4364d31333ff7b0d9d1a231e3e4c4871aa77baaf4c1fae9d +SHA3-256: adc72d265b2c6e016cdd026027804a2665c86a758e123dfafbd9067ef91a8252 +SHA3-512: aae4be63b00bbbb7f4d595ce7dcb4cdac179c4e406701473b16a7a3903cb15fb13ad1549eb31d04a52b60e21ab0e7eb5d2d9fe2d6874c37029702eae81420fe2 +SHAKE-128: d880037936802bc555f4bf20964c36a015069fee4911d2ee65e32fbb8ed4e22ef1eafc82ce60d60faf1626c8b136e01a7adc9201394d0dbf6d9f0556110cd40e9d24903027af8687d911ac5018fad88613d54be0b4bd5b36be75ffc923cad4844a6ece04c5bb166a491dd326fa9e204f7ee4450b78b691c9f99083df89ce937d6249f8b8f9f74f2ba04d20731289b62be217b25bd8e5786eeb0272fc04b52364425b51e50d817b1572d5066b44b5ced71a0193ab20675e8718680d5668d351d71154940cebf3ef8d9d0cceed0ed432ccccbaab1f47b85ed82964c3e05829fb08811e104566e0dfbca7a5586fcf29b3265c82e25d3f5c703855b5228bcdab8520e52289fda23050785f63c72cfc899530d5bb5a9b509fddaff02588d71316abac9724032be8b4c8e0068738d610571625027f016b5b1e5f4f7034dbafb22b4d01ade389b0e8dab57ed2c25dc4f91ddd5135e35882c15f47d776407f40e0bec98bc04534a5fc535617f3cf372b4f5682991666607c42ba9ea5155e79d35c0133b92cf192bec37d8eab47c307ce18a288880687027e553d48f9910a045ec301482d877d1e34911635e906770e06c7786065489216ba4a9145980252ca0ca9ec93f1d7893e7a9da24164aead6bfa60c2c69a771f7340ff70fce5f176bc64be040a0c237a0fcb7ba09b84d52c8cc7ec1cf43e2fa0171b555ab6d3be0998ddb591590c +SHAKE-256: 5680a78f8f098956eb6f18310fd7275a1961d3dbb1dda3a800f0393c6294faf8378d6bd8d38ad1a4cae117ca4723a72306f68c6fb9b2e66a3f4d474d0466b0f1210c8cd0fe055738f75de6b3e875bc2d65a4da807e7d053c4a37863cc49cfb909f33551b29fbc8b83ee496a5a674ccf64bdd99967ff2103028495de93d6b3588c439363e77888823ad3a7e4bac0ddb0673d31a5a49a258b34d8817f15857b169a85aa4ec4ab12875f9a351bdf25b5a03569d020e32c674fbf58b111ea87494bbe02a735ac8cb469dc29cd99f11b0152bd26cbf9f6eccbb28c87cf4757ea02458b9aaed1a95cacdb4326bb51de46568b40ba2d31b93214a7bbd14cebb764c342a54accb361c67037c16e89c93d6280e1f49df2cbe3dd69d0c523dcdab18cdd9ed3ee2efbcd3454aa09dd89465e1c2e4063d825d71c5f75dfe2032d8d1ae22b5f2ef0df5cae38a88436f3b577bac1695f7a37acec0e132c25dea78f5547240b678df27d74323fc2104769c90f6f59b0b8416873d700d7e52de7b78bc8f680195271f3cf277e53955a976f4588f66b8307cf27e79f3d98b09e5af787a6ff97fc123fb34a9ce8f5fe93231746cfec223f9a0a0214c5ea31d949ff59c6bb0cc0b31a4d5e7dc5669b95f1a4d2657b7411b812cf249b4145b9b435a45e5cc6341f9603388398123f2d3e460c9276451ef15c7d234c283b92225633c7dc32ddf7ac8383c + +Input: 35f0e1c9f8f94d8d2b83a6c2cc4cbd573d340a6b515183d57a7aaf9aead1728045d63ecb759a774b8a7ecb2a17dddd010b2c188b56058e88e4ec5ea81492f7919a2410190019fd27b7d9d2a8049015e601f722b536455ad914b1e8fbad9cebf8a0d3b1f670b98b23eb6a66ce1410cab59169e08b2a1d21fafcafac2d52e54951c63594d512e289490086c2ee3ab43c0d8c0d20d6c431ef94cc907f83878937a7a6d8fa884ebbe09c7d251a10d9de550506a34a4e09f0123aa3a26a891a43c36adbc258ca114b24c607acc0e95443e60183d9c02c8982c3dbba8687b587d2fc3a92f8026946559ac088e74401a05d76f47f7590181615e68c2da9cc8b595add1565df8dac95577e3db486f4324889e08be7e3a82c61d207fac5b90802334c904824181bdd0f063eca26405ac4122cd5ad65a0ddfe3804c3649cb8fb8e3fdb6f74b7f73674ce2efa2515a93d19f83168aa1b00f4d9aaa919521511f568db45e6d8bba52e65e55ed54400eff089a4b2e7b1df322203590089aafa40a22cd456a1e0d41e5e4ba43292c5a1313c0ccbddf48c79786a513fcd1b0317260f9c28d7245ca53cac7e62752e1874d39cffac75c2c867d8b6ff01e83852dac1378140d0e3be14d35df05a2cf31fc0ed8aed910da71e4c18597d439c409b5858a13c7baa +SHA3-256: 11567ac107402f32d9faa4946450a53dce3e633d09fe1296a2403736147db02e +SHA3-512: fe35e2c4e06f2872065da653f5077662f725efa1a064df04454110518a05a471226685de6acb008e738f961183659d030388fb974b3dfb194fd64d83515660fa +SHAKE-128: e3214d0fb863d585b1517f2a8c68851abb518637b2e8e49f6e998fd1f98d95f74854ff0c1e9acff971cbd7a6785da89b0b9f75398576b1120b3cd1a79a88bfe7a6b7763ec4f4d7f970a55a651a9fc4c4edcf149cbd5fb9d420914527eba3e49e8a55727b2e36535568daefbb7da1e3e62898b084d92bb8127b6ce59fe0d99f884fd16690499f5994660380693d625975ce1e6d3f31b2c534b4a4506903f871e4b1036dd5f376e4b37dd4b1faf3cdeab01c0a866864b4a9d1f5065cfe13afb1f5a58fa76d89feebfd0c62a50a717bb298d94c8b8a84eb69b8b8502c620c649340c5725aeccdbcbd54d0dd006b2b456f0f98314a372c5ec03af52a3c31a4de5276b048f5f8074d51cfa7c96c818243ec5430edbf2b9248a7c6f57fe027bd445762dac5f8b4922b349910d4452ed00031e1c1da31dff0e711dc682bce9164a79c2a177db529c269ee4576f16a67e2a50d77b67d2b9a0f3aca584764d6df89259e3179d266e0972c1a06f678205ba63e7427ff5e0766c5b945a3453021adbecf371e8cc439e7802887dc2aca633c414c91ad6312dbfa6187b42fa7bfb1206c39665d45e8ee82ce2a86c8ccb525d762f743341392f2eaaec03194d3f19745edee016cec5f3085871b7a6bb2feef2dc773fd46d8a88e73959b7587c117402024491330c5c76ba6cd9255bc1182d4eb88eed52e42ac315f4ece90dd297eb92803021692 +SHAKE-256: c2f1d20d1102c7afbf81ba2a618f00afcfb52a19efd912d298f3541439296576973ff83fc6eb1927573a9b341fef3ad7dee77d97401623e18a69d7772781646c4fe676a832e17a7b9535fac06147fc06fa5940dbdddc52fb08afcd363febbeb956b1358d75918ecee991636d2c5d381bde250bda6ed8e1b541be791d88cde6ec0fa7d9ff3c8e17295978ecc3ffe9914de749c13b5729fee92b5ba20396699cf09b886cb30fdf5ec533bee21f5fe58d1b125f6498445e3153eec27c05651f2033c9805fbb4c84ef648ba76d405d65c3380c5aba8301ab739642b6bbb2507b10b54cff5945a12995d384eae25a2307f2705147b04d069500898e9f3236c686342f9d959acd30fe45bcb3b8253df9ee028609a5c390d5303478f4b9bec783c1ef372b34e04f56eb18a195dce1be36cdb9e9f492441efac0f791e3e4560d9a347bd4803f38aff1a556b117c41ef3e2bd26032d1ecfde94c2704541b68914af6ee55e4843a9ef41e1cbcc5bf3dc442e5f524cf6306072d18574b571a84ec504c954215ea1898071953cef4a15b18e7ed5daa4aff763687fa63376f893df940a1afb66553c9f90bcb2b30a2d26728d0b7d1a8842dd6e10b808a49611b72f64198d5680865902a3fc3ceaaa3adb252281e2c506997c1c0a7a515318b56c0a668ee703ca647e5e1c25581ab60727f99de09c46a53122918a7600575614b9ca644881f1b7 + +Input: ac540ae54964328e9d7c2d579ea72dff9182ce3fff95e90ee61460fb7ae2599a30da7b1b33e5d9bfbed7436c021cc7f72552a44961d63dbdb0732f384e51611f910f4a8382291160654cb780bb40b0b8ec0c7c87629c5305d19fa34b70639304242583ea35338e49db05b97d3e12e2084df72edc49fc5c401b674e70f45d213f020578896638df2ca15eb28f6d1886739c43f48128f2ebdc1f59c825ab3f683739e7e2bccff2a7e825140730036ce9e16386bc0a785b2245b799e713a633342a598ee08c81016d49af45b39b1da8e38d0b77775d84f9ab77423ccdd97b67bfa2139490becb6f52819a32d80fd285d3dc0aef383bef34c14aca50319100cf92fc044d7ee66563f32c048475f5464525d5bdc36427c88caea6eb886a98c6117da0a368dddcbe691d1e220231c8434d055a1f23f6f87380fa5d621cd456d26bcc3286d7daa56ce005a88c149082c9255fe2c5c899a578f4bfe5ef6ed48556a3ee910a4729f37192fa544bfc8e44b816b92baf6abd2a05d48395c36fa41103257e9f44a14ef8dc2d9dfc1712ab465c9675ccc84964fec56d22035a64106ffc300664a64298f3cecd519af3d1ee85000310f48473eafd82bbf3b053ca18714d6810c65bac4eeb01239a8d342fa28c4a3252e1059bde687e092b198d7be08ff8d9f4 +SHA3-256: aed4f59acee7d7d2f985faf2190e3964fc94bf9a4be10bc16706e52d508cc4e7 +SHA3-512: 070debad718d8baacaf6eb6d545f0a2de4d0568b4c28510b729b90bad9db7c1713c98130f1fb7b1a2891907f73ce7bd1eb9078cb7fc8409983293406224673a8 +SHAKE-128: ad1e4c9ef1602b6a30abb2cbf36517127f770b570689d3193e0f4c31355437792e86c7498d3876c5f527cc2f82ea17f688f01cee8d31d43a7c6d8f89978979496638a655c06be486322ce978c13bcac09e0142275a66b624d6c06ea5a6887862c2846147049fb35dcd1f37519eea308a7f10fa635c6633ece682a830c1bad99d1814591eaa3a97595ae6c6bc1c37c8891e6793e182681631c61bd4e087c0b309177b06739496a1b042c46cb504eca3ca79231ad12f7ae69660fbadf476ebf470441348b15dea01dc89b03e8f65f5d034b1229c1817363cb681d473b43ce9d299133b7199f20b838fc4383ecbb6c4d87530f9e8ea36cfae0086017786615109f2a0eba2353b7e502afbf74db86e7879adc6c06351634407d1f46cfbfc2d5a55342786ab8b11b1cca0a6c79914789f38ac64448a5ecf7e5a4c6d887772086c598bd3e8585bf525e5de7350c3917a07549c848c3eb2ecdc291463b23a77e088e3d78882ce75c703cec3878090245ae4ce08c65b183eaa08a93235a78e6ccb489b3177d3dfb3419ceef89aa837482f2f92b5b81e9074fe10fb548926ba6a85e5e906b1840694a86e9db206fb35cce798c4d9948f80fa2598541d95f6e95765db37c6681ba2df8bebe7a2f633aa25c021549576f47b0b0bc49059bd55422dcd8e5d879afe7e225aeb9e039885b7563303bb51c520f993003941157bd1faf3c51101be +SHAKE-256: 58ef9ef2d82d263e3a1e33f9ba0670a7bda43c9a5f9073d12830092bb2edba799dbf79edf37803a27ae45fb274db7ae3e8dbde30174875b744375b42608c899e9e815595ee1a0ae8da04069fae2d58c1d91faeae91f0580efa9e5149f83ee3f1c594701b81aba9dc6e0c2e94777569f52c073888f56d76cd6cc76cdbba840626b0756e9e393a02976d3107519624ac0d73fc40e93e30c33e9abc2301c02e73ec905d6067f538d35598fe5ef345d64091ba2184d75ae82c31d0355f90df778d6d4afc0bdb213b0e159c89b6b458dc4e9ba5d19f4fc59c61c1419336d2dc2ce44ecac1f911d188215e0866893f7289467f01555773db06154eb0e177e9a0c368cef88c952559ece865401e8ac4e0c387e3dd59d7a1a9e78f4470e607a9db21694de8b3d85d6b526b13675fbf2856682a40677c6fbba1af50cb362e22ad9020cbe3b974e8e056c3bad61029cc4f83ffae42c5b7349523cc5cfe64fb5351c874a91e465e001820be70c7a0d76837ae264dd6b11687c497961673358681d0ed5b7f03d8202c41d7210cbeb54f41f57a314baef7dbdbfcc6a0e33984590b72725280ce6f75a437867465a52f77e8961bb6cc4dff4b5bcd5d6aedcae9b5d69909eb7f8d38b94ee369b09c133b1d5176fd2ce80101694f3686e057c003638fa575cbc0341820ef3e4f9a9476e3795ab6eeca3e59b815f0245afa9bfd9ba3c8e03366f896 + +Input: d605f0dbb7cc90761c57f304000512f95e402c12ba319581cb3cea7cebcef2c5b15cd9dbdcf62a5b323c589c119ca492758cbcfc191e6e066eab4d76edff3e2d74471df29651ad1bbfb86b67b9ecfdad35349c81354b6400fdb625f71d22cbfa0afd52e767e12b0e8ecbaf14faaf252f22c940fd2859c43a3e37d8be70f3415fe928b03754cd64a2e1ac8ab7e49df941586df72a86e3d1c122a2e54941160dd7fc2414caa4b66c0aa0f5cc71d60511bb8f5e0849c3e93b5a6945ce9760eadc725a87a43ac5668791e74bd6c879997073d3d65d4222a8500214b14c9c299c0b629417e408af6f552a598209c3256cab73f95c9bddfca0e915cb19cec4830fb4916efcae57d64ddd8964dea61c0248a6d10937445bcbbfbb7d47746b97da1cadfa0fcbda7dcd6cd8e4a36d003a5739d9536be6aedc13e68a7415163ec1efd0cbcd86fa27a394fcf3cf58da9671ff0d1ad7502510788137a01d1042c91b253b1e41569e0693ca4374ed24c0342c238456343843eb205c8a5e99b20bcdf329c0d3084b00327032569fcd8c0aa53bf28f69e4e82c26a34a83a5bb256fcad2c9a64126f4f5b26e96cfcb530a9612af917d6802791f958075f600c49212f669a6379831b4c8aa0be2cce523c0f6520d2d15ac03a6b7d5a8eb371bef970797fb1791c368 +SHA3-256: 7a65748249de6e690b4ef7428126186b7aa3680900be69f86d9cba4f9841dddb +SHA3-512: 355b3de93c86b9e8fb4908accd21c0e6324b9948a38fb3b92bc5f0faf95c6bd980f5abaffb843eab04b34149561c11da4d669038d5bc655864ca2e4c208812b1 +SHAKE-128: a2423729cb67210f0d0b01d538225b7590f42a92fe5b5c82a126195c7d74c3fc0363398dec5cdaa1bf8fffe4aeb3d705b11f77e9362033c49a6dbea3deff887d591b1dec433c329c9b46efcaa59ff4edaf91a4edde9a636eabc16e21a46a05886a073eaaf84cbddcbc2dec51ae9f9e1055f226422dcefd9d3b32c12aed03cee89bbecc48bdd6ee814e9ee3433b0dcb85f5ba70d1721d3b2d916ca2b4c44dc1867187eef39e38c4044fc888404f62ee8d724401f417ffa1c29033c806c9a535debe9ca67e1e59ca996afb4c1541bb114937e30ad03bbd07c5bfc04c496d784e9948a5ea7aa9e20fd978b4d73ef8c0c8aeb10453002bec0f61f00e15de15f3fad8135fb46aeeb6c63bcad09f1fddbf9c8784aba8247b124cfd60c2eb0e2d52eb5cbefa377efb83efd42cec4a215802676afb301cdb065f1a996dd728b4d52f9f07c2e89db3859f163bdeae380e61095412f3e000ac33c4218f039fd716d4d74acf920202da3f67b2d93db4ab39671975b50c586866b5fd00fe480ab445957965a290c3041f170041121e70cf8859579b486b97957f935637ac05060a412788b9fe80819a125fd513c707cdf5af326760645538d975c76579d01de86df903223da8c72f68756bf3e42505f33311fd90d3cc1a2c1d795862bfc01c53a8bc9d18888de192d151d05d00965f83cd675527ac92271bf4b4c5f5c1edb43374fcc6ada6b0 +SHAKE-256: 5cbb11585987298de72fa2e909c0daa303ee8212aadfacfa3072efd3c3848fd2d9a336f07efa6c927f241340fedf06a2ffbc6a1898f9aaa4afed4e7fe2aef93efd215c07327d035bb07a7c1297e2680404734275a0d41730b90b403ec6978cdc181d9dbec2422a12caf0420c5bc516fdb9df8b39b2087bde474c44a9b2e02068fe1a3b810358c80a5987ad636065c61d635cbd1e78baed4c346ca48750dfc3329d5de73c0cbe53e193735b84676feeeeb519ae30a33141fa1c0c8625659beb2d786f6ee484e51b71da1ef9b777fb6a5f1e2bdf717641951d45a4db637200f300c0484e342bfcd69831ce8403df60b3061adf15c27007805132fad3ca24e252fdb006ef1ef32eeb576d5c967cd93487cb3709246cb23a0dafbd9fe333a8d9d1de30fa9bdfa13725a7df51fc1219205915256693ee071830b26549cad2c14eb04c11a6435ebfe7e91afe11c6c91bc70c800accecbd855eea25e938104a5be78bbdb878391bffd9b6258541cf1b773a73801e9bb1b740078853a978e921c87826fc5950dd38ccdf053daf79f3ea33dbc2f571a92c1030b55719397489f986d69ef37ae99b0b1e24c5e48f7c102ad84592b7838f6599dc881dfdabd743ab551476c569b79273e08a76ba7126ca1e297c5be17fced1fbf692c441451acdb09d2271a29e38f15a9965000aa286c975d8482b77b033124558554b3ea44162166c08a8db + +Input: 82da51641b8b2f30614e0c50343be97cabd51998c60ac0a46509db3f31376e76917bd0b631acbaab3b06daecd3ff1ccf7cb5718d655fb34ab0e9a9cab568d50cb2af8ef36959d20c6c9b414e8050d03fa50c9143de657dcf4173fa6ccb627872c7c19e2a14980f9d13117c85b2b54e30450e0af2ff880151c4713a3cce448b0be584a785036643ccf9033f123baea6ea464a3d5e23654d8bbcb4388a99caf23d53a7209adc3ccfbf597abd0d569314464caa75cc5fa7b507c405e16024c7c3a45b6c491fcdfd2cb9233f62dd4d7a282e38177b1cd7f6f90b2f2561199a01d76e0b8be8fe970acc03442ae93d69c03d0b3d1a996efd43c30b6ebdaa08ca8e35ea9b7fa7597da537dbcc86158bd33d60f210228f231707eff34d3e93660352af01383bdaf0ca498d5e12cb08262259f2769e02bf34eb10c6160a9fe747c7265953733baf8915f2344747e2a4038c332e7402cf868ebb822bde475e334cd0a4516fcd5fcb00f86a865113fdb5a931fbddb5022bdc302aaa4fb2dc6c68e89ef1f70a6d4051d5ebc8a4d1ba748b2dc915f37b006a439b4e5d81ea54014493dea3ab02b71c6541821383bd7ceaa78ef6f45fff54a83989e8f4b72ef0e5741706cdeded70dcad1075e234d4604b29f1a7366384c506ee1ff8fbea418ea97cb0f8321bab6e +SHA3-256: 4585ec2e46a070090485c6aa2ad1ca508f2783b254f91bbc3125bde031813ee2 +SHA3-512: dbacd8b4978ff05bca77ab1ab02da90ccd804f0f4ec65907b8ea08c52a8e1e9999052e5f58ce2f08265133d573501979b365d7ceafda59446193323761d05374 +SHAKE-128: 8199ffedc66359278e4204d5cbc01c77c1ec7f26c649f0cd5e8ebf92418a2f087dc05427da9aa277ea212728c3d52e3d4741e97093d4a92cae158e405e5c7f6f4cf1e664fabb9573a2d269494ae27fb4b954a1dff8512eb2602933ff7bbf61f5d6ff99ea8211c21a4e1ad46d0d443c0d5294f531ff50581f3f813915d226224a5dbdd2c42adae80728d508630f23b701be79e094699e20f575f9c43295f6a1d76010fa299fb6559df6fc5d236c4d9e388356fe5ab0e860e3abebe4cfe5f80ce1360e6342874c4c1206a9ad3978e6e5dbbbad7839f70bedf6f0c7a240d0f510ad7eda05c1f9dc9de462fb023f548b1d401ca304d571568496f083e33a1401d23465696068e085529a4448656c07487fab20907cb8ca64404283711ea6ff0e97cb81869dc6600184a2502a82018003ad5fd525c5e404d1d69cec0d4dd5730a0920d83a0b5df68cca51a7972fc5cce05945f49b6aedcaa9d3c9f3b99a681fa34cc21fc89050d5e052f8bdfad23db4a1d6823f1fba6bf834bee4ccac8a1f92ff68c058f5e0a6e0375c99e416a3a95a7f997a45ba0a52a262aa84b95ad4e5b25cc54c648b38dc2d1a02cf757464d1a1564171944fb216047d31490f8f6fa182ab36ac776b75ed1ed2ca81b1452be59f9ca7352428ef72b4c410f13e313224551bf111ebbedbdec260ade059b1fdde65562ed09c81cac23f3c74630bb078365a42a4f4 +SHAKE-256: 2b2a758a6fe977633f784de8f7747db37a5b58950136799255c4ea7997fd45f40bc787dbd44633291d1b181e647d59ac5d0d4269b67d53a101725b76a33e12ee91d83e58bc0644e19f38895b687df7f22b12bae0c8d20057b82b2da5a954acee114ec940d5ce7e884aea3f9e2b70480a0afe517a59f3b767cf72774003025f2b858596bb3b3111fd270a69c1c6edb6a6bbc1653b6e06616f69e9f4f4ce3da768f415cde5f4151caa204e1f5b51733e8bf1de00969d64abd66d6e30dfd75ce0e0f6e086f7fa787e14068fc87129fe179df55e80bc13a0222375edfa2ca523c4c95420065a7996c69343af9aed2df1188117913b6af358251d5903f6b4000100c64f68140345d3b4dc56248a2f7bd17d18b93870a81120d34b6331c8a300c2e88de8b0a7a3b08a3128d63948fb7116fa1c27b1199385ca2308f5c2e851e84b061cb19b84137ab041cd0a8beacaec4ddfc28a49ed8ae94b8c803ad8425001f29ad1c0fe351c640fd9578d941c0edb216d22108ec587307f5fb3d73a3106eb33ef66476e76d0e8be4d4c9eb8a9e6e2e364d6d26cc054582b7dc666fa9c046830f609a044089f8415edbbac2d8dd2b350258c64a59b49435e2cb987ea07cda531a7b7a73fc39e58abc2b22c11f0d27419f906c1b8fb556c80f051e77b5c36d6e9452d534da4127e543174654ff8060c362694325e723ddd0b531e8c9a234c2cc45ada + +Input: 0eb2246571fd8b80a04e368c17a107daf2c9aac6b90d5c2c27f1bccc03ca28a869bcbbbdcd27bd8df68870581d27e838fb6e4ad509ec9238c19c69496b0cc1b10acf095418342d0acb64c44e0e0f61cb51e5cf7c388c10fe4c30b21e36bb6670da7752e4fb9f81844f0cc1ffe5efd1b463e235234e863e2be4249de94ab85e5295dad965f7e2e65a4cbb080e69cf9c67d6a4c7c3884646e577ba55cc4fa47147e5a94ec1115a33f16b609f8f5944aac3eaca2d150492265681abc5dee66e27c87ab6cd16e847d63d5f771d809ce295d116f32ac8bd83f1616dc9664973cba09e9936f6a8d038139de4c18c350d293a75a6fbe43086ed7f75603a29f73dc69c6ba397e86ef05d576c3e26faa1586673d7df62915cb76d5f10ded811ecb952e91206088df1eb533d8f18199799b65554d372a6c4e9e357e7b2a1593368e05f85579efb81bd7ccaa08c7875b7fa80d34929a4634a3212c8faa1c27011106d038699419384b939891bc9dcd5b63ef55673ff2954302cf5b0d24e78a7aec363d4f3ce9532f8f7b4c40a8db58d6ae0f1e5105741d1b45417d54861de4ef84279c9769b8d539951112f21afb35bea7053912a02c92eb003173a1b8a36913341f59b961994dcbcfcef87a849766de0945295c3886831e4836974029fe1b82a9e0413d95170a9 +SHA3-256: 128f6788865299758445df5ea69187447722563bdf5a63d0e265d086ec3c8eac +SHA3-512: a07fd478ae89da38d4e81704acdf1e2652917ec041af628962572b202fe2db9ca50dc03c9a2f33f49b06faad75c4397b50db2548b37f11536ca0725eceb3d34a +SHAKE-128: 730d6d42e751971608b5c5694db129734614072b6d35fa9a1d517d4ad5dcb2577bf3180ef854231ff29cd0a4603af5e1c9b0bd14168f9879557af4c008cc44a62ff5bf893e4919653653f2dbafe83df22bc0ebcefe8b7889a3fc1c86704edf4657d2c9523e5be0736f1938277f39fd1a7c3615c12a9759118dedddd4ef3eb5b4a9ddf741b29a265d1416b6275c678a0c3921b188f9bce89624990baef69e2d74084d040600c003b8001375fe3aa6414b90d29810e0b9e92f70abbf28e75b1bdc2693d2dc70ecb87af49c62c3ad8c6fe4627e490af6a8e0b700bd29a6e124d5d9b7fa8f7978a93a7c5beef7968f3fa224038235e7a1aee5e1994618cde9c927a140f338f89719436e9e250d2c871fd2e0db88c6a38f5b38fb5eed1e1aa53507d33673742069f3913d5998beb32e5afd866f46b58f99250840693d2f141186750020dd5dbb903500daafbe2aaafea5ed737e2b1b53a602561da91de6ab8810fa49c1b699105dfa9c353562f01930a135116fb90ae48eaf4ee400e04b0c54ba90b42921a0f9a95420c678c0230e80630a411abe1de1298d7a2882efd27bc5d5699ed7e12d3a8160d2c52a2e813f0ed91e41d59f7ff7c9ca188822c2d81bd4926dfa1632a8e357f6169a7314c7b52e76a9ea3e6b3dcc7347b67be62a18372e85380f7f3c2aaea8bb371e645f371c18bbf169813baaf024465ce4fdaff3d8e7ba7db5 +SHAKE-256: 2da6159c24dea9d9cd98b9bb2de6a02ac832902bb204624e33d6fe03206ac0899871e930f70ca6d0dd9c1b709e62c3598ae77570ebeb393672756e47b6f20d035b7fe86b69087a8e9a6ff905a83efd5760c094fd993b6e707746439625c36d8bea9a3ee5b2ff69f645c505551bb511b7f96898878d3fc555bcc6153e17177fd5150ec6025e22b6b73bb94ebfb578c3110ec9b74d6a9a32e0543b201e7ddffcc41d2784dbc08a4bbafac64015256fe0d2acac9c60058cc3511ed1373d77e8d09e80dcfa510fcf674e56e5bbfdf2bad4909288289c7067aa233553ac6294debaba3bda6a462736cc049d4c9784047eb32d0f36829f4b1ab66c45b70318b89328804e712419a55a3005f38023a863a527d0990f5f00c9ee5078ac2ed3dbbfe6da3d6ff1d9186ad6c7bde61defe85ad28588c84a4cb1382f160069c0598136a66d7ea0e7fdbf3797c96d4f52e3df200b381553f91e6fbc24eb07751bd41d10170cdc2b14ab12d470fd82a66d084e5d54ff22fe414bcf085d6551cf66a6671dcbe1a7fc7ccf6497e21ee2dba9f1d7d17ff812f05592240973837b68f2d8d95680522f764fda3c57bde42b3ec62fdb89647aed1028130a76be8a42757882faebb9f8e3732265ec574d671e6f046bd3802f70b315cb2020b4e9453862b6a2217ea271031af1367a9713d49f73f681ded9ddb9ff32a8a6a1118d1453c131c0d62297d166 + +Input: aeba8d24c903ca7915df945ad8c8f723357d3f6fcac1899d4c9d134de762da51052f6ce2cc34ce99a225f08876f2c8cc9a336d1abb02f8203160a80d23880d4b5ef1b56ef554189c058cbf3f33798d5fef6412f0faba1e7620588c5be4dcab6f1806f9094d2531a75a57ee398b340a49dbb223ee932951b8b46f18174fdeb0e8143a15c1c09834f2277ba02926946172d09c508569a50b5149557c99c85b3bd907199ef8d2c3df8f3686233c6aa14bb2fa57df32c0e77b689d3aab80ae7c1ae74630911735f3ba2d5f5e2eb66025aa5cbacd49a256929e045910af6bfb3d7bdd102e8260294d7510fa8985853c4a5ad638e69aa645e902f67e697f85b58ca36487c2c7584620757418a39cfd40d4be1070e20b8c4e4979ecf04fa9282f474569521655d7b88fae5a75531df38a4ee30d59a89807e30e99bd02d49e97577ba1d7f03f12cf05685c622854c51e1467d2aec1fd9768b737d4b3479864cd6d2048291736871dc0ef13c8870105c1ea9fcec9637c9ae62709251c47bd4a073bd9722854b9aa1cb721b97817b87485a825e9d8d0a77124efa406453cab6c9bacfd7548dc4ad56b458a1c796d05e428159d06a169292871cae3068f1f4d2ba3b74036166157c92afd6ef5afeace0925bb5b13e57060ae2a8303d8d8486533288901b42940a5c5 +SHA3-256: 4ac7008d9906ed41b2185218f24c8fd3d9a0fc741380ee0039ff052d7aff0902 +SHA3-512: 8ad40fd770d7da8772069bc2c2ed44f715e85948339bcf2dd2a708310b3f0b150990f2fe27c496883d6406d384a94f7d530212012fe1b332e4dfd01eb0b0b89e +SHAKE-128: 0a3ccbbc987d24b0fa3cc365eccdd4ba35fe9b4fedf37640218619d533c94bfd0609603294d078d8953d5c022ebee8c4bf7a2b02feee80ec8e2247014d4f3c3294fcd767409f9965d2aeb9c2abb8e4dd12670bf76282f6e1f784956b9080ba8dfea9d2099d7067d0751c1ed233bc1c45a092ae8fbf7308fcfa545132a0c6808987a83ba99aea158d72e5315fe7d8e0735b13c9c7df00e6785f8b341c5081c4225bacc0b5cd10d3344af8fea1bc25cce480f0b59826a6cc97a07bfd73015ed6694307c7a511481a8fccf58e694e2d3a0c8dd48fa7f31c89720d52e438accb4ae799af7e276e24e60e93bbbd5e8b7b5306f4c824ecf20e9255f85ae7abfebbeb4e975c250b8cc55f092c80a0788ee4e14ca553d22e3c521a8bf2fe318124ca26bd6ab870c2292b7c1ba2e1282d703fba4e4fbbb834de11d1c7ca172a0455a33fd1fad679d2a519a814c89377ca8accdd709fabf26288242111813815cbc54df14ceaff4c208d276f0c07fa3af4d447df1fd353e5416e5acb66bbe93e4a889c98a77fddeefa7fa1462e5ec5319c97bef63307e10d7c1bb6e2d306f094bca77091ae8d32332860d58b88ccf2086bc712eec1dab1bcb0b50928ea9967dfb48a46ace9237a76cb9b43831bd3be827e4d56d09ec2c014903a8a89181207f663dc24e4b0fc025a0cde4497ffefe5c1695e83a35ff649c3b56e30fe02d970d37cbb78d6c4 +SHAKE-256: c366e8ea62850ff418d3990da96e0e8aceeee05885cab6240ed66d13b410b673b5bc9e0ae320ea01c2bd87688bb0ea7272944af26d9112db77a8a435e6f31000820c0dfd29a85ebb3b92f2b43bb79b2b938597b42d83bf8e92d61e47343374b91902eca1d054930e79ae15c7ab939b339505d9d8ffab1f43ce9ed4426ff7583716159ab0f4fc618c175e2372ca10588c0b6eca5db29942aa7fc3934128625264fbefbc52d19d9919f4ab72cbf1e755469939a3f15bf80b3f0f061c04b6127cc4e6ed76aa6628f41cca91281d17b07e1fce3474a4c8ea6e7b5636689fd63e5b571266a0000b4d7fef5d05f6ca23d52eb4f52170eeb3e7cec492891e8b273d521aa3d2d99913a201dad216382650c74927c863a45180c267e7615aedc1b7bcbefda94cf5a7f36a17d7c1f9205e64cb69614a7be4f6a06c6b1fb1a4d217cb4178b1be70f89609712ac1f50ca396f0b54ed4fddea6ca105c4c9ff4319492b9cec6347ca141ecf39aa639a7ef9cf4b47b253476409e30a3c78a793ab0d87e7d0b6ff0e21b126a14b55957d41778dce4615b1771504ffe34ad88c1cea286deb239454c54109440a85da12054b79bba1198e2f86eca4e4751d409db543a513c5d53afaeb2ca32d12f679a9ac1e2d8948334c47e8e38c951f640d3a10d2274f2b29179588d9f2b497338946f3d8992a191eeca6a4d747e54c0f46d698765f07f4f5a9946 + +Input: 0473d44b87d10450e16255624312eda73ba0dd45317a77e94cc9bbd51799c557c6221c95f5a35346a7a050bfc8817069b814392946a2e5e2f81e103de1122c02c8fc5e7e713700b3660d93337e6d29a7a53da92d9459d4364578d0eeb4585bf1bed47135ac01993160bc9bfc78f662daa4f7852248b3e9a64bf2af201215adf7a15028960375883879af6842f206aa419e8cc7d070fbfbdc2a4751c880ac7e2084e2aa68d570f33592695f45af53e66f121d2a77af281a4480ba68f510e11c030c97b6b8ffb8b46243b696af5e336607614a70eda2deac4d427a92769cd4b66b3efde13db5bfd5495ee2edaf28b7991e8d6e0cd440d3743a6b66b0e73d1d06e70970d2ddd15f8e23baf17253fdf27b5174700eca757056938a728edcd1ab652ce7b4277afeafe19638a2accef0fdf9c5f1eb8441ddfac7b390464678fbe4b646398ffe7fe1855976bd7f97497f151d4576fa947553fc0869eab75583c88485c831d32c5bc39887ac2f50615dab81733b5fa333cf16113f55df43a53b905b03644e2d5322dd8c1a00d430f316528cad65603490fe6a5312c06d33cc46958fb56621d047cc7c0792e956a1db2c283d710fdf7754871143c678be50477e139ff69f4bf3b14f7c1889e8dac6f5457798e621be2a4a1eba2fa70b00697637765995cb224e6bd2 +SHA3-256: 92847f825dbbcd0a108d88579e10daec823c47436aecb6eb4cfdee12f1911ba8 +SHA3-512: 7a2bafc05a49494fe94c95b8d7f1ba052420247ac0872e3ac4638be4fe0bb32c4729ec2b9e30962ac70bb9b81d7c80ed5c70d4448c6dede24caf8a6f5ff9ce4b +SHAKE-128: 8eff8182df1d72b749c3a514353941ac1e970d1071f199ce7920680fb97ea21e7c5c222f1721e0af8cc2ccf8f53e79a9826c391671f580f2c438a166b050786c19f592e7461f82705d400872d9f02e816cedb6f21a2b0c251b5e093a694c1fc0f742b96df6ef24d6b7ce443a4c3693c6c552bad2249435427d5bf9ecf876a940eebcdb857be0bdd324dd6304d3e8a6e0d38ef068d05865bbc8d2093695bc563b5ee67ebd4aa57da73a23e32b018ba1eb486dab1a0815c78a09264cb27bfeff7276920084d7f0544171b13c3f8fb72d7e6bc63c0655e5556c5bb1212efb93a259fd562d269b5630fd328c365887c10fa15c3f100eec0a60e8a515471bdc658cd165108f8c021c89cf3c804e17ca57388c5936dc06e58c5e65ee9f577ecbdf3e0fbdf48b03f0b07726f14d0b5d3b1566b09295ce114e29ad50f4c7639b94aaa7da379453ac45cd872fb782c78fa1a2047daffbff864e041c97d5b1f0b27fb685b14100572b8e5bad1253072f928000ca4b58baf5e858753a95a4453b3dacfe4f22fcde1a2a972114afb09f6334945404d230ed994fad0bab55f07ef2e7623c45e4161ad04ecada1e7e9411d99672a74536bca6cf6311855e498fd41d005d354a20836d7576a7e366c34ed531e84e35d8466cc1ea0ee7715b25a2b80afad12a9b6b93baebf71bba00932778d09ed335fe53bf1478cd59cbe328643ba23cdbed9fc9 +SHAKE-256: f06e1e7082ae6e9a87c4ed227a5360a7919973a5f5cfe931eb190fb8a6995652ca2dbb123525fb1f8fc5b11985cdf3579fad61949f991d8ecce71ea99511d889e59c5262fcbf4adbcb2980fe87fb2e64273782d34c1dbb8f07ac513d7f7b08bb13a1922f6f62ca64b08012e89bbe3582615e323e7dc398239662a862c607d0e71dd7f9d3e8b4d481323acc5277ab66541b60009fde285522588fbac6abe7edb3b3e746d13aac141f4e67332abd19ea97569079ead4435b98e4490326b116d87434292ba1926c3d02c47829c8e949e9c130003d9a657abbcf1ffd80fef50f95b6f09bdb82f0c8be1caffa2f77c1fedd951e4880222590feb5755fed551b1b4977c2c353e663bc8773a503ff3e4f6dd7eff9406b46cc56d72543313caa1514511a21aa7beeeefb47e8e6289c43900f808614f39ab2d66312869bf3c360005393c0e1909c6225e1351d92087c7adf676ba13c42f1218a0cff0a8f5838881c8500399b9abc78f9eb918be530e108340c9606c99d1708996a4f9580ca91be9c82ad1b1814c62dff9bb8d6e187198e4aefd56049e56d240ce25dfc63a4e3f0fa7aeaf157f8f1a4bc02ab52a2555c2688acdacfb29e49a97462f9c5f8c81ee272032a99de1a2530e9cc7bb72c4483eb885ab0a1071658699bcafa49d392933d1550274b4175ecd6ea3c6835cd0ce82c9235bcde60b19aab6f3656ce9e46f760e9e9b324 + +Input: 9fc04a07048c65a4619816326be35244268d362f6acad6cbc0256d9ab4aa09ff1bd390919c16bee0981cc16ea7414d0ed2d8a24cbf6cdd5f41534eee23addbd0686988d2a7faff38197bc9e1067f00270768a2dbaf76e9533487567a7d5d067a1fb4c3dde070bb4d06e34ff9184147aa4b1a777db972df23163ce5ef3e2baf0a43255ac1f5493472ea12186e785c9c4f1b52ebbf49398a6cc1d09615c56c1f19be314ef17cb1255dc3895fca0615f63fe14478c7ef5f37882f5af11925299d5081e58e60a91cd94327ca680dbb8574f4b2284b81af5b6e568681c3d3f54587b5228fc80d448337dd5b5e07ab56382c04d03e15b709d84880396afe5e02f67263412a933a19eae24523f231a6977b2702feafe8a5b51e45ba37e26cda1b21d85f1cab5ae719f971a2a21b21e32f72a4adcdb8f1fa5271aab422fbaecb1cb6bae439abeececa66d59c561a9cc4ec088e523b44336f0ec4ae04f48bd695fa78b69d1cbaac64d24e9306550ee03c52b3dbf201fc490064cb0a0f996f1b3245b3f2550612ca313503dae7e6297c3c43836d8eba978ebe42accd974ada78a47b596780856fd9a242c9bd7a0fc1763eceb328dbed4218979aec58fe3011806480725a76f07277b292a6e5f9e642d02ff5ceeae100564437f923ebdfc3fa74d07e56f4efccb4880c7c +SHA3-256: 7c66d831914b7a863cc52c3d0bd25396ac9643a57fead237f93e63f9030966bc +SHA3-512: a210ed0ea54e8f96d28a985a5d1a5b9d6543f57b706c8e6c419b2a32f27b57c6657a430d8a370b6c4fc1f814ce6f6524b4b4113793765e2b9b4f287c8283077d +SHAKE-128: c5c455900de6ee39a99756b926b1762f96a101acb9602a55901409fabe6d6010d4e2f366365a101fbba90afdd7f6ae837e9ae4557d8ea7f85dc3a18551e952445a37807136783f4201f1d456b61c4760e3ed1df8d6f1d5de2b571269534019a3251658fd898159e6bc55890065fcb3d17c03401babe42357a075caa71083fa817a6ae59ec35bbe6897ff5266f9207856fd7e8872c8ed34f3f72861168919b2f8f82c15704384c968a8104dd7fd567f5b9d06556a81cf676a3f8b56a8eda55c7a8d96351a2a9494d1cc5988b215b8702386beba21c1e11531b98e6ff21ad67b7530f7b4496f700689ef3fb0361bb792483942929deec18abcb7d2a1de761ab027258c44b5a56fd28d24226cb84a04795226b53fc72045f2bd22d5b2b7d6437a2c4a301831f410942877993eca3506aae97690e21fa1da0c3b86e733b31c405cab33fb0f1f635d2a59b71d62b939f32010e011565e0ce6e83350bb17dc0a2ad1a69ec26a62d8ae2968020a984cfc57580946094b7dc8929f5216fc1654b29739478165cb065cd44ad7ccad9db5915d32ef26efa111853f0c256265898ac6536440e1055012f4771d7c3339fa7d188cbc5be4698421cf0df83a2c4d31cc84ed73eb9d7683cd9e79eca1456174a6c6553079bc34ab0e25a28f9be7643d4b36c691617c5461324a5c4b5ecf5559819f10d85bfd6b8c54113c23a640d3c97128ef0c2d +SHAKE-256: e3492d1862a62fd28703c638442341c4469109276d81d5fc13f765b26b30ed73ae841b2faed11a48742b651e65964315a059bf5c7a5323893b250d9a0acf7247bddb73cc081a73ccb246cbf60a51549392216b046a7c73ecccafec57054f7f455e8bdb360ebcd09b59a7d39cd0594f998849e18e122897491b01f8c6f9497bda3214fac8abf5195664b4566f9a09cb02166c8f5492fb5aa04e78376aaddb8bd3841aa2ca403350c77f8f6b6cf5a5f69493390dc56d7c6ce549f08670f4b0efd405452b870b8135df5af01e00c9644989a83e39d0144cc9b70e1c2be455dc48b65683e55b4f3876c109f851b80092ccc23d5a98be1d1ac91982c25fad7b8403f07d1b9d96dcf3fedd569f2bd8d90cba0372c8ce846a2ae95a56fc979bf59391255959e42b9d52416f4ff2eea67c9589c39f79d3f2a1780426974aa4beab11f75004ad19896ea05853d3b6df417ce8a3d73660f8c421911b2f6d4f1da746a3cf63affd6e347e0cdd3bc4018220193408b7c68fd3f1bb50057b9a5b84223edb5c45d95e94f0eb868f87cb39bc8feef57de6abf6712e6efbb2b202823d53a4b69b02f19ca20744c375c3dc50918225d96c3732726c4f095d0abdcac08d7c3cd2ed1c1c5a1c1835bb2792ad5d5bdddafa0b3af9ad59e7a620f281b0de0135091a1c30b41438762cd788ee13ba19640985cde2e28f6a8d6f19850d9fa41ff754016ff4 + +Input: 195d73e25d45c48a6a226d9ef7a8832c4997e6670ca350d306cf6174ba993198da0d985b1651db1cf01e2d06f6c727dc0a6841e7377219822d3654018032206bd30b4161e6c603586754d664895097364943f3e58610702f54f015b09f99de3d91e5ab645afca772d8bda8ab484685f0cb639e2d84b4cd55597522e9f00258ae8b01a73bc169e3c7b4c30c694b0df484e2417d9bb53c089f08906e5425ec2029db360ca252918d65a1f60f562c5985108a6e1dab4e765b99d0358a49423c5cdd4daeabc337509e477bc372210e4ea6ac88b9de337dfcf55f8f2d8c423d07a3247497072b00cc513c7688f2b81bc5bd65fe8dcbced9737115cf8733f40c6604b78a15f27c949fdb99a522d1741de7901efb08c815ca6e0c35928c8c2feeeeaf3c1718148dd32cc217cee422c8d681b5e547b56169ff648a436e94b78f7db8056a7d0e51ef67db368e3c5318652e651a5f09c4526dfff12ca79d1bf72bf413e0ec3e15de88e438f9932c3b6202710414e56d6cf865b39ca6fc4b251874727e2e8e1875dbd4590df601deecd14fb3841dd4d2311b1ed6dac775f43c0ce85aa6099c3e654a4a7505acf6662cf1cb96b4179617d56230e754dfabf5811b58f6e5804e42ec641748066c6b3b227db2d796a83885271281b318e46500701f73fa02e32e9bc31676c8a8 +SHA3-256: fa5a9dd432a8d176b0dcf2d89bdaadcc31387f7e08db879321504d0e4e1c930a +SHA3-512: c61d4df6539a4c004584b21ad6fe2fe540a4aab3460e4863015b693f71591c79f25d240dab0965ac5591214d14ab4e40a75c2bcbe1a9ca3e590c0c8c3718b1e4 +SHAKE-128: 3581ab15527df1a2912d14427ada7f31ce1f2e006dc6d283f6f6a058eab27a456e0d37ee36c307d9ed5247e02c37338a974de9bfe208e05670eb93012bed8c2d19f2966b5d484a840d68c263bfb075dc1b6f051f3b0825e80251c466497f65405d14fa97270d3fde2c5a5449a60a1c405385304cb42b323bdc06796b36d4082c7584aa7e302d19dfa3ad4f5ad5aa4c08ad58a022d81a1ef6225f11ead51b787dc5a1cf78861a1979731da29021ba649b28b0f9b44ec7b6c124748ccdd78dd064d38b9ad6aadd669d44c142379bee7b86ec4b9a46e316168b0156a4c377779c6e48bde3b77b5525f5243c9250dd7602bc09127a03aebf4d8e0a2ed8aa93e26edc95f7d67fe53aa80f151b697439967778045ac2671c231c408e93e519770ab4e82b98cc999518cf9e78712a0b8664b81faf194fe27d6e0115f4152068304078d5534d3d394ed17be2e284c6c320b340e50effc8b3340c228d6300a221643632332d3e0dde8cea147894239806a8b6f7135d0df551457f99c86b6fb6fff833f8df3898949ff392fb9dfc20c4fe6895a4daa1837e6695bcb7c54f8ad5c0680af27dc46abfb5021b019f40e2c17c904cc16ae442991d70eb3720e19193594c53424d6a2df49d51a12ea8a37f43ff2d7e8aeee58577a0fb83c33ed013e6190c2da5b1b99575b858cce8231f697efb6e36a9dfce380a06838486648673089c642ddd25 +SHAKE-256: 007e33e4acc6ef715fcc507787cc9ba354e9dd0d7e59197c7ebf8e0f5d83ba828b9ece360fddddb44104a995c7b6f8dc54cc8fb37cdf0d4ae5d1f95fa1d785c9726d9d41331073ae6066be726e845654ed412c1691f2b32794fdc1a26f24ccc7b125e8e26d173a1d197569813c7a99ec44e60ee522b3527bb1cc23cbdf879936c18584de78ebad380d66593cd03164fef2fa19ed936c8518142076f1e8d312b3c2702d2861964be690196e0f38f0aeb5fe47c06e751c483e23cd424ddde8fefd65c609d9517a93b012565f8b305c4b2307919691567ba41a19a27273c384055243a02c7d60237760886e54adb84f153c87e903592bf6a5b06ce794f32ce14a7eaa774930e2c7441a579db9eef00ec097dedc8935a08cafd88961f8e2301be396f215b77c06f3036dfa91ad5e5f4604418d353c3fffb2e39c3570de8214d1e844515fe252d39e2b16671d565aec91279c3d89bff0ba10c720d4d57075f741ac564b83b922183982170ac3b8d1b4c74ec98987683a732922e37b7c722c6d719e0db2a6fba17de844f75917be065d5d9cd0a427031166627ff0651edb52fd3f53f21c1cf3f0ac5eb2e34a0c036491a80eafa1971ea4afa55ff897b53a4387bfb8ea0f870500a6ca9e0fb06c4ef675b21d9204455b052622df887a01b4bb166dd03ff66bdbad796b2fe0cd48e049e5c5b2dd89e3478b5b9067c4420c3de890179ed3 + +Input: 7f69e890580b4066084957d70d053503c658419c49e31125ec3be95e55afcc689f557cf19b4beb7ece0a7edb4790e37a1888801eb5b3cb5479bbbb88bfca174c3fe559cdde9277c36968bb32ed15bd3fc968209740c1c0d1b3d3a454814c91f14f5c592198ee1c70ba63ec919e823a801537f8591e7d806a168bfa65de9b124f9061ffae003bb07cd9c98e22b348b57545ef0d43aafc71c24316d092cf719f38079e0dce6446bf075f1a110ddeb0b86e86fd38acdb2be1a0a030562e15c5c4bd0a122b151bb6a1f48827380550ef220f74e0f820379c6be4819fe272183fadcab8a3a6eaef2bb0730ae11ac0e7690382593740fdf6eba7ead222c476ee4384961eed3f75a8b394da5151b4a923a6a70d296cf41f1a59ef02b2796b5863c6d9c6101591e5adb3b33b1e3a65d3c5ea4c03cf51a2c251631145ebc10557625596907c94160fd4ff606babd731131c77872fca3738d3ae017af237809c467bc2acf518b78c3c36c25173796bcf5a8b4e0fdc8178ceb2db36fdc1aaf8d6d5bf012fb65bbaf4fabc174c78460af3f92f8b0833b6b4c7605b84a3c1208b34de93a99bbece9a4946c9efcf6130aa9cae34a24938f5d94e0ee52b56c0c65a910d798e713c6226ba73b943ecd1bd65cf8907a88d5ec612c5f3dfb8dde648bd146acf64db8b5c9ada3b5b125d +SHA3-256: 3383ea99ea45979a53440ff476b0dc801dd56c1d47e6cedc017aadc379e0aca9 +SHA3-512: 4de378e4215c6d91c4eab7395b74c9b91967f0b1c09db62bad6cc97ee3dd69ebd2cc73403ee8e05e207ceb76e288055c340c2351c2330ce0d6c36e6631bf1c8d +SHAKE-128: 2f9f1fdeba81ca8a9ba1d9a853ce30278c6c54b21aa7d9f10113a6a9dfabcd3c7052d74b07a7463b7798c112bfeb87976e269a929feeb44ca6f1c1495ba07ba2eda6ef1d1ea2f5cc90b4721c8e28412b92104db6d465e9d02f6a78902914542024c88075f3e6607224acd1270b7b8f4d303ded37eecfcfbc5a4e21037c23f30de84e45681267f6ec7aab5009bcc3ed3604b5e315b8f08436d97dbd43039b2098a8224fcd59300524d30d16e547d1066e74af19b1cfa2afbe3bc9b4c9302b5ce7519c7ee7acc4f6b2fbf4fabbf009ca0d7e2da3e9f97fac6e83123c0d550fa3e87b588bd20425d0bc2d771edd666ab2a295b4782321c317d2f2b0adeb801dd7d1b5d5b6635d69672f58711ac2f95b719b1c05e031fc0fc261b32d665bc88e15fa074b6b92160fcd28829e2c6756b4699d7d25bffc7a9ae5535db5ef21bfca757b57bc4c4af7bb32b095b18a00b7eba74af0cb85b64777ac86e1e58a2c4b8a2dce9382a4ee2a11e8869a00ae17879dee3580de3d1da46bf33eba1a79dbd579f9b74da02d54c91c9fa20c44c27f4c449d3fc158240a30bb978ed060a0c153917e604c31ffe8dbaba5525f8cf514e0094458b0f724e3253bddabed21cdc3dacca7e04e21a3e270d6f0af2a48db66df7c9e93ff8ce5b1f540a8f26e8cd2a5056c1bb2833878cf0d9605a001c568bef9ed97d0a8bf7df4d30eb441a2ceb1ece475b816 +SHAKE-256: 05ae2864eb1d84bc243b9b07303f786cfc092975df77e71c342b3552b4fbbee16038c55844966415ff522d93c094c7a74ad093e63fb8f747a4b23eaf80be56fe85f38f20ea4b1a9d72e176e501d5ddd893cb69608113bb11e58a949b1db3d14b0087fd5ead9a9e8531272d7a4fc0c88b1373f88aa15a309d45e6559acbdaefe9c237d5689c05ce683923417b8f25babade353fb8bd7c1efea4ae658744f060f7ee635d817df98ebf7ec1ef8f00a9f7e823c8f8b72018de66264cc9395935a2549cbc0709524e563f234d48ff810b2957d30f015da424b47222270448304081924ab672729c333b7b6076bfaed3ff15f7d550fa2f5a6eaab9078bee6cd791d1283bb76d93c5e852078f5958566d8f0a08c92d7ddfdc9ab01ecbc73e920d19fde326836f403fa3830c454427ea5bdb68f07beb62e203d5d51e459d9d112618a2774c5e6a3243b6769fcc98b9e4a833eca1138367ef89af7e1b30d0cd1cdbc822c77c6120380c9be53ca19b48e1f5a2c0182bfbbc9e019dd0ca0a3d4f6cc6f9a82b2fb3cfbb11e9aa5c92d79f4611657912d477de40d184f39d521b474cde739f238e9a8c709c687b8daeaa70d45bc9ca9feb3849f7ed27ca8fbd8b6231a70818b092ab2661b5be5c31c5a3dfb8fac398022d74ebd976277ebcf21a959c7e481e57915a8c79d3c7a9787721218e98303cfd8bee9ef8b483e596922dff47e068489f + +Input: 5a50d46b1a16027efe85e9778227f0034cb7eb688db5896870a8cf19d95c42c962ee2f36943d5761a665f2532a8407a38700272abb54d6aaf105364f102fb5b2f90b59be713f2b179c307443985e0c13b13e4eaf6751bdef677924e7f1253cc25784fc09c93046d0d89854280f498797c8e7f9830ad8c3cd6c40c3192e03ee8426db13ac0a9112a5abb5297c3f5f723606abc2e329df978369daaac3e1e69017a04a6980c740ba150f95031c316ade1bf9fb5efb9db5087395aab8387351f826631f77648a0de18f8f13f5ff6f36c422a71b3ac6ad07f252205e981dcea720ff6b90b1b4a53a998b50b28f6a8b6cb66a3e8ad898f839013cf40eb873cd09813de8daf6dcc8ee8076f26b59e61e585f103ae28634d61aa11ac65beb5995bca509ce55021924d166df1cf38484066ac91ec5ca7f994916993e3058fbaa780e92a5a9f49aa0a107f2d84d4c12f277ddb2b0249c7ae666f2938c046fb1ca02c7c8fef3535fcdfff3456192e9b51524d6563b81be9e6b406bca87f49282f71666cacf6c5f72e56fd274f7f5e10caeec7738d2b998834ccf2a50105cd1c2eda8f3befa9d6ddc1129f3b90cc719958b57b798bc7714f2e9a4058fb91381fd27b9423309b158adc1935880a499439a6de102756e5a62c224b1615bdc5353bde6522ddf8a9c5b7ce3057fb57e +SHA3-256: a6d5fdfc60c037a0e8251eae5c401f14628ce51170797ccab4cf13f530db6d00 +SHA3-512: da1393d798a4edd0456f166da6b054ad588e6b1ad5fcfcc2d8ef5c3cbdad5debec8636ce292a144028f457b3bbb73bfab2d801525a16efe043a9f525e7f58312 +SHAKE-128: d58ee3e6c1229a6c8bcb32d01c5a876bf5df62341edda962a2fde26554103a8787374d6e04a21d28453042d58db0f8a7134bb954838db71d3c24370500d2eefa0de21800357d82031ed405a938b037f4c496168bf76f6dd4e485a8992c0aeb64ac3ec5939ffe4d9fb307cf6e8041feb2be0ae0fc7ccff5c0063c1aa0a40c7d755e92171279df4e1acf1236d6e82b39d224e262e81d4f35aa8133f4c17e0854be76d63728ee40aba5c8b7936bf3147cdde7c09258ad2f8806a63d5e7283e669e9a6b20708272038b52b8928e195703a390c4fbbb39f4454bf237c0231b091724da7ef31cffdf70ba66e2dc2c54e92882775003a62591116391eaf99aa0c40c2c65a79827a42bce775ceb46c7c40630b9c1c6275626631aa7ddac83531ff67e614fb88c95338b8aeb041324601d0e280d50ae739f37545a2148697524da4e939b3c644a17e2563e4403e6bebb3c452bbda8d7d7bad4289797a2a7bddf07726592fa93e4bc27c756f39eb3a036a023741e8809ab96acfd6e988af3af6da0cbca69b08247b2c02f35809b74ec94b0f0068918ef955ee1b2a2b74f58b3de20ca4a0f8bb2d85e803b95f63fe1e8f57639bcfc2f4ac86f9cef34620c410bc0a9b31c28551c7ed4c2a6002287b34d789cbff8fef5451be3ac930bc2e07687577a0fe4860135e186f0575bcf3732c0b40532ee358358c57378f102c52ce822a69e371c9d8 +SHAKE-256: 40aef5f901adea15115ed69537122f493a372a6b5b33c041548bee53e12f0858af90a9a1b28a6ea767575038a40e07fc35a2f220e53a1d260d7d56ee5fc64c0e9c05fc42410434a1c0812b8d1105f10149b6da2830afcdb7472b9770849e9a606a6f1f22ce750ebfa0c6745e2b7bd6a5106b41df3ff7825068e663f26cf28eb9c739bdf18cd534fe3d44a5362689c7b09ceb21dbaf9652a49e93f47a48019ce42af3eed4125f151733431fe1499e7118dd95d7b57493a83d66f9c827b3ae484c1fd5ba3af7042631ccd785a5ae313f129e5ff6b011c4024a6104820528d60dd1bf9d9ae3f3f64165c80a375610ed7264c390bac7b97902d3ddc35c89284cefa23ed21a1cbb5991f95aa89f1257a7e037d80f10ef32ff45680acc5749cc9bf55a22c346d99a7c528fd206fcf68826b569c740d47a0033b44e8a63df685f3d3a84cb000973c4770b8dab6fbfd981665b9eb5d8eee43bd482310e8f60bc30c1ff578c4178a51848c568a1c97b911cd89c0f4d9812175f77756533a11e6d4d6c15ed0192822b423e3b94f98b0a5d7be514473fc0227493a2269add03f530ccdf314a12b478c8cc6e5f14a3da2a15fe5bda85fee8594472c0478fa007a2d4e199f619bec484e2b8ddd18376dc7107ec0842025b73589ad171914a5dd396fe6d03a4fd6a24fe696dcaf43c1f7deaf9f3f7392058b602efe0a8adfa37dbec92385b2f05 + +Input: 8a5832b140a0b4f9e16187431277e4bf655a7b1965840bc640af05baeb217d01f06d1754c24d988da25d4cd2b85ccc3d8a3b999fdd1262ce70cbe99d92b120446370b42874a549470ba2fc9bcfe1f8dc607ce72aa48ea094e17f5554f909941e55d76bac6bd09a1e32aef0143077394d880d6ea04a1569aea30054ba6cd722e14aceb121ddf0faeea9dc994db6e390e5b34f4170c76504310911d40de4707b16c016a7b41bc6a070524b205381355f872528e4b3a5789e446aa3e885903b39eae839d1988a452a39f0c6aef7e977db2f20e62ca70bc4c35c76d3b19a9e708d139477f2cb462cba4c1857a232472afd209f9ad26c16a475daf79b40318fbc178d77c2131928daef168e2298729c89c72a55a2a0041951d2dc115db4cc8f7a954c547fdae0db6da2819d472fa9d5a3c8605116eac775a62a5d4d1d7eda8056cf6d5b2778fe8e0e8006181761c249d62b1c8fa01543e4c09fb5f7b0a92f90a7178d627d3223e67a86acb9798e866c8ceaa1a80970dc0304f733ef5b10cfe4ba6b5b3ae8bbbba1cc417c4df85ec3e5296ce2d6b7a33f050da72602ff7d5a5cc5f76d040b7cc4ed3b5aa656bcf0e712dee027f57a37b1ece91dbbe6e933418941f3ca56743f061fb1d2b369f1bfefa7a94cc6bb628a651079e2e84b502ad3b1fd2a7cd26d8e04c83224994a +SHA3-256: ac68c97c2a33bcd2321ca540a4334ebaf75797b1e1ffe44e9d7c0df0e93caacd +SHA3-512: 2ad65c80ff36b61007e2bfbc158bd4074e2ece850b8564f0d83e184df93a31948bbf66e67a1a77bf56b9b272ce8b9e3151fc138275c9c861578ea5753b75bbf1 +SHAKE-128: cdf93e66a56665e61e899a8730d632784539a587a7609675c2d86445b4ebc5509c380a1ba1247834f59119420df7dfd405a53a48bd6d928158f70a67222f6c0262e16faf25ad813ce9ab81711c1df5697fbcdfaad834f0f81fbe915830ad7ef1c7e5c67a1bca8ee0e4478699a8cb89428e183cd655d0b8b2baac0920b6d20bac028a7cab2751e94288ea7f433b286717096fd277e23c44b2205551b21c583ef2ce41012df93445cabbd5b97bb0f40b37d33e1837a73c2aa9aeaa801e114eba466c9d0be67742b53d0b015e840cbca74427e9e22490a2ca0132e578a25a113028628e6c818dd7cff3f47fc81055a431613d978e2257ab1be5032c67d20ca1a7d53830041a7b5058678f7be3e18e10664bc7715f01d09eeb688a5f6d2dac013f636ff09e6c281f2b5877687c3161c0f23da3b5b69d591b6b16303930953d79c3650b6d12d6f52285918e83d2de6a01f6edbda58cbe97b6b362ad119f8023ac3a29abaa230b4f608f3d2fdd511c14e1042ff2633cfbe0be8205618f4f56f872ff49650de7d99cde36c1eac6db82d41ed5ae9cb24f5065a0338b80bba1100cd6e4147dc1c59e0fec7a563681ee94f0f282db8024539b2a3e56850be7b9c072c9bf1d5dbbe1108e0506c49d06cdacf2420366ce69e4b877d8f9c4d5a1df49eaf43736714f70e972411a305233e955a936572de8f35856ebe898c3ce2a5afebbebdb82 +SHAKE-256: 325dc516738feb5036e51f5d38da498ceb01c94286a79b18c0d25b23cabe37a7387b6a5777457ffc552771a54e0e4a92b431174a5b72878357aa2efae7d18b66b5a65cf4f1c67a2e3a402c57b52147e72b35e405e9f3a45650d6acee8a7e22b40cf35b1712b14fc3fe0a1e8fd212dd6375eb9b198559fee2930b665166b4cd467134218b6e8ae309258099ec82f31a06b96820176ac107965c499ca47a42f1cfba33eb3dd21618b6168c4745ad5cfe753990f50d41202fd2187a221e6642ff9eab167326a2326941de85085f9aec347d963f7c529219b4a4aaba96ccda1e95d9a18210d031fbf7502301099134cb8d0e17c10391e3421b0eac44eaf0d51009dbdaaadfe4f96292ab616679ea488c2a21aae8650138795646557a46d451f724e864898b3038e5ea7717b8ea2ac5bfecbd809c8a5da871172602bc96afca7225665e8f948a5f2ac431d4dd3501ef05b3fff73e5079b4917608e7f4201dc85ac38331c11d78ff6456441330e6e5206cfa7796f5381d46d812f3851bea398b2b4523b2dc6d051f5a1bf4d6a97574c2bf076a5bca356fb94a1ff47f5b18ff6b42f85c70da9b25a8ade373a46bd2af4577d47944a01452ecd65d84f1131a9cd9e0304d22176283057eddd42d576fa4769929b37c695c5fe045fe8857d43dfb24c1d7807a487751fe89d0def5418fff3a8801c3d1cb720b6c33af92cc05ba38ef68b88a + +Input: 4d764821b45265a1d2cdc821e8bbc17ea9594281430d8b400652384dba2b6d91bf1e4b4e527fb3e76c714f41c91d34c2f3358c81b75e87244a05ae0fe6de5c6dbcb015a45578582b1e1cb225e920b3aac2a8f334c0125eb945bc36757cad0ff47c6e932fb0491d4f4811136b6ca38a6d5f8d276b4f523c12c4b4c0fa2d5acf1a38c4aadd69efd9168cee911278abb9c7be76faa83b6589a35ddee26569ce12c54ad8e86f6d2ad2e06b6fbdfbd343a0ddcbbb3b12e2063814f3a18f8244d1cfca80c78c48a9715c11b25eafc90d4022520d798fb25649585efca51c5639353508059719309ff2ef28135d00931b7059f31563d798100f9504a263d9743ec7757b70b5edb3e2c2ff5669e29dd670f4ba1234be8077183ee6909571af06cfeed84e508bb6d8c9f46330894eeb353f5ce5ab6e8dcb9c3bd5be1ef33953283fb0a7c7c6829d73e90c7f6c0d9e830adb9058830166913d32feb7a156258331659a0dc03ce5c22cb954036099c944132d7611a67df1e61ffd53bb581b4b1307c3846e238584f122893711b028d92897d43bb5cc8c34d558e49fc53cbb013dc9443cc2c8b9f858d70a65ee2c0603e1576d79c17cc6e00dbf20f5efe3333fe611a5bd94761837ed763f9a8f1165b4ae4127cf79ea6522359b06233cefa46d79f7735be0c5134df34bd04d2b535ef5 +SHA3-256: 949d2beba17b67f17643ed62a3fe9cb7d16d45f533a7caa5e5b6c60b943d5d8c +SHA3-512: a987f642449a1c666202e4ea7e799f3ca657dfbbe2d310519ff300f04c62d2d796b69d4d3930fad15e4d1ba240d58f5cab9551e592cd48c3b3571ddbf65f4c28 +SHAKE-128: 1c5fdaf827897f33e600502555071e7f4513567d8fbbbd8e0c989dfbcf8314cefcaae1164c9e0b1d57aab3c56aea11178d0f4a3026c614ba8d938734bba8bd43300af05b370294cd46752fb8bf4ade52b60fcf92ec7aea7efba09ccdef8fa849383665207fb01de3d853044f0fd942692d6c51aa11c932240d680618065eb9cd4db7fd46e97f13e75af787df8729650aa183251cf1da89d283e56814cdd0d9b036af7319439d66dc568a3910254d3927610c14c92ad8fccaa5cc6171c24d2957e7fdf8c357f92614098298d3ea541ffc3b0a67e2a126d3625ef9f3ac56d75cccd151f5fc6d15a489c7105010475178093b82a40ae6a7d08057d567f87afab53a24c0d1f5789f41f29b841d7c42b6ec158ec8494c056d5214100684879a5ecf15ee09fda6f05b640c3640902688061a38608084d6731c6ad979c1c41c61a20a40b0cf6076490fca9f0605bbffc0e40e36c5172d69b79a5c4da1e8b7e6b09a142334318177447546df26f0c3ea65810c73f5e2efdfc00f1af8797fbb5f423caf100d7c93e54917c1a2ff8b88999a673c3774f703c53d86bb1d0e2ad578ddbb385d329e5e6b2ed23db161651272f79347daf2529667af869fa8e2d0333ad9306e7c8c5b013918fbc97236d47522a36dfd4ff01a80bc82c3ca613246d3e712a44f59bce3a562028a4dd57ed1d6be72a7cb365ee250d83322c1fdd43f7a26058b152b +SHAKE-256: 54bf4c4cb0bb89a8aaf0275fac735252c1f456c81d128127ced9f03ee0d2b612f317cd6343a7c18104a6ca59ce2388077a8ac1a09c8aa01d9e5dfe37ce0b3967d945edd63a976c503aec34cd12b2ca33909af211d114a86a3bbaab14c9a702262f31eb41428b68666305e66e59ecf930135c50836199392a1bfcec83a97409d34ae347161ffa6eb2282f2e53799568957018c7b7b1aec268601fb3f28a145fedfe8903c670c8ce17d56a7af0d97629c11f55df1d4e813473a86270d40c3e66bc038cd3a0af4af01e57561bbc096b8e91b0138706af8e8f6be33a2b6c19d95f691d806d4884894daf811346a4995f3720e010cf9a0aecbc66d260984a7dbd2d4e83796f75f691ed8f95c9342e39b906fa54744c566b4c7bd9a905ff3231d48c702db715737f8a073253fcadd92882c7e1e0607c6e743d93c514a1245be9ebe76cdcc4f7475c4cadb389e043c9184a87d8573dd291dfd18b743a73de225d4798b620462de14ad99384620148205e1248a7a09c4f2dc24c485689dde826fd0d39d5491164aa3146b29a3c275e3b7d55ff32e9e31afee49f1a5136afb24bde581926d31a030105b7f7aca58d00b847362fdc9025ae367fc439b7cfcc0e8cdf1f5d377a7b295ecaa6b33dda5a555f0fee77abf2d9c828b37edfc3877a007836594505f84bc075343cfe2e055b97e4160454f324c9431901d780cb3e4b33d96fe04803 + +Input: 4885a9ac08a9c5d3f089f9b55e350ca3e6e44207eeeabe16a83496da7e5ec640b0b671959b24beb855997f5148646404894e87edcdeabca90c79d110212d99e260a298d4e7e778f2a932eb5246622110cd6cdb6cc85161c120512766d6e32a38950dcc84035fb92665f8c0f217c42fbf680438c225071091437c3932c7f551465e37774e70afd7cbcd9a1ac05581df96bc939233ed027fe1e428591c78223d292325a0d17ae2094c72dc443353991a7760952ad4a19b7195c847918e2cc0d3d4fef21b4fe5dfe1e96f3e7f0bd96833edd5a88fdc74ec2040a3c28be4359248f44317caf9cdba34273376774feb42ede9335ecdd4023a8e21b4e571a60a1d505b00bf74d983980430a737cd7c485689b82a7e16983eb90176861357ac44a3591cf0494cb5eca095e8ad86eca2ca9873972f4e17f9a4a1285e337ee529a28785808c6ba4837d306ac194b95efa3c5a4ace64abdee18e6971d838eae8bc3e949ce8465317471be8f968d6cf725b151826f606070e68bc649926995814093ac991e6278b07f9b398da4a3e9cd0b322ed698ea53aeabe36794a14fd5664551afba1ac3cf6716171d7d05ad7e7b92320ffa6d5abd96bc3c1f437f006fd103c620aa01bbc0cb3baa49201ff1aed515b9096c1cdcccaa28a02b107cde08ea659f7ceb8e31f6f54031c71139fce4ce6 +SHA3-256: 999a61642bf1df03511445233e02dd1e866d2e09aed23a633f10369dd803dc93 +SHA3-512: c72699d962d7dfaafe0446cdacd21724ecf262dd1ce84b503eb09c9278ee72acbf605d6044014b29bee7b47415a143a90155a549fc22d9507647673b0fe7adf2 +SHAKE-128: 0ab92e2c6e0f1a32c99b652fc061757c6cdbcfc3eee9544fcb9f60b0d2b41436c0b7c2215da80881cd08f146456abbbef106de4e93057b9b46a2e1e60ac09ab9b04b04aa54428d710a04ea836f2d302cde80592ed9db9fcfb71584b163d20df8c33cf42fc80f1c456fe0197a22147a80f01ad5a5b2e9c4995325388704e1b888132ec40286d859046155d1d2414c05c9e4e30f1c1aa72551d6810d4f4b92acf352edc50f27b23a79d59b7e88b4fa8d2f038051cccbb36e9e52632d78567e7f102387b23ef0ded677d9858cc53e634296a1d3628e0edee6390a40bbc2a3df2ae96c89f45d61a9d0124df93d0a16e8d16a27df40a0eee37edd3b78aa9b780035fdb0e59c863444200ea53c3c92f130c9b88311b02243c5bd520273ed07072acf2b7b09bd302d6e85c41528dce2da011229943e09237a76b4495c1cbd499cf9691e3696aeacbe686340181265b894b82445eea7e146d8696da89c2740957af901226d34b04841d9bef9a8966fc023771da9daf793a73bf9801f92f7c88d4485b512c1c44fef1e529d86db1384e3318df32348b781fa3c39878f2e1d53ebb009b28aca2ac8f58cb8974059572feab389ca0583603640e48be659208095da0a4725ba34b69a3a13914263903247fa3720992877385b1a03f11de0c683839a2dd64b51ac2165dd746259fafdfd552dcd4782968abed092c6a3df8f866b148918ccdc5f +SHAKE-256: bf8f991bd25c67ce1a338d9f5a992ec2f75570f057ccaaad365030e6a585f5a54021a4aaa8ca34c8a3dad353b78cd6780534f06720016761158924c422edce93286967c003f117ce4801e8ec3aa94250e6812b04954c70ecbcf7d60b90ea631c93588d9fd8c7fd7d163a64b42d88c58248a60c52cf37901ccea4af669034096534e10dddc978d2bd5cfcdb02dee3ec943765a28ad6776b38b7246485b0a2f575adacfe74e8198bbbe0dcb9933b2fb9b4cc83386be5b0430bd69b9d65e7872481232a7a3715499d07e14d34cf5814508258b13eb386f57c7ea4c94f04f1e19e9d7a62135cd6955ea1d89c2c9457c15358630f43c092ea19e9886698cac59e38a054d188c1545492e0626064df3dc0a167380309346045e417f563628e63cda6f3c5948dabfefd2ef597e9d7a4f5dea2a6dc915247baf76ae4fdd91521490c48a45bd67f1224a99a7afe2d880c8e3d98dd6796f2912439b7175aabd18192424998e5831c661cfb4567559de5e0a47ff6cd18e306c57a026189fbd4e5122b9a2db3a279ba3900aabed4f660c9c722883e205fb7590dafc5f50b3788a414e825e9a12bb630843d6a247597829e227bb6c6dbc16652678fe7ac033a29ebdf35a5aa9e4194dc945b316d6c53850c500ed86b757d4d327b7eab12519ee89634d26a0c0cfeb677966683224d8b2edb0828bfd317045fcdcb2034f28391f62faa8e28ea4c + +Input: 23ec41c5e5ffc5a5ee4d7150f9e38763b007f7216c527462f89b81964241d55e78a17ad6b5c522a5de9050944353ae6f7ed70428f86f52fc0a0f285231f5e95e4daf93b31c2fdd71cccb649bed14ca36b7a07643142f4280082ec296f8cb1f7f55ce476896ad8422499b5572462c35c0fb9e2c66bf3a90b7f4ef6c1ae61bd738ede61aa4d78b38b22f230d9987a1be7b3ec7c4317759a244eb2b0ccd4d47daf746881f64fff748bc18fcd85976b7608d574f54aa9674bb8ba43a96fb78bdea09dba871366e5419805bdfa6e7ba969464c57e4bc40afb408d300aaa33f890190b7ec33207973198054700a65cfa2175ab878c61bdc3ff19c103481cf814c70c4c25a14355c3bc8891efd557bd8b5c20685c86cfb8a43f2a68c6b6dd1a6f0f18ad708cff3113c38a78a1a0c9f0cb7e9a5320e4ed6cbc07c9d9c32f65b20a169ba8b217562b47db42f08d0a286e376aca5fcb4a6b125e129aeb5e9f210b5307fe819d9434e46f02d916467373edd2be2c33f73275d8d8bc0a5bccdbee633272c7150af3fb8ff1a35081370b5b83ce285bd229b1d38b6018ce1e7f0ef8302e007c16289f5f98d1abc77112be69a3c0c191496393e0bb33d417e4a01804e41a359f50e19842e650ef01a36393e4a33481b8dd6397e4dedeffcb259d8297cebc2247e959be7cb63a3ae71cfb6fde83 +SHA3-256: 22240d5a5104d8a5a87d0d9a4e99ae19c3a8a7220544dbca32d4140004d966a3 +SHA3-512: 5786f7a0ff1d2c988a4e766538a1241b4ee94cedbd6ee576ace0c507edbe0b284e8d20ff547edf1a7d73165000fbf2b140925d812ccc39fd6663041b59ddcc7c +SHAKE-128: cc7db292a3d7692de8d2094172e4cdb4369c4c69baca3c0d810a705e00ee309c7b544d63e01652663b2cea5301715e53962511125cc43062dd8f354f231c3b96778e7545516c68794952d9403b20e85d9e5b588e9d59b898de7b0af24c71323f7570f83596bb4e865dd74790db3cbf154a2db396d3c5dc6db59f6e54355b333cfad65280201ee8c085462b7c0fda0e557edc801ee3de192db70ae6fbb098fd71bdca71aedcf9f945536968862cede646ce9929cc47382f08801956871bfe4f7a4318c43d16218097ea00cb52a3e236c8299e4f6c1623ad878454af1e8fd8cee926b812c79b5ff7a1e5dfda80f788921264ceeff4a82f5a4a88183ff5d3c6575e5845062ba91f62c13948e4fb418f67e2ed38ef7dfef118e8cb1d7043aa3a589accb6b12b0d08be63377a133e9c14fb5acc7b8f8e301c409dcb7b39f04584a11f69c415e8ce03253565dde95371aa628490fdfc16d31fdc232fac46595d45887249339b322faca0621fe071dde3d09644d6117b6f4101eb9f6cc7baa86e9dc00fe5e41a632740ac3e0427d1308a8358f3fa90bb1f26144483d61f5dc54c44d39181b3ab3ecdb5ac64adfa9dbbb5f0531405492995e489de675f176bc4b801f9dcae9b3fefe067162e45c1e71a9b6ff929273b9ae5b254d137ec2f58a9b0e3be12d82b175f500f66b6aea185affbe9107783bfde009fb680b1fcba52434b7de941 +SHAKE-256: 748236d04f3f2b362769624c4487b786e584cb1eacbd8b6eae352778a2b01211f0e7c6dde7fc86fe74225e863f7a9be872797418c4359e4712431a9c09caf146059aa0f2ab5626e18e255cf93e3a34b77571328fdcbda20b4c0b81aa4b7d35aad8018d10e730685d33793f5d0fa62d3da1bc3310880054d4ef36732f8dc13b7e765a812dbde59a8d6bd4cd275265f5d802966d2177b555a610706b4b261c2c76005612cec244a52562059e3533d0536b49051626cde31262d9fb27941bb985a8372fe011dfe6a3f88c9bf0d8b732c139ecd9446bccfa0c2b3745438079ffc5f997578899e0bf364574b486c8d327d14eddc05954d3b158fdfa67769907fab6e2282acd5a936bb1ab74ae3123f5a73e4cf9eef10b4bb6f96b971d02be9194d087928fbf1ee6845376bcca257cbbcb92b33e83e769772f8c446759c1fbc4a0bda3cf2dc818de9d41d5e8efaf8313a28d4b7d60ddfe2df2cfc5414de608ce4b6fd3b3f2e881889dcc7f2927f568c1e655a41c3c800a2d4c1ba85a79c2ed9f06583f58d8e14414da4af2a0c7141575ac83e6c9fe865c4fde899627212424a2ec76a87b9dcc4323aac400539bfd72b10e8c979ae897f9b6c817437ee3d387c79f1c4445a37209e81ae42ce88b04e8295b99a55b8a40cbc735f8661eed7273c8c5cf494f91f105128ae2f9f6e573519365496e442c86a6adce8c9d5cd72ff621cc5e2d + +Input: 151c273dcde140224b47bd9aba66db7db5be99b261e30506970922d9b9bf8a35c3a142cd76b31bf2bd0081e2600f0dc01b0fd25df18004d680de5f963d2f59074a49313f310abcecf216ecae0384ab97188cea4f5d5a6015bc020b2574ee21848d574a3078493b19633c657105cf354065ee3d9302292bd6097f740516de65165c5e057dc8dc57a327444bcbce4098b7c3b88415bdb82806987c9de9145808ab2468d323bdf4f38bcf8ef0a259f9fc9553455e910d988e0694fdd65cefdc2c2ea79b6d6f734f0b68c049e41926682fa423075a339ea0ef5cb619ba5b22afda01d93caeace7410ab64e87ac7c7f3ee866b97fc0b89a3680adf77a2bd41bf0456d8a99ed666ffa2fda5657451387846dd777dd0e5489d309d7ee6631c8aa3356a19afa1d10e59e47bdcea001920576b1f9a8afa69dac1a2afd6b4a3ebffbd9954f4842d80d9209900aa841bf0453bb5b04e54812743c311305488c43758704a2eb2fdd8d7175f05b56cf38a2366e9e4a3734c3c0cb6c11bfea681c505d3e9222f07ef8ec306e02665fdbafa4fc6290f91cf18e2d1ce24d9d52376e9fa653c9c4c96550ee985408050719236c9aa32e76977282060a7769b92938cdf46508d875286dab65a270adc7a6fc06d7cc2da50b8c80c9ef03ef606d65acbad80b883e3e49d0b8c2479045211d93f54e2c27 +SHA3-256: ac3b241f1c4418393c1664e533ffd4eb09dfcc471dec3349f596329d5f4c5f18 +SHA3-512: 2f0318f0a43a0033efa0a8d274bcd7063c4c163fa2e421ee207f18fe001bb72d878265eb24e401d6902b58ed06d37f7801019dd0a5e48110dc22f721d9883348 +SHAKE-128: 53e1ae887fd4533ebade5b227a26d3fe2477a30063f3a2e3f84c948f08026433c8deefb9377179834a68366043403241e43779a13010cee2eb8d244163e889f71733c72759841e0a77f67b0a3f5bec4d1c66be7cbbf6d2fca7f43044ebaee5ce2762a46d172bea460c64026cb47ddf689dad38a94c4b6ae3fa4ce47bed3b1ce2d5ae62337a9d14f3301ea1262ae5b38ce27ec29e9b4812073fffae3109ac25723da5a401a08552654f4f818f781f600b7151da8685233b7bb637b9ad9823d179f28735ee5a5f39c959933b393aae3d808d38330d2133bca4c32330efbdaf16e46732d54d87b3e2d01c0b3abd95b51545e273b2e262a371f55170d2e953732e3b0662bb4c594f1ccee9102c1ce322626fd1f592026c42b514e8bb25649d6a5c13d564f3ef1fe72069b73804e80f2d9d925e0ab58897a7ebf84e1007b200f620e427813c3adbdd499f04d374bbe33ec918d82e648c19ef012c3c0938269cc6430b7dad864a1f6f24bc36693fd82ac6004fa5487f4f732bd5c103a652bcf825f732d84bfca58c4116c426b6da9a4d768ba1b5b537084874b3183ece9688d5e7e6990d2020c1165e789f89626a84aaf57a4dc1c297020e09b6b7cc1f7e49f8b4dedcea9cbd525e6b042b7ce39ce2d37297f6d4a10ca80db9aef1259f6a3186d7a46c2a1bf2d7ced78da80543925369c6a96d4de7019990c21fd69d3b9b58eb713707 +SHAKE-256: 3d1b00236145b77fd516ae0f045b66981ea1eeb1ff24f0d89126624f78e92c3e00c6d40dd0c7cfaef3a08f98b432d7a43e784ec289012015908484477383630bf12ee05701f3137acca3a2e0fa24dc3e5b3db0d54460b480cc5a339068c06ee978b150c73e2432ee8e9e76ab71b8ac7c5c562e4c2d7a1ba28d1b6e882cdbbbb2e013eeded0104cff2f58da9f523efee2d5a9c34d3f57757a49553080fcd67934f501c9623114a6ea005a7ad0216e5509d97dfe88351b1a8cc15bfcd65af521e17108de786726152c478c08c15844654bcf38b2f96e60519de368090a07215805040aef0fbb74358799bed00f428f30d9aa770fd760070e8f6859d4af3ab0f11cdc608d761e04628e402b873ee6fdab7cdd55168933fa7a5219d8fa62532c0ff7e3f89c336d8cb26338d818276bccb4b7d2da34cc438462887210c4b88dbeadc70dbf4c7423925309ab0fc3109a885ea3c8fafe4d6891ea44824862102f206deb6867f3e89a93712363d3aadcbb5c5ecc58bbb5692f001ce434a84df1b2ac748abaf17eb64dd50e16898deced602afda1bbbe89e1d4b8637e232dcd7791d17bae13d73fbb42d657320551fe1470c5d267558833580cc6d6b7010c52ebb7195dd790bb8de4ea91a2b7e63f90117a21162da7a924c9311e67292ef763b6526f5586c96d367d6c95b1edd8cc7e50a456fa8ad5d6ed0626b3cdb360ee7809e72e433f + +Input: d837f35aa29b5d29d2696b1eefb39d441f81103ea4a7cc3133b50b96fa6bc33360bb2e4b02525c63fe614aa4b44c1c9120e1770833af0ae442d4bab0567f0c34c8fc0b32d71eec0b4e925dba8df9c310b86a16c449b3776cde4e42e928242e8b945df4bc513a91c83d7c97e64a2e833b20bf534f4aa49a92d3d7c373756f9dde47312e4ba1d0f83c1b18149c5c1cfa5ab0e72d88a7e3ce61c411d48f4e1d1be22b13d42dbef018e633c02c0f8c251b3aecc59de13bc329a8c377590599ca986b87c70783f7e1bdbcaa4d05269ad6daf10422211a9babdd0d26d0144a00c50f2cbdfa9bc5fb3573c3b9b80cdabe25df84d9f923b612c16c412ffb5bd3b5ed667bde177ec9a2c6df066ec48447dd01bef2d2fea693f67b7150b91d9a46c3f97a00f4b9230466079bc876256fdcaba7a208cf2eac2573d366a24ce151ca0845635e1407f289744df564c8ffca7a96c5162f973176da11147265862aa179b2ca34d18287d9c6d2f1156da6a8048838370047e9db697cfbdc96bb739487b706c835e5f88a3e3be301c662f8cb08277e5e676c377421e132066ce855d9b89185a7803c55a2f152e349d211d4c831970fc44897bf2bc5d66bb93361588e8e8ea176d0dd3ab422b5bfde43161c5d777d5304f4329aa1bf9ce9e1cd3085eabd26af0bb66beb32a910c4850000ca365e046704 +SHA3-256: bb703f84a7bb4eeed9bc15d9ace7a408042c34476c32cabd3fa11f3e53d80799 +SHA3-512: 37f01652957316a4165e5899d21eec034a5ba772f18da009b81fee5a1d742995bfda878b8197ecba4816b598a8a06e034766b0051b558504e6a6fdaffc753ada +SHAKE-128: e230b219642791b5c6188be2bf4a9fad9c357a64869d1157d7973793b98501d8b14079118bf4cc7787828512f5218234d2207c2c58e708631780eb03d0f2fd1a8b5d8b8ad26bbb66793a89fad1e6827eb72524f841214c43e192ac91e0cb4007574356fe864cc383545b9eed4d9ee99007ea0b9f6de7495a7a4270130b7b4994231a1c6bd03df8e2537bb7be8ea89c461af0147b872cb3295118dc215218eaaf4f3c482a1dba0878c7301439181adfac5c0de5e3c1674cb3364e640db0921e1a926002ddd5e3713ca1b60297bd68811549e25625ad98a5af5b1eb9c7c7b8b7529811d874a6cf0a20f9398e2d2bf60bf9335dd734424c43f6d4568c2697a53ac2a48ae3d7aa9b154feead9e9b47b64695937985531e48acbf2688d7e78f6f15fd7ee7f9c369955495695f3f4d9122068a9cd5bf99ef9252398beeb35de7b58875656d271adf2eac0fc021ed1eb15bc0dc2609f497939ca459d53a49e9c7d4bd533ffeac5b041ac513de97c06c462fcb534d1b5daad6432c005b9620a6d859636b43a071862a96d808b6f35909bde4fe445028306d626fee9649de6fc56b77410907d530722336c659274b01a1a520bf9da4de9e1e36b395d3f25ace1091f8f9c5232dd4ed1404139a8bdb8a23226cbb0e080f56df21bf82bc023149c04d0def8ae97fe96515d821cef2f63b34f135c1c4da74f35c0cef932eb6ce4e152b24587e +SHAKE-256: 9b943f24d6804fe5cedcb0628ad40c4ed5d0da5e4fd2895d82a3762c65e84bd5f8620711861a46252b8873bb09c35bcd1cdcbd5ac0634e29cf3169dc948061d86969ecf3ec8231655c8ad0d029a9660b7040b94d355e2aa83a4093b6534b7bd6bfd66a9b22ccb57a6ff72422c0de5b9489af20d5ce0502469ae8ea2d6ff86903f4bc5b85fda8396286ed9cd870b4b1668cfba24fe693b1d87d2149a89c4087a81797b25901966b1fa2f76b1f5bdae0309b294e0090c45aaf7974d0159858393ba870d70ab65544246f8ab6e9c8cb59f1ae954306998156ee4abde4854a2b938122d34ba0e3caa4753f73b0c9b0de3cda80960b1e1c91a47eb5fceb8b78713cdb96a8da99aa4375378f9bc58eb1ef4962ec74bfbe7f89a64496d30f42f5b078e048606e84f3d58c3a3e8b027ce76c30c1f94da232c04f6f5d3a5e29ea302d330407060c3d5ba920c9a68aabaa3c4375a4a578c88974eeee1278175e555c8a71f5b807fa5d6784043359f27e418d882bacca03e79a3311cce3c8ff2b5cd2bd98ceb5b5de2ab87ecdf150f87266ac71c29e058d078749057fea88e6dfb8fa22693aad82d267711e8abb1cc3452e2437c7d79b75c0ac082b34040671da7b0a9274465c18d2c3414fac6e8483751c54cc3c08cf60a75fe0ae1dc447a1e3d7b020dbc2742ad8eac592903d7a7442b036c3efd211f97d06ffe983ffd5b59b66f03ad6b5 + +Input: c903acc9c8e70f62d031db284ed6b52e4de1eff957e4493715f77c4cce415f8799a50d91a82e57aaddbefa599b007b2b9de9f68e77f537dbc194d0fc8e65a7b4fbba4f1a248ec927a346c71eae57830928d069af934c1203497937b2c80548f2f83632b4fade2fdf2d0fe1d5fe3266cc558af64a459f77ad18feb0ab0a3c0ed012e6848c0858d48dc910043f73106546162dfa881750e65c9cdd9d4bc3942730077244b83208835fb2ed927cc2eecf8b0fd7049bfd19491dc539c85ecd1ec625d389518cf99a73b8582a74df9bd15fa0a7971a4c618858a84fc1ee561a0828c84355dcf7911789f371ba9c62b70eff6ce67ff511feb3abd900ec0cc648c1ae40c64e62a1ab3b98d99f492efc4fc35236c544dd7706165b33b9db94dc9d0a33093c6198826b7d0725a7a2cf62e6357cf951bc97e4a9ae7f89208048724d8202d1316657a9123d79d954bb3a4d0362d264ab4edcd534b338698d8f60f2ccc71be6e5f4ce0dc7916ad047a74f5753205db19f5be21aaabe9de5737f2352731586a871597c41fbd30061437dfdb312f56782666cb32169f5e61112f9d54153cc48a5c4089b9298666892583e34ccad14186e96efbd4a8fb2a7ead6741ad88ab55e864e744ab6056aeff3ec5ddb992c021f7dd24bd30f7d19b5e07120f840845bc9da9b096c90e85ce79c85e219aae04cef +SHA3-256: 05f0e21170e704990cd04297c9fdf2a67a23e36b19c21518b2bd72003c832964 +SHA3-512: 5e9fd833f5540423bf38938efc8bb3dd498c79ab05ed3f25f4fc776ec77bd7108129bbe23f4bd1d4816dfc3099219bbf13387804499c93b9fab8f1a8214c48f6 +SHAKE-128: 7fd81239edfb41b2192b97899ea438884ed419e493607067e8373673cf7a8380a8949d9191c50d827a5a5fbebe69b7c3ed3a2ecda963238400cb0e32bf3099d1fb44aec1099ca8fb3a86a29e8dfa8e705ba2b24b9c87de1b9ebcb46d9ba62399131910f3cb900a57d3f8f97ebd3f39b701e2015911427ff180b537db1e92347c5e41922930bb82eb88458022693e52231fe7f89d033109d3d2831c96bd8f4d8a6804e3fb3f1fb0b9c0ba2fdecc7d1f040fd08b75602fb73f0be09c77f1f5b3cb99438374e0ce48cc88845890a21934c1b5dae99a70db74fcaf0654e36202a6a383656cd752cd3c659ab8b8b622546e9f7db04f2b04a341b0113117548b258257b54ce95898eb90ef0a7325ce04f93045d3aae50c58c76273459b67a6249bb30a17750de55557accd20f6237360d3bd0545832a9a31415770924c223ae58a030d116f6ecd4ac826131d0763d3619b7061cc075fca92f83e8a44615106f8fecdd6045832779fb71af496504aca984e7c48a9dcae1f59d6081f74c9e68c7835fe5b51bb71d82f2302bae5df4966e319313bd7ce724f2ac510cc6ada4fbf5efab7fc93a849221f12e7234ad37dd1aaecf981e0a764322248425a0cf4c39d7ecce6ab2b25efb037e4c11d1b3a51a2f9d3cc1ce616c1431e017ab2b16741c59b8145a18031123d8aba9bf72787f04f13d0ae77fbf5a179e7488f794f447147f252788d +SHAKE-256: 15e5b441d9724b771874f838772667a10f7e2e97991c3348f6f72ffc44333f9bd343a90a2f8d08da401864e9af262cbd4f293bff29a3039aaa846c593540abd438f0e6f9c15c8c99a8adb5dbcbbfdd332ff412369fbbb3f44a5cbda7127f0125755559c185418076270ea615574826141bfe0bc35fafbc69d2468ac00f92fd140fcd832036330cede2c958fdca17c3fdef32ea0f3330507dd7f4878b2d16ae31d81f0e0b8f089b1422944eb99c5425f5807d93e000eca437daa00a4b2ef6bd8fb07fee249a836eaa404ee6005b65dc1717bc5aa40b310feace10f37a63e1ab84745f71bd255b800ec8bf0af961632232803557288d564e19eae047975fab8e23f666dbb03e3751dca21ae3044280ae9fd35c0fe78b10f73cc64657a9194ad9be9809526cfb780b944cd9fcecdbe5afa0560cc4f35de130abe60441e98a3115c255ec01e5e268125adbc8dd3579c05c280b8af00c3eadcd7dda49c7f8a489c1cbc5d34a5726fcde141eca29245cf36ced0b5cbbb20a3c0dc6e46833099bf2cbc5efa1fb98ffb9b1bd5317388568d34eff2474bafae0f62250255dbc25d3af66e915642e398754626ae669707cf471980854a495e90ab0fdd860d63b13ad3789efe02713ce528423e41af6c8dd201a16939ac881f2560fb913dc46e49b25c2232226584e2f83dda1d8d148ae7913e98835a4c2df9eeb015b6da5ca5fc68695f214 + +Input: 5fe2a2c792290da77a7676ed43b0a6f5f51326392133640362f60e0474f88da751f8de22e6dfecc479d635560c8f28b6675f5350cee9906fd296916547f83d1b24b937cdb0900acaee1e3ef0b2e617445f5ca7011311e93d78c33af2875bd8fc69cca9573ef45053a3fc7e2e8728b4de2dd4b272ad52e49ffc03c9f3965715c71f219d088c2eea59603ea6fc99da1a008e48e2f5e4779f07142baca179bcfc8c726c9297ea01c482b6c9e84a8e93508ac20c92f6e34b4124b4e348c83072595ff6d6de5d55964e2dc4201eaedca65928daba4c8d4804142989a40ad60965f131a0e841d115faa50ba0eeb226a34116554b4e31303af0b84e748e098ff8f45cfad0a42cfb61e2fc3a0c2c5198a4590790357512cc0595fbc05cc1159579319d8e553721f3047b79f0febbd6863d6f55b98d0f7ef6731115297c5216f8ff07168a22e0c49f4011284718e6abe213dd5a11171956203084f76a676e34c088f21de2ad4f51aa5bde9f56710bc7488816d0a5b74f7d9c1c297721012f13d9e96a80dc203439e53b8bfc980ce538acb88aaf3c4d69d4ef0530abd5693153d4ca4394af423ebf36cd72913b5390fba24f749973a97f99ef455bbe53f29b88250df5de5174e9c45ab4c710986f216a3b87c6ff97970042ea4491d661e6c62950513d6c6c6f7228feda462219997019a26b8053f5 +SHA3-256: d4afa593a790ae763e5ae2c8bd171558eb1ce7f43de59684ce789bb4d8cf1cc5 +SHA3-512: 95df45078879e3a1089841a519cd244d6bfd77e40d9cd9902ba02e394f694187e914b33a2eb8a798db471de99dfcb1e84f8bfc93a8730d8bd2091e42c214c426 +SHAKE-128: a5560d5e5407f00cf5cbbaad95e47903886886e42f280a203e9f58c7732c56daad4ecfbab84beef2f44b75fafc8de823d99e596ba4a9cc22bd3d032ad5db829047647af0dab8ea29a24f280f9210bc292b981e7be99aca6be5930eeef8766adc5c8cc70513b60efb893a684d4abba3ab3fc4fd3f643601e46639a0f75b5bf666d28c6e216071fdab9f04f3b2c5e43946f758bfb2cb108ef24969d5ae7b4ae089ec3452d3d359a921d7f449d0de4b16e637182e1cd2a2c13a17e4abaa79617292fc3a0b7d6db489573091fca826603d0f6b4b4dad2d3e1a1bc2537903c45d71b316e81c38009ed5cac8a3ee33542e8a010f50a98c8dd3d94e3231f00e980a32cd0e618b4038f262ca285cc7b7f9ade1051d30cf28135eb6caf1c85df4272dfd90e8fdb831c227fed3a05f811031de8fc201441f1b45368a6a3c36c9b2ae759d251496de732a6356689b2a187fcceb7f6c7efc0ae95ecfcad9550002b8800e72db2c022a1dd390db7f0cce400d6913b20998245b71fee51a0133f50dc3cf259c4b2c6507acbb61ee4d8104da861baad135e719724d414b6cc3f5ac88fdd03e444adcaad1290086696f7362ab15442373c44893e21dba407abc941b7549b8ad821ff95434d3c1e860e9d46469e46db0f85956bda355b762ff2c00ef021f81a7f439f5178ff3d5b86dce5c9b8d4095609afbe22dc1a84d8b3818b0c67ce70370b2a6 +SHAKE-256: 982a433a86ed8d3c6e4695f56ccdd077addae57fa06f65f71cf007f50005f5efb2f5d3c4825f988c6d4b6692d27c1849d8e8d85cf975cf97ce2d1d3165ecac29d77330b6bdd77a155ae7a9afe2eff7a37c62d4bb9b94fcd47cb27d3a88aff28b08476724a129a31e4367e3bcf6dce3562f74380ad1a9187d0685173d0e69a085ae27054611f62064bdf14ea9e2da7ab2e00e6c85566f2357f224aa9794aea29d6b9b159b73693d6d94c6c7d1be9089a1df3a13c1999bea7b942b27138770a64d27e70d8a57c047d962de3cef865d529a484bcdb710927d1eee089959a41e685bbf916414ee4d2c4f6c6d4eea8357f15a4bffe5059bd3d6d17396808845654684376907b7450f934934598389da4cfe5e52889e87083e913622c92d25f0714478724b2744a1a82dbac8eb5fd41c25050370785ccf23b347bf721c54b9ed93b66cbdfbdcebab0e7868528fc9950c76cefc0b155dfbef081610eb20a19c651f6076f7c4b025df0b7ac5f877cd3825467f59dd1942d092dc02f0e2381ce2cda3d35df157f2dc87852ce0b2b9c0a0af5cb1ead0386b47271c59927afa2170126450b7d5e401df5b72d6e0bce057db855e774360ee9cff52eef822cf4d17a42283dfb8bba59a0326582eae2aa767b3c78c7150417163e04e4f232cf4f245e5f376e579985006d2f5e2f2096ddb01338efb1404b2d9a4ac440092a137ebdec353747043 + +Input: ca3437b491242dff86f942aadecc8af47f2a9a33aa6b40b1338651677b060c3f9074379196b6e7061c78eafb1f433e0f86366b2a7f7ea1a6c209d161d55cbb0e568ce2d9a0860deb6057501ea1982b5a9c908c355ec0ff1b6ed7f4676d4a44db0da9506c767d8c158438dd8d24739b40afec846a08027a8ecd61b66d71423db740d21e1776607d541c693637b3700744a38ec15bc569ffc1579fca30ae1eab77ea1bd93ec0f67a9c9594ee7da13aa850a5d2e99eab99de41cb22ab6d314f4dc3968da253a8fe818b9d38b288c764c7815ee4d66f179c011e9af6c8a11ef8d3bc9b71ada4aa24157ff55f05adfcb81e8fab0aaae122189d72ce4862c3ccae2009bfb0416f5803623f7acf3b0b31b2e2af5c943ad3fce71f0264eb14ebac40346c46ef6a4d5c87fffe6f9714562353619ece1bedda2c5c6362ce6845750c29ab51c724e41194cb8b22cc03a8f22da8a819703fd2272b99739581f234a5cda2bed1b925a2529bf451e03102d196bedd985cdf67d84beb4d5fdcb1cfd42eab6a1ac51bc1248e5109ce56ad75dea4b55bb652a99558b51bc466eb0f91abceccaeb53baefe9e4b121ade4d9489af7c7ad67003cf1f2076a19b30b0e35e766a98085eca79e6c6d75252f6bd8dbc39672ddbf58b26cd7cc4ea85a5a2248679aab3db70e620ec56d6381b65cef71d15cbc98a19b73b +SHA3-256: 49373db0fa11e4b92a98e09b5513a63857ed21cb90a7aa49d654698c71fdf61d +SHA3-512: ed0d27cdd0c7f90edf081014f9e3252acb36f67820ca834cd49f8f7aa382e6605acfeac3c72f7c2f2f260c3cfded17dd5e2657cd84529a48e51d7ed548e64c8f +SHAKE-128: c34298256ebc1e895030e4f94e39514f66a3ffa2f10b3c782360bf8f00b387d2bc072dc763b87db0332a732685498479c6d4bd62ee3eef411d7648a0571e5857aa06f07470f8521a3a1010b1ccf3c28e2b8b2641dabfd7bbe685e4096b63477c6aff6eed9c00b5c9567222afe1195749ef037c3947d626041e07c8efb37e28a47a6f1e73a1724083b9e50377c14a60119d3890969dbf3c907cd35bea3c335966dbaca201925640e37d6e4e5df580c78b63f4dd4db1158c95028855dd681d12b1b0afbd6f2d621d4c9a11ea0ba07d58565b5e3527d68f57f277c6bf873e47bdf4eee5d9008c2518534876e0fe668e4a715f442a5562c8ee9720dbfb2969c229e92c55f0bbfa73f4e53eed76e076be0dbce8f594e762a574764b78364cba7cdc912ca6f12f5fc885f8daadb8c4d241d8bf977e8d8aa515fcac096bcaf33a9f9e5d2111d24e26b12195ea53c1ab6fda1b2ff413947df5fda99a6c046e49c46af02b3357fecb633f3716d0435a4a3ccdbf12273d461a360f933c81ab378e5bf3903fbcef160f38ac482433334373c62218c13aa0e8e7bf77a7fc50078efcdb82d1f1e756a664cc5d19ee6cc7c3a124f9282b89f2ac731c1c4d14de4caea7aa90cd8713e7235d322d5e38e6fbe269f70aba8d4e1c23cee935fdf9db9b7b7b0680aa023f39d2728219dcb99536478ad1d48bd4e3a43e6313d3bdc48fca7c7d55a89947 +SHAKE-256: a15cbc896549a6756ec090a4a4ad94f7ea6ffcd472e49d0309444e38d26b937aed0646c0d7806266ba751feb8c48f7478b6dd1e580d92a38fa3261a723c0c2be4efbcb3acb4710c7a5c45df662e8c8b6a697bff5b003809a4b092dd6b7defa981621bfd5054a2993b73985063119058a54ddaf430632267ad057267128703d2e63424af04c003bf5ee129b06e8dc1b07e99c40c28951f5964f9560ffc42a6bec112bddf32f804b43b549b828206ebc2822aab16dc6a433baa1f18c74025285efe455577fad01152e1dd817db762a44854f373f68f1217f366817ad9bd50ae95870e0b386f69f65aecd5cdb3f976cb6312b96f343f1ee887a690a897c771a2a0ee564c9c2a3823dbb96b12e5552c42d5601cea96931f05b05e4bb714ba8665ab17f0d5b107fe9a58cb54fc457204b1dfb4c1059cada467585b95fd190de69ecffa5c00d7f2d8b39777ab281a178e9bb2ee4a43ee3265c1f0cf255f445f4be171858ecdc9a35b55d82eddc56700e7c54143295a16085069d1ffa8f2fe5bf11b40c60452e793fe009406176b0beee4745bb27a7a6d6bfcd7770a811f027ca0daa4f77331fea2124e9bc188ef1fe0d07001ac457bd21beb7356630a444cc0ecfa248faef242ccf760dbc69db80d6211ccbfc5f021ffa2b5f7f691d6d005920d1d4fe5685ec8e8b66d0a07142bdda860c4b5fe3fedee88dca3ba36f7f91aaf32f4cc4 + +Input: 87d5145e9edb4232cebac82af76781eff02e70c017fdbe97bcbc0acec6e43447cd9d5fb768b44d9a9572e542ce9ec7bf401f6be835d811fe3dbe9bb95e5ec304877ca003516de7f2f260cefa6895a7d0b1b5700a91a4228ec5af756153b1fbbbb76dfaa5ccd65f7202a2fdfa3c6e2d34c066248bca0772a172534ebab6a312cd1b61c19e140fef7021332c6a40dcf353134610a62fdbb39178f91ccb856728aaec318e7d18a1e84e604efddd4424d78206bfe5d2326a3f36810188e07e6e096585e6c913febcedf92a8bbd7a1a46d02d3c1412a8160ab5060a2ce8e1beba8214e69e635652c030bf854c541d4d260707db4b2626b24e5ec8e122fd16a14b8310f9feff9fff7e3ffea94fced8f9002f8440c7f5e2519d47c472f6ed92f87e702f95c1062069ebd986d106446370ed5e3bb0eadeecd33fe1056fca6157b8fc799017a44d0a1db95d0c27e3f41a3cfcc2d06f4f5821c384bc1eda9858f9ec3007dcd6e9dcb8e83aa2950619c0c4815aab7d8a44935f3bcc16802e6620231a55eb600306d90d25e8d47f871d241055b3efabbe183dd478e0d71b0e473fbd041108b109100897f2a78156355406581675985d20f7c6a7c34266e761d71436daa7b1803158550af05d78bbd9b3181e88002a482d9b34054ce597aa251f2601ffa23df2fc89c723b4b6a7e895636af16c84754c3855 +SHA3-256: 6503854b971f2b20a65833bf89c243a9c17c2bc90e9df3c87c519ee2c63c954d +SHA3-512: 6b3b182dd3f5aa16824df4a53a217bf7d6347f4c65ff3cb71ace5d7755782c2f6f5ee496785591c86b1215c30df55c86a40a8222dfbd1f94cd07d57058c845a7 +SHAKE-128: ef1162090d27b7c9e70beb3e08278f41c7ea02e028d60989f6e444f867196c7bd2537e0c1aa19d204f607e448929c3fba1f44af108e3a4c8472352d88ce19086069230b8b3149055635afe83e803c8fe8023d6106ac164a151f8f45bf95811a6ca3a198e7704ac128a6bb44529e7af50818cac6f72dad906f198432035f998e7eb15f843448c7bd177e7649ca9b42edf5ca1d62e82d8ad3ded7dee30a2522368f8944b70cdc66ceb52021b8fce6b6094ba3b111459a14ad3d1bcdde649fa69e3fcce39d4dd7fad61ef60f0ea540c16015fea2955db239f3c88ed7ab9e18c2e2e0cea4680a409179dd9c8441b4f5f170f7df5cf4d0d4e62e6fe902b7b0fb92ca2f0f875ae04c97aaa0112326ed2677d58492b8dd37b92d6df1efd86ceb791f3ca0d66b8dff08d9e10469c06574e00c1375846d5b30c21c128e7647a8db6c248d81d2dcfae00c0deddeb994440ea59ddd0fe9a2f7359d525f4252c9996b6b0f052492fc06c8ec7e11d4339fcb22296b74765d099bdac6b687e6c20ae51d16e5a4519482adde530a028314e9fbd7a79514252d3b057ec1fd49682e9d5a2bf3f6ce908491b5ec918b15665953f9357b885e0ac178ce3685b48d1542ebb9b6727ef4a443d8af2cdb3ee276d2925b4f1736d6e14b303392a6da20442b3232df0d23c6ca347769b57f4d08094a2f7ce24b48dc657d79d5c137108541a7755ef13185420 +SHAKE-256: 697c09b7790392eae5848cd1d929a39bca91ac656e143054a5f61233c6ebfea2fe865915f4ffb90f250eb219341785405ea04d7e9cf20f8e01a6709e88eeaa0415605441f226878e081705eab84479e9b87cbf8b2509d46ef708742fe36695b8a74d1476145ac4d2e1f8cd2452d34f7de1d3a250c098fb9f0db00f4c0001d4a64309a4a14ac1af9ebe342a9e967650b26f0f048279919fb7a053832ac2d6f5d6f69a9c59eb66a2143fd17697f6aeea088b60ffab30c1ef3935fb54f61b5d3b9fb3d3dd4ed6e81324e83c50811f1e1477adceb4c5d93f80d9aa4356f9568b93fe8b887f580c1371c96d9a92f899709dccb0c009a579b8cbf595debefc836c661f2c9fa2aabd549a7887403e750b0a3feca28ea8073f8ba6f682bb243975c3e61651a8864c80101d0999bea4294cfba0e800fa65e12f3c79931ad6b6e0c1197f97dae28a66d14ef2b0169fbf104ac66a943bb95ca3757e93c5326375fb596ccd3e7a24cf4939578158d885ab878057f7fce6a8538457e303486a3c7e88bd93ab8d83b42aff1e5bb0feeb1293ba9d17eec73b708aca7af2ca9d56295c330e639882abd3182837fc5a47f56ad0cbdac1f2ffec871d63f38865825c1fa8eae5ff41eb71b104085fdb2be95d0cb08cbc87cf27d9b43de4e0af647c576d85e1889dc3026388351100afbdb9b49c374d3a536e77cbf86dc32016fc895884f2544f8d8208 + +Input: 1bd6693335cc1ddc0d9f0052e7972e3d3d020ef74f7cf13af3a3304c0f5021f204cb5dee866fe2675b97cd8aad3e4289e16470799dcbf54fd70b730720c7cbdb50928a767a906a55d07f671482fccbefb88c4f7af627c834ed23838405d0269f7b508e43e72466e82f0a3561beac3c5b13495f1caa55cf4b96a1191f2afe14dc09026bc165b1c0e22533c54febdfb39b5501f3ce88ebe5caac0ef8d2662c25827e81899a12fb64a8e0eaff518916e3c3b08e2bace2022e59062564ea08127078c50efdddb31716268fe989ac61ca5bc80222b6b5d85463d7e4b4fd499d738b4f196936714d09589a4ceb4eb29781880555d69deaea676dd3db57f663660fa7cf3c52ddb9547ae8e492bbc9b0393868be34bfb9579481825db989af212020f72e3c1d0d890b454b0f3c7dc1b37b5f86e9454a9597626b7f11e35b22cb727734bb844245304f11dd535c3ba3aec24966aaf190494a156ddb6c0ea0c4a9fbaaaf54d535e52e97e9b1c4eb6a82694eb6e07db800daf598f9fab6833f080c56dde7fd4614f6ac0b7a071704a368045dde1792e7fcee161ac76d92246d71655df405efb9df9c7bd0478580b64ad23efd4ab3eb4d625f0d5452bb127fdd8ce457efeefbe956d975df820f3aa51832a968f022fab0fae6f121c806c17066dce1689bcddfaef15ce9f467289aa71191933d3ae85dfda16c +SHA3-256: a06c83b440d4db63152a5b83f8ba7af7e9e48836f05b261ee7cc8147c376f3fa +SHA3-512: cfc881f1b2d0a43d537366cdf90195ae7fc14ecdcf906ebad08c9c82c1521b517ca6c14d1a746edaf0debb933b1c3788e641e4a44ee186d605087473934104b7 +SHAKE-128: 329ee513dd00becf467a23e58e2181095316166049a5a05c1466c5f497a903115ad369ebe9118751f58086efd2e0f6db15401b48a48b49fc4128febfa761ab4550a8d0509938a3bb748ae1d5aacf81047790a3f7419a405e02a2c7259c1f278e99c0089e67d59c0c21817e93236984fc636fe56e98cb60460443a6258dcbd53c2b4b6b3669b36f05c4820c29817d0949f2112d3f5fdc205a9644adf65e8fd547b4adf716da212d7da1f4c571a1b95e18e97345870f45e70962dd926423c8a4709acd788f9aff5f80e1d963462a035321c5f63a261ed23d0e3d3450a67cfe1c71a746c8ac8d99481a27b71c14cba8031f53aa7445336dfa39a47d962c06214e062ccc433c5db155b258d359be496dd35d04feaa8a4838f871fc653cca89c2d069db1f7480aa5b657d055aac0cedc05f4f61de2d10e00d03d58d214f748a9c18bd6492684ea2817d4a2ce698bfa0b31aeffa15a43103d947ccac497c8ea6df0aa05687382132f4b62518ad23888c65a7ca0c9d663410590f401f6c0c7d34728c7e74ee212a5b4b905b5999aadee6699fb77a8b4ef6c4700520b693dacf4985c44f634ec3701c7dfc349b22eaf07707ca739648030c10b16bb6fbce796ec7f2fd1952b71e5e2c3398c36710456cec54bcb513801de144eab800ff85193f6ea48ce99708fe5dd9d3e83242a83717d7ba2edb8554410afc4e6c51e42b2a94d82cac68 +SHAKE-256: c58ec045195f7d4c6457692abea9e4f796a960031557b254987c8fc2c3fcc1d31a8a60e93c1fb52b058678b73a5757a0f34c3c5c6fe4d4488b81b3927d1a83cb979e11573fe23f3bfa540428383b6b4f0e35b163a88cbb7391f246025fb64c61ac0f69ee2e9ef68a3e95ddc2d2a6549f67fcd932d58f867e79b41a140c2358c888d5176d085f72c855b79e565d776cf82d8d9c91a32899403f7d08b9d9f877ebb814c09084e0d8434bfe278ee7f9c25ea2791d22446cea89e59ca06e258d375d4e499aa072f6cb5ec5c387b97595b2abae64b57d10627be128650ce01fba1266856a7d4b08423269a3a2c4045cd587ee4b7a29035ea08dd7f4448aa34c12fcac5d8f4978aa097e01741cebaed63dd365a558ac86fb5a276b6a380d948be1c81fdc3c0ea1129a54eab5919ab4f950a65d9280d5901e2960ed9c6ed55c5c324cb00d7a5ef4001b9fc36422010656f50d5068c54335ab066a5ce5220bcd6b3e1a2651bf9cfe178b6f511c938d1e52213b6beda4c20ea276ac8bc7cb5c256f1258dd363a4043cceef0870da9283ca5f57e240fc58c945810c559c655f5268898746dc53a7ef1b86b31e34e5d10864b2567165f97d5f6ae980d9af977cc955984c2d969cbb9f202d2cd3094b47c288cdc480b70344f2b2d0db4b9f548df782aa08aef35062c633a751b7001f01c1707e714318b59b823a0229ce783467bc1c2a551d8 + +Input: d0ee7213ea0cd34f99e8278c24b0063d416e64da5aee9639a18194e3956b5fc84ebb17f592c2ef45f9ec9b75c648c808dc4369a74215ba8940d640b3d002dfb5aed7c63884ba6e52278b657f70de0510ce8865faca5531d422a8374975add8cfa79c058a942d55f32dd761daeccfb8c52861045d4f69a9176b0909d928ef71f91eb181866200bf0fc3017a9802440a9bdf78a23a8d086963aa9f3f33113bac5eccd08f4b2b34da4c7a6461bd5c1f1b4e29338d211b87fada3f486a13017485db83395f22d4f92aca953453df165b0abfef9babadb16ee76ac46843d9c976f860e6ffa960c3451162f64815475b9c91f3c98c60c33c6f0306a8c2c230aa6981205d74facf69b298b0b96e29a024a9b2a48cd5f3da5a6171969f9adf4a798f36ebf61f3e4018f81ff90ffd9ce26d638428f7be4249b6a28148e4c6e9d3d61f68be103e6d430c151a0250de138b5770293a977fa9bf5f5208b38a9ff99d08363b9dc9cc65f266b968cdf708fc31598baa3c10f3ce7a50b3b20a35acb424dca404cdf99fdebba60ee19b76aca124bd90bee9a4d54efa30b7144913c52e84837637938f2d27135119ef06d0df74180ca6d99cc1aaa6654e93f54f9e92d12e18a047f30fe5319ffacc1d46e5cbcc5653ab24fac1c2342e8981f97f44835eda8801526b2d7d1b9c15984087467b6c391eb0acaf98da311d +SHA3-256: 29ff7168680bff0b61b64812435b9423f279284c4b1ea34af5b670f018370a58 +SHA3-512: 38f54d2abaed9e343f8b33049fd21153d9901936e7857bffcb40d71565b5a9e3a80c6a8a8487b03d1b19dc71a91d78f4e8b110e485188af6d33db3a3515422f4 +SHAKE-128: 402e4968ee3f9a3efc6002652cee0fa90ed21f76ced9bb5fdaa69a654ba09f564ab7927ca77b4888bef312bdb8f9a6892350f594c81ade8d90d3000a45e6604e3bafd7232bdc48203ee131f80922dfed863880f74d0d180bb41f3ab3d4925a53c02bbf118b07b4e03d8810ff0f695e7f0f27595df7b79d4d7eca27da5de3c2723b95f324beac863d0d6532443a29c977cd529b57f9c2f910be6a604893237fd83bed46dbbda4cd72112faba11441b047019d7d7afe18ac2a90c8b15fe7f07db0ffbecadb062076b4d90b1f025b9c2c45835e642529f208d6d44f04b7d604df49530d9c80a5df306bfb553d0789ed831612544647cd47445678d391d50aabce700d18a14cdf78427d545840e9ad7045286b62eb51ec49e3b100499da650b092e29aaf5cfd6d6289da9d4914d534aa4126af728da9b6f579a0360e57f5b9e37cdc9cfc8a696a9c2ad9fdc334e79970af8d655119f9ae86d40a5f47e9bf1d059ea329973a43142ea3481e40c6f67f8a26ed9b27982d27a561d9f6a61355d8b4735ecf7b0885748242110f01ccc32ada45478487a2a541c0e187c5ee1dd257bc7c810242b7f63a3ab14ee7c457d3bf6def869046bf4b82e99f5b4062a99c11fcd77939f62a44e83d0b7a19eb9287d55dcd35fe89b82584f0fcfc470edcb75ff8e88b13a71453cfd4eb259f9e0d0461ae9a440e678590ed0e2a5f4cd9d7be946164dc +SHAKE-256: 6b701d95b48da589eade36f621fd249b859c7125d26330be02eeabb57e139234275f7805865d1c74d3b522791680ab2971a72852c8f0246ef2a4157aee78ba5d75586c3149de3229bfb321f6b8bd0ac7641b159221027b51d3b38a573afaa90e79f4b7cc0aec99816c7861a97b6fb545a2a6c012ce0b95580f250ab3398714b88c2afb87916a096e6d1ad6c399abd32d4ab22b22b95a701e93d7917fbd16e9431ed36844604fe0c36aa9d105d81bfab8ea7bcf82b12c420c176e96d6e5d0bd1d7f6636314844605d0d690023e4cc728409d2d34f4763cbc31950aa5769bf5a0865f8e1bde0ebed596eb9ee8c58e40a43cc38391f28adab3a5cae5c6b23d0194981a8978c5917b3841177ff3319b6a9a9a48c2f0fb9b312a30f8984d4c49feb27a661349a2a2cc53f45cce6ad2fa3167b42da34aea858c1e3f9d5effc64bcb6ad6a7117092106806a19b60a1bb9e0f54387e4847e5f09de9731dc9fe8d8dc1d6b01fa1ed0111f8b288ec14d4f32272d7c4ac23c8598f2a45a5aaa1fac35efca816bf2cb833397b7468e992748bc0f85acc2c73158111e88d6c68ead22a83fb61628cc284a054f4e526ab2e14b57c79aa43a00b55b1be2ddf32ff8e7f4c50a8a7ec490b1c64acd669ee98ade150716e7dc2316b3b2e04b949dec9f506b7050b2b0121146164eb6602283276c7662b3b78391d7103fbf7a3b395df9501d0546a0e7 + +Input: 9692c57e41855a52af7534adba0fd2f515206cd8fe0aff5e5db74e26a41c54f29afc2f1dfa20dab39d37be3f04aa4f92ec17580648c87171e8268200c0130174a967d8718e1f0ed71c13f08079daff46f38392d6943ba1a1e38840251a49dd6a7205ee5302638806f573e7885af7b4f18cb19e838025d1e54f15a294ac32e82250211dda15b056e0f4d3cdefa75902e1ea7a26938fa9045f701cd72aac354c15e0e0b82eb937ac9c5e4e2460b3e46b399c8194c58177149074f1f99aadbeb58702f5e63c90b90d251bcea5319b01ee5d304d762b7da1b7d837f96abb1b256b310bff212a0bd1c59ff945aea4c460a9207e080b969db08fbeaf98fd7db1640e79dd0ee2212ea55a41f290088f76ad1a602fe82e997c3bee41d2fc0608a1a5d5f5ad08bd9e54383cb95e80e5d1c3ea2c0da5691e1a16d7e3b72604f107b3285e6807c027aa211179741d9daa420e4e7abfdb58deb68188caa85165aa3d04fc66bb779552ba5f9ceb0872e671cefef1c08a59d4c034129ab1b120ac5052230d8956eb6922025d86e894dfd918cef4a5fa3bf137294999e6a2712b6dafcfc29b103b8a9ad038c585b4e3feed3918a41bcc3f75812de6f806c68ed7dadfc38436396eaf17f1f7886fb642c53112d8b8ad5b7a2c803ab08241dc848a55a0481a3962e207c715dfda054c24e33de9e2b6874fd26041bb7721 +SHA3-256: a3e4ab92b72c4bed1f761848062617e049491a9fca84de0cd741c4e7742a30fc +SHA3-512: 366bd209232fec57fa420e30fe19ec7b68e9e39171d1f1415666a07a9c876d92eac1734e63b17e3c150c5be977a466c723008de7c6e42d4a342021c7f81b92b6 +SHAKE-128: 9175a94e2f1be42af73175989d44014e135ce01d263d90d5f44826e4135043c0411401b822a0478a1889f3fe0b24d56ebe1364f2a291cd0b9b6dfc04d46c029d911a07ce3a220d1fe7844404742f43471261c822d9788bfb84de077329f1383f41dcbf9eb8634a4a852e8458c1b77d76f3dd36baa28d1bc5ca396f4ee6a78c2adc2c73061d707f86ad4119f85d43d2e044153e6c1fda5ad44bd7dcae23b3aafd184053de4a06111858ae11e3ae0d99349698bb789f476ef294ac8db418b7c30a2cdc69c9842ce621b6ab4452b606619a027138085ce17a06e543e55e3b7e60062715ef8db4e19f25b5e53e6fa764bedba52ee840bc1aec3d3d4fe9423db4cac8818160b8b3ec250f9719f109f3a4c221be5adbaedfc6d01eafc52f633530c3ba5f122c611c25f1e3c1b633b258f3731c74ec17313509d9d3d7f63ef803f3d31569cfd8f9bafd026c8cdf353dfe62abac149b560b853a9ad433198cbf818e213fa5d653f10b29f3835e770f6dadfc870880ac0d2d2df94b0a301f869b6222370385287f003a68269ef723b95fcac9992da6e3c3d472145b759cfc7555e9c50de6361a8c65cfb6ab96afaed426c915ddb560eb26190f8ae4bff48291d99e513a420562420246bc586e7ab80425c2dfe6a122e9c9ab075b1f31e7b4618a92021e0cc6dfdf4a776a7b4106825a676822a23224fef5375d537365d9f19112c4610363 +SHAKE-256: 572bb428cd35738d3ecd8cafc1ab9e7e04004137e1d60fb967801a8fd13ae7d42880ec1a7d8353f45b80c13ffada53deccbb2965df68f97eb0e39a85145bdc201b4fdb066cbe6844e74da0af581024925e60c36642d87efc25e4848fc5fc1990d4cc1446fde98328805147bd6dcad79e18a1f260f24d2be7ee1bd11db56a46a926f3165daaf6064e09d7a91b691efd7bf7c38f861fff8f349b858222a83cf8121f9c33a85599d491b0f9bd187afed6475f7ea637705e6599f7f7cac9c9b356055693b35307182a4f23b9f6e57b51164157650328ca47fe5f95883fd03d7b6f6e959478991445b91a1de4a6611163aa8729b7716f08d202dc37b31184e7fccc8c30169872181d1d6cccdd9ba57b10f60f228e6716dbcfa999bc1f1b29a3c15f1db1f7e427cccc5936f300033cf1c04e076c8e8323c7adb5fd8b2627634a747b054b4a78196c2fdd957c3a0c558f0a5f8c6acf691eb1a3ebc6c9b8b0212321bd2c8bf1eae8d8ee3ec75e2bf9f83c1afbeffd120653252db09b1c4e5481b4faf46b455e06fab3623e0feb64f31ab21620d1d951b68609ebf71b926979b397c8b3c683b27f429d044ea8d8d5778ea8739f2701ca90e979c8493194c04cab546a2af91d2f3f7ebfa33af5a2991bf1dac74a92699dc814258d6ee90b4fff5144cae1c2431aa6424088b6bc3d6e39ccd799a4f0fe4d78d623567b0032b68a34cb06543b + +Input: e4abad8b782eda8e41d4be6f206c6a1c5eb96ac16e92d310c7fa14acba27cbd8d501a6100089e1b61bc14c0a4665a3d60f4896d9d6e34d201beea69a755de878d723807039aee0ae656b1001fe4fc8cbe9deb2bc4579345b5a0788fb0061880c45027d0b51556c50949f9df998bd4b37a6da1bcb7cf9d10e1c5736b32c6b585dbcca436e6c523c41c530f254e3925bcb2fb7b29ceca077b013d694e9a254eb699e4b63557de363aa08535c58c0853de6ac5b448b7f0bcbc6ace4abb5400995808439c0e96c02db715113cfe80e1b6d5ee757ed3b73a1594bce25c0346288c6c5a547dd18bd2af623ebef49ac90949dcb9447d7e59fbbfa06bcd12dd98a12f2598a1c2168b72a2b4f693c8f25f99464d34edb2546cfb098e1275a3506fcc1c3522b843f241b945a166bb271183e432e72d66593741b4119971544eca7e81de64641b6d363f1ff0b8639f9ff4f225ab40df92849bf5f9c54d6776c6c88c402e80da0ee1062bbd4245612a4f937ea340efe6305993812880ea3ee294d81bfd7e5ddaedc26c3b5d18dd79aa18e0afcdfb5bf47253437b0225db795519ae4354ae280abe5e0c38760a11dd42f6510f2ddc24746089fe4e38081d32617f836b687c26d53fed8af7a1ebf6b00e5c471cc4a609d14f443c888696d2da39f80dd018bf9f92641f71fbd95f6ee714770e2c34882681ff3e7bf3617 +SHA3-256: 7499a373ecc73c30a4056b4e90c2f3d2edee9f022d05a9e6d2ec973bb4a3f206 +SHA3-512: f1e4668add81334f73758b1d0b3192cafa8accbe8b0bbaa0af689c7bd0b52e17df2b065da4bb2455c8da64f21b2bf38b2529c5a2f05a733d1562974c0a1644b3 +SHAKE-128: 20adb1ac501c5d6ba9a32eb336ab477e2aa0ab19014d5087cbfeca11996b4cb12c61c3e2c340a7380756d01f282f71ab68eb83b9aa440f5e53ac028fcbb73921e6ff9c0abd2a5b01829759f46d60e75963e70590a7da9f0fea310766582bbe3363422fb83283c1d83b1707b5f4f16615c311055edb5d498f6d01f32647fe0de6eb00328284dd2361171b1aff5928d6d73d901979d165e1b7229dcf62bd908995c3c588b868ac080739f7ef9b34c4e83063eb0d85b30952c2d774b9122141cb94a3aa51f9b04f5d55c2b4de8f60df428b4bd98d1275688124864dd907fc240e7eedcc4ad4ff211c4baad20c7f0e428151b7a6f64b3f78b1387d2c4e41c9db963a9fece7e844f5a3711aff16be8f54fdeec193f56333a56c16c522aa54f0be268bb6f102f5ed3cffc3e77bef0dc345ce95c90b3c1ea0514b3d4016b3d66132fe4ff52d22fc0b3ba24c671530d18c4762be8c88cef3b1ae57729675f31d45c52c224227d77f9d21dd903213ab5eb82c07054783835100a044dddfb2e3e83aca2d937dc6fa538afd7d5dea92a66611ce0ffee444aba4bed490d367159ead08155b3dd76dcb032dcc3a10a3353ab6b66afc4f47e99e8afe8aed0b789562a11a62ab9731f6d08ade4dda30cce5936697448ce0871015feb798ae538c833cca96dd50339123b4624f3beb0a0b8fbb7053c98b1c5d50a8d2d7e30f685db4510bd82730cf +SHAKE-256: 65c1abec801bf90cbef825e8372c6cdfe87dc64ae4b928adaf661e7680d21b6599ce812555716f6c2450404dfd2077394e83d73e7e6ff74a74a83bf96b3f04509901e95931565e786f687e6988194cedbc3548fab8184c27fcab09980ddd69da99f9510001b837c812a7bc8df06a2f382ed2b1d5799d455af60cebddfecd1f098109a947afedccb0dc0c597d31a81faecb9f11959bde953865816936c4ad6cc5b3b1f431bc1430c1d4bce94bf9b142ba1d484567a11f14c712c3384d0de62aee76e3319f5ff14067c97b8eb05c573672f86cb9c0b9d6352b9d13dddd6e192b38f78f48acc36f84a68d5cb12d0b7ef73f7a2b640cb039426f8b1fdd9b84cc5ae699d1a58bffacc7b37e04de4423ac734662bc4990dc5cfa55e99fe1e977dad92adc12b6f3c9bae33046872c223556415a0874e6b352a056ea639cc6bf8452cc3d4d9abd0faab31603b3efc5c3d9ef37b97c0f6acac441a5e5a3387d09c3b1c123cbc4067ef52b266e1360bb4913d0ac12b99fe1590eff42c5d2d0f2ab9f7f08dcbd5af9ae12dbfbfd3d02e7e53ee14ba442c8e30f70aff3dfe77bd333b13c9beb37ab1a3cde94d12dfc6632725d8713c3b1a6b13b28a7d8856f14ba625fa402acc5889fd5b53f6b0605b8c0ce3e8ce948c4c5f79ba6a073b795119f6c110fbf4331551f48003495ccbc708249127be84ab4ea7051309861551a28fd022aea5e64 + +Input: 8bc2e1eb09c9226d50467e94827719f05763aee14151304c4ecc4cae42c5f4a2a82bc431428454aa12d05747c4f8ad55b759057080d1453dddf10d12c1ee474390732145fc1be2ace3edb0645b1b65263ead2480a2467572c296941b5b43ebd6acfd004ca93a0de6ef1d41180f6c064eec92644c5ad151f3968ac14d3ba9fe064115ee06fb5e2957b228d2fcda4608f9a1a7336b87a1c47116f7305a11abf20bcd20e1ba79f3055661a8fdef4d1cdbc4c2eedb3c0caf76826846dc9f7e3768c524fe8c1c8bf38f20183b9767d04f222dac4f9ffba6985652639b8da5f4ae02b870a67199555af3af8555b05f090e0d7bc73bfbe6562f1318fb7aed6a734d852f6dc3ae6574bd605d592aa6aa0334c0b69069f39d4e3b3763addba7d9d2223ce90711ca75c613e3c4fc6ad90b929d5350c6c5aa55f4f201971df06cae9bafa72318e61151027843bccc47d192a43b44db8ca099b002ad7ff9e9cc8485bdbff78cb836e0b551bd177f17606ee3bd9abe4991ed6fccaec9709ac1457c46d4b80c36b73899a4c6e37c879b0c25f411e79c512d2007d99bbef35656049145af903a12e1eae95ccd920f77e2f9b2fd108e1a106d902009061e0fe876176d93728ad5cca8c776979d3de83ab97b47e38f824f55f3b9a6da98c97e0e556cbca29d4c3f5c9d902661ef17d159ffb157064244f084a4d6ed4c9662f1 +SHA3-256: 93835c31955d85cd4c09cec6a02b7f1d2f644268d61f2ebf1d30dac9daa967f8 +SHA3-512: d80bcd984ee9bb21e6bbc038e8959795580efbd21ae29dff4b1b92f942e494188df2d05aed15aab3b1c8133246acb77eda80e1b6b817666a2e9e7273cfc239fb +SHAKE-128: 242b87650552a1b768dbd89e41dc84fb35968646f058c54b2ebcf6bea79bfc3356abe8b4fcc21444789fe817926a6cbd46be0c79b1789698245cf48cd138898d9ff45f84704962efaa66c3c700b32ae685e2f269f5a189cae21cdeb4ce65e9b49472b41fcc098bd6a3b9549feafbb9b6e181d5f12ed0e36b360a1fa4fbfdcfcf1272ff6563c57001ceadb78db6b636ad015f015281027f31fba15d576848d11b71e2c5d8fc274ef32a12820978dbaf3d21e452b9e7cf1a81c508d4a035251ceed8e35b3af3839ae8eba848def4c30c2672fa1b5235db421e6eb5138110f4b9b98e95f12c6d340657bf1767ff6971ba9aaf37dd5aa38ce360684d6d2d2874db5516e508e3d17efd1c8823c70979efebd340aec40895693d09c4f5ee9cb442b3a57299823c519d5cb37d5e27ee03a2969f9eb6548f4fbbfa85dffe075ac40b7fa7f79ec4600cb8ae3a0d5d2e5f7f852395e71eb60e9c637500a764abe5deb8c0bef9d1f8d3e4191fa2062fcf2945016f9c25087536d49cf3ce1f284762ac49fa52aed90db61ed07bcb1e5816494de22b691172df391a8e4a0685aa12690e668aa0b54dcf1b11e770111f84969d1d317c09fcc461d0ed2e414d125040ad7ebd052203531a53090fd1d1f294d08daf942cc01b53d56cbe0e348191b53c3bbef9abd1453e7ed4102785fb0a25859263501bc102568cf9b9a2870f87e0342afff10478 +SHAKE-256: 9fa085eb108049fa49ea8bc4dcbb234ae57233fa3d58185e2910afc3f719f42e09a247b74d14a9317d45a8d669894039109d1c000284d53b6c086d45524cd114ef2f1c799e8baa7d2a5f3efd4c3cd059e7d645eb004740d3d2bd03b4d1eeb859ff4b30b17ab9f945949197bca2eb14bb217c4d55575c794fe16131526e65052741154005f173e37f1c82eb1e704d53c5157e2ca4483356f51b887fa1436b16cb047bcf2da930dd4097193a4f0bcaffd3f027c88abfe9226fa4e056e37f9d6461aeb0e6aba4aa968ed073193138c70696c83243dd5fa5f61469617e06250fcc21095ce2001f14cbbdd41e96e48aa22baa0b3603fd7ad01efe4960e143660544e933959c05565058e259b1e137a35154a5fb1c3ad5cc8b7928c60644265491f213df275ae8a70e48710ce273ba0652306d35222f1a0280e98982d27d93deb4cf4937bbebb610f58030955babbe43d67329e67f5d21bf9f509345a0414760f25ab8ab156003339de8181dab492253afda0628e86987954ae09e73fd1e65c36be0f08d2a562aba4f4e520a31368857f24bb0b75ec2dcbb03b01130d68681f857d40b77345e13d6eeb5dc4d5d01865c099d977fbd1aec9901cb4f13c004e60e003e3b41bf9807f4ce02352d32a7cb43b7ef8250d74efcffff6cde8841bfcbc8eb821ba54e1605b8ce31cad4080adf123ca70ece922ee718b5ff0e32720cfc58d137af + +Input: e1484acd138e7652f55c68dee2c28ad909ea255f9948e0ae2c42756e37369aef566b9d62938cbe4a3162d83774699edcb8e54262b73dfabfc881d4bff6d613d63338359d17e9a66fe0e4148df4fd7f830a0d1cf6961339ba4d59d41adb5b92e891825f1b45c26e68ffa72cf463e5eb2253f3037b842e2b1c82f3ef6e50892016e68b30a2f43adc26d54b5dab245c8488756958b3c4d6d0b1ed0b2b5a7e15114458e6f3760d50999aee832a974bf56a46e52582499811d54364e75e746f6a4d08f1ec8d1e54cff686c8cad76a5cdbd8d1313fa4830720529d89aaaa662515d0eda6b103a4ffb51ee9c70a507e9007db8546f26e71cd9a6c9f1aba926346dc8090a76cf390bdb01aba5047de1ca45adb2b5a743b2cb19f711212eff5b435084d0683c835806c96fdffc211255a6e6ec90527c7b019c0a5c438c8947b59cd4167ba77ff9a81a8df16eef6cb83afb49f8de4c0b1426ed850488836a60c8c2f71fb3c9888496ca348148c9750687796920711452ceb41e92a5f6cf72d7038614770494ed3861e3aee391d86856102b213ec75db26bcd0c578b8fc3719ec6274f1211fe232db1ae2b07968a81065bb67964341452eb16d2b328e7f072669a2d8e326a45438f0669a2b8c5638db049e97d576b0a1cfc8d5268eb674966edd95e3595dfc6eb889ff1a83222990be0dc6dc3434d578eb8e10099c4397 +SHA3-256: a4a5884de3234d48f426f4d5248ab57b9979d68066aee931dda0c9a178786bc4 +SHA3-512: 18d1384402d2d906474b6ac5c5e036ece3f245934c5c50c7c1b471ccc84a575a2b8bf87aef910058bc409067c760aa7575998a305bee684d21e4e8ac5b55614e +SHAKE-128: 46028906bf9b0829b5822428b41b3a3c5937de851e12f7a13e27d3dedf726394aac924dcf316e51e9d08e7e315b589dfcd84dfbb8f6588ce5af31c54755dc78abf71b66aa51000afb5535b61ce0e1b55748697fe8a4f5ac8ffebf5f431cecc72a74ad768c62d851dc685518e6252491070af8889a78b43c430975e6e5681b1082389ec92a0a9f4fa0db46d5f9ea93a1611a432d9f91c04e093cf2b811e8373f60b8ad5903a56d88ac0567c55be8173c103b844859281d93d42e6667f05e0dc2587fad938bb75ff9b6d213bc4ff89af1d0ae498d6b56227958bc55ea99824e7c97dde8a7c0c6c9c441d4dfba58404b32ec5a3278faa0dc4fda2b21fdcab91eefadc6a6b0ee5d111bc110967f6bebfc20978f4c70cf101c6debed3bb7204c1d67779a52e1679e6a57cce9e04940f3cbdd281a26160d2c084559fbf5658f7022ac14234b7228015a3bc75c233232739daaa418a8445bb6b96f97ad4f6682f240d1b3bfa7b0f2885e5c9a89ed0e0a83f581bced3b3f329cea06aaaa29807c5f9004e9fab0d8176e2ffd79306f79970f59dd7bf67783ca98661f373dd1c58a1546799f11d65807d11620fb460d175c8e922f792495a75557707e63afcbac78c5b1e6ea8db3248401b3aaa102475d01304d6e659253ce3876c8712cbd2728201fbac19f4dcbb8c0b7d3e5f84ecfaa65ae0971ce95159c671b215b4b7692f3cdd9a3d93 +SHAKE-256: 4880c42d64c60a4ec23b185a0f79d139777e449a59a0186476439cf87780fa5b68c65c19836ec5e37cd793f1057a1eef7746ab32a711c2aedd47d1b0bb95178fbe61ad8401fb712e6d8310879d324ff35f17db3d1ebb6298ac64a33f43f904de8cbf7dc623b62a859ec86bdeb546f46f568637ca4785817b5b0ae550ca8490edfaf1ef1fc222a78fb0b0da2df7593cadd1809bcb0bfd0b59ef15c9312c8b2fb6b209fcfe66354b2577a175f274d4c731e50808844a22dcf0eb1b9e4d73bcc8a0f03c13cf9bfc911922d62fbf5ec2d44a78b0520864ee93d9feaa94bba269af0849e80c7e545e6580082b6c62b0843cdfa51f7a7351d06d40be1b333760c427f5e49c032b9de9d046ae8ce94625178d161d9c72bc33c8cffe75eceb875180c9763403ff6d1206f5217aa3f498b33f35aa600867a798790e79549fd2481880dcec0533bb984d513e60ed7c21289fb19150082b6f2b083dac2b3cc1484d5cbafcc8716ec85d7373234fbe3aee32c0ad4ec343d37c42be5ae943f0077c396110c1cbd71a2e4756ea0d0654611197705c212311cce6caf35c76e8c90d45e5395bbf94698fdeaeb6afcef34b107b6b39193ec0432a8d02162694a008eee35fa198c4083ade7736c65fb2f461ebd6c897411af2ad28e47a83b3699fa491358d3f11e0e9ba830796a94eaf6a0ad43b74aae42774f99e61bb93657aff57f8a8556d7fbb17 + +Input: 76c47f5f4aee787cd2bff758c2555ce66eecc08654f7ab5ba90c3faa20ca0c85093e79c3b689bb2cbd8d485f7a4c386077ec101747e355d1296bae5a381f4a43ee160307c7003e992a7dd8bceb6e400cac72a1b8ac7c2a7b87764208476d36ffdafbfd0e89429343e5e6b775b61eacce1d85ec91660e43416c2237b4d20e3829549e3a5398647aa5df7c2477da200bf52a4fd0d135a0196cd60cf85526a1cf1580efd008301d6b973f7e943cfb7f1a47b0704914788332f7a9fab775291a20992c9a0c8f5af4c8b4c00af8136eebab9b449289326211e53e0960b73ca8039bccc23b92fb54e340c350a17f8bdb11b7398a509f826b2dcd1ed41b036ab0039944ffc0c246ab73748b20623c69f6d3e9904ed1146d5345be5e73afc56ed8672965ea684cff2685cf84c91f90763b3eb95ef9b15c35efb95aadccc6c6d76bf3544d849637de7f78f6fb971a1396bde6cd63b521b05922876a34f927dc8f35b0cb41726db51dfbfca773e7acd374dbaeaee03f62f31b0f52f883fbf5b2e925c9b65f659827dd364cdfbc9a41396e3eb46d1bd14ea9f5e9b588207ece3aba1a47b7b6bea78a577dce68ed5d4e09de7f38d0bdea6f4c959e583904018a1a38c8f892e08e834320863463b2948c833e14092235fa5f44c3ad4fa52345f80817108fdb5ca3d3be03945d0300d94e41bb50ebd06669be7149ba1bf9ed28 +SHA3-256: f569276d41918a004b784087cc6db0612a4f92571c498b29b66d4c15478f5795 +SHA3-512: 0a25f1cd6de6ca6dc2474ad38090e3ccdc9a58cb3af850734a70007ee18b54fde56f0655d4f248ae7ea9f5d4f1a8945d0157170b7c2e22a7b9de5e09917bbc52 +SHAKE-128: b7a89fdff826619c52ff1977548dd18bb8eeb09f16ad9f01b8a558ecd245b96e427e1db0b6106acd2c911f0855f558509eae1a092ca4465bc00606d29f16fa69a6722f8d16ca5a08e89bb31e63f183e07adbcf0179be8aa0c62b1af012eca0e961e800fde6aab1790b27b5caf89178a8fb0da37b7953273011fe1cb8052a8c69e7a8f07c4f44d4deedf26e6e202a9b73216f52cb1f3af5398dd3a95beacd124dedd94f5504b45550a90593d6e8ed80911f8c52c58b2bcfe63ea390f31aeda2f01526919051122ebabce99403b3ee1e1f11aae1b38d5a08004bcb4d736e7f5b1bde1e12f2c4b79a74e54e85de0da41847ad225e50a2e2543459a56a7b55c29d1ed95c6629e33a9e0b454d74bd1128db791e8b90fd8054018eb67c936af9f99fb3e92d09c036016a70f81e180b43dff206fab5395326b64dfa3a7bcb35464e3bb879c5940c03e4f31fd0432d7e39ce733e7e2940340c7409a998f9e5e7e6d70540fd6fceba48cd0bbee1f4a76d66dcb3ac8bf12cfd71b9888af2407942a3cae3831e87638e5279fe11c0aed09a6f8385cda47a4a80abd5d0d0e215fcf2a8889c5e4c4177a88fc0c99df6ba383ecfdfc04bf895c412cf2f564b91ad7bff243919db0b9ac10b10189098d33a0927739e937d9b0624d4fb2aea00fbe4d30e208235cea9ab0f4f063f5af92525402cbe7f28b26769b648bbe48984ba712de587d650c1 +SHAKE-256: 34eb9386312120558cbf34d22d3aa996bb015bae890cbd67afe975e777c26e4409eafa2f0525c4b22903e1345ddf88eb5e7573d5a9273b9e64dc35ce46e5e1d06f44f86ae84bcfdc9aa2c8a0bfb0cd86d479cee2b54bf9b5c588be9245d5a28cc7922b7cf9cd06f19e3a6cd35f754386f23d5fba1a7e406b239b709fe104623600e0caf87acf242574f6656c6f5b117a1df05c0f7b7fd60319fb44df93dec4a59a9785ac63276e90b6c87f920a0cec601548cdd50efe3adb3f4ea03958ff2bd4c1fdd8edf5301396008f93f84b9e0b2c5f0eff48f7be8240584a41bc54812a8a9ae9aecb2a0dbd0f596a43f3fd5314a5053b8b05662d4498d75c1f9e2fdcbf4f67cfc929cf1aa6b31dde5db4a33e1d4baee4ef850ea3194a597d28dd014aea57034cbdd278bfaad22bcfdc8d6ca59c86c28aa721751bc70b0b0e8d1035247e9a07910240539e77e17dabb8c4c7c8d92a8a0a86e3f797173939778561356c42ddb2847a7f6317ac020eea673e34d566a99cc8fd037ae46a399dacd60b8732ccf7e610c9d3f34a599025974d7ee28bf8f550e744ee6bc1421b29cbf5ccfd0298d870b399d878de8d7334bbef21fef4e728fb6699ae28ff90bd5850e0f37010ae9c5181e8f66d57b9b6a3dcc3748b0367e197954f404f74b040a4ca4fd5a67b9101dcc65ddc76707d9b798008de1e525438a46ce69f11d0da92eb447a70b6881816 + +Input: 8caad50e95b807f91bf02b052805e6cf09a412c35c39de0b00ac54409c4bea9177af23861d1a74efbdba1c90642268c487056d3d0c133b33b9c896ea9e39aa903bce7c64751ec1ebc67381093010faa0b0334fd932ca08d9705a3cf4bba85048a565127072238168dac7298115fcdbc969eceef673a5091211a544c23e5dc9e7351f37a6679f4b49166b55743414769fb782359ed5c25b11054bca3537b91b9b177f5896f37e7a16cef2d707b4ef27e68cf56983474242a5b37243082ae96501f91d0450759608c06525fa806e4ed33dff4ccba0c4244ac63500e5c09520deab693358b697ac5884b122bee86e9a2863a1a7cf52df0f8fe1fd43b5c1da9148c552efa02baf536431dfc3b2393a60e24f0d93f77c3a7f95320b44a29f194c804341345cc32caaaa1f78e3219a16c35939ca79a80c954eae5e236755ae6549d8d1484f5e14c3f5c6fc9da8333ba96fd022e931f418d299958e2985ca4899cd7fedb0189018c04680d26dcf8b831db06fb27267eba1290b696d3e03809374690f82ddc661c8331466f6ad4cf9ea21acf4bb55cf92e95ef988e65a64223ec1d0bf91b36f9d5ee58ea964de85b62ede7814a63b296191688083f087abdba9f77f5b5659effcbf07ee969305b2db8379e5288117d4f7b1f0d29d5f6d26409b4912587076ea7633d1c2a3585cdcd5926b48de9b788a43f6ec8c6971fe1e +SHA3-256: 36c413524d1d21120963a2a8e066cc52e34739806ddb1aa09873a9d20e7274c5 +SHA3-512: 079e76bbc9f9123188729fccb49b46c1216c501416683443b9ace7a70391c1f29fe6c7dea23b788c3386a7587a24eeb2be2d1a28643697156369b7ee0eefd72f +SHAKE-128: 3ba84f080f5868f6033761086b6994e51d26b37d9948c3d0b946b82a7622dda5a19affc6929da3b4ae298c269fe3fc49bd3802d42f535370d3418b17d2ec23d5f33dadd8d5a4077453680ce13c9342a7c50d02683d769866b921b47929faf7cff605d4569f71ea51a084e7a156db2e300bfd0a39ef8780e68713d48278c902a41a97f131dfa08d5f3a955d52bd99b4042ef778887a1eff558ddee2d63c4015126068d64f758c635586edf24a1b15f6120eb6894432ab97d5aa3580a1941093a100b337aa2a1398c92e592a39f9fb84aa50ece2b39d3ba8bea4867bff7b6a985ac7b4958029699076b38b7219f8bc09d2e90de438c01a56e33092c582fd94f0d4bdcd2937d68fdc45a7891572d0ef6682825496fca7326acb779bb831e953143e431db2dde49cf69d00d493cf8e8265278ef90e0bb59848b74de75e57d0d7825a9b69742199b37376b281e66b105725ea95c86392436b5944e33fe6892627e85dfcb0612d7707cfac59e4aa631af5c4f31b719e1b27a4e53e9e68e8d7aaafc639095e4434368427d55db137a75e46d5c04428a76c64633efaf3fea2d40725fc0e80396358ccd678508c3bb63571b5e196b13ad4fc9dd17227358c174082b3e9c939154e08fa79626fbbeb51cf22e2b0defbbd34a062b1b6f1b11ce8a2452389357c38790f678e55e6dea6aae7d48494e46afc47a285e6b8a2d240e4d26cf5c52d +SHAKE-256: 443636b286aafe10736cc300e90a42ecfa08df05691d2371c3bf193bcba18ffe27ef1a1909ea09e939d686f1c9bdeaee42c2f1eead2be16cfdf7f6df63c54a7fb83cbcc0df5920f3df96e8387066cc202878ef129fa0f1bb0fb5587261032d02ad02ed40e95f8fbcc81a6aa34f9a7fdd7ab11440873892e8307f11e9c37388c976914e764cf48ac4432233c960afa17b9c0df5961096df69d321b7bca434b6b30b243ae50c7aef8c2f5d0ae3107faeb4a56fd56d5d4edd39dfbbd660f51e844826fa533ece800ba086f04e6bc6fdf4ac4de73f1678fd918d12328d8f25c1b4de44381242f218e5a80043e09573b0ba9acd49d783fdbed33feba1c954bc80dd941d956c1b059b71cfc54ec45847d0310885d6a954abaaa7e5a17f7829685eeecadc98912aa5ae747d6e29283640bbfc7f4d4af46b273a62edf2a1dd9a359c0c0436fe84276b467f600bb7120a1b6ad85219093c3f5aa11e22e96fb35a4e2bac0fa45ca6cbd1b6a2b75e75dbf24ec871b212f42a3dc4fd6a683a4295e68c4be6cc506eb956ae68e9b54a57a30caeb2f5453e22786b50703517dbcc9756b03a2289dd0059093bf8852686b9bed16ee734eb9892164e944b7df74cce7b4f2783d867a7d564b564a5a203c764f93e3c17e76b12f8b115f10aaf417d8fa6b2e095832073a81cf3177980fe48ce15bb46d3aa0238c9dc6962f3403011a7cf552d677c98 + +Input: d0889c94ac0b7203acaab8d75d2cecb09e67623caab5bb3bfac8f83dc03771c7434af638e53a1ceecc4a6c560b040eb3b6613220878a5333c1aa6fa087d04dca91fb4cdd6efa90de2289247fa834b541e638638de816aabe92b6a84b8ef4f952149758ae0e50c27c304a2c918a757504fabc261b69a300f295dede54d77d645665126542386808510a7369155ad5d6fd4a428a0ea5b2eb8eaf08a1a624ace709ad14baaf3e1a0dc0c09be39c97b2c24543c8fca8bcc105dd6eeed36e034e52f680578011e2a5a5caf7624c192dd6b052829a560eb0e6200caf861c9431f768b4ba0357ba7bba8b43e9181e175fb87819928b5ae801704794b17464b0327c4fe84f6d030fe7c21d851a873861567113efe0573dad95a972afc079c4dfbb7ec178df324a77e77324608312c778d7b356156d59e1f4329e5ca7b06013c98f198ded33f0ab7ed6d4e6abf23dd28a40cb2ae613e7435d084376c4459ac47246598ca438de09ac9c6eb1e7a7c3466c43a0c3bb178b1d255863e048084d05d9b2b404a0fee8fc687c7cdac702a93067dead5f3d0d4b5f480eb3410504dde6e639bf7e106b4d6a8e2478bf906beacb8670a5a86d2e2e5314c87969f08de9b4c7e55883623f4f5b20a36288b41216bdfdcceb0d1e77a069a05e909446de064b07053b9b2fcb8192838f5805ddb90d0f25496b8ce7f432aca7e5e4abd133d733 +SHA3-256: 96de1882dcb62dc049e8b7a1ae6bf22d2502fd0e6fa8324a745880afe02d40c3 +SHA3-512: 523091240dbd8675d09dfeb0a8c5948cc408968744152b3267a54c242550e5a57d708e2e1858b34d9e6a9f7e90f3f73aa8742162217c9f8e754f01318feded74 +SHAKE-128: 97c03041d4a7e029e1f65537d2ec53a14af4f4df7ae2a8dd6f9d517a3735cd7a734683f2663da6d51f83d6524b8ade4984216cb9ac08723de2554b2f9087124bcf052cb82088c9a81b1bcfb47d17b991c2a308fabc2d80f8a6f3f87973e13fe0923d620aa4966251e88736f30ecb71518778eae9c948ce36317a77356af3ec9a4f4d2240fef0ad5c8af418fdc980ea21525fb31e120229597ddfbdf976d0b21f535da5ca2c4d9ce4dd4af9115f28b327114d4f7d6828fa11f4cd54cfb895c86b83b6633e0ece422a1cf1d00c016a76db9fbce2bdb718917f658f50c48f3daf657dd40188a2751dc6b06029da0f053dcff6b48479e5e2fbcdf0629abfcd243109201b67ad8d7725e0a30d6acfeb31852ea2289bf481962ce4709e995fcc2d38064a109a02b2284ff3cfb48fc4b2904d20e9040c23520f67ae83db1848e75a38c3bb1dc2125d91d11f60ac9a75835ff072505e5e54ffa64ab8dfdede00e8e9d2496c85a091024014a7cac4944a44a894af9f7abb0d7e0da47900ead144947dd8949c2104162307de9a926c891de5f7a405210774d150a6a62dee7b9ce9fbab792582940255f78b501632f9755d1696d5cbed21087570218d6d14e764575337c377e858fd0cc4f219b321c32d1a5c5eaa6ebcf5e3a25e08116c8f5d52236778738ba9a24c65dca537a1ed0ff1832fc6720125fd6ede4af19107e7f4ac6488ff2a82 +SHAKE-256: b27c92e87da4a91875e27eb7142e50854bed565dfa8d9dd9985557f181ae32392aadb641e83688a4143693bb64018e65703109a856df42f2afb651e5a87b176ed0a93efdb6830a7752e1453c6ed80252159994e900334745849938e08435cfa38fd5fd2df2ee65b0b204a3c190c8cf8b644e5cc58102952bb9147c12abcfd9a787e80870e90642d8f92319847050551e48b93dcc5d6c276f61cccdabdc3204a687dfdbb506a926e4c9b5aeea8b14d8d000382433449c4986514967d7287dc754d3dd35eb22ac8439af244687fea193a08fa1ef3d85ab0127b5d3cd696c6379319c30f36c7ca6a7ab8a9ced2312f5e0deef075a12fec60351698f9ebe4e8c2912e9a08317ca0fc13606337fe94a8c0e9b3b4ef70e40722ce96e0e33ef92cf8a7206b81cdd2140bbedebf4043c550368d0da222c5b91300648e816b4ce0a1b0716b4c6b895ad4681f0d4c345101973e1798bcdb150db2d5d6485bc99d06843960360322e6aa78b2e44de2db6acdf340144d077623e9352935c7ae4ef94e072db685fe7bff7a9ab1754f3654e53f7b4fcac58ca200a5fdcff9f3dd651fff961158e98c48459c04784c83066ce1443f22a4ee641b547755049ad42572ff5ed96f29b76472aa26bdc9009b28cb51ece42b155479019a2a0e24e9799da923ad41a4d665565765e7ae4f2d42f0d175e26a4d3d849d10299acd6318c62f74e388a052e9b + +Input: 41029e77d71d9d2fc348d79bb41f4445f9cb45fa77f553f37a03cd14776780102e89ca63a6e8246947722aa29faff22b8e39056171c86e418ffc65db776f429230a4ad1a1c93322bb0c4f5a73b0da4f4e81e7b7ded078c9e66156800024f7c37af75a0b9c6411cfdd5ac572901c4504c6ef6c481919fcb86be5b43f512ec0fe7cd13b4ec12322b8bc5b2fe113e1ce65ea04da9f425cc688b43ba1eec4e9bc4d9a9d97e03182e4deed853d7215f9b4e5a1ef229408fa2729c9e090db013554b0395e72febb608e5f9005b0e72949d379e85900dabf3c1906420074811defde645d4e44c314e9aca5532d52f71864092b2692f73fc4197a7c612f3085d88cfdd8a99f7c7d05c5552d53b89a529d21e4524e0103ef4ea7fab1bfaedc0477c03cb984ee9c62816a27185ba6d61d1874f47b24e7b993676d79d07e874e19a646d543dbb96aa722551b58ee7219542638252f216cb7c228c1a5434515e6de0573632441ed135cccbf6ed5e510cb728a931a69f9320cdec5fccad066701bdd348981438e24615768f686046bcf1002f19444c271243b6f0659b049545f705ea635ee61f9dfb6d44eb258c9ea2a4f50b3307746f2f61b97fb73b05784fcee419d8982662a30c02a38014a8864ddaf350036765f9bbb60d8ba0667777d66642fe9c85fea0fe41ed243c21026c76291d75154357fca56e90f3c746e60c8013ad64 +SHA3-256: 5c239f911cc201bfb5274dc8e474831a8b211122767f70321507302b1b6c038b +SHA3-512: 28622f0532258185f6dc49f785e9a2cd20ac871e15ce9e44f18924ab3e1409a8e4e25e21caca23b3de9439893e2dea3d15540328d1d3d14eb4398d0edd82ef0f +SHAKE-128: ad5012e0b759cb8c445cd4f5d0f98c0787dbc5ad72810d0b27bae565cabc2205d8ec43fb9db2ef58540090007d9ac641578b40fa02b2b002f1c0d941a13aff1134975a6d34413c00182521f7a87cc1074d6355caa81c6fbdae2cb35271ce93ab835bb9c9d27166a7cad28fa74a90d1152e536c3fcdaea086cb341beab282f4599b8b2c50fa2fc2acba17e37df1c370fce369acb4bb1ead3875d0f3e93f57f74302d4fab11947b20b15e57e7942d0ede2884f83b10ccebc7d667dc0fecc9190ebdced1696c0c6a50dcb35491a663ec1845a9306afd9794082fdd485913e451173b871da7999e5b5300e8a0083887ec4d5e46246ba98eabf56976d7614460f940297fe903c8217d95a0b8737e93b62171af650b8c3adddd58a098db38f4df53d1cd26e0acea92fa5bd75d37880c6a9313d85a306a2d97cd45d5aef6c5c97444aaef7c93918732e08e6ed9df241abe8762492f50e5d85e656c872fbbbf30648004ac2bc402ca370f13511c6a984ee5f2cc5010936e2b2fd4be1b948c8eaf8ad790679e08cca0065a849da5e4038166eb9fff0301b44db645206c3c76252515f0b3e19b0ffa690db8e431296760afd4589f292bf5aed03115f92acac150b71a3470f4dd3d33f8784e1cf0a6d7e19439361ec1de96fc0858350ba3b04a2a798de4b67098b5e4b4ef00c8a22e458617ca36ffc8d59ec0906250958bd3c8bbc5870e718 +SHAKE-256: cc8caf92486e7f9720e735eda0af34c606f65b854129692e7ee6a8231b520925adb5b9f5d599e5721a4ca4dac74f2bd1a9cd066ce827f90c6d35bb4e83432f441885b84b909e70c10f19da5688425f076cb8deda4233e99566becb205101710d9a3f10de9104b124fa974e0ed0b4503d2205bae8ea06ba8635078f5e2ccf93c10d2c7c608d74cc9cf1b4334631304ff1de23ff14b2750512c99e597b55e22510afeac209e412bb0a2bcfea62f5497263ca413516290d1a2081662b612a0305a1cd60285ab92786b82839711a19fa79a48bb3fd4022d565cb3255204e3654a7f2e61c53ee54a8b865ccea6bf6d2e30ebe9c30f5bd948ccfd636304ac3fe29656992e510b8a0ff0c3d6b1433faaf7049b959b65393dc8eeaab26ff16d836d53ec14a248b548cef84cd328fa8fe53c69611c5e2ab1b6c6f0c8beffcfd66ec4b7f8defe7ee6690e5411398305eb5a26a52c73b75643bda05871c88ae5f0272fdbe7ec40806071549bb2c19434cd518a1cb8ec5dc3f3d8f28e6ed5503c89fac6e4a4429d4478ba64ea54fda56f35623bc877a761ed926fbb32891c231f41577e11ed983b6b34f3a2df95ee35059c58285ca85a31c9928b72e08c95af3862cb22fdc69322153ce1d35462d4b0b2c45ec955b46e8a83e594e4bf84152ef6d64030965051062608de8681d147b0b4db6168022cf17cef7e1f037535bdc576d346a43b49a + +Input: f5e94186ea504a9c836d32f9ea85e61afe9646c2093e5387944d626e213be9b839c136ea24e2dddc1f4ad0e64f8892213698493a067efc5d5461b8a1d78029e7d7c8430fd32d701d19a4a7b35f360f3299eb3f8577ec4aa6f34c130b02d6f8bb7d86566864210634b5c1d6b73096cd297809407871aa531b68be0124b001045fb2cf6cd458b5fdf769dcefadb1082453692ba8fa940e7599693164a2f4d174f258462cef379ebe5f68c0e98fc1f12173744ec759541f03ff501c5d4a704cf4acf6df5050e524c28a550db9e40c642be26c430eed401f9a8327f3aa875b6f13edec522c257a487cbc6cce036cd83773c4f4f86963216b1389bf7479b4a09190f82b5ac677db1c3b63b67b863924c5371fd881ccd8814ae9b9a1c9f6297c73c03b2bc5cd6d6f9794d8c232a6018c3a98ae10b6517749fa131d096cba733748d4f5ff3a78f58556408f735978657c0629d31dfb29a05ef1d06bd3248d6d5a33962794440ce986d79e4fa031c35a918101c58951d86d561611644ba49cf9e121cb95ff82b2655b7e313349121c2784a3f8098ea0e1749e9f403c90bd74ded17c952cae1b8f353552fb7e47b97b7a4de139c6d5d2403f955c2d1db9f495aa5f2e1155713263ed42d7c96e8dfc37c85b7e89f4fe86c0daf5cfe0db50bc9208b2a179da1035f20b033588f2b2b963815eb118c2419b77fb106f47e7361afefdbe +SHA3-256: f2ba8762e9507a75f6935cf46fdebde3d4d2023312c08fa951334b7e2fa00bd8 +SHA3-512: 66549e37d7287d0c76d39a3a8ac2c5f073cf45bfd8f70936ec1580120184b397584b7b6f5f666839208fca4667207f5538442f545bb2de01ada69268afd3a90a +SHAKE-128: 8ce25ea63e76d706951716b09c58bd5e79f73d6b858c7219f16bee3850ab85573de91de627a0596490ad980edc8053537b35fb46c0d2ace6f517a61181d99c0560e8105d982b1897a396a125e7f239c129344706085c356d29d7984f63a056c01c80df283580262b90a492ff1eabddd503c2c77edb550cb45637a649e4b3a5fb2945a10ffaa840788635df8df6647e5960af7757a15303cf75769c21cee9d49b5feb7c8184ad2833ed849da20626ed938d6f0bc8789caecf6337250eac570bc22ab1ffa67d5954eab9b1657d10546fd30f0265169a0284416fd9d2700de8a0b68485912ba6e30ed09dc5aa049b3fada66de1f04a20a99b0001551a7330e02afb77e627e8855241a43f93314b658d5c00c1b97a1c3560353d439de842ea93d15bb494faf3c820063ccb0ec2edd9d03fad936bc0b4c49f005d0b6d1bc7ec730d74baccc803a4b8fbccaeedbbe2e78c3974be9cd712bafad361d47dd57fa3519b9f02e1cf41a1bed523ac9452bb6d0f0d94d34838df8a70b0e8326a077196ea3eca112ad2d8e0c6318a077f79ae13f7500d985e9e4881989e2b29c6ebffc4b0f52d97ad27f4f378ad1771b34faa74954c3475c6b5dc344ccc9e085c3dc84d33dce337371b34796491226b7ec6ddd0bb8ec010980becd3655ebd4934afce487e6e642b4547aa85ba60241f56e9779a1cdacc4814e43d900189438ab13fbf159619c5 +SHAKE-256: 74f527fb3fb0d239e0a615ea9492886faff24db03ab73a060344c30a8480ddd8a71a1143c30b38387002e973119b7b6118a1c1a1f052ea4c92e6a270f34c04274ff667b3a01632ce688d12d70f61ab01f5511839b8fe8574682077f1593f3e5eb08757b4e245a69748e450b543a1b3ed5aba6781c5acc383081312f74818d5dd796172ab6a22041ccde168158798dab8891db9095e50d78b53469057f37f04b10fe4a0982653211fc7e18ab45119e018150ac51496747d478941b247e661911d71424c51b16647e14dff8b77d7f0b6f4e7cc483a161f84874a142b58f17f6b56e133a353bf9ff4ee7c76baf061a09736a682e715c6f718366df0373083bee6fba709de9ee29432774d871a12b11348e15ab75d6a7c539aae95241cd7484c7eed382df0ec5a89a6304f02ce3fb58150f012c7463d76c0e182bd31e870f78138ee1db9f301a80ad6a0a0966fd712796ff95ff6f5feaedadb44fa3506c238d49e025bd8ffdf842724ba5ccbf1e42c1bf6c3401dbd97cd1325e92e1ab6a678199b9f42b7a6983016b0cf492aa3a82a0a271f69b927382fbeb5f84aebe8fb5f2077a7d81a3949506b306032cdd0b12c59272df703130b0751799cffb1121672afb40ad3b3fdab88b0ab370d37967b382e129b48ad6df7bc0f88b94057b33f8d9c7d61862c05e24f67e29642b38eb2cc702c8de41256fcf761a010e250daf3095691d4 + +Input: 0b747b5621a882829c350b45c0e4462eb367fc185a22faef6ce92ff203a42c253e039fbda10251a52c93afd5679fad1cfa4b084c0655cd4912f9a98e794f520d726858a6ebc0db4cb0cb381952a3fedd4df80c9b6dfc37e2259ae1ba6e2bc124227fd4e8cb49f3404fbdd4490b05013908def280ce882b4d85d48bcafa97b3c41802a7d40e0df359f98f59c6a5129579f3ce5123125a1e7ebe28ae9642ed9f463b034c9adf8d70b25a3ea7696e0435f8b7e7c8c0be0549762e5de6e142751470a161571790874130829def39f4144b40b9043652af8f547914e497fa2806745e11e22ab19bca735b497d5a8856596a37899d6b3c08c7e9cb7e3b65422266bc9741da457180eb1559f737fe50824634280a24e05400a32f4cc1f13b211b21a799d2915682b4ba84cde34cb5cd1531ef05827356a0a92e04c3a4a85f38461815b9d008bf6071aebf952adc0867871a4923032e6565dde803740de02e0edfb0c9b2c8f56ed6b4a8b504e33bc6d84c6f747b4c83a8b60b07fae5b15c53bdfa14d18f8eb335beb0bd28ea0baba23b7903c9f27a83420904a9a2884f74094d2650a9f1d5139fa434b7097767041bcacb74c01f25276b5cbe707e98ff3e29c833ec58a3f3659b7f0eec8d506c6da3432aee90faa5b3e4c8876b385310c01d56a586b89c02a036a3ba8da4bf4af7642e912788166e03cb326482b4ed43dbe2995598 +SHA3-256: e35cb485992a4bcd27f71af043b8bb16c7c1e3a36a4d1160980d51e49b650a15 +SHA3-512: df7918b9094bde46e50778d46c268249517b674252251cc8dc0b6bd27d3d7e4017463f57c78ca57e048361b406321adf020fab26ca2a75a977281a06f4c012b6 +SHAKE-128: c6b9414d60943abb0344b486ea62d6b34dc6b6167882601fb0863566235197c38f414e906f7624a1e7276d83537c50521a033a436578dc21a7f9f30847d75d22cdfffaa04bc867030f4582149bde9c5d14748e7162251628abd5e9c2d406284dcdf03cd0fae773669f27febb86bcfc835193f0f72ad2346387588541c2437174fbf0fb3c268b675b2763545fdee92ee0c9c357e761caea60b1ed77f26781b60e41b47c87e54b22c7b67b8c99fe49005552b85d02b7183988f03d9610fad3e44342dd97efecff9b7ae9850af873af31ad067fe7b80bafc1f0076971247eea57e28b6dfecaf3b15c559305bd06527bbb00eeef112b0c16b9845b80385a5f2656cf3c90acfb01c511fb355ce63ef7aa35fb004d876867c737cb493e6a9e85e2683aebb95621eb19968a6c0d63930b4bf902a6b8e3b6131974b273f2a49c4bb452d453b68915d35c28ea2945d11fbf2f109086da7a1af9e944bea9c182ee4e74d742a31ee7a32406d72345245a1434cf6d9f52f7dbc8dc87d2f84825bbf72dbfcd8dc9c6c30f90b0b1e269350f69dbfb5739d05b965c26d38838de8dd5fa041a81eb3253f3123a3cacf51cc14d5abe46db1492b2bfbc427853d5b4d4fb9f548b17fe5bda87d08ff5fc06b8c817143ce8f0acc7bdb8f9a42523d0c407398c2958a95701d8c29efd8303e93e0500dac15df31ad06375a0f6ddf63436a9b2ddb1c6ddbd +SHAKE-256: 1fc37824fb86b751a3cd26aac6235c445ea5cd0a7c1f7ced0fc8af41a985c830fd6dca5aae34eb3c0bdffcacca58d0a8bfe677c8799854902111a1c4cb86b518acc0013b65cdd146cc4aac42cb3959a17aac1ef686bd4bc62f3ce778df22b89f12476ea5e5f63d8266e16f0f0ca816fe816407a4d742c59801ff91ec5271c6ac3382e3b5c9ec913c0bb796c11e2156edb601a9150e5ec16c5a0ab100efd1cf1e3fd2a9da5ce4c07815575364fd2a361aaa42b7dee815511f45b42777bfc5fc8873d0d47b9b83ff66e4ada9f0531738956a7e00bf956a111655e9085b792dbe76ad34ac93cba7b8fcd7b4f61de067a7c32d1e5528dd71bb0ba804b499584bf99a1b76bb5c5fe4eda28b7d45f9101f82703054ca260f3fcbd9070d71ad55f9e4fc69a624904982e7c937691776978de3878eb2ed65a122ca0dac09b55b8b28276121a9c301c18e1797c0cf7b573ba97eeace1c808fa5c24819cbbcd0fc3d5b8826505d4bb84eb1f820419e088c45f8787539ef0a6ebdcaae8f18d33df73696e50486c6311d9c31f5353a609f1420708376d483c00e1353432bd8b4799fd1d99ca201138a2de110fe54b4647f5b63d77f5c6d4dbf85bba533c296ef17ade3713d5509390d10b6ac860cfdf2b0a6872c9c9a7d08e89e1a5972ea58a6685788e4613a44fa3ae0a52fd3331e4a7bf4103691197ea3537f8e307b9f2f4fb9def21a96f8 + +Input: a98d5c71ed25e354f9df148a2819ec43a5bba6f469040675282c43b91253a23460e7595520449cc8d4cd4da5ae259ca696d0e4164a170fb10344fef80770dcd8894e22eb41af07183a5238d0f7dc30b1c9fcd7b64f91c75f419f3f05b6de81fb57ed9318690ea57e95f95815e9eccf2217b8d89ba81874d671b5b00b0706407b6a127ba6ab142cd9fa83345224e3cfe82105533c87511396e00bb4f6c34a9aa18694a0965b4acb3ee8320b6c8f106979142cb2549e4e2e489cefc7747a7d31285a7570b0edf02c63e3babe9eda1f2f14d11185e19b11dd5950f7e51270ae007e5b059ac03bda1767587882223be12c6af2db6aa7187a2516975cba5134825c315099514c9180625095be91e92d8a1ae9320cc37668f3ddcaea46cfe99414b59ee4d284db7773b21e6e33123225c6039a6707e17c3373a5814c5f2d8f5e34cb4c1a9742fb79ef0ab315c3a6cfa1b60e1c9e346461087410cd84369e141c86ea1cb82520b27d65a9155afded16c8f78bc70be88976323ceaf5ee0e57c54103da79327d2fe767821051cc96e64ffa6f3a5ae7d7ae05b23719301575a68c352f8cdebce533e4ef85b5fc48d34133deb606db8522fbb87310ae0296e77b0d69d1391175ef21733f0b655a554485a1ce98232297ae6e9cdb2905eb4cda87aa949d0dd86b0cd63086078a2451c8baebdefcfa03a0e4c7ce9974020411549d1b7a151f +SHA3-256: 9379fc3379d734aa4bc9462dffe1ef4d6a0990dd2b7f7c962c80de66096c255a +SHA3-512: b07e25de63d2a244b8bdb473a551dd44a6c5e41da72061062a42a44a7278c6aa678b8c127312ac265eaecf354b0a0243144d2de65356a885d29ceddb7951cf89 +SHAKE-128: 77f56c76c4f40d6a51f7b4e3d19b34e358e8a1ffb14cca68f23f1608c95358e1e64581d297a7a062c06db103f547486932c1c43fd95cda0e17168afc0a703993e52d0e0251f09c0a04438c84613bd9806fa8777112fd6d6df5ce97db1c68e58164bf1a764c1a192ee27c97eb313b822d5a5fdc0b8a911208ec051d76395d7756784c23ab7e0e98a21b00123afa74371b9482ad80378419b9214e3b4ba49bc5bddc24aaf175e6c678a86eb42e1f3a12deef554481cdca0b0032dfe55749fbdd09d3eb9f792df57357f2cdc3aa215f01031db33598efcbe183a52e4b4dccaf19e2d79ff220d075af9fd5f16bf73f783754b75110268919041969e7bcf6be326695aa4bd786c94bb22873c3f99061f932710c9b66f9403470a4ee8a4489199162817eb72b5ae3b457c35dc973c6a33aa3e5feba69108e98cbd67270e507f6558d8c973be74ee782d4b0b91714ecb55ffbb7b13dfa60f02fe4ceebb535814449048f4c260e98e8b80e5002b46b3e7c752e43f1616b8fef82b50f894182061e91cf06cfd42ee23bbaffceb8d2ba93acfe242f68dc980e857ac1d71f25d7fd7622fb50e6a8c39f5de9c70f4e2d0cda35a8b4713d4ce7aa96437032c5a2569be19e7ef87405b14ee0107ab71f731a2bc014c2691af1d8f2ccf456505c3d42d6eb1af75168b1cb4db9a35d29c9b2ca7fa5c444bcf8035c816354f6a4aee63e0cae8c7c3f +SHAKE-256: 83158939de50f9c0bef1c8270affb75cb13f23b84742f6e61d36961e9c1596fbb1b2fabeaa7e42db160befeaa74f82374cac494070a355ea2ef4b2c51ccaba715040214530f6ae3403fd3e999bc7bb57d5af3e1fc1248576a055cdd0c57d6774e6100ce42cc94e874896b9acacec248082715229acf1989a8f7cd7bae1e6cf0b1934a6a8a7b867fe269531157468de1005205e6cf7f749fbbc7d7cbc84e938e276828430b2e42a4726b990d63198d93a8f2854100de586e3d0af355f24895e3754cc2b24b80b2be9c8c33f269ba7159e2c85f6dc32c4436343f226a8983926db9c62bf5a45e61ee518564e431d685d139fcc2511bce799af60c7119de67bd7eaa6bfe58bf1e056305ebf10f737b3970bf4a72a12b9d560f0d0989cf981525f8756d297ea7fb40dca79bf695736e2a97cacc943cf8ff1cb1513bd2f585746932011e92d477a7a923ef31da315ad3908058d16d3ba1e7f87914c8625866cc23ce891e01b5066178f5eb19354c5149807c555d7d4839ecdd5b24fbc2aa3a0ad0801aebbeff872d2de5af1bd39e780ecc883fe070a2ef42308fbef4bc031b763cccfe108d3509d1f8b115019586fe711d0f76435d2e560e50542da472cb32423ff71b754e4b993fbc6213adcf729e4d4c6c725c0defd22e666c7ec6a66ece8e555d0f332b640ab5f5146a697c24f46c7dfe4288143c8024813f1e678d30d54630909 diff --git a/crypto/kyber/kyber_test.cc b/crypto/kyber/kyber_test.cc new file mode 100644 index 0000000000..a4ef435fea --- /dev/null +++ b/crypto/kyber/kyber_test.cc @@ -0,0 +1,66 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include + +#include "../test/file_test.h" +#include "../test/test_util.h" +#include "./internal.h" + + +static void KeccakFileTest(FileTest *t) { + std::vector input, sha3_256_expected, sha3_512_expected, + shake128_expected, shake256_expected; + ASSERT_TRUE(t->GetBytes(&input, "Input")); + ASSERT_TRUE(t->GetBytes(&sha3_256_expected, "SHA3-256")); + ASSERT_TRUE(t->GetBytes(&sha3_512_expected, "SHA3-512")); + ASSERT_TRUE(t->GetBytes(&shake128_expected, "SHAKE-128")); + ASSERT_TRUE(t->GetBytes(&shake256_expected, "SHAKE-256")); + + uint8_t sha3_256_digest[32]; + BORINGSSL_keccak(sha3_256_digest, sizeof(sha3_256_digest), input.data(), + input.size(), boringssl_sha3_256); + uint8_t sha3_512_digest[64]; + BORINGSSL_keccak(sha3_512_digest, sizeof(sha3_512_digest), input.data(), + input.size(), boringssl_sha3_512); + uint8_t shake128_output[512]; + BORINGSSL_keccak(shake128_output, sizeof(shake128_output), input.data(), + input.size(), boringssl_shake128); + uint8_t shake256_output[512]; + BORINGSSL_keccak(shake256_output, sizeof(shake256_output), input.data(), + input.size(), boringssl_shake256); + + EXPECT_EQ(Bytes(sha3_256_expected), Bytes(sha3_256_digest)); + EXPECT_EQ(Bytes(sha3_512_expected), Bytes(sha3_512_digest)); + EXPECT_EQ(Bytes(shake128_expected), Bytes(shake128_output)); + EXPECT_EQ(Bytes(shake256_expected), Bytes(shake256_output)); + + struct BORINGSSL_keccak_st ctx; + + BORINGSSL_keccak_init(&ctx, input.data(), input.size(), boringssl_shake128); + for (size_t i = 0; i < sizeof(shake128_output); i++) { + BORINGSSL_keccak_squeeze(&ctx, &shake128_output[i], 1); + } + EXPECT_EQ(Bytes(shake128_expected), Bytes(shake128_output)); + + BORINGSSL_keccak_init(&ctx, input.data(), input.size(), boringssl_shake256); + for (size_t i = 0; i < sizeof(shake256_output); i++) { + BORINGSSL_keccak_squeeze(&ctx, &shake256_output[i], 1); + } + EXPECT_EQ(Bytes(shake256_expected), Bytes(shake256_output)); +} + +TEST(KyberTest, Keccak) { + FileTestGTest("crypto/kyber/keccak_tests.txt", KeccakFileTest); +} diff --git a/sources.cmake b/sources.cmake index 021e9207e4..f220651e70 100644 --- a/sources.cmake +++ b/sources.cmake @@ -66,6 +66,7 @@ set( crypto/fipsmodule/rand/ctrdrbg_vectors.txt crypto/hmac_extra/hmac_tests.txt crypto/hpke/hpke_test_vectors.txt + crypto/kyber/keccak_tests.txt crypto/pkcs8/test/empty_password.p12 crypto/pkcs8/test/no_encryption.p12 crypto/pkcs8/test/nss.p12 From ebd43ef8dd3c062dccf6adf264c5332efda1f4b3 Mon Sep 17 00:00:00 2001 From: Theo Buehler Date: Fri, 17 Feb 2023 10:05:47 +0100 Subject: [PATCH 107/177] Move data from .text to .rodata on x86_64 Various constants and strings identifying the authors are currently misplaced in .text. This change allows using execute-only .text on platforms that enforce it by default, such as OpenBSD. Modify x86_64-xlate.pl to replace .rodata with __DATA,__const for macs. Adapt the nasm/masm path to emit an .rdata segment with alignment of 8. This last change is not strictly needed but makes things explicit. Change-Id: If716b892c1faabd85c6c70bdd75e145304841f83 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57445 Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- crypto/chacha/asm/chacha-x86_64.pl | 2 ++ crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl | 2 +- crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl | 2 ++ crypto/fipsmodule/aes/asm/aesni-x86_64.pl | 2 ++ crypto/fipsmodule/aes/asm/vpaes-x86_64.pl | 2 ++ crypto/fipsmodule/bn/asm/rsaz-avx2.pl | 2 ++ crypto/fipsmodule/bn/asm/x86_64-mont5.pl | 2 ++ crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl | 2 ++ crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl | 2 ++ crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl | 2 ++ crypto/fipsmodule/modes/asm/ghash-x86_64.pl | 2 ++ crypto/fipsmodule/sha/asm/sha1-x86_64.pl | 2 ++ crypto/fipsmodule/sha/asm/sha512-x86_64.pl | 4 ++++ crypto/perlasm/x86_64-xlate.pl | 8 ++++++-- 14 files changed, 33 insertions(+), 3 deletions(-) diff --git a/crypto/chacha/asm/chacha-x86_64.pl b/crypto/chacha/asm/chacha-x86_64.pl index 8f3f4cee7f..31384defb0 100755 --- a/crypto/chacha/asm/chacha-x86_64.pl +++ b/crypto/chacha/asm/chacha-x86_64.pl @@ -78,6 +78,7 @@ .extern OPENSSL_ia32cap_P +.section .rodata .align 64 .Lzero: .long 0,0,0,0 @@ -107,6 +108,7 @@ .Lsixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .asciz "ChaCha20 for x86_64, CRYPTOGAMS by " +.text ___ sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm diff --git a/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl b/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl index aad31ab7a3..f7d419bb85 100644 --- a/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl +++ b/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl @@ -32,7 +32,7 @@ *STDOUT=*OUT; $code.=<<___; -.data +.section .rodata .align 16 one: diff --git a/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl b/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl index b2067c78dc..f0430c3e85 100644 --- a/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl +++ b/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl @@ -42,6 +42,7 @@ chacha20_poly1305_constants: +.section .rodata .align 64 .Lchacha20_consts: .byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' @@ -79,6 +80,7 @@ .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 .byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff +.text ___ my ($oup,$inp,$inl,$adp,$keyp,$itr1,$itr2,$adl)=("%rdi","%rsi","%rbx","%rcx","%r9","%rcx","%r8","%r8"); diff --git a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl index 320760a841..9a90946b84 100644 --- a/crypto/fipsmodule/aes/asm/aesni-x86_64.pl +++ b/crypto/fipsmodule/aes/asm/aesni-x86_64.pl @@ -3778,6 +3778,7 @@ sub aesni_generate8 { } $code.=<<___; +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -3800,6 +3801,7 @@ sub aesni_generate8 { .asciz "AES for Intel AES-NI, CRYPTOGAMS by " .align 64 +.text ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, diff --git a/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl b/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl index f6f67eaa9a..37e93d7a48 100644 --- a/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl +++ b/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl @@ -1288,6 +1288,7 @@ ## ## ######################################################## .type _vpaes_consts,\@object +.section .rodata .align 64 _vpaes_consts: .Lk_inv: # inv, inva @@ -1397,6 +1398,7 @@ .asciz "Vector Permutation AES for x86_64/SSSE3, Mike Hamburg (Stanford University)" .align 64 .size _vpaes_consts,.-_vpaes_consts +.text ___ if ($win64) { diff --git a/crypto/fipsmodule/bn/asm/rsaz-avx2.pl b/crypto/fipsmodule/bn/asm/rsaz-avx2.pl index 65b0062a74..9be0b14058 100755 --- a/crypto/fipsmodule/bn/asm/rsaz-avx2.pl +++ b/crypto/fipsmodule/bn/asm/rsaz-avx2.pl @@ -1738,6 +1738,7 @@ } $code.=<<___; +.section .rodata .align 64 .Land_mask: .quad 0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff @@ -1750,6 +1751,7 @@ .long 2,2,2,2, 3,3,3,3 .long 4,4,4,4, 4,4,4,4 .align 64 +.text ___ if ($win64) { diff --git a/crypto/fipsmodule/bn/asm/x86_64-mont5.pl b/crypto/fipsmodule/bn/asm/x86_64-mont5.pl index 6c596e3f03..67ffc4a21e 100755 --- a/crypto/fipsmodule/bn/asm/x86_64-mont5.pl +++ b/crypto/fipsmodule/bn/asm/x86_64-mont5.pl @@ -3576,11 +3576,13 @@ ___ } $code.=<<___; +.section .rodata .align 64 .Linc: .long 0,0, 1,1 .long 2,2, 2,2 .asciz "Montgomery Multiplication with scatter/gather for x86_64, CRYPTOGAMS by " +.text ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, diff --git a/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl b/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl index c75d7845a7..0701996dfb 100755 --- a/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl +++ b/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl @@ -62,6 +62,7 @@ .extern OPENSSL_ia32cap_P # The polynomial +.section .rodata .align 64 .Lpoly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 @@ -80,6 +81,7 @@ .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 .LordK: .quad 0xccd1c8aaee00bc4f +.text ___ { diff --git a/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl b/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl index e726c048f5..b0b65bf84a 100644 --- a/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl +++ b/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl @@ -1053,6 +1053,7 @@ ___ $code.=<<___; +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -1066,6 +1067,7 @@ .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .asciz "AES-NI GCM module for x86_64, CRYPTOGAMS by " .align 64 +.text ___ }}} else {{{ $code=<<___; # assembler is too old diff --git a/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl b/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl index 0dcf8edc87..00364f0bbe 100644 --- a/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl +++ b/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl @@ -331,6 +331,7 @@ sub process_rows { .seh_endproc .size gcm_ghash_ssse3,.-gcm_ghash_ssse3 +.section .rodata .align 16 # .Lreverse_bytes is a permutation which, if applied with pshufb, reverses the # bytes in an XMM register. @@ -339,6 +340,7 @@ sub process_rows { # .Llow4_mask is an XMM mask which selects the low four bits of each byte. .Llow4_mask: .quad 0x0f0f0f0f0f0f0f0f, 0x0f0f0f0f0f0f0f0f +.text ____ print $code; diff --git a/crypto/fipsmodule/modes/asm/ghash-x86_64.pl b/crypto/fipsmodule/modes/asm/ghash-x86_64.pl index 9dd06d938c..19b18cc618 100644 --- a/crypto/fipsmodule/modes/asm/ghash-x86_64.pl +++ b/crypto/fipsmodule/modes/asm/ghash-x86_64.pl @@ -1297,6 +1297,7 @@ sub reduction_avx { } $code.=<<___; +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -1308,6 +1309,7 @@ sub reduction_avx { .asciz "GHASH for x86_64, CRYPTOGAMS by " .align 64 +.text ___ $code =~ s/\`([^\`]*)\`/eval($1)/gem; diff --git a/crypto/fipsmodule/sha/asm/sha1-x86_64.pl b/crypto/fipsmodule/sha/asm/sha1-x86_64.pl index 5126025352..6ee78872b3 100755 --- a/crypto/fipsmodule/sha/asm/sha1-x86_64.pl +++ b/crypto/fipsmodule/sha/asm/sha1-x86_64.pl @@ -1815,6 +1815,7 @@ () } } $code.=<<___; +.section .rodata .align 64 K_XX_XX: .long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 # K_00_19 @@ -1833,6 +1834,7 @@ () $code.=<<___; .asciz "SHA1 block transform for x86_64, CRYPTOGAMS by " .align 64 +.text ___ # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, diff --git a/crypto/fipsmodule/sha/asm/sha512-x86_64.pl b/crypto/fipsmodule/sha/asm/sha512-x86_64.pl index 2abd06586b..e831ae5c25 100755 --- a/crypto/fipsmodule/sha/asm/sha512-x86_64.pl +++ b/crypto/fipsmodule/sha/asm/sha512-x86_64.pl @@ -404,6 +404,7 @@ () if ($SZ==4) { $code.=<<___; +.section .rodata .align 64 .type $TABLE,\@object $TABLE: @@ -447,9 +448,11 @@ () .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .asciz "SHA256 block transform for x86_64, CRYPTOGAMS by " +.text ___ } else { $code.=<<___; +.section .rodata .align 64 .type $TABLE,\@object $TABLE: @@ -537,6 +540,7 @@ () .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .asciz "SHA512 block transform for x86_64, CRYPTOGAMS by " +.text ___ } diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl index 68f1a695ad..b8802c586a 100755 --- a/crypto/perlasm/x86_64-xlate.pl +++ b/crypto/perlasm/x86_64-xlate.pl @@ -1107,6 +1107,9 @@ $self->{value} = ".p2align\t" . (log($$line)/log(2)); } elsif ($dir eq ".section") { $current_segment=$$line; + if (!$elf && $current_segment eq ".rodata") { + if ($flavour eq "macosx") { $self->{value} = ".section\t__DATA,__const"; } + } if (!$elf && $current_segment eq ".init") { if ($flavour eq "macosx") { $self->{value} = ".mod_init_func"; } elsif ($flavour eq "mingw64") { $self->{value} = ".section\t.ctors"; } @@ -1159,9 +1162,10 @@ /\.section/ && do { my $v=undef; $$line =~ s/([^,]*).*/$1/; $$line = ".CRT\$XCU" if ($$line eq ".init"); + $$line = ".rdata" if ($$line eq ".rodata"); if ($nasm) { $v="section $$line"; - if ($$line=~/\.([px])data/) { + if ($$line=~/\.([prx])data/) { $v.=" rdata align="; $v.=$1 eq "p"? 4 : 8; } elsif ($$line=~/\.CRT\$/i) { @@ -1170,7 +1174,7 @@ } else { $v="$current_segment\tENDS\n" if ($current_segment); $v.="$$line\tSEGMENT"; - if ($$line=~/\.([px])data/) { + if ($$line=~/\.([prx])data/) { $v.=" READONLY"; $v.=" ALIGN(".($1 eq "p" ? 4 : 8).")" if ($masm>=$masmref); } elsif ($$line=~/\.CRT\$/i) { From bffae8a10e7c19930276df2609806be2b92ed1db Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 23 Feb 2023 12:51:29 -0500 Subject: [PATCH 108/177] Print the reason the child stopped in urandom_test Change-Id: I736c7dc17efcaa5c3d8bd5fdee36d2dcb86ae627 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57567 Auto-Submit: David Benjamin Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- crypto/fipsmodule/rand/urandom_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index b1732cf15f..5c592d6dcc 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -436,7 +436,8 @@ static void GetTrace(std::vector *out_trace, unsigned flags, // Parent process int status; ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); - ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP); + ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP) + << "Child was not stopped with SIGSTOP: " << status; // Set options so that: // a) the child process is killed once this process dies. @@ -467,7 +468,8 @@ static void GetTrace(std::vector *out_trace, unsigned flags, } // Otherwise the only valid ptrace event is a system call stop. - ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == (SIGTRAP | 0x80)); + ASSERT_TRUE(WIFSTOPPED(status) && WSTOPSIG(status) == (SIGTRAP | 0x80)) + << "Child was not stopped with a syscall stop: " << status; struct regs regs; ASSERT_TRUE(regs_read(®s, child_pid)); From 8251dd8b34dddf3f13e481b9b59e2430f8b18701 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 23 Feb 2023 14:53:22 -0500 Subject: [PATCH 109/177] Pass the full user_regs_struct to PTRACE_SETREGS At least on the devices we have on CI, PTRACE_SETREGS seems to break things when passing in a slightly smaller structure. I'm guessing the other registers get set to zero, so we SIGILL. Cq-Include-Trybots: luci.boringssl.try:android_aarch64 Change-Id: I09da595dba2b6b70805c9a79c71c797c0f6635c0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57585 Commit-Queue: David Benjamin Reviewed-by: Bob Beck Reviewed-by: Adam Langley --- crypto/fipsmodule/rand/urandom_test.cc | 29 ++++++++++---------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index 5c592d6dcc..2a4e37f635 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -221,8 +221,6 @@ static bool regs_set_ret(int child_pid, int ret); // to fail to run. static bool regs_break_syscall(int child_pid, const struct regs *orig_regs); -#if defined(OPENSSL_X86_64) - struct regs { uintptr_t syscall; uintptr_t args[3]; @@ -230,6 +228,8 @@ struct regs { struct user_regs_struct regs; }; +#if defined(OPENSSL_X86_64) + static bool regs_read(struct regs *out_regs, int child_pid) { if (ptrace(PTRACE_GETREGS, child_pid, nullptr, &out_regs->regs) != 0) { return false; @@ -264,33 +264,26 @@ static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { #elif defined(OPENSSL_AARCH64) -struct regs { - uintptr_t syscall; - uintptr_t args[3]; - uintptr_t ret; - uint64_t regs[9]; -}; - static bool regs_read(struct regs *out_regs, int child_pid) { struct iovec io; - io.iov_base = out_regs->regs; + io.iov_base = &out_regs->regs; io.iov_len = sizeof(out_regs->regs); if (ptrace(PTRACE_GETREGSET, child_pid, NT_PRSTATUS, &io) != 0) { return false; } - out_regs->syscall = out_regs->regs[8]; - out_regs->ret = out_regs->regs[0]; - out_regs->args[0] = out_regs->regs[0]; - out_regs->args[1] = out_regs->regs[1]; - out_regs->args[2] = out_regs->regs[2]; + out_regs->syscall = out_regs->regs.regs[8]; + out_regs->ret = out_regs->regs.regs[0]; + out_regs->args[0] = out_regs->regs.regs[0]; + out_regs->args[1] = out_regs->regs.regs[1]; + out_regs->args[2] = out_regs->regs.regs[2]; return true; } static bool regs_set(int child_pid, const struct regs *new_regs) { struct iovec io; - io.iov_base = (void *) new_regs->regs; + io.iov_base = const_cast(&new_regs->regs); io.iov_len = sizeof(new_regs->regs); return ptrace(PTRACE_SETREGSET, child_pid, NT_PRSTATUS, &io) == 0; } @@ -300,7 +293,7 @@ static bool regs_set_ret(int child_pid, int ret) { if (!regs_read(®s, child_pid)) { return false; } - regs.regs[0] = ret; + regs.regs.regs[0] = ret; return regs_set(child_pid, ®s); } @@ -309,7 +302,7 @@ static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { // the first argument to -1, which suffices to break the syscalls that we care // about here. struct regs copy = *orig_regs; - copy.regs[0] = -1; + copy.regs.regs[0] = -1; return regs_set(child_pid, orig_regs); } From 5eb9343babb6b5aee2e0ac86db56827cd26c1a67 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 23 Feb 2023 15:50:29 -0500 Subject: [PATCH 110/177] Go back to breaking syscalls with the syscall number Setting the first argument to -1 works, but changing the syscall number is more straightforward. It's doable on aarch64 too, if we use a different regset. Cq-Include-Trybots: luci.boringssl.try:android_aarch64 Change-Id: I6c3c2d3dc67c06a44b181f9086cb5c9d343d51bc Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57587 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/fipsmodule/rand/urandom_test.cc | 30 +++++++++++--------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index 2a4e37f635..d593b901e5 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -253,12 +253,9 @@ static bool regs_set_ret(int child_pid, int ret) { } static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { - // Replacing the syscall number with -1 doesn't work on AArch64 thus we set - // the first argument to -1, which suffices to break the syscalls that we care - // about here. - struct user_regs_struct regs; - memcpy(®s, &orig_regs->regs, sizeof(regs)); - regs.rdi = -1; + // Replace the syscall number with -1 to cause the kernel to fail the call. + struct user_regs_struct regs = orig_regs->regs; + regs.orig_rax = -1; return ptrace(PTRACE_SETREGS, child_pid, nullptr, ®s) == 0; } @@ -281,11 +278,13 @@ static bool regs_read(struct regs *out_regs, int child_pid) { return true; } -static bool regs_set(int child_pid, const struct regs *new_regs) { +static bool set_regset(int child_pid, int regset, const void *data, + size_t len) { struct iovec io; - io.iov_base = const_cast(&new_regs->regs); - io.iov_len = sizeof(new_regs->regs); - return ptrace(PTRACE_SETREGSET, child_pid, NT_PRSTATUS, &io) == 0; + io.iov_base = const_cast(data); + io.iov_len = len; + return ptrace(PTRACE_SETREGSET, child_pid, reinterpret_cast(regset), + &io) == 0; } static bool regs_set_ret(int child_pid, int ret) { @@ -294,16 +293,13 @@ static bool regs_set_ret(int child_pid, int ret) { return false; } regs.regs.regs[0] = ret; - return regs_set(child_pid, ®s); + return set_regset(child_pid, NT_PRSTATUS, ®s.regs, sizeof(regs.regs)); } static bool regs_break_syscall(int child_pid, const struct regs *orig_regs) { - // Replacing the syscall number with -1 doesn't work on AArch64 thus we set - // the first argument to -1, which suffices to break the syscalls that we care - // about here. - struct regs copy = *orig_regs; - copy.regs.regs[0] = -1; - return regs_set(child_pid, orig_regs); + // Replace the syscall number with -1 to cause the kernel to fail the call. + int syscall = -1; + return set_regset(child_pid, NT_ARM_SYSTEM_CALL, &syscall, sizeof(syscall)); } #endif From 6ab4f0ae7f2db96d240eb61a5a8b4724e5a09b2f Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 21 Feb 2023 10:54:37 -0500 Subject: [PATCH 111/177] Require getauxval on 32-bit Arm Linux We used to have a tower of fallbacks to support older Androids that were missing getauxval. The comments say getauxval is available in Android API level 20 or higher, but this wasn't right. It's actually API level 18 or higher per the NDK headers and https://developer.android.com/ndk/guides/cpu-features Android API level 18 is Android 4.3, or Jelly Bean MR2. Recent versions of the NDK (starting r24, March 2022) don't even support Jelly Bean, i.e. the minimum API level is 19, and the usage statistics in the latest Android Studio stop at KitKat. As far as I know, nothing needs us to support API levels 17 and below anymore. Update-Note: BoringSSL now requires API level 18 or later. Projects needing to support API level of 17 or below will fail to build due to the use of getauxval. If any such projects exist, please contact BoringSSL maintainers. Change-Id: Iedc4836ffd701428ab6d11253d4ebd5a9121e667 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57506 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/cpu_arm_linux.c | 73 ++---------------------------------- crypto/cpu_arm_linux.h | 28 -------------- crypto/cpu_arm_linux_test.cc | 12 ------ fuzz/arm_cpuinfo.cc | 1 - 4 files changed, 3 insertions(+), 111 deletions(-) diff --git a/crypto/cpu_arm_linux.c b/crypto/cpu_arm_linux.c index 25b50f689d..d13ac215c4 100644 --- a/crypto/cpu_arm_linux.c +++ b/crypto/cpu_arm_linux.c @@ -18,6 +18,7 @@ !defined(OPENSSL_STATIC_ARMCAP) #include #include +#include #include #include @@ -26,13 +27,6 @@ #include "cpu_arm_linux.h" -#define AT_HWCAP 16 -#define AT_HWCAP2 26 - -// |getauxval| is not available on Android until API level 20. Link it as a weak -// symbol and use other methods as fallback. -unsigned long getauxval(unsigned long type) __attribute__((weak)); - static int open_eintr(const char *path, int flags) { int ret; do { @@ -49,21 +43,6 @@ static ssize_t read_eintr(int fd, void *out, size_t len) { return ret; } -// read_full reads exactly |len| bytes from |fd| to |out|. On error or end of -// file, it returns zero. -static int read_full(int fd, void *out, size_t len) { - char *outp = out; - while (len > 0) { - ssize_t ret = read_eintr(fd, outp, len); - if (ret <= 0) { - return 0; - } - outp += ret; - len -= ret; - } - return 1; -} - // read_file opens |path| and reads until end-of-file. On success, it returns // one and sets |*out_ptr| and |*out_len| to a newly-allocated buffer with the // contents. Otherwise, it returns zero. @@ -116,32 +95,6 @@ static int read_file(char **out_ptr, size_t *out_len, const char *path) { return ret; } -// getauxval_proc behaves like |getauxval| but reads from /proc/self/auxv. -static unsigned long getauxval_proc(unsigned long type) { - int fd = open_eintr("/proc/self/auxv", O_RDONLY); - if (fd < 0) { - return 0; - } - - struct { - unsigned long tag; - unsigned long value; - } entry; - - for (;;) { - if (!read_full(fd, &entry, sizeof(entry)) || - (entry.tag == 0 && entry.value == 0)) { - break; - } - if (entry.tag == type) { - close(fd); - return entry.value; - } - } - close(fd); - return 0; -} - extern uint32_t OPENSSL_armcap_P; static int g_needs_hwcap2_workaround; @@ -157,25 +110,8 @@ void OPENSSL_cpuid_setup(void) { cpuinfo.data = cpuinfo_data; cpuinfo.len = cpuinfo_len; - // |getauxval| is not available on Android until API level 20. If it is - // unavailable, read from /proc/self/auxv as a fallback. This is unreadable - // on some versions of Android, so further fall back to /proc/cpuinfo. - // - // See - // https://android.googlesource.com/platform/ndk/+/882ac8f3392858991a0e1af33b4b7387ec856bd2 - // and b/13679666 (Google-internal) for details. - unsigned long hwcap = 0; - if (getauxval != NULL) { - hwcap = getauxval(AT_HWCAP); - } - if (hwcap == 0) { - hwcap = getauxval_proc(AT_HWCAP); - } - if (hwcap == 0) { - hwcap = crypto_get_arm_hwcap_from_cpuinfo(&cpuinfo); - } - // Matching OpenSSL, only report other features if NEON is present. + unsigned long hwcap = getauxval(AT_HWCAP); if (hwcap & HWCAP_NEON) { OPENSSL_armcap_P |= ARMV7_NEON; @@ -184,10 +120,7 @@ void OPENSSL_cpuid_setup(void) { // this is now rare (see Chrome's Net.NeedsHWCAP2Workaround metric), but AES // and PMULL extensions are very useful, so we still carry the workaround // for now. - unsigned long hwcap2 = 0; - if (getauxval != NULL) { - hwcap2 = getauxval(AT_HWCAP2); - } + unsigned long hwcap2 = getauxval(AT_HWCAP2); if (hwcap2 == 0) { hwcap2 = crypto_get_arm_hwcap2_from_cpuinfo(&cpuinfo); g_needs_hwcap2_workaround = hwcap2 != 0; diff --git a/crypto/cpu_arm_linux.h b/crypto/cpu_arm_linux.h index fa03ae3c12..8950997874 100644 --- a/crypto/cpu_arm_linux.h +++ b/crypto/cpu_arm_linux.h @@ -118,13 +118,6 @@ static int extract_cpuinfo_field(STRING_PIECE *out, const STRING_PIECE *in, return 0; } -static int cpuinfo_field_equals(const STRING_PIECE *cpuinfo, const char *field, - const char *value) { - STRING_PIECE extracted; - return extract_cpuinfo_field(&extracted, cpuinfo, field) && - STRING_PIECE_equals(&extracted, value); -} - // has_list_item treats |list| as a space-separated list of items and returns // one if |item| is contained in |list| and zero otherwise. static int has_list_item(const STRING_PIECE *list, const char *item) { @@ -137,27 +130,6 @@ static int has_list_item(const STRING_PIECE *list, const char *item) { return 0; } -// crypto_get_arm_hwcap_from_cpuinfo returns an equivalent ARM |AT_HWCAP| value -// from |cpuinfo|. -static unsigned long crypto_get_arm_hwcap_from_cpuinfo( - const STRING_PIECE *cpuinfo) { - if (cpuinfo_field_equals(cpuinfo, "CPU architecture", "8")) { - // This is a 32-bit ARM binary running on a 64-bit kernel. NEON is always - // available on ARMv8. Linux omits required features, so reading the - // "Features" line does not work. (For simplicity, use strict equality. We - // assume everything running on future ARM architectures will have a - // working |getauxval|.) - return HWCAP_NEON; - } - - STRING_PIECE features; - if (extract_cpuinfo_field(&features, cpuinfo, "Features") && - has_list_item(&features, "neon")) { - return HWCAP_NEON; - } - return 0; -} - // crypto_get_arm_hwcap2_from_cpuinfo returns an equivalent ARM |AT_HWCAP2| // value from |cpuinfo|. static unsigned long crypto_get_arm_hwcap2_from_cpuinfo( diff --git a/crypto/cpu_arm_linux_test.cc b/crypto/cpu_arm_linux_test.cc index eb3db1afda..0b6b02fbe4 100644 --- a/crypto/cpu_arm_linux_test.cc +++ b/crypto/cpu_arm_linux_test.cc @@ -22,7 +22,6 @@ TEST(ARMLinuxTest, CPUInfo) { struct CPUInfoTest { const char *cpuinfo; - unsigned long hwcap; unsigned long hwcap2; } kTests[] = { // Nexus 4 from https://crbug.com/341598#c43 @@ -51,7 +50,6 @@ TEST(ARMLinuxTest, CPUInfo) { "Hardware : QCT APQ8064 MAKO\n" "Revision : 000b\n" "Serial : 0000000000000000\n", - HWCAP_NEON, 0, }, // Pixel 2 (truncated slightly) @@ -95,66 +93,56 @@ TEST(ARMLinuxTest, CPUInfo) { // (Extra processors omitted.) "\n" "Hardware : Qualcomm Technologies, Inc MSM8998\n", - HWCAP_NEON, // CPU architecture 8 implies NEON. HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2, }, // Garbage should be tolerated. { "Blah blah blah this is definitely an ARM CPU", 0, - 0, }, // A hypothetical ARMv8 CPU without crc32 (and thus no trailing space // after the last crypto entry). { "Features : aes pmull sha1 sha2\n" "CPU architecture: 8\n", - HWCAP_NEON, HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2, }, // Various combinations of ARMv8 flags. { "Features : aes sha1 sha2\n" "CPU architecture: 8\n", - HWCAP_NEON, HWCAP2_AES | HWCAP2_SHA1 | HWCAP2_SHA2, }, { "Features : pmull sha2\n" "CPU architecture: 8\n", - HWCAP_NEON, HWCAP2_PMULL | HWCAP2_SHA2, }, { "Features : aes aes aes not_aes aes aes \n" "CPU architecture: 8\n", - HWCAP_NEON, HWCAP2_AES, }, { "Features : \n" "CPU architecture: 8\n", - HWCAP_NEON, 0, }, { "Features : nothing\n" "CPU architecture: 8\n", - HWCAP_NEON, 0, }, // If opening /proc/cpuinfo fails, we process the empty string. { "", 0, - 0, }, }; for (const auto &t : kTests) { SCOPED_TRACE(t.cpuinfo); STRING_PIECE sp = {t.cpuinfo, strlen(t.cpuinfo)}; - EXPECT_EQ(t.hwcap, crypto_get_arm_hwcap_from_cpuinfo(&sp)); EXPECT_EQ(t.hwcap2, crypto_get_arm_hwcap2_from_cpuinfo(&sp)); } } diff --git a/fuzz/arm_cpuinfo.cc b/fuzz/arm_cpuinfo.cc index f62ae7c4a0..840f9f04a3 100644 --- a/fuzz/arm_cpuinfo.cc +++ b/fuzz/arm_cpuinfo.cc @@ -17,7 +17,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { STRING_PIECE sp = {reinterpret_cast(buf), len}; - crypto_get_arm_hwcap_from_cpuinfo(&sp); crypto_get_arm_hwcap2_from_cpuinfo(&sp); return 0; } From 7fa0910a6511895119a4aa3f474920594e734564 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 13:17:18 -0500 Subject: [PATCH 112/177] Create the SSLKeyShare object in TLS 1.2 client ECDHE slightly later We call Accept as a TLS 1.2 client and a TLS 1.3 server. In the latter, we create an SSLKeyShare object, Accept, and immediately destroy it. In the former, we create the SSLKeyShare object a couple steps before actually using it. It's equivalent to create the object just before Accept, so switch to that. This change means that hs->key_shares now only ever contains objects in between Offer and Finish. Or, in KEM terms, it only ever contains KEM private keys. (SSLKeyShare objects are currently a little confused about what kind of state they contain.) Change-Id: Idec62ac298785f784485bc9065f7647034d2a607 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57605 Auto-Submit: David Benjamin Reviewed-by: Adam Langley Commit-Queue: Adam Langley --- ssl/handshake_client.cc | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc index 601aec1cb3..64fd2f2d0d 100644 --- a/ssl/handshake_client.cc +++ b/ssl/handshake_client.cc @@ -1117,7 +1117,6 @@ static enum ssl_hs_wait_t do_read_server_key_exchange(SSL_HANDSHAKE *hs) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); return ssl_hs_error; } - hs->new_session->group_id = group_id; // Ensure the group is consistent with preferences. if (!tls1_check_group_id(hs, group_id)) { @@ -1126,10 +1125,9 @@ static enum ssl_hs_wait_t do_read_server_key_exchange(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - // Initialize ECDH and save the peer public key for later. - hs->key_shares[0] = SSLKeyShare::Create(group_id); - if (!hs->key_shares[0] || - !hs->peer_key.CopyFrom(point)) { + // Save the group and peer public key for later. + hs->new_session->group_id = group_id; + if (!hs->peer_key.CopyFrom(point)) { return ssl_hs_error; } } else if (!(alg_k & SSL_kPSK)) { @@ -1465,15 +1463,16 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { return ssl_hs_error; } } else if (alg_k & SSL_kECDHE) { - // Generate a keypair and serialize the public half. CBB child; if (!CBB_add_u8_length_prefixed(&body, &child)) { return ssl_hs_error; } - // Compute the premaster. + // Generate the premaster secret. + bssl::UniquePtr key_share = + SSLKeyShare::Create(hs->new_session->group_id); uint8_t alert = SSL_AD_DECODE_ERROR; - if (!hs->key_shares[0]->Accept(&child, &pms, &alert, hs->peer_key)) { + if (!key_share || !key_share->Accept(&child, &pms, &alert, hs->peer_key)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return ssl_hs_error; } @@ -1481,9 +1480,7 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - // The key exchange state may now be discarded. - hs->key_shares[0].reset(); - hs->key_shares[1].reset(); + // The peer key can now be discarded. hs->peer_key.Reset(); } else if (alg_k & SSL_kPSK) { // For plain PSK, other_secret is a block of 0s with the same length as From a5dcf35caf6857f08be29586fd41ce8349d9e857 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 15:05:14 -0500 Subject: [PATCH 113/177] Move the ASN.1-based SSLKeyShare serialization to handoff.cc. We've got two layers of serialization. There's the lower-level SerializePrivateKey/DeserializePrivateKey functions that just encode a private key assuming you already know the group, and then there's Serialize/Create which output an INTEGER and OCTET STRING pair. The latter is only used by handoff.cc, so move them there. This trims the SSLKeyShare abstraction slightly. Change-Id: I1c901d7c16b082bfe1b6acd0a1711575e7f95c05 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57625 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- ssl/handoff.cc | 27 +++++++++++++++++++++------ ssl/internal.h | 8 -------- ssl/ssl_key_share.cc | 25 ------------------------- 3 files changed, 21 insertions(+), 39 deletions(-) diff --git a/ssl/handoff.cc b/ssl/handoff.cc index 39f0bacf76..ccb0b5e421 100644 --- a/ssl/handoff.cc +++ b/ssl/handoff.cc @@ -387,9 +387,14 @@ bool SSL_serialize_handback(const SSL *ssl, CBB *out) { !CBB_add_asn1(&seq, &key_share, CBS_ASN1_SEQUENCE)) { return false; } - if (type == handback_after_ecdhe && - !s3->hs->key_shares[0]->Serialize(&key_share)) { - return false; + if (type == handback_after_ecdhe) { + CBB private_key; + if (!CBB_add_asn1_uint64(&key_share, s3->hs->key_shares[0]->GroupID()) || + !CBB_add_asn1(&key_share, &private_key, CBS_ASN1_OCTETSTRING) || + !s3->hs->key_shares[0]->SerializePrivateKey(&private_key) || + !CBB_flush(&key_share)) { + return false; + } } if (type == handback_tls13) { early_data_t early_data; @@ -714,9 +719,19 @@ bool SSL_apply_handback(SSL *ssl, Span handback) { } s3->read_sequence = CRYPTO_load_u64_be(read_sequence); s3->write_sequence = CRYPTO_load_u64_be(write_sequence); - if (type == handback_after_ecdhe && - (hs->key_shares[0] = SSLKeyShare::Create(&key_share)) == nullptr) { - return false; + if (type == handback_after_ecdhe) { + uint64_t group_id; + CBS private_key; + if (!CBS_get_asn1_uint64(&key_share, &group_id) || // + group_id > 0xffff || + !CBS_get_asn1(&key_share, &private_key, CBS_ASN1_OCTETSTRING)) { + return false; + } + hs->key_shares[0] = SSLKeyShare::Create(group_id); + if (!hs->key_shares[0] || + !hs->key_shares[0]->DeserializePrivateKey(&private_key)) { + return false; + } } return true; // Trailing data allowed for extensibility. } diff --git a/ssl/internal.h b/ssl/internal.h index b83d29944b..fac15b6b2b 100644 --- a/ssl/internal.h +++ b/ssl/internal.h @@ -1062,14 +1062,6 @@ class SSLKeyShare { // nullptr on error. static UniquePtr Create(uint16_t group_id); - // Create deserializes an SSLKeyShare instance previously serialized by - // |Serialize|. - static UniquePtr Create(CBS *in); - - // Serializes writes the group ID and private key, in a format that can be - // read by |Create|. - bool Serialize(CBB *out); - // GroupID returns the group ID. virtual uint16_t GroupID() const PURE_VIRTUAL; diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index c6e87a6f37..1f28493c03 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -376,31 +376,6 @@ UniquePtr SSLKeyShare::Create(uint16_t group_id) { } } -UniquePtr SSLKeyShare::Create(CBS *in) { - uint64_t group; - CBS private_key; - if (!CBS_get_asn1_uint64(in, &group) || group > 0xffff || - !CBS_get_asn1(in, &private_key, CBS_ASN1_OCTETSTRING)) { - return nullptr; - } - UniquePtr key_share = Create(static_cast(group)); - if (!key_share || !key_share->DeserializePrivateKey(&private_key)) { - return nullptr; - } - return key_share; -} - -bool SSLKeyShare::Serialize(CBB *out) { - CBB private_key; - if (!CBB_add_asn1_uint64(out, GroupID()) || - !CBB_add_asn1(out, &private_key, CBS_ASN1_OCTETSTRING) || - !SerializePrivateKey(&private_key) || // - !CBB_flush(out)) { - return false; - } - return true; -} - bool SSLKeyShare::Accept(CBB *out_public_key, Array *out_secret, uint8_t *out_alert, Span peer_key) { *out_alert = SSL_AD_INTERNAL_ERROR; From 9cbff81cec055e34d3f6e267d5509d4aad6bed41 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 26 Jan 2023 17:04:04 -0500 Subject: [PATCH 114/177] Simplify ECKeyShare slightly. Since this was written, we've tidied up the EC code a bit: 1. While not quite yet infallible (but we should get there), the output of EC_GROUP_new_by_curve_name no longer needs to be freed. 2. BN_CTX no longer does anything in EC code, so just pass in NULL. We really should build a real ECDH API, but for now just improve our use of the current thing. Change-Id: I44f5429afec06c28372ae70148eb8de263d716f3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57626 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- ssl/ssl_key_share.cc | 67 +++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index 1f28493c03..c604c870cc 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -38,35 +38,28 @@ namespace { class ECKeyShare : public SSLKeyShare { public: - ECKeyShare(int nid, uint16_t group_id) : nid_(nid), group_id_(group_id) {} + ECKeyShare(int nid, uint16_t group_id) + : group_(EC_GROUP_new_by_curve_name(nid)), group_id_(group_id) {} uint16_t GroupID() const override { return group_id_; } bool Offer(CBB *out) override { assert(!private_key_); - // Set up a shared |BN_CTX| for all operations. - UniquePtr bn_ctx(BN_CTX_new()); - if (!bn_ctx) { - return false; - } - BN_CTXScope scope(bn_ctx.get()); - // Generate a private key. - UniquePtr group(EC_GROUP_new_by_curve_name(nid_)); private_key_.reset(BN_new()); - if (!group || !private_key_ || + if (!group_ || !private_key_ || !BN_rand_range_ex(private_key_.get(), 1, - EC_GROUP_get0_order(group.get()))) { + EC_GROUP_get0_order(group_))) { return false; } // Compute the corresponding public key and serialize it. - UniquePtr public_key(EC_POINT_new(group.get())); + UniquePtr public_key(EC_POINT_new(group_)); if (!public_key || - !EC_POINT_mul(group.get(), public_key.get(), private_key_.get(), NULL, - NULL, bn_ctx.get()) || - !EC_POINT_point2cbb(out, group.get(), public_key.get(), - POINT_CONVERSION_UNCOMPRESSED, bn_ctx.get())) { + !EC_POINT_mul(group_, public_key.get(), private_key_.get(), + nullptr, nullptr, /*ctx=*/nullptr) || + !EC_POINT_point2cbb(out, group_, public_key.get(), + POINT_CONVERSION_UNCOMPRESSED, /*ctx=*/nullptr)) { return false; } @@ -75,48 +68,38 @@ class ECKeyShare : public SSLKeyShare { bool Finish(Array *out_secret, uint8_t *out_alert, Span peer_key) override { + assert(group_); assert(private_key_); *out_alert = SSL_AD_INTERNAL_ERROR; - // Set up a shared |BN_CTX| for all operations. - UniquePtr bn_ctx(BN_CTX_new()); - if (!bn_ctx) { - return false; - } - BN_CTXScope scope(bn_ctx.get()); - - UniquePtr group(EC_GROUP_new_by_curve_name(nid_)); - if (!group) { - return false; - } - - UniquePtr peer_point(EC_POINT_new(group.get())); - UniquePtr result(EC_POINT_new(group.get())); - BIGNUM *x = BN_CTX_get(bn_ctx.get()); + UniquePtr peer_point(EC_POINT_new(group_)); + UniquePtr result(EC_POINT_new(group_)); + UniquePtr x(BN_new()); if (!peer_point || !result || !x) { return false; } if (peer_key.empty() || peer_key[0] != POINT_CONVERSION_UNCOMPRESSED || - !EC_POINT_oct2point(group.get(), peer_point.get(), peer_key.data(), - peer_key.size(), bn_ctx.get())) { + !EC_POINT_oct2point(group_, peer_point.get(), peer_key.data(), + peer_key.size(), /*ctx=*/nullptr)) { OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); *out_alert = SSL_AD_DECODE_ERROR; return false; } // Compute the x-coordinate of |peer_key| * |private_key_|. - if (!EC_POINT_mul(group.get(), result.get(), NULL, peer_point.get(), - private_key_.get(), bn_ctx.get()) || - !EC_POINT_get_affine_coordinates_GFp(group.get(), result.get(), x, NULL, - bn_ctx.get())) { + if (!EC_POINT_mul(group_, result.get(), NULL, peer_point.get(), + private_key_.get(), /*ctx=*/nullptr) || + !EC_POINT_get_affine_coordinates_GFp(group_, result.get(), x.get(), + NULL, + /*ctx=*/nullptr)) { return false; } // Encode the x-coordinate left-padded with zeros. Array secret; - if (!secret.Init((EC_GROUP_get_degree(group.get()) + 7) / 8) || - !BN_bn2bin_padded(secret.data(), secret.size(), x)) { + if (!secret.Init((EC_GROUP_get_degree(group_) + 7) / 8) || + !BN_bn2bin_padded(secret.data(), secret.size(), x.get())) { return false; } @@ -125,10 +108,10 @@ class ECKeyShare : public SSLKeyShare { } bool SerializePrivateKey(CBB *out) override { + assert(group_); assert(private_key_); - UniquePtr group(EC_GROUP_new_by_curve_name(nid_)); // Padding is added to avoid leaking the length. - size_t len = BN_num_bytes(EC_GROUP_get0_order(group.get())); + size_t len = BN_num_bytes(EC_GROUP_get0_order(group_)); return BN_bn2cbb_padded(out, len, private_key_.get()); } @@ -140,7 +123,7 @@ class ECKeyShare : public SSLKeyShare { private: UniquePtr private_key_; - int nid_; + const EC_GROUP *const group_ = nullptr; uint16_t group_id_; }; From 55902f24e840e4628c64ef436575e5e5ea51a8fe Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 24 Feb 2023 13:15:57 -0500 Subject: [PATCH 115/177] Switch to CIPD's copy of perl This was added in https://crbug.com/1414198. Extracting it to the same place as before to avoid needing to update the recipe. Change-Id: I02dd8bc2a9c0fc54236e10e13a43e716f1a34247 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57647 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- .gitignore | 1 - util/bot/DEPS | 34 +++++++++++----------------------- util/bot/UPDATING | 6 ------ util/bot/perl-win32.zip.sha1 | 1 - 4 files changed, 11 insertions(+), 31 deletions(-) delete mode 100644 util/bot/perl-win32.zip.sha1 diff --git a/.gitignore b/.gitignore index 243192c08c..a65880d3cb 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,6 @@ util/bot/llvm-build util/bot/nasm-win32.exe util/bot/ninja util/bot/perl-win32 -util/bot/perl-win32.zip util/bot/sde-linux64 util/bot/sde-linux64.tar.xz util/bot/sde-win32 diff --git a/util/bot/DEPS b/util/bot/DEPS index 0bcd2aa9b0..6846d37799 100644 --- a/util/bot/DEPS +++ b/util/bot/DEPS @@ -28,6 +28,8 @@ vars = { 'cmake_version': 'version:2@3.25.2.chromium.6', # infra/3pp/tools/go/linux-amd64 'go_version': 'version:2@1.20', + # infra/3pp/tools/perl/windows-amd64 + 'perl_version': 'version:2@5.32.1.1', # Update the following from # https://chromium.googlesource.com/chromium/src/+/main/DEPS @@ -93,6 +95,15 @@ deps = { 'dep_type': 'cipd', }, + 'boringssl/util/bot/perl-win32': { + 'packages': [{ + 'package': 'infra/3pp/tools/perl/${{platform}}', + 'version': Var('perl_version'), + }], + 'condition': 'host_os == "win"', + 'dep_type': 'cipd', + }, + 'boringssl/util/bot/libFuzzer': { 'url': Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git' +'@' + Var('libfuzzer_revision'), 'condition': 'checkout_fuzzer', @@ -122,29 +133,6 @@ recursedeps = [ ] hooks = [ - { - 'name': 'perl_win32', - 'pattern': '.', - 'condition': 'host_os == "win"', - 'action': [ 'download_from_google_storage', - '--no_resume', - '--platform=win32', - '--no_auth', - '--bucket', 'chromium-tools', - '-s', 'boringssl/util/bot/perl-win32.zip.sha1', - ], - }, - { - 'name': 'perl_win32_extract', - 'pattern': '.', - 'condition': 'host_os == "win"', - 'action': [ 'python3', - 'boringssl/util/bot/extract.py', - '--no-prefix', - 'boringssl/util/bot/perl-win32.zip', - 'boringssl/util/bot/perl-win32/', - ], - }, { 'name': 'nasm_win32', 'pattern': '.', diff --git a/util/bot/UPDATING b/util/bot/UPDATING index 8eaa1cfa84..bbe27c754c 100644 --- a/util/bot/UPDATING +++ b/util/bot/UPDATING @@ -31,12 +31,6 @@ nasm-win32.exe: Update to the appropriate release of NASM, found at The current revision is nasm-2.13.03-win64.zip. -perl-win32.zip: Update to the latest 64-bit prebuilt "Portable" edition of - Strawberry Perl, found at http://strawberryperl.com/releases.html. The - download will be named strawberry-perl-VERSION-64bit-portable.zip. - - The current revision is strawberry-perl-5.26.2.1-64bit-portable.zip. - Finally, update sde-linux64.tar.xz and sde-win32.tar.xz by downloading the latet release from Intel at https://software.intel.com/en-us/articles/intel-software-development-emulator, diff --git a/util/bot/perl-win32.zip.sha1 b/util/bot/perl-win32.zip.sha1 deleted file mode 100644 index ac0c3f00d8..0000000000 --- a/util/bot/perl-win32.zip.sha1 +++ /dev/null @@ -1 +0,0 @@ -10a112b4d5f4efbbba4e45ccbe1fa50943e106c6 \ No newline at end of file From b3c2c756aeec1c4309447f5247f61d435274da4a Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 24 Feb 2023 13:21:54 -0500 Subject: [PATCH 116/177] Pick up a VS 2022 toolchain from Chromium Nothing uses it yet, but this makes it available for any CI builders that set vs_version to 2022. Bug: 569 Change-Id: I7058157182f3e7762a35f8138977f37d56d65094 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57648 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- util/bot/vs_toolchain.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/bot/vs_toolchain.py b/util/bot/vs_toolchain.py index 07c9febedc..9e19e22b36 100644 --- a/util/bot/vs_toolchain.py +++ b/util/bot/vs_toolchain.py @@ -71,6 +71,9 @@ def _GetDesiredVsToolchainHashes(version): # VS 2019 16.61 with 10.0.20348.0 SDK, 10.0.22621.755 version of Debuggers, # with ARM64 libraries and UWP support. return ['0b5ee4d2b1'] + if version == '2022': + # VS 2022 17.4 with 10.0.22621.0 SDK with ARM64 libraries and UWP support. + return ['27370823e7'] raise Exception('Unsupported VS version %s' % version) From f53ca9f6b6b23478cea72f6d78023f47a39d6187 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 24 Feb 2023 09:07:36 -0500 Subject: [PATCH 117/177] Run Go tests as part of run_tests This doesn't run them as part of CI yet, but I'll follow-up with a recipe change to read the same util/go_tests.txt file and run Go tests in there. Bug: 506 Change-Id: Ifd527b1d00ec30896582360132249230fab7e7c0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57645 Commit-Queue: David Benjamin Reviewed-by: Adam Langley --- CMakeLists.txt | 8 ++++++++ util/go_tests.txt | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 util/go_tests.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index d99ce4cf8e..a66a37fa49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -572,6 +572,13 @@ else() add_custom_target(fips_specific_tests_if_any) endif() +# Read util/go_tests.txt into a CMake variable. +file(READ util/go_tests.txt GO_TESTS) +string(REPLACE "\n" ";" GO_TESTS "${GO_TESTS}") +list(REMOVE_ITEM GO_TESTS "") +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + util/go_tests.txt) + add_custom_target( run_tests COMMAND ${GO_EXECUTABLE} run util/all_tests.go -build-dir @@ -579,6 +586,7 @@ add_custom_target( COMMAND cd ssl/test/runner && ${GO_EXECUTABLE} test -shim-path $ ${HANDSHAKER_ARGS} ${RUNNER_ARGS} + COMMAND ${GO_EXECUTABLE} test ${GO_TESTS} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} DEPENDS all_tests bssl_shim handshaker fips_specific_tests_if_any USES_TERMINAL) diff --git a/util/go_tests.txt b/util/go_tests.txt new file mode 100644 index 0000000000..0f43cf6871 --- /dev/null +++ b/util/go_tests.txt @@ -0,0 +1,4 @@ +./ssl/test/runner/hpke +./util/ar +./util/fipstools/acvp/acvptool/testmodulewrapper +./util/fipstools/delocate From 1b666ddc2018611083cc19c84c2768f6156320be Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 11:30:42 -0500 Subject: [PATCH 118/177] Ignore elf.ErrNoSymbols in util/read_symbols.go It seems empty assembly files generate object files without a symbol section at all. Just skip them. Change-Id: I1bf06050dbde793e57faaeb2e40bcc4b6de497a6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57665 Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- util/read_symbols.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/read_symbols.go b/util/read_symbols.go index 96c148ab5a..b407ecb10c 100644 --- a/util/read_symbols.go +++ b/util/read_symbols.go @@ -176,6 +176,9 @@ func listSymbolsELF(contents []byte) ([]string, error) { return nil, err } syms, err := f.Symbols() + if err == elf.ErrNoSymbols { + return nil, nil + } if err != nil { return nil, err } From 8c4ec3b7b0d69649c04778a39eed5cdca338c1c0 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 12:46:12 -0500 Subject: [PATCH 119/177] Replace almost all instances of CMAKE_SOURCE_DIR and CMAKE_BINARY_DIR If another project includes us as a subproject, as gRPC does, CMAKE_SOURCE_DIR points to the top-level source directory, not ours. PROJECT_SOURCE_DIR points to ours. Likewise, CMAKE_BINARY_DIR will point to the top-level one. gRPC doesn't consume this CMake build, but in preparation for eventually unifying the two CMake builds, replace CMAKE_SOURCE_DIR and CMAKE_BINARY_DIR with a combination of CMAKE_CURRENT_{SOURCE,BINARY}_DIR and PROJECT_SOURCE_DIR. There's one more CMAKE_SOURCE_DIR which controls some default install directory. I've left that one alone for now as I'm not sure what to do with it. Probably the answer is to, like in gRPC, disable the install target by default when we're not the top-level source directory. Bug: 542 Change-Id: Iea26bbef8a4637671fd0e7476101512e871e7e18 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57686 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- CMakeLists.txt | 16 ++++++++-------- cmake/go.cmake | 6 +++--- crypto/CMakeLists.txt | 2 +- rust/CMakeLists.txt | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a66a37fa49..23154a2c67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -475,7 +475,7 @@ if(USE_CUSTOM_LIBCXX) CXX_STANDARD_REQUIRED TRUE ) # libc++abi depends on libc++ internal headers. - set_property(TARGET libcxx libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/util/bot/libcxx/src") + set_property(TARGET libcxx libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/util/bot/libcxx/src") target_link_libraries(libcxx libcxxabi) endif() @@ -551,16 +551,16 @@ endif() if(FIPS) add_custom_target( acvp_tests - COMMAND ${GO_EXECUTABLE} build -o ${CMAKE_BINARY_DIR}/acvptool + COMMAND ${GO_EXECUTABLE} build -o ${CMAKE_CURRENT_BINARY_DIR}/acvptool boringssl.googlesource.com/boringssl/util/fipstools/acvp/acvptool - COMMAND ${GO_EXECUTABLE} build -o ${CMAKE_BINARY_DIR}/testmodulewrapper + COMMAND ${GO_EXECUTABLE} build -o ${CMAKE_CURRENT_BINARY_DIR}/testmodulewrapper boringssl.googlesource.com/boringssl/util/fipstools/acvp/acvptool/testmodulewrapper COMMAND cd util/fipstools/acvp/acvptool/test && ${GO_EXECUTABLE} run check_expected.go - -tool ${CMAKE_BINARY_DIR}/acvptool - -module-wrappers modulewrapper:$,testmodulewrapper:${CMAKE_BINARY_DIR}/testmodulewrapper + -tool ${CMAKE_CURRENT_BINARY_DIR}/acvptool + -module-wrappers modulewrapper:$,testmodulewrapper:${CMAKE_CURRENT_BINARY_DIR}/testmodulewrapper -tests tests.json - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS modulewrapper USES_TERMINAL) @@ -582,12 +582,12 @@ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS add_custom_target( run_tests COMMAND ${GO_EXECUTABLE} run util/all_tests.go -build-dir - ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR} COMMAND cd ssl/test/runner && ${GO_EXECUTABLE} test -shim-path $ ${HANDSHAKER_ARGS} ${RUNNER_ARGS} COMMAND ${GO_EXECUTABLE} test ${GO_TESTS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS all_tests bssl_shim handshaker fips_specific_tests_if_any USES_TERMINAL) diff --git a/cmake/go.cmake b/cmake/go.cmake index 6aca79a89e..61a01f519d 100644 --- a/cmake/go.cmake +++ b/cmake/go.cmake @@ -13,7 +13,7 @@ if(NOT GO_EXECUTABLE) endif() function(go_executable dest package) - set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go") + set(godeps "${PROJECT_SOURCE_DIR}/util/godeps.go") if(NOT CMAKE_GENERATOR STREQUAL "Ninja") # The DEPFILE parameter to add_custom_command only works with Ninja. Query # the sources at configure time. Additionally, everything depends on go.mod. @@ -30,7 +30,7 @@ function(go_executable dest package) COMMAND ${GO_EXECUTABLE} build -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${sources} ${CMAKE_SOURCE_DIR}/go.mod) + DEPENDS ${sources} ${PROJECT_SOURCE_DIR}/go.mod) else() # Ninja expects the target in the depfile to match the output. This is a # relative path from the build directory. @@ -46,7 +46,7 @@ function(go_executable dest package) COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile -target ${target} -pkg ${package} -out ${depfile} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${godeps} ${CMAKE_SOURCE_DIR}/go.mod + DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod DEPFILE ${depfile}) endif() endfunction() diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index f917b79ebd..8ece558a79 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -296,7 +296,7 @@ if(OPENSSL_NASM) target_sources(crypto PRIVATE ${CRYPTO_SOURCES_NASM}) endif() target_include_directories(crypto PUBLIC - $ + $ $ ) install_if_enabled(TARGETS crypto EXPORT OpenSSLTargets ${INSTALL_DESTINATION_DEFAULT}) diff --git a/rust/CMakeLists.txt b/rust/CMakeLists.txt index 019976bcc1..422905f327 100644 --- a/rust/CMakeLists.txt +++ b/rust/CMakeLists.txt @@ -3,7 +3,7 @@ add_library(rust_wrapper STATIC rust_wrapper.c) target_link_libraries(rust_wrapper crypto) # Generate architecture-specific wrappers. -set(WRAPPER_TARGET ${CMAKE_BINARY_DIR}/rust/src/wrapper_${RUST_BINDINGS}.rs) +set(WRAPPER_TARGET ${CMAKE_CURRENT_BINARY_DIR}/src/wrapper_${RUST_BINDINGS}.rs) set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h" -o ${WRAPPER_TARGET} --no-derive-default From 92859cc7484ac178e77825ccb86f95edcf0b6c49 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 12:37:19 -0500 Subject: [PATCH 120/177] Fix the generated CMake build This fixes two issues introduced in 0e68520eb27b1f37038e9d0772cfee1d015b50c3. First, libssl never had a dependency on libcrypto, so the include directory did not get passed along. Second, although this build (unlike the other CMake build) doesn't define an install target, gRPC includes it and then pulls it into its own install target. That then runs afoul of CMake's check against include directories in install targets. To avoid this, condition the src/include directory on $ but omit a corresponding $. Since we're not the ones providing an install target, we don't actually know the value to use. Per [0], using the generator expression means we need to manually make it absolute ourselves. [0] https://cmake.org/cmake/help/latest/command/target_include_directories.html Change-Id: I2a25cc8382116c5957d94f65641220559b7af87d Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57685 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- util/generate_build_files.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/util/generate_build_files.py b/util/generate_build_files.py index aec36bed82..386910b15b 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py @@ -489,7 +489,7 @@ def __init__(self): ''' - def PrintLibrary(self, out, name, files): + def PrintLibrary(self, out, name, files, libs=[]): out.write('add_library(\n') out.write(' %s\n\n' % name) @@ -497,6 +497,8 @@ def PrintLibrary(self, out, name, files): out.write(' %s\n' % PathOf(f)) out.write(')\n\n') + if libs: + out.write('target_link_libraries(%s %s)\n\n' % (name, ' '.join(libs))) def PrintExe(self, out, name, files, libs): out.write('add_executable(\n') @@ -541,8 +543,8 @@ def WriteFiles(self, files, asm_outputs): self.PrintLibrary(cmake, 'crypto', files['crypto'] + ['${CRYPTO_SOURCES_ASM_USED}']) - cmake.write('target_include_directories(crypto PUBLIC src/include)\n') - self.PrintLibrary(cmake, 'ssl', files['ssl']) + cmake.write('target_include_directories(crypto PUBLIC $)\n\n') + self.PrintLibrary(cmake, 'ssl', files['ssl'], ['crypto']) self.PrintExe(cmake, 'bssl', files['tool'], ['ssl', 'crypto']) cmake.write( From 3c6085b6ae982a80633bf5369c274036702c6848 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 16:32:32 -0500 Subject: [PATCH 121/177] Workaround yet more NULL + 0 language bugs No new tests because they're actually caught by our own tests. I just forgot to put UBSan on CI! Will fix this shortly. For BLAKE2, fix this by checking for zero. For c2i_ASN1_INTEGER, rewrite it with CBS, which has the side effect of avoiding this. (It's effectively maintaining in->data + start as a temporary, rather than start itself.) Bug: fuchsia:46910 Change-Id: I9366f1ba4fd0b0140d64c56e0534d7b060ab90e5 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57687 Commit-Queue: David Benjamin Auto-Submit: David Benjamin Reviewed-by: Adam Langley --- crypto/asn1/a_int.c | 26 ++++++++++++++------------ crypto/blake2/blake2.c | 6 +++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/crypto/asn1/a_int.c b/crypto/asn1/a_int.c index 78d1f09e91..27845c0be6 100644 --- a/crypto/asn1/a_int.c +++ b/crypto/asn1/a_int.c @@ -122,14 +122,17 @@ int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { // |ASN1_INTEGER|s should be represented minimally, but it is possible to // construct invalid ones. Skip leading zeros so this does not produce an // invalid encoding or break invariants. - int start = 0; - while (start < in->length && in->data[start] == 0) { - start++; + CBS cbs; + CBS_init(&cbs, in->data, in->length); + while (CBS_len(&cbs) > 0 && CBS_data(&cbs)[0] == 0) { + CBS_skip(&cbs, 1); } int is_negative = (in->type & V_ASN1_NEG) != 0; - int pad; - if (start >= in->length) { + size_t pad; + CBS copy = cbs; + uint8_t msb; + if (!CBS_get_u8(©, &msb)) { // Zero is represented as a single byte. is_negative = 0; pad = 1; @@ -138,20 +141,19 @@ int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { // through 0x00...01 and need an extra byte to be negative. // 0x01...00 through 0x80...00 have a two's complement of 0xfe...ff // through 0x80...00 and can be negated as-is. - pad = in->data[start] > 0x80 || - (in->data[start] == 0x80 && - !is_all_zeros(in->data + start + 1, in->length - start - 1)); + pad = msb > 0x80 || + (msb == 0x80 && !is_all_zeros(CBS_data(©), CBS_len(©))); } else { // If the high bit is set, the signed representation needs an extra // byte to be positive. - pad = (in->data[start] & 0x80) != 0; + pad = (msb & 0x80) != 0; } - if (in->length - start > INT_MAX - pad) { + if (CBS_len(&cbs) > INT_MAX - pad) { OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW); return 0; } - int len = pad + in->length - start; + int len = (int)(pad + CBS_len(&cbs)); assert(len > 0); if (outp == NULL) { return len; @@ -160,7 +162,7 @@ int i2c_ASN1_INTEGER(const ASN1_INTEGER *in, unsigned char **outp) { if (pad) { (*outp)[0] = 0; } - OPENSSL_memcpy(*outp + pad, in->data + start, in->length - start); + OPENSSL_memcpy(*outp + pad, CBS_data(&cbs), CBS_len(&cbs)); if (is_negative) { negate_twos_complement(*outp, len); assert((*outp)[0] >= 0x80); diff --git a/crypto/blake2/blake2.c b/crypto/blake2/blake2.c index 5c6b17edfe..848ed4fa21 100644 --- a/crypto/blake2/blake2.c +++ b/crypto/blake2/blake2.c @@ -105,8 +105,12 @@ void BLAKE2B256_Init(BLAKE2B_CTX *b2b) { } void BLAKE2B256_Update(BLAKE2B_CTX *b2b, const void *in_data, size_t len) { - const uint8_t *data = (const uint8_t *)in_data; + if (len == 0) { + // Work around a C language bug. See https://crbug.com/1019588. + return; + } + const uint8_t *data = in_data; size_t todo = sizeof(b2b->block.bytes) - b2b->block_used; if (todo > len) { todo = len; From e3a5face899e16183f1d207d7327baac57454935 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 16:36:24 -0500 Subject: [PATCH 122/177] Fix ninja run_tests https://boringssl-review.googlesource.com/c/boringssl/+/57645 wasn't quite right. The cd to run ssl/test/runner affects the subsequent commands. Fix this by running the Go tests first. They're very fast compared to the others anyway. Change-Id: Id5ea54a9787173eb3ed80e9db2c9ecfe064a93b0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57688 Auto-Submit: David Benjamin Commit-Queue: Bob Beck Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23154a2c67..a1fb153943 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -581,12 +581,12 @@ set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS add_custom_target( run_tests + COMMAND ${GO_EXECUTABLE} test ${GO_TESTS} COMMAND ${GO_EXECUTABLE} run util/all_tests.go -build-dir ${CMAKE_CURRENT_BINARY_DIR} COMMAND cd ssl/test/runner && ${GO_EXECUTABLE} test -shim-path $ ${HANDSHAKER_ARGS} ${RUNNER_ARGS} - COMMAND ${GO_EXECUTABLE} test ${GO_TESTS} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS all_tests bssl_shim handshaker fips_specific_tests_if_any USES_TERMINAL) From f88b7c83979d128fa83eb5f9102be56cc4bec33c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 27 Feb 2023 15:28:30 -0500 Subject: [PATCH 123/177] Use the common location for CMake in the bots Follow-up to https://chromium-review.googlesource.com/c/chromium/tools/build/+/4296194/ But mostly I've since added a lot more configurations to CI and want to make sure I haven't broken anything. Change-Id: I627711356004bf2244bd729b6055e9e0e619724e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57691 Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- .gitignore | 4 +--- util/bot/DEPS | 25 +------------------------ 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index a65880d3cb..68dca6cf28 100644 --- a/.gitignore +++ b/.gitignore @@ -12,9 +12,7 @@ rust/target util/bot/android_ndk util/bot/android_sdk/public -util/bot/cmake-linux64 -util/bot/cmake-mac -util/bot/cmake-win32 +util/bot/cmake util/bot/golang util/bot/libFuzzer util/bot/libcxx diff --git a/util/bot/DEPS b/util/bot/DEPS index 6846d37799..46d86e3cc0 100644 --- a/util/bot/DEPS +++ b/util/bot/DEPS @@ -56,34 +56,11 @@ deps = { 'dep_type': 'cipd', }, - # TODO(davidben): Merge the three CMake directories. Now that we use CIPD, - # which supports a ${{platform}} marker, there is nothing platform-specific - # about this anymore. However, the recipe still expects CMake to be found at - # these directories, so this needs to be coordinated with a change there. - 'boringssl/util/bot/cmake-linux64': { + 'boringssl/util/bot/cmake': { 'packages': [{ 'package': 'infra/3pp/tools/cmake/${{platform}}', 'version': Var('cmake_version'), }], - 'condition': 'host_os == "linux"', - 'dep_type': 'cipd', - }, - - 'boringssl/util/bot/cmake-mac': { - 'packages': [{ - 'package': 'infra/3pp/tools/cmake/${{platform}}', - 'version': Var('cmake_version'), - }], - 'condition': 'host_os == "mac"', - 'dep_type': 'cipd', - }, - - 'boringssl/util/bot/cmake-win32': { - 'packages': [{ - 'package': 'infra/3pp/tools/cmake/${{platform}}', - 'version': Var('cmake_version'), - }], - 'condition': 'host_os == "win"', 'dep_type': 'cipd', }, From 028bae7ddc67b6061d80c17b0be4e2f60d94731b Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Mon, 27 Feb 2023 21:09:08 +0000 Subject: [PATCH 124/177] Define a NID for P-384 + Kyber768. We do not expect to support this combination, but other consumers of BoringSSL may choose to. Change-Id: Ifdafa6a0032af078343bb9ecd80eea89eee582be Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57705 Auto-Submit: Adam Langley Reviewed-by: David Benjamin Commit-Queue: David Benjamin --- crypto/obj/obj_dat.h | 5 ++++- crypto/obj/obj_mac.num | 1 + crypto/obj/objects.txt | 1 + include/openssl/nid.h | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/crypto/obj/obj_dat.h b/crypto/obj/obj_dat.h index 17e384e655..d879233abf 100644 --- a/crypto/obj/obj_dat.h +++ b/crypto/obj/obj_dat.h @@ -57,7 +57,7 @@ /* This file is generated by crypto/obj/objects.go. */ -#define NUM_NID 966 +#define NUM_NID 967 static const uint8_t kObjectData[] = { /* NID_rsadsi */ @@ -8784,6 +8784,7 @@ static const ASN1_OBJECT kObjects[NUM_NID] = { {"HKDF", "hkdf", NID_hkdf, 0, NULL, 0}, {"X25519Kyber768", "X25519Kyber768", NID_X25519Kyber768, 0, NULL, 0}, {"P256Kyber768", "P256Kyber768", NID_P256Kyber768, 0, NULL, 0}, + {"P384Kyber768", "P384Kyber768", NID_P384Kyber768, 0, NULL, 0}, }; static const uint16_t kNIDsInShortNameOrder[] = { @@ -8918,6 +8919,7 @@ static const uint16_t kNIDsInShortNameOrder[] = { 749 /* Oakley-EC2N-3 */, 750 /* Oakley-EC2N-4 */, 965 /* P256Kyber768 */, + 966 /* P384Kyber768 */, 9 /* PBE-MD2-DES */, 168 /* PBE-MD2-RC2-64 */, 10 /* PBE-MD5-DES */, @@ -9833,6 +9835,7 @@ static const uint16_t kNIDsInLongNameOrder[] = { 371 /* OCSP Service Locator */, 180 /* OCSP Signing */, 965 /* P256Kyber768 */, + 966 /* P384Kyber768 */, 161 /* PBES2 */, 69 /* PBKDF2 */, 162 /* PBMAC1 */, diff --git a/crypto/obj/obj_mac.num b/crypto/obj/obj_mac.num index 03ef9582f4..c0473bca32 100644 --- a/crypto/obj/obj_mac.num +++ b/crypto/obj/obj_mac.num @@ -954,3 +954,4 @@ sha512_256 962 hkdf 963 X25519Kyber768 964 P256Kyber768 965 +P384Kyber768 966 diff --git a/crypto/obj/objects.txt b/crypto/obj/objects.txt index 814ca83e9b..11151f920c 100644 --- a/crypto/obj/objects.txt +++ b/crypto/obj/objects.txt @@ -1336,6 +1336,7 @@ secg-scheme 14 3 : dhSinglePass-cofactorDH-sha512kdf-scheme : CECPQ2 : X25519Kyber768 : P256Kyber768 + : P384Kyber768 # See RFC 8410. 1 3 101 110 : X25519 diff --git a/include/openssl/nid.h b/include/openssl/nid.h index 5f344dc73c..cf5691d71d 100644 --- a/include/openssl/nid.h +++ b/include/openssl/nid.h @@ -4261,6 +4261,9 @@ extern "C" { #define SN_P256Kyber768 "P256Kyber768" #define NID_P256Kyber768 965 +#define SN_P384Kyber768 "P384Kyber768" +#define NID_P384Kyber768 966 + #if defined(__cplusplus) } /* extern C */ From 08b1f38577b6da8533179ffdb4a42b5afc36dc27 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 28 Feb 2023 17:22:23 -0500 Subject: [PATCH 125/177] Use KEM terminology in TLS ECDHE and key_share abstractions TLS 1.2 ECDHE and TLS 1.3 key shares were originally designed around Diffie-Hellman-like primitives and use language based on that. Post-quantum replacements do not look like Diffie-Hellman, where each part exchanges a public key, but schemes that work differently can still slot in without protocol changes. We previously came up with our own Offer/Accept/Finish abstraction for early post-quantum experiments, but the NIST constructions are all expressed as KEMs: First, the recipient generates a keypair and sends the public key. Then the sender encapsulates a symmetric secret and sends the ciphertext. Finally, the recipient decapsulates the ciphertext to get the secret. Align our C++ and Go abstractions to this terminology. The functions are now called Generate/Encap/Decap, and the output of Encap is called "ciphertext", which seems to align with what most folks use. (RFC 9180 uses "enc" for "encapsulated key", but they staple a KEM to an AEAD, so "ciphertext" would be ambiguous.) Where variable names refer to parts of the protocol, rather than the the underlying KEM-like construction, I've kept variable names matching the protocol mechanism, so we still talk about "curves" and "key shares", but, when using the post-quantum replacements, the terminology is no longer quite accurate. I've also not yet renamed SSLKeyShare yet, though the name is now inaccurate. Also ideally we'd touch that up so the stateful object is just a KEM private key, for SSLKEMKey. Though at that point, we maybe should just add EVP_KEM and EVP_KEM_KEY APIs to libcrypto. Change-Id: Icbcc1840c5d2dfad210ef4caad2a7c4bf8146553 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57726 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- ssl/extensions.cc | 22 ++--- ssl/handoff.cc | 14 +-- ssl/handshake_client.cc | 6 +- ssl/handshake_server.cc | 10 +- ssl/internal.h | 57 ++++++------ ssl/ssl_key_share.cc | 91 +++++++++--------- ssl/test/runner/handshake_client.go | 20 ++-- ssl/test/runner/handshake_server.go | 14 +-- ssl/test/runner/key_agreement.go | 137 ++++++++++++++-------------- ssl/tls13_server.cc | 16 ++-- 10 files changed, 199 insertions(+), 188 deletions(-) diff --git a/ssl/extensions.cc b/ssl/extensions.cc index 0c54c93445..ba92360355 100644 --- a/ssl/extensions.cc +++ b/ssl/extensions.cc @@ -2322,7 +2322,7 @@ bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { if (!hs->key_shares[0] || // !CBB_add_u16(cbb.get(), group_id) || !CBB_add_u16_length_prefixed(cbb.get(), &key_exchange) || - !hs->key_shares[0]->Offer(&key_exchange)) { + !hs->key_shares[0]->Generate(&key_exchange)) { return false; } @@ -2331,7 +2331,7 @@ bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { if (!hs->key_shares[1] || // !CBB_add_u16(cbb.get(), second_group_id) || !CBB_add_u16_length_prefixed(cbb.get(), &key_exchange) || - !hs->key_shares[1]->Offer(&key_exchange)) { + !hs->key_shares[1]->Generate(&key_exchange)) { return false; } } @@ -2363,10 +2363,10 @@ static bool ext_key_share_add_clienthello(const SSL_HANDSHAKE *hs, CBB *out, bool ssl_ext_key_share_parse_serverhello(SSL_HANDSHAKE *hs, Array *out_secret, uint8_t *out_alert, CBS *contents) { - CBS peer_key; + CBS ciphertext; uint16_t group_id; if (!CBS_get_u16(contents, &group_id) || - !CBS_get_u16_length_prefixed(contents, &peer_key) || + !CBS_get_u16_length_prefixed(contents, &ciphertext) || CBS_len(contents) != 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); *out_alert = SSL_AD_DECODE_ERROR; @@ -2383,7 +2383,7 @@ bool ssl_ext_key_share_parse_serverhello(SSL_HANDSHAKE *hs, key_share = hs->key_shares[1].get(); } - if (!key_share->Finish(out_secret, out_alert, peer_key)) { + if (!key_share->Decap(out_secret, out_alert, ciphertext)) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } @@ -2448,13 +2448,13 @@ bool ssl_ext_key_share_parse_clienthello(SSL_HANDSHAKE *hs, bool *out_found, } bool ssl_ext_key_share_add_serverhello(SSL_HANDSHAKE *hs, CBB *out) { - CBB kse_bytes, public_key; + CBB entry, ciphertext; if (!CBB_add_u16(out, TLSEXT_TYPE_key_share) || - !CBB_add_u16_length_prefixed(out, &kse_bytes) || - !CBB_add_u16(&kse_bytes, hs->new_session->group_id) || - !CBB_add_u16_length_prefixed(&kse_bytes, &public_key) || - !CBB_add_bytes(&public_key, hs->ecdh_public_key.data(), - hs->ecdh_public_key.size()) || + !CBB_add_u16_length_prefixed(out, &entry) || + !CBB_add_u16(&entry, hs->new_session->group_id) || + !CBB_add_u16_length_prefixed(&entry, &ciphertext) || + !CBB_add_bytes(&ciphertext, hs->key_share_ciphertext.data(), + hs->key_share_ciphertext.size()) || !CBB_flush(out)) { return false; } diff --git a/ssl/handoff.cc b/ssl/handoff.cc index ccb0b5e421..6e5cc2da14 100644 --- a/ssl/handoff.cc +++ b/ssl/handoff.cc @@ -824,7 +824,7 @@ int SSL_request_handshake_hints(SSL *ssl, const uint8_t *client_hello, // // KeyShareHint ::= SEQUENCE { // groupId INTEGER, -// publicKey OCTET STRING, +// ciphertext OCTET STRING, // secret OCTET STRING, // } // @@ -886,12 +886,12 @@ int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out) { } } - if (hints->key_share_group_id != 0 && !hints->key_share_public_key.empty() && + if (hints->key_share_group_id != 0 && !hints->key_share_ciphertext.empty() && !hints->key_share_secret.empty()) { if (!CBB_add_asn1(&seq, &child, kKeyShareHintTag) || !CBB_add_asn1_uint64(&child, hints->key_share_group_id) || - !CBB_add_asn1_octet_string(&child, hints->key_share_public_key.data(), - hints->key_share_public_key.size()) || + !CBB_add_asn1_octet_string(&child, hints->key_share_ciphertext.data(), + hints->key_share_ciphertext.size()) || !CBB_add_asn1_octet_string(&child, hints->key_share_secret.data(), hints->key_share_secret.size())) { return 0; @@ -1040,11 +1040,11 @@ int SSL_set_handshake_hints(SSL *ssl, const uint8_t *hints, size_t hints_len) { if (has_key_share) { uint64_t group_id; - CBS public_key, secret; + CBS ciphertext, secret; if (!CBS_get_asn1_uint64(&key_share, &group_id) || // group_id == 0 || group_id > 0xffff || - !CBS_get_asn1(&key_share, &public_key, CBS_ASN1_OCTETSTRING) || - !hints_obj->key_share_public_key.CopyFrom(public_key) || + !CBS_get_asn1(&key_share, &ciphertext, CBS_ASN1_OCTETSTRING) || + !hints_obj->key_share_ciphertext.CopyFrom(ciphertext) || !CBS_get_asn1(&key_share, &secret, CBS_ASN1_OCTETSTRING) || !hints_obj->key_share_secret.CopyFrom(secret)) { OPENSSL_PUT_ERROR(SSL, SSL_R_COULD_NOT_PARSE_HINTS); diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc index 64fd2f2d0d..e7dca1bebc 100644 --- a/ssl/handshake_client.cc +++ b/ssl/handshake_client.cc @@ -1468,11 +1468,11 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - // Generate the premaster secret. - bssl::UniquePtr key_share = + // Generate a premaster secret and encapsulate it. + bssl::UniquePtr kem = SSLKeyShare::Create(hs->new_session->group_id); uint8_t alert = SSL_AD_DECODE_ERROR; - if (!key_share || !key_share->Accept(&child, &pms, &alert, hs->peer_key)) { + if (!kem || !kem->Encap(&child, &pms, &alert, hs->peer_key)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return ssl_hs_error; } diff --git a/ssl/handshake_server.cc b/ssl/handshake_server.cc index 70fe9839e3..e50a690213 100644 --- a/ssl/handshake_server.cc +++ b/ssl/handshake_server.cc @@ -1146,7 +1146,7 @@ static enum ssl_hs_wait_t do_send_server_certificate(SSL_HANDSHAKE *hs) { } } else { // Generate a key, and emit the public half. - if (!hs->key_shares[0]->Offer(&child)) { + if (!hs->key_shares[0]->Generate(&child)) { return ssl_hs_error; } // If generating hints, save the ECDHE key. @@ -1490,17 +1490,17 @@ static enum ssl_hs_wait_t do_read_client_key_exchange(SSL_HANDSHAKE *hs) { } } else if (alg_k & SSL_kECDHE) { // Parse the ClientKeyExchange. - CBS peer_key; - if (!CBS_get_u8_length_prefixed(&client_key_exchange, &peer_key) || + CBS ciphertext; + if (!CBS_get_u8_length_prefixed(&client_key_exchange, &ciphertext) || CBS_len(&client_key_exchange) != 0) { OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); return ssl_hs_error; } - // Compute the premaster. + // Decapsulate the premaster secret. uint8_t alert = SSL_AD_DECODE_ERROR; - if (!hs->key_shares[0]->Finish(&premaster_secret, &alert, peer_key)) { + if (!hs->key_shares[0]->Decap(&premaster_secret, &alert, ciphertext)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return ssl_hs_error; } diff --git a/ssl/internal.h b/ssl/internal.h index fac15b6b2b..e71dd0c08b 100644 --- a/ssl/internal.h +++ b/ssl/internal.h @@ -1051,7 +1051,15 @@ bool ssl_public_key_verify(SSL *ssl, Span signature, // Key shares. -// SSLKeyShare abstracts over Diffie-Hellman-like key exchanges. +// SSLKeyShare abstracts over KEM-like constructions, for use with TLS 1.2 ECDHE +// cipher suites and the TLS 1.3 key_share extension. +// +// TODO(davidben): This class is named SSLKeyShare after the TLS 1.3 key_share +// extension, but it really implements a KEM abstraction. Additionally, we use +// the same type for Encap, which is a one-off, stateless operation, as Generate +// and Decap. Slightly tidier would be for Generate to return a new SSLKEMKey +// (or we introduce EVP_KEM and EVP_KEM_KEY), with a Decap method, and for Encap +// to be static function. class SSLKeyShare { public: virtual ~SSLKeyShare() {} @@ -1065,29 +1073,26 @@ class SSLKeyShare { // GroupID returns the group ID. virtual uint16_t GroupID() const PURE_VIRTUAL; - // Offer generates a keypair and writes the public value to - // |out_public_key|. It returns true on success and false on error. - virtual bool Offer(CBB *out_public_key) PURE_VIRTUAL; - - // Accept performs a key exchange against the |peer_key| generated by |Offer|. - // On success, it returns true, writes the public value to |out_public_key|, - // and sets |*out_secret| to the shared secret. On failure, it returns false - // and sets |*out_alert| to an alert to send to the peer. - // - // The default implementation calls |Offer| and then |Finish|, assuming a key - // exchange protocol where the peers are symmetric. - virtual bool Accept(CBB *out_public_key, Array *out_secret, - uint8_t *out_alert, Span peer_key); - - // Finish performs a key exchange against the |peer_key| generated by - // |Accept|. On success, it returns true and sets |*out_secret| to the shared - // secret. On failure, it returns false and sets |*out_alert| to an alert to - // send to the peer. - virtual bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) PURE_VIRTUAL; + // Generate generates a keypair and writes the public key to |out_public_key|. + // It returns true on success and false on error. + virtual bool Generate(CBB *out_public_key) PURE_VIRTUAL; + + // Encap generates an ephemeral, symmetric secret and encapsulates it with + // |peer_key|. On success, it returns true, writes the encapsulated secret to + // |out_ciphertext|, and sets |*out_secret| to the shared secret. On failure, + // it returns false and sets |*out_alert| to an alert to send to the peer. + virtual bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, + Span peer_key) PURE_VIRTUAL; + + // Decap decapsulates the symmetric secret in |ciphertext|. On success, it + // returns true and sets |*out_secret| to the shared secret. On failure, it + // returns false and sets |*out_alert| to an alert to send to the peer. + virtual bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) PURE_VIRTUAL; // SerializePrivateKey writes the private key to |out|, returning true if - // successful and false otherwise. It should be called after |Offer|. + // successful and false otherwise. It should be called after |Generate|. virtual bool SerializePrivateKey(CBB *out) { return false; } // DeserializePrivateKey initializes the state of the key exchange from |in|, @@ -1683,7 +1688,7 @@ struct SSL_HANDSHAKE_HINTS { Array server_random_tls13; uint16_t key_share_group_id = 0; - Array key_share_public_key; + Array key_share_ciphertext; Array key_share_secret; uint16_t signature_algorithm = 0; @@ -1843,9 +1848,9 @@ struct SSL_HANDSHAKE { // key_share_bytes is the key_share extension that the client should send. Array key_share_bytes; - // ecdh_public_key, for servers, is the key share to be sent to the client in - // TLS 1.3. - Array ecdh_public_key; + // key_share_ciphertext, for servers, is encapsulated shared secret to be sent + // to the client in the TLS 1.3 key_share extension. + Array key_share_ciphertext; // peer_sigalgs are the signature algorithms that the peer supports. These are // taken from the contents of the signature algorithms extension for a server diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index c604c870cc..a81b91704d 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -43,7 +43,7 @@ class ECKeyShare : public SSLKeyShare { uint16_t GroupID() const override { return group_id_; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { assert(!private_key_); // Generate a private key. private_key_.reset(BN_new()); @@ -66,8 +66,16 @@ class ECKeyShare : public SSLKeyShare { return true; } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { + // ECDH may be fit into a KEM-like abstraction by using a second keypair's + // public key as the ciphertext. + *out_alert = SSL_AD_INTERNAL_ERROR; + return Generate(out_ciphertext) && Decap(out_secret, out_alert, peer_key); + } + + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { assert(group_); assert(private_key_); *out_alert = SSL_AD_INTERNAL_ERROR; @@ -79,9 +87,9 @@ class ECKeyShare : public SSLKeyShare { return false; } - if (peer_key.empty() || peer_key[0] != POINT_CONVERSION_UNCOMPRESSED || - !EC_POINT_oct2point(group_, peer_point.get(), peer_key.data(), - peer_key.size(), /*ctx=*/nullptr)) { + if (ciphertext.empty() || ciphertext[0] != POINT_CONVERSION_UNCOMPRESSED || + !EC_POINT_oct2point(group_, peer_point.get(), ciphertext.data(), + ciphertext.size(), /*ctx=*/nullptr)) { OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); *out_alert = SSL_AD_DECODE_ERROR; return false; @@ -133,14 +141,22 @@ class X25519KeyShare : public SSLKeyShare { uint16_t GroupID() const override { return SSL_CURVE_X25519; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { uint8_t public_key[32]; X25519_keypair(public_key, private_key_); return !!CBB_add_bytes(out, public_key, sizeof(public_key)); } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { + // X25519 may be fit into a KEM-like abstraction by using a second keypair's + // public key as the ciphertext. + *out_alert = SSL_AD_INTERNAL_ERROR; + return Generate(out_ciphertext) && Decap(out_secret, out_alert, peer_key); + } + + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { *out_alert = SSL_AD_INTERNAL_ERROR; Array secret; @@ -148,8 +164,8 @@ class X25519KeyShare : public SSLKeyShare { return false; } - if (peer_key.size() != 32 || - !X25519(secret.data(), private_key_, peer_key.data())) { + if (ciphertext.size() != 32 || // + !X25519(secret.data(), private_key_, ciphertext.data())) { *out_alert = SSL_AD_DECODE_ERROR; OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); return false; @@ -181,7 +197,7 @@ class CECPQ2KeyShare : public SSLKeyShare { uint16_t GroupID() const override { return SSL_CURVE_CECPQ2; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { uint8_t x25519_public_key[32]; X25519_keypair(x25519_public_key, x25519_private_key_); @@ -205,8 +221,8 @@ class CECPQ2KeyShare : public SSLKeyShare { return true; } - bool Accept(CBB *out_public_key, Array *out_secret, - uint8_t *out_alert, Span peer_key) override { + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { Array secret; if (!secret.Init(32 + HRSS_KEY_BYTES)) { return false; @@ -230,9 +246,9 @@ class CECPQ2KeyShare : public SSLKeyShare { if (!HRSS_encap(ciphertext, secret.data() + 32, &peer_public_key, entropy) || - !CBB_add_bytes(out_public_key, x25519_public_key, + !CBB_add_bytes(out_ciphertext, x25519_public_key, sizeof(x25519_public_key)) || - !CBB_add_bytes(out_public_key, ciphertext, sizeof(ciphertext))) { + !CBB_add_bytes(out_ciphertext, ciphertext, sizeof(ciphertext))) { return false; } @@ -240,8 +256,8 @@ class CECPQ2KeyShare : public SSLKeyShare { return true; } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { *out_alert = SSL_AD_INTERNAL_ERROR; Array secret; @@ -249,15 +265,15 @@ class CECPQ2KeyShare : public SSLKeyShare { return false; } - if (peer_key.size() != 32 + HRSS_CIPHERTEXT_BYTES || - !X25519(secret.data(), x25519_private_key_, peer_key.data())) { + if (ciphertext.size() != 32 + HRSS_CIPHERTEXT_BYTES || + !X25519(secret.data(), x25519_private_key_, ciphertext.data())) { *out_alert = SSL_AD_DECODE_ERROR; OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); return false; } if (!HRSS_decap(secret.data() + 32, &hrss_private_key_, - peer_key.data() + 32, peer_key.size() - 32)) { + ciphertext.data() + 32, ciphertext.size() - 32)) { return false; } @@ -276,20 +292,19 @@ class X25519Kyber768KeyShare : public SSLKeyShare { uint16_t GroupID() const override { return SSL_CURVE_X25519KYBER768; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { // There is no implementation on Kyber in BoringSSL. BoringSSL must be - // patched for this key agreement to be workable. It is not enabled by - // default. + // patched for this KEM to be workable. It is not enabled by default. return false; } - bool Accept(CBB *out_public_key, Array *out_secret, - uint8_t *out_alert, Span peer_key) override { + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { return false; } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { return false; } }; @@ -300,20 +315,19 @@ class P256Kyber768KeyShare : public SSLKeyShare { uint16_t GroupID() const override { return SSL_CURVE_P256KYBER768; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { // There is no implementation on Kyber in BoringSSL. BoringSSL must be - // patched for this key agreement to be workable. It is not enabled by - // default. + // patched for this KEM to be workable. It is not enabled by default. return false; } - bool Accept(CBB *out_public_key, Array *out_secret, - uint8_t *out_alert, Span peer_key) override { + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { return false; } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { return false; } }; @@ -359,13 +373,6 @@ UniquePtr SSLKeyShare::Create(uint16_t group_id) { } } -bool SSLKeyShare::Accept(CBB *out_public_key, Array *out_secret, - uint8_t *out_alert, Span peer_key) { - *out_alert = SSL_AD_INTERNAL_ERROR; - return Offer(out_public_key) && - Finish(out_secret, out_alert, peer_key); -} - bool ssl_nid_to_group_id(uint16_t *out_group_id, int nid) { for (const auto &group : kNamedGroups) { if (group.nid == nid) { diff --git a/ssl/test/runner/handshake_client.go b/ssl/test/runner/handshake_client.go index 5d04994ad2..42f0534fd0 100644 --- a/ssl/test/runner/handshake_client.go +++ b/ssl/test/runner/handshake_client.go @@ -33,7 +33,7 @@ type clientHandshakeState struct { echHPKEContext *hpke.Context suite *cipherSuite finishedHash finishedHash - keyShares map[CurveID]ecdhCurve + keyShares map[CurveID]kemImplementation masterSecret []byte session *ClientSessionState finishedBytes []byte @@ -98,7 +98,7 @@ func (c *Conn) clientHandshake() error { hs := &clientHandshakeState{ c: c, - keyShares: make(map[CurveID]ecdhCurve), + keyShares: make(map[CurveID]kemImplementation), } // Pick a session to resume. @@ -643,11 +643,11 @@ func (hs *clientHandshakeState) createClientHello(innerHello *clientHelloMsg, ec if !curvesToSend[curveID] { continue } - curve, ok := curveForCurveID(curveID, c.config) + kem, ok := kemForCurveID(curveID, c.config) if !ok { continue } - publicKey, err := curve.offer(c.config.rand()) + publicKey, err := kem.generate(c.config.rand()) if err != nil { return nil, err } @@ -663,7 +663,7 @@ func (hs *clientHandshakeState) createClientHello(innerHello *clientHelloMsg, ec group: curveID, keyExchange: publicKey, }) - hs.keyShares[curveID] = curve + hs.keyShares[curveID] = kem if c.config.Bugs.DuplicateKeyShares { hello.keyShares = append(hello.keyShares, hello.keyShares[len(hello.keyShares)-1]) @@ -1122,7 +1122,7 @@ func (hs *clientHandshakeState) doTLS13Handshake(msg interface{}) error { // Resolve ECDHE and compute the handshake secret. ecdheSecret := zeroSecret if !c.config.Bugs.MissingKeyShare && !c.config.Bugs.SecondClientHelloMissingKeyShare { - curve, ok := hs.keyShares[hs.serverHello.keyShare.group] + kem, ok := hs.keyShares[hs.serverHello.keyShare.group] if !ok { c.sendAlert(alertHandshakeFailure) return errors.New("tls: server selected an unsupported group") @@ -1130,7 +1130,7 @@ func (hs *clientHandshakeState) doTLS13Handshake(msg interface{}) error { c.curveID = hs.serverHello.keyShare.group var err error - ecdheSecret, err = curve.finish(hs.serverHello.keyShare.keyExchange) + ecdheSecret, err = kem.decap(hs.serverHello.keyShare.keyExchange) if err != nil { return err } @@ -1529,15 +1529,15 @@ func (hs *clientHandshakeState) applyHelloRetryRequest(helloRetryRequest *helloR c.sendAlert(alertHandshakeFailure) return errors.New("tls: received invalid HelloRetryRequest") } - curve, ok := curveForCurveID(group, c.config) + kem, ok := kemForCurveID(group, c.config) if !ok { return errors.New("tls: Unable to get curve requested in HelloRetryRequest") } - publicKey, err := curve.offer(c.config.rand()) + publicKey, err := kem.generate(c.config.rand()) if err != nil { return err } - hs.keyShares[group] = curve + hs.keyShares[group] = kem hello.keyShares = []keyShareEntry{{ group: group, keyExchange: publicKey, diff --git a/ssl/test/runner/handshake_server.go b/ssl/test/runner/handshake_server.go index 5ae7d93652..de297a6635 100644 --- a/ssl/test/runner/handshake_server.go +++ b/ssl/test/runner/handshake_server.go @@ -957,7 +957,7 @@ ResendHelloRetryRequest: // Once a curve has been selected and a key share identified, // the server needs to generate a public value and send it in // the ServerHello. - curve, ok := curveForCurveID(selectedCurve, config) + kem, ok := kemForCurveID(selectedCurve, config) if !ok { panic("tls: server failed to look up curve ID") } @@ -967,9 +967,9 @@ ResendHelloRetryRequest: if config.Bugs.SkipHelloRetryRequest { // If skipping HelloRetryRequest, use a random key to // avoid crashing. - curve2, _ := curveForCurveID(selectedCurve, config) + kem2, _ := kemForCurveID(selectedCurve, config) var err error - peerKey, err = curve2.offer(config.rand()) + peerKey, err = kem2.generate(config.rand()) if err != nil { return err } @@ -977,7 +977,7 @@ ResendHelloRetryRequest: peerKey = selectedKeyShare.keyExchange } - publicKey, ecdheSecret, err := curve.accept(config.rand(), peerKey) + ciphertext, ecdheSecret, err := kem.encap(config.rand(), peerKey) if err != nil { c.sendAlert(alertHandshakeFailure) return err @@ -991,19 +991,19 @@ ResendHelloRetryRequest: curveID = config.Bugs.SendCurve } if c.config.Bugs.InvalidECDHPoint { - publicKey[0] ^= 0xff + ciphertext[0] ^= 0xff } hs.hello.keyShare = keyShareEntry{ group: curveID, - keyExchange: publicKey, + keyExchange: ciphertext, } if config.Bugs.EncryptedExtensionsWithKeyShare { encryptedExtensions.extensions.hasKeyShare = true encryptedExtensions.extensions.keyShare = keyShareEntry{ group: curveID, - keyExchange: publicKey, + keyExchange: ciphertext, } } } else { diff --git a/ssl/test/runner/key_agreement.go b/ssl/test/runner/key_agreement.go index bfd35f69f6..47cdbb8b0e 100644 --- a/ssl/test/runner/key_agreement.go +++ b/ssl/test/runner/key_agreement.go @@ -231,28 +231,29 @@ func (ka *rsaKeyAgreement) peerSignatureAlgorithm() signatureAlgorithm { return 0 } -// A ecdhCurve is an instance of ECDH-style key agreement for TLS. -type ecdhCurve interface { - // offer generates a keypair using rand. It returns the encoded |publicKey|. - offer(rand io.Reader) (publicKey []byte, err error) +// A kemImplementation is an instance of KEM-style construction for TLS. +type kemImplementation interface { + // generate generates a keypair using rand. It returns the encoded public key. + generate(rand io.Reader) (publicKey []byte, err error) - // accept responds to the |peerKey| generated by |offer| with the acceptor's - // |publicKey|, and returns agreed-upon |preMasterSecret| to the acceptor. - accept(rand io.Reader, peerKey []byte) (publicKey []byte, preMasterSecret []byte, err error) + // encap generates a symmetric, shared secret, encapsulates it with |peerKey|. + // It returns the encapsulated shared secret and the secret itself. + encap(rand io.Reader, peerKey []byte) (ciphertext []byte, secret []byte, err error) - // finish returns the computed |preMasterSecret|, given the |peerKey| - // generated by |accept|. - finish(peerKey []byte) (preMasterSecret []byte, err error) + // decap decapsulates |ciphertext| and returns the resulting shared secret. + decap(ciphertext []byte) (secret []byte, err error) } -// ellipticECDHCurve implements ecdhCurve with an elliptic.Curve. -type ellipticECDHCurve struct { +// ecdhKEM implements kemImplementation with an elliptic.Curve. +// +// TODO(davidben): Move this to Go's crypto/ecdh. +type ecdhKEM struct { curve elliptic.Curve privateKey []byte sendCompressed bool } -func (e *ellipticECDHCurve) offer(rand io.Reader) (publicKey []byte, err error) { +func (e *ecdhKEM) generate(rand io.Reader) (publicKey []byte, err error) { var x, y *big.Int e.privateKey, x, y, err = elliptic.GenerateKey(e.curve, rand) if err != nil { @@ -269,38 +270,37 @@ func (e *ellipticECDHCurve) offer(rand io.Reader) (publicKey []byte, err error) return ret, nil } -func (e *ellipticECDHCurve) accept(rand io.Reader, peerKey []byte) (publicKey []byte, preMasterSecret []byte, err error) { - publicKey, err = e.offer(rand) +func (e *ecdhKEM) encap(rand io.Reader, peerKey []byte) (ciphertext []byte, secret []byte, err error) { + ciphertext, err = e.generate(rand) if err != nil { return nil, nil, err } - preMasterSecret, err = e.finish(peerKey) + secret, err = e.decap(peerKey) if err != nil { return nil, nil, err } return } -func (e *ellipticECDHCurve) finish(peerKey []byte) (preMasterSecret []byte, err error) { - x, y := elliptic.Unmarshal(e.curve, peerKey) +func (e *ecdhKEM) decap(ciphertext []byte) (secret []byte, err error) { + x, y := elliptic.Unmarshal(e.curve, ciphertext) if x == nil { return nil, errors.New("tls: invalid peer key") } x, _ = e.curve.ScalarMult(x, y, e.privateKey) - preMasterSecret = make([]byte, (e.curve.Params().BitSize+7)>>3) + secret = make([]byte, (e.curve.Params().BitSize+7)>>3) xBytes := x.Bytes() - copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes) - - return preMasterSecret, nil + copy(secret[len(secret)-len(xBytes):], xBytes) + return secret, nil } -// x25519ECDHCurve implements ecdhCurve with X25519. -type x25519ECDHCurve struct { +// x25519KEM implements kemImplementation with X25519. +type x25519KEM struct { privateKey [32]byte setHighBit bool } -func (e *x25519ECDHCurve) offer(rand io.Reader) (publicKey []byte, err error) { +func (e *x25519KEM) generate(rand io.Reader) (publicKey []byte, err error) { _, err = io.ReadFull(rand, e.privateKey[:]) if err != nil { return @@ -313,25 +313,24 @@ func (e *x25519ECDHCurve) offer(rand io.Reader) (publicKey []byte, err error) { return out[:], nil } -func (e *x25519ECDHCurve) accept(rand io.Reader, peerKey []byte) (publicKey []byte, preMasterSecret []byte, err error) { - publicKey, err = e.offer(rand) +func (e *x25519KEM) encap(rand io.Reader, peerKey []byte) (ciphertext []byte, secret []byte, err error) { + ciphertext, err = e.generate(rand) if err != nil { return nil, nil, err } - preMasterSecret, err = e.finish(peerKey) + secret, err = e.decap(peerKey) if err != nil { return nil, nil, err } return } -func (e *x25519ECDHCurve) finish(peerKey []byte) (preMasterSecret []byte, err error) { - if len(peerKey) != 32 { +func (e *x25519KEM) decap(ciphertext []byte) (secret []byte, err error) { + if len(ciphertext) != 32 { return nil, errors.New("tls: invalid peer key") } - var out, peerKeyCopy [32]byte - copy(peerKeyCopy[:], peerKey) - curve25519.ScalarMult(&out, &e.privateKey, &peerKeyCopy) + var out [32]byte + curve25519.ScalarMult(&out, &e.privateKey, (*[32]byte)(ciphertext)) // Per RFC 7748, reject the all-zero value in constant time. var zeros [32]byte @@ -342,13 +341,13 @@ func (e *x25519ECDHCurve) finish(peerKey []byte) (preMasterSecret []byte, err er return out[:], nil } -// cecpq2Curve implements CECPQ2, which is HRSS+SXY combined with X25519. -type cecpq2Curve struct { +// cecpq2KEM implements CECPQ2, which is HRSS+SXY combined with X25519. +type cecpq2KEM struct { x25519PrivateKey [32]byte hrssPrivateKey hrss.PrivateKey } -func (e *cecpq2Curve) offer(rand io.Reader) (publicKey []byte, err error) { +func (e *cecpq2KEM) generate(rand io.Reader) (publicKey []byte, err error) { if _, err := io.ReadFull(rand, e.x25519PrivateKey[:]); err != nil { return nil, err } @@ -365,7 +364,7 @@ func (e *cecpq2Curve) offer(rand io.Reader) (publicKey []byte, err error) { return ret, nil } -func (e *cecpq2Curve) accept(rand io.Reader, peerKey []byte) (publicKey []byte, preMasterSecret []byte, err error) { +func (e *cecpq2KEM) encap(rand io.Reader, peerKey []byte) (ciphertext []byte, secret []byte, err error) { if len(peerKey) != 32+hrss.PublicKeySize { return nil, nil, errors.New("tls: bad length CECPQ2 offer") } @@ -392,21 +391,21 @@ func (e *cecpq2Curve) accept(rand io.Reader, peerKey []byte) (publicKey []byte, hrssCiphertext, hrssShared := hrssPublicKey.Encap(rand) - publicKey = append(publicKey, x25519Public[:]...) - publicKey = append(publicKey, hrssCiphertext...) - preMasterSecret = append(preMasterSecret, x25519Shared[:]...) - preMasterSecret = append(preMasterSecret, hrssShared...) + ciphertext = append(ciphertext, x25519Public[:]...) + ciphertext = append(ciphertext, hrssCiphertext...) + secret = append(secret, x25519Shared[:]...) + secret = append(secret, hrssShared...) - return publicKey, preMasterSecret, nil + return ciphertext, secret, nil } -func (e *cecpq2Curve) finish(peerKey []byte) (preMasterSecret []byte, err error) { - if len(peerKey) != 32+hrss.CiphertextSize { +func (e *cecpq2KEM) decap(ciphertext []byte) (secret []byte, err error) { + if len(ciphertext) != 32+hrss.CiphertextSize { return nil, errors.New("tls: bad length CECPQ2 reply") } var x25519Shared, x25519PeerKey [32]byte - copy(x25519PeerKey[:], peerKey) + copy(x25519PeerKey[:], ciphertext) curve25519.ScalarMult(&x25519Shared, &e.x25519PrivateKey, &x25519PeerKey) // Per RFC 7748, reject the all-zero value in constant time. @@ -415,31 +414,31 @@ func (e *cecpq2Curve) finish(peerKey []byte) (preMasterSecret []byte, err error) return nil, errors.New("tls: X25519 value with wrong order") } - hrssShared, ok := e.hrssPrivateKey.Decap(peerKey[32:]) + hrssShared, ok := e.hrssPrivateKey.Decap(ciphertext[32:]) if !ok { return nil, errors.New("tls: invalid HRSS ciphertext") } - preMasterSecret = append(preMasterSecret, x25519Shared[:]...) - preMasterSecret = append(preMasterSecret, hrssShared...) + secret = append(secret, x25519Shared[:]...) + secret = append(secret, hrssShared...) - return preMasterSecret, nil + return secret, nil } -func curveForCurveID(id CurveID, config *Config) (ecdhCurve, bool) { +func kemForCurveID(id CurveID, config *Config) (kemImplementation, bool) { switch id { case CurveP224: - return &ellipticECDHCurve{curve: elliptic.P224(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true + return &ecdhKEM{curve: elliptic.P224(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true case CurveP256: - return &ellipticECDHCurve{curve: elliptic.P256(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true + return &ecdhKEM{curve: elliptic.P256(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true case CurveP384: - return &ellipticECDHCurve{curve: elliptic.P384(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true + return &ecdhKEM{curve: elliptic.P384(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true case CurveP521: - return &ellipticECDHCurve{curve: elliptic.P521(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true + return &ecdhKEM{curve: elliptic.P521(), sendCompressed: config.Bugs.SendCompressedCoordinates}, true case CurveX25519: - return &x25519ECDHCurve{setHighBit: config.Bugs.SetX25519HighBit}, true + return &x25519KEM{setHighBit: config.Bugs.SetX25519HighBit}, true case CurveCECPQ2: - return &cecpq2Curve{}, true + return &cecpq2KEM{}, true default: return nil, false } @@ -576,7 +575,7 @@ func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clie // either be ECDSA or RSA. type ecdheKeyAgreement struct { auth keyAgreementAuthentication - curve ecdhCurve + kem kemImplementation curveID CurveID peerKey []byte } @@ -605,12 +604,12 @@ NextCandidate: } var ok bool - if ka.curve, ok = curveForCurveID(curveid, config); !ok { + if ka.kem, ok = kemForCurveID(curveid, config); !ok { return nil, errors.New("tls: preferredCurves includes unsupported curve") } ka.curveID = curveid - publicKey, err := ka.curve.offer(config.rand()) + publicKey, err := ka.kem.generate(config.rand()) if err != nil { return nil, err } @@ -636,7 +635,7 @@ func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Cert if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 { return nil, errClientKeyExchange } - return ka.curve.finish(ckx.ciphertext[1:]) + return ka.kem.decap(ckx.ciphertext[1:]) } func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, key crypto.PublicKey, skx *serverKeyExchangeMsg) error { @@ -646,11 +645,11 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell if skx.key[0] != 3 { // named curve return errors.New("tls: server selected unsupported curve") } - curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2]) - ka.curveID = curveid + curveID := CurveID(skx.key[1])<<8 | CurveID(skx.key[2]) + ka.curveID = curveID var ok bool - if ka.curve, ok = curveForCurveID(curveid, config); !ok { + if ka.kem, ok = kemForCurveID(curveID, config); !ok { return errors.New("tls: server selected unsupported curve") } @@ -668,24 +667,24 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell } func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) { - if ka.curve == nil { + if ka.kem == nil { return nil, nil, errors.New("missing ServerKeyExchange message") } - publicKey, preMasterSecret, err := ka.curve.accept(config.rand(), ka.peerKey) + ciphertext, secret, err := ka.kem.encap(config.rand(), ka.peerKey) if err != nil { return nil, nil, err } ckx := new(clientKeyExchangeMsg) - ckx.ciphertext = make([]byte, 1+len(publicKey)) - ckx.ciphertext[0] = byte(len(publicKey)) - copy(ckx.ciphertext[1:], publicKey) + ckx.ciphertext = make([]byte, 1+len(ciphertext)) + ckx.ciphertext[0] = byte(len(ciphertext)) + copy(ckx.ciphertext[1:], ciphertext) if config.Bugs.InvalidECDHPoint { ckx.ciphertext[1] ^= 0xff } - return preMasterSecret, ckx, nil + return secret, ckx, nil } func (ka *ecdheKeyAgreement) peerSignatureAlgorithm() signatureAlgorithm { diff --git a/ssl/tls13_server.cc b/ssl/tls13_server.cc index ca436242ae..0bbe97f273 100644 --- a/ssl/tls13_server.cc +++ b/ssl/tls13_server.cc @@ -66,25 +66,25 @@ static bool resolve_ecdhe_secret(SSL_HANDSHAKE *hs, SSL_HANDSHAKE_HINTS *const hints = hs->hints.get(); if (hints && !hs->hints_requested && hints->key_share_group_id == group_id && !hints->key_share_secret.empty()) { - // Copy DH secret from hints. - if (!hs->ecdh_public_key.CopyFrom(hints->key_share_public_key) || + // Copy the key_share secret from hints. + if (!hs->key_share_ciphertext.CopyFrom(hints->key_share_ciphertext) || !secret.CopyFrom(hints->key_share_secret)) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return false; } } else { - ScopedCBB public_key; + ScopedCBB ciphertext; UniquePtr key_share = SSLKeyShare::Create(group_id); if (!key_share || // - !CBB_init(public_key.get(), 32) || - !key_share->Accept(public_key.get(), &secret, &alert, peer_key) || - !CBBFinishArray(public_key.get(), &hs->ecdh_public_key)) { + !CBB_init(ciphertext.get(), 32) || + !key_share->Encap(ciphertext.get(), &secret, &alert, peer_key) || + !CBBFinishArray(ciphertext.get(), &hs->key_share_ciphertext)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return false; } if (hints && hs->hints_requested) { hints->key_share_group_id = group_id; - if (!hints->key_share_public_key.CopyFrom(hs->ecdh_public_key) || + if (!hints->key_share_ciphertext.CopyFrom(hs->key_share_ciphertext) || !hints->key_share_secret.CopyFrom(secret)) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return false; @@ -790,7 +790,7 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) { return ssl_hs_error; } - hs->ecdh_public_key.Reset(); // No longer needed. + hs->key_share_ciphertext.Reset(); // No longer needed. if (!ssl->s3->used_hello_retry_request && !ssl->method->add_change_cipher_spec(ssl)) { return ssl_hs_error; From 76cb7c5eb726e7637ed4c627ac27dacbd6250584 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Wed, 1 Mar 2023 00:09:55 +0000 Subject: [PATCH 126/177] urandom_test: force MADV_WIPEONFORK both ways. This test could simulate the lack of MADV_WIPEONFORK on systems with it, but couldn't simulate having it if the kernel didn't support it. This change makes the presence / absence of BORINGSSL_IGNORE_MADV_WIPEONFORK control whether MADV_WIPEONFORK is "supported" in the test environment or not, and corrects the test for the case where it's missing. Change-Id: I23876788a0e0a4fd2a148f98b6b94e40880b6fc9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57745 Auto-Submit: Adam Langley Reviewed-by: David Benjamin Commit-Queue: Adam Langley --- crypto/fipsmodule/rand/fork_detect.c | 19 ++++++++++++++----- crypto/fipsmodule/rand/fork_detect.h | 5 +++-- crypto/fipsmodule/rand/urandom_test.cc | 19 +++++++++++++++---- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/crypto/fipsmodule/rand/fork_detect.c b/crypto/fipsmodule/rand/fork_detect.c index 51cf18abcc..58b0687434 100644 --- a/crypto/fipsmodule/rand/fork_detect.c +++ b/crypto/fipsmodule/rand/fork_detect.c @@ -40,10 +40,11 @@ DEFINE_STATIC_ONCE(g_fork_detect_once); DEFINE_STATIC_MUTEX(g_fork_detect_lock); DEFINE_BSS_GET(volatile char *, g_fork_detect_addr); DEFINE_BSS_GET(uint64_t, g_fork_generation); -DEFINE_BSS_GET(int, g_ignore_madv_wipeonfork); +DEFINE_BSS_GET(int, g_force_madv_wipeonfork); +DEFINE_BSS_GET(int, g_force_madv_wipeonfork_enabled); static void init_fork_detect(void) { - if (*g_ignore_madv_wipeonfork_bss_get()) { + if (*g_force_madv_wipeonfork_bss_get()) { return; } @@ -93,7 +94,14 @@ uint64_t CRYPTO_get_fork_generation(void) { // not assume that it has exclusive access to it. volatile char *const flag_ptr = *g_fork_detect_addr_bss_get(); if (flag_ptr == NULL) { - // Our kernel is too old to support |MADV_WIPEONFORK|. + // Our kernel is too old to support |MADV_WIPEONFORK| or + // |g_force_madv_wipeonfork| is set. + if (*g_force_madv_wipeonfork_bss_get() && + *g_force_madv_wipeonfork_enabled_bss_get()) { + // A constant generation number to simulate support, even if the kernel + // doesn't support it. + return 42; + } return 0; } @@ -125,8 +133,9 @@ uint64_t CRYPTO_get_fork_generation(void) { return current_generation; } -void CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing(void) { - *g_ignore_madv_wipeonfork_bss_get() = 1; +void CRYPTO_fork_detect_force_madv_wipeonfork_for_testing(int on) { + *g_force_madv_wipeonfork_bss_get() = 1; + *g_force_madv_wipeonfork_enabled_bss_get() = on; } #else // !OPENSSL_LINUX diff --git a/crypto/fipsmodule/rand/fork_detect.h b/crypto/fipsmodule/rand/fork_detect.h index 8518830cec..f9bbe02f76 100644 --- a/crypto/fipsmodule/rand/fork_detect.h +++ b/crypto/fipsmodule/rand/fork_detect.h @@ -38,9 +38,10 @@ extern "C" { // should only be used as a hardening measure. OPENSSL_EXPORT uint64_t CRYPTO_get_fork_generation(void); -// CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing is an internal detail +// CRYPTO_fork_detect_force_madv_wipeonfork_for_testing is an internal detail // used for testing purposes. -OPENSSL_EXPORT void CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing(void); +OPENSSL_EXPORT void CRYPTO_fork_detect_force_madv_wipeonfork_for_testing( + int on); #if defined(__cplusplus) } // extern C diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc index d593b901e5..f92fe9480e 100644 --- a/crypto/fipsmodule/rand/urandom_test.cc +++ b/crypto/fipsmodule/rand/urandom_test.cc @@ -657,7 +657,11 @@ static bool AppendDaemonEvents(std::vector *events, unsigned flags) { static std::vector TestFunctionPRNGModel(unsigned flags) { std::vector ret; bool getrandom_ready = false; - const bool used_daemon = kUsesDaemon && AppendDaemonEvents(&ret, flags); + bool used_daemon = false; + + if (have_fork_detection()) { + used_daemon = kUsesDaemon && AppendDaemonEvents(&ret, flags); + } // Probe for getrandom support ret.push_back(Event::GetRandom(1, GRND_NONBLOCK)); @@ -714,8 +718,13 @@ static std::vector TestFunctionPRNGModel(unsigned flags) { const size_t kAdditionalDataLength = 32; if (!have_rdrand()) { - if ((!have_fork_detection() && !sysrand(true, kAdditionalDataLength)) || - // Initialise CRNGT. + if (!have_fork_detection()) { + if (!sysrand(true, kAdditionalDataLength)) { + return ret; + } + used_daemon = kUsesDaemon && AppendDaemonEvents(&ret, flags); + } + if (// Initialise CRNGT. (!used_daemon && !sysrand(true, kSeedLength + (kIsFIPS ? 16 : 0))) || // Personalisation draw if the daemon was used. (used_daemon && !sysrand(false, CTR_DRBG_ENTROPY_LEN)) || @@ -816,7 +825,9 @@ int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); if (getenv("BORINGSSL_IGNORE_MADV_WIPEONFORK")) { - CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing(); + CRYPTO_fork_detect_force_madv_wipeonfork_for_testing(0); + } else { + CRYPTO_fork_detect_force_madv_wipeonfork_for_testing(1); } return RUN_ALL_TESTS(); From e06f172bf22c098719d0d9b970f839b39dcd41ce Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Thu, 2 Mar 2023 09:02:54 -0700 Subject: [PATCH 127/177] Fix use of unitialized cbb on failure case. This made fido2's fuzzer angry: https://buganizer.corp.google.com/issues/271220905 Change-Id: Ib1b909be10f230df2daea3942f35cba0a81dcedb Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57765 Commit-Queue: Bob Beck Commit-Queue: David Benjamin Auto-Submit: Bob Beck Reviewed-by: David Benjamin --- crypto/asn1/a_mbstr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/asn1/a_mbstr.c b/crypto/asn1/a_mbstr.c index 80cfac44e0..85a7b98a74 100644 --- a/crypto/asn1/a_mbstr.c +++ b/crypto/asn1/a_mbstr.c @@ -222,6 +222,8 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, } } + CBB cbb; + CBB_zero(&cbb); // If both the same type just copy across if (inform == outform) { if (!ASN1_STRING_set(dest, in, len)) { @@ -231,8 +233,6 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, *out = dest; return str_type; } - - CBB cbb; if (!CBB_init(&cbb, size_estimate + 1)) { goto err; } From 93e8d4463d59d671e9c5c6171226341f04b07907 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 2 Mar 2023 12:24:58 -0500 Subject: [PATCH 128/177] Add a few more assertions to compiler_test.cc. Also turn assertions into static_assert where we can. These should be no-ops with existing assertions. The int assertion is tighter, but we already assert this in constant_time_declassify_int. We cannot support 64-bit int because it messes up integer promotion rules. Change-Id: I628d2d7decdfa8bc01d8c6013bc7c20f927d63b1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57785 Reviewed-by: Adam Langley Auto-Submit: David Benjamin Commit-Queue: Adam Langley --- crypto/compiler_test.cc | 46 ++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/crypto/compiler_test.cc b/crypto/compiler_test.cc index 29375a57e7..9102337594 100644 --- a/crypto/compiler_test.cc +++ b/crypto/compiler_test.cc @@ -57,27 +57,49 @@ static void CheckRepresentation(T value) { } TEST(CompilerTest, IntegerRepresentation) { - EXPECT_EQ(8, CHAR_BIT); - EXPECT_EQ(0xff, static_cast(UCHAR_MAX)); + static_assert(CHAR_BIT == 8, "BoringSSL only supports 8-bit chars"); + static_assert(UCHAR_MAX == 0xff, "BoringSSL only supports 8-bit chars"); - // uint8_t is assumed to be unsigned char. I.e., casting to uint8_t should be - // as good as unsigned char for strict aliasing purposes. + // Require that |unsigned char| and |uint8_t| be the same type. We require + // that type-punning through |uint8_t| is not a strict aliasing violation. In + // principle, type-punning should be done with |memcpy|, which would make this + // moot. + // + // However, C made too many historical mistakes with the types and signedness + // of character strings. As a result, aliasing between all variations on 8-bit + // chars are a practical necessity for all real C code. We do not support + // toolchains that break this assumption. + static_assert( + std::is_same::value, + "BoringSSL requires uint8_t and unsigned char be the same type"); uint8_t u8 = 0; unsigned char *ptr = &u8; (void)ptr; // Sized integers have the expected size. - EXPECT_EQ(1u, sizeof(uint8_t)); - EXPECT_EQ(2u, sizeof(uint16_t)); - EXPECT_EQ(4u, sizeof(uint32_t)); - EXPECT_EQ(8u, sizeof(uint64_t)); + static_assert(sizeof(uint8_t) == 1u, "uint8_t has the wrong size"); + static_assert(sizeof(uint16_t) == 2u, "uint16_t has the wrong size"); + static_assert(sizeof(uint32_t) == 4u, "uint32_t has the wrong size"); + static_assert(sizeof(uint64_t) == 8u, "uint64_t has the wrong size"); // size_t does not exceed uint64_t. - EXPECT_LE(sizeof(size_t), 8u); + static_assert(sizeof(size_t) <= 8u, "size_t must not exceed uint64_t"); - // int must be 32-bit or larger. - EXPECT_LE(0x7fffffff, INT_MAX); - EXPECT_LE(0xffffffffu, UINT_MAX); + // Require that |int| be exactly 32 bits. OpenSSL historically mixed up + // |unsigned| and |uint32_t|, so we require it be at least 32 bits. Requiring + // at most 32-bits is a bit more subtle. C promotes arithemetic operands to + // |int| when they fit. But this means, if |int| is 2N bits wide, multiplying + // two maximum-sized |uintN_t|s is undefined by integer overflow! + // + // We attempt to handle this for |uint16_t|, assuming a 32-bit |int|, but we + // make no attempts to correct for this with |uint32_t| for a 64-bit |int|. + // Thus BoringSSL does not support ILP64 platforms. + // + // This test is on |INT_MAX| and |INT32_MAX| rather than sizeof because it is + // theoretically allowed for sizeof(int) to be 4 but include padding bits. + static_assert(INT_MAX == INT32_MAX, "BoringSSL requires int be 32-bit"); + static_assert(UINT_MAX == UINT32_MAX, + "BoringSSL requires unsigned be 32-bit"); CheckRepresentation(static_cast(127)); CheckRepresentation(static_cast(1)); From 3a7dfdb984434a4b4beef947b2e49602c557c0de Mon Sep 17 00:00:00 2001 From: Theo Buehler Date: Sun, 5 Mar 2023 23:41:50 +0100 Subject: [PATCH 129/177] Plug a leak in ASN1_item_i2d() ASN1_item_ex_i2d() does not take ownership of the memory pointed at by *out, so it's the caller's responsibility to free it on error. Change-Id: Id8cb70e50f280944418629a32b53fd4ca248b0bd Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57805 Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- crypto/asn1/tasn_enc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index 9d4d587ee6..ca3b3fc504 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -97,6 +97,7 @@ int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it) { p = buf; int len2 = ASN1_item_ex_i2d(&val, &p, it, /*tag=*/-1, /*aclass=*/0); if (len2 <= 0) { + OPENSSL_free(buf); return len2; } assert(len == len2); From abb9af83bc223eca0ffffce246ed551f2fcd11e1 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 6 Mar 2023 14:25:39 -0500 Subject: [PATCH 130/177] Work around a NASM bug I did not have "find a bug in the assembler" on my bingo card today, but here we are. NASM 2.15, prior to 2.15.04, has a bug where, if a section that already exists is referenced again with alignment qualifiers, it incorrect adds padding and mangles the output. See https://bugzilla.nasm.us/show_bug.cgi?id=3392701. Work around this by suppressing the perlasm-emitted qualifiers the second time a section is emitted. We likely don't need these qualifiers because, for all sections we care about, NASM's defaults are fine, but perlasm tries to align .text more aggressively than the default, so let it do that. Bug: chromium:1422018 Change-Id: Iade5702c139b70772d4957a83c8f9be86c8af97c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57825 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/perlasm/x86_64-xlate.pl | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl index b8802c586a..16a7846835 100755 --- a/crypto/perlasm/x86_64-xlate.pl +++ b/crypto/perlasm/x86_64-xlate.pl @@ -1029,6 +1029,27 @@ } } { package directive; # pick up directives, which start with . + my %sections; + sub nasm_section { + my ($name, $qualifiers) = @_; + my $ret = "section\t$name"; + if (exists $sections{$name}) { + # Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392701. Only + # emit section qualifiers the first time a section is referenced. + # For all subsequent references, require the qualifiers match and + # omit them. + # + # See also https://crbug.com/1422018 and b/270643835. + my $old = $sections{$name}; + die "Inconsistent qualifiers: $qualifiers vs $old" if ($qualifiers ne "" && $qualifiers ne $old); + } else { + $sections{$name} = $qualifiers; + if ($qualifiers ne "") { + $ret .= " $qualifiers"; + } + } + return $ret; + } sub re { my ($class, $line) = @_; my $self = {}; @@ -1137,7 +1158,7 @@ SWITCH: for ($dir) { /\.text/ && do { my $v=undef; if ($nasm) { - $v="section .text code align=64\n"; + $v=nasm_section(".text", "code align=64")."\n"; } else { $v="$current_segment\tENDS\n" if ($current_segment); $current_segment = ".text\$"; @@ -1150,7 +1171,7 @@ }; /\.data/ && do { my $v=undef; if ($nasm) { - $v="section .data data align=8\n"; + $v=nasm_section(".data", "data align=8")."\n"; } else { $v="$current_segment\tENDS\n" if ($current_segment); $current_segment = "_DATA"; @@ -1164,13 +1185,14 @@ $$line = ".CRT\$XCU" if ($$line eq ".init"); $$line = ".rdata" if ($$line eq ".rodata"); if ($nasm) { - $v="section $$line"; + my $qualifiers = ""; if ($$line=~/\.([prx])data/) { - $v.=" rdata align="; - $v.=$1 eq "p"? 4 : 8; + $qualifiers = "rdata align="; + $qualifiers .= $1 eq "p"? 4 : 8; } elsif ($$line=~/\.CRT\$/i) { - $v.=" rdata align=8"; + $qualifiers = "rdata align=8"; } + $v = nasm_section($$line, $qualifiers); } else { $v="$current_segment\tENDS\n" if ($current_segment); $v.="$$line\tSEGMENT"; From 082e953a134ad423a00b8859f9daf5708e729260 Mon Sep 17 00:00:00 2001 From: Pete Bentley Date: Thu, 25 Aug 2022 15:32:33 +0100 Subject: [PATCH 131/177] test_fips: flush stdout before aborting on failure. When running on a device via `adb shell`, stdout will be a pipe and so is block buffered, leading to lost output if abort() is called before flushing. Change-Id: Ica67132fb8b2b1e7967df89fa3d0a9a793d8cbbf Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/54025 Reviewed-by: Adam Langley Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- util/fipstools/test_fips.c | 1 + 1 file changed, 1 insertion(+) diff --git a/util/fipstools/test_fips.c b/util/fipstools/test_fips.c index 42ed96b222..ed95b8ccb6 100644 --- a/util/fipstools/test_fips.c +++ b/util/fipstools/test_fips.c @@ -313,5 +313,6 @@ int main(int argc, char **argv) { err: printf("FAIL\n"); + fflush(stdout); abort(); } From a925c220c123af0bdd49be3a8a84a506584c1fb2 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 7 Mar 2023 15:14:00 -0500 Subject: [PATCH 132/177] Remove EVP_PKEY_ASN1_METHOD and EVP_PKEY_METHOD from public headers With EVP_PKEY and EVP_PKEY_CTX opaque, these symbols don't appear in any public APIs anymore. Make them internal, which also opens the door to renaming them: - EVP_PKEY_METHOD is more accurately EVP_PKEY_CTX_METHOD - EVP_PKEY_ASN1_METHOD is more accurately EVP_PKEY_METHOD Or perhaps the split doesn't mean much and we should fold them together. Change-Id: I8a0f7c2e07445dc981c7cef697263e59dba7784e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57885 Commit-Queue: David Benjamin Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/evp/internal.h | 3 +++ include/openssl/base.h | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crypto/evp/internal.h b/crypto/evp/internal.h index 71f0f954a4..6678c41de7 100644 --- a/crypto/evp/internal.h +++ b/crypto/evp/internal.h @@ -66,6 +66,9 @@ extern "C" { #endif +typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; +typedef struct evp_pkey_method_st EVP_PKEY_METHOD; + struct evp_pkey_asn1_method_st { int pkey_id; uint8_t oid[9]; diff --git a/include/openssl/base.h b/include/openssl/base.h index 190e250ff0..a1a4309a41 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h @@ -419,9 +419,7 @@ typedef struct evp_hpke_ctx_st EVP_HPKE_CTX; typedef struct evp_hpke_kdf_st EVP_HPKE_KDF; typedef struct evp_hpke_kem_st EVP_HPKE_KEM; typedef struct evp_hpke_key_st EVP_HPKE_KEY; -typedef struct evp_pkey_asn1_method_st EVP_PKEY_ASN1_METHOD; typedef struct evp_pkey_ctx_st EVP_PKEY_CTX; -typedef struct evp_pkey_method_st EVP_PKEY_METHOD; typedef struct evp_pkey_st EVP_PKEY; typedef struct hmac_ctx_st HMAC_CTX; typedef struct md4_state_st MD4_CTX; From ecb722aeeb7ec6fcd2d6c60d177b9e952eab51f8 Mon Sep 17 00:00:00 2001 From: Ilya Tokar Date: Mon, 6 Mar 2023 16:20:44 -0500 Subject: [PATCH 133/177] Add prefetch to sha1_block_data_order_shaext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similar idea to https://boringssl-review.googlesource.com/c/boringssl/+/55466 Results are pretty close to the current state, e.g. tool speed goes from Did 74000 SHA-1 (16384 bytes) operations in 1004094us (73698.3 ops/sec): 1207.5 MB/s to Did 75000 SHA-1 (16384 bytes) operations in 1004022us (74699.6 ops/sec): 1223.9 MB/s But on AMD with prefetchers disabled and large enough data size, to force cache misses this gives ~3x improvement: name old time/op new time/op delta BM_SHA1Hash/2 141ns ± 1% 143ns ± 2% ~ (p=0.421 n=5+5) BM_SHA1Hash/4 143ns ± 2% 143ns ± 3% ~ (p=0.841 n=5+5) BM_SHA1Hash/8 141ns ± 1% 141ns ± 2% ~ (p=1.000 n=5+5) BM_SHA1Hash/16 141ns ± 1% 141ns ± 1% ~ (p=0.841 n=5+5) BM_SHA1Hash/32 143ns ± 2% 143ns ± 1% ~ (p=0.690 n=5+5) BM_SHA1Hash/64 178ns ± 1% 179ns ± 1% ~ (p=0.151 n=5+5) BM_SHA1Hash/512 454ns ± 1% 454ns ± 1% ~ (p=0.841 n=5+5) BM_SHA1Hash/4k 2.66µs ± 1% 2.65µs ± 1% ~ (p=1.000 n=5+5) BM_SHA1Hash/32k 20.3µs ± 1% 20.3µs ± 2% ~ (p=1.000 n=5+5) BM_SHA1Hash/256k 162µs ± 1% 161µs ± 1% ~ (p=0.548 n=5+5) BM_SHA1Hash/1M 644µs ± 1% 645µs ± 1% ~ (p=0.841 n=5+5) BM_SHA1Hash/2M 1.29ms ± 1% 1.29ms ± 2% ~ (p=0.690 n=5+5) BM_SHA1Hash/4M 2.58ms ± 1% 2.58ms ± 1% ~ (p=0.841 n=5+5) BM_SHA1Hash/8M 5.14ms ± 0% 5.15ms ± 1% ~ (p=0.286 n=4+5) BM_SHA1Hash/16M 11.4ms ± 3% 10.3ms ± 1% -9.04% (p=0.016 n=4+5) BM_SHA1Hash/128M 249ms ± 0% 83ms ± 1% -66.73% (p=0.008 n=5+5) Change-Id: I7cae746b6d8a705d6bf2d5c5df6a2dca6d44791a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57826 Commit-Queue: Adam Langley Reviewed-by: Adam Langley --- crypto/fipsmodule/sha/asm/sha1-x86_64.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto/fipsmodule/sha/asm/sha1-x86_64.pl b/crypto/fipsmodule/sha/asm/sha1-x86_64.pl index 6ee78872b3..d9afacbd3e 100755 --- a/crypto/fipsmodule/sha/asm/sha1-x86_64.pl +++ b/crypto/fipsmodule/sha/asm/sha1-x86_64.pl @@ -389,6 +389,7 @@ sub BODY_40_59 { lea 0x40($inp),%r8 # next input block paddd @MSG[0],$E cmovne %r8,$inp + prefetcht0 512($inp) movdqa $ABCD,$ABCD_SAVE # offload $ABCD ___ for($i=0;$i<20-4;$i+=2) { From 8aa51ddfcf1fbf2e5f976762657e21c7aee2f922 Mon Sep 17 00:00:00 2001 From: Robert Liu Date: Thu, 9 Mar 2023 15:50:41 +0000 Subject: [PATCH 134/177] Add OPENSSL_EXPORT to BN_mod_inverse_blinded Change-Id: Ie7543047c6f489ae849b3c27703948f0977c33fd Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57905 Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- include/openssl/bn.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/openssl/bn.h b/include/openssl/bn.h index 1fa499c8f9..a03e41f18a 100644 --- a/include/openssl/bn.h +++ b/include/openssl/bn.h @@ -834,8 +834,9 @@ OPENSSL_EXPORT BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, // Note this function may incorrectly report |a| has no inverse if the random // blinding value has no inverse. It should only be used when |n| has few // non-invertible elements, such as an RSA modulus. -int BN_mod_inverse_blinded(BIGNUM *out, int *out_no_inverse, const BIGNUM *a, - const BN_MONT_CTX *mont, BN_CTX *ctx); +OPENSSL_EXPORT int BN_mod_inverse_blinded(BIGNUM *out, int *out_no_inverse, + const BIGNUM *a, + const BN_MONT_CTX *mont, BN_CTX *ctx); // BN_mod_inverse_odd sets |out| equal to |a|^-1, mod |n|. |a| must be // non-negative and must be less than |n|. |n| must be odd. This function From be79283dd85dd072c2f0baf69b04cbd3113fc138 Mon Sep 17 00:00:00 2001 From: Nabil Wadih Date: Tue, 14 Feb 2023 11:46:37 -0800 Subject: [PATCH 135/177] initial setup for bssl crate with hmac and sha2 bindings - update rust folder to split into `bssl` and `bssl-sys` - add initial bindings for hmac and a subset of sha2 Change-Id: I09e0e778c1590de6818a49e19529ceb011e4d9f6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57285 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Reviewed-by: Adam Langley --- .gitignore | 1 + rust/CMakeLists.txt | 40 +-- rust/bssl-crypto/Cargo.lock | 14 ++ rust/bssl-crypto/Cargo.toml | 11 + rust/bssl-crypto/README.md | 14 ++ rust/bssl-crypto/deny.toml | 212 ++++++++++++++++ rust/bssl-crypto/src/digest.rs | 80 ++++++ rust/bssl-crypto/src/hmac.rs | 391 +++++++++++++++++++++++++++++ rust/bssl-crypto/src/lib.rs | 118 +++++++++ rust/bssl-sys/CMakeLists.txt | 40 +++ rust/{ => bssl-sys}/Cargo.toml | 2 + rust/{ => bssl-sys}/README.md | 0 rust/{ => bssl-sys}/build.rs | 9 +- rust/{ => bssl-sys}/rust_wrapper.c | 0 rust/{ => bssl-sys}/rust_wrapper.h | 0 rust/{ => bssl-sys}/src/lib.rs | 0 rust/bssl-sys/wrapper.h | 79 ++++++ rust/wrapper.h | 79 ------ 18 files changed, 969 insertions(+), 121 deletions(-) create mode 100644 rust/bssl-crypto/Cargo.lock create mode 100644 rust/bssl-crypto/Cargo.toml create mode 100644 rust/bssl-crypto/README.md create mode 100644 rust/bssl-crypto/deny.toml create mode 100644 rust/bssl-crypto/src/digest.rs create mode 100644 rust/bssl-crypto/src/hmac.rs create mode 100644 rust/bssl-crypto/src/lib.rs create mode 100644 rust/bssl-sys/CMakeLists.txt rename rust/{ => bssl-sys}/Cargo.toml (81%) rename rust/{ => bssl-sys}/README.md (100%) rename rust/{ => bssl-sys}/build.rs (77%) rename rust/{ => bssl-sys}/rust_wrapper.c (100%) rename rust/{ => bssl-sys}/rust_wrapper.h (100%) rename rust/{ => bssl-sys}/src/lib.rs (100%) create mode 100644 rust/bssl-sys/wrapper.h delete mode 100644 rust/wrapper.h diff --git a/.gitignore b/.gitignore index 68dca6cf28..ac0ede8464 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ util/bot/sde-linux64.tar.xz util/bot/sde-win32 util/bot/sde-win32.tar.xz util/bot/win_toolchain.json +target/ diff --git a/rust/CMakeLists.txt b/rust/CMakeLists.txt index 422905f327..fcdf3db13a 100644 --- a/rust/CMakeLists.txt +++ b/rust/CMakeLists.txt @@ -1,39 +1 @@ -# Additional interop for things like macros and inlined functions. -add_library(rust_wrapper STATIC rust_wrapper.c) -target_link_libraries(rust_wrapper crypto) - -# Generate architecture-specific wrappers. -set(WRAPPER_TARGET ${CMAKE_CURRENT_BINARY_DIR}/src/wrapper_${RUST_BINDINGS}.rs) -set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h" - -o ${WRAPPER_TARGET} - --no-derive-default - --enable-function-attribute-detection - --use-core - --size_t-is-usize - --default-macro-constant-type="signed" - --rustified-enum="point_conversion_form_t" - --allowlist-file=".*/include/openssl/.*\\.h" - --allowlist-file=".*/rust_wrapper\\.h" - -- # these are LLVM arg passthroughs - -I../include - # https://doc.rust-lang.org/nightly/rustc/platform-support.html - --target=${RUST_BINDINGS}) - -set(INCLUDES "include!(\"wrapper_${RUST_BINDINGS}.rs\");\n") - -add_custom_target( - bindgen_rust_${RUST_BINDINGS} - ALL - ${COMMAND} - BYPRODUCTS ${WRAPPER_TARGET} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) - -# move files into build directory -configure_file("src/lib.rs" "src/lib.rs") - -if(NOT BUILD_SHARED_LIBS) - configure_file("build.rs" "build.rs" COPYONLY) -endif() - -configure_file("Cargo.toml" "Cargo.toml" COPYONLY) +add_subdirectory(bssl-sys) \ No newline at end of file diff --git a/rust/bssl-crypto/Cargo.lock b/rust/bssl-crypto/Cargo.lock new file mode 100644 index 0000000000..ed7fe34d36 --- /dev/null +++ b/rust/bssl-crypto/Cargo.lock @@ -0,0 +1,14 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bssl-crypto" +version = "0.1.0" +dependencies = [ + "bssl-sys", +] + +[[package]] +name = "bssl-sys" +version = "0.1.0" diff --git a/rust/bssl-crypto/Cargo.toml b/rust/bssl-crypto/Cargo.toml new file mode 100644 index 0000000000..57a64401e8 --- /dev/null +++ b/rust/bssl-crypto/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "bssl-crypto" +version = "0.1.0" +edition = "2021" +publish = false +license = "MIT" + +[dependencies] +# the crate will need to be generated at this path by running this command at root +# `mkdir build && cd build && cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja` +bssl-sys = {path = "../../build/rust/bssl-sys"} \ No newline at end of file diff --git a/rust/bssl-crypto/README.md b/rust/bssl-crypto/README.md new file mode 100644 index 0000000000..9e10fad873 --- /dev/null +++ b/rust/bssl-crypto/README.md @@ -0,0 +1,14 @@ +bssl-crypto +============ + +rust bindings to boringssl which wrap bssl-sys, a low level autogenerated binding + +Before using this crate, first generate the bssl-sys bindings by running this command from the root of the repo: +``` +mkdir build && cd build && cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja +``` + +Then to run all tests: +``` +cd rust/bssl-crypto && cargo clippy && cargo deny check && cargo test +``` \ No newline at end of file diff --git a/rust/bssl-crypto/deny.toml b/rust/bssl-crypto/deny.toml new file mode 100644 index 0000000000..d398485e3e --- /dev/null +++ b/rust/bssl-crypto/deny.toml @@ -0,0 +1,212 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #{ triple = "x86_64-unknown-linux-musl" }, + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory database is cloned/fetched into +db-path = "~/.cargo/advisory-db" +# The url(s) of the advisory databases to use +db-urls = ["https://github.com/rustsec/advisory-db"] +# The lint level for security vulnerabilities +vulnerability = "deny" +# The lint level for unmaintained crates +unmaintained = "warn" +# The lint level for crates that have been yanked from their source registry +yanked = "warn" +# The lint level for crates with security notices. Note that as of +# 2019-12-17 there are no security notice advisories in +# https://github.com/rustsec/advisory-db +notice = "warn" +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + #"RUSTSEC-0000-0000", +] +# Threshold for security vulnerabilities, any vulnerability with a CVSS score +# lower than the range specified will be ignored. Note that ignored advisories +# will still output a note when they are encountered. +# * None - CVSS Score 0.0 +# * Low - CVSS Score 0.1 - 3.9 +# * Medium - CVSS Score 4.0 - 6.9 +# * High - CVSS Score 7.0 - 8.9 +# * Critical - CVSS Score 9.0 - 10.0 +#severity-threshold = + +# If this is true, then cargo deny will use the git executable to fetch advisory database. +# If this is false, then it uses a built-in git library. +# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. +# See Git Authentication for more information about setting up git authentication. +#git-fetch-with-cli = true + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# The lint level for crates which do not have a detectable license +unlicensed = "deny" +# List of explicitly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + "MIT", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "Unicode-DFS-2016", +] +# List of explicitly disallowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +deny = [ + #"Nokia", +] +# Lint level for licenses considered copyleft +copyleft = "warn" +# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses +# * both - The license will be approved if it is both OSI-approved *AND* FSF +# * either - The license will be approved if it is either OSI-approved *OR* FSF +# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF +# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved +# * neither - This predicate is ignored and the default lint level is used +allow-osi-fsf-free = "neither" +# Lint level used when no other predicates are matched +# 1. License isn't in the allow or deny lists +# 2. License isn't copyleft +# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" +default = "deny" +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.8 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + #{ allow = ["Zlib"], name = "adler32", version = "*" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +#[[licenses.clarify]] +# The name of the crate the clarification applies to +#name = "ring" +# The optional version constraint for the crate +#version = "*" +# The SPDX expression for the license requirements of the crate +#expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +#license-files = [ + # Each entry is a crate relative path, and the (opaque) hash of its contents + #{ path = "LICENSE", hash = 0xbd0eed23 } +#] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries. +# To see how to mark a crate as unpublished (to the official registry), +# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. +ignore = false +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "warn" +# Lint level for when a crate version requirement is `*` +wildcards = "allow" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# List of crates that are allowed. Use with care! +allow = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# List of crates to deny +deny = [ + # Each entry the name of a crate and a version range. If version is + # not specified, all versions will be matched. + #{ name = "ansi_term", version = "=0.11.0" }, + # + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, +] +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite +skip-tree = [ + #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "warn" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "warn" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] + +[sources.allow-org] +# 1 or more github.com organizations to allow git sources for +#github = [""] +# 1 or more gitlab.com organizations to allow git sources for +#gitlab = [""] +# 1 or more bitbucket.org organizations to allow git sources for +#bitbucket = [""] diff --git a/rust/bssl-crypto/src/digest.rs b/rust/bssl-crypto/src/digest.rs new file mode 100644 index 0000000000..cecdfdfc98 --- /dev/null +++ b/rust/bssl-crypto/src/digest.rs @@ -0,0 +1,80 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +use crate::ForeignTypeRef; + +/// The BoringSSL implemented SHA-256 digest algorithm. +#[derive(Clone)] +pub struct Sha256 {} + +/// The BoringSSL implemented SHA-512 digest algorithm. +#[derive(Clone)] +pub struct Sha512 {} + +/// A reference to an [`Md`], which abstracts the details of a specific hash function allowing code +/// to deal with the concept of a "hash function" without needing to know exactly which hash function +/// it is. +pub(crate) struct MdRef; + +unsafe impl ForeignTypeRef for MdRef { + type CType = bssl_sys::EVP_MD; +} + +/// Used internally to get a BoringSSL internal MD +pub(crate) trait Md { + /// gets a reference to a message digest algorithm to be used by the hkdf implementation + fn get_md() -> &'static MdRef; +} + +impl Md for Sha256 { + fn get_md() -> &'static MdRef { + // Safety: + // - this always returns a valid pointer to an EVP_MD + unsafe { MdRef::from_ptr(bssl_sys::EVP_sha256() as *mut _) } + } +} + +impl Md for Sha512 { + fn get_md() -> &'static MdRef { + // Safety: + // - this always returns a valid pointer to an EVP_MD + unsafe { MdRef::from_ptr(bssl_sys::EVP_sha512() as *mut _) } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_sha256_c_type() { + unsafe { + assert_eq!( + MdRef::from_ptr(bssl_sys::EVP_sha256() as *mut _).as_ptr(), + bssl_sys::EVP_sha256() as *mut _ + ) + } + } + + #[test] + fn test_sha512_c_type() { + unsafe { + assert_eq!( + MdRef::from_ptr(bssl_sys::EVP_sha512() as *mut _).as_ptr(), + bssl_sys::EVP_sha512() as *mut _ + ) + } + } +} diff --git a/rust/bssl-crypto/src/hmac.rs b/rust/bssl-crypto/src/hmac.rs new file mode 100644 index 0000000000..829816cc70 --- /dev/null +++ b/rust/bssl-crypto/src/hmac.rs @@ -0,0 +1,391 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +use crate::{ + digest::{Md, Sha256, Sha512}, + CSlice, ForeignTypeRef as _, PanicResultHandler, +}; +use core::{ + ffi::{c_uint, c_void}, + marker::PhantomData, + ptr, +}; + +/// Computes the HMAC-SHA-256 of `data` as a one-shot operation. +/// +/// Calculates the HMAC of data, using the given `key` and returns the result. +/// It returns the computed hmac or `InvalidLength` of the input key size is too large. +/// Can panic if memory allocation fails in the underlying BoringSSL code. +pub fn hmac_sha_256(key: &[u8], data: &[u8]) -> Result<[u8; 32], InvalidLength> { + hmac::<32, Sha256>(key, data) +} + +/// Computes the HMAC-SHA-512 of `data` as a one-shot operation. +/// +/// Calculates the HMAC of data, using the given `key` and returns the result. +/// It returns the computed hmac or `InvalidLength` of the input key size is too large. +/// Can panic if memory allocation fails in the underlying BoringSSL code. +pub fn hmac_sha_512(key: &[u8], data: &[u8]) -> Result<[u8; 64], InvalidLength> { + hmac::<64, Sha512>(key, data) +} + +/// The BoringSSL HMAC-SHA-256 implementation. The operations may panic if memory allocation fails +/// in BoringSSL. +pub struct HmacSha256(Hmac<32, Sha256>); + +impl HmacSha256 { + /// Create a new hmac from a fixed size key. + pub fn new(key: [u8; 32]) -> Self { + Self(Hmac::new(key)) + } + + /// Create new hmac value from variable size key. + pub fn new_from_slice(key: &[u8]) -> Result { + Hmac::new_from_slice(key).map(Self) + } + + /// Update state using the provided data. + pub fn update(&mut self, data: &[u8]) { + self.0.update(data) + } + + /// Obtain the hmac computation consuming the hmac instance. + pub fn finalize(self) -> [u8; 32] { + self.0.finalize() + } + + /// Check that the tag value is correct for the processed input. + pub fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { + self.0.verify_slice(tag) + } + + /// Check that the tag value is correct for the processed input. + pub fn verify(self, tag: [u8; 32]) -> Result<(), MacError> { + self.0.verify(tag) + } + + /// Check truncated tag correctness using left side bytes of the calculated tag. + pub fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { + self.0.verify_truncated_left(tag) + } +} + +/// The BoringSSL HMAC-SHA-512 implementation. The operations may panic if memory allocation fails +/// in BoringSSL. +pub struct HmacSha512(Hmac<64, Sha512>); + +impl HmacSha512 { + /// Create a new hmac from a fixed size key. + pub fn new(key: [u8; 64]) -> Self { + Self(Hmac::new(key)) + } + + /// Create new hmac value from variable size key. + pub fn new_from_slice(key: &[u8]) -> Result { + Hmac::new_from_slice(key).map(Self) + } + + /// Update state using the provided data. + pub fn update(&mut self, data: &[u8]) { + self.0.update(data) + } + + /// Obtain the hmac computation consuming the hmac instance. + pub fn finalize(self) -> [u8; 64] { + self.0.finalize() + } + + /// Check that the tag value is correct for the processed input. + pub fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { + self.0.verify_slice(tag) + } + + /// Check that the tag value is correct for the processed input. + pub fn verify(self, tag: [u8; 64]) -> Result<(), MacError> { + self.0.verify(tag) + } + + /// Check truncated tag correctness using left side bytes of the calculated tag. + pub fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { + self.0.verify_truncated_left(tag) + } +} + +/// Error type for when the provided key material length is invalid. +#[derive(Debug)] +pub struct InvalidLength; + +/// Error type for when the output of the hmac operation is not equal to the expected value. +#[derive(Debug)] +pub struct MacError; + +/// Private generically implemented function for computing hmac as a oneshot operation. +/// This should only be exposed publicly by types with the correct output size `N` which corresponds +/// to the output size of the provided generic hash function. Ideally `N` would just come from `M`, +/// but this is not possible until the Rust language can support the `min_const_generics` feature. +/// Until then we will have to pass both separately: https://github.com/rust-lang/rust/issues/60551 +#[inline] +fn hmac(key: &[u8], data: &[u8]) -> Result<[u8; N], InvalidLength> { + let mut out = [0_u8; N]; + let mut size: c_uint = 0; + + // Safety: + // - buf always contains N bytes of space + // - If NULL is returned on error we panic immediately + unsafe { + bssl_sys::HMAC( + M::get_md().as_ptr(), + CSlice::from(key).as_ptr(), + key.len(), + CSlice::from(data).as_ptr(), + data.len(), + out.as_mut_ptr(), + &mut size as *mut c_uint, + ) + } + .panic_if_error(); + + Ok(out) +} + +/// Private generically implemented hmac instance given a generic hash function and a length `N`, +/// where `N` is the output size of the hash function. This should only be exposed publicly by +/// wrapper types with the correct output size `N` which corresponds to the output size of the +/// provided generic hash function. Ideally `N` would just come from `M`, but this is not possible +/// until the Rust language can support the `min_const_generics` feature. Until then we will have to +/// pass both separately: https://github.com/rust-lang/rust/issues/60551 +struct Hmac { + ctx: *mut bssl_sys::HMAC_CTX, + _marker: PhantomData, +} + +impl Hmac { + /// Infallible HMAC creation from a fixed length key. + fn new(key: [u8; N]) -> Self { + #[allow(clippy::expect_used)] + Self::new_from_slice(&key).expect("output length of hash is always a valid hmac key size") + } + + /// Create new hmac value from variable size key. Panics on allocation failure + /// returns InvalidLength if the key length is greater than the max message digest block size. + fn new_from_slice(key: &[u8]) -> Result { + (validate_key_len(key.len())) + .then(|| { + // Safety: + // - HMAC_CTX_new panics if allocation fails + let ctx = unsafe { bssl_sys::HMAC_CTX_new() }; + ctx.panic_if_error(); + + // Safety: + // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, + // which is the line above. + // - HMAC_Init_ex may return an error if key is null but the md is different from + // before. This is avoided here since key is guaranteed to be non-null. + // - HMAC_Init_ex returns 0 on allocation failure in which case we panic + unsafe { + bssl_sys::HMAC_Init_ex( + ctx, + CSlice::from(key).as_ptr() as *const c_void, + key.len(), + M::get_md().as_ptr(), + ptr::null_mut(), + ) + } + .panic_if_error(); + + Self { + ctx, + _marker: Default::default(), + } + }) + .ok_or(InvalidLength) + } + + /// Update state using the provided data, can be called repeatedly. + fn update(&mut self, data: &[u8]) { + unsafe { + // Safety: HMAC_Update will always return 1, in case it doesnt we panic + bssl_sys::HMAC_Update(self.ctx, data.as_ptr(), data.len()) + } + .panic_if_error() + } + + /// Obtain the hmac computation consuming the hmac instance. + fn finalize(self) -> [u8; N] { + let mut buf = [0_u8; N]; + let mut size: c_uint = 0; + // Safety: + // - hmac has a fixed size output of N which will never exceed the length of an N + // length array + // - on allocation failure we panic + unsafe { bssl_sys::HMAC_Final(self.ctx, buf.as_mut_ptr(), &mut size as *mut c_uint) } + .panic_if_error(); + buf + } + + /// Check that the tag value is correct for the processed input. + fn verify(self, tag: [u8; N]) -> Result<(), MacError> { + self.verify_slice(&tag) + } + + /// Check truncated tag correctness using all bytes + /// of calculated tag. + /// + /// Returns `Error` if `tag` is not valid or not equal in length + /// to MAC's output. + fn verify_slice(self, tag: &[u8]) -> Result<(), MacError> { + tag.len().eq(&N).then_some(()).ok_or(MacError)?; + self.verify_truncated_left(tag) + } + + /// Check truncated tag correctness using left side bytes + /// (i.e. `tag[..n]`) of calculated tag. + /// + /// Returns `Error` if `tag` is not valid or empty. + fn verify_truncated_left(self, tag: &[u8]) -> Result<(), MacError> { + let len = tag.len(); + if len == 0 || len > N { + return Err(MacError); + } + + let result = &self.finalize()[..len]; + + // Safety: + // - if a != b is undefined, it simply returns a non-zero result + unsafe { + bssl_sys::CRYPTO_memcmp( + CSlice::from(result).as_ptr() as *const c_void, + CSlice::from(tag).as_ptr() as *const c_void, + result.len(), + ) + } + .eq(&0) + .then_some(()) + .ok_or(MacError) + } +} + +impl Drop for Hmac { + fn drop(&mut self) { + unsafe { bssl_sys::HMAC_CTX_free(self.ctx) } + } +} + +// make sure key len is within a valid range +fn validate_key_len(len: usize) -> bool { + if len > bssl_sys::EVP_MAX_MD_BLOCK_SIZE as usize { + return false; + } + true +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hmac_sha256_test() { + let expected_hmac = [ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, + 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, + 0x2e, 0x32, 0xcf, 0xf7, + ]; + + let key: [u8; 20] = [0x0b; 20]; + let data = b"Hi There"; + + let mut hmac = HmacSha256::new_from_slice(&key).expect("length is valid"); + hmac.update(data); + let hmac_result: [u8; 32] = hmac.finalize(); + + // let hmac_result = + // hmac(Md::sha256(), &key, data, &mut out).expect("Couldn't calculate sha256 hmac"); + assert_eq!(&hmac_result, &expected_hmac); + } + + #[test] + fn hmac_sha256_fixed_size_key_test() { + let expected_hmac = [ + 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6, 0x99, 0x3, 0xa0, 0xf1, 0xcf, 0x2b, + 0xbd, 0xc5, 0xba, 0xa, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c, 0x7a, 0x3b, 0x16, 0x96, + 0xa0, 0xb6, 0x8c, 0xf7, + ]; + + let key: [u8; 32] = [0x0b; 32]; + let data = b"Hi There"; + + let mut hmac = HmacSha256::new(key); + hmac.update(data); + let hmac_result: [u8; 32] = hmac.finalize(); + assert_eq!(&hmac_result, &expected_hmac); + } + + #[test] + fn hmac_sha256_update_test() { + let expected_hmac = [ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, + 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, + 0x2e, 0x32, 0xcf, 0xf7, + ]; + let key: [u8; 20] = [0x0b; 20]; + let data = b"Hi There"; + let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key).expect(""); + hmac.update(data); + let result = hmac.finalize(); + assert_eq!(&result, &expected_hmac); + assert_eq!(result.len(), 32); + } + + #[test] + fn hmac_sha256_test_big_buffer() { + let expected_hmac = [ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, + 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, + 0x2e, 0x32, 0xcf, 0xf7, + ]; + let key: [u8; 20] = [0x0b; 20]; + let data = b"Hi There"; + let hmac_result = hmac_sha_256(&key, data).expect("Couldn't calculate sha256 hmac"); + assert_eq!(&hmac_result, &expected_hmac); + } + + #[test] + fn hmac_sha256_update_chunks_test() { + let expected_hmac = [ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, + 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, + 0x2e, 0x32, 0xcf, 0xf7, + ]; + let key: [u8; 20] = [0x0b; 20]; + let mut hmac = HmacSha256::new_from_slice(&key).expect("key is valid length"); + hmac.update(b"Hi"); + hmac.update(b" There"); + let result = hmac.finalize(); + assert_eq!(&result, &expected_hmac); + } + + #[test] + fn hmac_sha256_verify_test() { + let expected_hmac = [ + 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0xb, + 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x0, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, + 0x2e, 0x32, 0xcf, 0xf7, + ]; + let key: [u8; 20] = [0x0b; 20]; + let data = b"Hi There"; + let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key).expect(""); + hmac.update(data); + assert!(hmac.verify(expected_hmac).is_ok()) + } +} diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs new file mode 100644 index 0000000000..166f999cc4 --- /dev/null +++ b/rust/bssl-crypto/src/lib.rs @@ -0,0 +1,118 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#![deny( + missing_docs, + clippy::indexing_slicing, + clippy::unwrap_used, + clippy::panic, + clippy::expect_used +)] + +//! Rust boringssl binding + +extern crate core; +use core::ops::Not; + +/// BoringSSL implemented hmac operations. +pub mod hmac; + +/// BoringSSL implemented hash functions. +pub mod digest; + +/// Used for handling result types from C APIs. +trait PanicResultHandler { + /// Panics if a C api returns an invalid result + /// Used for APIs which return error codes for allocation failures. + fn panic_if_error(&self); +} + +impl PanicResultHandler for i32 { + /// BoringSSL APIs return 1 on success or 0 on allocation failure. + #[allow(clippy::expect_used)] + fn panic_if_error(&self) { + self.gt(&0).then_some(()).expect("allocation failed!") + } +} + +impl PanicResultHandler for *mut T { + /// Boringssl APIs return NULL on allocation failure for APIs that return a CTX. + #[allow(clippy::expect_used)] + fn panic_if_error(&self) { + self.is_null() + .not() + .then_some(()) + .expect("allocation failed!") + } +} + +struct CSlice<'a>(&'a [u8]); + +impl CSlice<'_> { + pub fn as_ptr(&self) -> *const T { + if self.0.is_empty() { + std::ptr::null() + } else { + self.0.as_ptr() as *const T + } + } +} + +impl<'a> From<&'a [u8]> for CSlice<'a> { + fn from(value: &'a [u8]) -> Self { + Self(value) + } +} + +/// A helper trait implemented by types which reference borrowed foreign types. +/// +/// # Safety +/// +/// Implementations of `ForeignTypeRef` must guarantee the following: +/// +/// - `Self::from_ptr(x).as_ptr() == x` +/// - `Self::from_mut_ptr(x).as_ptr() == x` +unsafe trait ForeignTypeRef: Sized { + /// The raw C type. + type CType; + + /// Constructs a shared instance of this type from its raw type. + /// + /// # Safety + /// + /// `ptr` must be a valid, immutable, instance of the type for the `'a` lifetime. + #[inline] + unsafe fn from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self { + debug_assert!(!ptr.is_null()); + &*(ptr as *mut _) + } + + /// Constructs a mutable reference of this type from its raw type. + /// + /// # Safety + /// + /// `ptr` must be a valid, unique, instance of the type for the `'a` lifetime. + #[inline] + unsafe fn from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self { + debug_assert!(!ptr.is_null()); + &mut *(ptr as *mut _) + } + + /// Returns a raw pointer to the wrapped value. + #[inline] + fn as_ptr(&self) -> *mut Self::CType { + self as *const _ as *mut _ + } +} diff --git a/rust/bssl-sys/CMakeLists.txt b/rust/bssl-sys/CMakeLists.txt new file mode 100644 index 0000000000..9b5c841229 --- /dev/null +++ b/rust/bssl-sys/CMakeLists.txt @@ -0,0 +1,40 @@ +# Additional interop for things like macros and inlined functions. +add_library(rust_wrapper STATIC rust_wrapper.c) +target_link_libraries(rust_wrapper crypto) + + +# Generate architecture-specific wrappers. +set(WRAPPER_TARGET ${CMAKE_BINARY_DIR}/rust/bssl-sys/src/wrapper_${RUST_BINDINGS}.rs) +set(COMMAND ${BINDGEN_EXECUTABLE} "wrapper.h" + -o ${WRAPPER_TARGET} + --no-derive-default + --enable-function-attribute-detection + --use-core + --size_t-is-usize + --default-macro-constant-type="signed" + --rustified-enum="point_conversion_form_t" + --allowlist-file=".*/include/openssl/.*\\.h" + --allowlist-file=".*/rust_wrapper\\.h" + -- # these are LLVM arg passthroughs + -I../../include + # https://doc.rust-lang.org/nightly/rustc/platform-support.html + --target=${RUST_BINDINGS}) + +set(INCLUDES "include!(\"wrapper_${RUST_BINDINGS}.rs\");\n") + +add_custom_target( + bindgen_rust_${RUST_BINDINGS} + ALL + ${COMMAND} + BYPRODUCTS ${WRAPPER_TARGET} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +# move files into build directory +configure_file("src/lib.rs" "src/lib.rs") + +if(NOT BUILD_SHARED_LIBS) + configure_file("build.rs" "build.rs" COPYONLY) +endif() + +configure_file("Cargo.toml" "Cargo.toml" COPYONLY) \ No newline at end of file diff --git a/rust/Cargo.toml b/rust/bssl-sys/Cargo.toml similarity index 81% rename from rust/Cargo.toml rename to rust/bssl-sys/Cargo.toml index 6a2bb40ad3..c5e61fd033 100644 --- a/rust/Cargo.toml +++ b/rust/bssl-sys/Cargo.toml @@ -3,6 +3,8 @@ name = "bssl-sys" version = "0.1.0" authors = ["Benjamin Brittain "] edition = "2018" +publish = false +license = "MIT" [dependencies] libc = "0.2" diff --git a/rust/README.md b/rust/bssl-sys/README.md similarity index 100% rename from rust/README.md rename to rust/bssl-sys/README.md diff --git a/rust/build.rs b/rust/bssl-sys/build.rs similarity index 77% rename from rust/build.rs rename to rust/bssl-sys/build.rs index b02922325e..955eae3c3a 100644 --- a/rust/build.rs +++ b/rust/bssl-sys/build.rs @@ -19,18 +19,21 @@ use std::path::Path; fn main() { let dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let crate_path = Path::new(&dir); - let parent_path = crate_path.parent().unwrap(); + + // building bssl-sys with: `mkdir build && cd build && cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja` + // outputs this crate to /build/rust/bssl-sys/ so need to go up 3 levels to the root of the repo + let repo_root = crate_path.parent().unwrap().parent().unwrap(); // Statically link libraries. println!( "cargo:rustc-link-search=native={}", - parent_path.join("crypto").display() + repo_root.join("crypto").display() ); println!("cargo:rustc-link-lib=static=crypto"); println!( "cargo:rustc-link-search=native={}", - parent_path.join("ssl").display() + repo_root.join("ssl").display() ); println!("cargo:rustc-link-lib=static=ssl"); diff --git a/rust/rust_wrapper.c b/rust/bssl-sys/rust_wrapper.c similarity index 100% rename from rust/rust_wrapper.c rename to rust/bssl-sys/rust_wrapper.c diff --git a/rust/rust_wrapper.h b/rust/bssl-sys/rust_wrapper.h similarity index 100% rename from rust/rust_wrapper.h rename to rust/bssl-sys/rust_wrapper.h diff --git a/rust/src/lib.rs b/rust/bssl-sys/src/lib.rs similarity index 100% rename from rust/src/lib.rs rename to rust/bssl-sys/src/lib.rs diff --git a/rust/bssl-sys/wrapper.h b/rust/bssl-sys/wrapper.h new file mode 100644 index 0000000000..101b455d94 --- /dev/null +++ b/rust/bssl-sys/wrapper.h @@ -0,0 +1,79 @@ +#include "../../include/openssl/aes.h" +#include "../../include/openssl/asn1.h" +#include "../../include/openssl/asn1_mac.h" +#include "../../include/openssl/asn1t.h" +#include "../../include/openssl/base.h" +#include "../../include/openssl/base64.h" +#include "../../include/openssl/bio.h" +#include "../../include/openssl/blake2.h" +#include "../../include/openssl/blowfish.h" +#include "../../include/openssl/bn.h" +#include "../../include/openssl/buf.h" +#include "../../include/openssl/buffer.h" +#include "../../include/openssl/bytestring.h" +#include "../../include/openssl/cast.h" +#include "../../include/openssl/chacha.h" +#include "../../include/openssl/cipher.h" +#include "../../include/openssl/cmac.h" +#include "../../include/openssl/conf.h" +#include "../../include/openssl/cpu.h" +#include "../../include/openssl/crypto.h" +#include "../../include/openssl/ctrdrbg.h" +#include "../../include/openssl/curve25519.h" +#include "../../include/openssl/des.h" +#include "../../include/openssl/dh.h" +#include "../../include/openssl/digest.h" +#include "../../include/openssl/dsa.h" +#include "../../include/openssl/dtls1.h" +#include "../../include/openssl/e_os2.h" +#include "../../include/openssl/ec.h" +#include "../../include/openssl/ec_key.h" +#include "../../include/openssl/ecdh.h" +#include "../../include/openssl/ecdsa.h" +#include "../../include/openssl/engine.h" +#include "../../include/openssl/err.h" +#include "../../include/openssl/evp.h" +#include "../../include/openssl/evp_errors.h" +#include "../../include/openssl/ex_data.h" +#include "../../include/openssl/hkdf.h" +#include "../../include/openssl/hmac.h" +#include "../../include/openssl/hpke.h" +#include "../../include/openssl/hrss.h" +#include "../../include/openssl/is_boringssl.h" +#include "../../include/openssl/kdf.h" +#include "../../include/openssl/lhash.h" +#include "../../include/openssl/md4.h" +#include "../../include/openssl/md5.h" +#include "../../include/openssl/mem.h" +#include "../../include/openssl/obj.h" +#include "../../include/openssl/obj_mac.h" +#include "../../include/openssl/objects.h" +#include "../../include/openssl/opensslconf.h" +#include "../../include/openssl/opensslv.h" +#include "../../include/openssl/ossl_typ.h" +#include "../../include/openssl/pem.h" +#include "../../include/openssl/pkcs12.h" +#include "../../include/openssl/pkcs7.h" +#include "../../include/openssl/pkcs8.h" +#include "../../include/openssl/poly1305.h" +#include "../../include/openssl/pool.h" +#include "../../include/openssl/rand.h" +#include "../../include/openssl/rc4.h" +#include "../../include/openssl/ripemd.h" +#include "../../include/openssl/rsa.h" +#include "../../include/openssl/safestack.h" +#include "../../include/openssl/sha.h" +#include "../../include/openssl/siphash.h" +#include "../../include/openssl/span.h" +#include "../../include/openssl/srtp.h" +#include "../../include/openssl/ssl.h" +#include "../../include/openssl/ssl3.h" +#include "../../include/openssl/stack.h" +#include "../../include/openssl/thread.h" +#include "../../include/openssl/tls1.h" +#include "../../include/openssl/trust_token.h" +#include "../../include/openssl/x509.h" +#include "../../include/openssl/x509_vfy.h" +#include "../../include/openssl/x509v3.h" + +#include "rust_wrapper.h" diff --git a/rust/wrapper.h b/rust/wrapper.h deleted file mode 100644 index 1d65c5a44f..0000000000 --- a/rust/wrapper.h +++ /dev/null @@ -1,79 +0,0 @@ -#include "../include/openssl/aes.h" -#include "../include/openssl/asn1.h" -#include "../include/openssl/asn1_mac.h" -#include "../include/openssl/asn1t.h" -#include "../include/openssl/base.h" -#include "../include/openssl/base64.h" -#include "../include/openssl/bio.h" -#include "../include/openssl/blake2.h" -#include "../include/openssl/blowfish.h" -#include "../include/openssl/bn.h" -#include "../include/openssl/buf.h" -#include "../include/openssl/buffer.h" -#include "../include/openssl/bytestring.h" -#include "../include/openssl/cast.h" -#include "../include/openssl/chacha.h" -#include "../include/openssl/cipher.h" -#include "../include/openssl/cmac.h" -#include "../include/openssl/conf.h" -#include "../include/openssl/cpu.h" -#include "../include/openssl/crypto.h" -#include "../include/openssl/ctrdrbg.h" -#include "../include/openssl/curve25519.h" -#include "../include/openssl/des.h" -#include "../include/openssl/dh.h" -#include "../include/openssl/digest.h" -#include "../include/openssl/dsa.h" -#include "../include/openssl/dtls1.h" -#include "../include/openssl/e_os2.h" -#include "../include/openssl/ec.h" -#include "../include/openssl/ec_key.h" -#include "../include/openssl/ecdh.h" -#include "../include/openssl/ecdsa.h" -#include "../include/openssl/engine.h" -#include "../include/openssl/err.h" -#include "../include/openssl/evp.h" -#include "../include/openssl/evp_errors.h" -#include "../include/openssl/ex_data.h" -#include "../include/openssl/hkdf.h" -#include "../include/openssl/hmac.h" -#include "../include/openssl/hpke.h" -#include "../include/openssl/hrss.h" -#include "../include/openssl/is_boringssl.h" -#include "../include/openssl/kdf.h" -#include "../include/openssl/lhash.h" -#include "../include/openssl/md4.h" -#include "../include/openssl/md5.h" -#include "../include/openssl/mem.h" -#include "../include/openssl/obj.h" -#include "../include/openssl/obj_mac.h" -#include "../include/openssl/objects.h" -#include "../include/openssl/opensslconf.h" -#include "../include/openssl/opensslv.h" -#include "../include/openssl/ossl_typ.h" -#include "../include/openssl/pem.h" -#include "../include/openssl/pkcs12.h" -#include "../include/openssl/pkcs7.h" -#include "../include/openssl/pkcs8.h" -#include "../include/openssl/poly1305.h" -#include "../include/openssl/pool.h" -#include "../include/openssl/rand.h" -#include "../include/openssl/rc4.h" -#include "../include/openssl/ripemd.h" -#include "../include/openssl/rsa.h" -#include "../include/openssl/safestack.h" -#include "../include/openssl/sha.h" -#include "../include/openssl/siphash.h" -#include "../include/openssl/span.h" -#include "../include/openssl/srtp.h" -#include "../include/openssl/ssl.h" -#include "../include/openssl/ssl3.h" -#include "../include/openssl/stack.h" -#include "../include/openssl/thread.h" -#include "../include/openssl/tls1.h" -#include "../include/openssl/trust_token.h" -#include "../include/openssl/x509.h" -#include "../include/openssl/x509_vfy.h" -#include "../include/openssl/x509v3.h" - -#include "rust_wrapper.h" From 6f3e8229bb10882688c3ad1b0a76154e61934c77 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 14 Mar 2023 09:43:58 -0600 Subject: [PATCH 136/177] Rust build cleanup Add Cargo.lock to .gitignore for rust/bssl-crypto and remove generated file Clean up cargo deny warnings and set reasonable starting point in deny.toml Change-Id: I0b925408ab6b7947b1b01282bac803feb769421a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57985 Reviewed-by: Nabil Wadih Reviewed-by: David Benjamin Commit-Queue: Bob Beck --- .gitignore | 1 + rust/bssl-crypto/Cargo.lock | 14 -------------- rust/bssl-crypto/deny.toml | 6 ++---- 3 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 rust/bssl-crypto/Cargo.lock diff --git a/.gitignore b/.gitignore index ac0ede8464..3e22141d95 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ ssl/test/runner/runner doc/*.html doc/doc.css rust/Cargo.lock +rust/bssl-crypto/Cargo.lock rust/target util/bot/android_ndk diff --git a/rust/bssl-crypto/Cargo.lock b/rust/bssl-crypto/Cargo.lock deleted file mode 100644 index ed7fe34d36..0000000000 --- a/rust/bssl-crypto/Cargo.lock +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bssl-crypto" -version = "0.1.0" -dependencies = [ - "bssl-sys", -] - -[[package]] -name = "bssl-sys" -version = "0.1.0" diff --git a/rust/bssl-crypto/deny.toml b/rust/bssl-crypto/deny.toml index d398485e3e..e521047429 100644 --- a/rust/bssl-crypto/deny.toml +++ b/rust/bssl-crypto/deny.toml @@ -78,8 +78,6 @@ unlicensed = "deny" allow = [ "MIT", "Apache-2.0", - "Apache-2.0 WITH LLVM-exception", - "Unicode-DFS-2016", ] # List of explicitly disallowed licenses # See https://spdx.org/licenses/ for list of possible licenses @@ -88,7 +86,7 @@ deny = [ #"Nokia", ] # Lint level for licenses considered copyleft -copyleft = "warn" +copyleft = "deny" # Blanket approval or denial for OSI-approved or FSF Free/Libre licenses # * both - The license will be approved if it is both OSI-approved *AND* FSF # * either - The license will be approved if it is either OSI-approved *OR* FSF @@ -152,7 +150,7 @@ registries = [ # https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html [bans] # Lint level for when multiple versions of the same crate are detected -multiple-versions = "warn" +multiple-versions = "deny" # Lint level for when a crate version requirement is `*` wildcards = "allow" # The graph highlighting used when creating dotgraphs for crates From 39da68f22fb420d069c1e0b2796e53c728839437 Mon Sep 17 00:00:00 2001 From: Nabil Wadih Date: Thu, 16 Feb 2023 18:07:41 -0800 Subject: [PATCH 137/177] Rust bindings to boringssl plain AES implementation Change-Id: Idbf0be16fbda2f0cb2444837021d4f95c29a1857 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57405 Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- rust/bssl-crypto/Cargo.toml | 5 +- rust/bssl-crypto/src/aes.rs | 232 ++++++++++++++++++++++++++++++++++++ rust/bssl-crypto/src/lib.rs | 3 + 3 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 rust/bssl-crypto/src/aes.rs diff --git a/rust/bssl-crypto/Cargo.toml b/rust/bssl-crypto/Cargo.toml index 57a64401e8..552f0446ad 100644 --- a/rust/bssl-crypto/Cargo.toml +++ b/rust/bssl-crypto/Cargo.toml @@ -8,4 +8,7 @@ license = "MIT" [dependencies] # the crate will need to be generated at this path by running this command at root # `mkdir build && cd build && cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja` -bssl-sys = {path = "../../build/rust/bssl-sys"} \ No newline at end of file +bssl-sys = {path = "../../build/rust/bssl-sys"} + +[dev-dependencies] +hex-literal = "0.3.4" \ No newline at end of file diff --git a/rust/bssl-crypto/src/aes.rs b/rust/bssl-crypto/src/aes.rs new file mode 100644 index 0000000000..0a354db7cd --- /dev/null +++ b/rust/bssl-crypto/src/aes.rs @@ -0,0 +1,232 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/// Block size in bytes for AES. +pub const BLOCK_SIZE: usize = bssl_sys::AES_BLOCK_SIZE as usize; + +/// A single AES block. +pub type AesBlock = [u8; BLOCK_SIZE]; + +/// AES implementation used for encrypting/decrypting a single `AesBlock` at a time. +pub struct Aes; + +impl Aes { + /// Encrypt `block` in place. + pub fn encrypt(key: &AesEncryptKey, block: &mut AesBlock) { + let input = *block; + // Safety: + // - AesBlock is always a valid size and key is guaranteed to already be initialized. + unsafe { bssl_sys::AES_encrypt(input.as_ptr(), block.as_mut_ptr(), &key.0) } + } + + /// Decrypt `block` in place. + pub fn decrypt(key: &AesDecryptKey, block: &mut AesBlock) { + let input = *block; + // Safety: + // - AesBlock is always a valid size and key is guaranteed to already be initialized. + unsafe { bssl_sys::AES_decrypt(input.as_ptr(), block.as_mut_ptr(), &key.0) } + } +} + +/// An initialized key which can be used for encrypting. +pub struct AesEncryptKey(bssl_sys::AES_KEY); + +impl AesEncryptKey { + /// Initializes an encryption key from an appropriately sized array of bytes for AES-128 operations. + pub fn new_aes_128(key: [u8; 16]) -> AesEncryptKey { + new_encrypt_key(key) + } + + /// Initializes an encryption key from an appropriately sized array of bytes for AES-256 operations. + pub fn new_aes_256(key: [u8; 32]) -> AesEncryptKey { + new_encrypt_key(key) + } +} + +/// An initialized key which can be used for decrypting +pub struct AesDecryptKey(bssl_sys::AES_KEY); + +impl AesDecryptKey { + /// Initializes a decryption key from an appropriately sized array of bytes for AES-128 operations. + pub fn new_aes_128(key: [u8; 16]) -> AesDecryptKey { + new_decrypt_key(key) + } + + /// Initializes a decryption key from an appropriately sized array of bytes for AES-256 operations. + pub fn new_aes_256(key: [u8; 32]) -> AesDecryptKey { + new_decrypt_key(key) + } +} + +/// Private generically implemented function for creating a new `AesEncryptKey` from an array of bytes. +/// This should only be publicly exposed by wrapper types with the correct key lengths +fn new_encrypt_key(key: [u8; N]) -> AesEncryptKey { + let mut enc_key_uninit = core::mem::MaybeUninit::uninit(); + + // Safety: + // - key is guaranteed to point to bits/8 bytes determined by the len() * 8 used below. + // - bits is always a valid AES key size, as defined by the new_aes_* fns defined on the public + // key structs. + // The expect will never be hit since input key is always a valid AES key size. + #[allow(clippy::expect_used)] + unsafe { + bssl_sys::AES_set_encrypt_key( + key.as_ptr(), + key.len() as core::ffi::c_uint * 8, + enc_key_uninit.as_mut_ptr(), + ) + } + .eq(&0) + .then_some(()) + .expect("bssl_sys::AES_set_encrypt_key unexpectedly failed"); + + // Safety: + // - since we have checked above that initialization succeeded, this will never be UB + let enc_key = unsafe { enc_key_uninit.assume_init() }; + + AesEncryptKey(enc_key) +} + +/// Private generically implemented function for creating a new `AesDecryptKey` from an array of bytes. +/// This should only be publicly exposed by wrapper types with the correct key lengths. +fn new_decrypt_key(key: [u8; N]) -> AesDecryptKey { + let mut dec_key_uninit = core::mem::MaybeUninit::uninit(); + + // Safety: + // - key is guaranteed to point to bits/8 bytes determined by the len() * 8 used below. + // - bits is always a valid AES key size, as defined by the new_aes_* fns defined on the public + // key structs. + // The expect will never be hit since input key is always a valid AES key size. + #[allow(clippy::expect_used)] + unsafe { + bssl_sys::AES_set_decrypt_key( + key.as_ptr(), + key.len() as core::ffi::c_uint * 8, + dec_key_uninit.as_mut_ptr(), + ) + } + .eq(&0) + .then_some(()) + .expect("bssl_sys::AES_set_decrypt_key unexpectedly failed"); + + // Safety: + // - Since we have checked above that initialization succeeded, this will never be UB. + let dec_key = unsafe { dec_key_uninit.assume_init() }; + + AesDecryptKey(dec_key) +} + +#[cfg(test)] +mod tests { + use crate::aes::{Aes, AesDecryptKey, AesEncryptKey}; + use hex_literal::hex; + + // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.1 + #[test] + fn aes_128_test_encrypt() { + let key = AesEncryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c")); + let mut block = [0_u8; 16]; + + block.copy_from_slice(&hex!("6bc1bee22e409f96e93d7e117393172a")); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("3ad77bb40d7a3660a89ecaf32466ef97"), block); + + block.copy_from_slice(&hex!("ae2d8a571e03ac9c9eb76fac45af8e51")); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("f5d3d58503b9699de785895a96fdbaaf"), block); + + block.copy_from_slice(&hex!("30c81c46a35ce411e5fbc1191a0a52ef")); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("43b1cd7f598ece23881b00e3ed030688"), block); + + block.copy_from_slice(&hex!("f69f2445df4f9b17ad2b417be66c3710")); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("7b0c785e27e8ad3f8223207104725dd4"), block); + } + + // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.2 + #[test] + fn aes_128_test_decrypt() { + let key = AesDecryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c")); + let mut block = [0_u8; 16]; + + block.copy_from_slice(&hex!("3ad77bb40d7a3660a89ecaf32466ef97")); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block); + + block.copy_from_slice(&hex!("f5d3d58503b9699de785895a96fdbaaf")); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + + block.copy_from_slice(&hex!("43b1cd7f598ece23881b00e3ed030688")); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block); + + block.copy_from_slice(&hex!("7b0c785e27e8ad3f8223207104725dd4")); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block); + } + + // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.5 + #[test] + pub fn aes_256_test_encrypt() { + let key = AesEncryptKey::new_aes_256(hex!( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" + )); + let mut block: [u8; 16]; + + block = hex!("6bc1bee22e409f96e93d7e117393172a"); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("f3eed1bdb5d2a03c064b5a7e3db181f8"), block); + + block = hex!("ae2d8a571e03ac9c9eb76fac45af8e51"); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("591ccb10d410ed26dc5ba74a31362870"), block); + + block = hex!("30c81c46a35ce411e5fbc1191a0a52ef"); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("b6ed21b99ca6f4f9f153e7b1beafed1d"), block); + + block = hex!("f69f2445df4f9b17ad2b417be66c3710"); + Aes::encrypt(&key, &mut block); + assert_eq!(hex!("23304b7a39f9f3ff067d8d8f9e24ecc7"), block); + } + + // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.6 + #[test] + fn aes_256_test_decrypt() { + let key = AesDecryptKey::new_aes_256(hex!( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" + )); + + let mut block: [u8; 16]; + + block = hex!("f3eed1bdb5d2a03c064b5a7e3db181f8"); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block); + + block = hex!("591ccb10d410ed26dc5ba74a31362870"); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + + block = hex!("b6ed21b99ca6f4f9f153e7b1beafed1d"); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block); + + block = hex!("23304b7a39f9f3ff067d8d8f9e24ecc7"); + Aes::decrypt(&key, &mut block); + assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block); + } +} diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs index 166f999cc4..2c8ac72711 100644 --- a/rust/bssl-crypto/src/lib.rs +++ b/rust/bssl-crypto/src/lib.rs @@ -26,6 +26,9 @@ extern crate core; use core::ops::Not; +/// BoringSSL implemented plain aes operations. +pub mod aes; + /// BoringSSL implemented hmac operations. pub mod hmac; From 50bc2ea0e8f60fec17dad62ef6e54a8aed284511 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Mar 2023 18:28:20 -0400 Subject: [PATCH 138/177] Tidy up HMAC_Init_ex slightly Guarding the OPENSSL_memset was unnecessary since OPENSSL_memset with zero length works fine. Also OPENSSL_memset, to workaround a C bug, internally does the same check anyway. (But also this wasn't a context where the C bug applied.) Also don't bother calling EVP_MD_block_size a second time when we already saved it into block_size. Finally, don't bother filling key_block up to the whole EVP_MAX_MD_BLOCK_SIZE size. I could believe the fixed size is easier for the compiler to optimize, but the XORs in setting up an HMAC cannot possibly be performance-sensitive, and using the actual length is clearer. Also add an assert that the hash's output size fits in the block size. We're implicitly relying on this when hashing the key down. Change-Id: I6ce37d41ea5bdbc8890bde7910e1b5651bc35709 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58027 Reviewed-by: Adam Langley Commit-Queue: David Benjamin Auto-Submit: David Benjamin Commit-Queue: Adam Langley --- crypto/fipsmodule/hmac/hmac.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/crypto/fipsmodule/hmac/hmac.c b/crypto/fipsmodule/hmac/hmac.c index ca774bc05e..c6f12e2ab7 100644 --- a/crypto/fipsmodule/hmac/hmac.c +++ b/crypto/fipsmodule/hmac/hmac.c @@ -151,6 +151,7 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, size_t key_len, size_t block_size = EVP_MD_block_size(md); assert(block_size <= sizeof(key_block)); + assert(EVP_MD_size(md) <= block_size); if (block_size < key_len) { // Long keys are hashed. if (!EVP_DigestInit_ex(&ctx->md_ctx, md, impl) || @@ -164,23 +165,21 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, size_t key_len, key_block_len = (unsigned)key_len; } // Keys are then padded with zeros. - if (key_block_len != EVP_MAX_MD_BLOCK_SIZE) { - OPENSSL_memset(&key_block[key_block_len], 0, sizeof(key_block) - key_block_len); - } + OPENSSL_memset(key_block + key_block_len, 0, block_size - key_block_len); - for (size_t i = 0; i < EVP_MAX_MD_BLOCK_SIZE; i++) { + for (size_t i = 0; i < block_size; i++) { pad[i] = 0x36 ^ key_block[i]; } if (!EVP_DigestInit_ex(&ctx->i_ctx, md, impl) || - !EVP_DigestUpdate(&ctx->i_ctx, pad, EVP_MD_block_size(md))) { + !EVP_DigestUpdate(&ctx->i_ctx, pad, block_size)) { goto out; } - for (size_t i = 0; i < EVP_MAX_MD_BLOCK_SIZE; i++) { + for (size_t i = 0; i < block_size; i++) { pad[i] = 0x5c ^ key_block[i]; } if (!EVP_DigestInit_ex(&ctx->o_ctx, md, impl) || - !EVP_DigestUpdate(&ctx->o_ctx, pad, EVP_MD_block_size(md))) { + !EVP_DigestUpdate(&ctx->o_ctx, pad, block_size)) { goto out; } From d0cff637a25b8323578729a01575b62001967bc8 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Mar 2023 17:42:04 -0400 Subject: [PATCH 139/177] Test that X509_NAMEs sort their RDNs when encoding. RDNs are a SET OF attributes which means they should be sorted by DER encoding length, then lexicographically. We didn't have any test coverage for this. Bug: 548 Change-Id: I542196aae26984aeee4f1c6774878b121675b0dc Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58025 Commit-Queue: Bob Beck Reviewed-by: Bob Beck Auto-Submit: David Benjamin --- crypto/x509/x509_test.cc | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index d80ee19722..737cb1058a 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -6414,3 +6414,83 @@ TEST(X509Test, AddUnserializableExtension) { ASSERT_TRUE(X509_EXTENSION_set_object(ext.get(), OBJ_nid2obj(NID_undef))); EXPECT_FALSE(X509_add_ext(x509.get(), ext.get(), /*loc=*/-1)); } + +// Test that, when constructing an |X509_NAME|, names are sorted by DER order. +TEST(X509Test, SortRDN) { + bssl::UniquePtr name(X509_NAME_new()); + ASSERT_TRUE(name); + + auto append_entry_new_rdn = [&](const char *str) { + return X509_NAME_add_entry_by_NID(name.get(), NID_commonName, MBSTRING_ASC, + reinterpret_cast(str), + strlen(str), /*loc=*/-1, /*set=*/0); + }; + auto append_entry_prev_rdn = [&](const char *str) { + return X509_NAME_add_entry_by_NID(name.get(), NID_commonName, MBSTRING_ASC, + reinterpret_cast(str), + strlen(str), /*loc=*/-1, /*set=*/-1); + }; + + // This is the sort order to expect. + ASSERT_TRUE(append_entry_new_rdn("A")); + ASSERT_TRUE(append_entry_prev_rdn("B")); + ASSERT_TRUE(append_entry_prev_rdn("AA")); + ASSERT_TRUE(append_entry_prev_rdn("AB")); + + // The same RDN, with entries added in a different order. + ASSERT_TRUE(append_entry_new_rdn("AB")); + ASSERT_TRUE(append_entry_prev_rdn("AA")); + ASSERT_TRUE(append_entry_prev_rdn("B")); + ASSERT_TRUE(append_entry_prev_rdn("A")); + + // The same RDN, with entries added in a different order. + ASSERT_TRUE(append_entry_new_rdn("A")); + ASSERT_TRUE(append_entry_prev_rdn("AA")); + ASSERT_TRUE(append_entry_prev_rdn("B")); + ASSERT_TRUE(append_entry_prev_rdn("AB")); + + uint8_t *der = nullptr; + int der_len = i2d_X509_NAME(name.get(), &der); + ASSERT_GT(der_len, 0); + bssl::UniquePtr free_der(der); + + // SEQUENCE { + // SET { + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "A" } + // } + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "B" } + // } + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "AA" } + // } + // SEQUENCE { + // # commonName + // OBJECT_IDENTIFIER { 2.5.4.3 } + // UTF8String { "AB" } + // } + // } + // ...two more copies of the above SET... + // } + static uint8_t kExpected[] = { + 0x30, 0x81, 0x84, 0x31, 0x2a, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x01, 0x41, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x01, + 0x42, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x02, 0x41, 0x41, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x02, 0x41, 0x42, 0x31, + 0x2a, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x01, 0x41, 0x30, + 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x01, 0x42, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x02, 0x41, 0x41, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x02, 0x41, 0x42, 0x31, 0x2a, 0x30, 0x08, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x01, 0x41, 0x30, 0x08, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x01, 0x42, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x02, 0x41, 0x41, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x02, 0x41, 0x42}; + EXPECT_EQ(Bytes(kExpected), Bytes(der, der_len)); +} From 8c7aa6bfcd7573d7b904fde6acb4f3652a3ebecc Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 14 Mar 2023 17:42:16 -0400 Subject: [PATCH 140/177] Const-correct and document a few functions in x509v3.h. Change-Id: I59bcacf10a59ffdf9709785727f5f8b73c992f6e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58026 Auto-Submit: David Benjamin Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- crypto/x509v3/v3_alt.c | 17 ++++++++--------- crypto/x509v3/v3_genn.c | 2 +- include/openssl/x509v3.h | 18 ++++++++++++++---- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/crypto/x509v3/v3_alt.c b/crypto/x509v3/v3_alt.c index 858ef4d13b..ddd112a2eb 100644 --- a/crypto/x509v3/v3_alt.c +++ b/crypto/x509v3/v3_alt.c @@ -97,11 +97,11 @@ const X509V3_EXT_METHOD v3_alt[] = { }; STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(const X509V3_EXT_METHOD *method, - GENERAL_NAMES *gens, + const GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret) { int ret_was_null = ret == NULL; for (size_t i = 0; i < sk_GENERAL_NAME_num(gens); i++) { - GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); + const GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); STACK_OF(CONF_VALUE) *tmp = i2v_GENERAL_NAME(method, gen, ret); if (tmp == NULL) { if (ret_was_null) { @@ -118,7 +118,7 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(const X509V3_EXT_METHOD *method, } STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method, - GENERAL_NAME *gen, + const GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret) { // Note the error-handling for this function relies on there being at most // one |X509V3_add_value| call. If there were two and the second failed, we @@ -207,9 +207,7 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(const X509V3_EXT_METHOD *method, return ret; } -int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { - unsigned char *p; - int i; +int GENERAL_NAME_print(BIO *out, const GENERAL_NAME *gen) { switch (gen->type) { case GEN_OTHERNAME: BIO_printf(out, "othername:"); @@ -244,13 +242,13 @@ int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE); break; - case GEN_IPADD: - p = gen->d.ip->data; + case GEN_IPADD: { + const unsigned char *p = gen->d.ip->data; if (gen->d.ip->length == 4) { BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]); } else if (gen->d.ip->length == 16) { BIO_printf(out, "IP Address"); - for (i = 0; i < 8; i++) { + for (int i = 0; i < 8; i++) { uint16_t v = ((uint16_t)p[0] << 8) | p[1]; BIO_printf(out, ":%X", v); p += 2; @@ -261,6 +259,7 @@ int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { break; } break; + } case GEN_RID: BIO_printf(out, "Registered ID"); diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c index d593727b0d..609c5dae4f 100644 --- a/crypto/x509v3/v3_genn.c +++ b/crypto/x509v3/v3_genn.c @@ -124,7 +124,7 @@ static int edipartyname_cmp(const EDIPARTYNAME *a, const EDIPARTYNAME *b) { } // Returns 0 if they are equal, != 0 otherwise. -static int othername_cmp(OTHERNAME *a, OTHERNAME *b) { +static int othername_cmp(const OTHERNAME *a, const OTHERNAME *b) { int result = -1; if (!a || !b) { diff --git a/include/openssl/x509v3.h b/include/openssl/x509v3.h index a26e361cd8..c8548f7739 100644 --- a/include/openssl/x509v3.h +++ b/include/openssl/x509v3.h @@ -421,9 +421,15 @@ OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a); // human-readable print functions. If extracting a SAN list from a certificate, // look at |gen| directly. OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME( - const X509V3_EXT_METHOD *method, GENERAL_NAME *gen, + const X509V3_EXT_METHOD *method, const GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret); -OPENSSL_EXPORT int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +// GENERAL_NAME_print prints a human-readable representation of |gen| to |out|. +// It returns one on success and zero on error. +// +// TODO(davidben): Actually, it just returns one and doesn't check for I/O or +// allocation errors. But it should return zero on error. +OPENSSL_EXPORT int GENERAL_NAME_print(BIO *out, const GENERAL_NAME *gen); // TODO(https://crbug.com/boringssl/407): This is not const because it contains // an |X509_NAME|. @@ -439,7 +445,7 @@ DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) // human-readable print functions. If extracting a SAN list from a certificate, // look at |gen| directly. OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES( - const X509V3_EXT_METHOD *method, GENERAL_NAMES *gen, + const X509V3_EXT_METHOD *method, const GENERAL_NAMES *gen, STACK_OF(CONF_VALUE) *extlist); OPENSSL_EXPORT GENERAL_NAMES *v2i_GENERAL_NAMES( const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, @@ -457,8 +463,12 @@ OPENSSL_EXPORT int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, ASN1_OBJECT **poid, ASN1_TYPE **pvalue); +// i2s_ASN1_OCTET_STRING returns a human-readable representation of |oct| as a +// newly-allocated, NUL-terminated string, or NULL on error. |method| is +// ignored. The caller must release the result with |OPENSSL_free| when done. OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, - const ASN1_OCTET_STRING *ia5); + const ASN1_OCTET_STRING *oct); + OPENSSL_EXPORT ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING( const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str); From 3002573119a976c0dc968f04f57951f4aa335fe1 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Tue, 14 Mar 2023 16:58:32 -0600 Subject: [PATCH 141/177] Hmac should be able to take longer keys HMAC hashes long keys internally using the provided hash function. This removes the arbitrary limit of EVP_MAX_MD_SIZE on the length of the key. Change-Id: I56d68cbd2ddaf1f5f1fa4ecc40105b00b2ccd87c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58006 Reviewed-by: Nabil Wadih Commit-Queue: Bob Beck Reviewed-by: David Benjamin --- rust/bssl-crypto/src/hmac.rs | 104 +++++++++++++++-------------------- 1 file changed, 43 insertions(+), 61 deletions(-) diff --git a/rust/bssl-crypto/src/hmac.rs b/rust/bssl-crypto/src/hmac.rs index 829816cc70..393396688a 100644 --- a/rust/bssl-crypto/src/hmac.rs +++ b/rust/bssl-crypto/src/hmac.rs @@ -25,18 +25,18 @@ use core::{ /// Computes the HMAC-SHA-256 of `data` as a one-shot operation. /// /// Calculates the HMAC of data, using the given `key` and returns the result. -/// It returns the computed hmac or `InvalidLength` of the input key size is too large. +/// It returns the computed hmac. /// Can panic if memory allocation fails in the underlying BoringSSL code. -pub fn hmac_sha_256(key: &[u8], data: &[u8]) -> Result<[u8; 32], InvalidLength> { +pub fn hmac_sha_256(key: &[u8], data: &[u8]) -> [u8; 32] { hmac::<32, Sha256>(key, data) } /// Computes the HMAC-SHA-512 of `data` as a one-shot operation. /// /// Calculates the HMAC of data, using the given `key` and returns the result. -/// It returns the computed hmac or `InvalidLength` of the input key size is too large. +/// It returns the computed hmac. /// Can panic if memory allocation fails in the underlying BoringSSL code. -pub fn hmac_sha_512(key: &[u8], data: &[u8]) -> Result<[u8; 64], InvalidLength> { +pub fn hmac_sha_512(key: &[u8], data: &[u8]) -> [u8; 64] { hmac::<64, Sha512>(key, data) } @@ -51,8 +51,8 @@ impl HmacSha256 { } /// Create new hmac value from variable size key. - pub fn new_from_slice(key: &[u8]) -> Result { - Hmac::new_from_slice(key).map(Self) + pub fn new_from_slice(key: &[u8]) -> Self { + Self(Hmac::new_from_slice(key)) } /// Update state using the provided data. @@ -92,8 +92,8 @@ impl HmacSha512 { } /// Create new hmac value from variable size key. - pub fn new_from_slice(key: &[u8]) -> Result { - Hmac::new_from_slice(key).map(Self) + pub fn new_from_slice(key: &[u8]) -> Self { + Self(Hmac::new_from_slice(key)) } /// Update state using the provided data. @@ -122,10 +122,6 @@ impl HmacSha512 { } } -/// Error type for when the provided key material length is invalid. -#[derive(Debug)] -pub struct InvalidLength; - /// Error type for when the output of the hmac operation is not equal to the expected value. #[derive(Debug)] pub struct MacError; @@ -136,7 +132,7 @@ pub struct MacError; /// but this is not possible until the Rust language can support the `min_const_generics` feature. /// Until then we will have to pass both separately: https://github.com/rust-lang/rust/issues/60551 #[inline] -fn hmac(key: &[u8], data: &[u8]) -> Result<[u8; N], InvalidLength> { +fn hmac(key: &[u8], data: &[u8]) -> [u8; N] { let mut out = [0_u8; N]; let mut size: c_uint = 0; @@ -156,7 +152,7 @@ fn hmac(key: &[u8], data: &[u8]) -> Result<[u8; N], Inval } .panic_if_error(); - Ok(out) + out } /// Private generically implemented hmac instance given a generic hash function and a length `N`, @@ -173,43 +169,37 @@ struct Hmac { impl Hmac { /// Infallible HMAC creation from a fixed length key. fn new(key: [u8; N]) -> Self { - #[allow(clippy::expect_used)] - Self::new_from_slice(&key).expect("output length of hash is always a valid hmac key size") + Self::new_from_slice(&key) } /// Create new hmac value from variable size key. Panics on allocation failure - /// returns InvalidLength if the key length is greater than the max message digest block size. - fn new_from_slice(key: &[u8]) -> Result { - (validate_key_len(key.len())) - .then(|| { - // Safety: - // - HMAC_CTX_new panics if allocation fails - let ctx = unsafe { bssl_sys::HMAC_CTX_new() }; - ctx.panic_if_error(); - - // Safety: - // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, - // which is the line above. - // - HMAC_Init_ex may return an error if key is null but the md is different from - // before. This is avoided here since key is guaranteed to be non-null. - // - HMAC_Init_ex returns 0 on allocation failure in which case we panic - unsafe { - bssl_sys::HMAC_Init_ex( - ctx, - CSlice::from(key).as_ptr() as *const c_void, - key.len(), - M::get_md().as_ptr(), - ptr::null_mut(), - ) - } - .panic_if_error(); - - Self { - ctx, - _marker: Default::default(), - } - }) - .ok_or(InvalidLength) + fn new_from_slice(key: &[u8]) -> Self { + // Safety: + // - HMAC_CTX_new panics if allocation fails + let ctx = unsafe { bssl_sys::HMAC_CTX_new() }; + ctx.panic_if_error(); + + // Safety: + // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, + // which is the line above. + // - HMAC_Init_ex may return an error if key is null but the md is different from + // before. This is avoided here since key is guaranteed to be non-null. + // - HMAC_Init_ex returns 0 on allocation failure in which case we panic + unsafe { + bssl_sys::HMAC_Init_ex( + ctx, + CSlice::from(key).as_ptr() as *const c_void, + key.len(), + M::get_md().as_ptr(), + ptr::null_mut(), + ) + } + .panic_if_error(); + + Self { + ctx, + _marker: Default::default(), + } } /// Update state using the provided data, can be called repeatedly. @@ -282,14 +272,6 @@ impl Drop for Hmac { } } -// make sure key len is within a valid range -fn validate_key_len(len: usize) -> bool { - if len > bssl_sys::EVP_MAX_MD_BLOCK_SIZE as usize { - return false; - } - true -} - #[cfg(test)] mod tests { use super::*; @@ -305,7 +287,7 @@ mod tests { let key: [u8; 20] = [0x0b; 20]; let data = b"Hi There"; - let mut hmac = HmacSha256::new_from_slice(&key).expect("length is valid"); + let mut hmac = HmacSha256::new_from_slice(&key); hmac.update(data); let hmac_result: [u8; 32] = hmac.finalize(); @@ -340,7 +322,7 @@ mod tests { ]; let key: [u8; 20] = [0x0b; 20]; let data = b"Hi There"; - let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key).expect(""); + let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key); hmac.update(data); let result = hmac.finalize(); assert_eq!(&result, &expected_hmac); @@ -356,7 +338,7 @@ mod tests { ]; let key: [u8; 20] = [0x0b; 20]; let data = b"Hi There"; - let hmac_result = hmac_sha_256(&key, data).expect("Couldn't calculate sha256 hmac"); + let hmac_result = hmac_sha_256(&key, data); assert_eq!(&hmac_result, &expected_hmac); } @@ -368,7 +350,7 @@ mod tests { 0x2e, 0x32, 0xcf, 0xf7, ]; let key: [u8; 20] = [0x0b; 20]; - let mut hmac = HmacSha256::new_from_slice(&key).expect("key is valid length"); + let mut hmac = HmacSha256::new_from_slice(&key); hmac.update(b"Hi"); hmac.update(b" There"); let result = hmac.finalize(); @@ -384,7 +366,7 @@ mod tests { ]; let key: [u8; 20] = [0x0b; 20]; let data = b"Hi There"; - let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key).expect(""); + let mut hmac: HmacSha256 = HmacSha256::new_from_slice(&key); hmac.update(data); assert!(hmac.verify(expected_hmac).is_ok()) } From 74646566e93de7551bfdfc5f49de7462f13d1d05 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 15 Mar 2023 18:41:09 -0400 Subject: [PATCH 142/177] Add CTRDBG_STATE to bssl::UniquePtr Change-Id: I18596751776262be09d8ba09ed258e1f66d90654 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58046 Reviewed-by: Adam Langley Commit-Queue: David Benjamin --- crypto/fipsmodule/rand/ctrdrbg_test.cc | 6 ++---- include/openssl/ctrdrbg.h | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crypto/fipsmodule/rand/ctrdrbg_test.cc b/crypto/fipsmodule/rand/ctrdrbg_test.cc index e6ebbca2eb..50f42973f0 100644 --- a/crypto/fipsmodule/rand/ctrdrbg_test.cc +++ b/crypto/fipsmodule/rand/ctrdrbg_test.cc @@ -63,13 +63,11 @@ TEST(CTRDRBGTest, Basic) { TEST(CTRDRBGTest, Allocated) { const uint8_t kSeed[CTR_DRBG_ENTROPY_LEN] = {0}; - CTR_DRBG_STATE *allocated = CTR_DRBG_new(kSeed, nullptr, 0); + bssl::UniquePtr allocated(CTR_DRBG_new(kSeed, nullptr, 0)); ASSERT_TRUE(allocated); - CTR_DRBG_free(allocated); - allocated = CTR_DRBG_new(kSeed, nullptr, 1<<20); + allocated.reset(CTR_DRBG_new(kSeed, nullptr, 1<<20)); ASSERT_FALSE(allocated); - CTR_DRBG_free(allocated); } TEST(CTRDRBGTest, Large) { diff --git a/include/openssl/ctrdrbg.h b/include/openssl/ctrdrbg.h index 62afe0c18e..5440fb4d14 100644 --- a/include/openssl/ctrdrbg.h +++ b/include/openssl/ctrdrbg.h @@ -71,6 +71,12 @@ OPENSSL_EXPORT void CTR_DRBG_clear(CTR_DRBG_STATE *drbg); #if defined(__cplusplus) } // extern C + +extern "C++" { +BSSL_NAMESPACE_BEGIN +BORINGSSL_MAKE_DELETER(CTR_DRBG_STATE, CTR_DRBG_free) +BSSL_NAMESPACE_END +} // extern C++ #endif #endif // OPENSSL_HEADER_CTRDRBG_H From 6a231e5c6e2b299da0be16e1edbb0195265afec3 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 12 Mar 2023 13:10:29 -0400 Subject: [PATCH 143/177] Add a test for OPTIONAL CHOICE values An in-progress rewrite of tasn_dec.c accidentally broke this, so add a regression test. Bug: 548 Change-Id: Iac6a23acbc08459187c96a2f6471f0aa97d445a1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58125 Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/asn1/asn1_test.cc | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 47d235640e..36ad676013 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -2657,4 +2657,66 @@ TEST(ASN1Test, DoublyTagged) { TestSerialize(obj.get(), i2d_DOUBLY_TAGGED, kTrueEmpty); } +#define CHOICE_TYPE_OCT 0 +#define CHOICE_TYPE_BOOL 1 + +struct CHOICE_TYPE { + int type; + union { + ASN1_OCTET_STRING *oct; + ASN1_BOOLEAN b; + } value; +}; + +DECLARE_ASN1_FUNCTIONS(CHOICE_TYPE) +ASN1_CHOICE(CHOICE_TYPE) = { + ASN1_SIMPLE(CHOICE_TYPE, value.oct, ASN1_OCTET_STRING), + ASN1_SIMPLE(CHOICE_TYPE, value.b, ASN1_BOOLEAN), +} ASN1_CHOICE_END(CHOICE_TYPE) +IMPLEMENT_ASN1_FUNCTIONS(CHOICE_TYPE) + +struct OPTIONAL_CHOICE { + CHOICE_TYPE *choice; +}; + +DECLARE_ASN1_FUNCTIONS(OPTIONAL_CHOICE) +ASN1_SEQUENCE(OPTIONAL_CHOICE) = { + ASN1_OPT(OPTIONAL_CHOICE, choice, CHOICE_TYPE), +} ASN1_SEQUENCE_END(OPTIONAL_CHOICE) +IMPLEMENT_ASN1_FUNCTIONS(OPTIONAL_CHOICE) + +TEST(ASN1Test, OptionalChoice) { + std::unique_ptr obj( + nullptr, OPTIONAL_CHOICE_free); + + // Value omitted. + static const uint8_t kOmitted[] = {0x30, 0x00}; + const uint8_t *inp = kOmitted; + obj.reset(d2i_OPTIONAL_CHOICE(nullptr, &inp, sizeof(kOmitted))); + ASSERT_TRUE(obj); + EXPECT_FALSE(obj->choice); + TestSerialize(obj.get(), i2d_OPTIONAL_CHOICE, kOmitted); + + // Value is present as an OCTET STRING. + static const uint8_t kOct[] = {0x30, 0x02, 0x04, 0x00}; + inp = kOct; + obj.reset(d2i_OPTIONAL_CHOICE(nullptr, &inp, sizeof(kOct))); + ASSERT_TRUE(obj); + ASSERT_TRUE(obj->choice); + ASSERT_EQ(obj->choice->type, CHOICE_TYPE_OCT); + ASSERT_TRUE(obj->choice->value.oct); + EXPECT_EQ(ASN1_STRING_length(obj->choice->value.oct), 0); + TestSerialize(obj.get(), i2d_OPTIONAL_CHOICE, kOct); + + // Value is present as TRUE. + static const uint8_t kTrue[] = {0x30, 0x03, 0x01, 0x01, 0xff}; + inp = kTrue; + obj.reset(d2i_OPTIONAL_CHOICE(nullptr, &inp, sizeof(kTrue))); + ASSERT_TRUE(obj); + ASSERT_TRUE(obj->choice); + ASSERT_EQ(obj->choice->type, CHOICE_TYPE_BOOL); + EXPECT_EQ(obj->choice->value.b, ASN1_BOOLEAN_TRUE); + TestSerialize(obj.get(), i2d_OPTIONAL_CHOICE, kTrue); +} + #endif // !WINDOWS || !SHARED_LIBRARY From 860cc73bb2964457461a6f3cb5807dbd79256372 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 12 Mar 2023 12:42:33 -0400 Subject: [PATCH 144/177] Reduce type-punning in ASN1_TYPE ASN1_TYPE is a union of a bunch of pointer types. Often it takes a shorthand and accesses a->value.ptr directly. This is allowed in C, but not C++. Writing the switch/case barely takes more code, so just write it that way. Along the way, extract the code for cleaning up an ASN1_TYPE from tasn_fre.c. This is a small step towards being able to use crypto/asn1's types without depending on the templates. ASN1_TYPE_free still, for now, calls into the templates. That will be fixable once tasn_*.c are rewritten a bit further. This also removes the weird hack here ASN1_primitive_free (an internal function) with NULL ASN1_ITEM secretly meant to partially clean up the ASN1_TYPE. We can just call the function directly now. Bug: 574 Change-Id: Ie2ba41418801a366ab2f12eccc01e8dadf82c33e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58126 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/a_type.c | 64 ++++++++++++++++++++++++++++++++---------- crypto/asn1/internal.h | 4 +++ crypto/asn1/tasn_fre.c | 37 ++++++------------------ 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/crypto/asn1/a_type.c b/crypto/asn1/a_type.c index d59fdba8ac..0c2fd136d3 100644 --- a/crypto/asn1/a_type.c +++ b/crypto/asn1/a_type.c @@ -65,31 +65,65 @@ int ASN1_TYPE_get(const ASN1_TYPE *a) { - if (a->type == V_ASN1_BOOLEAN || a->type == V_ASN1_NULL || - a->value.ptr != NULL) { - return a->type; + switch (a->type) { + case V_ASN1_NULL: + case V_ASN1_BOOLEAN: + return a->type; + case V_ASN1_OBJECT: + return a->value.object != NULL ? a->type : 0; + default: + return a->value.asn1_string != NULL ? a->type : 0; } - return 0; } const void *asn1_type_value_as_pointer(const ASN1_TYPE *a) { - if (a->type == V_ASN1_BOOLEAN) { - return a->value.boolean ? (void *)0xff : NULL; + switch (a->type) { + case V_ASN1_NULL: + return NULL; + case V_ASN1_BOOLEAN: + return a->value.boolean ? (void *)0xff : NULL; + case V_ASN1_OBJECT: + return a->value.object; + default: + return a->value.asn1_string; } - if (a->type == V_ASN1_NULL) { - return NULL; +} + +void asn1_type_cleanup(ASN1_TYPE *a) { + switch (a->type) { + case V_ASN1_NULL: + a->value.ptr = NULL; + break; + case V_ASN1_BOOLEAN: + a->value.boolean = ASN1_BOOLEAN_NONE; + break; + case V_ASN1_OBJECT: + ASN1_OBJECT_free(a->value.object); + a->value.object = NULL; + break; + default: + ASN1_STRING_free(a->value.asn1_string); + a->value.asn1_string = NULL; + break; } - return a->value.ptr; } void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value) { - ASN1_TYPE **tmp_a = &a; - ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL); + asn1_type_cleanup(a); a->type = type; - if (type == V_ASN1_BOOLEAN) { - a->value.boolean = value ? 0xff : 0; - } else { - a->value.ptr = value; + switch (type) { + case V_ASN1_NULL: + a->value.ptr = NULL; + break; + case V_ASN1_BOOLEAN: + a->value.boolean = value ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; + break; + case V_ASN1_OBJECT: + a->value.object = value; + break; + default: + a->value.asn1_string = value; + break; } } diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index a60a037031..64e1e6b102 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h @@ -210,6 +210,10 @@ void asn1_encoding_clear(ASN1_ENCODING *enc); // a pointer. const void *asn1_type_value_as_pointer(const ASN1_TYPE *a); +// asn1_type_cleanup releases memory associated with |a|'s value, without +// freeing |a| itself. +void asn1_type_cleanup(ASN1_TYPE *a); + // asn1_is_printable returns one if |value| is a valid Unicode codepoint for an // ASN.1 PrintableString, and zero otherwise. int asn1_is_printable(uint32_t value); diff --git a/crypto/asn1/tasn_fre.c b/crypto/asn1/tasn_fre.c index ebfd3d62dd..add46f5324 100644 --- a/crypto/asn1/tasn_fre.c +++ b/crypto/asn1/tasn_fre.c @@ -161,12 +161,10 @@ void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { } void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { - size_t i; if (tt->flags & ASN1_TFLG_SK_MASK) { STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval; - for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) { - ASN1_VALUE *vtmp; - vtmp = sk_ASN1_VALUE_value(sk, i); + for (size_t i = 0; i < sk_ASN1_VALUE_num(sk); i++) { + ASN1_VALUE *vtmp = sk_ASN1_VALUE_value(sk, i); ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item)); } sk_ASN1_VALUE_free(sk); @@ -177,30 +175,11 @@ void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { } void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { - int utype; // Historically, |it->funcs| for primitive types contained an // |ASN1_PRIMITIVE_FUNCS| table of calbacks. - assert(it == NULL || it->funcs == NULL); - // Special case: if 'it' is NULL free contents of ASN1_TYPE - if (!it) { - ASN1_TYPE *typ = (ASN1_TYPE *)*pval; - utype = typ->type; - pval = &typ->value.asn1_value; - if (utype != V_ASN1_BOOLEAN && !*pval) { - return; - } - } else if (it->itype == ASN1_ITYPE_MSTRING) { - utype = -1; - if (!*pval) { - return; - } - } else { - utype = it->utype; - if ((utype != V_ASN1_BOOLEAN) && !*pval) { - return; - } - } + assert(it->funcs == NULL); + int utype = it->itype == ASN1_ITYPE_MSTRING ? -1 : it->utype; switch (utype) { case V_ASN1_OBJECT: ASN1_OBJECT_free((ASN1_OBJECT *)*pval); @@ -210,7 +189,7 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (it) { *(ASN1_BOOLEAN *)pval = (ASN1_BOOLEAN)it->size; } else { - *(ASN1_BOOLEAN *)pval = -1; + *(ASN1_BOOLEAN *)pval = ASN1_BOOLEAN_NONE; } return; @@ -218,8 +197,10 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { break; case V_ASN1_ANY: - ASN1_primitive_free(pval, NULL); - OPENSSL_free(*pval); + if (*pval != NULL) { + asn1_type_cleanup((ASN1_TYPE *)*pval); + OPENSSL_free(*pval); + } break; default: From 9ea4128c9e2295cb4f1c80874c9d2c49cddff0ce Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Thu, 16 Mar 2023 09:25:54 -0600 Subject: [PATCH 145/177] Set up cargo deny to deny new dependencies by default. Mark the two existing dependencies which should be made to go away. This is a bindings library to boringssl. it should really *not* need extra dependencies on external crates. Change-Id: Ia687510247154634e6d8b2be4c2f5840dabc1c89 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58107 Auto-Submit: Bob Beck Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- rust/bssl-crypto/deny.toml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rust/bssl-crypto/deny.toml b/rust/bssl-crypto/deny.toml index e521047429..20fc0c874b 100644 --- a/rust/bssl-crypto/deny.toml +++ b/rust/bssl-crypto/deny.toml @@ -160,8 +160,19 @@ wildcards = "allow" # * all - Both lowest-version and simplest-path are used highlight = "all" # List of crates that are allowed. Use with care! +# This is meant to control any external dependencies. This is effectively +# a minimalist binding library and we try to have none, so you are strongly +# encouraged not to add dependencies here. allow = [ - #{ name = "ansi_term", version = "=0.11.0" }, + # bssl-crypto should be allowed, version appropriately. + { name = "bssl-crypto", version = "=0.1.0" }, + # bssl-sys should be allowed, version appropriately. + { name = "bssl-sys", version = "=0.1.0" }, + # libc is used by bssl-sys from android, but is not really needed and should + # be removed once this can be checked with android. + { name = "libc", version = "=0.2.140" }, + # hex-literal was added for ease of tests, but should be removed. + { name = "hex-literal", version = "=0.3.4" }, ] # List of crates to deny deny = [ From 7b04d724d0900770ac9fac556b832eaefbf99bc9 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Thu, 16 Mar 2023 12:05:29 -0600 Subject: [PATCH 146/177] Get rid of the libc crate dependency in bssl-sys It appears to no longer be needed. Change-Id: Idd9aa128192eb0f1bdff52e190fd032090411d43 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58165 Auto-Submit: Bob Beck Commit-Queue: David Benjamin Reviewed-by: David Benjamin Reviewed-by: Nabil Wadih --- rust/bssl-crypto/deny.toml | 3 --- rust/bssl-sys/Cargo.toml | 1 - 2 files changed, 4 deletions(-) diff --git a/rust/bssl-crypto/deny.toml b/rust/bssl-crypto/deny.toml index 20fc0c874b..48cba429c9 100644 --- a/rust/bssl-crypto/deny.toml +++ b/rust/bssl-crypto/deny.toml @@ -168,9 +168,6 @@ allow = [ { name = "bssl-crypto", version = "=0.1.0" }, # bssl-sys should be allowed, version appropriately. { name = "bssl-sys", version = "=0.1.0" }, - # libc is used by bssl-sys from android, but is not really needed and should - # be removed once this can be checked with android. - { name = "libc", version = "=0.2.140" }, # hex-literal was added for ease of tests, but should be removed. { name = "hex-literal", version = "=0.3.4" }, ] diff --git a/rust/bssl-sys/Cargo.toml b/rust/bssl-sys/Cargo.toml index c5e61fd033..fe5f47f96a 100644 --- a/rust/bssl-sys/Cargo.toml +++ b/rust/bssl-sys/Cargo.toml @@ -7,4 +7,3 @@ publish = false license = "MIT" [dependencies] -libc = "0.2" From cc575425302e35700848358be85166ff2c5e832e Mon Sep 17 00:00:00 2001 From: Nabil Wadih Date: Wed, 22 Feb 2023 17:50:58 -0800 Subject: [PATCH 147/177] add bindings for hkdf and update panic handler Change-Id: Ic0149a69cc27727c2302bc2a90d03839fd5637b5 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57545 Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- rust/bssl-crypto/src/aes.rs | 20 +-- rust/bssl-crypto/src/digest.rs | 13 +- rust/bssl-crypto/src/hkdf.rs | 308 +++++++++++++++++++++++++++++++++ rust/bssl-crypto/src/hmac.rs | 44 ++--- rust/bssl-crypto/src/lib.rs | 60 +++---- 5 files changed, 379 insertions(+), 66 deletions(-) create mode 100644 rust/bssl-crypto/src/hkdf.rs diff --git a/rust/bssl-crypto/src/aes.rs b/rust/bssl-crypto/src/aes.rs index 0a354db7cd..c2eb44125b 100644 --- a/rust/bssl-crypto/src/aes.rs +++ b/rust/bssl-crypto/src/aes.rs @@ -79,18 +79,14 @@ fn new_encrypt_key(key: [u8; N]) -> AesEncryptKey { // - key is guaranteed to point to bits/8 bytes determined by the len() * 8 used below. // - bits is always a valid AES key size, as defined by the new_aes_* fns defined on the public // key structs. - // The expect will never be hit since input key is always a valid AES key size. - #[allow(clippy::expect_used)] - unsafe { + let result = unsafe { bssl_sys::AES_set_encrypt_key( key.as_ptr(), key.len() as core::ffi::c_uint * 8, enc_key_uninit.as_mut_ptr(), ) - } - .eq(&0) - .then_some(()) - .expect("bssl_sys::AES_set_encrypt_key unexpectedly failed"); + }; + assert_eq!(result, 0, "Error occurred in bssl_sys::AES_set_encrypt_key"); // Safety: // - since we have checked above that initialization succeeded, this will never be UB @@ -108,18 +104,14 @@ fn new_decrypt_key(key: [u8; N]) -> AesDecryptKey { // - key is guaranteed to point to bits/8 bytes determined by the len() * 8 used below. // - bits is always a valid AES key size, as defined by the new_aes_* fns defined on the public // key structs. - // The expect will never be hit since input key is always a valid AES key size. - #[allow(clippy::expect_used)] - unsafe { + let result = unsafe { bssl_sys::AES_set_decrypt_key( key.as_ptr(), key.len() as core::ffi::c_uint * 8, dec_key_uninit.as_mut_ptr(), ) - } - .eq(&0) - .then_some(()) - .expect("bssl_sys::AES_set_decrypt_key unexpectedly failed"); + }; + assert_eq!(result, 0, "Error occurred in bssl_sys::AES_set_decrypt_key"); // Safety: // - Since we have checked above that initialization succeeded, this will never be UB. diff --git a/rust/bssl-crypto/src/digest.rs b/rust/bssl-crypto/src/digest.rs index cecdfdfc98..4f1941904b 100644 --- a/rust/bssl-crypto/src/digest.rs +++ b/rust/bssl-crypto/src/digest.rs @@ -26,19 +26,24 @@ pub struct Sha512 {} /// A reference to an [`Md`], which abstracts the details of a specific hash function allowing code /// to deal with the concept of a "hash function" without needing to know exactly which hash function /// it is. -pub(crate) struct MdRef; +pub struct MdRef; unsafe impl ForeignTypeRef for MdRef { type CType = bssl_sys::EVP_MD; } /// Used internally to get a BoringSSL internal MD -pub(crate) trait Md { - /// gets a reference to a message digest algorithm to be used by the hkdf implementation +pub trait Md { + /// The output size of the hash operation. + const OUTPUT_SIZE: usize; + + /// Gets a reference to a message digest algorithm to be used by the hkdf implementation. fn get_md() -> &'static MdRef; } impl Md for Sha256 { + const OUTPUT_SIZE: usize = bssl_sys::SHA256_DIGEST_LENGTH as usize; + fn get_md() -> &'static MdRef { // Safety: // - this always returns a valid pointer to an EVP_MD @@ -47,6 +52,8 @@ impl Md for Sha256 { } impl Md for Sha512 { + const OUTPUT_SIZE: usize = bssl_sys::SHA512_DIGEST_LENGTH as usize; + fn get_md() -> &'static MdRef { // Safety: // - this always returns a valid pointer to an EVP_MD diff --git a/rust/bssl-crypto/src/hkdf.rs b/rust/bssl-crypto/src/hkdf.rs new file mode 100644 index 0000000000..db6c5b6897 --- /dev/null +++ b/rust/bssl-crypto/src/hkdf.rs @@ -0,0 +1,308 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +use crate::digest::Md; +use crate::digest::{Sha256, Sha512}; +use crate::{CSlice, CSliceMut, ForeignTypeRef}; +use core::marker::PhantomData; + +/// Implementation of HKDF-SHA-256 +pub type HkdfSha256 = Hkdf; + +/// Implementation of HKDF-SHA-512 +pub type HkdfSha512 = Hkdf; + +/// Error type returned from the hkdf expand operations when the output key material has +/// an invalid length +#[derive(Debug)] +pub struct InvalidLength; + +/// Implementation of hkdf operations which are generic over a provided hashing functions. Type +/// aliases are provided above for convenience of commonly used hashes +pub struct Hkdf { + salt: Option>, + ikm: Vec, + _marker: PhantomData, +} + +impl Hkdf { + /// The max length of the output key material used for expanding + pub const MAX_OUTPUT_LENGTH: usize = M::OUTPUT_SIZE * 255; + + /// Creates a new instance of an hkdf from a salt and key material + pub fn new(salt: Option<&[u8]>, ikm: &[u8]) -> Self { + Self { + salt: salt.map(Vec::from), + ikm: Vec::from(ikm), + _marker: PhantomData::default(), + } + } + + /// The RFC5869 HKDF-Expand operation. The info argument for the expand is set to + /// the concatenation of all the elements of info_components. Returns InvalidLength if the + /// output is too large or panics if there is an allocation failure. + pub fn expand_multi_info( + &self, + info_components: &[&[u8]], + okm: &mut [u8], + ) -> Result<(), InvalidLength> { + self.expand(&info_components.concat(), okm) + } + + /// The RFC5869 HKDF-Expand operation. Returns InvalidLength if the output is too large, or + /// panics if there is an allocation failure + pub fn expand(&self, info: &[u8], okm: &mut [u8]) -> Result<(), InvalidLength> { + // extract the salt bytes from the option, or empty slice if option is None + let salt = self.salt.as_deref().unwrap_or_default(); + + //validate the output size + (okm.len() <= Self::MAX_OUTPUT_LENGTH && !okm.is_empty()) + .then(|| { + let mut okm_cslice = CSliceMut::from(okm); + + // Safety: + // - We validate the output length above, so invalid length errors will never be hit + // which leaves allocation failures as the only possible error case, in which case + // we panic immediately + let result = unsafe { + bssl_sys::HKDF( + okm_cslice.as_mut_ptr(), + okm_cslice.len(), + M::get_md().as_ptr(), + CSlice::from(self.ikm.as_slice()).as_ptr(), + self.ikm.as_slice().len(), + CSlice::from(salt).as_ptr(), + salt.len(), + CSlice::from(info).as_ptr(), + info.len(), + ) + }; + assert!(result > 0, "Allocation failure in bssl_sys::HKDF"); + }) + .ok_or(InvalidLength) + } +} + +#[cfg(test)] +mod tests { + use crate::hkdf::{HkdfSha256, HkdfSha512}; + use core::iter; + use hex_literal::hex; + + struct Test<'a> { + ikm: &'a [u8], + salt: &'a [u8], + info: &'a [u8], + okm: &'a [u8], + } + + #[test] + fn hkdf_sha_256_test() { + let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"); + let salt = hex!("000102030405060708090a0b0c"); + let info = hex!("f0f1f2f3f4f5f6f7f8f9"); + + let hk = HkdfSha256::new(Some(&salt[..]), &ikm); + let mut okm = [0u8; 42]; + hk.expand(&info, &mut okm) + .expect("42 is a valid length for Sha256 to output"); + + let expected = hex!( + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865" + ); + assert_eq!(okm, expected); + } + + #[test] + fn hkdf_sha512_test() { + let ikm = hex!("5d3db20e8238a90b62a600fa57fdb318"); + let salt = hex!("1d6f3b38a1e607b5e6bcd4af1800a9d3"); + let info = hex!("2bc5f39032b6fc87da69ba8711ce735b169646fd"); + + let hk = HkdfSha512::new(Some(&salt[..]), &ikm); + let mut okm = [0u8; 42]; + hk.expand(&info, &mut okm).expect("Should succeed"); + + let expected = hex!( + "8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae" + ); + assert_eq!(okm, expected); + } + + // Test Vectors from https://tools.ietf.org/html/rfc5869. + #[test] + fn test_rfc5869_sha256() { + let tests = [ + Test { + // Test Case 1 + ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), + salt: &hex!("000102030405060708090a0b0c"), + info: &hex!("f0f1f2f3f4f5f6f7f8f9"), + okm: &hex!( + " + 3cb25f25faacd57a90434f64d0362f2a + 2d2d0a90cf1a5a4c5db02d56ecc4c5bf + 34007208d5b887185865 + " + ), + }, + Test { + // Test Case 2 + ikm: &hex!( + " + 000102030405060708090a0b0c0d0e0f + 101112131415161718191a1b1c1d1e1f + 202122232425262728292a2b2c2d2e2f + 303132333435363738393a3b3c3d3e3f + 404142434445464748494a4b4c4d4e4f + " + ), + salt: &hex!( + " + 606162636465666768696a6b6c6d6e6f + 707172737475767778797a7b7c7d7e7f + 808182838485868788898a8b8c8d8e8f + 909192939495969798999a9b9c9d9e9f + a0a1a2a3a4a5a6a7a8a9aaabacadaeaf + " + ), + info: &hex!( + " + b0b1b2b3b4b5b6b7b8b9babbbcbdbebf + c0c1c2c3c4c5c6c7c8c9cacbcccdcecf + d0d1d2d3d4d5d6d7d8d9dadbdcdddedf + e0e1e2e3e4e5e6e7e8e9eaebecedeeef + f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff + " + ), + okm: &hex!( + " + b11e398dc80327a1c8e7f78c596a4934 + 4f012eda2d4efad8a050cc4c19afa97c + 59045a99cac7827271cb41c65e590e09 + da3275600c2f09b8367793a9aca3db71 + cc30c58179ec3e87c14c01d5c1f3434f + 1d87 + " + ), + }, + Test { + // Test Case 3 + ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), + salt: &hex!(""), + info: &hex!(""), + okm: &hex!( + " + 8da4e775a563c18f715f802a063c5a31 + b8a11f5c5ee1879ec3454e5f3c738d2d + 9d201395faa4b61a96c8 + " + ), + }, + ]; + for Test { + ikm, + salt, + info, + okm, + } in tests.iter() + { + let salt = if salt.is_empty() { + None + } else { + Some(&salt[..]) + }; + let hkdf = HkdfSha256::new(salt, ikm); + let mut okm2 = vec![0u8; okm.len()]; + assert!(hkdf.expand(&info[..], &mut okm2).is_ok()); + assert_eq!(okm2[..], okm[..]); + } + } + + #[test] + fn test_lengths() { + let hkdf = HkdfSha256::new(None, &[]); + let mut longest = vec![0u8; HkdfSha256::MAX_OUTPUT_LENGTH]; + assert!(hkdf.expand(&[], &mut longest).is_ok()); + // start at 1 since 0 is an invalid length + let lengths = 1..HkdfSha256::MAX_OUTPUT_LENGTH + 1; + + for length in lengths { + let mut okm = vec![0u8; length]; + + assert!(hkdf.expand(&[], &mut okm).is_ok()); + assert_eq!(okm.len(), length); + assert_eq!(okm[..], longest[..length]); + } + } + + #[test] + fn test_max_length() { + let hkdf = HkdfSha256::new(Some(&[]), &[]); + let mut okm = vec![0u8; HkdfSha256::MAX_OUTPUT_LENGTH]; + assert!(hkdf.expand(&[], &mut okm).is_ok()); + } + + #[test] + fn test_max_length_exceeded() { + let hkdf = HkdfSha256::new(Some(&[]), &[]); + let mut okm = vec![0u8; HkdfSha256::MAX_OUTPUT_LENGTH + 1]; + assert!(hkdf.expand(&[], &mut okm).is_err()); + } + + #[test] + fn test_unsupported_length() { + let hkdf = HkdfSha256::new(Some(&[]), &[]); + let mut okm = vec![0u8; 90000]; + assert!(hkdf.expand(&[], &mut okm).is_err()); + } + + #[test] + fn test_expand_multi_info() { + let info_components = &[ + &b"09090909090909090909090909090909090909090909"[..], + &b"8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a"[..], + &b"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0"[..], + &b"4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4"[..], + &b"1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d"[..], + ]; + + let hkdf = HkdfSha256::new(None, b"some ikm here"); + + // Compute HKDF-Expand on the concatenation of all the info components + let mut oneshot_res = [0u8; 16]; + hkdf.expand(&info_components.concat(), &mut oneshot_res) + .unwrap(); + + // Now iteratively join the components of info_components until it's all 1 component. The value + // of HKDF-Expand should be the same throughout + let mut num_concatted = 0; + let mut info_head = Vec::new(); + + while num_concatted < info_components.len() { + info_head.extend(info_components[num_concatted]); + + // Build the new input to be the info head followed by the remaining components + let input: Vec<&[u8]> = iter::once(info_head.as_slice()) + .chain(info_components.iter().cloned().skip(num_concatted + 1)) + .collect(); + + // Compute and compare to the one-shot answer + let mut multipart_res = [0u8; 16]; + hkdf.expand_multi_info(&input, &mut multipart_res).unwrap(); + assert_eq!(multipart_res, oneshot_res); + num_concatted += 1; + } + } +} diff --git a/rust/bssl-crypto/src/hmac.rs b/rust/bssl-crypto/src/hmac.rs index 393396688a..3da5f31f21 100644 --- a/rust/bssl-crypto/src/hmac.rs +++ b/rust/bssl-crypto/src/hmac.rs @@ -14,7 +14,7 @@ */ use crate::{ digest::{Md, Sha256, Sha512}, - CSlice, ForeignTypeRef as _, PanicResultHandler, + CSlice, ForeignTypeRef as _, }; use core::{ ffi::{c_uint, c_void}, @@ -22,25 +22,25 @@ use core::{ ptr, }; -/// Computes the HMAC-SHA-256 of `data` as a one-shot operation. +/// Computes the HMAC-SHA256 of `data` as a one-shot operation. /// /// Calculates the HMAC of data, using the given `key` and returns the result. /// It returns the computed hmac. /// Can panic if memory allocation fails in the underlying BoringSSL code. -pub fn hmac_sha_256(key: &[u8], data: &[u8]) -> [u8; 32] { +pub fn hmac_sha256(key: &[u8], data: &[u8]) -> [u8; 32] { hmac::<32, Sha256>(key, data) } -/// Computes the HMAC-SHA-512 of `data` as a one-shot operation. +/// Computes the HMAC-SHA512 of `data` as a one-shot operation. /// /// Calculates the HMAC of data, using the given `key` and returns the result. /// It returns the computed hmac. /// Can panic if memory allocation fails in the underlying BoringSSL code. -pub fn hmac_sha_512(key: &[u8], data: &[u8]) -> [u8; 64] { +pub fn hmac_sha512(key: &[u8], data: &[u8]) -> [u8; 64] { hmac::<64, Sha512>(key, data) } -/// The BoringSSL HMAC-SHA-256 implementation. The operations may panic if memory allocation fails +/// The BoringSSL HMAC-SHA256 implementation. The operations may panic if memory allocation fails /// in BoringSSL. pub struct HmacSha256(Hmac<32, Sha256>); @@ -81,7 +81,7 @@ impl HmacSha256 { } } -/// The BoringSSL HMAC-SHA-512 implementation. The operations may panic if memory allocation fails +/// The BoringSSL HMAC-SHA512 implementation. The operations may panic if memory allocation fails /// in BoringSSL. pub struct HmacSha512(Hmac<64, Sha512>); @@ -139,7 +139,7 @@ fn hmac(key: &[u8], data: &[u8]) -> [u8; N] { // Safety: // - buf always contains N bytes of space // - If NULL is returned on error we panic immediately - unsafe { + let result = unsafe { bssl_sys::HMAC( M::get_md().as_ptr(), CSlice::from(key).as_ptr(), @@ -149,8 +149,8 @@ fn hmac(key: &[u8], data: &[u8]) -> [u8; N] { out.as_mut_ptr(), &mut size as *mut c_uint, ) - } - .panic_if_error(); + }; + assert!(!result.is_null(), "Result of bssl_sys::HMAC was null"); out } @@ -177,7 +177,10 @@ impl Hmac { // Safety: // - HMAC_CTX_new panics if allocation fails let ctx = unsafe { bssl_sys::HMAC_CTX_new() }; - ctx.panic_if_error(); + assert!( + !ctx.is_null(), + "result of bssl_sys::HMAC_CTX_new() was null" + ); // Safety: // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, @@ -185,7 +188,7 @@ impl Hmac { // - HMAC_Init_ex may return an error if key is null but the md is different from // before. This is avoided here since key is guaranteed to be non-null. // - HMAC_Init_ex returns 0 on allocation failure in which case we panic - unsafe { + let result = unsafe { bssl_sys::HMAC_Init_ex( ctx, CSlice::from(key).as_ptr() as *const c_void, @@ -193,8 +196,8 @@ impl Hmac { M::get_md().as_ptr(), ptr::null_mut(), ) - } - .panic_if_error(); + }; + assert!(result > 0, "Allocation failure in bssl_sys::HMAC_Init_ex"); Self { ctx, @@ -204,11 +207,11 @@ impl Hmac { /// Update state using the provided data, can be called repeatedly. fn update(&mut self, data: &[u8]) { - unsafe { + let result = unsafe { // Safety: HMAC_Update will always return 1, in case it doesnt we panic bssl_sys::HMAC_Update(self.ctx, data.as_ptr(), data.len()) - } - .panic_if_error() + }; + assert_eq!(result, 1, "failure in bssl_sys::HMAC_Update"); } /// Obtain the hmac computation consuming the hmac instance. @@ -219,8 +222,9 @@ impl Hmac { // - hmac has a fixed size output of N which will never exceed the length of an N // length array // - on allocation failure we panic - unsafe { bssl_sys::HMAC_Final(self.ctx, buf.as_mut_ptr(), &mut size as *mut c_uint) } - .panic_if_error(); + let result = + unsafe { bssl_sys::HMAC_Final(self.ctx, buf.as_mut_ptr(), &mut size as *mut c_uint) }; + assert!(result > 0, "Allocation failure in bssl_sys::HMAC_Final"); buf } @@ -338,7 +342,7 @@ mod tests { ]; let key: [u8; 20] = [0x0b; 20]; let data = b"Hi There"; - let hmac_result = hmac_sha_256(&key, data); + let hmac_result = hmac_sha256(&key, data); assert_eq!(&hmac_result, &expected_hmac); } diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs index 2c8ac72711..9c4a2143e0 100644 --- a/rust/bssl-crypto/src/lib.rs +++ b/rust/bssl-crypto/src/lib.rs @@ -24,46 +24,30 @@ //! Rust boringssl binding extern crate core; -use core::ops::Not; /// BoringSSL implemented plain aes operations. pub mod aes; -/// BoringSSL implemented hmac operations. -pub mod hmac; - /// BoringSSL implemented hash functions. pub mod digest; -/// Used for handling result types from C APIs. -trait PanicResultHandler { - /// Panics if a C api returns an invalid result - /// Used for APIs which return error codes for allocation failures. - fn panic_if_error(&self); -} +/// BoringSSL implemented hkdf operations. +pub mod hkdf; -impl PanicResultHandler for i32 { - /// BoringSSL APIs return 1 on success or 0 on allocation failure. - #[allow(clippy::expect_used)] - fn panic_if_error(&self) { - self.gt(&0).then_some(()).expect("allocation failed!") - } -} +/// BoringSSL implemented hmac operations. +pub mod hmac; + +/// This is a helper struct which provides functions for passing slices over FFI. +struct CSlice<'a>(&'a [u8]); -impl PanicResultHandler for *mut T { - /// Boringssl APIs return NULL on allocation failure for APIs that return a CTX. - #[allow(clippy::expect_used)] - fn panic_if_error(&self) { - self.is_null() - .not() - .then_some(()) - .expect("allocation failed!") +impl<'a> From<&'a [u8]> for CSlice<'a> { + fn from(value: &'a [u8]) -> Self { + Self(value) } } -struct CSlice<'a>(&'a [u8]); - impl CSlice<'_> { + /// Returns a raw pointer to the value, which is safe to pass over FFI. pub fn as_ptr(&self) -> *const T { if self.0.is_empty() { std::ptr::null() @@ -73,8 +57,26 @@ impl CSlice<'_> { } } -impl<'a> From<&'a [u8]> for CSlice<'a> { - fn from(value: &'a [u8]) -> Self { +/// This is a helper struct which provides functions for passing mutable slices over FFI. +struct CSliceMut<'a>(&'a mut [u8]); + +impl CSliceMut<'_> { + /// Returns a raw pointer to the value, which is safe to pass over FFI. + pub fn as_mut_ptr(&mut self) -> *mut T { + if self.0.is_empty() { + std::ptr::null_mut() + } else { + self.0.as_mut_ptr() as *mut T + } + } + + pub fn len(&self) -> usize { + self.0.len() + } +} + +impl<'a> From<&'a mut [u8]> for CSliceMut<'a> { + fn from(value: &'a mut [u8]) -> Self { Self(value) } } From 2cb7b337d00e6b7106b2fec84f4b2c90e2baa484 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 28 Dec 2022 19:31:26 -0500 Subject: [PATCH 148/177] Rewrite ASN1_OBJECT and ASN1_BOOLEAN d2i/i2d functions. These functions already don't go through tasn_*.c. Rewrite them to use CBS and CBB. This removes some dependencies on ASN1_get_object and ASN1_put_object. Update-Note: d2i_ASN1_OBJECT and d2i_ASN1_BOOLEAN will no longer accept non-minimal length prefixes (forbidden in DER). d2i_ASN1_BOOLEAN will also no longer accept non-canonical representations of TRUE (also forbidden in DER). This does not affect certificate parsing, as that still goes through the old template system, though we will make a similar change to those functions later. Bug: 354, 548 Change-Id: I0b7aa96f47aca5c31ec4f702e27108b4106311f2 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58145 Commit-Queue: David Benjamin Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- crypto/asn1/a_bool.c | 66 +++++++++++++--------------------------- crypto/asn1/a_object.c | 64 +++++++++++++++----------------------- crypto/asn1/asn1_test.cc | 8 +++-- include/openssl/asn1.h | 8 +---- 4 files changed, 53 insertions(+), 93 deletions(-) diff --git a/crypto/asn1/a_bool.c b/crypto/asn1/a_bool.c index 67d6813a40..e227b7f796 100644 --- a/crypto/asn1/a_bool.c +++ b/crypto/asn1/a_bool.c @@ -56,64 +56,40 @@ #include +#include #include -#include -int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **pp) { - int r; - unsigned char *p, *allocated = NULL; +#include "../bytestring/internal.h" - r = ASN1_object_size(0, 1, V_ASN1_BOOLEAN); - if (pp == NULL) { - return r; - } - if (*pp == NULL) { - if ((p = allocated = OPENSSL_malloc(r)) == NULL) { - return -1; - } - } else { - p = *pp; +int i2d_ASN1_BOOLEAN(ASN1_BOOLEAN a, unsigned char **outp) { + CBB cbb; + if (!CBB_init(&cbb, 3) || // + !CBB_add_asn1_bool(&cbb, a != ASN1_BOOLEAN_FALSE)) { + CBB_cleanup(&cbb); + return -1; } - - ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL); - *p = a ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; - - // If a new buffer was allocated, just return it back. - // If not, return the incremented buffer pointer. - *pp = allocated != NULL ? allocated : p + 1; - return r; + return CBB_finish_i2d(&cbb, outp); } -ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *a, const unsigned char **pp, - long length) { - const unsigned char *p = *pp; - long len; - int inf, tag, xclass; - inf = ASN1_get_object(&p, &len, &tag, &xclass, length); - if (inf & 0x80) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER); - return ASN1_BOOLEAN_NONE; - } - - if (inf & V_ASN1_CONSTRUCTED) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); +ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *out, const unsigned char **inp, + long len) { + if (len < 0) { return ASN1_BOOLEAN_NONE; } - if (tag != V_ASN1_BOOLEAN || xclass != V_ASN1_UNIVERSAL) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_A_BOOLEAN); + CBS cbs; + CBS_init(&cbs, *inp, (size_t)len); + int val; + if (!CBS_get_asn1_bool(&cbs, &val)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return ASN1_BOOLEAN_NONE; } - if (len != 1) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH); - return ASN1_BOOLEAN_NONE; - } - ASN1_BOOLEAN ret = (ASN1_BOOLEAN) * (p++); - if (a != NULL) { - (*a) = ret; + ASN1_BOOLEAN ret = val ? ASN1_BOOLEAN_TRUE : ASN1_BOOLEAN_FALSE; + if (out != NULL) { + *out = ret; } - *pp = p; + *inp = CBS_data(&cbs); return ret; } diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c index 56219e1f81..77bd175ea7 100644 --- a/crypto/asn1/a_object.c +++ b/crypto/asn1/a_object.c @@ -59,46 +59,36 @@ #include #include +#include #include #include #include +#include "../bytestring/internal.h" #include "../internal.h" #include "internal.h" -int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp) { - if (a == NULL) { +int i2d_ASN1_OBJECT(const ASN1_OBJECT *in, unsigned char **outp) { + if (in == NULL) { OPENSSL_PUT_ERROR(ASN1, ERR_R_PASSED_NULL_PARAMETER); return -1; } - if (a->length == 0) { + if (in->length <= 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_OBJECT); return -1; } - int objsize = ASN1_object_size(0, a->length, V_ASN1_OBJECT); - if (pp == NULL || objsize == -1) { - return objsize; - } - - unsigned char *p, *allocated = NULL; - if (*pp == NULL) { - if ((p = allocated = OPENSSL_malloc(objsize)) == NULL) { - return -1; - } - } else { - p = *pp; + CBB cbb, child; + if (!CBB_init(&cbb, (size_t)in->length + 2) || + !CBB_add_asn1(&cbb, &child, CBS_ASN1_OBJECT) || + !CBB_add_bytes(&child, in->data, in->length)) { + CBB_cleanup(&cbb); + return -1; } - ASN1_put_object(&p, 0, a->length, V_ASN1_OBJECT, V_ASN1_UNIVERSAL); - OPENSSL_memcpy(p, a->data, a->length); - - // If a new buffer was allocated, just return it back. - // If not, return the incremented buffer pointer. - *pp = allocated != NULL ? allocated : p + a->length; - return objsize; + return CBB_finish_i2d(&cbb, outp); } int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a) { @@ -140,29 +130,25 @@ int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a) { return ret; } -ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, - long length) { - long len; - int tag, xclass; - const unsigned char *p = *pp; - int inf = ASN1_get_object(&p, &len, &tag, &xclass, length); - if (inf & 0x80) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_OBJECT_HEADER); +ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **out, const unsigned char **inp, + long len) { + if (len < 0) { return NULL; } - if (inf & V_ASN1_CONSTRUCTED) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); + CBS cbs, child; + CBS_init(&cbs, *inp, (size_t)len); + if (!CBS_get_asn1(&cbs, &child, CBS_ASN1_OBJECT)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return NULL; } - if (tag != V_ASN1_OBJECT || xclass != V_ASN1_UNIVERSAL) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_EXPECTING_AN_OBJECT); - return NULL; - } - ASN1_OBJECT *ret = c2i_ASN1_OBJECT(a, &p, len); - if (ret) { - *pp = p; + const uint8_t *contents = CBS_data(&child); + ASN1_OBJECT *ret = c2i_ASN1_OBJECT(out, &contents, CBS_len(&child)); + if (ret != NULL) { + // |c2i_ASN1_OBJECT| should have consumed the entire input. + assert(CBS_data(&cbs) == contents); + *inp = CBS_data(&cbs); } return ret; } diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 36ad676013..640b726810 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -552,8 +552,10 @@ TEST(ASN1Test, Boolean) { {0x81, 0x01, 0x00}, // Element is constructed. {0x21, 0x01, 0x00}, - // TODO(https://crbug.com/boringssl/354): Reject non-DER encodings of TRUE - // and test this. + // Not a DER encoding of TRUE. + {0x01, 0x01, 0x01}, + // Non-minimal tag length. + {0x01, 0x81, 0x01, 0xff}, }; for (const auto &invalid : kInvalidBooleans) { SCOPED_TRACE(Bytes(invalid)); @@ -690,6 +692,8 @@ TEST(ASN1Test, ParseASN1Object) { {0x86, 0x03, 0x2b, 0x65, 0x70}, // Element is constructed. {0x26, 0x03, 0x2b, 0x65, 0x70}, + // Non-minimal tag length. + {0x06, 0x81, 0x03, 0x2b, 0x65, 0x70}, }; for (const auto &invalid : kInvalidObjects) { SCOPED_TRACE(Bytes(invalid)); diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 26634a8895..ff77955698 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -443,9 +443,6 @@ OPENSSL_EXPORT ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, // // WARNING: This function's is slightly different from other |d2i_*| functions // because |ASN1_BOOLEAN| is not a pointer type. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_BOOLEAN d2i_ASN1_BOOLEAN(ASN1_BOOLEAN *out, const unsigned char **inp, long len); @@ -1444,15 +1441,12 @@ OPENSSL_EXPORT void ASN1_OBJECT_free(ASN1_OBJECT *a); // d2i_ASN1_OBJECT parses a DER-encoded ASN.1 OBJECT IDENTIFIER from up to |len| // bytes at |*inp|, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **out, const uint8_t **inp, long len); // i2d_ASN1_OBJECT marshals |in| as a DER-encoded ASN.1 OBJECT IDENTIFIER, as // described in |i2d_SAMPLE|. -OPENSSL_EXPORT int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, uint8_t **outp); +OPENSSL_EXPORT int i2d_ASN1_OBJECT(const ASN1_OBJECT *in, uint8_t **outp); // c2i_ASN1_OBJECT decodes |len| bytes from |*inp| as the contents of a // DER-encoded OBJECT IDENTIFIER, excluding the tag and length. It behaves like From 173b63942dd0c58a67a354dbb4b86c6f752aac6a Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 31 Dec 2022 23:13:48 -0500 Subject: [PATCH 149/177] Make ASN1_OBJECT_create size_t-clean. Change-Id: If7eb9daf65f6c9480a9bffb5f1e1ea3143c5faf7 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58146 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/a_object.c | 12 ++++++++---- include/openssl/asn1.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c index 77bd175ea7..55b6dadb01 100644 --- a/crypto/asn1/a_object.c +++ b/crypto/asn1/a_object.c @@ -261,16 +261,20 @@ void ASN1_OBJECT_free(ASN1_OBJECT *a) { } } -ASN1_OBJECT *ASN1_OBJECT_create(int nid, const unsigned char *data, int len, +ASN1_OBJECT *ASN1_OBJECT_create(int nid, const unsigned char *data, size_t len, const char *sn, const char *ln) { - ASN1_OBJECT o; + if (len > INT_MAX) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG); + return NULL; + } + ASN1_OBJECT o; o.sn = sn; o.ln = ln; o.data = data; o.nid = nid; - o.length = len; + o.length = (int)len; o.flags = ASN1_OBJECT_FLAG_DYNAMIC | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS | ASN1_OBJECT_FLAG_DYNAMIC_DATA; - return (OBJ_dup(&o)); + return OBJ_dup(&o); } diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index ff77955698..59996b66f5 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -1432,7 +1432,7 @@ DEFINE_STACK_OF(ASN1_OBJECT) // TODO(davidben): Should we just ignore all those parameters? NIDs and names // are only relevant for |ASN1_OBJECT|s in the obj.h table. OPENSSL_EXPORT ASN1_OBJECT *ASN1_OBJECT_create(int nid, const uint8_t *data, - int len, const char *sn, + size_t len, const char *sn, const char *ln); // ASN1_OBJECT_free releases memory associated with |a|. If |a| is a static From 898de8d09e10960e64901e2d9836cdea5dd1d1a6 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 11 Mar 2023 12:26:37 -0500 Subject: [PATCH 150/177] Rewrite c2i_ASN1_OBJECT Removing object reuse makes it dramatically simpler. Along the way, lift the OID validity checker into crypto/bytestring, so we can use it more generally. (Although the difference between invalid OID and unknown OID is pretty academic, so this check isn't that important.) For now I've preserved the existing behavior, where the OID validity checker accepts arbitrarily large OID components. Though this results in an oddity where the OID to string functions reject inputs that the parser accepts. (There we only allow up to 2^64-1.) Update-Note: When we removed object-reuse from all the d2i functions, we missed one d2i_ASN1_OBJECT. See https://boringssl-review.googlesource.com/c/boringssl/+/56647. Otherwise, this CL is not expected to change behavior. Change-Id: If4d2d83d9f3c96abfdc268e156f2cf3a9a903b0c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58147 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/a_object.c | 75 ++++++---------------------- crypto/bytestring/bytestring_test.cc | 24 ++++++--- crypto/bytestring/cbs.c | 23 +++++++++ include/openssl/bytestring.h | 8 +++ 4 files changed, 63 insertions(+), 67 deletions(-) diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c index 55b6dadb01..e501934135 100644 --- a/crypto/asn1/a_object.c +++ b/crypto/asn1/a_object.c @@ -153,77 +153,32 @@ ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **out, const unsigned char **inp, return ret; } -ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, +ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **out, const unsigned char **inp, long len) { - ASN1_OBJECT *ret = NULL; - const unsigned char *p; - unsigned char *data; - int i, length; - - // Sanity check OID encoding. Need at least one content octet. MSB must - // be clear in the last octet. can't have leading 0x80 in subidentifiers, - // see: X.690 8.19.2 - if (len <= 0 || len > INT_MAX || pp == NULL || (p = *pp) == NULL || - p[len - 1] & 0x80) { + if (len < 0) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); return NULL; } - // Now 0 < len <= INT_MAX, so the cast is safe. - length = (int)len; - for (i = 0; i < length; i++, p++) { - if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); - return NULL; - } - } - if ((a == NULL) || ((*a) == NULL) || - !((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) { - if ((ret = ASN1_OBJECT_new()) == NULL) { - return NULL; - } - } else { - ret = (*a); + CBS cbs; + CBS_init(&cbs, *inp, (size_t)len); + if (!CBS_is_valid_asn1_oid(&cbs)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_OBJECT_ENCODING); + return NULL; } - p = *pp; - // detach data from object - data = (unsigned char *)ret->data; - ret->data = NULL; - // once detached we can change it - if ((data == NULL) || (ret->length < length)) { - ret->length = 0; - OPENSSL_free(data); - data = (unsigned char *)OPENSSL_malloc(length); - if (data == NULL) { - goto err; - } - ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; - } - OPENSSL_memcpy(data, p, length); - // If there are dynamic strings, free them here, and clear the flag - if ((ret->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) != 0) { - OPENSSL_free((char *)ret->sn); - OPENSSL_free((char *)ret->ln); - ret->flags &= ~ASN1_OBJECT_FLAG_DYNAMIC_STRINGS; + ASN1_OBJECT *ret = ASN1_OBJECT_create(NID_undef, *inp, (size_t)len, + /*sn=*/NULL, /*ln=*/NULL); + if (ret == NULL) { + return NULL; } - // reattach data to object, after which it remains const - ret->data = data; - ret->length = length; - ret->sn = NULL; - ret->ln = NULL; - p += length; - if (a != NULL) { - (*a) = ret; + if (out != NULL) { + ASN1_OBJECT_free(*out); + *out = ret; } - *pp = p; + *inp += len; // All bytes were consumed. return ret; -err: - if ((ret != NULL) && ((a == NULL) || (*a != ret))) { - ASN1_OBJECT_free(ret); - } - return NULL; } ASN1_OBJECT *ASN1_OBJECT_new(void) { diff --git a/crypto/bytestring/bytestring_test.cc b/crypto/bytestring/bytestring_test.cc index ca22c41c39..10d34697a8 100644 --- a/crypto/bytestring/bytestring_test.cc +++ b/crypto/bytestring/bytestring_test.cc @@ -1199,16 +1199,23 @@ TEST(CBBTest, AddOIDFromText) { "2.18446744073709551536", }; - const std::vector kInvalidDER[] = { + const struct { + std::vector der; + // If true, |der| is valid but has a component that exceeds 2^64-1. + bool overflow; + } kInvalidDER[] = { // The empty string is not an OID. - {}, + {{}, false}, // Non-minimal representation. - {0x80, 0x01}, + {{0x80, 0x01}, false}, + // Unterminated integer. + {{0x01, 0x02, 0x83}, false}, // Overflow. This is the DER representation of // 1.2.840.113554.4.1.72585.18446744073709551616. (The final value is // 2^64.) - {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, - 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}, + {{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}, + true}, }; for (const auto &t : kValidOIDs) { @@ -1228,6 +1235,8 @@ TEST(CBBTest, AddOIDFromText) { bssl::UniquePtr text(CBS_asn1_oid_to_text(&cbs)); ASSERT_TRUE(text.get()); EXPECT_STREQ(t.text, text.get()); + + EXPECT_TRUE(CBS_is_valid_asn1_oid(&cbs)); } for (const char *t : kInvalidTexts) { @@ -1238,11 +1247,12 @@ TEST(CBBTest, AddOIDFromText) { } for (const auto &t : kInvalidDER) { - SCOPED_TRACE(Bytes(t)); + SCOPED_TRACE(Bytes(t.der)); CBS cbs; - CBS_init(&cbs, t.data(), t.size()); + CBS_init(&cbs, t.der.data(), t.der.size()); bssl::UniquePtr text(CBS_asn1_oid_to_text(&cbs)); EXPECT_FALSE(text); + EXPECT_EQ(t.overflow ? 1 : 0, CBS_is_valid_asn1_oid(&cbs)); } } diff --git a/crypto/bytestring/cbs.c b/crypto/bytestring/cbs.c index 8f815863c6..eb7e4dc984 100644 --- a/crypto/bytestring/cbs.c +++ b/crypto/bytestring/cbs.c @@ -698,6 +698,29 @@ static int add_decimal(CBB *out, uint64_t v) { return CBB_add_bytes(out, (const uint8_t *)buf, strlen(buf)); } +int CBS_is_valid_asn1_oid(const CBS *cbs) { + if (CBS_len(cbs) == 0) { + return 0; // OID encodings cannot be empty. + } + + CBS copy = *cbs; + uint8_t v, prev = 0; + while (CBS_get_u8(©, &v)) { + // OID encodings are a sequence of minimally-encoded base-128 integers (see + // |parse_base128_integer|). If |prev|'s MSB was clear, it was the last byte + // of an integer (or |v| is the first byte). |v| is then the first byte of + // the next integer. If first byte of an integer is 0x80, it is not + // minimally-encoded. + if ((prev & 0x80) == 0 && v == 0x80) { + return 0; + } + prev = v; + } + + // The last byte should must end an integer encoding. + return (prev & 0x80) == 0; +} + char *CBS_asn1_oid_to_text(const CBS *cbs) { CBB cbb; if (!CBB_init(&cbb, 32)) { diff --git a/include/openssl/bytestring.h b/include/openssl/bytestring.h index b6fdda83ea..33e13ef8ed 100644 --- a/include/openssl/bytestring.h +++ b/include/openssl/bytestring.h @@ -356,11 +356,19 @@ OPENSSL_EXPORT int CBS_is_valid_asn1_integer(const CBS *cbs, // ASN.1 INTEGER body and zero otherwise. OPENSSL_EXPORT int CBS_is_unsigned_asn1_integer(const CBS *cbs); +// CBS_is_valid_asn1_oid returns one if |cbs| is a valid DER-encoded ASN.1 +// OBJECT IDENTIFIER contents (not including the element framing) and zero +// otherwise. This function tolerates arbitrarily large OID components. +OPENSSL_EXPORT int CBS_is_valid_asn1_oid(const CBS *cbs); + // CBS_asn1_oid_to_text interprets |cbs| as DER-encoded ASN.1 OBJECT IDENTIFIER // contents (not including the element framing) and returns the ASCII // representation (e.g., "1.2.840.113554.4.1.72585") in a newly-allocated // string, or NULL on failure. The caller must release the result with // |OPENSSL_free|. +// +// This function may fail if |cbs| is an invalid OBJECT IDENTIFIER, or if any +// OID components are too large. OPENSSL_EXPORT char *CBS_asn1_oid_to_text(const CBS *cbs); From 92de195169d26d9f5cec7ef34df9194e614e50f8 Mon Sep 17 00:00:00 2001 From: Nabil Wadih Date: Mon, 20 Mar 2023 09:58:31 -0700 Subject: [PATCH 151/177] - remove dependency on hex-literal crate - add helper for converting between hex strings and bytes Change-Id: I073b597cfb1b2687dd7d1743441bdfaaf601810d Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58225 Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- rust/bssl-crypto/Cargo.toml | 5 +- rust/bssl-crypto/deny.toml | 3 - rust/bssl-crypto/src/aes.rs | 78 ++++++++-------- rust/bssl-crypto/src/hkdf.rs | 133 ++++++++++++--------------- rust/bssl-crypto/src/lib.rs | 3 + rust/bssl-crypto/src/test_helpers.rs | 31 +++++++ rust/bssl-sys/Cargo.toml | 2 - 7 files changed, 131 insertions(+), 124 deletions(-) create mode 100644 rust/bssl-crypto/src/test_helpers.rs diff --git a/rust/bssl-crypto/Cargo.toml b/rust/bssl-crypto/Cargo.toml index 552f0446ad..57a64401e8 100644 --- a/rust/bssl-crypto/Cargo.toml +++ b/rust/bssl-crypto/Cargo.toml @@ -8,7 +8,4 @@ license = "MIT" [dependencies] # the crate will need to be generated at this path by running this command at root # `mkdir build && cd build && cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja` -bssl-sys = {path = "../../build/rust/bssl-sys"} - -[dev-dependencies] -hex-literal = "0.3.4" \ No newline at end of file +bssl-sys = {path = "../../build/rust/bssl-sys"} \ No newline at end of file diff --git a/rust/bssl-crypto/deny.toml b/rust/bssl-crypto/deny.toml index 48cba429c9..cb3f345165 100644 --- a/rust/bssl-crypto/deny.toml +++ b/rust/bssl-crypto/deny.toml @@ -77,7 +77,6 @@ unlicensed = "deny" # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. allow = [ "MIT", - "Apache-2.0", ] # List of explicitly disallowed licenses # See https://spdx.org/licenses/ for list of possible licenses @@ -168,8 +167,6 @@ allow = [ { name = "bssl-crypto", version = "=0.1.0" }, # bssl-sys should be allowed, version appropriately. { name = "bssl-sys", version = "=0.1.0" }, - # hex-literal was added for ease of tests, but should be removed. - { name = "hex-literal", version = "=0.3.4" }, ] # List of crates to deny deny = [ diff --git a/rust/bssl-crypto/src/aes.rs b/rust/bssl-crypto/src/aes.rs index c2eb44125b..e3ec5bdaf5 100644 --- a/rust/bssl-crypto/src/aes.rs +++ b/rust/bssl-crypto/src/aes.rs @@ -123,102 +123,102 @@ fn new_decrypt_key(key: [u8; N]) -> AesDecryptKey { #[cfg(test)] mod tests { use crate::aes::{Aes, AesDecryptKey, AesEncryptKey}; - use hex_literal::hex; + use crate::test_helpers::decode_hex; // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.1 #[test] fn aes_128_test_encrypt() { - let key = AesEncryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c")); + let key = AesEncryptKey::new_aes_128(decode_hex("2b7e151628aed2a6abf7158809cf4f3c")); let mut block = [0_u8; 16]; - block.copy_from_slice(&hex!("6bc1bee22e409f96e93d7e117393172a")); + block.copy_from_slice(&decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a")); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("3ad77bb40d7a3660a89ecaf32466ef97"), block); + assert_eq!(decode_hex("3ad77bb40d7a3660a89ecaf32466ef97"), block); - block.copy_from_slice(&hex!("ae2d8a571e03ac9c9eb76fac45af8e51")); + block.copy_from_slice(&decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51")); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("f5d3d58503b9699de785895a96fdbaaf"), block); + assert_eq!(decode_hex("f5d3d58503b9699de785895a96fdbaaf"), block); - block.copy_from_slice(&hex!("30c81c46a35ce411e5fbc1191a0a52ef")); + block.copy_from_slice(&decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef")); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("43b1cd7f598ece23881b00e3ed030688"), block); + assert_eq!(decode_hex("43b1cd7f598ece23881b00e3ed030688"), block); - block.copy_from_slice(&hex!("f69f2445df4f9b17ad2b417be66c3710")); + block.copy_from_slice(&decode_hex::<16>("f69f2445df4f9b17ad2b417be66c3710")); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("7b0c785e27e8ad3f8223207104725dd4"), block); + assert_eq!(decode_hex("7b0c785e27e8ad3f8223207104725dd4"), block); } // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.2 #[test] fn aes_128_test_decrypt() { - let key = AesDecryptKey::new_aes_128(hex!("2b7e151628aed2a6abf7158809cf4f3c")); + let key = AesDecryptKey::new_aes_128(decode_hex("2b7e151628aed2a6abf7158809cf4f3c")); let mut block = [0_u8; 16]; - block.copy_from_slice(&hex!("3ad77bb40d7a3660a89ecaf32466ef97")); + block.copy_from_slice(&decode_hex::<16>("3ad77bb40d7a3660a89ecaf32466ef97")); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block); + assert_eq!(decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a"), block); - block.copy_from_slice(&hex!("f5d3d58503b9699de785895a96fdbaaf")); + block.copy_from_slice(&decode_hex::<16>("f5d3d58503b9699de785895a96fdbaaf")); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + assert_eq!(decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51"), block); - block.copy_from_slice(&hex!("43b1cd7f598ece23881b00e3ed030688")); + block.copy_from_slice(&decode_hex::<16>("43b1cd7f598ece23881b00e3ed030688")); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block); + assert_eq!(decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef"), block); - block.copy_from_slice(&hex!("7b0c785e27e8ad3f8223207104725dd4")); + block.copy_from_slice(&decode_hex::<16>("7b0c785e27e8ad3f8223207104725dd4").as_slice()); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block); + assert_eq!(decode_hex::<16>("f69f2445df4f9b17ad2b417be66c3710"), block); } // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.5 #[test] pub fn aes_256_test_encrypt() { - let key = AesEncryptKey::new_aes_256(hex!( - "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" + let key = AesEncryptKey::new_aes_256(decode_hex( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", )); let mut block: [u8; 16]; - block = hex!("6bc1bee22e409f96e93d7e117393172a"); + block = decode_hex("6bc1bee22e409f96e93d7e117393172a"); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("f3eed1bdb5d2a03c064b5a7e3db181f8"), block); + assert_eq!(decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8"), block); - block = hex!("ae2d8a571e03ac9c9eb76fac45af8e51"); + block = decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51"); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("591ccb10d410ed26dc5ba74a31362870"), block); + assert_eq!(decode_hex("591ccb10d410ed26dc5ba74a31362870"), block); - block = hex!("30c81c46a35ce411e5fbc1191a0a52ef"); + block = decode_hex("30c81c46a35ce411e5fbc1191a0a52ef"); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("b6ed21b99ca6f4f9f153e7b1beafed1d"), block); + assert_eq!(decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d"), block); - block = hex!("f69f2445df4f9b17ad2b417be66c3710"); + block = decode_hex("f69f2445df4f9b17ad2b417be66c3710"); Aes::encrypt(&key, &mut block); - assert_eq!(hex!("23304b7a39f9f3ff067d8d8f9e24ecc7"), block); + assert_eq!(decode_hex("23304b7a39f9f3ff067d8d8f9e24ecc7"), block); } // test data from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf F.1.6 #[test] fn aes_256_test_decrypt() { - let key = AesDecryptKey::new_aes_256(hex!( - "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4" + let key = AesDecryptKey::new_aes_256(decode_hex( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", )); let mut block: [u8; 16]; - block = hex!("f3eed1bdb5d2a03c064b5a7e3db181f8"); + block = decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8"); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("6bc1bee22e409f96e93d7e117393172a"), block); + assert_eq!(decode_hex("6bc1bee22e409f96e93d7e117393172a"), block); - block = hex!("591ccb10d410ed26dc5ba74a31362870"); + block = decode_hex("591ccb10d410ed26dc5ba74a31362870"); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + assert_eq!(decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51"), block); - block = hex!("b6ed21b99ca6f4f9f153e7b1beafed1d"); + block = decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d"); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("30c81c46a35ce411e5fbc1191a0a52ef"), block); + assert_eq!(decode_hex("30c81c46a35ce411e5fbc1191a0a52ef"), block); - block = hex!("23304b7a39f9f3ff067d8d8f9e24ecc7"); + block = decode_hex("23304b7a39f9f3ff067d8d8f9e24ecc7"); Aes::decrypt(&key, &mut block); - assert_eq!(hex!("f69f2445df4f9b17ad2b417be66c3710"), block); + assert_eq!(decode_hex("f69f2445df4f9b17ad2b417be66c3710"), block); } } diff --git a/rust/bssl-crypto/src/hkdf.rs b/rust/bssl-crypto/src/hkdf.rs index db6c5b6897..66b8d60e30 100644 --- a/rust/bssl-crypto/src/hkdf.rs +++ b/rust/bssl-crypto/src/hkdf.rs @@ -97,45 +97,45 @@ impl Hkdf { #[cfg(test)] mod tests { use crate::hkdf::{HkdfSha256, HkdfSha512}; + use crate::test_helpers::{decode_hex, decode_hex_into_vec}; use core::iter; - use hex_literal::hex; - struct Test<'a> { - ikm: &'a [u8], - salt: &'a [u8], - info: &'a [u8], - okm: &'a [u8], + struct Test { + ikm: Vec, + salt: Vec, + info: Vec, + okm: Vec, } #[test] fn hkdf_sha_256_test() { - let ikm = hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"); - let salt = hex!("000102030405060708090a0b0c"); - let info = hex!("f0f1f2f3f4f5f6f7f8f9"); + let ikm = decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"); + let salt = decode_hex_into_vec("000102030405060708090a0b0c"); + let info = decode_hex_into_vec("f0f1f2f3f4f5f6f7f8f9"); - let hk = HkdfSha256::new(Some(&salt[..]), &ikm); + let hk = HkdfSha256::new(Some(salt.as_slice()), ikm.as_slice()); let mut okm = [0u8; 42]; hk.expand(&info, &mut okm) .expect("42 is a valid length for Sha256 to output"); - let expected = hex!( - "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865" + let expected = decode_hex( + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865", ); assert_eq!(okm, expected); } #[test] fn hkdf_sha512_test() { - let ikm = hex!("5d3db20e8238a90b62a600fa57fdb318"); - let salt = hex!("1d6f3b38a1e607b5e6bcd4af1800a9d3"); - let info = hex!("2bc5f39032b6fc87da69ba8711ce735b169646fd"); + let ikm = decode_hex_into_vec("5d3db20e8238a90b62a600fa57fdb318"); + let salt = decode_hex_into_vec("1d6f3b38a1e607b5e6bcd4af1800a9d3"); + let info = decode_hex_into_vec("2bc5f39032b6fc87da69ba8711ce735b169646fd"); - let hk = HkdfSha512::new(Some(&salt[..]), &ikm); + let hk = HkdfSha512::new(Some(salt.as_slice()), ikm.as_slice()); let mut okm = [0u8; 42]; hk.expand(&info, &mut okm).expect("Should succeed"); - let expected = hex!( - "8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae" + let expected = decode_hex( + "8c3cf7122dcb5eb7efaf02718f1faf70bca20dcb75070e9d0871a413a6c05fc195a75aa9ffc349d70aae", ); assert_eq!(okm, expected); } @@ -146,69 +146,50 @@ mod tests { let tests = [ Test { // Test Case 1 - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!("000102030405060708090a0b0c"), - info: &hex!("f0f1f2f3f4f5f6f7f8f9"), - okm: &hex!( - " - 3cb25f25faacd57a90434f64d0362f2a - 2d2d0a90cf1a5a4c5db02d56ecc4c5bf - 34007208d5b887185865 - " - ), + ikm: decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), + salt: decode_hex_into_vec("000102030405060708090a0b0c"), + info: decode_hex_into_vec("f0f1f2f3f4f5f6f7f8f9"), + okm: decode_hex_into_vec("3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865") }, Test { // Test Case 2 - ikm: &hex!( - " - 000102030405060708090a0b0c0d0e0f - 101112131415161718191a1b1c1d1e1f - 202122232425262728292a2b2c2d2e2f - 303132333435363738393a3b3c3d3e3f - 404142434445464748494a4b4c4d4e4f - " - ), - salt: &hex!( - " - 606162636465666768696a6b6c6d6e6f - 707172737475767778797a7b7c7d7e7f - 808182838485868788898a8b8c8d8e8f - 909192939495969798999a9b9c9d9e9f - a0a1a2a3a4a5a6a7a8a9aaabacadaeaf - " + ikm: decode_hex_into_vec( + "000102030405060708090a0b0c0d0e0f\ + 101112131415161718191a1b1c1d1e1f\ + 202122232425262728292a2b2c2d2e2f\ + 303132333435363738393a3b3c3d3e3f\ + 404142434445464748494a4b4c4d4e4f", ), - info: &hex!( - " - b0b1b2b3b4b5b6b7b8b9babbbcbdbebf - c0c1c2c3c4c5c6c7c8c9cacbcccdcecf - d0d1d2d3d4d5d6d7d8d9dadbdcdddedf - e0e1e2e3e4e5e6e7e8e9eaebecedeeef - f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff - " + salt: decode_hex_into_vec( + "606162636465666768696a6b6c6d6e6f\ + 707172737475767778797a7b7c7d7e7f\ + 808182838485868788898a8b8c8d8e8f\ + 909192939495969798999a9b9c9d9e9f\ + a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", ), - okm: &hex!( - " - b11e398dc80327a1c8e7f78c596a4934 - 4f012eda2d4efad8a050cc4c19afa97c - 59045a99cac7827271cb41c65e590e09 - da3275600c2f09b8367793a9aca3db71 - cc30c58179ec3e87c14c01d5c1f3434f - 1d87 - " + info: decode_hex_into_vec( + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf\ + c0c1c2c3c4c5c6c7c8c9cacbcccdcecf\ + d0d1d2d3d4d5d6d7d8d9dadbdcdddedf\ + e0e1e2e3e4e5e6e7e8e9eaebecedeeef\ + f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", ), + okm: decode_hex_into_vec( + "b11e398dc80327a1c8e7f78c596a4934\ + 4f012eda2d4efad8a050cc4c19afa97c\ + 59045a99cac7827271cb41c65e590e09\ + da3275600c2f09b8367793a9aca3db71\ + cc30c58179ec3e87c14c01d5c1f3434f\ + 1d87", + ) }, Test { // Test Case 3 - ikm: &hex!("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), - salt: &hex!(""), - info: &hex!(""), - okm: &hex!( - " - 8da4e775a563c18f715f802a063c5a31 - b8a11f5c5ee1879ec3454e5f3c738d2d - 9d201395faa4b61a96c8 - " - ), + ikm: decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), + salt: Vec::new(), + info: Vec::new(), + okm: decode_hex_into_vec( + "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8"), }, ]; for Test { @@ -221,12 +202,12 @@ mod tests { let salt = if salt.is_empty() { None } else { - Some(&salt[..]) + Some(salt.as_slice()) }; - let hkdf = HkdfSha256::new(salt, ikm); + let hkdf = HkdfSha256::new(salt, ikm.as_slice()); let mut okm2 = vec![0u8; okm.len()]; - assert!(hkdf.expand(&info[..], &mut okm2).is_ok()); - assert_eq!(okm2[..], okm[..]); + assert!(hkdf.expand(info.as_slice(), &mut okm2).is_ok()); + assert_eq!(okm2.as_slice(), okm.as_slice()); } } diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs index 9c4a2143e0..840033752e 100644 --- a/rust/bssl-crypto/src/lib.rs +++ b/rust/bssl-crypto/src/lib.rs @@ -37,6 +37,9 @@ pub mod hkdf; /// BoringSSL implemented hmac operations. pub mod hmac; +#[cfg(test)] +mod test_helpers; + /// This is a helper struct which provides functions for passing slices over FFI. struct CSlice<'a>(&'a [u8]); diff --git a/rust/bssl-crypto/src/test_helpers.rs b/rust/bssl-crypto/src/test_helpers.rs new file mode 100644 index 0000000000..ea2d9dbcc9 --- /dev/null +++ b/rust/bssl-crypto/src/test_helpers.rs @@ -0,0 +1,31 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +pub(crate) fn decode_hex(s: &str) -> [u8; N] { + (0..s.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("Invalid hex string")) + .collect::>() + .as_slice() + .try_into() + .unwrap() +} + +pub(crate) fn decode_hex_into_vec(s: &str) -> Vec { + (0..s.len()) + .step_by(2) + .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("Invalid hex string")) + .collect::>() +} diff --git a/rust/bssl-sys/Cargo.toml b/rust/bssl-sys/Cargo.toml index fe5f47f96a..634ed3cf7f 100644 --- a/rust/bssl-sys/Cargo.toml +++ b/rust/bssl-sys/Cargo.toml @@ -5,5 +5,3 @@ authors = ["Benjamin Brittain "] edition = "2018" publish = false license = "MIT" - -[dependencies] From 8c8629bfd89436e5019b6bd3c65cff4bf1a76b76 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 13 Mar 2023 11:58:08 -0400 Subject: [PATCH 152/177] Represent unknown universal types with V_ASN1_OTHER OpenSSL's ASN1_STRING representation has many cases. There's a grab-bag V_ASN1_OTHER cases that can represent any element. But it is currently only used for non-universal tags. Unknown universal tags go into the type field directly. This has a few problems: - Certain high values, V_ASN1_NEG_INTEGER and V_ASN1_NEG_ENUMERATED, are treated special. This was one of the two causes behind CVE-2016-2108 and had to be worked around with V_ASN1_MAX_UNIVERSAL. - OpenSSL can never compatibly support a new universal type in a non-ASN1_STRING form. Otherwise ASN1_TYPE's union changes its in-memory representation. - It is a bit ambiguous when OpenSSL does or doesn't know the type. - This is broadly implemented by having a default in all the switch/cases, which is a little awkward. - It's yet another "unknown tag" case when V_ASN1_OTHER covers such cases just fine. Remove this representation and use V_ASN1_OTHER. This more unambiguously resolves CVE-2016-2108. ASN1_STRING's and ASN1_TYPE's respective type fields are now a closed set. Update the documenthation accordingly. Formally allowing universal types in ASN1_STRING also opens the door to clearing the ASN1_PRINTABLE mess (https://crbug.com/boringssl/412). BoringSSL currently rejects X.509 names that are actually valid, because the OpenSSL X509_NAME representation cannot represent them. This allows us to introduce an ASN1_STRING-based ANY representation, which just represents all non-ASN1_STRING types in an V_ASN1_OTHER. The implementation is a little clumsy (the way things tasn_dec.c is written, I had to introduce yet another check), but I'm hoping that, when the parser is rewritten with CBS, this can be integrated into a single type dispatch. Update-Note: This does not change the set of inputs accepted or rejected by the ASN.1 parser. It does, however, change the in-memory representation in edge cases. Unless the application was specifically inspecting the in-memory representation for these unknown types, we expect this to have no impact. Fixed: 561 Change-Id: Ibf9550e285ce50b11c7609d28b139354b9dd41dc Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58148 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/asn1_test.cc | 100 ++++++++++++++++++++++++--------------- crypto/asn1/tasn_dec.c | 25 ++++++++-- crypto/asn1/tasn_enc.c | 8 +++- include/openssl/asn1.h | 76 +++++++++++++++-------------- 4 files changed, 130 insertions(+), 79 deletions(-) diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 640b726810..1421462006 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -40,45 +40,6 @@ #endif -// kTag128 is an ASN.1 structure with a universal tag with number 128. -static const uint8_t kTag128[] = { - 0x1f, 0x81, 0x00, 0x01, 0x00, -}; - -// kTag258 is an ASN.1 structure with a universal tag with number 258. -static const uint8_t kTag258[] = { - 0x1f, 0x82, 0x02, 0x01, 0x00, -}; - -static_assert(V_ASN1_NEG_INTEGER == 258, - "V_ASN1_NEG_INTEGER changed. Update kTag258 to collide with it."); - -// kTagOverflow is an ASN.1 structure with a universal tag with number 2^35-1, -// which will not fit in an int. -static const uint8_t kTagOverflow[] = { - 0x1f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, -}; - -TEST(ASN1Test, LargeTags) { - const uint8_t *p = kTag258; - bssl::UniquePtr obj(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag258))); - EXPECT_FALSE(obj) << "Parsed value with illegal tag" << obj->type; - ERR_clear_error(); - - p = kTagOverflow; - obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTagOverflow))); - EXPECT_FALSE(obj) << "Parsed value with tag overflow" << obj->type; - ERR_clear_error(); - - p = kTag128; - obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag128))); - ASSERT_TRUE(obj); - EXPECT_EQ(128, obj->type); - const uint8_t kZero = 0; - EXPECT_EQ(Bytes(&kZero, 1), Bytes(obj->value.asn1_string->data, - obj->value.asn1_string->length)); -} - // |obj| and |i2d_func| require different template parameters because C++ may // deduce, say, |ASN1_STRING*| via |obj| and |const ASN1_STRING*| via // |i2d_func|. Template argument deduction then fails. The language is not able @@ -107,6 +68,67 @@ void TestSerialize(T obj, int (*i2d_func)(U a, uint8_t **pp), EXPECT_EQ(Bytes(expected), Bytes(buf)); } +// Historically, unknown universal tags were represented in |ASN1_TYPE| as +// |ASN1_STRING|s with the type matching the tag number. This can collide with +// |V_ASN_NEG|, which was one of the causes of CVE-2016-2108. We now represent +// unsupported values with |V_ASN1_OTHER|, but retain the |V_ASN1_MAX_UNIVERSAL| +// limit. +TEST(ASN1Test, UnknownTags) { + // kTag258 is an ASN.1 structure with a universal tag with number 258. + static const uint8_t kTag258[] = {0x1f, 0x82, 0x02, 0x01, 0x00}; + static_assert( + V_ASN1_NEG_INTEGER == 258, + "V_ASN1_NEG_INTEGER changed. Update kTag258 to collide with it."); + const uint8_t *p = kTag258; + bssl::UniquePtr obj(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag258))); + EXPECT_FALSE(obj) << "Parsed value with illegal tag" << obj->type; + ERR_clear_error(); + + // kTagOverflow is an ASN.1 structure with a universal tag with number 2^35-1, + // which will not fit in an int. + static const uint8_t kTagOverflow[] = {0x1f, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x01, 0x00}; + p = kTagOverflow; + obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTagOverflow))); + EXPECT_FALSE(obj) << "Parsed value with tag overflow" << obj->type; + ERR_clear_error(); + + // kTag128 is an ASN.1 structure with a universal tag with number 128. It + // should be parsed as |V_ASN1_OTHER|. + static const uint8_t kTag128[] = {0x1f, 0x81, 0x00, 0x01, 0x00}; + p = kTag128; + obj.reset(d2i_ASN1_TYPE(NULL, &p, sizeof(kTag128))); + ASSERT_TRUE(obj); + EXPECT_EQ(V_ASN1_OTHER, obj->type); + EXPECT_EQ(Bytes(kTag128), Bytes(obj->value.asn1_string->data, + obj->value.asn1_string->length)); + TestSerialize(obj.get(), i2d_ASN1_TYPE, kTag128); + + // The historical in-memory representation of |kTag128| was for both + // |obj->type| and |obj->value.asn1_string->type| to be NULL. This is no + // longer used and should be rejected by the encoder. + obj.reset(ASN1_TYPE_new()); + ASSERT_TRUE(obj); + obj->type = 128; + obj->value.asn1_string = ASN1_STRING_type_new(128); + ASSERT_TRUE(obj->value.asn1_string); + const uint8_t zero = 0; + ASSERT_TRUE(ASN1_STRING_set(obj->value.asn1_string, &zero, sizeof(zero))); + EXPECT_EQ(-1, i2d_ASN1_TYPE(obj.get(), nullptr)); + + // If a tag is known, but has the wrong constructed bit, it should be + // rejected, not placed in |V_ASN1_OTHER|. + static const uint8_t kConstructedOctetString[] = {0x24, 0x00}; + p = kConstructedOctetString; + obj.reset(d2i_ASN1_TYPE(nullptr, &p, sizeof(kConstructedOctetString))); + EXPECT_FALSE(obj); + + static const uint8_t kPrimitiveSequence[] = {0x10, 0x00}; + p = kPrimitiveSequence; + obj.reset(d2i_ASN1_TYPE(nullptr, &p, sizeof(kPrimitiveSequence))); + EXPECT_FALSE(obj); +} + static bssl::UniquePtr BIGNUMPow2(unsigned bit) { bssl::UniquePtr bn(BN_new()); if (!bn || diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 4f25fbbac1..23c526e0f1 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -136,6 +136,23 @@ unsigned long ASN1_tag2bit(int tag) { return tag2bit[tag]; } +static int is_supported_universal_type(int tag, int aclass) { + if (aclass != V_ASN1_UNIVERSAL) { + return 0; + } + return tag == V_ASN1_OBJECT || tag == V_ASN1_NULL || tag == V_ASN1_BOOLEAN || + tag == V_ASN1_BIT_STRING || tag == V_ASN1_INTEGER || + tag == V_ASN1_ENUMERATED || tag == V_ASN1_OCTET_STRING || + tag == V_ASN1_NUMERICSTRING || tag == V_ASN1_PRINTABLESTRING || + tag == V_ASN1_T61STRING || tag == V_ASN1_VIDEOTEXSTRING || + tag == V_ASN1_IA5STRING || tag == V_ASN1_UTCTIME || + tag == V_ASN1_GENERALIZEDTIME || tag == V_ASN1_GRAPHICSTRING || + tag == V_ASN1_VISIBLESTRING || tag == V_ASN1_GENERALSTRING || + tag == V_ASN1_UNIVERSALSTRING || tag == V_ASN1_BMPSTRING || + tag == V_ASN1_UTF8STRING || tag == V_ASN1_SET || + tag == V_ASN1_SEQUENCE; +} + // Macro to initialize and invalidate the cache // Decode an ASN1 item, this currently behaves just like a standard 'd2i' @@ -677,7 +694,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); return 0; } - if (oclass != V_ASN1_UNIVERSAL) { + if (!is_supported_universal_type(utype, oclass)) { utype = V_ASN1_OTHER; } } @@ -820,8 +837,7 @@ static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, case V_ASN1_UTF8STRING: case V_ASN1_OTHER: case V_ASN1_SET: - case V_ASN1_SEQUENCE: - default: { + case V_ASN1_SEQUENCE: { CBS cbs; CBS_init(&cbs, cont, (size_t)len); if (utype == V_ASN1_BMPSTRING) { @@ -884,6 +900,9 @@ static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, } break; } + default: + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); + goto err; } // If ASN1_ANY and NULL type fix up value if (typ && (utype == V_ASN1_NULL)) { diff --git a/crypto/asn1/tasn_enc.c b/crypto/asn1/tasn_enc.c index ca3b3fc504..b0d72ce86e 100644 --- a/crypto/asn1/tasn_enc.c +++ b/crypto/asn1/tasn_enc.c @@ -691,13 +691,17 @@ static int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cout, int *out_omit, case V_ASN1_UTF8STRING: case V_ASN1_SEQUENCE: case V_ASN1_SET: - default: + // This is not a valid |ASN1_ITEM| type, but it appears in |ASN1_TYPE|. + case V_ASN1_OTHER: // All based on ASN1_STRING and handled the same strtmp = (ASN1_STRING *)*pval; cont = strtmp->data; len = strtmp->length; - break; + + default: + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BAD_TEMPLATE); + return -1; } if (cout && len) { OPENSSL_memcpy(cout, cont, len); diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 59996b66f5..030306b54f 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -467,31 +467,39 @@ DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) // |ASN1_STRING|, to represent most values. // An asn1_string_st (aka |ASN1_STRING|) represents a value of a string-like -// ASN.1 type. It contains a type field, and a byte string data field with a +// ASN.1 type. It contains a |type| field, and a byte string |data| field with a // type-specific representation. // -// When representing a string value, the type field is one of -// |V_ASN1_OCTET_STRING|, |V_ASN1_UTF8STRING|, |V_ASN1_NUMERICSTRING|, -// |V_ASN1_PRINTABLESTRING|, |V_ASN1_T61STRING|, |V_ASN1_VIDEOTEXSTRING|, -// |V_ASN1_IA5STRING|, |V_ASN1_GRAPHICSTRING|, |V_ASN1_ISO64STRING|, -// |V_ASN1_VISIBLESTRING|, |V_ASN1_GENERALSTRING|, |V_ASN1_UNIVERSALSTRING|, or -// |V_ASN1_BMPSTRING|. The data contains the byte representation of of the +// If |type| is one of |V_ASN1_OCTET_STRING|, |V_ASN1_UTF8STRING|, +// |V_ASN1_NUMERICSTRING|, |V_ASN1_PRINTABLESTRING|, |V_ASN1_T61STRING|, +// |V_ASN1_VIDEOTEXSTRING|, |V_ASN1_IA5STRING|, |V_ASN1_GRAPHICSTRING|, +// |V_ASN1_ISO64STRING|, |V_ASN1_VISIBLESTRING|, |V_ASN1_GENERALSTRING|, +// |V_ASN1_UNIVERSALSTRING|, or |V_ASN1_BMPSTRING|, the object represents an +// ASN.1 string type. The data contains the byte representation of the // string. // -// When representing a BIT STRING value, the type field is |V_ASN1_BIT_STRING|. -// See bit string documentation below for how the data and flags are used. +// If |type| is |V_ASN1_BIT_STRING|, the object represents a BIT STRING value. +// See bit string documentation below for the data and flags. // -// When representing an INTEGER or ENUMERATED value, the type field is one of -// |V_ASN1_INTEGER|, |V_ASN1_NEG_INTEGER|, |V_ASN1_ENUMERATED|, or -// |V_ASN1_NEG_ENUMERATED|. See integer documentation below for details. +// If |type| is one of |V_ASN1_INTEGER|, |V_ASN1_NEG_INTEGER|, +// |V_ASN1_ENUMERATED|, or |V_ASN1_NEG_ENUMERATED|, the object represents an +// INTEGER or ENUMERATED value. See integer documentation below for details. // -// When representing a GeneralizedTime or UTCTime value, the type field is -// |V_ASN1_GENERALIZEDTIME| or |V_ASN1_UTCTIME|, respectively. The data contains -// the DER encoding of the value. For example, the UNIX epoch would be +// If |type| is |V_ASN1_GENERALIZEDTIME| or |V_ASN1_UTCTIME|, the object +// represents a GeneralizedTime or UTCTime value, respectively. The data +// contains the DER encoding of the value. For example, the UNIX epoch would be // "19700101000000Z" for a GeneralizedTime and "700101000000Z" for a UTCTime. // -// |ASN1_STRING|, when stored in an |ASN1_TYPE|, may also represent an element -// with tag not directly supported by this library. See |ASN1_TYPE| for details. +// If |type| is |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or |V_ASN1_OTHER|, the object +// represents a SEQUENCE, SET, or arbitrary ASN.1 value, respectively. Unlike +// the above cases, the data contains the DER encoding of the entire structure, +// including the header. If the value is explicitly or implicitly tagged, this +// too will be reflected in the data field. As this case handles unknown types, +// the contents are not checked when parsing or serializing. +// +// Other values of |type| do not represent a valid ASN.1 value, though +// default-constructed objects may set |type| to -1. Such objects cannot be +// serialized. // // |ASN1_STRING| additionally has the following typedefs: |ASN1_BIT_STRING|, // |ASN1_BMPSTRING|, |ASN1_ENUMERATED|, |ASN1_GENERALIZEDTIME|, @@ -508,15 +516,14 @@ DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) // |ASN1_STRING_length|. // // If a function returns an |ASN1_STRING| where the typedef or ASN.1 structure -// implies constraints on the type field, callers may assume that the type field -// is correct. However, if a function takes an |ASN1_STRING| as input, callers -// must ensure the type field matches. These invariants are not captured by the -// C type system and may not be checked at runtime. For example, callers may -// assume the output of |X509_get0_serialNumber| has type |V_ASN1_INTEGER| or -// |V_ASN1_NEG_INTEGER|. Callers must not pass a string of type -// |V_ASN1_OCTET_STRING| to |X509_set_serialNumber|. Doing so may break -// invariants on the |X509| object and break the |X509_get0_serialNumber| -// invariant. +// implies constraints on |type|, callers may assume that |type| is correct. +// However, if a function takes an |ASN1_STRING| as input, callers must ensure +// |type| matches. These invariants are not captured by the C type system and +// may not be checked at runtime. For example, callers may assume the output of +// |X509_get0_serialNumber| has type |V_ASN1_INTEGER| or |V_ASN1_NEG_INTEGER|. +// Callers must not pass a string of type |V_ASN1_OCTET_STRING| to +// |X509_set_serialNumber|. Doing so may break invariants on the |X509| object +// and break the |X509_get0_serialNumber| invariant. // // TODO(https://crbug.com/boringssl/445): This is very unfriendly. Getting the // type field wrong should not cause memory errors, but it may do strange @@ -1492,15 +1499,14 @@ DECLARE_ASN1_ITEM(ASN1_OBJECT) // |ASN1_BOOLEAN|. // // If |type| is |V_ASN1_SEQUENCE|, |V_ASN1_SET|, or |V_ASN1_OTHER|, the tag is -// SEQUENCE, SET, or some non-universal tag, respectively. |value| is an -// |ASN1_STRING| containing the entire element, including the tag and length. -// The |ASN1_STRING|'s |type| field matches the containing |ASN1_TYPE|'s |type|. -// -// Other positive values of |type|, up to |V_ASN1_MAX_UNIVERSAL|, correspond to -// universal primitive tags not directly supported by this library. |value| is -// an |ASN1_STRING| containing the body of the element, excluding the tag -// and length. The |ASN1_STRING|'s |type| field matches the containing -// |ASN1_TYPE|'s |type|. +// SEQUENCE, SET, or some arbitrary tag, respectively. |value| uses the +// corresponding |ASN1_STRING| representation. Although any type may be +// represented in |V_ASN1_OTHER|, the parser will always return the more +// specific encoding when available. +// +// Other values of |type| do not represent a valid ASN.1 value, though +// default-constructed objects may set |type| to -1. Such objects cannot be +// serialized. struct asn1_type_st { int type; union { From 172b291d3db3fa17b51e76cf02eb2d5e24db1af0 Mon Sep 17 00:00:00 2001 From: Nabil Wadih Date: Mon, 20 Mar 2023 16:27:35 -0700 Subject: [PATCH 153/177] add bindings to RAND_bytes Change-Id: I9ec56ae8d4ca0a28dccbf2a04c4c675791c053b8 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58265 Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- rust/bssl-crypto/src/lib.rs | 3 +++ rust/bssl-crypto/src/rand.rs | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 rust/bssl-crypto/src/rand.rs diff --git a/rust/bssl-crypto/src/lib.rs b/rust/bssl-crypto/src/lib.rs index 840033752e..9024ed4b96 100644 --- a/rust/bssl-crypto/src/lib.rs +++ b/rust/bssl-crypto/src/lib.rs @@ -37,6 +37,9 @@ pub mod hkdf; /// BoringSSL implemented hmac operations. pub mod hmac; +/// BoringSSL implemented cryptographically secure pseudo-random number generation. +pub mod rand; + #[cfg(test)] mod test_helpers; diff --git a/rust/bssl-crypto/src/rand.rs b/rust/bssl-crypto/src/rand.rs new file mode 100644 index 0000000000..9fdbe0a7ec --- /dev/null +++ b/rust/bssl-crypto/src/rand.rs @@ -0,0 +1,41 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +use crate::CSliceMut; + +/// Fills buf with random bytes. In the event that sufficient random data can not be obtained, +/// BoringSSL will abort, so the assert will never be hit. +pub fn rand_bytes(buf: &mut [u8]) { + let mut ffi_buf = CSliceMut::from(buf); + let result = unsafe { bssl_sys::RAND_bytes(ffi_buf.as_mut_ptr(), ffi_buf.len()) }; + assert_eq!(result, 1, "BoringSSL RAND_bytes API failed unexpectedly"); +} + +#[cfg(test)] +mod tests { + use super::rand_bytes; + + #[test] + fn test_rand_bytes() { + let mut buf = [0; 32]; + rand_bytes(&mut buf); + } + + #[test] + fn test_rand_bytes_empty() { + let mut buf = []; + rand_bytes(&mut buf); + } +} From 2a52444f9d9e66b0dc317b8b25bdb4a3e4c7518c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 16 Mar 2023 01:01:27 -0400 Subject: [PATCH 154/177] Reimplement X509 parsing without templates This is a cursory conversion and is, currently, very tedious because it needs to bridge calling conventions. After tasn_*.c and all the underlying primitives have CBS/CBB-based calling conventions, this should be a lot cleaner. This is to break a dependency cycle: - We'd like to rewrite d2i_X509 with CBS - To do that, we need to rewrite its underlying types with CBS - Those parsers are tied up in tasn_dec.c, so we effectively need to rewrite tasn_dec.c with CBS. - CBS is designed for DER, not BER, so such a change would most naturally switch the TLV parser to require DER. - We've *almost* done that already except https://boringssl-review.googlesource.com/c/boringssl/+/51626 had to stop at non-minimal definite lengths, which are allowed in BER but forbidden in DER. See b/18228011 for a bunch of certificates which have a non-minimal definite length at *just* the signature field. - So, to do that, we'd ideally special case just that field, or BIT STRINGs in general, to tolerate minimal lengths. That's easiest done when d2i_X509 is CBS, so we can just do what we want in imperative code. And thus we're back full circle. So, detach X509 from the templates now. It's a bit tedious because we need to switch calling conventions for now, but it breaks the cycle. Later, we can revisit this and get all the benefits of a fully CBS-based path. For now, I haven't added an ASN1_ITEM. If it comes up, we can make an EXTERN ASN1_ITEM. Update-Note: The ASN1_ITEM removal means custom ASN.1 templates (which are discouraged in favor of our much simpler CBS and CBB types) using X509 will fail to compile. We don't believe anyone is relying on this, but this can be restored if we find something. Update-Note: Certificate parsing is slightly stricter: the outermost TLVs, except for the signature field, no longer accept non-minimal lengths, as mandated by DER. This strictness was broadly already applied by the libssl parser. Bug: 547 Change-Id: Ie5ad8ba4bb39f54fdd3dd45c53965b72a3850709 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58185 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509/x509_test.cc | 33 +++++ crypto/x509/x_all.c | 37 +++-- crypto/x509/x_x509.c | 289 +++++++++++++++++++++++++++++---------- include/openssl/x509.h | 4 - 4 files changed, 268 insertions(+), 95 deletions(-) diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 737cb1058a..8adba6c68f 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -4134,6 +4134,34 @@ soBsxWI= -----END CERTIFICATE----- )"; +// kNonMinimalLengthOuter is an X.509 certificate where the outermost SEQUENCE +// has a non-minimal length. +static const char kNonMinimalLengthOuter[] = R"( +-----BEGIN CERTIFICATE----- +MIMAASAwgcagAwIBAgICBNIwCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEVGVzdDAg +Fw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsGA1UEAxMEVGVz +dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWXa7ep +Hg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsGjEDAO +MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKnSIhfmzfQpeOKFHiAq +cml3ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh4qnk +soBsxWI= +-----END CERTIFICATE----- +)"; + +// kNonMinimalLengthSignature is an X.509 certificate where the signature +// has a non-minimal length. +static const char kNonMinimalLengthSignature[] = R"( +-----BEGIN CERTIFICATE----- +MIIBITCBxqADAgECAgIE0jAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDEwRUZXN0MCAX +DTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYDVQQDEwRUZXN0 +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4NlIpM1Zdrt6ke +DUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1Lz3IiwaMQMA4w +DAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgOBSQAwRgIhAKnSIhfmzfQpeOKFHiAq +cml3ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh4qnk +soBsxWI= +-----END CERTIFICATE----- +)"; + TEST(X509Test, BER) { // Constructed strings are forbidden in DER. EXPECT_FALSE(CertFromPEM(kConstructedBitString)); @@ -4145,6 +4173,11 @@ TEST(X509Test, BER) { // Tags must be minimal in both BER and DER, though many BER decoders // incorrectly support non-minimal tags. EXPECT_FALSE(CertFromPEM(kHighTagNumber)); + // Lengths must be minimal in DER. + EXPECT_FALSE(CertFromPEM(kNonMinimalLengthOuter)); + // We, for now, accept a non-minimal length in the signature field. See + // b/18228011. + EXPECT_TRUE(CertFromPEM(kNonMinimalLengthSignature)); } TEST(X509Test, Names) { diff --git a/crypto/x509/x_all.c b/crypto/x509/x_all.c index 23508c07f4..6808ab78b1 100644 --- a/crypto/x509/x_all.c +++ b/crypto/x509/x_all.c @@ -130,22 +130,6 @@ int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey) { spki->signature, spki->spkac, pkey)); } -X509 *d2i_X509_fp(FILE *fp, X509 **x509) { - return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509); -} - -int i2d_X509_fp(FILE *fp, X509 *x509) { - return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509); -} - -X509 *d2i_X509_bio(BIO *bp, X509 **x509) { - return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509); -} - -int i2d_X509_bio(BIO *bp, X509 *x509) { - return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509); -} - X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl) { return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl); } @@ -201,6 +185,9 @@ int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req) { return ret; \ } +IMPLEMENT_D2I_FP(X509, d2i_X509_fp, d2i_X509_bio); +IMPLEMENT_I2D_FP(X509, i2d_X509_fp, i2d_X509_bio); + IMPLEMENT_D2I_FP(RSA, d2i_RSAPrivateKey_fp, d2i_RSAPrivateKey_bio) IMPLEMENT_I2D_FP(RSA, i2d_RSAPrivateKey_fp, i2d_RSAPrivateKey_bio) @@ -235,6 +222,9 @@ IMPLEMENT_I2D_FP(RSA, i2d_RSA_PUBKEY_fp, i2d_RSA_PUBKEY_bio) return ret; \ } +IMPLEMENT_D2I_BIO(X509, d2i_X509_bio, d2i_X509) +IMPLEMENT_I2D_BIO(X509, i2d_X509_bio, i2d_X509) + IMPLEMENT_D2I_BIO(RSA, d2i_RSAPrivateKey_bio, d2i_RSAPrivateKey) IMPLEMENT_I2D_BIO(RSA, i2d_RSAPrivateKey_bio, i2d_RSAPrivateKey) @@ -278,9 +268,18 @@ int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md, return EVP_Digest(key->data, key->length, md, len, type, NULL); } -int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md, - unsigned int *len) { - return (ASN1_item_digest(ASN1_ITEM_rptr(X509), type, (char *)data, md, len)); +int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out, + unsigned *out_len) { + uint8_t *der = NULL; + // TODO(https://crbug.com/boringssl/407): This function is not const-correct. + int der_len = i2d_X509((X509 *)x509, &der); + if (der_len < 0) { + return 0; + } + + int ret = EVP_Digest(der, der_len, out, out_len, md, NULL); + OPENSSL_free(der); + return ret; } int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md, diff --git a/crypto/x509/x_x509.c b/crypto/x509/x_x509.c index 5205267f52..1aa2d2e6f2 100644 --- a/crypto/x509/x_x509.c +++ b/crypto/x509/x_x509.c @@ -68,6 +68,7 @@ #include #include "../asn1/internal.h" +#include "../bytestring/internal.h" #include "../internal.h" #include "internal.h" @@ -87,93 +88,237 @@ ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = { } ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF) IMPLEMENT_ASN1_FUNCTIONS(X509_CINF) -// X509 top level structure needs a bit of customisation - -static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, - void *exarg) { - X509 *ret = (X509 *)*pval; - - switch (operation) { - case ASN1_OP_NEW_POST: - ret->ex_flags = 0; - ret->ex_pathlen = -1; - ret->skid = NULL; - ret->akid = NULL; - ret->aux = NULL; - ret->crldp = NULL; - CRYPTO_new_ex_data(&ret->ex_data); - CRYPTO_MUTEX_init(&ret->lock); - break; - - case ASN1_OP_D2I_POST: { - // The version must be one of v1(0), v2(1), or v3(2). - long version = X509_VERSION_1; - if (ret->cert_info->version != NULL) { - version = ASN1_INTEGER_get(ret->cert_info->version); - // TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should - // also be rejected here. This means an explicitly-encoded X.509v1 - // version. v1 is DEFAULT, so DER requires it be omitted. - if (version < X509_VERSION_1 || version > X509_VERSION_3) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION); - return 0; - } - } - // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3. - if (version == X509_VERSION_1 && (ret->cert_info->issuerUID != NULL || - ret->cert_info->subjectUID != NULL)) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); - return 0; - } +// x509_new_null returns a new |X509| object where the |cert_info|, |sig_alg|, +// and |signature| fields are not yet filled in. +static X509 *x509_new_null(void) { + X509 *ret = OPENSSL_malloc(sizeof(X509)); + if (ret == NULL) { + return NULL; + } + OPENSSL_memset(ret, 0, sizeof(X509)); - // Per RFC 5280, section 4.1.2.9, extensions require v3. - if (version != X509_VERSION_3 && ret->cert_info->extensions != NULL) { - OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); - return 0; - } + ret->references = 1; + ret->ex_pathlen = -1; + CRYPTO_new_ex_data(&ret->ex_data); + CRYPTO_MUTEX_init(&ret->lock); + return ret; +} - break; - } +X509 *X509_new(void) { + X509 *ret = x509_new_null(); + if (ret == NULL) { + return NULL; + } - case ASN1_OP_FREE_POST: - CRYPTO_MUTEX_cleanup(&ret->lock); - CRYPTO_free_ex_data(&g_ex_data_class, ret, &ret->ex_data); - X509_CERT_AUX_free(ret->aux); - ASN1_OCTET_STRING_free(ret->skid); - AUTHORITY_KEYID_free(ret->akid); - CRL_DIST_POINTS_free(ret->crldp); - GENERAL_NAMES_free(ret->altname); - NAME_CONSTRAINTS_free(ret->nc); - break; + ret->cert_info = X509_CINF_new(); + ret->sig_alg = X509_ALGOR_new(); + ret->signature = ASN1_BIT_STRING_new(); + if (ret->cert_info == NULL || ret->sig_alg == NULL || + ret->signature == NULL) { + X509_free(ret); + return NULL; } - return 1; + return ret; } -ASN1_SEQUENCE_ref(X509, x509_cb) = { - ASN1_SIMPLE(X509, cert_info, X509_CINF), - ASN1_SIMPLE(X509, sig_alg, X509_ALGOR), - ASN1_SIMPLE(X509, signature, ASN1_BIT_STRING), -} ASN1_SEQUENCE_END_ref(X509, X509) +void X509_free(X509 *x509) { + if (x509 == NULL || !CRYPTO_refcount_dec_and_test_zero(&x509->references)) { + return; + } -IMPLEMENT_ASN1_FUNCTIONS(X509) + CRYPTO_free_ex_data(&g_ex_data_class, x509, &x509->ex_data); -IMPLEMENT_ASN1_DUP_FUNCTION(X509) + X509_CINF_free(x509->cert_info); + X509_ALGOR_free(x509->sig_alg); + ASN1_BIT_STRING_free(x509->signature); + ASN1_OCTET_STRING_free(x509->skid); + AUTHORITY_KEYID_free(x509->akid); + CRL_DIST_POINTS_free(x509->crldp); + GENERAL_NAMES_free(x509->altname); + NAME_CONSTRAINTS_free(x509->nc); + X509_CERT_AUX_free(x509->aux); + CRYPTO_MUTEX_cleanup(&x509->lock); + + OPENSSL_free(x509); +} -X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { - if (CRYPTO_BUFFER_len(buf) > LONG_MAX) { - OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW); +static X509 *x509_parse(CBS *cbs, CRYPTO_BUFFER *buf) { + CBS cert, tbs, sigalg, sig; + if (!CBS_get_asn1(cbs, &cert, CBS_ASN1_SEQUENCE) || + // Bound the length to comfortably fit in an int. Lengths in this + // module often omit overflow checks. + CBS_len(&cert) > INT_MAX / 2 || + !CBS_get_asn1_element(&cert, &tbs, CBS_ASN1_SEQUENCE) || + !CBS_get_asn1_element(&cert, &sigalg, CBS_ASN1_SEQUENCE)) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); return NULL; } - // Pass |buf| into the parser so that the cached encoding in |X509_CINF| can - // alias into the original buffer and save some memory. - const uint8_t *inp = CRYPTO_BUFFER_data(buf); - X509 *ret = NULL; - if (ASN1_item_ex_d2i((ASN1_VALUE **)&ret, &inp, CRYPTO_BUFFER_len(buf), - ASN1_ITEM_rptr(X509), /*tag=*/-1, + // For just the signature field, we accept non-minimal BER lengths, though not + // indefinite-length encoding. See b/18228011. + // + // TODO(crbug.com/boringssl/354): Switch the affected callers to convert the + // certificate before parsing and then remove this workaround. + CBS_ASN1_TAG tag; + size_t header_len; + int indefinite; + if (!CBS_get_any_ber_asn1_element(&cert, &sig, &tag, &header_len, + /*out_ber_found=*/NULL, + &indefinite) || + tag != CBS_ASN1_BITSTRING || indefinite || // + !CBS_skip(&sig, header_len) || // + CBS_len(&cert) != 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_DECODE_ERROR); + return NULL; + } + + X509 *ret = x509_new_null(); + if (ret == NULL) { + return NULL; + } + + // TODO(crbug.com/boringssl/443): When the rest of the library is decoupled + // from the tasn_*.c implementation, replace this with |CBS|-based functions. + const uint8_t *inp = CBS_data(&tbs); + if (ASN1_item_ex_d2i((ASN1_VALUE **)&ret->cert_info, &inp, CBS_len(&tbs), + ASN1_ITEM_rptr(X509_CINF), /*tag=*/-1, /*aclass=*/0, /*opt=*/0, buf) <= 0 || - inp != CRYPTO_BUFFER_data(buf) + CRYPTO_BUFFER_len(buf)) { + inp != CBS_data(&tbs) + CBS_len(&tbs)) { + goto err; + } + + inp = CBS_data(&sigalg); + ret->sig_alg = d2i_X509_ALGOR(NULL, &inp, CBS_len(&sigalg)); + if (ret->sig_alg == NULL || inp != CBS_data(&sigalg) + CBS_len(&sigalg)) { + goto err; + } + + inp = CBS_data(&sig); + ret->signature = c2i_ASN1_BIT_STRING(NULL, &inp, CBS_len(&sig)); + if (ret->signature == NULL || inp != CBS_data(&sig) + CBS_len(&sig)) { + goto err; + } + + // The version must be one of v1(0), v2(1), or v3(2). + long version = X509_VERSION_1; + if (ret->cert_info->version != NULL) { + version = ASN1_INTEGER_get(ret->cert_info->version); + // TODO(https://crbug.com/boringssl/364): |X509_VERSION_1| should + // also be rejected here. This means an explicitly-encoded X.509v1 + // version. v1 is DEFAULT, so DER requires it be omitted. + if (version < X509_VERSION_1 || version > X509_VERSION_3) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_VERSION); + goto err; + } + } + + // Per RFC 5280, section 4.1.2.8, these fields require v2 or v3. + if (version == X509_VERSION_1 && (ret->cert_info->issuerUID != NULL || + ret->cert_info->subjectUID != NULL)) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); + goto err; + } + + // Per RFC 5280, section 4.1.2.9, extensions require v3. + if (version != X509_VERSION_3 && ret->cert_info->extensions != NULL) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_FIELD_FOR_VERSION); + goto err; + } + + return ret; + +err: + X509_free(ret); + return NULL; +} + +X509 *d2i_X509(X509 **out, const uint8_t **inp, long len) { + X509 *ret = NULL; + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); + goto err; + } + + CBS cbs; + CBS_init(&cbs, *inp, (size_t)len); + ret = x509_parse(&cbs, NULL); + if (ret == NULL) { + goto err; + } + + *inp = CBS_data(&cbs); + +err: + if (out != NULL) { + X509_free(*out); + *out = ret; + } + return ret; +} + +int i2d_X509(X509 *x509, uint8_t **outp) { + if (x509 == NULL) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_MISSING_VALUE); + return -1; + } + + CBB cbb, cert; + if (!CBB_init(&cbb, 64) || // + !CBB_add_asn1(&cbb, &cert, CBS_ASN1_SEQUENCE)) { + goto err; + } + + // TODO(crbug.com/boringssl/443): When the rest of the library is decoupled + // from the tasn_*.c implementation, replace this with |CBS|-based functions. + uint8_t *out; + int len = i2d_X509_CINF(x509->cert_info, NULL); + if (len < 0 || // + !CBB_add_space(&cert, &out, (size_t)len) || + i2d_X509_CINF(x509->cert_info, &out) != len) { + goto err; + } + + len = i2d_X509_ALGOR(x509->sig_alg, NULL); + if (len < 0 || // + !CBB_add_space(&cert, &out, (size_t)len) || + i2d_X509_ALGOR(x509->sig_alg, &out) != len) { + goto err; + } + + len = i2d_ASN1_BIT_STRING(x509->signature, NULL); + if (len < 0 || // + !CBB_add_space(&cert, &out, (size_t)len) || + i2d_ASN1_BIT_STRING(x509->signature, &out) != len) { + goto err; + } + + return CBB_finish_i2d(&cbb, outp); + +err: + CBB_cleanup(&cbb); + return -1; +} + +X509 *X509_dup(X509 *x509) { + uint8_t *der = NULL; + int len = i2d_X509(x509, &der); + if (len < 0) { + return NULL; + } + + const uint8_t *inp = der; + X509 *ret = d2i_X509(NULL, &inp, len); + OPENSSL_free(der); + return ret; +} + +X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { + CBS cbs; + CBS_init(&cbs, CRYPTO_BUFFER_data(buf), CRYPTO_BUFFER_len(buf)); + X509 *ret = x509_parse(&cbs, buf); + if (ret == NULL || CBS_len(&cbs) != 0) { X509_free(ret); return NULL; } diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 4141007ede..9a49b407f7 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -118,10 +118,6 @@ extern "C" { DEFINE_STACK_OF(X509) -// X509 is an |ASN1_ITEM| whose ASN.1 type is X.509 Certificate (RFC 5280) and C -// type is |X509*|. -DECLARE_ASN1_ITEM(X509) - // X509_up_ref adds one to the reference count of |x509| and returns one. OPENSSL_EXPORT int X509_up_ref(X509 *x509); From 8ebfea76db79bc5b1646fbe76e681f58b3363e9d Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 16 Mar 2023 01:45:35 -0400 Subject: [PATCH 155/177] Reject non-minimal lengths in ASN1_get_object Now that the preceding CL has isolated the X.509 signature hack, we can apply the strictness across the legacy parser. This is particularly important for the TBSCertificate parser, where it is ambiguous which value one checks the signature over. (Officially, you're supposed to re-encode as DER. In practice, people don't do this.) This change means many of our primitive types are actually parsed as DER. I've removed the bug references in the comment in the documentation where I believe they're finally correct. Update-Note: Non-minimal lengths in certificates are no longer accepted, as required for standards compliance. The one exception is the signature field, where we still carry an exception. Some of this was already enforced by libssl's parser. Bug: 354 Change-Id: I57cfa7df9e1ec5707390e9b32fe1ec6b5d8172f9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58186 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/asn1/asn1_lib.c | 12 +----------- crypto/asn1/asn1_test.cc | 14 ++++++++++++++ crypto/x509/x509_test.cc | 19 +++++++++++++++++-- include/openssl/asn1.h | 30 ++---------------------------- 4 files changed, 34 insertions(+), 41 deletions(-) diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c index 3b97b38e0b..dd56c9890b 100644 --- a/crypto/asn1/asn1_lib.c +++ b/crypto/asn1/asn1_lib.c @@ -111,20 +111,10 @@ int ASN1_get_object(const unsigned char **inp, long *out_len, int *out_tag, return 0x80; } - // TODO(https://crbug.com/boringssl/354): This should use |CBS_get_asn1| to - // reject non-minimal lengths, which are only allowed in BER. However, - // Android sometimes needs allow a non-minimal length in certificate - // signature fields (see b/18228011). Make this only apply to that field, - // while requiring DER elsewhere. Better yet, it should be limited to an - // preprocessing step in that part of Android. CBS_ASN1_TAG tag; - size_t header_len; - int indefinite; CBS cbs, body; CBS_init(&cbs, *inp, (size_t)in_len); - if (!CBS_get_any_ber_asn1_element(&cbs, &body, &tag, &header_len, - /*out_ber_found=*/NULL, &indefinite) || - indefinite || !CBS_skip(&body, header_len) || + if (!CBS_get_any_asn1(&cbs, &body, &tag) || // Bound the length to comfortably fit in an int. Lengths in this // module often switch between int and long without overflow checks. CBS_len(&body) > INT_MAX / 2) { diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index 1421462006..cd26528dbf 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -2235,10 +2235,24 @@ TEST(ASN1Test, GetObject) { EXPECT_EQ(0x80, ASN1_get_object(&ptr, &length, &tag, &tag_class, sizeof(kTruncated))); + // Indefinite-length encoding is not allowed in DER. static const uint8_t kIndefinite[] = {0x30, 0x80, 0x00, 0x00}; ptr = kIndefinite; EXPECT_EQ(0x80, ASN1_get_object(&ptr, &length, &tag, &tag_class, sizeof(kIndefinite))); + + // DER requires lengths be minimally-encoded. This should be {0x30, 0x00}. + static const uint8_t kNonMinimal[] = {0x30, 0x81, 0x00}; + ptr = kNonMinimal; + EXPECT_EQ(0x80, ASN1_get_object(&ptr, &length, &tag, &tag_class, + sizeof(kNonMinimal))); + + // This should be {0x04, 0x81, 0x80, ...}. + std::vector non_minimal = {0x04, 0x82, 0x00, 0x80}; + non_minimal.resize(non_minimal.size() + 0x80); + ptr = non_minimal.data(); + EXPECT_EQ(0x80, ASN1_get_object(&ptr, &length, &tag, &tag_class, + non_minimal.size())); } template diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 8adba6c68f..653af39117 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -4148,8 +4148,8 @@ soBsxWI= -----END CERTIFICATE----- )"; -// kNonMinimalLengthSignature is an X.509 certificate where the signature -// has a non-minimal length. +// kNonMinimalLengthSignature is an X.509 certificate where the signature has a +// non-minimal length. static const char kNonMinimalLengthSignature[] = R"( -----BEGIN CERTIFICATE----- MIIBITCBxqADAgECAgIE0jAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDEwRUZXN0MCAX @@ -4162,6 +4162,20 @@ soBsxWI= -----END CERTIFICATE----- )"; +// kNonMinimalLengthSerial is an X.509 certificate where the serial number has a +// non-minimal length. +static const char kNonMinimalLengthSerial[] = R"( +-----BEGIN CERTIFICATE----- +MIIBITCBx6ADAgECAoECBNIwCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEVGVzdDAg +Fw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsGA1UEAxMEVGVz +dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWXa7ep +Hg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsGjEDAO +MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKnSIhfmzfQpeOKFHiAq +cml3ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh4qnk +soBsxWI= +-----END CERTIFICATE----- +)"; + TEST(X509Test, BER) { // Constructed strings are forbidden in DER. EXPECT_FALSE(CertFromPEM(kConstructedBitString)); @@ -4175,6 +4189,7 @@ TEST(X509Test, BER) { EXPECT_FALSE(CertFromPEM(kHighTagNumber)); // Lengths must be minimal in DER. EXPECT_FALSE(CertFromPEM(kNonMinimalLengthOuter)); + EXPECT_FALSE(CertFromPEM(kNonMinimalLengthSerial)); // We, for now, accept a non-minimal length in the signature field. See // b/18228011. EXPECT_TRUE(CertFromPEM(kNonMinimalLengthSignature)); diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 030306b54f..5df6816039 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -631,9 +631,6 @@ OPENSSL_EXPORT void ASN1_VISIBLESTRING_free(ASN1_VISIBLESTRING *str); // The following functions parse up to |len| bytes from |*inp| as a // DER-encoded ASN.1 value of the corresponding type, as described in // |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_BMPSTRING *d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **out, const uint8_t **inp, long len); @@ -917,9 +914,6 @@ OPENSSL_EXPORT void ASN1_BIT_STRING_free(ASN1_BIT_STRING *str); // d2i_ASN1_BIT_STRING parses up to |len| bytes from |*inp| as a DER-encoded // ASN.1 BIT STRING, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **out, const uint8_t **inp, long len); @@ -932,9 +926,6 @@ OPENSSL_EXPORT int i2d_ASN1_BIT_STRING(const ASN1_BIT_STRING *in, // c2i_ASN1_BIT_STRING decodes |len| bytes from |*inp| as the contents of a // DER-encoded BIT STRING, excluding the tag and length. It behaves like // |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **out, const uint8_t **inp, long len); @@ -1027,9 +1018,6 @@ OPENSSL_EXPORT ASN1_INTEGER *ASN1_INTEGER_dup(const ASN1_INTEGER *x); // d2i_ASN1_INTEGER parses up to |len| bytes from |*inp| as a DER-encoded // ASN.1 INTEGER, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **out, const uint8_t **inp, long len); @@ -1040,9 +1028,6 @@ OPENSSL_EXPORT int i2d_ASN1_INTEGER(const ASN1_INTEGER *in, uint8_t **outp); // c2i_ASN1_INTEGER decodes |len| bytes from |*inp| as the contents of a // DER-encoded INTEGER, excluding the tag and length. It behaves like // |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// some invalid inputs, but this will be removed in the future. OPENSSL_EXPORT ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **in, const uint8_t **outp, long len); @@ -1111,9 +1096,6 @@ OPENSSL_EXPORT void ASN1_ENUMERATED_free(ASN1_ENUMERATED *str); // d2i_ASN1_ENUMERATED parses up to |len| bytes from |*inp| as a DER-encoded // ASN.1 ENUMERATED, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_ENUMERATED *d2i_ASN1_ENUMERATED(ASN1_ENUMERATED **out, const uint8_t **inp, long len); @@ -1246,9 +1228,6 @@ OPENSSL_EXPORT void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *str); // d2i_ASN1_GENERALIZEDTIME parses up to |len| bytes from |*inp| as a // DER-encoded ASN.1 GeneralizedTime, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_GENERALIZEDTIME *d2i_ASN1_GENERALIZEDTIME( ASN1_GENERALIZEDTIME **out, const uint8_t **inp, long len); @@ -1402,9 +1381,6 @@ OPENSSL_EXPORT void ASN1_NULL_free(ASN1_NULL *null); // d2i_ASN1_NULL parses a DER-encoded ASN.1 NULL value from up to |len| bytes // at |*inp|, as described in |d2i_SAMPLE|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. OPENSSL_EXPORT ASN1_NULL *d2i_ASN1_NULL(ASN1_NULL **out, const uint8_t **inp, long len); @@ -1758,13 +1734,11 @@ OPENSSL_EXPORT int i2t_ASN1_OBJECT(char *buf, int buf_len, // |*out_length|, |*out_tag|, and |*out_class| to the element's length, tag // number, and tag class, respectively, // -// Unlike OpenSSL, this function does not support indefinite-length elements. +// Unlike OpenSSL, this function only supports DER. Indefinite and non-minimal +// lengths are rejected. // // This function is difficult to use correctly. Use |CBS_get_asn1| and related // functions from bytestring.h. -// -// TODO(https://crbug.com/boringssl/354): Remove support for non-minimal -// lengths. OPENSSL_EXPORT int ASN1_get_object(const unsigned char **inp, long *out_length, int *out_tag, int *out_class, long max_len); From b6a50fd62d1ae44ad211ebe26f803c66db444302 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 22 Mar 2023 14:20:57 -0400 Subject: [PATCH 156/177] Give X509 an ASN1_ITEM again I mistakenly thought no one needed X509 as an ASN1_ITEM, but that wasn't true. wpa_supplicant relies on this. Restore this and add a test for it. As with the rest of the rewrite, this is currently a little tedious. I'm hoping that, as the internals are rewritten with CBS and CBB, we can establish some cleaner patterns and abstractions. Bug: 547 Change-Id: I761ee058f8ec916b2ec7f4730a764d46d72f1f10 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58285 Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/asn1_test.cc | 91 ++++++++++++++++++++++++++++++++++++++++ crypto/x509/x_x509.c | 49 ++++++++++++++++++++++ include/openssl/x509.h | 4 ++ 3 files changed, 144 insertions(+) diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index cd26528dbf..5c43793709 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc @@ -28,8 +28,10 @@ #include #include #include +#include #include #include +#include #include #include "../test/test_util.h" @@ -2759,4 +2761,93 @@ TEST(ASN1Test, OptionalChoice) { TestSerialize(obj.get(), i2d_OPTIONAL_CHOICE, kTrue); } +struct EMBED_X509 { + X509 *x509; + X509 *x509_opt; + STACK_OF(X509) *x509_seq; +}; + +DECLARE_ASN1_FUNCTIONS(EMBED_X509) +ASN1_SEQUENCE(EMBED_X509) = { + ASN1_SIMPLE(EMBED_X509, x509, X509), + ASN1_EXP_OPT(EMBED_X509, x509_opt, X509, 0), + ASN1_IMP_SEQUENCE_OF_OPT(EMBED_X509, x509_seq, X509, 1), +} ASN1_SEQUENCE_END(EMBED_X509) +IMPLEMENT_ASN1_FUNCTIONS(EMBED_X509) + +// Test that X.509 types defined in this library can be embedded into other +// types, as we rewrite them away from the templating system. +TEST(ASN1Test, EmbedX509) { + // Set up a test certificate. + static const char kTestCert[] = R"( +-----BEGIN CERTIFICATE----- +MIIBzzCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC +QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp +dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ +BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l +dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni +v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa +HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw +HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ +BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E +BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ= +-----END CERTIFICATE----- +)"; + bssl::UniquePtr bio(BIO_new_mem_buf(kTestCert, sizeof(kTestCert))); + ASSERT_TRUE(bio); + bssl::UniquePtr cert(PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr)); + ASSERT_TRUE(cert); + uint8_t *cert_der = nullptr; + int cert_len = i2d_X509(cert.get(), &cert_der); + ASSERT_GT(cert_len, 0); + bssl::UniquePtr free_cert_der(cert_der); + + std::unique_ptr obj(nullptr, + EMBED_X509_free); + + // Test only the first field present. + bssl::ScopedCBB cbb; + ASSERT_TRUE(CBB_init(cbb.get(), 64)); + CBB seq; + ASSERT_TRUE(CBB_add_asn1(cbb.get(), &seq, CBS_ASN1_SEQUENCE)); + ASSERT_TRUE(CBB_add_bytes(&seq, cert_der, cert_len)); + ASSERT_TRUE(CBB_flush(cbb.get())); + const uint8_t *ptr = CBB_data(cbb.get()); + obj.reset(d2i_EMBED_X509(nullptr, &ptr, CBB_len(cbb.get()))); + ASSERT_TRUE(obj); + ASSERT_TRUE(obj->x509); + EXPECT_EQ(X509_cmp(obj->x509, cert.get()), 0); + EXPECT_FALSE(obj->x509_opt); + EXPECT_FALSE(obj->x509_seq); + TestSerialize(obj.get(), i2d_EMBED_X509, + {CBB_data(cbb.get()), CBB_len(cbb.get())}); + + // Test all fields present. + cbb.Reset(); + ASSERT_TRUE(CBB_init(cbb.get(), 64)); + ASSERT_TRUE(CBB_add_asn1(cbb.get(), &seq, CBS_ASN1_SEQUENCE)); + ASSERT_TRUE(CBB_add_bytes(&seq, cert_der, cert_len)); + CBB child; + ASSERT_TRUE(CBB_add_asn1( + &seq, &child, CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)); + ASSERT_TRUE(CBB_add_bytes(&child, cert_der, cert_len)); + ASSERT_TRUE(CBB_add_asn1( + &seq, &child, CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 1)); + ASSERT_TRUE(CBB_add_bytes(&child, cert_der, cert_len)); + ASSERT_TRUE(CBB_add_bytes(&child, cert_der, cert_len)); + ASSERT_TRUE(CBB_flush(cbb.get())); + ptr = CBB_data(cbb.get()); + obj.reset(d2i_EMBED_X509(nullptr, &ptr, CBB_len(cbb.get()))); + ASSERT_TRUE(obj); + ASSERT_TRUE(obj->x509); + EXPECT_EQ(X509_cmp(obj->x509, cert.get()), 0); + ASSERT_TRUE(obj->x509_opt); + EXPECT_EQ(X509_cmp(obj->x509_opt, cert.get()), 0); + ASSERT_EQ(sk_X509_num(obj->x509_seq), 2u); + EXPECT_EQ(X509_cmp(sk_X509_value(obj->x509_seq, 0), cert.get()), 0); + EXPECT_EQ(X509_cmp(sk_X509_value(obj->x509_seq, 1), cert.get()), 0); + TestSerialize(obj.get(), i2d_EMBED_X509, + {CBB_data(cbb.get()), CBB_len(cbb.get())}); +} + #endif // !WINDOWS || !SHARED_LIBRARY diff --git a/crypto/x509/x_x509.c b/crypto/x509/x_x509.c index 1aa2d2e6f2..31dbebe159 100644 --- a/crypto/x509/x_x509.c +++ b/crypto/x509/x_x509.c @@ -301,6 +301,55 @@ int i2d_X509(X509 *x509, uint8_t **outp) { return -1; } +static int x509_new_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { + *pval = (ASN1_VALUE *)X509_new(); + return *pval != NULL; +} + +static void x509_free_cb(ASN1_VALUE **pval, const ASN1_ITEM *it) { + X509_free((X509 *)*pval); + *pval = NULL; +} + +static int x509_d2i_cb(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int opt, ASN1_TLC *ctx) { + if (len < 0) { + OPENSSL_PUT_ERROR(ASN1, ASN1_R_BUFFER_TOO_SMALL); + return 0; + } + + CBS cbs; + CBS_init(&cbs, *in, len); + if (opt && !CBS_peek_asn1_tag(&cbs, CBS_ASN1_SEQUENCE)) { + return -1; + } + + X509 *ret = x509_parse(&cbs, NULL); + if (ret == NULL) { + return 0; + } + + *in = CBS_data(&cbs); + X509_free((X509 *)*pval); + *pval = (ASN1_VALUE *)ret; + return 1; +} + +static int x509_i2d_cb(ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it) { + return i2d_X509((X509 *)*pval, out); +} + +static const ASN1_EXTERN_FUNCS x509_extern_funcs = { + x509_new_cb, + x509_free_cb, + /*asn1_ex_clear=*/NULL, + x509_d2i_cb, + x509_i2d_cb, +}; + +IMPLEMENT_EXTERN_ASN1(X509, V_ASN1_SEQUENCE, x509_extern_funcs) + X509 *X509_dup(X509 *x509) { uint8_t *der = NULL; int len = i2d_X509(x509, &der); diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 9a49b407f7..4141007ede 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -118,6 +118,10 @@ extern "C" { DEFINE_STACK_OF(X509) +// X509 is an |ASN1_ITEM| whose ASN.1 type is X.509 Certificate (RFC 5280) and C +// type is |X509*|. +DECLARE_ASN1_ITEM(X509) + // X509_up_ref adds one to the reference count of |x509| and returns one. OPENSSL_EXPORT int X509_up_ref(X509 *x509); From 2e13e36e7477cfe2ef48312634b1c34103da4899 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 23 Mar 2023 00:22:54 -0400 Subject: [PATCH 157/177] Fix parameter name for i2d_X509_EXTENSION alg was a copy-paste error. Change-Id: I4c591bb98f7da853c79679727d49a00c7c65ad91 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58305 Reviewed-by: Alex Gaynor Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- include/openssl/x509.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 4141007ede..f0985345d0 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -1077,10 +1077,9 @@ OPENSSL_EXPORT X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **out, const uint8_t **inp, long len); -// i2d_X509_EXTENSION marshals |alg| as a DER-encoded X.509 Extension (RFC +// i2d_X509_EXTENSION marshals |ex| as a DER-encoded X.509 Extension (RFC // 5280), as described in |i2d_SAMPLE|. -OPENSSL_EXPORT int i2d_X509_EXTENSION(const X509_EXTENSION *alg, - uint8_t **outp); +OPENSSL_EXPORT int i2d_X509_EXTENSION(const X509_EXTENSION *ex, uint8_t **outp); // X509_EXTENSION_dup returns a newly-allocated copy of |ex|, or NULL on error. // This function works by serializing the structure, so if |ex| is incomplete, From 0e8e3c682fd5459cca3d12466dc35bdf9b483ffa Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 02:15:18 +0900 Subject: [PATCH 158/177] Add a warning about OBJ_create and global state This function is probably not what you want. I think the X509V3_EXT_METHOD and ASN1_STRING_TABLE_add stuff are the only cases where you actually need an OID. Those, themselves, have problems with conflicting registrations and aren't really necessary. ASN1_STRING_TABLE_add has a similar warning on it. X509V3_EXT_METHOD is not yet documented, but should get a similar warning when we document it. Change-Id: I173918a3f7db25059ed078b2f67b23acfb43033d Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58365 Auto-Submit: David Benjamin Reviewed-by: Adam Langley Commit-Queue: Adam Langley --- include/openssl/obj.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/openssl/obj.h b/include/openssl/obj.h index ad7271ec9c..3fb8bdeb92 100644 --- a/include/openssl/obj.h +++ b/include/openssl/obj.h @@ -183,8 +183,15 @@ OPENSSL_EXPORT int OBJ_obj2txt(char *out, int out_len, const ASN1_OBJECT *obj, // Adding objects at runtime. -// OBJ_create adds a known object and returns the nid of the new object, or +// OBJ_create adds a known object and returns the NID of the new object, or // NID_undef on error. +// +// WARNING: This function modifies global state. The table cannot contain +// duplicate OIDs, short names, or long names. If two callers in the same +// address space add conflicting values, only one registration will take effect. +// Avoid this function if possible. Instead, callers can process OIDs unknown to +// BoringSSL by acting on the byte representation directly. See |OBJ_get0_data| +// and |OBJ_length|. OPENSSL_EXPORT int OBJ_create(const char *oid, const char *short_name, const char *long_name); From 97d48dbeb8010365a1d5cb029bee29617261d8a0 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 03:09:15 +0900 Subject: [PATCH 159/177] Sort various X.509 global lists sooner These functions need a lot more work, documentation, warnings that using them isn't a good idea, and really we should just remove them entirely. But, for now, this is a minimal fix to the most egregious of issues: not only are the functions themselves not thread-safe (i.e. you must call it in some program-global initialization), but using them puts you in a state where future uses of the X.509 library are not thread-safe! Fix the latter by sorting the list at the point we're already mutating things. Re-sorting a list after every addition is not a particularly sensible implementation, but we can assume these lists will only ever contain O(1) entries. (The sort calls date to https://boringssl-review.googlesource.com/c/boringssl/+/27304, but the issue was there before. Prior to that CL, sk_FOO_find implicitly sorted the list. That CL made sk_FOO_find itself a const operation, necessary for this, and just added explicit sk_FOO_sort calls to preserve the existing behavior, initially.) Change-Id: I063b8e708eaf17dfe66c5a3e8d33733adb3297e9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58385 Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- crypto/x509/x509_trs.c | 6 +++++- crypto/x509/x509_vpm.c | 6 +++--- crypto/x509v3/v3_lib.c | 3 ++- crypto/x509v3/v3_purp.c | 6 +++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/crypto/x509/x509_trs.c b/crypto/x509/x509_trs.c index 1329a9f951..553a0aecad 100644 --- a/crypto/x509/x509_trs.c +++ b/crypto/x509/x509_trs.c @@ -152,7 +152,6 @@ int X509_TRUST_get_by_id(int id) { if (!trtable) { return -1; } - sk_X509_TRUST_sort(trtable); if (!sk_X509_TRUST_find(trtable, &idx, &tmp)) { return -1; } @@ -216,6 +215,10 @@ int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), // If its a new entry manage the dynamic table if (idx == -1) { + // TODO(davidben): This should be locked. Alternatively, remove the dynamic + // registration mechanism entirely. The trouble is there no way to pass in + // the various parameters into an |X509_VERIFY_PARAM| directly. You can only + // register it in the global table and get an ID. if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) { trtable_free(trtmp); return 0; @@ -224,6 +227,7 @@ int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), trtable_free(trtmp); return 0; } + sk_X509_TRUST_sort(trtable); } return 1; } diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index d985cb742e..f14a531f6d 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -554,6 +554,8 @@ static int param_cmp(const X509_VERIFY_PARAM **a, const X509_VERIFY_PARAM **b) { } int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) { + // TODO(davidben): This should be locked. Alternatively, remove the dynamic + // registration mechanism entirely. X509_VERIFY_PARAM *ptmp; if (!param_table) { param_table = sk_X509_VERIFY_PARAM_new(param_cmp); @@ -562,8 +564,6 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) { } } else { size_t idx; - - sk_X509_VERIFY_PARAM_sort(param_table); if (sk_X509_VERIFY_PARAM_find(param_table, &idx, param)) { ptmp = sk_X509_VERIFY_PARAM_value(param_table, idx); X509_VERIFY_PARAM_free(ptmp); @@ -573,6 +573,7 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) { if (!sk_X509_VERIFY_PARAM_push(param_table, param)) { return 0; } + sk_X509_VERIFY_PARAM_sort(param_table); return 1; } @@ -599,7 +600,6 @@ const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name) { pm.name = (char *)name; if (param_table) { size_t idx; - sk_X509_VERIFY_PARAM_sort(param_table); if (sk_X509_VERIFY_PARAM_find(param_table, &idx, &pm)) { return sk_X509_VERIFY_PARAM_value(param_table, idx); } diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c index d006a5ee8b..5a3c3e81da 100644 --- a/crypto/x509v3/v3_lib.c +++ b/crypto/x509v3/v3_lib.c @@ -78,6 +78,7 @@ static int ext_stack_cmp(const X509V3_EXT_METHOD **a, } int X509V3_EXT_add(X509V3_EXT_METHOD *ext) { + // TODO(davidben): This should be locked. Also check for duplicates. if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_stack_cmp))) { ext_list_free(ext); return 0; @@ -86,6 +87,7 @@ int X509V3_EXT_add(X509V3_EXT_METHOD *ext) { ext_list_free(ext); return 0; } + sk_X509V3_EXT_METHOD_sort(ext_list); return 1; } @@ -113,7 +115,6 @@ const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid) { return NULL; } - sk_X509V3_EXT_METHOD_sort(ext_list); if (!sk_X509V3_EXT_METHOD_find(ext_list, &idx, &tmp)) { return NULL; } diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c index 71b2c6d1ca..8c254e80b0 100644 --- a/crypto/x509v3/v3_purp.c +++ b/crypto/x509v3/v3_purp.c @@ -201,7 +201,6 @@ int X509_PURPOSE_get_by_id(int purpose) { return -1; } - sk_X509_PURPOSE_sort(xptable); if (!sk_X509_PURPOSE_find(xptable, &idx, &tmp)) { return -1; } @@ -267,6 +266,10 @@ int X509_PURPOSE_add(int id, int trust, int flags, // If its a new entry manage the dynamic table if (idx == -1) { + // TODO(davidben): This should be locked. Alternatively, remove the dynamic + // registration mechanism entirely. The trouble is there no way to pass in + // the various parameters into an |X509_VERIFY_PARAM| directly. You can only + // register it in the global table and get an ID. if (!xptable && !(xptable = sk_X509_PURPOSE_new(xp_cmp))) { xptable_free(ptmp); return 0; @@ -275,6 +278,7 @@ int X509_PURPOSE_add(int id, int trust, int flags, xptable_free(ptmp); return 0; } + sk_X509_PURPOSE_sort(xptable); } return 1; } From af0739fc737a0651bfec6c6c2164e6e98c7c2cbd Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 9 Jan 2023 10:03:02 -0800 Subject: [PATCH 160/177] Const-correct sk_FOO_cmp_func This is a double-pointer and both layers should be const. This matches OpenSSL 1.1.1, so in addition to being more const-correct, we're more OpenSSL-compatible. Update-Note: Anything that defines a comparison function would need to fix the type signature. I found only one external caller, Envoy, that defines it. https://github.com/envoyproxy/envoy/pull/25051 fixes it. (That we hadn't run into the upstream incompatibility suggests this is just not a feature folks use outside the library much.) Bumping BORINGSSL_API_VERSION, in case I missed any, and there's some caller where we can't just use C++14 generic lambdas to smooth it over. Fixed: 498 Change-Id: I8f07ff42215172aa65ad8819acf69b63d6d8e54c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56190 Auto-Submit: David Benjamin Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/stack/stack_test.cc | 4 ++-- crypto/x509/by_dir.c | 3 ++- crypto/x509/policy.c | 18 ++++++++++-------- crypto/x509/x509_lu.c | 38 +++++++++++++++++--------------------- crypto/x509/x509_trs.c | 4 ++-- crypto/x509/x509_vpm.c | 3 ++- crypto/x509/x_crl.c | 6 ++++-- crypto/x509v3/v3_lib.c | 4 ++-- crypto/x509v3/v3_purp.c | 4 ++-- crypto/x509v3/v3_utl.c | 6 ++++-- include/openssl/base.h | 2 +- include/openssl/stack.h | 20 ++++++++------------ ssl/ssl_file.cc | 4 ++-- 13 files changed, 58 insertions(+), 58 deletions(-) diff --git a/crypto/stack/stack_test.cc b/crypto/stack/stack_test.cc index 1ff44b9a4b..7900fc9094 100644 --- a/crypto/stack/stack_test.cc +++ b/crypto/stack/stack_test.cc @@ -210,7 +210,7 @@ TEST(StackTest, BigStack) { static uint64_t g_compare_count = 0; -static int compare(const TEST_INT **a, const TEST_INT **b) { +static int compare(const TEST_INT *const *a, const TEST_INT *const *b) { g_compare_count++; if (**a < **b) { return -1; @@ -221,7 +221,7 @@ static int compare(const TEST_INT **a, const TEST_INT **b) { return 0; } -static int compare_reverse(const TEST_INT **a, const TEST_INT **b) { +static int compare_reverse(const TEST_INT *const *a, const TEST_INT *const *b) { return -compare(a, b); } diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c index 0283a0dba7..a9236fe3c8 100644 --- a/crypto/x509/by_dir.c +++ b/crypto/x509/by_dir.c @@ -152,7 +152,8 @@ static int new_dir(X509_LOOKUP *lu) { static void by_dir_hash_free(BY_DIR_HASH *hash) { OPENSSL_free(hash); } -static int by_dir_hash_cmp(const BY_DIR_HASH **a, const BY_DIR_HASH **b) { +static int by_dir_hash_cmp(const BY_DIR_HASH *const *a, + const BY_DIR_HASH *const *b) { if ((*a)->hash > (*b)->hash) { return 1; } diff --git a/crypto/x509/policy.c b/crypto/x509/policy.c index 47ac2d8c50..abcc586427 100644 --- a/crypto/x509/policy.c +++ b/crypto/x509/policy.c @@ -121,8 +121,8 @@ static X509_POLICY_NODE *x509_policy_node_new(const ASN1_OBJECT *policy) { return node; } -static int x509_policy_node_cmp(const X509_POLICY_NODE **a, - const X509_POLICY_NODE **b) { +static int x509_policy_node_cmp(const X509_POLICY_NODE *const *a, + const X509_POLICY_NODE *const *b) { return OBJ_cmp((*a)->policy, (*b)->policy); } @@ -201,7 +201,8 @@ static int x509_policy_level_add_nodes(X509_POLICY_LEVEL *level, return 1; } -static int policyinfo_cmp(const POLICYINFO **a, const POLICYINFO **b) { +static int policyinfo_cmp(const POLICYINFO *const *a, + const POLICYINFO *const *b) { return OBJ_cmp((*a)->policyid, (*b)->policyid); } @@ -312,13 +313,13 @@ static int process_certificate_policies(const X509 *x509, return ret; } -static int compare_issuer_policy(const POLICY_MAPPING **a, - const POLICY_MAPPING **b) { +static int compare_issuer_policy(const POLICY_MAPPING *const *a, + const POLICY_MAPPING *const *b) { return OBJ_cmp((*a)->issuerDomainPolicy, (*b)->issuerDomainPolicy); } -static int compare_subject_policy(const POLICY_MAPPING **a, - const POLICY_MAPPING **b) { +static int compare_subject_policy(const POLICY_MAPPING *const *a, + const POLICY_MAPPING *const *b) { return OBJ_cmp((*a)->subjectDomainPolicy, (*b)->subjectDomainPolicy); } @@ -651,7 +652,8 @@ static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, return 0; } -static int asn1_object_cmp(const ASN1_OBJECT **a, const ASN1_OBJECT **b) { +static int asn1_object_cmp(const ASN1_OBJECT *const *a, + const ASN1_OBJECT *const *b) { return OBJ_cmp(*a, *b); } diff --git a/crypto/x509/x509_lu.c b/crypto/x509/x509_lu.c index 2ec8971bd4..cd4ed1247e 100644 --- a/crypto/x509/x509_lu.c +++ b/crypto/x509/x509_lu.c @@ -140,25 +140,25 @@ int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name, return ctx->method->get_by_subject(ctx, type, name, ret) > 0; } -static int x509_object_cmp(const X509_OBJECT **a, const X509_OBJECT **b) { - int ret; - - ret = ((*a)->type - (*b)->type); +static int x509_object_cmp(const X509_OBJECT *a, const X509_OBJECT *b) { + int ret = a->type - b->type; if (ret) { return ret; } - switch ((*a)->type) { + switch (a->type) { case X509_LU_X509: - ret = X509_subject_name_cmp((*a)->data.x509, (*b)->data.x509); - break; + return X509_subject_name_cmp(a->data.x509, b->data.x509); case X509_LU_CRL: - ret = X509_CRL_cmp((*a)->data.crl, (*b)->data.crl); - break; + return X509_CRL_cmp(a->data.crl, b->data.crl); default: // abort(); return 0; } - return ret; +} + +static int x509_object_cmp_sk(const X509_OBJECT *const *a, + const X509_OBJECT *const *b) { + return x509_object_cmp(*a, *b); } X509_STORE *X509_STORE_new(void) { @@ -169,7 +169,7 @@ X509_STORE *X509_STORE_new(void) { } OPENSSL_memset(ret, 0, sizeof(*ret)); CRYPTO_MUTEX_init(&ret->objs_lock); - ret->objs = sk_X509_OBJECT_new(x509_object_cmp); + ret->objs = sk_X509_OBJECT_new(x509_object_cmp_sk); if (ret->objs == NULL) { goto err; } @@ -424,12 +424,10 @@ static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type, if (pnmatch != NULL) { int tidx; - const X509_OBJECT *tobj, *pstmp; *pnmatch = 1; - pstmp = &stmp; for (tidx = idx + 1; tidx < (int)sk_X509_OBJECT_num(h); tidx++) { - tobj = sk_X509_OBJECT_value(h, tidx); - if (x509_object_cmp(&tobj, &pstmp)) { + const X509_OBJECT *tobj = sk_X509_OBJECT_value(h, tidx); + if (x509_object_cmp(tobj, &stmp)) { break; } (*pnmatch)++; @@ -542,19 +540,17 @@ STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm) { X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x) { - size_t idx, i; - X509_OBJECT *obj; - sk_X509_OBJECT_sort(h); + size_t idx; if (!sk_X509_OBJECT_find(h, &idx, x)) { return NULL; } if ((x->type != X509_LU_X509) && (x->type != X509_LU_CRL)) { return sk_X509_OBJECT_value(h, idx); } - for (i = idx; i < sk_X509_OBJECT_num(h); i++) { - obj = sk_X509_OBJECT_value(h, i); - if (x509_object_cmp((const X509_OBJECT **)&obj, (const X509_OBJECT **)&x)) { + for (size_t i = idx; i < sk_X509_OBJECT_num(h); i++) { + X509_OBJECT *obj = sk_X509_OBJECT_value(h, i); + if (x509_object_cmp(obj, x)) { return NULL; } if (x->type == X509_LU_X509) { diff --git a/crypto/x509/x509_trs.c b/crypto/x509/x509_trs.c index 553a0aecad..13e5eca0e0 100644 --- a/crypto/x509/x509_trs.c +++ b/crypto/x509/x509_trs.c @@ -63,7 +63,7 @@ #include "internal.h" -static int tr_cmp(const X509_TRUST **a, const X509_TRUST **b); +static int tr_cmp(const X509_TRUST *const *a, const X509_TRUST *const *b); static void trtable_free(X509_TRUST *p); static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags); @@ -97,7 +97,7 @@ static X509_TRUST trstandard[] = { static STACK_OF(X509_TRUST) *trtable = NULL; -static int tr_cmp(const X509_TRUST **a, const X509_TRUST **b) { +static int tr_cmp(const X509_TRUST *const *a, const X509_TRUST *const *b) { return (*a)->trust - (*b)->trust; } diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index f14a531f6d..8ff80389e2 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -549,7 +549,8 @@ static const X509_VERIFY_PARAM default_table[] = { static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL; -static int param_cmp(const X509_VERIFY_PARAM **a, const X509_VERIFY_PARAM **b) { +static int param_cmp(const X509_VERIFY_PARAM *const *a, + const X509_VERIFY_PARAM *const *b) { return strcmp((*a)->name, (*b)->name); } diff --git a/crypto/x509/x_crl.c b/crypto/x509/x_crl.c index 9c4c116c3d..4a645bad05 100644 --- a/crypto/x509/x_crl.c +++ b/crypto/x509/x_crl.c @@ -71,7 +71,8 @@ #include "../internal.h" #include "internal.h" -static int X509_REVOKED_cmp(const X509_REVOKED **a, const X509_REVOKED **b); +static int X509_REVOKED_cmp(const X509_REVOKED *const *a, + const X509_REVOKED *const *b); static int setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp); ASN1_SEQUENCE(X509_REVOKED) = { @@ -361,7 +362,8 @@ IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO) IMPLEMENT_ASN1_FUNCTIONS(X509_CRL) IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL) -static int X509_REVOKED_cmp(const X509_REVOKED **a, const X509_REVOKED **b) { +static int X509_REVOKED_cmp(const X509_REVOKED *const *a, + const X509_REVOKED *const *b) { return ASN1_STRING_cmp((*a)->serialNumber, (*b)->serialNumber); } diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c index 5a3c3e81da..d33b51f51c 100644 --- a/crypto/x509v3/v3_lib.c +++ b/crypto/x509v3/v3_lib.c @@ -72,8 +72,8 @@ static STACK_OF(X509V3_EXT_METHOD) *ext_list = NULL; static void ext_list_free(X509V3_EXT_METHOD *ext); -static int ext_stack_cmp(const X509V3_EXT_METHOD **a, - const X509V3_EXT_METHOD **b) { +static int ext_stack_cmp(const X509V3_EXT_METHOD *const *a, + const X509V3_EXT_METHOD *const *b) { return ((*a)->ext_nid - (*b)->ext_nid); } diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c index 8c254e80b0..34ce33e27d 100644 --- a/crypto/x509v3/v3_purp.c +++ b/crypto/x509v3/v3_purp.c @@ -95,7 +95,7 @@ static int check_purpose_timestamp_sign(const X509_PURPOSE *xp, const X509 *x, static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca); static int ocsp_helper(const X509_PURPOSE *xp, const X509 *x, int ca); -static int xp_cmp(const X509_PURPOSE **a, const X509_PURPOSE **b); +static int xp_cmp(const X509_PURPOSE *const *a, const X509_PURPOSE *const *b); static void xptable_free(X509_PURPOSE *p); static X509_PURPOSE xstandard[] = { @@ -126,7 +126,7 @@ static X509_PURPOSE xstandard[] = { static STACK_OF(X509_PURPOSE) *xptable = NULL; -static int xp_cmp(const X509_PURPOSE **a, const X509_PURPOSE **b) { +static int xp_cmp(const X509_PURPOSE *const *a, const X509_PURPOSE *const *b) { return (*a)->purpose - (*b)->purpose; } diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index 9281e305f8..183cf6ab7e 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -75,7 +75,7 @@ static char *strip_spaces(char *name); -static int sk_strcmp(const char **a, const char **b); +static int sk_strcmp(const char *const *a, const char *const *b); static STACK_OF(OPENSSL_STRING) *get_email(const X509_NAME *name, const GENERAL_NAMES *gens); static void str_free(OPENSSL_STRING str); @@ -551,7 +551,9 @@ int x509v3_conf_name_matches(const char *name, const char *cmp) { return name[len] == '\0' || name[len] == '.'; } -static int sk_strcmp(const char **a, const char **b) { return strcmp(*a, *b); } +static int sk_strcmp(const char *const *a, const char *const *b) { + return strcmp(*a, *b); +} STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x) { GENERAL_NAMES *gens; diff --git a/include/openssl/base.h b/include/openssl/base.h index a1a4309a41..fb1815f802 100644 --- a/include/openssl/base.h +++ b/include/openssl/base.h @@ -193,7 +193,7 @@ extern "C" { // A consumer may use this symbol in the preprocessor to temporarily build // against multiple revisions of BoringSSL at the same time. It is not // recommended to do so for longer than is necessary. -#define BORINGSSL_API_VERSION 18 +#define BORINGSSL_API_VERSION 19 #if defined(BORINGSSL_SHARED_LIBRARY) diff --git a/include/openssl/stack.h b/include/openssl/stack.h index 72da30d222..59b1c5eff1 100644 --- a/include/openssl/stack.h +++ b/include/openssl/stack.h @@ -127,10 +127,8 @@ typedef SAMPLE *(*sk_SAMPLE_copy_func)(const SAMPLE *); // respectively. Note the extra indirection - the function is given a pointer // to a pointer to the element. This is the |qsort|/|bsearch| comparison // function applied to an array of |SAMPLE*|. -// -// TODO(https://crbug.com/boringssl/498): The parameters should be -// |const SAMPLE *const *|. -typedef int (*sk_SAMPLE_cmp_func)(const SAMPLE **a, const SAMPLE **b); +typedef int (*sk_SAMPLE_cmp_func)(const SAMPLE *const *a, + const SAMPLE *const *b); // sk_SAMPLE_new creates a new, empty stack with the given comparison function, // which may be NULL. It returns the new stack or NULL on allocation failure. @@ -264,13 +262,10 @@ typedef void *(*OPENSSL_sk_copy_func)(const void *ptr); // the extra indirection - the function is given a pointer to a pointer to the // element. This differs from the usual qsort/bsearch comparison function. // -// Note its actual type is |int (*)(const T **a, const T **b)|. Low-level |sk_*| -// functions will be passed a type-specific wrapper to call it correctly. -// -// TODO(https://crbug.com/boringssl/498): This type should be -// |const T *const *|. It is already fixed in OpenSSL 1.1.1, so hopefully we can -// fix this compatibly. -typedef int (*OPENSSL_sk_cmp_func)(const void **a, const void **b); +// Note its actual type is |int (*)(const T *const *a, const T *const *b)|. +// Low-level |sk_*| functions will be passed a type-specific wrapper to call it +// correctly. +typedef int (*OPENSSL_sk_cmp_func)(const void *const *a, const void *const *b); // OPENSSL_sk_delete_if_func is the generic version of // |sk_SAMPLE_delete_if_func|. @@ -387,7 +382,8 @@ BSSL_NAMESPACE_END \ typedef void (*sk_##name##_free_func)(ptrtype); \ typedef ptrtype (*sk_##name##_copy_func)(constptrtype); \ - typedef int (*sk_##name##_cmp_func)(constptrtype *, constptrtype *); \ + typedef int (*sk_##name##_cmp_func)(constptrtype const *, \ + constptrtype const *); \ typedef int (*sk_##name##_delete_if_func)(ptrtype, void *); \ \ OPENSSL_INLINE void sk_##name##_call_free_func( \ diff --git a/ssl/ssl_file.cc b/ssl/ssl_file.cc index d867cf12c3..9e06ec893f 100644 --- a/ssl/ssl_file.cc +++ b/ssl/ssl_file.cc @@ -124,7 +124,7 @@ #include "internal.h" -static int xname_cmp(const X509_NAME **a, const X509_NAME **b) { +static int xname_cmp(const X509_NAME *const *a, const X509_NAME *const *b) { return X509_NAME_cmp(*a, *b); } @@ -143,7 +143,7 @@ static int add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, BIO *bio, struct RestoreCmpFunc { ~RestoreCmpFunc() { sk_X509_NAME_set_cmp_func(stack, old_cmp); } STACK_OF(X509_NAME) *stack; - int (*old_cmp)(const X509_NAME **, const X509_NAME **); + int (*old_cmp)(const X509_NAME *const *, const X509_NAME *const *); }; RestoreCmpFunc restore = {out, sk_X509_NAME_set_cmp_func(out, xname_cmp)}; From 678bae408369d614e0777bc5cd5a380dac35ed59 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 03:22:49 +0900 Subject: [PATCH 161/177] Remove dynamic X509_VERIFY_PARAM registration This was not thread-safe and, until the previous CL, egregiously so. No one uses this API, so remove it. Update-Note: Various unused functions for registering named X509_VERIFY_PARAMs were removed. These functions only exist to make X509_VERIFY_PARAM_lookup return a custom value. Instead, applications that want a particular X509_VERIFY_PARAM can just configure it directly, rather than stashing it in library-global state and then looking it back up with X509_VERIFY_PARAM_lookup. Change-Id: I8d532a1a137c7abbc131f2cb5d12ba94e5728e2d Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58386 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/x509/x509_vpm.c | 68 +----------------------------------------- include/openssl/x509.h | 4 --- 2 files changed, 1 insertion(+), 71 deletions(-) diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index 8ff80389e2..57c9bc0c8b 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -547,77 +547,11 @@ static const X509_VERIFY_PARAM default_table[] = { NULL, // policies vpm_empty_id}}; -static STACK_OF(X509_VERIFY_PARAM) *param_table = NULL; - -static int param_cmp(const X509_VERIFY_PARAM *const *a, - const X509_VERIFY_PARAM *const *b) { - return strcmp((*a)->name, (*b)->name); -} - -int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) { - // TODO(davidben): This should be locked. Alternatively, remove the dynamic - // registration mechanism entirely. - X509_VERIFY_PARAM *ptmp; - if (!param_table) { - param_table = sk_X509_VERIFY_PARAM_new(param_cmp); - if (!param_table) { - return 0; - } - } else { - size_t idx; - if (sk_X509_VERIFY_PARAM_find(param_table, &idx, param)) { - ptmp = sk_X509_VERIFY_PARAM_value(param_table, idx); - X509_VERIFY_PARAM_free(ptmp); - (void)sk_X509_VERIFY_PARAM_delete(param_table, idx); - } - } - if (!sk_X509_VERIFY_PARAM_push(param_table, param)) { - return 0; - } - sk_X509_VERIFY_PARAM_sort(param_table); - return 1; -} - -int X509_VERIFY_PARAM_get_count(void) { - int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM); - if (param_table) { - num += sk_X509_VERIFY_PARAM_num(param_table); - } - return num; -} - -const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id) { - int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM); - if (id < num) { - return default_table + id; - } - return sk_X509_VERIFY_PARAM_value(param_table, id - num); -} - const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name) { - X509_VERIFY_PARAM pm; - unsigned i, limit; - - pm.name = (char *)name; - if (param_table) { - size_t idx; - if (sk_X509_VERIFY_PARAM_find(param_table, &idx, &pm)) { - return sk_X509_VERIFY_PARAM_value(param_table, idx); - } - } - - limit = sizeof(default_table) / sizeof(X509_VERIFY_PARAM); - for (i = 0; i < limit; i++) { + for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(default_table); i++) { if (strcmp(default_table[i].name, name) == 0) { return &default_table[i]; } } return NULL; } - -void X509_VERIFY_PARAM_table_cleanup(void) { - if (param_table) { - sk_X509_VERIFY_PARAM_pop_free(param_table, X509_VERIFY_PARAM_free); - } - param_table = NULL; -} diff --git a/include/openssl/x509.h b/include/openssl/x509.h index f0985345d0..69d1e00c1f 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -2843,12 +2843,8 @@ OPENSSL_EXPORT int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); OPENSSL_EXPORT const char *X509_VERIFY_PARAM_get0_name( const X509_VERIFY_PARAM *param); -OPENSSL_EXPORT int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); -OPENSSL_EXPORT int X509_VERIFY_PARAM_get_count(void); -OPENSSL_EXPORT const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); OPENSSL_EXPORT const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup( const char *name); -OPENSSL_EXPORT void X509_VERIFY_PARAM_table_cleanup(void); #if defined(__cplusplus) From fca688f26b939db9c9981204373cecbd108b5d6c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 14:00:20 +0900 Subject: [PATCH 162/177] Fix policy validation when the user policy set is NULL OpenSSL interprets NULL and empty lists as {anyPolicy}. I intended to implement this, but didn't quite get the NULL case right. Fix this and add a test. Change-Id: I50dbf02695f424697e28a6e0ec4fd50b2822f44f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58425 Reviewed-by: Bob Beck Commit-Queue: Bob Beck Auto-Submit: David Benjamin --- crypto/x509/internal.h | 3 ++- crypto/x509/policy.c | 14 ++++++++------ crypto/x509/x509_test.cc | 5 +++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/crypto/x509/internal.h b/crypto/x509/internal.h index 45c3fcce11..1937aa19c9 100644 --- a/crypto/x509/internal.h +++ b/crypto/x509/internal.h @@ -404,7 +404,8 @@ int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, // Path-building functions. // X509_policy_check checks certificate policies in |certs|. |user_policies| is -// the user-initial-policy-set. |flags| is a set of |X509_V_FLAG_*| values to +// the user-initial-policy-set. If |user_policies| is NULL or empty, it is +// interpreted as anyPolicy. |flags| is a set of |X509_V_FLAG_*| values to // apply. It returns |X509_V_OK| on success and |X509_V_ERR_*| on error. It // additionally sets |*out_current_cert| to the certificate where the error // occurred. If the function succeeded, or the error applies to the entire diff --git a/crypto/x509/policy.c b/crypto/x509/policy.c index abcc586427..b0c27126c4 100644 --- a/crypto/x509/policy.c +++ b/crypto/x509/policy.c @@ -579,7 +579,7 @@ static int process_policy_constraints(const X509 *x509, size_t *explicit_policy, // evaluation. static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, const STACK_OF(ASN1_OBJECT) *user_policies) { - assert(sk_ASN1_OBJECT_is_sorted(user_policies)); + assert(user_policies == NULL || sk_ASN1_OBJECT_is_sorted(user_policies)); // Step (g.i). If the policy graph is empty, the intersection is empty. size_t num_levels = sk_X509_POLICY_LEVEL_num(levels); @@ -763,12 +763,14 @@ int X509_policy_check(const STACK_OF(X509) *certs, // is only necessary to check if the user-constrained-policy-set is not empty. if (explicit_policy == 0) { // Build a sorted copy of |user_policies| for more efficient lookup. - user_policies_sorted = sk_ASN1_OBJECT_dup(user_policies); - if (user_policies_sorted == NULL) { - goto err; + if (user_policies != NULL) { + user_policies_sorted = sk_ASN1_OBJECT_dup(user_policies); + if (user_policies_sorted == NULL) { + goto err; + } + sk_ASN1_OBJECT_set_cmp_func(user_policies_sorted, asn1_object_cmp); + sk_ASN1_OBJECT_sort(user_policies_sorted); } - sk_ASN1_OBJECT_set_cmp_func(user_policies_sorted, asn1_object_cmp); - sk_ASN1_OBJECT_sort(user_policies_sorted); if (!has_explicit_policy(levels, user_policies_sorted)) { ret = X509_V_ERR_NO_EXPLICIT_POLICY; diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 653af39117..03f5d1905b 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5358,6 +5358,8 @@ TEST(X509Test, Policy) { }; // The chain is good for |oid1| and |oid2|, but not |oid3|. + EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY)); EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { @@ -5442,6 +5444,9 @@ TEST(X509Test, Policy) { })); // A leaf can also set requireExplicitPolicy. + EXPECT_EQ(X509_V_OK, + Verify(leaf_require.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, X509_V_FLAG_POLICY_CHECK)); EXPECT_EQ(X509_V_OK, Verify(leaf_require.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) { From 28226f584e8fb65eb8730721dcb5001f2a072efc Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 14:04:44 +0900 Subject: [PATCH 163/177] Fix handling of critical X.509 policy constraints If we see a critical policy constraints extension, we have two options: We can either process it, which requires running policy validation, or reject the certificate. We and OpenSSL do neither by default, which means we may accept certificate chains that we weren't supposed to. This fixes it by enabling X.509 policy validation unconditionally and makes X509_V_FLAG_POLICY_CHECK moot. As a side effect, callers no longer need to do anything for CVE-2023-0466. This is the opposite of [0]'s advice, which instead recommends skipping the feature and rejecting critical policy contraints. That would be a good move for a new X.509 implementation. Policy validation is badly-designed, even by X.509's standards. But we have OpenSSL's history of previously accepting critical policy constraints (even though it didn't check it). I also found at least one caller that tests a chain with policy constraints, albeit a non-critical one. We now have an efficient policy validation implementation, so just enable it. Of course, fixing this bug in either direction has compatibility risks: either we take on the compat risk of being newly incompatible with policyConstraints-using PKIs, or we take on the compat risk of newly rejecting certificates that were invalid due to a policy validation error, but no one noticed. The latter case seems safer because the chain is unambiguously invalid. Update-Note: X.509 certificate verification (not parsing) will now notice policy-validation-related errors in the certificate chain. These include syntax errors in policy-related extensions, and chains with a requireExplicitPolicy policy constraint that are valid for no certificate policies. Such chains are unambiguously invalid. We just did not check it before by default. This is an obscure corner of X.509 and not expected to come up in most PKIs. [0] https://www.ietf.org/archive/id/draft-davidben-x509-policy-graph-01.html#section-3.4.4 Fixed: 557 Change-Id: Icc00c7797bb95fd3b14570eb068543fd83cda7b9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58426 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509/test/make_policy_certs.go | 4 ++++ crypto/x509/test/policy_leaf_none.pem | 10 ++++++++++ crypto/x509/x509_test.cc | 26 ++++++++++++++------------ crypto/x509/x509_vfy.c | 7 +++---- crypto/x509/x509_vpm.c | 6 ------ include/openssl/x509.h | 7 +------ sources.cmake | 1 + 7 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 crypto/x509/test/policy_leaf_none.pem diff --git a/crypto/x509/test/make_policy_certs.go b/crypto/x509/test/make_policy_certs.go index 76be6a08a9..b1c5a60efe 100644 --- a/crypto/x509/test/make_policy_certs.go +++ b/crypto/x509/test/make_policy_certs.go @@ -302,6 +302,10 @@ func main() { leafSingle.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID5} mustGenerateCertificate("policy_leaf_oid5.pem", &leafSingle, &intermediate) + leafNone := leaf + leafNone.template.PolicyIdentifiers = nil + mustGenerateCertificate("policy_leaf_none.pem", &leafNone, &intermediate) + // Make version of Root, signed by Root 2, with policy mapping inhibited. // This can be combined with intermediateMapped to test the combination. b = cryptobyte.NewBuilder(nil) diff --git a/crypto/x509/test/policy_leaf_none.pem b/crypto/x509/test/policy_leaf_none.pem new file mode 100644 index 0000000000..13ad7cec01 --- /dev/null +++ b/crypto/x509/test/policy_leaf_none.pem @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE----- +MIIBezCCASCgAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo1EwTzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wCgYIKoZIzj0EAwIDSQAwRgIhAIDFeeYJ8nmYo09OnJFpNS3A6fYO +ZliHkAqOsg193DTnAiEA3OSHLCczcvRjMG+qd/FI61u2sKU1hhHh7uHtD/YO/dA= +-----END CERTIFICATE----- diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc index 03f5d1905b..056d56a4b3 100644 --- a/crypto/x509/x509_test.cc +++ b/crypto/x509/x509_test.cc @@ -5313,6 +5313,9 @@ TEST(X509Test, Policy) { bssl::UniquePtr leaf_invalid(CertFromPEM( GetTestData("crypto/x509/test/policy_leaf_invalid.pem").c_str())); ASSERT_TRUE(leaf_invalid); + bssl::UniquePtr leaf_none(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_none.pem").c_str())); + ASSERT_TRUE(leaf_none); bssl::UniquePtr leaf_oid1(CertFromPEM( GetTestData("crypto/x509/test/policy_leaf_oid1.pem").c_str())); ASSERT_TRUE(leaf_oid1); @@ -5335,14 +5338,6 @@ TEST(X509Test, Policy) { GetTestData("crypto/x509/test/policy_leaf_require1.pem").c_str())); ASSERT_TRUE(leaf_require1); - // By default, OpenSSL does not check policies, so even syntax errors in the - // certificatePolicies extension go unnoticed. (This is probably not - // important.) - EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, - {intermediate.get()}, /*crls=*/{})); - EXPECT_EQ(X509_V_OK, Verify(leaf_invalid.get(), {root.get()}, - {intermediate.get()}, /*crls=*/{})); - auto set_policies = [](X509_VERIFY_PARAM *param, std::vector oids) { for (const ASN1_OBJECT *oid : oids) { @@ -5351,9 +5346,6 @@ TEST(X509Test, Policy) { ASSERT_TRUE(X509_VERIFY_PARAM_add0_policy(param, copy.get())); copy.release(); // |X509_VERIFY_PARAM_add0_policy| takes ownership on // success. - // TODO(davidben): |X509_VERIFY_PARAM_add0_policy| does not set this flag, - // while |X509_VERIFY_PARAM_set1_policies| does. Is this a bug? - X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_POLICY_CHECK); } }; @@ -5399,6 +5391,9 @@ TEST(X509Test, Policy) { [&](X509_VERIFY_PARAM *param) { set_policies(param, {oid1.get()}); })); + EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, + Verify(leaf_invalid.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{})); // There is a duplicate policy in the policy extension. EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, @@ -5443,10 +5438,17 @@ TEST(X509Test, Policy) { set_policies(param, {oid3.get()}); })); + // requireExplicitPolicy applies even if the application does not configure a + // user-initial-policy-set. If the validation results in no policies, the + // chain is invalid. + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_none.get(), {root.get()}, {intermediate_require.get()}, + /*crls=*/{})); + // A leaf can also set requireExplicitPolicy. EXPECT_EQ(X509_V_OK, Verify(leaf_require.get(), {root.get()}, {intermediate.get()}, - /*crls=*/{}, X509_V_FLAG_POLICY_CHECK)); + /*crls=*/{}, /*flags=*/0)); EXPECT_EQ(X509_V_OK, Verify(leaf_require.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) { diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c index fe6c596510..ea9ff3c6c2 100644 --- a/crypto/x509/x509_vfy.c +++ b/crypto/x509/x509_vfy.c @@ -447,7 +447,6 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { // Check revocation status: we do this after copying parameters because // they may be needed for CRL signature verification. - ok = ctx->check_revocation(ctx); if (!ok) { goto end; @@ -464,14 +463,13 @@ int X509_verify_cert(X509_STORE_CTX *ctx) { } // Check name constraints - ok = check_name_constraints(ctx); if (!ok) { goto end; } - // If we get this far evaluate policies - if (!bad_chain && (ctx->param->flags & X509_V_FLAG_POLICY_CHECK)) { + // If we get this far, evaluate policies. + if (!bad_chain) { ok = ctx->check_policy(ctx); } @@ -1612,6 +1610,7 @@ static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) { } static int check_policy(X509_STORE_CTX *ctx) { + // TODO(davidben): Why do we disable policy validation for CRL paths? if (ctx->parent) { return 1; } diff --git a/crypto/x509/x509_vpm.c b/crypto/x509/x509_vpm.c index 57c9bc0c8b..583b4a050b 100644 --- a/crypto/x509/x509_vpm.c +++ b/crypto/x509/x509_vpm.c @@ -350,9 +350,6 @@ int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name) { int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags) { param->flags |= flags; - if (flags & X509_V_FLAG_POLICY_MASK) { - param->flags |= X509_V_FLAG_POLICY_CHECK; - } return 1; } @@ -398,8 +395,6 @@ int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, if (!sk_ASN1_OBJECT_push(param->policies, policy)) { return 0; } - // TODO(davidben): This does not set |X509_V_FLAG_POLICY_CHECK|, while - // |X509_VERIFY_PARAM_set1_policies| does. Is this a bug? return 1; } @@ -421,7 +416,6 @@ int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, return 0; } - param->flags |= X509_V_FLAG_POLICY_CHECK; return 1; } diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 69d1e00c1f..9e9e5b179a 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -2565,7 +2565,7 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); #define X509_V_FLAG_X509_STRICT 0x00 // This flag does nothing as proxy certificate support has been removed. #define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 -// Enable policy checking +// Does nothing as its functionality has been enabled by default. #define X509_V_FLAG_POLICY_CHECK 0x80 // Policy variable require-explicit-policy #define X509_V_FLAG_EXPLICIT_POLICY 0x100 @@ -2602,11 +2602,6 @@ OPENSSL_EXPORT void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); #define X509_VP_FLAG_LOCKED 0x8 #define X509_VP_FLAG_ONCE 0x10 -// Internal use: mask of policy related options -#define X509_V_FLAG_POLICY_MASK \ - (X509_V_FLAG_POLICY_CHECK | X509_V_FLAG_EXPLICIT_POLICY | \ - X509_V_FLAG_INHIBIT_ANY | X509_V_FLAG_INHIBIT_MAP) - OPENSSL_EXPORT int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type, X509_NAME *name); OPENSSL_EXPORT X509_OBJECT *X509_OBJECT_retrieve_by_subject( diff --git a/sources.cmake b/sources.cmake index f220651e70..dad834d6ff 100644 --- a/sources.cmake +++ b/sources.cmake @@ -127,6 +127,7 @@ set( crypto/x509/test/policy_leaf_any.pem crypto/x509/test/policy_leaf_duplicate.pem crypto/x509/test/policy_leaf_invalid.pem + crypto/x509/test/policy_leaf_none.pem crypto/x509/test/policy_leaf_oid1.pem crypto/x509/test/policy_leaf_oid2.pem crypto/x509/test/policy_leaf_oid3.pem From 58472cc752c92554343d032ab34c683005f63e30 Mon Sep 17 00:00:00 2001 From: Sophie Schmieg Date: Tue, 7 Mar 2023 00:39:31 +0000 Subject: [PATCH 164/177] Adding a C implementation of Kyber. Passes test vectors, and should be constant time, but is currently not optimized and neither the API nor the standard is stable. Change-Id: I89b90877e023a43ee7238e11b86065444ab3bdec Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57845 Reviewed-by: David Benjamin Commit-Queue: Adam Langley --- crypto/CMakeLists.txt | 1 + crypto/kyber/internal.h | 34 +- crypto/kyber/keccak.c | 23 +- crypto/kyber/kyber.c | 826 +++++++++++++++++++++++++++++++++++ crypto/kyber/kyber_test.cc | 158 ++++++- crypto/kyber/kyber_tests.txt | 706 ++++++++++++++++++++++++++++++ include/openssl/kyber.h | 128 ++++++ sources.cmake | 1 + ssl/ssl_key_share.cc | 77 +++- tool/speed.cc | 58 ++- util/doc.config | 1 + 11 files changed, 1990 insertions(+), 23 deletions(-) create mode 100644 crypto/kyber/kyber.c create mode 100644 crypto/kyber/kyber_tests.txt create mode 100644 include/openssl/kyber.h diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 8ece558a79..6cc16a8b84 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -172,6 +172,7 @@ add_library( hpke/hpke.c hrss/hrss.c kyber/keccak.c + kyber/kyber.c lhash/lhash.c mem.c obj/obj.c diff --git a/crypto/kyber/internal.h b/crypto/kyber/internal.h index 6761d551a4..b3bfa86b84 100644 --- a/crypto/kyber/internal.h +++ b/crypto/kyber/internal.h @@ -16,12 +16,22 @@ #define OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H #include +#include #if defined(__cplusplus) extern "C" { #endif +// KYBER_ENCAP_ENTROPY is the number of bytes of uniformly random entropy +// necessary to encapsulate a secret. The entropy will be leaked to the +// decapsulating party. +#define KYBER_ENCAP_ENTROPY 32 + +// KYBER_GENERATE_KEY_ENTROPY is the number of bytes of uniformly random entropy +// necessary to generate a key. +#define KYBER_GENERATE_KEY_ENTROPY 64 + struct BORINGSSL_keccak_st { uint64_t state[25]; size_t rate_bytes; @@ -50,9 +60,29 @@ OPENSSL_EXPORT void BORINGSSL_keccak_init( enum boringssl_keccak_config_t config); // BORINGSSL_keccak_squeeze writes |out_len| bytes to |out| from |ctx|. -OPENSSL_EXPORT void BORINGSSL_keccak_squeeze( - struct BORINGSSL_keccak_st *ctx, uint8_t *out, size_t out_len); +OPENSSL_EXPORT void BORINGSSL_keccak_squeeze(struct BORINGSSL_keccak_st *ctx, + uint8_t *out, size_t out_len); + +// KYBER_generate_key_external_entropy is a deterministic function to create a +// pair of Kyber768 keys, using the supplied entropy. The entropy needs to be +// uniformly random generated. This function is should only be used for tests, +// regular callers should use the non-deterministic |KYBER_generate_key| +// directly. +OPENSSL_EXPORT void KYBER_generate_key_external_entropy( + uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], + struct KYBER_private_key *out_private_key, + const uint8_t entropy[KYBER_GENERATE_KEY_ENTROPY]); +// KYBER_encap_external_entropy is a deterministic function to encapsulate +// |out_shared_secret_len| bytes of |out_shared_secret| to |ciphertext|, using +// |KYBER_ENCAP_ENTROPY| bytes of |entropy| for randomization. The +// decapsulating side will be able to recover |entropy| in full. This +// function is should only be used for tests, regular callers should use the +// non-deterministic |KYBER_encap| directly. +OPENSSL_EXPORT void KYBER_encap_external_entropy( + uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], uint8_t *out_shared_secret, + size_t out_shared_secret_len, const struct KYBER_public_key *public_key, + const uint8_t entropy[KYBER_ENCAP_ENTROPY]); #if defined(__cplusplus) } diff --git a/crypto/kyber/keccak.c b/crypto/kyber/keccak.c index 099b6eb17a..f1c012d115 100644 --- a/crypto/kyber/keccak.c +++ b/crypto/kyber/keccak.c @@ -56,19 +56,18 @@ static void keccak_f(uint64_t state[25]) { // and the sequence will repeat. All that remains is to handle the element // at (0, 0), but the rotation for that element is zero, and it goes to (0, // 0), so we can ignore it. - int pi_x = 1, pi_y = 0; + static const uint8_t kIndexes[24] = {10, 7, 11, 17, 18, 3, 5, 16, + 8, 21, 24, 4, 15, 23, 19, 13, + 12, 2, 20, 14, 22, 9, 6, 1}; + static const uint8_t kRotations[24] = {1, 3, 6, 10, 15, 21, 28, 36, + 45, 55, 2, 14, 27, 41, 56, 8, + 25, 43, 62, 18, 39, 61, 20, 44}; uint64_t prev_value = state[1]; - int pi_rot = 1; - for (int i = 1; i < 25; i++) { - const int out_x = pi_y; - const int out_y = (2 * pi_x + 3 * pi_y) % 5; - const int index = out_y * 5 + out_x; - const uint64_t t = state[index]; - state[index] = CRYPTO_rotl_u64(prev_value, pi_rot); - pi_rot = (pi_rot + i + 1) % 64; - prev_value = t; - pi_x = out_x; - pi_y = out_y; + for (int i = 0; i < 24; i++) { + const uint64_t value = CRYPTO_rotl_u64(prev_value, kRotations[i]); + const size_t index = kIndexes[i]; + prev_value = state[index]; + state[index] = value; } // χ step diff --git a/crypto/kyber/kyber.c b/crypto/kyber/kyber.c new file mode 100644 index 0000000000..f2ac30bd31 --- /dev/null +++ b/crypto/kyber/kyber.c @@ -0,0 +1,826 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include + +#include +#include + +#include +#include + +#include "../internal.h" +#include "./internal.h" + + +// See +// https://pq-crystals.org/kyber/data/kyber-specification-round3-20210804.pdf + +#define DEGREE 256 +#define RANK 3 + +static const size_t kBarrettMultiplier = 5039; +static const unsigned kBarrettShift = 24; +static const uint16_t kPrime = 3329; +static const int kLog2Prime = 12; +static const uint16_t kHalfPrime = (/*kPrime=*/3329 - 1) / 2; +static const int kDU = 10; +static const int kDV = 4; +// kInverseDegree is 128^-1 mod 3329; 128 because kPrime does not have a 512th +// root of unity. +static const uint16_t kInverseDegree = 3303; +static const size_t kEncodedVectorSize = + (/*kLog2Prime=*/12 * DEGREE / 8) * RANK; +static const size_t kCompressedVectorSize = /*kDU=*/10 * RANK * DEGREE / 8; + +typedef struct scalar { + // On every function entry and exit, 0 <= c < kPrime. + uint16_t c[DEGREE]; +} scalar; + +typedef struct vector { + scalar v[RANK]; +} vector; + +typedef struct matrix { + scalar v[RANK][RANK]; +} matrix; + +// This bit of Python will be referenced in some of the following comments: +// +// p = 3329 +// +// def bitreverse(i): +// ret = 0 +// for n in range(7): +// bit = i & 1 +// ret <<= 1 +// ret |= bit +// i >>= 1 +// return ret + +// kNTTRoots = [pow(17, bitreverse(i), p) for i in range(128)] +static const uint16_t kNTTRoots[128] = { + 1, 1729, 2580, 3289, 2642, 630, 1897, 848, 1062, 1919, 193, 797, + 2786, 3260, 569, 1746, 296, 2447, 1339, 1476, 3046, 56, 2240, 1333, + 1426, 2094, 535, 2882, 2393, 2879, 1974, 821, 289, 331, 3253, 1756, + 1197, 2304, 2277, 2055, 650, 1977, 2513, 632, 2865, 33, 1320, 1915, + 2319, 1435, 807, 452, 1438, 2868, 1534, 2402, 2647, 2617, 1481, 648, + 2474, 3110, 1227, 910, 17, 2761, 583, 2649, 1637, 723, 2288, 1100, + 1409, 2662, 3281, 233, 756, 2156, 3015, 3050, 1703, 1651, 2789, 1789, + 1847, 952, 1461, 2687, 939, 2308, 2437, 2388, 733, 2337, 268, 641, + 1584, 2298, 2037, 3220, 375, 2549, 2090, 1645, 1063, 319, 2773, 757, + 2099, 561, 2466, 2594, 2804, 1092, 403, 1026, 1143, 2150, 2775, 886, + 1722, 1212, 1874, 1029, 2110, 2935, 885, 2154, +}; + +// kInverseNTTRoots = [pow(17, -bitreverse(i), p) for i in range(128)] +static const uint16_t kInverseNTTRoots[128] = { + 1, 1600, 40, 749, 2481, 1432, 2699, 687, 1583, 2760, 69, 543, + 2532, 3136, 1410, 2267, 2508, 1355, 450, 936, 447, 2794, 1235, 1903, + 1996, 1089, 3273, 283, 1853, 1990, 882, 3033, 2419, 2102, 219, 855, + 2681, 1848, 712, 682, 927, 1795, 461, 1891, 2877, 2522, 1894, 1010, + 1414, 2009, 3296, 464, 2697, 816, 1352, 2679, 1274, 1052, 1025, 2132, + 1573, 76, 2998, 3040, 1175, 2444, 394, 1219, 2300, 1455, 2117, 1607, + 2443, 554, 1179, 2186, 2303, 2926, 2237, 525, 735, 863, 2768, 1230, + 2572, 556, 3010, 2266, 1684, 1239, 780, 2954, 109, 1292, 1031, 1745, + 2688, 3061, 992, 2596, 941, 892, 1021, 2390, 642, 1868, 2377, 1482, + 1540, 540, 1678, 1626, 279, 314, 1173, 2573, 3096, 48, 667, 1920, + 2229, 1041, 2606, 1692, 680, 2746, 568, 3312, +}; + +// kModRoots = [pow(17, 2*bitreverse(i) + 1, p) for i in range(128)] +static const uint16_t kModRoots[128] = { + 17, 3312, 2761, 568, 583, 2746, 2649, 680, 1637, 1692, 723, 2606, + 2288, 1041, 1100, 2229, 1409, 1920, 2662, 667, 3281, 48, 233, 3096, + 756, 2573, 2156, 1173, 3015, 314, 3050, 279, 1703, 1626, 1651, 1678, + 2789, 540, 1789, 1540, 1847, 1482, 952, 2377, 1461, 1868, 2687, 642, + 939, 2390, 2308, 1021, 2437, 892, 2388, 941, 733, 2596, 2337, 992, + 268, 3061, 641, 2688, 1584, 1745, 2298, 1031, 2037, 1292, 3220, 109, + 375, 2954, 2549, 780, 2090, 1239, 1645, 1684, 1063, 2266, 319, 3010, + 2773, 556, 757, 2572, 2099, 1230, 561, 2768, 2466, 863, 2594, 735, + 2804, 525, 1092, 2237, 403, 2926, 1026, 2303, 1143, 2186, 2150, 1179, + 2775, 554, 886, 2443, 1722, 1607, 1212, 2117, 1874, 1455, 1029, 2300, + 2110, 1219, 2935, 394, 885, 2444, 2154, 1175, +}; + +// reduce_once reduces 0 <= x < 2*kPrime, mod kPrime. +static uint16_t reduce_once(uint16_t x) { + assert(x < 2 * kPrime); + const uint16_t subtracted = x - kPrime; + uint16_t mask = 0u - (subtracted >> 15); + // On Aarch64, omitting a |value_barrier_u16| results in a 2x speedup of Kyber + // overall and Clang still produces constant-time code using `csel`. On other + // platforms & compilers on godbolt that we care about, this code also + // produces constant-time output. + return (mask & x) | (~mask & subtracted); +} + +// constant time reduce x mod kPrime using Barrett reduction. x must be less +// than kPrime + 2×kPrime². +static uint16_t reduce(uint32_t x) { + assert(x < kPrime + 2u * kPrime * kPrime); + uint64_t product = (uint64_t)x * kBarrettMultiplier; + uint32_t quotient = product >> kBarrettShift; + uint32_t remainder = x - quotient * kPrime; + return reduce_once(remainder); +} + +static void scalar_zero(scalar *out) { OPENSSL_memset(out, 0, sizeof(*out)); } + +static void vector_zero(vector *out) { OPENSSL_memset(out, 0, sizeof(*out)); } + +// In place number theoretic transform of a given scalar. +// Note that Kyber's kPrime 3329 does not have a 512th root of unity, so this +// transform leaves off the last iteration of the usual FFT code, with the 128 +// relevant roots of unity being stored in |kNTTRoots|. This means the output +// should be seen as 128 elements in GF(3329^2), with the coefficients of the +// elements being consecutive entries in |s->c|. +static void scalar_ntt(scalar *s) { + int offset = DEGREE; + // `int` is used here because using `size_t` throughout caused a ~5% slowdown + // with Clang 14 on Aarch64. + for (int step = 1; step < DEGREE / 2; step <<= 1) { + offset >>= 1; + int k = 0; + for (int i = 0; i < step; i++) { + const uint32_t step_root = kNTTRoots[i + step]; + for (int j = k; j < k + offset; j++) { + uint16_t odd = reduce(step_root * s->c[j + offset]); + uint16_t even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce_once(even - odd + kPrime); + } + k += 2 * offset; + } + } +} + +static void vector_ntt(vector *a) { + for (int i = 0; i < RANK; i++) { + scalar_ntt(&a->v[i]); + } +} + +// In place inverse number theoretic transform of a given scalar, with pairs of +// entries of s->v being interpreted as elements of GF(3329^2). Just as with the +// number theoretic transform, this leaves off the first step of the normal iFFT +// to account for the fact that 3329 does not have a 512th root of unity, using +// the precomputed 128 roots of unity stored in |kInverseNTTRoots|. +static void scalar_inverse_ntt(scalar *s) { + int step = DEGREE / 2; + // `int` is used here because using `size_t` throughout caused a ~5% slowdown + // with Clang 14 on Aarch64. + for (int offset = 2; offset < DEGREE; offset <<= 1) { + step >>= 1; + int k = 0; + for (int i = 0; i < step; i++) { + uint32_t step_root = kInverseNTTRoots[i + step]; + for (int j = k; j < k + offset; j++) { + uint16_t odd = s->c[j + offset]; + uint16_t even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce(step_root * (even - odd + kPrime)); + } + k += 2 * offset; + } + } + for (int i = 0; i < DEGREE; i++) { + s->c[i] = reduce(s->c[i] * kInverseDegree); + } +} + +static void vector_inverse_ntt(vector *a) { + for (int i = 0; i < RANK; i++) { + scalar_inverse_ntt(&a->v[i]); + } +} + +static void scalar_add(scalar *lhs, const scalar *rhs) { + for (int i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] + rhs->c[i]); + } +} + +static void scalar_sub(scalar *lhs, const scalar *rhs) { + for (int i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] - rhs->c[i] + kPrime); + } +} + +// Multiplying two scalars in the number theoretically transformed state. Since +// 3329 does not have a 512th root of unity, this means we have to interpret +// the 2*ith and (2*i+1)th entries of the scalar as elements of GF(3329)[X]/(X^2 +// - 17^(2*bitreverse(i)+1)) The value of 17^(2*bitreverse(i)+1) mod 3329 is +// stored in the precomputed |kModRoots| table. Note that our Barrett transform +// only allows us to multipy two reduced numbers together, so we need some +// intermediate reduction steps, even if an uint64_t could hold 3 multiplied +// numbers. +static void scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) { + for (int i = 0; i < DEGREE / 2; i++) { + uint32_t real_real = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i]; + uint32_t img_img = (uint32_t)rhs->c[2 * i + 1] * lhs->c[2 * i + 1]; + uint32_t real_img = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i + 1]; + uint32_t img_real = (uint32_t)lhs->c[2 * i + 1] * rhs->c[2 * i]; + out->c[2 * i] = + reduce(real_real + (uint32_t)reduce(img_img) * kModRoots[i]); + out->c[2 * i + 1] = reduce(img_real + real_img); + } +} + +static void vector_add(vector *lhs, const vector *rhs) { + for (int i = 0; i < RANK; i++) { + scalar_add(&lhs->v[i], &rhs->v[i]); + } +} + +static void matrix_mult(vector *out, const matrix *m, const vector *a) { + vector_zero(out); + for (int i = 0; i < RANK; i++) { + for (int j = 0; j < RANK; j++) { + scalar product; + scalar_mult(&product, &m->v[i][j], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void matrix_mult_transpose(vector *out, const matrix *m, + const vector *a) { + vector_zero(out); + for (int i = 0; i < RANK; i++) { + for (int j = 0; j < RANK; j++) { + scalar product; + scalar_mult(&product, &m->v[j][i], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void scalar_inner_product(scalar *out, const vector *lhs, + const vector *rhs) { + scalar_zero(out); + for (int i = 0; i < RANK; i++) { + scalar product; + scalar_mult(&product, &lhs->v[i], &rhs->v[i]); + scalar_add(out, &product); + } +} + +// Algorithm 1 of the Kyber spec. Rejection samples a Keccak stream to get +// uniformly distributed elements. This is used for matrix expansion and only +// operates on public inputs. +static void scalar_from_keccak_vartime(scalar *out, + struct BORINGSSL_keccak_st *keccak_ctx) { + uint8_t bytes[3]; + for (int i = 0; i < DEGREE;) { + BORINGSSL_keccak_squeeze(keccak_ctx, bytes, sizeof(bytes)); + uint16_t d1 = bytes[0] + 256 * (bytes[1] % 16); + uint16_t d2 = bytes[1] / 16 + 16 * bytes[2]; + if (d1 < kPrime) { + out->c[i++] = d1; + } + if (d2 < kPrime && i < DEGREE) { + out->c[i++] = d2; + } + } +} + +// Algorithm 2 of the Kyber spec, with eta fixed to two and the PRF call +// included. Creates binominally distributed elements by sampling 2*|eta| bits, +// and setting the coefficient to the count of the first bits minus the count of +// the second bits, resulting in a centered binomial distribution. Since eta is +// two this gives -2/2 with a probability of 1/16, -1/1 with probability 1/4, +// and 0 with probability 3/8. +static void scalar_centered_binomial_distribution_eta_2_with_prf( + scalar *out, const uint8_t input[33]) { + uint8_t entropy[128]; + static_assert(sizeof(entropy) == 2 * /*kEta=*/2 * DEGREE / 8, ""); + BORINGSSL_keccak(entropy, sizeof(entropy), input, 33, boringssl_shake256); + + for (int i = 0; i < DEGREE; i += 2) { + uint8_t byte = entropy[i / 2]; + + uint16_t value = kPrime; + value += (byte & 1) + ((byte >> 1) & 1); + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + out->c[i] = reduce_once(value); + + byte >>= 4; + value = kPrime; + value += (byte & 1) + ((byte >> 1) & 1); + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + out->c[i + 1] = reduce_once(value); + } +} + +// Generates a secret vector by using +// |scalar_centered_binomial_distribution_eta_2_with_prf|, using the given seed +// appending and incrementing |counter| for entry of the vector. +static void vector_generate_secret_eta_2(vector *out, uint8_t *counter, + const uint8_t seed[32]) { + uint8_t input[33]; + OPENSSL_memcpy(input, seed, 32); + for (int i = 0; i < RANK; i++) { + input[32] = (*counter)++; + scalar_centered_binomial_distribution_eta_2_with_prf(&out->v[i], input); + } +} + +// Expands the matrix of a seed for key generation and for encaps-CPA. +static void matrix_expand(matrix *out, const uint8_t rho[32]) { + uint8_t input[34]; + OPENSSL_memcpy(input, rho, 32); + for (int i = 0; i < RANK; i++) { + for (int j = 0; j < RANK; j++) { + input[32] = i; + input[33] = j; + struct BORINGSSL_keccak_st keccak_ctx; + BORINGSSL_keccak_init(&keccak_ctx, input, sizeof(input), + boringssl_shake128); + scalar_from_keccak_vartime(&out->v[i][j], &keccak_ctx); + } + } +} + +static const uint8_t kMasks[8] = {0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff}; + +static void scalar_encode(uint8_t *out, const scalar *s, int bits) { + assert(bits <= (int)sizeof(*s->c) * 8 && bits != 1); + + uint8_t out_byte = 0; + int out_byte_bits = 0; + + for (int i = 0; i < DEGREE; i++) { + uint16_t element = s->c[i]; + int element_bits_done = 0; + + while (element_bits_done < bits) { + int chunk_bits = bits - element_bits_done; + int out_bits_remaining = 8 - out_byte_bits; + if (chunk_bits >= out_bits_remaining) { + chunk_bits = out_bits_remaining; + out_byte |= (element & kMasks[chunk_bits - 1]) << out_byte_bits; + *out = out_byte; + out++; + out_byte_bits = 0; + out_byte = 0; + } else { + out_byte |= (element & kMasks[chunk_bits - 1]) << out_byte_bits; + out_byte_bits += chunk_bits; + } + + element_bits_done += chunk_bits; + element >>= chunk_bits; + } + } + + if (out_byte_bits > 0) { + *out = out_byte; + } +} + +// scalar_encode_1 is |scalar_encode| specialised for |bits| == 1. +static void scalar_encode_1(uint8_t out[32], const scalar *s) { + for (int i = 0; i < DEGREE; i += 8) { + uint8_t out_byte = 0; + for (int j = 0; j < 8; j++) { + out_byte |= (s->c[i + j] & 1) << j; + } + *out = out_byte; + out++; + } +} + +// Encodes an entire vector into 32*|RANK|*|bits| bytes. Note that since 256 +// (DEGREE) is divisible by 8, the individual vector entries will always fill a +// whole number of bytes, so we do not need to worry about bit packing here. +static void vector_encode(uint8_t *out, const vector *a, int bits) { + for (int i = 0; i < RANK; i++) { + scalar_encode(out + i * bits * DEGREE / 8, &a->v[i], bits); + } +} + +// scalar_decode parses |DEGREE * bits| bits from |in| into |DEGREE| values in +// |out|. It returns one on success and zero if any parsed value is >= +// |kPrime|. +static int scalar_decode(scalar *out, const uint8_t *in, int bits) { + assert(bits <= (int)sizeof(*out->c) * 8 && bits != 1); + + uint8_t in_byte = 0; + int in_byte_bits_left = 0; + + for (int i = 0; i < DEGREE; i++) { + uint16_t element = 0; + int element_bits_done = 0; + + while (element_bits_done < bits) { + if (in_byte_bits_left == 0) { + in_byte = *in; + in++; + in_byte_bits_left = 8; + } + + int chunk_bits = bits - element_bits_done; + if (chunk_bits > in_byte_bits_left) { + chunk_bits = in_byte_bits_left; + } + + element |= (in_byte & kMasks[chunk_bits - 1]) << element_bits_done; + in_byte_bits_left -= chunk_bits; + in_byte >>= chunk_bits; + + element_bits_done += chunk_bits; + } + + if (element >= kPrime) { + return 0; + } + out->c[i] = element; + } + + return 1; +} + +// scalar_decode_1 is |scalar_decode| specialised for |bits| == 1. +static void scalar_decode_1(scalar *out, const uint8_t in[32]) { + for (int i = 0; i < DEGREE; i += 8) { + uint8_t in_byte = *in; + in++; + for (int j = 0; j < 8; j++) { + out->c[i + j] = in_byte & 1; + in_byte >>= 1; + } + } +} + +// Decodes 32*|RANK|*|bits| bytes from |in| into |out|. It returns one on +// success or zero if any parsed value is >= |kPrime|. +static int vector_decode(vector *out, const uint8_t *in, int bits) { + for (int i = 0; i < RANK; i++) { + if (!scalar_decode(&out->v[i], in + i * bits * DEGREE / 8, bits)) { + return 0; + } + } + return 1; +} + +// Compresses (lossily) an input |x| mod 3329 into |bits| many bits by grouping +// numbers close to each other together. The formula used is +// round(2^|bits|/kPrime*x) mod 2^|bits|. +// Uses Barrett reduction to achieve constant time. Since we need both the +// remainder (for rounding) and the quotient (as the result), we cannot use +// |reduce| here, but need to do the Barrett reduction directly. +static uint16_t compress(uint16_t x, int bits) { + uint32_t product = (uint32_t)x << bits; + uint32_t quotient = ((uint64_t)product * kBarrettMultiplier) >> kBarrettShift; + uint32_t remainder = product - quotient * kPrime; + + // Adjust the quotient to round correctly: + // 0 <= remainder <= kHalfPrime round to 0 + // kHalfPrime < remainder <= kPrime + kHalfPrime round to 1 + // kPrime + kHalfPrime < remainder < 2 * kPrime round to 2 + assert(remainder < 2u * kPrime); + quotient += 1 & constant_time_lt_w(kHalfPrime, remainder); + quotient += 1 & constant_time_lt_w(kPrime + kHalfPrime, remainder); + return quotient & ((1 << bits) - 1); +} + +// Decompresses |x| by using an equi-distant representative. The formula is +// round(kPrime/2^|bits|*x). Note that 2^|bits| being the divisor allows us to +// implement this logic using only bit operations. +static uint16_t decompress(uint16_t x, int bits) { + uint32_t product = (uint32_t)x * kPrime; + uint32_t power = 1 << bits; + // This is |product| % power, since |power| is a power of 2. + uint32_t remainder = product & (power - 1); + // This is |product| / power, since |power| is a power of 2. + uint32_t lower = product >> bits; + // The rounding logic works since the first half of numbers mod |power| have a + // 0 as first bit, and the second half has a 1 as first bit, since |power| is + // a power of 2. As a 12 bit number, |remainder| is always positive, so we + // will shift in 0s for a right shift. + return lower + (remainder >> (bits - 1)); +} + +static void scalar_compress(scalar *s, int bits) { + for (int i = 0; i < DEGREE; i++) { + s->c[i] = compress(s->c[i], bits); + } +} + +static void scalar_decompress(scalar *s, int bits) { + for (int i = 0; i < DEGREE; i++) { + s->c[i] = decompress(s->c[i], bits); + } +} + +static void vector_compress(vector *a, int bits) { + for (int i = 0; i < RANK; i++) { + scalar_compress(&a->v[i], bits); + } +} + +static void vector_decompress(vector *a, int bits) { + for (int i = 0; i < RANK; i++) { + scalar_decompress(&a->v[i], bits); + } +} + +struct public_key { + vector t; + uint8_t rho[32]; + uint8_t public_key_hash[32]; + matrix m; +}; + +static struct public_key *public_key_from_external( + const struct KYBER_public_key *external) { + static_assert(sizeof(struct KYBER_public_key) >= sizeof(struct public_key), + "Kyber public key is too small"); + static_assert(alignof(struct KYBER_public_key) >= alignof(struct public_key), + "Kyber public key align incorrect"); + return (struct public_key *)external; +} + +struct private_key { + struct public_key pub; + vector s; + uint8_t fo_failure_secret[32]; +}; + +static struct private_key *private_key_from_external( + const struct KYBER_private_key *external) { + static_assert(sizeof(struct KYBER_private_key) >= sizeof(struct private_key), + "Kyber private key too small"); + static_assert( + alignof(struct KYBER_private_key) >= alignof(struct private_key), + "Kyber private key align incorrect"); + return (struct private_key *)external; +} + +// Calls |KYBER_generate_key_external_entropy| with random bytes from +// |RAND_bytes|. +void KYBER_generate_key(uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], + struct KYBER_private_key *out_private_key) { + uint8_t entropy[KYBER_GENERATE_KEY_ENTROPY]; + RAND_bytes(entropy, sizeof(entropy)); + KYBER_generate_key_external_entropy(out_encoded_public_key, out_private_key, + entropy); +} + +static int kyber_marshal_public_key(CBB *out, const struct public_key *pub) { + uint8_t *vector_output; + if (!CBB_add_space(out, &vector_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(vector_output, &pub->t, kLog2Prime); + if (!CBB_add_bytes(out, pub->rho, sizeof(pub->rho))) { + return 0; + } + return 1; +} + +// Algorithms 4 and 7 of the Kyber spec. Algorithms are combined since key +// generation is not part of the FO transform, and the spec uses Algorithm 7 to +// specify the actual key format. +void KYBER_generate_key_external_entropy( + uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], + struct KYBER_private_key *out_private_key, + const uint8_t entropy[KYBER_GENERATE_KEY_ENTROPY]) { + struct private_key *priv = private_key_from_external(out_private_key); + uint8_t hashed[64]; + BORINGSSL_keccak(hashed, sizeof(hashed), entropy, 32, boringssl_sha3_512); + const uint8_t *const rho = hashed; + const uint8_t *const sigma = hashed + 32; + OPENSSL_memcpy(priv->pub.rho, hashed, sizeof(priv->pub.rho)); + matrix_expand(&priv->pub.m, rho); + uint8_t counter = 0; + vector_generate_secret_eta_2(&priv->s, &counter, sigma); + vector_ntt(&priv->s); + vector error; + vector_generate_secret_eta_2(&error, &counter, sigma); + vector_ntt(&error); + matrix_mult_transpose(&priv->pub.t, &priv->pub.m, &priv->s); + vector_add(&priv->pub.t, &error); + + CBB cbb; + CBB_init_fixed(&cbb, out_encoded_public_key, KYBER_PUBLIC_KEY_BYTES); + if (!kyber_marshal_public_key(&cbb, &priv->pub)) { + abort(); + } + + BORINGSSL_keccak(priv->pub.public_key_hash, sizeof(priv->pub.public_key_hash), + out_encoded_public_key, KYBER_PUBLIC_KEY_BYTES, + boringssl_sha3_256); + OPENSSL_memcpy(priv->fo_failure_secret, entropy + 32, 32); +} + +void KYBER_public_from_private(struct KYBER_public_key *out_public_key, + const struct KYBER_private_key *private_key) { + struct public_key *const pub = public_key_from_external(out_public_key); + const struct private_key *const priv = private_key_from_external(private_key); + *pub = priv->pub; +} + +// Algorithm 5 of the Kyber spec. Encrypts a message with given randomness to +// the ciphertext in |out|. Without applying the Fujisaki-Okamoto transform this +// would not result in a CCA secure scheme, since lattice schemes are vulnerable +// to decryption failure oracles. +static void encrypt_cpa(uint8_t out[KYBER_CIPHERTEXT_BYTES], + const struct public_key *pub, const uint8_t message[32], + const uint8_t randomness[32]) { + uint8_t counter = 0; + vector secret; + vector_generate_secret_eta_2(&secret, &counter, randomness); + vector_ntt(&secret); + vector error; + vector_generate_secret_eta_2(&error, &counter, randomness); + uint8_t input[33]; + OPENSSL_memcpy(input, randomness, 32); + input[32] = counter; + scalar scalar_error; + scalar_centered_binomial_distribution_eta_2_with_prf(&scalar_error, input); + vector u; + matrix_mult(&u, &pub->m, &secret); + vector_inverse_ntt(&u); + vector_add(&u, &error); + scalar v; + scalar_inner_product(&v, &pub->t, &secret); + scalar_inverse_ntt(&v); + scalar_add(&v, &scalar_error); + scalar expanded_message; + scalar_decode_1(&expanded_message, message); + scalar_decompress(&expanded_message, 1); + scalar_add(&v, &expanded_message); + vector_compress(&u, kDU); + vector_encode(out, &u, kDU); + scalar_compress(&v, kDV); + scalar_encode(out + kCompressedVectorSize, &v, kDV); +} + +// Calls KYBER_encap_external_entropy| with random bytes from |RAND_bytes| +void KYBER_encap(uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], + uint8_t *out_shared_secret, size_t out_shared_secret_len, + const struct KYBER_public_key *public_key) { + uint8_t entropy[KYBER_ENCAP_ENTROPY]; + RAND_bytes(entropy, KYBER_ENCAP_ENTROPY); + KYBER_encap_external_entropy(out_ciphertext, out_shared_secret, + out_shared_secret_len, public_key, entropy); +} + +// Algorithm 8 of the Kyber spec, safe for line 2 of the spec. The spec there +// hashes the output of the system's random number generator, since the FO +// transform will reveal it to the decrypting party. There is no reason to do +// this when a secure random number generator is used. When an insecure random +// number generator is used, the caller should switch to a secure one before +// calling this method. +void KYBER_encap_external_entropy( + uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], uint8_t *out_shared_secret, + size_t out_shared_secret_len, const struct KYBER_public_key *public_key, + const uint8_t entropy[KYBER_ENCAP_ENTROPY]) { + const struct public_key *pub = public_key_from_external(public_key); + uint8_t input[64]; + OPENSSL_memcpy(input, entropy, KYBER_ENCAP_ENTROPY); + OPENSSL_memcpy(input + KYBER_ENCAP_ENTROPY, pub->public_key_hash, + sizeof(input) - KYBER_ENCAP_ENTROPY); + uint8_t prekey_and_randomness[64]; + BORINGSSL_keccak(prekey_and_randomness, sizeof(prekey_and_randomness), input, + sizeof(input), boringssl_sha3_512); + encrypt_cpa(out_ciphertext, pub, entropy, prekey_and_randomness + 32); + BORINGSSL_keccak(prekey_and_randomness + 32, 32, out_ciphertext, + KYBER_CIPHERTEXT_BYTES, boringssl_sha3_256); + BORINGSSL_keccak(out_shared_secret, out_shared_secret_len, + prekey_and_randomness, sizeof(prekey_and_randomness), + boringssl_shake256); +} + +// Algorithm 6 of the Kyber spec. +static void decrypt_cpa(uint8_t out[32], const struct private_key *priv, + const uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES]) { + vector u; + vector_decode(&u, ciphertext, kDU); + vector_decompress(&u, kDU); + vector_ntt(&u); + scalar v; + scalar_decode(&v, ciphertext + kCompressedVectorSize, kDV); + scalar_decompress(&v, kDV); + scalar mask; + scalar_inner_product(&mask, &priv->s, &u); + scalar_inverse_ntt(&mask); + scalar_sub(&v, &mask); + scalar_compress(&v, 1); + scalar_encode_1(out, &v); +} + +// Algorithm 9 of the Kyber spec, performing the FO transform by running +// encrypt_cpa on the decrypted message. The spec does not allow the decryption +// failure to be passed on to the caller, and instead returns a result that is +// deterministic but unpredictable to anyone without knowledge of the private +// key. +void KYBER_decap(uint8_t *out_shared_secret, size_t out_shared_secret_len, + const uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES], + const struct KYBER_private_key *private_key) { + const struct private_key *priv = private_key_from_external(private_key); + uint8_t decrypted[64]; + decrypt_cpa(decrypted, priv, ciphertext); + OPENSSL_memcpy(decrypted + 32, priv->pub.public_key_hash, + sizeof(decrypted) - 32); + uint8_t prekey_and_randomness[64]; + BORINGSSL_keccak(prekey_and_randomness, sizeof(prekey_and_randomness), + decrypted, sizeof(decrypted), boringssl_sha3_512); + uint8_t expected_ciphertext[KYBER_CIPHERTEXT_BYTES]; + encrypt_cpa(expected_ciphertext, &priv->pub, decrypted, + prekey_and_randomness + 32); + uint8_t mask = + constant_time_eq_int_8(CRYPTO_memcmp(ciphertext, expected_ciphertext, + sizeof(expected_ciphertext)), + 0); + uint8_t input[64]; + for (int i = 0; i < 32; i++) { + input[i] = constant_time_select_8(mask, prekey_and_randomness[i], + priv->fo_failure_secret[i]); + } + BORINGSSL_keccak(input + 32, 32, ciphertext, KYBER_CIPHERTEXT_BYTES, + boringssl_sha3_256); + BORINGSSL_keccak(out_shared_secret, out_shared_secret_len, input, + sizeof(input), boringssl_shake256); +} + +int KYBER_marshal_public_key(CBB *out, + const struct KYBER_public_key *public_key) { + return kyber_marshal_public_key(out, public_key_from_external(public_key)); +} + +// kyber_parse_public_key_no_hash parses |in| into |pub| but doesn't calculate +// the value of |pub->public_key_hash|. +static int kyber_parse_public_key_no_hash(struct public_key *pub, CBS *in) { + CBS t_bytes; + if (!CBS_get_bytes(in, &t_bytes, kEncodedVectorSize) || + !vector_decode(&pub->t, CBS_data(&t_bytes), kLog2Prime) || + !CBS_copy_bytes(in, pub->rho, sizeof(pub->rho))) { + return 0; + } + matrix_expand(&pub->m, pub->rho); + return 1; +} + +int KYBER_parse_public_key(struct KYBER_public_key *public_key, CBS *in) { + struct public_key *pub = public_key_from_external(public_key); + CBS orig_in = *in; + if (!kyber_parse_public_key_no_hash(pub, in) || // + CBS_len(in) != 0) { + return 0; + } + BORINGSSL_keccak(pub->public_key_hash, sizeof(pub->public_key_hash), + CBS_data(&orig_in), CBS_len(&orig_in), boringssl_sha3_256); + return 1; +} + +int KYBER_marshal_private_key(CBB *out, + const struct KYBER_private_key *private_key) { + const struct private_key *const priv = private_key_from_external(private_key); + uint8_t *s_output; + if (!CBB_add_space(out, &s_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(s_output, &priv->s, kLog2Prime); + if (!kyber_marshal_public_key(out, &priv->pub) || + !CBB_add_bytes(out, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)) || + !CBB_add_bytes(out, priv->fo_failure_secret, + sizeof(priv->fo_failure_secret))) { + return 0; + } + return 1; +} + +int KYBER_parse_private_key(struct KYBER_private_key *out_private_key, + CBS *in) { + struct private_key *const priv = private_key_from_external(out_private_key); + + CBS s_bytes; + if (!CBS_get_bytes(in, &s_bytes, kEncodedVectorSize) || + !vector_decode(&priv->s, CBS_data(&s_bytes), kLog2Prime) || + !kyber_parse_public_key_no_hash(&priv->pub, in) || + !CBS_copy_bytes(in, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)) || + !CBS_copy_bytes(in, priv->fo_failure_secret, + sizeof(priv->fo_failure_secret)) || + CBS_len(in) != 0) { + return 0; + } + return 1; +} diff --git a/crypto/kyber/kyber_test.cc b/crypto/kyber/kyber_test.cc index a4ef435fea..ae51ac9597 100644 --- a/crypto/kyber/kyber_test.cc +++ b/crypto/kyber/kyber_test.cc @@ -12,8 +12,16 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + +#include + #include +#include +#include +#include + #include "../test/file_test.h" #include "../test/test_util.h" #include "./internal.h" @@ -61,6 +69,154 @@ static void KeccakFileTest(FileTest *t) { EXPECT_EQ(Bytes(shake256_expected), Bytes(shake256_output)); } -TEST(KyberTest, Keccak) { +TEST(KyberTest, KeccakTestVectors) { FileTestGTest("crypto/kyber/keccak_tests.txt", KeccakFileTest); } + +template +static std::vector Marshal(int (*marshal_func)(CBB *, const T *), + const T *t) { + bssl::ScopedCBB cbb; + uint8_t *encoded; + size_t encoded_len; + if (!CBB_init(cbb.get(), 1) || // + !marshal_func(cbb.get(), t) || // + !CBB_finish(cbb.get(), &encoded, &encoded_len)) { + abort(); + } + + std::vector ret(encoded, encoded + encoded_len); + OPENSSL_free(encoded); + return ret; +} + +TEST(KyberTest, Basic) { + uint8_t encoded_public_key[KYBER_PUBLIC_KEY_BYTES]; + KYBER_private_key priv; + KYBER_generate_key(encoded_public_key, &priv); + + uint8_t first_two_bytes[2]; + OPENSSL_memcpy(first_two_bytes, encoded_public_key, sizeof(first_two_bytes)); + OPENSSL_memset(encoded_public_key, 0xff, sizeof(first_two_bytes)); + CBS encoded_public_key_cbs; + CBS_init(&encoded_public_key_cbs, encoded_public_key, + sizeof(encoded_public_key)); + KYBER_public_key pub; + // Parsing should fail because the first coefficient is >= kPrime; + ASSERT_FALSE(KYBER_parse_public_key(&pub, &encoded_public_key_cbs)); + + OPENSSL_memcpy(encoded_public_key, first_two_bytes, sizeof(first_two_bytes)); + CBS_init(&encoded_public_key_cbs, encoded_public_key, + sizeof(encoded_public_key)); + ASSERT_TRUE(KYBER_parse_public_key(&pub, &encoded_public_key_cbs)); + EXPECT_EQ(CBS_len(&encoded_public_key_cbs), 0u); + + EXPECT_EQ(Bytes(encoded_public_key), + Bytes(Marshal(KYBER_marshal_public_key, &pub))); + + KYBER_public_key pub2; + KYBER_public_from_private(&pub2, &priv); + EXPECT_EQ(Bytes(encoded_public_key), + Bytes(Marshal(KYBER_marshal_public_key, &pub2))); + + std::vector encoded_private_key( + Marshal(KYBER_marshal_private_key, &priv)); + EXPECT_EQ(encoded_private_key.size(), size_t{KYBER_PRIVATE_KEY_BYTES}); + + OPENSSL_memcpy(first_two_bytes, encoded_private_key.data(), + sizeof(first_two_bytes)); + OPENSSL_memset(encoded_private_key.data(), 0xff, sizeof(first_two_bytes)); + CBS cbs; + CBS_init(&cbs, encoded_private_key.data(), encoded_private_key.size()); + KYBER_private_key priv2; + // Parsing should fail because the first coefficient is >= kPrime. + ASSERT_FALSE(KYBER_parse_private_key(&priv2, &cbs)); + + OPENSSL_memcpy(encoded_private_key.data(), first_two_bytes, + sizeof(first_two_bytes)); + CBS_init(&cbs, encoded_private_key.data(), encoded_private_key.size()); + ASSERT_TRUE(KYBER_parse_private_key(&priv2, &cbs)); + EXPECT_EQ(Bytes(encoded_private_key), + Bytes(Marshal(KYBER_marshal_private_key, &priv2))); + + uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES]; + uint8_t shared_secret1[64]; + uint8_t shared_secret2[sizeof(shared_secret1)]; + KYBER_encap(ciphertext, shared_secret1, sizeof(shared_secret1), &pub); + KYBER_decap(shared_secret2, sizeof(shared_secret2), ciphertext, &priv); + EXPECT_EQ(Bytes(shared_secret1), Bytes(shared_secret2)); + KYBER_decap(shared_secret2, sizeof(shared_secret2), ciphertext, &priv2); + EXPECT_EQ(Bytes(shared_secret1), Bytes(shared_secret2)); +} + +static void KyberFileTest(FileTest *t) { + std::vector seed, public_key_expected, private_key_expected, + ciphertext_expected, shared_secret_expected; + t->IgnoreAttribute("count"); + ASSERT_TRUE(t->GetBytes(&seed, "seed")); + ASSERT_TRUE(t->GetBytes(&public_key_expected, "pk")); + ASSERT_TRUE(t->GetBytes(&private_key_expected, "sk")); + ASSERT_TRUE(t->GetBytes(&ciphertext_expected, "ct")); + ASSERT_TRUE(t->GetBytes(&shared_secret_expected, "ss")); + + KYBER_private_key priv; + uint8_t encoded_private_key[KYBER_PRIVATE_KEY_BYTES]; + KYBER_public_key pub; + uint8_t encoded_public_key[KYBER_PUBLIC_KEY_BYTES]; + uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES]; + uint8_t gen_key_entropy[KYBER_GENERATE_KEY_ENTROPY]; + uint8_t encap_entropy[KYBER_ENCAP_ENTROPY]; + uint8_t encapsulated_key[32]; + uint8_t decapsulated_key[32]; + // The test vectors provide a CTR-DRBG seed which is used to generate the + // input entropy. + ASSERT_EQ(seed.size(), size_t{CTR_DRBG_ENTROPY_LEN}); + { + bssl::UniquePtr state( + CTR_DRBG_new(seed.data(), nullptr, 0)); + ASSERT_TRUE(state); + ASSERT_TRUE( + CTR_DRBG_generate(state.get(), gen_key_entropy, 32, nullptr, 0)); + ASSERT_TRUE( + CTR_DRBG_generate(state.get(), gen_key_entropy + 32, 32, nullptr, 0)); + ASSERT_TRUE(CTR_DRBG_generate(state.get(), encap_entropy, + KYBER_ENCAP_ENTROPY, nullptr, 0)); + } + + BORINGSSL_keccak(encap_entropy, sizeof(encap_entropy), encap_entropy, + sizeof(encap_entropy), boringssl_sha3_256); + + KYBER_generate_key_external_entropy(encoded_public_key, &priv, + gen_key_entropy); + CBB cbb; + CBB_init_fixed(&cbb, encoded_private_key, sizeof(encoded_private_key)); + ASSERT_TRUE(KYBER_marshal_private_key(&cbb, &priv)); + CBS encoded_public_key_cbs; + CBS_init(&encoded_public_key_cbs, encoded_public_key, + sizeof(encoded_public_key)); + ASSERT_TRUE(KYBER_parse_public_key(&pub, &encoded_public_key_cbs)); + KYBER_encap_external_entropy(ciphertext, encapsulated_key, + sizeof(encapsulated_key), &pub, encap_entropy); + KYBER_decap(decapsulated_key, sizeof(decapsulated_key), ciphertext, &priv); + + EXPECT_EQ(Bytes(encapsulated_key), Bytes(decapsulated_key)); + EXPECT_EQ(Bytes(private_key_expected), Bytes(encoded_private_key)); + EXPECT_EQ(Bytes(public_key_expected), Bytes(encoded_public_key)); + EXPECT_EQ(Bytes(ciphertext_expected), Bytes(ciphertext)); + EXPECT_EQ(Bytes(shared_secret_expected), Bytes(encapsulated_key)); + + uint8_t corrupted_ciphertext[KYBER_CIPHERTEXT_BYTES]; + OPENSSL_memcpy(corrupted_ciphertext, ciphertext, KYBER_CIPHERTEXT_BYTES); + corrupted_ciphertext[3] ^= 0x40; + uint8_t corrupted_decapsulated_key[32]; + KYBER_decap(corrupted_decapsulated_key, sizeof(corrupted_decapsulated_key), + corrupted_ciphertext, &priv); + // It would be nice to have actual test vectors for the failure case, but the + // NIST submission currently does not include those, so we are just testing + // for inequality. + EXPECT_NE(Bytes(encapsulated_key), Bytes(corrupted_decapsulated_key)); +} + +TEST(KyberTest, TestVectors) { + FileTestGTest("crypto/kyber/kyber_tests.txt", KyberFileTest); +} diff --git a/crypto/kyber/kyber_tests.txt b/crypto/kyber/kyber_tests.txt new file mode 100644 index 0000000000..d3a1c47797 --- /dev/null +++ b/crypto/kyber/kyber_tests.txt @@ -0,0 +1,706 @@ +# Kyber768 +# From the NIST round three submission package. +# +# https://pq-crystals.org/kyber/data/kyber-submission-nist-round3.zip +# NIST-PQ-Submission-Kyber-20201001/KAT/kyber768/PQCkemKAT_2400.rsp + +count = 0 +seed = 061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1 +pk = A72C2D9C843EE9F8313ECC7F86D6294D59159D9A879A542E260922ADF999051CC45200C9FFDB60449C49465979272367C083A7D6267A3ED7A7FD47957C219327F7CA73A4007E1627F00B11CC80573C15AEE6640FB8562DFA6B240CA0AD351AC4AC155B96C14C8AB13DD262CDFD51C4BB5572FD616553D17BDD430ACBEA3E95F0B698D66990AB51E5D03783A8B3D278A5720454CF9695CFDCA08485BA099C51CD92A7EA7587C1D15C28E609A81852601B0604010679AA482D51261EC36E36B8719676217FD74C54786488F4B4969C05A8BA27CA3A77CCE73B965923CA554E422B9B61F4754641608AC16C9B8587A32C1C5DD788F88B36B717A46965635DEB67F45B129B99070909C93EB80B42C2B3F3F70343A7CF37E8520E7BCFC416ACA4F18C7981262BA2BFC756AE03278F0EC66DC2057696824BA6769865A601D7148EF6F54E5AF5686AA2906F994CE38A5E0B938F239007003022C03392DF3401B1E4A3A7EBC6161449F73374C8B0140369343D9295FDF511845C4A46EBAAB6CA5492F6800B98C0CC803653A4B1D6E6AAED1932BACC5FEFAA818BA502859BA5494C5F5402C8536A9C4C1888150617F80098F6B2A99C39BC5DC7CF3B5900A21329AB59053ABAA64ED163E859A8B3B3CA3359B750CCC3E710C7AC43C8191CB5D68870C06391C0CB8AEC72B897AC6BE7FBAACC676ED66314C83630E89448C88A1DF04ACEB23ABF2E409EF333C622289C18A2134E650C45257E47475FA33AA537A5A8F7680214716C50D470E3284963CA64F54677AEC54B5272162BF52BC8142E1D4183FC017454A6B5A496831759064024745978CBD51A6CEDC8955DE4CC6D363670A47466E82BE5C23603A17BF22ACDB7CC984AF08C87E14E27753CF587A8EC3447E62C649E887A67C36C9CE98721B697213275646B194F36758673A8ED11284455AFC7A8529F69C97A3C2D7B8C636C0BA55614B768E624E712930F776169B01715725351BC74B47395ED52B25A1313C95164814C34C979CBDFAB85954662CAB485E75087A98CC74BB82CA2D1B5BF2803238480638C40E90B43C7460E7AA917F010151FAB1169987B372ABB59271F7006C24E60236B84B9DDD600623704254617FB498D89E58B0368BCB2103E79353EB587860C1422E476162E425BC2381DB82C6592737E1DD602864B0167A71EC1F223305C02FE25052AF2B3B5A55A0D7A2022D9A798DC0C5874A98702AAF4054C5D80338A5248B5B7BD09C53B5E2A084B047D277A861B1A73BB51488DE04EF573C85230A0470B73175C9FA50594F66A5F50B4150054C93B68186F8B5CBC49316C8548A642B2B36A1D454C7489AC33B2D2CE6668096782A2C1E0866D21A65E16B585E7AF8618BDF3184C1986878508917277B93E10706B1614972B2A94C7310FE9C708C231A1A8AC8D9314A529A97F469BF64962D820648443099A076D55D4CEA824A58304844F99497C10A25148618A315D72CA857D1B04D575B94F85C01D19BEF211BF0AA3362E7041FD16596D808E867B44C4C00D1CDA3418967717F147D0EB21B42AAEE74AC35D0B92414B958531AADF463EC6305AE5ECAF79174002F26DDECC813BF32672E8529D95A4E730A7AB4A3E8F8A8AF979A665EAFD465FC64A0C5F8F3F9003489415899D59A543D8208C54A3166529B53922 +sk = 07638FB69868F3D320E5862BD96933FEB311B362093C9B5D50170BCED43F1B536D9A204BB1F22695950BA1F2A9E8EB828B284488760B3FC84FABA04275D5628E39C5B2471374283C503299C0AB49B66B8BBB56A4186624F919A2BA59BB08D8551880C2BEFC4F87F25F59AB587A79C327D792D54C974A69262FF8A78938289E9A87B688B083E0595FE218B6BB1505941CE2E81A5A64C5AAC60417256985349EE47A52420A5F97477B7236AC76BC70E8288729287EE3E34A3DBC3683C0B7B10029FC203418537E7466BA6385A8FF301EE12708F82AAA1E380FC7A88F8F205AB7E88D7E95952A55BA20D09B79A47141D62BF6EB7DD307B08ECA13A5BC5F6B68581C6865B27BBCDDAB142F4B2CBFF488C8A22705FAA98A2B9EEA3530C76662335CC7EA3A00777725EBCCCD2A4636B2D9122FF3AB77123CE0883C1911115E50C9E8A94194E48DD0D09CFFB3ADCD2C1E92430903D07ADBF00532031575AA7F9E7B5A1F3362DEC936D4043C05F2476C07578BC9CBAF2AB4E382727AD41686A96B2548820BB03B32F11B2811AD62F489E951632ABA0D1DF89680CC8A8B53B481D92A68D70B4EA1C3A6A561C0692882B5CA8CC942A8D495AFCB06DE89498FB935B775908FE7A03E324D54CC19D4E1AABD3593B38B19EE1388FE492B43127E5A504253786A0D69AD32601C28E2C88504A5BA599706023A61363E17C6B9BB59BDC697452CD059451983D738CA3FD034E3F5988854CA05031DB09611498988197C6B30D258DFE26265541C89A4B31D6864E9389B03CB74F7EC4323FB9421A4B9790A26D17B0398A26767350909F84D57B6694DF830664CA8B3C3C03ED2AE67B89006868A68527CCD666459AB7F056671000C6164D3A7F266A14D97CBD7004D6C92CACA770B844A4FA9B182E7B18CA885082AC5646FCB4A14E1685FEB0C9CE3372AB95365C04FD83084F80A23FF10A05BF15F7FA5ACC6C0CB462C33CA524FA6B8BB359043BA68609EAA2536E81D08463B19653B5435BA946C9ADDEB202B04B031CC960DCC12E4518D428B32B257A4FC7313D3A7980D80082E934F9D95C32B0A0191A23604384DD9E079BBBAA266D14C3F756B9F2133107433A4E83FA7187282A809203A4FAF841851833D121AC383843A5E55BC2381425E16C7DB4CC9AB5C1B0D91A47E2B8DE0E582C86B6B0D907BB360B97F40AB5D038F6B75C814B27D9B968D419832BC8C2BEE605EF6E5059D33100D90485D378450014221736C07407CAC260408AA64926619788B8601C2A752D1A6CBF820D7C7A04716203225B3895B9342D147A8185CFC1BB65BA06B4142339903C0AC4651385B45D98A8B19D28CD6BAB088787F7EE1B12461766B43CBCCB96434427D93C065550688F6948ED1B5475A425F1B85209D061C08B56C1CC069F6C0A7C6F29358CAB911087732A649D27C9B98F9A48879387D9B00C25959A71654D6F6A946164513E47A75D005986C2363C09F6B537ECA78B9303A5FA457608A586A653A347DB04DFCC19175B3A301172536062A658A95277570C8852CA8973F4AE123A334047DD711C8927A634A03388A527B034BF7A8170FA702C1F7C23EC32D18A2374890BE9C787A9409C82D192C4BB705A2F996CE405DA72C2D9C843EE9F8313ECC7F86D6294D59159D9A879A542E260922ADF999051CC45200C9FFDB60449C49465979272367C083A7D6267A3ED7A7FD47957C219327F7CA73A4007E1627F00B11CC80573C15AEE6640FB8562DFA6B240CA0AD351AC4AC155B96C14C8AB13DD262CDFD51C4BB5572FD616553D17BDD430ACBEA3E95F0B698D66990AB51E5D03783A8B3D278A5720454CF9695CFDCA08485BA099C51CD92A7EA7587C1D15C28E609A81852601B0604010679AA482D51261EC36E36B8719676217FD74C54786488F4B4969C05A8BA27CA3A77CCE73B965923CA554E422B9B61F4754641608AC16C9B8587A32C1C5DD788F88B36B717A46965635DEB67F45B129B99070909C93EB80B42C2B3F3F70343A7CF37E8520E7BCFC416ACA4F18C7981262BA2BFC756AE03278F0EC66DC2057696824BA6769865A601D7148EF6F54E5AF5686AA2906F994CE38A5E0B938F239007003022C03392DF3401B1E4A3A7EBC6161449F73374C8B0140369343D9295FDF511845C4A46EBAAB6CA5492F6800B98C0CC803653A4B1D6E6AAED1932BACC5FEFAA818BA502859BA5494C5F5402C8536A9C4C1888150617F80098F6B2A99C39BC5DC7CF3B5900A21329AB59053ABAA64ED163E859A8B3B3CA3359B750CCC3E710C7AC43C8191CB5D68870C06391C0CB8AEC72B897AC6BE7FBAACC676ED66314C83630E89448C88A1DF04ACEB23ABF2E409EF333C622289C18A2134E650C45257E47475FA33AA537A5A8F7680214716C50D470E3284963CA64F54677AEC54B5272162BF52BC8142E1D4183FC017454A6B5A496831759064024745978CBD51A6CEDC8955DE4CC6D363670A47466E82BE5C23603A17BF22ACDB7CC984AF08C87E14E27753CF587A8EC3447E62C649E887A67C36C9CE98721B697213275646B194F36758673A8ED11284455AFC7A8529F69C97A3C2D7B8C636C0BA55614B768E624E712930F776169B01715725351BC74B47395ED52B25A1313C95164814C34C979CBDFAB85954662CAB485E75087A98CC74BB82CA2D1B5BF2803238480638C40E90B43C7460E7AA917F010151FAB1169987B372ABB59271F7006C24E60236B84B9DDD600623704254617FB498D89E58B0368BCB2103E79353EB587860C1422E476162E425BC2381DB82C6592737E1DD602864B0167A71EC1F223305C02FE25052AF2B3B5A55A0D7A2022D9A798DC0C5874A98702AAF4054C5D80338A5248B5B7BD09C53B5E2A084B047D277A861B1A73BB51488DE04EF573C85230A0470B73175C9FA50594F66A5F50B4150054C93B68186F8B5CBC49316C8548A642B2B36A1D454C7489AC33B2D2CE6668096782A2C1E0866D21A65E16B585E7AF8618BDF3184C1986878508917277B93E10706B1614972B2A94C7310FE9C708C231A1A8AC8D9314A529A97F469BF64962D820648443099A076D55D4CEA824A58304844F99497C10A25148618A315D72CA857D1B04D575B94F85C01D19BEF211BF0AA3362E7041FD16596D808E867B44C4C00D1CDA3418967717F147D0EB21B42AAEE74AC35D0B92414B958531AADF463EC6305AE5ECAF79174002F26DDECC813BF32672E8529D95A4E730A7AB4A3E8F8A8AF979A665EAFD465FC64A0C5F8F3F9003489415899D59A543D8208C54A3166529B53922D4EC143B50F01423B177895EDEE22BB739F647ECF85F50BC25EF7B5A725DEE868626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8F +ct = B52C56B92A4B7CE9E4CB7C5B1B163167A8A1675B2FDEF84A5B67CA15DB694C9F11BD027C30AE22EC921A1D911599AF0585E48D20DA70DF9F39E32EF95D4C8F44BFEFDAA5DA64F1054631D04D6D3CFD0A540DD7BA3886E4B5F13E878788604C95C096EAB3919F427521419A946C26CC041475D7124CDC01D0373E5B09C7A70603CFDB4FB3405023F2264DC3F983C4FC02A2D1B268F2208A1F6E2A6209BFF12F6F465F0B069C3A7F84F606D8A94064003D6EC114C8E808D3053884C1D5A142FBF20112EB360FDA3F0F28B172AE50F5E7D83801FB3F0064B687187074BD7FE30EDDAA334CF8FC04FA8CED899CEADE4B4F28B68372BAF98FF482A415B731155B75CEB976BE0EA0285BA01A27F1857A8FB377A3AE0C23B2AA9A079BFABFF0D5B2F1CD9B718BEA03C42F343A39B4F142D01AD8ACBB50E38853CF9A50C8B44C3CF671A4A9043B26DDBB24959AD6715C08521855C79A23B9C3D6471749C40725BDD5C2776D43AED20204BAA141EFB3304917474B7F9F7A4B08B1A93DAED98C67495359D37D67F7438BEE5E43585634B26C6B3810D7CDCBC0F6EB877A6087E68ACB8480D3A8CF6900447E49B417F15A53B607A0E216B855970D37406870B4568722DA77A4084703816784E2F16BED18996532C5D8B7F5D214464E5F3F6E905867B0CE119E252A66713253544685D208E1723908A0CE97834652E08AE7BDC881A131B73C71E84D20D68FDEFF4F5D70CD1AF57B78E3491A9865942321800A203C05ED1FEEB5A28E584E19F6535E7F84E4A24F84A72DCAF5648B4A4235DD664464482F03176E888C28BFC6C1CB238CFFA35A321E71791D9EA8ED0878C61121BF8D2A4AB2C1A5E120BC40ABB1892D1715090A0EE48252CA297A99AA0E510CF26B1ADD06CA543E1C5D6BDCD3B9C585C8538045DB5C252EC3C8C3C954D9BE5907094A894E60EAB43538CFEE82E8FFC0791B0D0F43AC1627830A61D56DAD96C62958B0DE780B78BD47A604550DAB83FFF227C324049471F35248CFB849B25724FF704D5277AA352D550958BE3B237DFF473EC2ADBAEA48CA2658AEFCC77BBD4264AB374D70EAE5B964416CE8226A7E3255A0F8D7E2ADCA062BCD6D78D60D1B32E11405BE54B66EF0FDDD567702A3BCCFEDE3C584701269ED14809F06F8968356BB9267FE86E514252E88BB5C30A7ECB3D0E621021EE0FBF7871B09342BF84F55C97EAF86C48189C7FF4DF389F077E2806E5FA73B3E9458A16C7E275F4F602275580EB7B7135FB537FA0CD95D6EA58C108CD8943D70C1643111F4F01CA8A8276A902666ED81B78D168B006F16AAA3D8E4CE4F4D0FB0997E41AEFFB5B3DAA838732F357349447F387776C793C0479DE9E99498CC356FDB0075A703F23C55D47B550EC89B02ADE89329086A50843456FEDC3788AC8D97233C54560467EE1D0F024B18428F0D73B30E19F5C63B9ABF11415BEA4D0170130BAABD33C05E6524E5FB5581B22B0433342248266D0F1053B245CC2462DC44D34965102482A8ED9E4E964D5683E5D45D0C8269 +ss = 914CB67FE5C38E73BF74181C0AC50428DEDF7750A98058F7D536708774535B29 + +count = 1 +seed = D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC81ADDE6AEEB4A5A875C3BFCADFA958F +pk = 6DD406B49B9CA035467FD26C6C0B824BEA310F435FBE8BBBD3430B5C39889E6B117E994E2F08823A33789FF858B72715323C6204A241D9835EC0DA85C5884A8A96210219099C8C383C182632280356C1B4F298405258A170E81624E861FC1082D31867A9037E3B90B0AEEAA064D27020DA7BA79398FA92A963A8A294E7720BD4CD9EA213F08063079C4D55B094BEBC4E979444F462B967972E61206FCC80337911B02C7396BC64405FFC0B77CCCD2EBC121A734037CB90B77846B2359C30A451BEB20A6D72C238284E5DF2AD1CC1A33FD5A104965C86251A596360D541240A4828231A827A0168B6D8AC7E27328173886453A9C91498765C2BD9EA9F666BB4A1D60F992538A1A746DF845574F99ADAD23B9744AFA81C7FB79A32B175706454438F46B8985132B8E1CCA10C2B0FA011EAB2428B88CFEF9378A5228E55D7463DFA5022C998ABD6354118B5116B3BC1004F0008134B85A1CF2A9F409A10E14B6D06C26D8E355864C35BC71B60D5CAC33A513EFDF6B9BB83BC880983682C8FB8A81B6927CA52E93835956795488181A8CD82B1A50DD18A25F35E2643CDD76C282E7018BB99624F031418FBC8052C4179B43A5998BE9A20CD2D8A883B313EC282598202ADD6471971C88CD9607D3A8052519930BC5BC71CA4652352B4D02620B8D983B9849CE8B8935F1A4DECC3250DE7B0CFCB49EB7B74E0B5792AE97633B092081C3C6BF58F1B242CA07610C3387098AC3F0F9043901C614590C4EBBC64CE1971E824694A999CBCC430AE923A1432B6A4911162213C429481394A27006B9D48C0AB5801823D756BFD8C6919502D613594AEC81F5669BD4E8495292606959292467CCAC7F688333B3F48A39FCE5C42C9C2653886A5ADF4747CC943B2416348F46DF5B58E4916BA64E9664A4BAAA3E0A9652408C8E5076C226C3A7932C42A846949A2A26B4E2C452F86CACFE5C201AE1321AB5C2CABDA557648A849241F077A799EDBA3582202CB27763047219F5546CF18819322B9C63974B322B949BAA491D97C70F20545886C87086721D3CA2AEAB441264B516975ED0C6044A425853528424532E4D721E85CB0BF65C26082C790765B062916FAC4A0DCECBC2E900C6F600270838E2DF20EE0A907E3613DCEE049C445640362C980A292F123C6C9B5918F21443C996016C44D2A124C5925A8E0C48E89BB167A129FCBF67ADB89903E1249F6028BC176BACC722366139858E583EB582ADA714E79B5AD1BC1A6F18754E100624620968D0702E080BEFEC425BC16B650A307802004C57590897C87E65347F32C324569051D798BEBDB421EB28B2D1A0C662444C7DB32BF97845D7225C7539F457894EB87606FA85B5E804053FB6ECDEA773566C006E540EE65101D99BF314181D666680985C78B103DD00A040DC69CFF389FEA7C18E48A363B943FF042B476DC86BE953A5925076CF749A62A77A9406165D31DACDC3A677B9114D8BF84B43F59F647FA4023535140FDE04285921184809C5F193A7DF45F62187854061A4D6754DA528F3B71A134AA487D9B5F7CFC6838108B8B95B51F5540C9EA5F29990F7BE07EFD502461033F103723093A16DD96C098977F81330249183CF35A636841BD1A9B9796F13F56BE785D942D7EAB011805CF3504FCE325B6A5EF1AAADBBB11C662B9D2 +sk = 94B49EA42526935245C45A7D580B6AEFF8BBE0F5342BB8BD2550212AD5935F45CBA7CAA6DF914007FBA79E9946C9433A86A2C4202BBDCEA008AF78975E6619D3582787530DBB7318A530B7B5A27D24258C7CCAAAF505CA92CB853A5818D4269BE812BECF169A05E71EB957557787C2F3B72315281DBA87476B157A06095A30D52B388AC22840755B43440A931DF8A709DC435B415A7BABBB04CCD93CDA00CA1FB090646B1D6514813368A794D38C907163B5917496B018C519B160C5144D6424495626E3A5AB9FFB8D8D3168D77599A88A1D12C07D86498D88DC1AF7FA7DE15073FD4B62801C1A902B215E7CC3EAC350BB63ADEAF9C7594844795A9A6274AA3ECA0CD10891F05795A77B30ADD76B6B1A35338B8156690CA2EA1C9C3B602B23324925314F726535B36DFB355225D37E7C85BE15A5976A8A6AD4E2C35D4C45ACC954368BA6DF88A47DBB8C782336F7EA507A6C2D26D952DC03B4BFB89872644084783AB493CD72D3BEFC2C803B692729638AF69B03E6DB9B82E678A42969FBE770FEF65723F77DA6437C20B203601C884A9B9E08C0B1DDBBC1A66517DCFC76B3F125F7795E5DDABEF0CB00119778575513E05AC38A7901A0E8C8794685C0F274050097BC50168818A74ABA5D71980F5C76279EC0214CD51EFA8A21391567FA052E6DC0CF9BF216CFF9287C80693645A53D71B3D7509F6A432D51B2B0AAD129B594278DA74FFACBB713357D735A744B7C65E482B7E172C67A5B4EDABAAE11222B8BB6B4564AB4FB20C28B4981614B69BB188DB6056607E089F64803D89210C7E604266B00548A2AE27996196A6D6F762C27B22731F7942543CCEF3856EDF9AD1B1B1652A33C3E038DD9B2CD9A4612CE174315E67B26DAC767E50E68508D104BBAE1A2B89B78266D27B109F90BCE1581A8B8888C90C1C4EA5FC1F009D5073780CB4545087C88026B9B9ABDDAB923DB52620713C8B5AC3301E8715AC39D13084926E841FAE41A7BBB7912E10680A78C0C363A251720B2D69467B6CAC5D894F862595072A7C9B14BFEFAA2FDCC75CC42892CEC6184B52962B9B73D663B7D76C1EA499D538BB45A4CAECEE0C8EB93BBA5EC1A8C936156382B10102E3211B2DC15663412805F60590EC33DBAB80D2A3BC05FA8AF5145644F712E004C20F799650159C40DC952C9A54C27E816C3A6A95EFBAB24A31F6C402300F9BAF88A46644B4DF8A24979E80DC30425B9E75A753A36510B87C5FA95CBF36E19A12245876003B54D4E008EF7AB9D83C5A2406014B5CC33B6167F4C452AF45084B7412EC19556D82B0A6A90C1AEA60A72312D8A7A8E5060189717094FF950AF2B503988964F0AA227C523487471D3BC905B6672BE20BC714729B7A71478B07A19F777DEC546C624723AF7B5F6C142274AC5652A7C2D7ABBF1171F2BDB12F1ECC876681A600806D6FC229E6A8F6424419187BD22E49B8F27486DB25371C169B3F61E81131B57659B1030A959790BA5D6424580B1F588326DB9CD01A260B21B8C42062B883854FB173EA7613764D41DD6B89468C7BA6C4236D1A0436B945B8B340983023139293FC48C07659B955453BBA07B0EB4E2A91F594232A47C65C66E1C5C8279F179925C55EE3A0B6DD406B49B9CA035467FD26C6C0B824BEA310F435FBE8BBBD3430B5C39889E6B117E994E2F08823A33789FF858B72715323C6204A241D9835EC0DA85C5884A8A96210219099C8C383C182632280356C1B4F298405258A170E81624E861FC1082D31867A9037E3B90B0AEEAA064D27020DA7BA79398FA92A963A8A294E7720BD4CD9EA213F08063079C4D55B094BEBC4E979444F462B967972E61206FCC80337911B02C7396BC64405FFC0B77CCCD2EBC121A734037CB90B77846B2359C30A451BEB20A6D72C238284E5DF2AD1CC1A33FD5A104965C86251A596360D541240A4828231A827A0168B6D8AC7E27328173886453A9C91498765C2BD9EA9F666BB4A1D60F992538A1A746DF845574F99ADAD23B9744AFA81C7FB79A32B175706454438F46B8985132B8E1CCA10C2B0FA011EAB2428B88CFEF9378A5228E55D7463DFA5022C998ABD6354118B5116B3BC1004F0008134B85A1CF2A9F409A10E14B6D06C26D8E355864C35BC71B60D5CAC33A513EFDF6B9BB83BC880983682C8FB8A81B6927CA52E93835956795488181A8CD82B1A50DD18A25F35E2643CDD76C282E7018BB99624F031418FBC8052C4179B43A5998BE9A20CD2D8A883B313EC282598202ADD6471971C88CD9607D3A8052519930BC5BC71CA4652352B4D02620B8D983B9849CE8B8935F1A4DECC3250DE7B0CFCB49EB7B74E0B5792AE97633B092081C3C6BF58F1B242CA07610C3387098AC3F0F9043901C614590C4EBBC64CE1971E824694A999CBCC430AE923A1432B6A4911162213C429481394A27006B9D48C0AB5801823D756BFD8C6919502D613594AEC81F5669BD4E8495292606959292467CCAC7F688333B3F48A39FCE5C42C9C2653886A5ADF4747CC943B2416348F46DF5B58E4916BA64E9664A4BAAA3E0A9652408C8E5076C226C3A7932C42A846949A2A26B4E2C452F86CACFE5C201AE1321AB5C2CABDA557648A849241F077A799EDBA3582202CB27763047219F5546CF18819322B9C63974B322B949BAA491D97C70F20545886C87086721D3CA2AEAB441264B516975ED0C6044A425853528424532E4D721E85CB0BF65C26082C790765B062916FAC4A0DCECBC2E900C6F600270838E2DF20EE0A907E3613DCEE049C445640362C980A292F123C6C9B5918F21443C996016C44D2A124C5925A8E0C48E89BB167A129FCBF67ADB89903E1249F6028BC176BACC722366139858E583EB582ADA714E79B5AD1BC1A6F18754E100624620968D0702E080BEFEC425BC16B650A307802004C57590897C87E65347F32C324569051D798BEBDB421EB28B2D1A0C662444C7DB32BF97845D7225C7539F457894EB87606FA85B5E804053FB6ECDEA773566C006E540EE65101D99BF314181D666680985C78B103DD00A040DC69CFF389FEA7C18E48A363B943FF042B476DC86BE953A5925076CF749A62A77A9406165D31DACDC3A677B9114D8BF84B43F59F647FA4023535140FDE04285921184809C5F193A7DF45F62187854061A4D6754DA528F3B71A134AA487D9B5F7CFC6838108B8B95B51F5540C9EA5F29990F7BE07EFD502461033F103723093A16DD96C098977F81330249183CF35A636841BD1A9B9796F13F56BE785D942D7EAB011805CF3504FCE325B6A5EF1AAADBBB11C662B9D22CEDAD700B675E98641BEA57B936BD8BEFCE2D5161E0EF4EF8406E70F1E2C27C003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF672 +ct = 68F11F4A8D07DBA08EAD094A93BF00141CED64E2CB3E68A59987CA3298E259ACEBB820650F861C6AF5FA565920825AE4A61A5395CEA7DDC6806E7D15D42635C8177E17A9B7110118C3FBCED5B2A73EA79B86D5B41D92C14C0302B6B1B9DB25CC2F923B32CCAA054C7B07E58EA2ECFE4F0B17C97E4E5571E04ABF67468B6DF3B64AA545B7E348E45DFB18BD186C7A17C7A3EC326E65BF7BB025D7D23B14F733698FDB79CA9CFDB85AD40F35170D98289DA8190F50A25FAC16043377736664411767C28978664444A2DA6F630D0FA54230F0DA6CCD158C5986921A356A3BF528C996A767A44FF765967A06773C4F392CE9209CBA2CE05DC63A43D1AE40C2E86DAA0F56237962B058E0D40DCE5EFF7AA165B6A9D1DFAC0D19BBC0A94466EC53DD1E28A8B01722E28C761E8AC0B97ADE7CAA0447465C40A54BA799F8A011EC1BB0E7DA7D4362215F5FAB54373791102FBCB77480A805008A5E89E6A74B15257B38BFD906841A841A475F47720AD19F34409ED6BD37C2BCD7DE06E4E04181116D0BB2050F9C60F635FEE337DCCAAEB870BA7494CB2CA590570720DE061BDD6B522EB09313EBB927BFFC920E649D98E5A4A86C2C5E3815E777F302802D98B6C616E6FCB784A16D6BF8C8AAE9BA44EC43DE816084C4C3BB1B02A603680A64FF1AB5CD8AF48774C5B5057D6682CFF3E265A63E551A20633DBF5BFEDAE646CCB99E872274C71BD61E1A518E8A2657B1FFB37701BA26B1AA36B109D75E399AF0F07D321A8E839812E6CF8EA29E95CBA3E6737F6F2113D8990ED939F86082CF5A3877144A8EF89FB5C0FD726A88DA00E986782C53D313212A9A2D20D012794E9A89866367C10EDE99EB8B03F30C376B50E7009A51F2F44082DBB62C4AC91F53399838BFBFF7ABB851C969E9003AF3FEFD138D7C5C4862F524FD97F95F9E6B5CF8CE949F748239F6DFF3535D24BB704EDF896AA06515DCA4FE776B987FE7C742CBB2DE50CDA6A2BC99455CF741F58B094BB832F2B645112F11050E1A8CB2F770709ED3D58A284012C9084CE6DE8372246CF4B4861D2E43516483E7B66F6EAB1A6AC61EA0B85F7103D9FDDA34AF13C5674ADB690EECE71CB7EDE7B02CEFDC8B052F2C8905D60D57B58576C8E9CEE41D00B7C51F8A97237716617CFC3D554D56EB2AAEB13E018C334B6D0D7A68B3294D475B910E860F17E9BAAAF7FC85FFACB18BCCA3230507AFB91620061F2FF221EA8614BFE77E64838411D7988745BF103D37F93D3E48C9B93577F1B709D58F386D110979B954B41095D58CC25E8343B1CC03C5A103B39433C844154CA9D0EF7D5E8004A44F4500BD06481DC6B8073085657AE915A3322E6CD27016B1091BA8D78EFBC32C70CCBFB8E63827D5D875302006A4554F6655D9C2104189733BF3FC5388B978304A23248D24FBCEE7BBCC9501479AA0BC19DD5C4FA6580993F4EDF4438CC7EECCD8622231C4925BE40E9FF57DAE6617BDCA8E964AAD894267DE70B45C414280F643F6F23ACC9D142CDDE71F624D69238D45B5FE54 +ss = FE8AAA6558FD8087DD7CAB54B4BCE50FC625A369ECACE58B2EC36F3BC5BB4F5A + +count = 2 +seed = 64335BF29E5DE62842C941766BA129B0643B5E7121CA26CFC190EC7DC3543830557FDD5C03CF123A456D48EFEA43C868 +pk = F5A35B4EC7538B62289DD1204DB91AC492B610538C93EB5F2637AD97DC88F0035FF3CB735CEBAC9BE7CA78A4149CF10B6D93283050167E737596B711A9F32A0F6909975055CE6632F4B42CF9A2361CF69047B5BDE1868DD745A82CF473EBB30D86A71793364F70B1255B1C2003F166683C936A7977DF156A84051E69B95E02616DD3090DD38086EF3BC12353BAD25377618965C2810FCA929DFBF46F20360FC847818CF90DBC044EED16B3B9052C5C70A5A430441E53A5527A689F49B35CE82B84D6057C5269FB60C710C5731F431A970B86431125910277FA7C310A2285117B47B95054E4174A1EB11DA3E3C26AC25619D36712B11B2EF7405BCB943DBA10D50C0436B50DE5B04D96488A38F53DF37895AC20C10D959D81A29FE1F319FF871831D93C54654172A02E65599F9D820AB037438E62714BE6C7D868B66AC03C31C8753A062318CA36B6E59D340B9696D47C38F115104765865353A05C8FBC4B0A62A96577E94C17094DE259006F169E75B8919BB4C37DF6787B59BEC8FAC999A90B73123A5CC8772AD67585C879EBE05B5C06AFDB440ADFBC4AD400D0E634822A843E9B165F2F0BB748E231C0E0CEECA8806046B5DEA7CAC614A5E2CCA3767556448785DBC739CAA9C58FAC291A0BBE96E9AD36A4A1D9C96939603BCD76A81C040FBA27A5A39A1C387CAC9D1B086E512468D378E96039AAE2622FE5483673850D411AB64B892F2C29853822EAE76FEAF5716A660B55C2020DD3323A150CEEF9AB79925D2BC09CC6FAA31727A5912A7F5E9051F8B94D8866C4DA173D3F2A388E6C44218338CB85702CBA2F602C24E1788158B0129E7C15DCF2CC6ED55C54B456CACC07D179B432A5AA63E8AC59F0B6979A833D99C13AA0C56CB65928032E2F30583FA6C038748CEB77A91C631DD09B575F13126F1447CAB00BC9C85FC7601DA44AC5FEA5ADCBB599A409BB1A67B24EF438D750BF87A8814DF22449C9256DA1286DC623E81546C283B80CC88C48F003678AB35380A6DA551AC7041CD5112D59D15A80032C28B61A1BB3B8A7267ADF4662B5963468B3BC5918418F980CD7DB3946C5A67F864DC1F3ADEA12142FB71FDA590E070007662B5C3B8B31AF169A092A2E466AA01AE879641BC4D1D62523CCAA3ED436CC089B2621456114215D1A9EEFD1016DC81D5320956FD942BDDA40F3A033E5170CA6A2C57CE17EAFC97AA0959CF37B92E789636F159FAA827DDB895553540D52A61EDC1B3DCEB22A7231C48037CC78594718902333D0BC4FE6B29352991E2BA5D31217457007057B9D3C07C39B7C7EEECC222D4415D6D9272EC50B81520BC607592947C86D2612E434C22513235536CD08F10022B97675B89F1DE58130EB6797380F6B68773DFBBA0664BB7CAAC84F7B06711587C6ECAA383505F62751C8346BDD502A58E9326E4A0D2D29226F794AD0064B2CF0A56E6A67C18B331F5537D2FC6C3AEB52A5C3313118CB7D159B8372158C1A7BFDCB65D426458EDBCF8797383E272D3B18BEE68C4D74E25751AB1CE4567D66B714CD62A8E9B886BAA812A9F50739E30F296791414727D55003BCB52AB6BB74CAB215B348AD06F974192CBD61576BAFFC815999AB8556583024CDBD1C4398F4A4AC60E8CB68627382A145F91BE9D78FD51BA5E3FCBC3155B62BC07751DD +sk = 72408D44C2BE6E83C803DA2846D852DEC1848EE41504B5C91F774F6E512B51F71DD1520203C486F63240BAB4C1DBB212299753B8627F9BF2117CD6A83BE4075A385782AB804A420972EB25BC553EB981AAE7D7A715111338529F6116C10B10BBC20B31C3161D4BC1A5F050220B5584ABD6A546AB51A9A10120ECC131220502697E9D61BDBAD346FC43824135692204B49B5B377B870B7B28C86946077A215ACAA11ABD851ECA479988BC69CCC9975EB42A33523C525434BC594217912123957DCDC18E410A6D6A811BED8A0B4135B56F4562F343AAEC34396BB0556D7962679A76934B016B4B4BACC14650C55C3AEC9BC2E85B548B5D3EB891B6596F0C44009BD0982D98BF81AC77C8DA98264A719CD8568E48279DF9C8E9552B94AA773B43A70742C75F041915752551347F00447D72D934BEC553BF1014F4276015E0B4DB77CDF8C546AF05861804A5B7D92838744511AC6C8BE55E883ACB7775B98C4B4C9C8789AEE317F8F02B4127A6AE879D02C13772A003928041C53351D8D70CE59B14CAB5CA31D717F69129C8FABE46582CA5298ED156209C25BC57870EEA34255CE1B4C426211F957D74876DEC169C4C516C8716B3DDEC6C3E610C31F0C52E13650F0B1C70124DEE27111A76ABEF82C8FD3172D554121E6A87E9D3B58E11379CB812B7F4B95D46104934CE75C715771204D7C46AA9439836453BDA709CEF3BC1C9341994F25C48B5C80FCC8A67E316C431BD302B20904456B3283E9BA1BDDE494CE9F8A3F0B432DCA69D0BA9C43C703E1616272CD6B904D5B6279C55A539B7E46A601B28493E38A2CD9BA66D997C8C5C3B7631822C529FA48835F8A08F322615E96B9087C71C9F262B68851F00486489D25C92221C2759C89440CE733614B8C7A06F26B374CB4F8A6A7D67DA521EBA7232C0A4C066886B8450755896CFF77A369BC8FD4B3B5B0731452A908ACC68366B8EDBA66D09F212C9330C83990AB2DB7095D708B6C3589BF929FEA31534646537D2AB023887FC286F00F46F8A360476998E4FE7315F03C234929247BBA2A05297A5E01AA9CC6158458E2302513274A2E3359D66126F5FD44D348BA2B634642EA26C6CB616F64A2D2C819ABAA48BC565CA0AB67E6CFAB1129A0144C10A003B44BD3879B4E62E0AD3A58BD86A7030BE34309F3309642B017B0AA03FFAB4012B36ADC49A95DDBA67CD81306EF6BB20B546BCC55EAC2B815FB38BAE991D6AE7AA87D42ECBC740CC816A3EF42E9D204CA0177CDB30CDCB870386C320FF51B137578B029125BA518A5B887D7B9050DFF113468608F6335EA81A59B87CB753724ED0E159FA4709AC018A31194247A6A9C65443A35AC36E11BFA6A8559CF20E50116EE5FB3780FA03DCAA77846B18C04894E50486ACFC3B8FEABB8CF860D79C2734A700AB731739244580653699B51B7FC440B8CB1D6BB1360291BDA5B11AEDA3C77A25B40F96763A372512561E0D52848FD6A3A8241DEA49C4C24692CB43AA22067072FAC2DFF7898F298CBAE17F9CA68A132321932295161A1F31C178932004D17854D7D9C69F6640EE216747102280191A5695433763B6CF3B86756AAE22A37F9F6920C361C2AC68A7E11C8F5505AF2100651595BFF5A35B4EC7538B62289DD1204DB91AC492B610538C93EB5F2637AD97DC88F0035FF3CB735CEBAC9BE7CA78A4149CF10B6D93283050167E737596B711A9F32A0F6909975055CE6632F4B42CF9A2361CF69047B5BDE1868DD745A82CF473EBB30D86A71793364F70B1255B1C2003F166683C936A7977DF156A84051E69B95E02616DD3090DD38086EF3BC12353BAD25377618965C2810FCA929DFBF46F20360FC847818CF90DBC044EED16B3B9052C5C70A5A430441E53A5527A689F49B35CE82B84D6057C5269FB60C710C5731F431A970B86431125910277FA7C310A2285117B47B95054E4174A1EB11DA3E3C26AC25619D36712B11B2EF7405BCB943DBA10D50C0436B50DE5B04D96488A38F53DF37895AC20C10D959D81A29FE1F319FF871831D93C54654172A02E65599F9D820AB037438E62714BE6C7D868B66AC03C31C8753A062318CA36B6E59D340B9696D47C38F115104765865353A05C8FBC4B0A62A96577E94C17094DE259006F169E75B8919BB4C37DF6787B59BEC8FAC999A90B73123A5CC8772AD67585C879EBE05B5C06AFDB440ADFBC4AD400D0E634822A843E9B165F2F0BB748E231C0E0CEECA8806046B5DEA7CAC614A5E2CCA3767556448785DBC739CAA9C58FAC291A0BBE96E9AD36A4A1D9C96939603BCD76A81C040FBA27A5A39A1C387CAC9D1B086E512468D378E96039AAE2622FE5483673850D411AB64B892F2C29853822EAE76FEAF5716A660B55C2020DD3323A150CEEF9AB79925D2BC09CC6FAA31727A5912A7F5E9051F8B94D8866C4DA173D3F2A388E6C44218338CB85702CBA2F602C24E1788158B0129E7C15DCF2CC6ED55C54B456CACC07D179B432A5AA63E8AC59F0B6979A833D99C13AA0C56CB65928032E2F30583FA6C038748CEB77A91C631DD09B575F13126F1447CAB00BC9C85FC7601DA44AC5FEA5ADCBB599A409BB1A67B24EF438D750BF87A8814DF22449C9256DA1286DC623E81546C283B80CC88C48F003678AB35380A6DA551AC7041CD5112D59D15A80032C28B61A1BB3B8A7267ADF4662B5963468B3BC5918418F980CD7DB3946C5A67F864DC1F3ADEA12142FB71FDA590E070007662B5C3B8B31AF169A092A2E466AA01AE879641BC4D1D62523CCAA3ED436CC089B2621456114215D1A9EEFD1016DC81D5320956FD942BDDA40F3A033E5170CA6A2C57CE17EAFC97AA0959CF37B92E789636F159FAA827DDB895553540D52A61EDC1B3DCEB22A7231C48037CC78594718902333D0BC4FE6B29352991E2BA5D31217457007057B9D3C07C39B7C7EEECC222D4415D6D9272EC50B81520BC607592947C86D2612E434C22513235536CD08F10022B97675B89F1DE58130EB6797380F6B68773DFBBA0664BB7CAAC84F7B06711587C6ECAA383505F62751C8346BDD502A58E9326E4A0D2D29226F794AD0064B2CF0A56E6A67C18B331F5537D2FC6C3AEB52A5C3313118CB7D159B8372158C1A7BFDCB65D426458EDBCF8797383E272D3B18BEE68C4D74E25751AB1CE4567D66B714CD62A8E9B886BAA812A9F50739E30F296791414727D55003BCB52AB6BB74CAB215B348AD06F974192CBD61576BAFFC815999AB8556583024CDBD1C4398F4A4AC60E8CB68627382A145F91BE9D78FD51BA5E3FCBC3155B62BC07751DD3DBC65B722A8982D058E27D409F04F744551ECDE9015B62607CF67BB8ECECBB8E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219ADE +ct = 972B0906D175A187EA54286F9929EAEBE5A4F147DDD71CEE94EDC0FE2672884EABE2E09DCF524EE839A08CE037E6DB27B0E232172C0B0B02784C57E13B52CF29C7F38D60CFCC0032A48C1198B02B8FBC01BEABB54378FACD94ABB9CB8BC488735CB826944AB2919CE853DA9B9B3CB99829611802EBABCC6CDBEFCD6EB5F65C9CF5871CA093214EAC807904DEB63B700CBE68D54B676B7FB489A04B050585591E4B2A921194DDE55684DDBB86AC1B52ED882DD0C93EE672C692FD94D8CFB0030201DF1D34E227A4EA150174E0FCB6A0FAFBDCA499306C752E8CE6521591F7CAC0BFE6BC77F8284BDFD36166F46526584B78FA94F645C805B7DCB561574237F2340836BFDBF367B2FFBCEDC2FBC6C974F157D99393AB842E1106F2ACBDD660EFD1082D016DA6C4D1260029DE92A37AC87E3A1CA207650644193335847BCF48A4074E6306F5FC2EA28E0379E844F6B5C00B9ED56E7E4EA35D7123254695A2670C5FC465AE5CA630BC1DBF187CFC3BF5F855ACF2855026A53790FC1EDA0195F6E32DEF74C34D0404FB51990B5AC709068BB55E1C4B3D30F8150263DBB9978C8B194A5DF5B8FBBDF4BD1E68A032ECD3F2ECD94EC3245AA702196E357BB30CED0EFC42B425E00D206817AD467EEDB156F23FA760C1B7A156E1A37A4AD95450A193DD1183BE571AAF14AE7529C534A7F6149BC8FE1567563D33CF153480A990C44383EC362276FEA37431AA3DA830EF0273591C526D9A0604E1672936E157E4E646DFDC5A13EF2AD14284BD8AC344565DAB3B45C9858EC2F3A8CCD445A4610D80C5263234D2E6F57DC7490D621566DDC0145488253E22DA3061E7645773BC2F95BBCCF7628822C3A861B8829F0F85AE2CEB1C4B4CE87A50365F9369BE6BFF74556644BC131B7A062B94D6AA662651625735689E70E19407E68F3AF50A4506A8FB345F84C81C0330516496E5940565D148975FF03FA4AEBA113080861FF63F9153200635362022418C9E28AECCED7021FB8E650D07A8639FBC0A84B5AD21914BC4C4475AD4C8F8A127C024DDDA9102FEA90187A6235E3B689A31403D0CDE12F6D7AAE4D1DFDA6CA09F9D78FE141DFF66C483C6028A22DBE6BCEFE54E07D9F58B4EED7515AE2E1032F6CC01E8C2AB9E417FFB3123ECA3EB0665935CEDA2426BCBD93F8386EB0B7457DDE5834483BE7BE3F25B133D76B2FA823BBD4A0356AE6AB87BDA1F807A00EBDDCFF68FED900A3145C3EB368EFE091BF271FC7488166F34EB62961FD9806AB91F15C726BF7B436B47047A5A6DFAD40451C59FBCFB45BDB2C25569A4C58AA277AD195F6A2A16DE0A11454BEDB867A93F53F8A0B8E395A37EABDF045B5665E7998D4477D4F611F3BCCB1F5C289EA5E1AFDA0DDFCF620B782FB019DC29BC376C2AAE914B721D5F6D6E32FFACBE67FFE15F2796FD95110EF9A46B358799B6E53869D6E326DF9AA607FDCB657F060B6ED8703E928F03BFE658A8105D7114D941A7CF108072E97CC1BE3345E43A541F7D5B7113804F5075B033475DB3AF0684 +ss = 86435AB2AFF9CEA1DC653CE819721A56933841F29330869B63E36604A6CEAFF2 + +count = 3 +seed = 225D5CE2CEAC61930A07503FB59F7C2F936A3E075481DA3CA299A80F8C5DF9223A073E7B90E02EBF98CA2227EBA38C1A +pk = 25949FAEA67E908040A25908A7E33199D586F22A3CF5A7AC49EA41BF83452528C7F12118E0685B09D30947AC76F4F72E89BBB7579BBA13D3CD4E262FCD385EECA8B780D7B6D3343CA7EC1958569C49808B97586C263903989928AB9B63EFAC00B27037637897556B8AAB33198C144D226AB9284541400138E03A31F10CBF1CC4BF633C3AD70C65218C1B18770C91D139971574DD90317A421B8BDC56C02C2564B2496793A27A12009ECCA141AA337E911F0B448D913394EC1ABBB46A568BA749F0FB0A2C4562637A220225A0AFAC0E9A53CA4F506391D7483932814DEA886C89879237A95C03684CC0C2D2701B40E5B3A340316159CBC56BAE84130F2FA830501257F8A8948F482AD194CCD4F6BA6C01BACC4C1B9C3188C3D002F8F18F62393B373396F6C510308B6754B8CA81F53D5A1512FFC3428A6C2A543A61FE1193A86B97B260339FB43A9F0375B1C2C62DDB4C1F6629DB701B2D2A50577CC7D5D55A30766400842938D83A6818A128310D16648614A6B6DF6B5D8D9A8D0EA4A127F4233B9A50BA539F5F01B62513A5C7BB8EAD8463C0A346252C94F753A34751B078A06DD785AC6532C2730CAEF7249515514F8E18713C2A72D8949DE781C698E708DEB35448CA1DF99B8E09AC4FAF694CA71B7BD41BB7024C0435424831424F680A77F13506A56C97B6966AFAC4B90FE60BF5E7507E6A7093C47B5F8CA47D86C767455D645C502D82CF5B1CCD8880758BEA855DC71B1C98494862030202C06B935125654EE498A7E7F37254084AA1795484FA77926C8B438592F4D7BAAB58978329CF12F461B1F93AACC7117980774E12355AF27E506A2AC63C4ABFE585B2123E2404B9EA9753FA101604663D07E153C07B743B23C56B86A91CA34111803A1F5865E47807C012A81885104495499884B495EA3F457A2AE1363221B2A94BE84E27CC9E8BCA44F8FBB92746821782B3B92B1BFE87127F34076BD4ACABF60E4F9B97A8F63008B584D0221AF927C67D616BB9933BE9486E38D7BEFDA11A27175F670600041A6DBF0C9A4364B3FFD28ECEEB0C8077C3ABA19C6123A20CA72C0776AA8E21A582168591C7C1EB146BA820C9EA1AA3374625C8744612BCAB37250FFB34A89D305C35169660DC9B09F7C960A4C4450B1A2E56088E8605FD75A35EB620C3C90B93FB001E03C006A15B67136EC1C354D405A61014821FA9590DD212CC6095DD011BD8801A10F08F15DA21C14CACFDE606CA02B7E2E1483E3514CC6BC88C2987587458D77851E476AEA14A94C176A4EAF865D58C033BA2280EC0521BC53DCC3772D48258593A5A1F9974228652B8CB4A08296EEAE869C733A316D926D400CBB09A2DAF532DA06522DA9694CEC2A29CD4C87F6A6C837C6EF6182A30548AFDB807BF447953A3827DB3122BCC7E33576A33A943492A61F3625DCF412793996C664A4664B3666C154F90B40C3EC514C4B1A2D265A23B897177342B76C69637D52E356620F468480472923313A658683566DC8F8FC1079F248F9D8AC67D4CA703339AE28A86EDB4BC21DB231DFA970249AEB1E2138BD4791352151520A73B0792A0E77D4967BC8B46740CF5599D4056F382C9006B79938825DFE2806CB6AFE7523D940792782D978970256C691434F939B02C14F42B1874087EA68917C2F3E31315E22581 +sk = 548A01803A231CA63843872ABF16B2C4B9AB7407A093B354F8882C6775BACF2931DE0A501C5A7EA7EA5C3BAA067290B9FCA059D69CC6DE9B772CC058470544B64B11ABB77F490746384B83283740F0702E17D046759B61E75030F187C2283045B22B4F9E222CA44980DCD0A42E5704504BB3E097CDF93A99F057AB21E3AC305666710C3B4C1B750AA3AC0F00A6F592770D8082F6157ADDB170A956456C7616C856657835970578B35FA87D8F79C2AE54AD36823C6A13A4207453FF324F17D13D43A400A2102B6F6224E6F2132BB14A32FA3F10A446D7944428B66E0E0A04B204C5993C03C294927C60540F836572793C8825376332B64D109BB7273147A878FF0B0BD2808B62104515D0824C90A4E249B4EC8C0F6B572BB621B7A74089DE4B49EAC5A3CFB61A5D6B420779A29E1C5AE98AB30E01A0B45538C9A14CE61C4DFFA27A4E462757A3BDF00C0206C5BF5233132C47B7111771DAAC633E22132AE82CBD616EC92B4E9D1C88E7285B84D9A12E14897A020C06832E9CAB42102AB999838A93A77141D12FF068AC13DC4C685328C7036CCFC2087BD92CA5A675CFE40AE4C32B28EB770DA04234A456EB889EF92A93A0D3ADA8061599D99CD8A96880A2B5E440766A9C81E7A24F14C295283C333A0576B49C569C99450F8714160C4CC49828090BC2CA390094E14BD6A3011A5C038F0927FB4BAD38440EA9F96FEE99141C564A91F9C86DC72498F89D05B047461699FBBA62EC28698E273E2B8436A6EB8C9C094D3404853A45137881C691352F6240ABD2298488299331CC03B1A3106F242D2871525587888E448D0F45A61480BD7E377DD5B63E143093FCC8BDAA563264BAA458649CE7FA5826E4B9B49159E7541D432143C5093A2A5BC5B835535FE7395EC556BD467A10975CE26304BB892D056A6EA4C5CE08D033E9334CF7F6750CB62209BA21F6B147AC875C3F1195D9D991E333C7C25465176B8A566A71451B8305F35D831A36C57C64B664C707F3BF08B54FF3847F1EF0AC4B32BA7D563AF40228B2957B8A95063A65BAFAF86609B4BFE1127C029C2EB224465E1C178C74CB5DB4C0C2AA46456761EC4A528AB2BB8F92C120A1B78A9517A29C8EE408AE7FAB4FDFB1941CBBAE4C3630F407A2C23C4D10A58A8E64546727153D61766D0242C5132236F637B7323905F4A7811C1B8019A808946C11A54F8CA6C16E06AD9A685EDB094616A80383A79E482C611760C249988547194266000722743346D13C80F72117C25CBB48490E05789C6A5E85ECBFBC73669F249C10A12ECA037DFD15994CBC450EB40868ABC2FEA05B5058429B6B04DCE2C4E2630A13DBA2BEC9BE9C30B9F90B45A97040A1F227200CCB4A4413C8B0C5B169830D451BC7993EB3D5B4D914A02C3183B7423D61101B0E3AC0A2A18673126F69511F27EC55E28B975E22A8CE800C37473CAC71788A42CD39C26C176C9C255C4355A62C0B84CDA33819A1AB6C07BBC4F2847AA23A600829CD516485DFF565DE9C392791B84BDB4580326F5128556D160100622AFFA2756E1CBD0A0A1F217A0C198A6DC043B1C50813BCFB3C2488A5C02C79393B65F39990B610274FA77B814BA93784562E0794C179549EA0927D9B4A25949FAEA67E908040A25908A7E33199D586F22A3CF5A7AC49EA41BF83452528C7F12118E0685B09D30947AC76F4F72E89BBB7579BBA13D3CD4E262FCD385EECA8B780D7B6D3343CA7EC1958569C49808B97586C263903989928AB9B63EFAC00B27037637897556B8AAB33198C144D226AB9284541400138E03A31F10CBF1CC4BF633C3AD70C65218C1B18770C91D139971574DD90317A421B8BDC56C02C2564B2496793A27A12009ECCA141AA337E911F0B448D913394EC1ABBB46A568BA749F0FB0A2C4562637A220225A0AFAC0E9A53CA4F506391D7483932814DEA886C89879237A95C03684CC0C2D2701B40E5B3A340316159CBC56BAE84130F2FA830501257F8A8948F482AD194CCD4F6BA6C01BACC4C1B9C3188C3D002F8F18F62393B373396F6C510308B6754B8CA81F53D5A1512FFC3428A6C2A543A61FE1193A86B97B260339FB43A9F0375B1C2C62DDB4C1F6629DB701B2D2A50577CC7D5D55A30766400842938D83A6818A128310D16648614A6B6DF6B5D8D9A8D0EA4A127F4233B9A50BA539F5F01B62513A5C7BB8EAD8463C0A346252C94F753A34751B078A06DD785AC6532C2730CAEF7249515514F8E18713C2A72D8949DE781C698E708DEB35448CA1DF99B8E09AC4FAF694CA71B7BD41BB7024C0435424831424F680A77F13506A56C97B6966AFAC4B90FE60BF5E7507E6A7093C47B5F8CA47D86C767455D645C502D82CF5B1CCD8880758BEA855DC71B1C98494862030202C06B935125654EE498A7E7F37254084AA1795484FA77926C8B438592F4D7BAAB58978329CF12F461B1F93AACC7117980774E12355AF27E506A2AC63C4ABFE585B2123E2404B9EA9753FA101604663D07E153C07B743B23C56B86A91CA34111803A1F5865E47807C012A81885104495499884B495EA3F457A2AE1363221B2A94BE84E27CC9E8BCA44F8FBB92746821782B3B92B1BFE87127F34076BD4ACABF60E4F9B97A8F63008B584D0221AF927C67D616BB9933BE9486E38D7BEFDA11A27175F670600041A6DBF0C9A4364B3FFD28ECEEB0C8077C3ABA19C6123A20CA72C0776AA8E21A582168591C7C1EB146BA820C9EA1AA3374625C8744612BCAB37250FFB34A89D305C35169660DC9B09F7C960A4C4450B1A2E56088E8605FD75A35EB620C3C90B93FB001E03C006A15B67136EC1C354D405A61014821FA9590DD212CC6095DD011BD8801A10F08F15DA21C14CACFDE606CA02B7E2E1483E3514CC6BC88C2987587458D77851E476AEA14A94C176A4EAF865D58C033BA2280EC0521BC53DCC3772D48258593A5A1F9974228652B8CB4A08296EEAE869C733A316D926D400CBB09A2DAF532DA06522DA9694CEC2A29CD4C87F6A6C837C6EF6182A30548AFDB807BF447953A3827DB3122BCC7E33576A33A943492A61F3625DCF412793996C664A4664B3666C154F90B40C3EC514C4B1A2D265A23B897177342B76C69637D52E356620F468480472923313A658683566DC8F8FC1079F248F9D8AC67D4CA703339AE28A86EDB4BC21DB231DFA970249AEB1E2138BD4791352151520A73B0792A0E77D4967BC8B46740CF5599D4056F382C9006B79938825DFE2806CB6AFE7523D940792782D978970256C691434F939B02C14F42B1874087EA68917C2F3E31315E2258194391B7A41175A41C15CD995EBC69C83B29E4BCEA6C186611DC4A79578E37F4CDE950541FD53A8A47AAA8CDFE80D928262A5EF7F8129EC3EF92F78D7CC32EF60 +ct = 82A0E7AFF4A571BCADC4F8379F16660071EA01B9DB2E2F8B4792A099532461E924BE531A9334D56A47380A66DCF49A91B7CCA99B6522CD273326FBA64569CD2543C488E95CCF27E9CCAE17B14ECF68C13A94DD7901F7AE15A92E1C7B499DD79DAD5DF3B789CEC56581B33A190C6EA00964BD9812EC9B06DDFF1FEEC5797320D98EEBD856A42B87FA94C0971B62A79AE6CD1900A706417CE9F47B8DF31E055ACD1D852E6305E607DDFF39092864D9D39D456ABA08A104ECFDB3E5ABC9A75A3072D72C59625984F38C63ADF8E617CAA5E4E45CADEA8339A9F8FA6C8302FBA5F20B51CEF477B56F537C0FC750526A1EAFB2A424A727945DCBE1809D14544856A28702046E319F5F8159694EC2FB9BC545BA1DD6CBFA514A196F556C4884030AA2E7C5445987073A882BB053DDD48FA3A4C7EE0787F15A3E175976688E75358460BAF148118336E54C34052CEAB04C1CDE9A177C655777E403AF016A147A4236E2715F8D03639EE81F57B318D458DF85DE4DA2F8DEF589A7691220593692C12EE7CEECAD2AA996845889978C7BF0475F72BFD8A8DBEBBE2702AC7F60AF6C40ABEB30DE0ADAA583F62978E085954362A98CA1D905C7C8BBAE08346C6B5EAD4DC3E37146C75C8F546B14F52EA0CBCB26E3945F4925C54EEC227F8DC4F1DBB1A3332C47FE9CC04F7BF87F0971193B12325B72F8ADF3246C3AB847C2F2F84161B773B5600CAE25A4B624BCCDF9F889FEA70142880B15047674EBD974C6442C13CF0CBDD9868F8EF0AF7C0DE183EDBEB49D56ECC26620E6F100068F303F949A8280E370BB81F5A31E3141D3005E67BDBE3AF409B898039CA038EA1478ADB3C95ECF88ADC1F9FE9251AC07BA4214EF8E6B25312D7267FCD612C893CA8D32C0F07D6BD929815D399E13CBFED2745D31D2C783019CABCAE85CA659F68498E4D0BCFF75804958C1BE7C86F102D12C0F05C56F59646DD1C0DBEDFC65BBF8900ACE1861D98AD20E87A2E1599F6CD768385C85ED30867A43F44DDED91F2593E25AA9D8481318C3546875C8E95EBC8DD29E3112293127D02D2921F30FD2C377BE89087E4222EEE4D793D1D9925BF28981EF52AD688516251A2EF7AA3DDF34B6AFDCF2C92BBB197FC7C4882015F836E99C9BBA1E310E25009C1FAB7137312DEAE24EE1609D59B46DDC4FE5C13202AABFAFC92B8BD5AAFD6EE9FF7BFC6A5E36F0AC30E5884A84B6DCF601B4BFAB2948EFEEEBC9DE0C90FFCE407923ABF2407643D6C1B1860B796986BAB3759E08A42208E96F179555FC97B933C4F759F38F2B648276A31BCDB7FF698CA966B5B182CA6C29C2EF20DAEC7B510EB8C79FD20E33770E6192941B6084B7A7A7FB254C332F3337BBBD6979B5DAA682D36F707EFA44785098B775F38F1DA67686EAD81EE659F211C4D547DB678729B223CFF0F487F7042BA788F9ADD7DAA2122A939D76203472AF237F81BD047D6D9449E57A5AB8C3CD62FF88DAB360D8B2B3813FA36DE70F69129E112DB46CE8CE8A59241CCA8F207C4686EB27DBAA22B901 +ss = F9A2D73F0A81B5829E7C7CAD8FCF5F1AD55B384B2427C288BFBF4C29540F1DB6 + +count = 4 +seed = EDC76E7C1523E3862552133FEA4D2AB05C69FB54A9354F0846456A2A407E071DF4650EC0E0A5666A52CD09462DBC51F9 +pk = EB14CBCB226951857BE4B3BC2A1B578B148E824A2414412A3D57C8213793C418BF2E0803DE4A16EB9C8B5D53718D38AE40299B89793F14741792BB10D9C21D5F06633AA3CF1CC78D0DC99983076F8756B2F96B2095E0B812160FBB9494038A88057671DC692F14A956D5E6565FF752D28237C70B8F8528CB1A04CFE5E6495BD3B46A3264FD7364E0D54F2AD27DD27B022EFB3D3A632A7F99551BC3317250207F2658F363164A9631A34B468E9B3C9B34B27A3A02FCBACC516469F69B3A51554B93E05FD6DCB098E8AF8A3681CE89548CA311E2F5421CA1496A532366435CFD56A26A245BA68655DB99CD113C1AD1170BAB16A22BB3399E45C6A9BA45B5DC5DA04A426C635C844744C557AF7E49CA12437CF455B302C037BAB4954627A2363020C4AB5CEEF5AAF2E352DED62FD6A52ACB70C84723A527BA34F179204B26AC10692822AC66CC56BFECEBA65C33295FB805C596A48A0C59477405C21AC3EDD2C27E56C19BC84D710584ADE48647C681746038AC74AB73591FDE872CCDFBC3CB1218FE12ACBFEC9248C00E19424B1FBCA70FC5193151AAE1415416BA2D7FAA6A2C745CDEDB94295438BB182DADB77182B2BE5BD1CE0CC028B7EB71BA8CAC8585CBA3CA01620B63FC91BF3C210F67C65C92F893FC616158C104A5799720AB0FD907798F0678746475C8502029865DD653209A39C0C362258A266B1B244A4F42B4ADC1C6BF602FE61125C3B989C018C0A0E0C73E35ABC97C9EE695CD265909AF82548B865EB4238376A6AB53A6BAEF185799489F64E200FB542EC3D1B42E8B3960E02730936D620360FF4570B4079B369A83629B599E7B27FF48C37F727A4F93BBB2D4B7E1C73FC0D6668E53C1EFE0A0B547B1F38C51F4001654F45BF0E5766CA1C662F2CB99A6BD42A17F89C80A4DB03C990A81AE9487E1A52C13720266083E152061AA08C03A7A703DE58251F129546A42282515A3E27195CA97CEB39B00566CF4ACADAF320D5C88C75FF310F10BB5AD738D38AA47C945235E1730B6CC227A194DCB04CE046A22C37319D910060B594BF8A64F2C4B8F26000031948046721E6546893A341ED2C32804149954E3788EA5054C51A43DA89F9C789EDA6727BDD4BE32B15D47B9C327EC68422813B00950BD73C96C7175274A5EA8BC128A7C0993031B4E8A5D3C074D2D1ABDE8239D5AF58C06509B24109C84297E3FEB447FB3926DC19F39211119C4597711A222B341CDECB0698580E422A951DB2305D4A7A871967DB945A60439DE206955C371EA52452F865DA438130D2B8EAB3669A97911258B08931A2E36C6C390B6845E8076A0D621D7692971BA71BDA0B8AAF7BA0AD3C4F05AC23621A146C68BBC501854062B924C3A64916A1B9B19CE5B466F8672EDE621EA987F83495106DAC22FFAB6F4A5CCA797587126CE50589F68A2084875BBB505C7FF46922EB496DA260E3719CDB2F23950455DC8D36E3932518BC11BFCC067AC533360B86550B6AD09E93DBB092BE410721D48BF56B3594B93CBECFC785A5852B598425E4C4CDCC7CAE1907ADEA5772276B2929B9507DB5C06041E5F9846506055417C6FA091652A4A424BF6396D46365BB40601E3A55801B93A1CCF39126BA7F025A2467F6D44DE229C527F6E4E7071CB826CFE76FEA483D9163EAA84F6AFAC495A +sk = 944AB695C2345BB67894D451EA2A5C92561A5467C769352379950879899C9CAC9D05E89CB2729B2BB47724923FCA357623C69643569D66912B2F9B3249908090D4C5F68388A6141163C931DF430D70290950B07DE410AF913C0E5A215C3059785EF05B824545ABA0B95E7279D1C5726B59890B82131D5C62E8B3BE33B8016BA0C321C248A5293C71ECA570C9536F958B84663B1DD5BB6F272C3E201F014AA3AE05640ED92200274D45D9BF4410CE8EA72D680ACE1EEB04CD8B002DE72795DB60681BC9ECD387FCEA796FF7726FB29877F895E6832EB7EB179A5956499CA3BCF3283FC8489D494A88668E6614B1F49824F12A448B31A42861190CE3A9F73C6FFA25622D7A504E0694BB7C75EE71CC8E718CE9D57AC86A11721721E6181F157C333AE098F8A6823F765B60F0300F4733CF65240C779569620213B8A331731A7B31937104BECC0995EF57255261AD9B246009F855CA82AF2001B256760C1543074D70B3C578279B35137E16AC2089A4C60038B8671D308964B68A2211187154746C27F59C8105981C8C7D0AD58717978C01A66B5EE1697188BFAAC9B927822C940C5380409F38459F5B302CF7DC9D6BD823A0308B0DA45C35D541D2346BAE4173FB0C677EEC26A94C4158B28D4D7B4B0F62A4AB06BAE0B42208B099A174BB4C482C7C321AACA49C4A517114A5CF408750E8588545134F83A67769CC6E0B413BB800C04093184625A7EE24134A721D5FB1571CD82DD1D7C5F9103E0C2C4416CB775AA28DF48643084B391DD2CAF39278E9A31D2254871B170AE1B60A4E39B1F5A8473F580C7153CAA1369D8E9CA381660A57CA8D2523202816767CA8CAC0914C16F1CEC8EA4EA5DA930E0403E7A876C390BA31FA250D946A2EEAA479888011DB7942F7676A120338357BCA38C4C95088A4A0884B8B4C14E9C09E831F8AA658ED77CC164124CB281F61856BD6C965B6B6CD60B1B1034888F3970555443F0F5CC29C800F578806BEEB4730AB9AF4B9BEB89502AB48761E188CB9AA95BA06B28CF4B89C200B2145A4339A53406B6790A518F54902EBA0230A8C2A45447125B7330F12645D935E00651CB4996E395543B7E643137ABF3DF59E042ABD6FA11927062D73D0A107BA6FEA0908FF6759A972C11E864EE7393254051BDA558D4B272E6CB2C337747A7EF46F5AC872D5D5238521C09E21495EF98B59C22961E5A4967370EFC4865F06A72A41464D37CE4DD1803BC117888B681D35195C857A47B764C6799A86E27327EB0403931E29F90FEE8628AA43B333615BC0F251707024AD41A24E3C4F15B99E72F536DD989C0325225DC682E3611640D99C1552506E687E18A883F90882056C14385BC08BE82616D811A4FB2DC93670945B7EFA17593C4B7BFFB76F9A805F5230C50B065DC77B409CA8CC0B7190AA61614C528AF2D1AC130C19E4362E85A40693A87C00935A887B9B58699777453D8278C445BBC8D225412BDA6FDF026207E3B207613D2ED74C085707EDD555FE4C00B40B2A83AA219CD643F1D83EC0FC21BCF94FBA6A8262D959C9FB345F2221082C40A1501C46C55082DB2709230B04090558CB6D6815173525725D8CC0BC93C881C99A16041757D6A05AC71A15E887EB14CBCB226951857BE4B3BC2A1B578B148E824A2414412A3D57C8213793C418BF2E0803DE4A16EB9C8B5D53718D38AE40299B89793F14741792BB10D9C21D5F06633AA3CF1CC78D0DC99983076F8756B2F96B2095E0B812160FBB9494038A88057671DC692F14A956D5E6565FF752D28237C70B8F8528CB1A04CFE5E6495BD3B46A3264FD7364E0D54F2AD27DD27B022EFB3D3A632A7F99551BC3317250207F2658F363164A9631A34B468E9B3C9B34B27A3A02FCBACC516469F69B3A51554B93E05FD6DCB098E8AF8A3681CE89548CA311E2F5421CA1496A532366435CFD56A26A245BA68655DB99CD113C1AD1170BAB16A22BB3399E45C6A9BA45B5DC5DA04A426C635C844744C557AF7E49CA12437CF455B302C037BAB4954627A2363020C4AB5CEEF5AAF2E352DED62FD6A52ACB70C84723A527BA34F179204B26AC10692822AC66CC56BFECEBA65C33295FB805C596A48A0C59477405C21AC3EDD2C27E56C19BC84D710584ADE48647C681746038AC74AB73591FDE872CCDFBC3CB1218FE12ACBFEC9248C00E19424B1FBCA70FC5193151AAE1415416BA2D7FAA6A2C745CDEDB94295438BB182DADB77182B2BE5BD1CE0CC028B7EB71BA8CAC8585CBA3CA01620B63FC91BF3C210F67C65C92F893FC616158C104A5799720AB0FD907798F0678746475C8502029865DD653209A39C0C362258A266B1B244A4F42B4ADC1C6BF602FE61125C3B989C018C0A0E0C73E35ABC97C9EE695CD265909AF82548B865EB4238376A6AB53A6BAEF185799489F64E200FB542EC3D1B42E8B3960E02730936D620360FF4570B4079B369A83629B599E7B27FF48C37F727A4F93BBB2D4B7E1C73FC0D6668E53C1EFE0A0B547B1F38C51F4001654F45BF0E5766CA1C662F2CB99A6BD42A17F89C80A4DB03C990A81AE9487E1A52C13720266083E152061AA08C03A7A703DE58251F129546A42282515A3E27195CA97CEB39B00566CF4ACADAF320D5C88C75FF310F10BB5AD738D38AA47C945235E1730B6CC227A194DCB04CE046A22C37319D910060B594BF8A64F2C4B8F26000031948046721E6546893A341ED2C32804149954E3788EA5054C51A43DA89F9C789EDA6727BDD4BE32B15D47B9C327EC68422813B00950BD73C96C7175274A5EA8BC128A7C0993031B4E8A5D3C074D2D1ABDE8239D5AF58C06509B24109C84297E3FEB447FB3926DC19F39211119C4597711A222B341CDECB0698580E422A951DB2305D4A7A871967DB945A60439DE206955C371EA52452F865DA438130D2B8EAB3669A97911258B08931A2E36C6C390B6845E8076A0D621D7692971BA71BDA0B8AAF7BA0AD3C4F05AC23621A146C68BBC501854062B924C3A64916A1B9B19CE5B466F8672EDE621EA987F83495106DAC22FFAB6F4A5CCA797587126CE50589F68A2084875BBB505C7FF46922EB496DA260E3719CDB2F23950455DC8D36E3932518BC11BFCC067AC533360B86550B6AD09E93DBB092BE410721D48BF56B3594B93CBECFC785A5852B598425E4C4CDCC7CAE1907ADEA5772276B2929B9507DB5C06041E5F9846506055417C6FA091652A4A424BF6396D46365BB40601E3A55801B93A1CCF39126BA7F025A2467F6D44DE229C527F6E4E7071CB826CFE76FEA483D9163EAA84F6AFAC495AC5DBD68B3A8C148B2E7AC049BB986E14DD1CEBFA1CBF3EDD6BAE85A4D2DDA082BE2D3C64D38269A1EE8660B9A2BEAEB9F5AC022E8F0A357FEEBFD13B06813854 +ct = 99CAF6EAD87C4258D41204468930F6669BE4D28877F95B4E4E7F15F975E3F8F7CBFCD8D24FE79C7CC43154878BB576F31C5E59077DA847B648FA8EA91A309CC32508B3D6A2A7FFE37B38901D15B489689D71EF0E5ADFB052AABE970525ACDBC79DC95AC0A62B7B151AE209BC92FFB4CD40002CD061E9EC8CC7B6D82B0340D798BEEE0C4FF22888A5E7F90D2782FBB07F4D980CC0126D7CCCA78358C86D9E399625AA7E67CF6E9935D3B02948AF9D4E02422985E5F067218B0682F576C3DBCF7143AC7452391C899C31F7BC2369CD4158AF829A6F8ADE7BC59C727244FE9EEB85FC20ABC87B82B1A8233CDCAE93D51BF7DD544F8324BACFDE234DDC364909AA9451B8452A2F959DDEFD14E055D3F09E8B9B34F43CF5F61227896C85EBCB76C25F66D78F2C9BD9A1B9ECC209030EC7A494C909337D3196B11E0FF8EC06AF26F82B8FE3D95CC5EFCD7A620C410358896D7AE138C5A35E4A7F56C2E1766D9CEE5E3A883217DFB6AC66B014354384BE3B8B36B29945755418558DF46BBF07172F778128668449D0D42092E24CB530F77BCCDBF9A732EA3D68623847A1A377B2D0CF9AB3E61440453516C76B7F8477EED10CE40F0C10D5FDE3BE9E20CF629D232F85D6744B76F8801E691BA9CDE389BEDB87C5683F47C031DF57D17A0241707650BD78A753570A1DF4FB30E952B000239A0ECCBF75954FB6053E509AA61FF4607204175BF10F500735611053633A2E77E1E073C5B5DA9C41C56DB9A368A6F9B2FCBFAAC2B899A487FB9653FEF223A24D788DAB079C88B47B08C7B300EEFE66BA4A95CE44FB719B495C3F1530BB1B4D8EF0E940603D142A6DF06DA11C9CD06A983BCF834A1253D472BD5A344694CF01CB3A7A75A3954B6DA6AA69F700FBB5A9C6D21C29D9DA5622640E730D44DAE3CBA7269C9F7B5A822069FACF10EC7710C89D56D92C56DD9E5048C898CD1A1AE0658DB7530A27C9AF44E55030EADB9B1CE92EB8129E5CCFB5AE7E3A3ABBEF6F441ADC3BBA1FB94AFFBD154B4E6FE014EEF5863DBB3C0764D0F4808EB19F2E6249B809E1BB558EB8A7DB7EF4CABF353B331F8F1A85160BE83D34DCA53FBF0C654D2BF2FB594BB2B26F9E6BC875542306CDD623638D8F36CCD98A4357C84C06CB8594FFF92ECDBBA23BC3FFB3743344C347B29106FF5014354011062CA7A1F7B2F0B4229AE5857A769B6C83E3423C6EA10605A168DBCE3F5FF5ACC77A17CD0C91E50787290AE26BC68F4C9F9DCC961AFBB3F875A77F5DCC7393B818859FD9F41F1BC1C1AFB814B0EB7BAC59EA36A9BEEEA70524795CCF733A315618818C165EE31D93C198257DD17D36F7F5531F58EBBD0D195068F0BC0E559BB658A49572FD0F0D6E587D9D8D3D5B838C11019D7D306A1A6BD88C1155DB8498FE0E7262FE683448C6C44B83A416E9FB99149674F93663B119076CBD2EF018A485084676DF141E7373E3F96BA2D4FC23D175FEBD6AC4A63BD910ACB190EA203F9408DF92413FBA0CFBEF9AC0098A0B40FADC42531EBDDFD3B8E5095D2C +ss = 83E562482FCF5157C75D3D2F0A35DA861689A1009104A071A7BFB10BC4D8CD02 + +count = 5 +seed = AA93649193C2C5985ACF8F9E6AC50C36AE16A2526D7C684F7A3BB4ABCD7B6FF790E82BADCE89BC7380D66251F97AAAAA +pk = 86B5C9A75157E73CCC2E138518EA98A246145DFB6BAC9B2FFC333C0BA5806047CA9BA8AB797937000270E773C9863709E59786F8EC948ED27660AA3758E33F59140E527787FA74A2CE22A4A8F3037A26903665CBFE8A0677EC273F590D64C97F69F396DB78448535746B43296BFA2BF0A251BF986A524074C1F96077F5219CFA9124D1458520993F627AA8B7B6A0F191683233E0BA6BDE24561A666FD10151B0C52C9982C301E0970C3363DE27825A5BAB078848AA5CB75A90C1CBD24CF67A68F3417780CCA947131E4573934F9959787B6320A4B47BB311048289E2C915E35344E3A144E2708893138A15A03FCE3816945464C229C587093B5CBBB519767FC65C078D6C684B8B81C1F9CC2B3BA749FB3074623E3C9124A8E1A513510357656B37087BFD02773FB59157EB885E1501740483F3EC070BD492DFC217D7DB99CD7C9D57B937297634C3494DEB585B8C93CD4EAB1865F8A9C8BB15DFE583C7DC0427274F8DF3C693FC351289964A89A3C745967231261D949552E0809BA9B7C5D258AF579A4515981E991D93154BCAA170491B06752415B1D52BC2A98B7F39C5B91A87EB759A9A4537218156746930A347A5026911ADC0412F10A7A7C200A1514D500805C10A276C327E4899AA3F9B95D1BA2347E0140184B1235A719E6C4A3011576235215D77084034771129C33199B70774B2130898A0C69D8F39C3A50B273C665DCD8031B4454D144A4356B9C2B16641311856CB65466991B06D1A8A74A5AAD6B5B935B65DBA8374EE690CD1C701A5A28B41732B5F88A9AD919A7FA563BAFB529885488F544E1240B3CD673F94EBBC91B4757444A302578AA953161993CC918216BC56BA53EA17664BC5B543A38C3516D4063C35695791D8821240BB749CAF98896C4718A9DB33C1A7E9B91B9B6D06FBAA58E507F8A105E2F71F6095621E354B3DEC1F9C979ED7B3AAB56B4741110FDA601FAC78C2EDC386669118A425C634157875F61ADF10C43D2184D3252EDEB11A61EB67A349405EC74B9FD307558A887EFBBB46C904F9469DB491605A3582BE433BED57363426055CC4852ACC0317F24D89903A918875C949556A6A458FA3CFB5797D6A3A68EE9991D97A38E16B9A727C5B2E7B5E5A0029C1513D5A1A98EAE78713785BD4322261D90109A0806E565EBD9308849CC6708B536C83A2FA35995C819D99B850251C1D50EA902A053C7CA31FAAC37BCB1B40D6123CC4D52002909D0AC566F7D75DC89998036AABB267C5AA70184AB4CFFEAB018F195F62879BE0A51B42B843CAF7C494C181C2F06866CB2287A00349EBB136747DA52A3C4A3C581798C413929CE3E698FA594F019579AE329A22D4AF66F27B46453F22E61AA6EC5D7D854FF6D3C3D4117BE2145B5C2BA7A57AC968A5CA43B461F808167FB5A76A942C95145098B95CD46439669C00366960E2162AB613C5ECB151359B093C27C04AB230FA7C0074684996F44939C81FC31373C8231BD0B6679991A32A031002B257B2F31101317B3E2B6B28B8911E3991479444C6086110B7A70125CA71C6659C970F94D0942124C17CE3AD50D5A7019146BF51B012D1CFA0F59B220A795DC6B3D7896AAC680ADAD383EC46762B669D35909A47C12DC8EE619E1A0C8915822D574A243F67E14104D4F021CF95BF33271C9BC9 +sk = AC65AF9FC8B905D09638374E58C551DA08AC4EF86A8FF04489BA462841A85D907ED0C70E1A790297AB2DF7D6CDFC5C6AF513144DA105DDA2C75F00736DD91564A79668E335FBDCA1C9D31592E73D60066B959A2FCBF55474F9C21BF058F021457586766FDA4FAD521F64940D4932B07AD8CA7E1A06662730EA6C15AA1C2F9662552313176AF04FA4A98962101492566ADB8BBC3EC04F9CAB9EBFE5860F886D57A2C73FA050A3607A8C0998754B417C9C5AE2FC3F829CC3A2EBB1E927AE87B68C6DB355F4C661CD000D10D6BC31CA1C249A9B3931A4D1C57904DC6DF923839D9A90AA2B93A87C44B5F82E6A925D22E679428064FFCB9621067B75477FB7D51A1D3B9D9DE4051CF874CCEC12976562752CBFCFC59F56C2C60B8B4610A9BB36E9019B974502407D57289726AB8A38D7A6C880074A5686619ABFFFA5757DC79E1449408851502BEB8196F493F4A724B9D681645A07B193586C5C05D8D10E2C968BD251B88691C368DC18CF8270DAD3C22BF5093DB4CF05668F8C6315C0EA3F55495E784CCD6055AC451363FD77A91686AD77C5AF53141EB5E7534FAC4DE481741E48B414302E4743789E250C39C45C0A15CF42E7B3631B6A8C0971C8A34B8200BBFE11004AB06BFC5949C3615B02947C73E7A0717C6B60F2679DAA21AFE4C55768A08E70105868AA6AB4AAA848C79BF125883907B9DAABE367AFCE273E2C168AAB02ACD27855E2944B67B938170A9258F67397770136E466758C260CCB7DA226B5A95692514727FD48953C62959C88C8784A8A52131C4BA5A6D757B4311048B602B554E8AD509B0C12B0A64553CD4270CA92F36CEC227E16A217C769A2BC1AA6C356A5A39C69F4963BA6273DB9232F1D8A28CE65B5B9058F1B8A164AB0380C42A8EDDB6C2B8B19F26B557C387E4DB9AEB92C4D7D0A2CA1E35F97E05CF590BC511AC5EFB2357E70525BD027B36C6781C4B86B0069E7B89C8CA643FB9990ECAB2CC5A8A5A5B2B0441076CE934D96BCA9FFC10EB6E7BB093675E97B68894BB030581D89123642C1118364115A76AD1C181EED4B691BBC15DF182DCDE00C71F8685B71883A184396D3475CBBCB674360DC14C42DD6461514479C85557194A97A654C4BE7620FA84C59DB5057A0886D760460CC4A3A713F4FD4BDEBAA93B943C48E6348053703ED818FDD9CBD62E246C0B69A265AA381822D6A474C5AA530AA5306A0C8572C413718A278194367405789E1F749AB4A02AF87B362067F3DA12EC01A83ACEC26A390CB5419B351BC95E08C7338FB933B81476EA950881275A186C9E9F99DAB63634E6B7314188BFD686D74EC203B71542B62B1C0C7712745940F7B9237551467470E5B1BA2F8E34CF585ADBAF980317C9DB1147382946C12223C3A45973B879A523855BEF121151BCE620216DEDC6C3457CA03951FF45B662F79A1A7A5CEFE9A846DD5774C7C2A22F842E4E465A94314E036BB55A2787A1A0F0F111143872DAE74AF706A369CA54259B80578BACD497700871842B98CAE2AC3B572F98F145CBAAF54569779B616242060B30B2A482DAF335C9A502CD318296958C696F7080C7A3926C7B62F36A5DBFB87EA0518358155E8E94390B6C0F808B91C166577037D86B5C9A75157E73CCC2E138518EA98A246145DFB6BAC9B2FFC333C0BA5806047CA9BA8AB797937000270E773C9863709E59786F8EC948ED27660AA3758E33F59140E527787FA74A2CE22A4A8F3037A26903665CBFE8A0677EC273F590D64C97F69F396DB78448535746B43296BFA2BF0A251BF986A524074C1F96077F5219CFA9124D1458520993F627AA8B7B6A0F191683233E0BA6BDE24561A666FD10151B0C52C9982C301E0970C3363DE27825A5BAB078848AA5CB75A90C1CBD24CF67A68F3417780CCA947131E4573934F9959787B6320A4B47BB311048289E2C915E35344E3A144E2708893138A15A03FCE3816945464C229C587093B5CBBB519767FC65C078D6C684B8B81C1F9CC2B3BA749FB3074623E3C9124A8E1A513510357656B37087BFD02773FB59157EB885E1501740483F3EC070BD492DFC217D7DB99CD7C9D57B937297634C3494DEB585B8C93CD4EAB1865F8A9C8BB15DFE583C7DC0427274F8DF3C693FC351289964A89A3C745967231261D949552E0809BA9B7C5D258AF579A4515981E991D93154BCAA170491B06752415B1D52BC2A98B7F39C5B91A87EB759A9A4537218156746930A347A5026911ADC0412F10A7A7C200A1514D500805C10A276C327E4899AA3F9B95D1BA2347E0140184B1235A719E6C4A3011576235215D77084034771129C33199B70774B2130898A0C69D8F39C3A50B273C665DCD8031B4454D144A4356B9C2B16641311856CB65466991B06D1A8A74A5AAD6B5B935B65DBA8374EE690CD1C701A5A28B41732B5F88A9AD919A7FA563BAFB529885488F544E1240B3CD673F94EBBC91B4757444A302578AA953161993CC918216BC56BA53EA17664BC5B543A38C3516D4063C35695791D8821240BB749CAF98896C4718A9DB33C1A7E9B91B9B6D06FBAA58E507F8A105E2F71F6095621E354B3DEC1F9C979ED7B3AAB56B4741110FDA601FAC78C2EDC386669118A425C634157875F61ADF10C43D2184D3252EDEB11A61EB67A349405EC74B9FD307558A887EFBBB46C904F9469DB491605A3582BE433BED57363426055CC4852ACC0317F24D89903A918875C949556A6A458FA3CFB5797D6A3A68EE9991D97A38E16B9A727C5B2E7B5E5A0029C1513D5A1A98EAE78713785BD4322261D90109A0806E565EBD9308849CC6708B536C83A2FA35995C819D99B850251C1D50EA902A053C7CA31FAAC37BCB1B40D6123CC4D52002909D0AC566F7D75DC89998036AABB267C5AA70184AB4CFFEAB018F195F62879BE0A51B42B843CAF7C494C181C2F06866CB2287A00349EBB136747DA52A3C4A3C581798C413929CE3E698FA594F019579AE329A22D4AF66F27B46453F22E61AA6EC5D7D854FF6D3C3D4117BE2145B5C2BA7A57AC968A5CA43B461F808167FB5A76A942C95145098B95CD46439669C00366960E2162AB613C5ECB151359B093C27C04AB230FA7C0074684996F44939C81FC31373C8231BD0B6679991A32A031002B257B2F31101317B3E2B6B28B8911E3991479444C6086110B7A70125CA71C6659C970F94D0942124C17CE3AD50D5A7019146BF51B012D1CFA0F59B220A795DC6B3D7896AAC680ADAD383EC46762B669D35909A47C12DC8EE619E1A0C8915822D574A243F67E14104D4F021CF95BF33271C9BC962E0447F7B5AE8A806B741CA5C302230B555C3786C11F3EB43894A8F45E3F7B1A08CCF451B049FD51D7A9AD77AE14A81569DF8C9BD3A8F1EBEA86FDCFB823082 +ct = D4BCE18C62FB15E635B2061B99A2D1BFF919EE09A76A8598F64C8F52272CE533DA3180B71A5F1A710EE5D924B1725834D24EC3166E3A2D6C0EBEF6B4AA2DCB9AA3CF2BC0E3AD19590AB3520B3145CBD5F36E207AD97C9AA2276F0FAB6A5918F9C0D67616FD45B4F8BE0C461488F17F57ACDE6432D8B36541ED62783DD590B6AC71FCF01805EEE76EDC2583CF0A0626CA4B0D6AB6535E2251CA533992336ECAE5B26B0E06525F08D53D04A9E0CAA603381E6C033F26661427063E3B6C84A4F82B9120BF58A3560D7B7234F1C6E7A5A4E320C8C8DF4F6433F646951F7A719A79B9D22A663A2E33A39CBDD054D870F447C9F3053795F96134DF95B277CD95B6D7580225F919E5119FB5C2C75704DF380CBECF276D28FFED759C8BB7252E24A39A1A9AB3FE42204727A50508ADF6C274B6D4976DBD6B7DDE7753A9E58CF8FFC6E31BD3DCACF9CA083B3C482F561CAB1C0DE32293D35DBB69368E8A62765AC4E6945D8D982435545F2DA7DA1875350BBC242611DFA2BB9F36B407E70C27A7A0AE0EE2371C33BBD7B958F4A233ED13BCFA73161DD89E559EDF03845A0F8513A865ACEF4DC5EE33E40793284DCB5226FCEC925A4F1195884A72993F34457073365E35A1346F6453DA6262B137EBFD7EF78711CD1319D23493888BE93C75522F3645E5F83E10843C4F688BDE241537249926FC901E9BE192A126FBD910194D0B3B26325D59831BB82D9A2F357ADD6C823D46E3DB51646E09C22F750F95237CDA8A00071BFDEB8CED9863B89019155EFFBD27337099E08CB72293CEF964F28FA1DCC644B7D022050900524B2A1F7AFB0347FCC6E8402011217FA77E3A6EEFE5C4A63F775EE2DFA5EFA3F9CCC2E70366B88F5AD9C0B73CF81616B32D38D30B2741A04DC6AC179B90FE61CB66EF31024EC35093BC140EE79BCCFA149FC69B846EEB3717BF18A2358FC9C56EE28A7E384A82EA0D830123A49698E63A17D70C1C9F1169F1B62A409C5A64FF6D73372F419E12201D8AAE01D09BE2C3D26E8D651884A31F6B2456410DCFCB79684B00A163ACACC2E247476CF53DD66DFDF3646322971E918C0B9096F86A8EAD17558D6736F4C52B1684F952CD93BD39CE4A4D67EE2D7470C710F86D1688AC90BB1CE23C6E500B6EF99FFF1102BB23FCA16D96D30DE29B4AC4BA252063DFD14F7834234274A49BBC5E78B01914272F1A84BE414AA871A7B5072183CEC33EFD9C3FC702FBFEC2CA3762D22722B98575CB874219FBF0F82C3F768878AE2AEB9D3FCA8A8877CB3B78B9A9E34DDBCEB6659E3D632B37F6402D734E545BDA4027562089993DA8D4E8F388243E1D8EF9504F52DFC668E69BE634797EEE05C6C2CBCA705FA1A088E9A8A2CBFF0C9F8827310FFA1DA6E75B0BD776B4437A6CDE2A9683374910FD5E5218353AF004F1D1060B6BAA31B3460D01B3E7675261DF6C409009100E70A4391F146F04839F0C175837DFB4E6B9DFD402032380236627093C9BE3F8EAD7F81BEBB8F8853C549C875AB0EE4BAAAC49B73FA3D410EA646E +ss = 445B60A142D4853702A102F9CC37FDFB1D0B14A9A7E210C7D290F9402F0A2F40 + +count = 6 +seed = 2E014DC7C2696B9F6D4AF555CBA4B931B34863FF60E2341D4FDFE472FEF2FE2C33E0813FC5CAFDE4E30277FE522A9049 +pk = 05EB362461C4A2E81885084505C3862C3B647D181805205EF3E4CA5C30C46A0C21EB97700B70C2BEE78D862B3E19DC1E0CEC0AE6998A7B3C4FDAC39A950027FB2A3BEE027A8E54B4A5B981BBA01BADC0B5BA6A36A2913F1C1A046036960790CE2CF2583E6C62A778290F242B49606ECF24B3A0DC023B22AD8945A0B8DBCCC9356475B36B2A990D7435B12E1536A21079FB7802B998488E690F763646C3B66ADFBC8161855B20EA18AFD87229D05E60372694E4C4C6215344DA04173559D7954B029555E6CA4356F6CBE325A39431A64DF06E75C63ED0E40BB0CBA6ED68BC7211B02F1165C370ADA1E0ACF4AB61C87CC32F7017B4A26FF8CC0784F76047316AF6398DDECC0C62E9A37FC4CA685017B33AACF597767312192CD330B2F3A84E0BB858480A63A607295A39F61510DC2C6998614013F45D319858DA8228FE5BB6EAF3B03AA60F4B721A3F046D3088671930672C61C92D6005254372D8081BE322CCEAD06CDD472CC5A481EE385096A5B8CE64B57781CBFC4457E917162DA007BD7BAD8E3803E05B08876842D9E6A0A545407A5067EDE3510CCC4478C040310AAF46051454D855D1A5521E2514AF676846650E0043BEBF453E7488B6DB8AAEFCC16E26A75C52BC0EF3C80DA3BB39F73B9852B54D9C606363438C45DAC4FF1A1913D81B9A80544177BA7DB6503A04A5405299F80A83FB7135FDE04F8CECC0962461C0E80298D219531C9CBF00A3BB5B84908B5A807739A63485128512C0478084C8964F9064CD4514CE92C30454AC25B48919B719C5A853010A2EB712B80975660456562C4C448C39162CA63AED14AF7F28875149857F9B8965BC1D04CB8EE2E67C14A493A3822FCD0A2DBA2677E719B8F2C8BD09431B82BA56007584BEEACAA1F081D244B0D771BDB0C8033B18CA9597443FF8CDF754569DCC2DC4D4C212E2BBEE88925CE73034E19167CC7AC46059CD3B9EBBF6BC3A476F08438C61971AF139A248821002480F42C2B9C0979AD3BC6868565CA3FCBC124A7548D53F56B51C9F8AA387B59B07638C7AA45704420B3C24642035A7884CB42F877260C29697809AA7482E3FC356D8CA061C1C443CF24C4535BDECCB02C3E3B8B1D90E5B47BD11615CAF849DA5811AA743B9BD7810C470187E81AF9BDB4D1307303F615ACE2A58E7ECB3BE260E9F7C1E10EB3A84F207D2E75A30C7C741EA45FB04A9473C1425F80A9186A7F2625EA6ABB4AAEA3BB50602DF23ACF8E452CC01A909EC9034ACB47B969D904213F0A79EDB7766D0290005C954A1DA0155F7318BE854FDB038D019C1904B714F0514AC331C3813BD703B45076365BE4B47EC510A9F585907BC0F461A6BEFE13A2667593E12134A86AC139777A50CCDAD16B6891A0871621B387684B5226368400164B29109328F672CADADF7648377CD11C9232094165BB1CF12F694F940C3CD784C84925BA74C8A49DC27CDA4C553C85334A860A8A55D8A75969977AD1F505B9B20CEECEB24A262C707843310F39434390EA5315A67491F0592BF722A1C2658C8A720991B26561E14B178C3A1028003CAB8B69F60828F47B876D43D3F193C3820804068A5CAE76DC3F27F5F1323E6A2797B9A13C86713A83BA9C161899CF295CFB4A4AA443F32D16B72616A0DB4D3849FC41A7A6BA87F4AF757A0AB1956518F +sk = 67A93BB27ACD00C9B95AA03552809C38A08480DBAA67A9584A460345E20E5F381C9A82710EF1709CA51393F916345719BD3144B3121A8608C0A48017963387F7A31C5FEBC6B6749E6BD9BE3C58A9A77B53D7762F5854A3467A85941CA2C03873C0458B940275E5AB85B83A5C2027894B92246DD8632D68A310FBC6D214381128528B375FBB8C3C7923AC6A8C7F9E37C2EA4C6B72E3451922761AC274B5CC8569CCB93917A748E93C190320E3F1381E08CCCCA70903975AE25689C12709C8E9096B16A26E4439C2552A088194368B36EFE3871A6A1CD54CA0C70974AC936E45DCA01DE296A14C7D20652999E61841DCBA6C0171FCB406E14A95B0C02517447BB9370996176BFDC5BEB4316C0ED34A13431E34AB27D9DCCD3DDAA49D314659BB8D89325099D0B06931796CE65C0628C817393BB1870F19A10CFE3546D8BBC2509058327626F490A1BBCA6FBB653EE1C3555203353509AB14B64CF8A29C32B17096805B8D751848DC4494279266F2CC474228B2B703CFF81F0F29152F4570151517995262D705AFFFC08DD413C12F37B605BC32ECC1292B9AC99E4A34F911C8DB990ECC9A3DFB37517446908B91B1172A3D4F547B3AA642709BA40C3939734545DDB6B45C66A1A3E58C6D1929E5721BFC6A6021A635D86C8378D4A0BA68CE385B6B7FB983EC4A95C8B20B3EC750B082BF2CEC89A6F8C2881650E5B71A0135C865BB3FB12A4C2C3C917D655A2997984C8557ECF1943436A9FECC5C84808E38701CC26A251F458334F59BD40BB0D8F82E74071A5AE3C9439541AEE59C6E46A5852834CE5712B3665018154C5339467D606AF189CCF20C68C583C96D969815109CD3ECAD4F5AB0A8BB8A7B68359B0319078A7405821C2709A615864422BA0A3970C8EA138FFC1522B1A53ED1C71D396A0ED6B782C6552C70216679BB4761A600634276D553CD703897C6943A859112CAF9A7AC99517C23CE6457AA069B6FD2775EFB262DBC27B02FE6923D14B047A25CDC6B86D20A55D85108FF276F121A352E098E5D4CC3EF92B3A1C4A38244621B055D5F812189F6941B492330FB1AB0A442A656655455B38B522DED5640CC4136DF6CBF4C4B0651531CD8C95280E2AF13FC57C977BBD1A8BDD253096EA98C3AB33A516448A8301A4B141AE213BAD2F640B2D5846C99A25884360F604333197816BA9DD1D0C427C5B8D3A6B434207B8539CE5092CCDA67A755D6A6D7E8BB6BB02AF1CA7283E797F24A1042D29B64262F29B0482B840BD70A3D6D54205DF412DD6490E3DC38C1236758F65E461B11CA480B476875C692508E7BB90C430797E1917041642D88506C07255AA92EA32508462C2F4A1661C05114C9361F651B7C5FF70B42659FFEE71F58CB79E445536B8948142CB4EC16CFE5B21DA659C2DCE452346323F1632C37F128A6525F40E03D6C073E05476252B2B0483C4B87C1C1FD8C972CF651EB9684FAFBA3F862C8619C089F01277C14BE7CF7790712CA1E8877A48909EFA31D814C1C21F4A151B886076840546419A1C8B6CA4466389A3F6DBB69E8494D7B25A4E9B234A8D928A26B946FF305B8A33B0BF8B3EB992D68C312B4074788E69D1A5A211C3B55F8C654AE778FBADA1D75FB2305EB362461C4A2E81885084505C3862C3B647D181805205EF3E4CA5C30C46A0C21EB97700B70C2BEE78D862B3E19DC1E0CEC0AE6998A7B3C4FDAC39A950027FB2A3BEE027A8E54B4A5B981BBA01BADC0B5BA6A36A2913F1C1A046036960790CE2CF2583E6C62A778290F242B49606ECF24B3A0DC023B22AD8945A0B8DBCCC9356475B36B2A990D7435B12E1536A21079FB7802B998488E690F763646C3B66ADFBC8161855B20EA18AFD87229D05E60372694E4C4C6215344DA04173559D7954B029555E6CA4356F6CBE325A39431A64DF06E75C63ED0E40BB0CBA6ED68BC7211B02F1165C370ADA1E0ACF4AB61C87CC32F7017B4A26FF8CC0784F76047316AF6398DDECC0C62E9A37FC4CA685017B33AACF597767312192CD330B2F3A84E0BB858480A63A607295A39F61510DC2C6998614013F45D319858DA8228FE5BB6EAF3B03AA60F4B721A3F046D3088671930672C61C92D6005254372D8081BE322CCEAD06CDD472CC5A481EE385096A5B8CE64B57781CBFC4457E917162DA007BD7BAD8E3803E05B08876842D9E6A0A545407A5067EDE3510CCC4478C040310AAF46051454D855D1A5521E2514AF676846650E0043BEBF453E7488B6DB8AAEFCC16E26A75C52BC0EF3C80DA3BB39F73B9852B54D9C606363438C45DAC4FF1A1913D81B9A80544177BA7DB6503A04A5405299F80A83FB7135FDE04F8CECC0962461C0E80298D219531C9CBF00A3BB5B84908B5A807739A63485128512C0478084C8964F9064CD4514CE92C30454AC25B48919B719C5A853010A2EB712B80975660456562C4C448C39162CA63AED14AF7F28875149857F9B8965BC1D04CB8EE2E67C14A493A3822FCD0A2DBA2677E719B8F2C8BD09431B82BA56007584BEEACAA1F081D244B0D771BDB0C8033B18CA9597443FF8CDF754569DCC2DC4D4C212E2BBEE88925CE73034E19167CC7AC46059CD3B9EBBF6BC3A476F08438C61971AF139A248821002480F42C2B9C0979AD3BC6868565CA3FCBC124A7548D53F56B51C9F8AA387B59B07638C7AA45704420B3C24642035A7884CB42F877260C29697809AA7482E3FC356D8CA061C1C443CF24C4535BDECCB02C3E3B8B1D90E5B47BD11615CAF849DA5811AA743B9BD7810C470187E81AF9BDB4D1307303F615ACE2A58E7ECB3BE260E9F7C1E10EB3A84F207D2E75A30C7C741EA45FB04A9473C1425F80A9186A7F2625EA6ABB4AAEA3BB50602DF23ACF8E452CC01A909EC9034ACB47B969D904213F0A79EDB7766D0290005C954A1DA0155F7318BE854FDB038D019C1904B714F0514AC331C3813BD703B45076365BE4B47EC510A9F585907BC0F461A6BEFE13A2667593E12134A86AC139777A50CCDAD16B6891A0871621B387684B5226368400164B29109328F672CADADF7648377CD11C9232094165BB1CF12F694F940C3CD784C84925BA74C8A49DC27CDA4C553C85334A860A8A55D8A75969977AD1F505B9B20CEECEB24A262C707843310F39434390EA5315A67491F0592BF722A1C2658C8A720991B26561E14B178C3A1028003CAB8B69F60828F47B876D43D3F193C3820804068A5CAE76DC3F27F5F1323E6A2797B9A13C86713A83BA9C161899CF295CFB4A4AA443F32D16B72616A0DB4D3849FC41A7A6BA87F4AF757A0AB1956518F0C1D832AF7B7282D8BD81A2237107EE60D81E28EB64D6A153AE0EAA1A25797C284EF52DB5EAA6DF8EC3A0BC5FFA730DB0DDE8C5F38F266D5C680A78D264A7B96 +ct = 7E2B3F001C83AFB604595634A841E0D71327502B46D289E4D5DD27ABBD0400206BC1CC315DAE0F8F9BB8C69676B5FD0DFAD5DD4D05609B5AC327F77EECED6D72139E4529574CBE4EFC1A796033DCE9DFF2436E18A627FF4B30748002AA858BF6B9F12ACCCA22088B727D74C1C3EF565956ED029B661FFAC19F00C54CDDE3D86EB59725EF82FAA2AB55BF3ABF0789E037CB95F233E93C7B73471EDCAC5CA8D5D94968EEC87E0D9CEA8F2ED79C3BFD8456FBB1727E576371264B22334CA4492D0EAE431AD6AEA4524F22C08F8C3928B703D7D7C23481622968AD7CC52D10E38F0B164C45F3742238555806283C1D781E8714030BF60D3CF414D00FA1C46F5528DB038618E918E98A6A36D7C092575E1EC5A6961485368147A38F52BEA70089244EE06DA2A814F0478299AE34896089EE6A7A2701512443E492E9FCFDE204B45965CCE878355E23A670779B140DEB556DBAC7448CAE69A90BF2359F8D6A8023233BFF39C195B16754CD1A43567B449742E643F16BADD4907922F9C7E3B333AE55F2B28D3FF896E83AD412ACE77AA18D76A50FFD417BBF2F5CAB1E23AE417E855F697E4937E988C0040DEA224BF0F99D3521252A4F8EA00F1311ADF4A61706610BB2A84D761A294806B03DE026096681A0D249BFFF4226F1CEE5164C3D54180E7123D2069663505014B0B445CC0ABF27AB73209E89A1FDE1BFC0229A6D2E9FCD9562B7BDC5D4E63A7955EA8CC5BB8FC0C2AA23E1D576269E4CC0696DF1A404BB9E6821BF0B541E1BC2EB643691EE390E662A8A8AF177DA61720336183CFE8B5963EFFBFB97CF9A12DF2B6FE59A613E693D25A672FFE633575D5A2E5B6F97C122D7E1823A299DC87956C0CC6E35F055BA9F08916E163D3D0609EF7225C9C507B8C3021A6FEDE3E48DF94B21E235A38A6A506C9436EB83B19B33EAD5649012CC3EB866493965E55B09024910DF0E45962E46C33DBFC7E1F7B854BB30197BEBE2956108F67243D52DAAEDF84AA65AF71373B8BFE221C70EF833ED27B2CAA2FA744B322A4AA7EDC1854ECB932BC4008A284F4C06EB87592068123E6A137F4D5FC216DE6B17C5C6F9819928C9ACB9E9054B101C320DF769B12D9ED4E0D1579781B91F9C97D2D55C34CF4309C33E26D7D616A3B52E3D3C59938BCF11F6BCD70FB420A6590A4BE120630ECD6C2368BCFD7632B522854947C0251ED4906BA4BDA3292019F1730A17003802A43562469E6EAA1C23E41CF88D2FE7AE803E4FBE44968EEBD1B714E25DA525349E941EB7B651AA391596E47AD9F3E298D1A748348FB6A322716DF3A027050501E5ADFAF41FCAC0D5F22AC5360A049F3638B0C90FF249FF1A6A1208BAA375DD19E79A6DCFC33BD9920D854C8EB12AD4C8806E3DE032A3751F005F59377D51D5E70012D318D553AF10162674DDCB19F11C1A9C07DFB948C700EC50F87802A9A18C8FCD5239CA762350CF436AC84CF467003035638D9D8B9B145F2D7F35BEE3BD00C59D6119B634111E1896DE86F5FBF359E9C86BACD73F9F432ABBBA +ss = 71156980B8970FED7F2213594630CA825EA8EADE58CC8225DF8111460412B762 + +count = 7 +seed = AEFB28FDD34E0AB403A703B535296E3A545CA479C1D8148E2D501B3C8DD8B1034BD986F13F1A7B4671BE769359FD2AAB +pk = 89C28969078E11664CA1554ECA81B9542BAE2EA8CC12B44E81B3354818141AF0B494543D4674160A086F7E8755A87258E7E6A6AEB96955286924B42636E04583F74184133D8ACB9067925F4969642F274085F70FC12361FF96C3130B143E23797F2A3A6CC757C97454CC8AA5D9C062F9254F4CC7335B44CB66DC712B4677C290CCBBA08CFC3948C535BE29F44736A23B4C8CCB3978404E419A08A67AA555BECB48BCC161CBC5492B55E3498E74BB515C28A7A44A3AFA0148EC3411D82A1AE103513074A13938A5FC17DFABAD006D90455B4B5E45079D7BBE956C7A18A8BEC9A64C1DB72544CB00C6997D545AC7E3BC5C6565885536AF486417E728CC99C78CFA12A1F7697F1AD26EFEB7262800AC4E0121E766AA9BF0A74AE635074C62FB6CA79975761419B12A985ED7A2C8788C9020462FB5764C087681BE1595A5EA4EE7234AA2D22F4119B559A536E0DA0E8D0B2E493C2B5BD576459994ACD684A81A0955684818E1B88E348446A22C9143A4EEFC7D8EC678624763D4548FE2451F078582C93C986B0417E1AABABDD76DC0532E252B59E47370E81951EF75AD48C223316A40237152E3508EC164C7375594F73B5F0483C560F52F250AAEF28431E9D1B2B9DC650D2371BBB7C8360C72369755BD8696FC5C83FCA76A7FC02EFF54CA60579CAEF6341385AEEE34C7182445BFDB549BC59F70B76368DA88D47386F75968ABA093E8F42DD3C7CD68C8028A90CB0C93CB44D42EF9D15E6CA978ED5B88914C4E20768028F2C927A33433D33C5E6A45A6C5AE8C252A83E68EC121347B025865F26912B89A9DA7472B75B9ABA75581852B97D27EA7C9C5C7E8BEBC0094C01947F43A2C6501C97E43231310167ECCBC4C3A2022839584A12AD5B51B4CD308C94302E58C70EFF7B24FAA051CF548B5A73AB4254179EAA038EC95D4D4182D2971084CB33A6CA1106076DFA76EC0C4B3BB5C7266A481001CAD07D12051A77E31603BF47C62DBF959C89774587111DB1B038AE834E0A08C27F2B772A967179A9BADA1AC12BCB8FD3B06CA44B3F11A6762AB51A9A0B67FB83DEF8C9A712A1469B719F2557E5A03C6BAC808D0E0AA304955A3E961618920D0BC2347C74AD6725A9A855D1D8456D2C26ADDD849E59B7CE7C85765064ED6D63039E368E9F18D4FA11E16F8CC88BB3FFB40B4C6269996DA8A6B5586365292B5B1C78BF4161C171E2FC7A6A8293A96D61D683275EAFCADFED74473E30A1026809076A1025398B745BE723A78E008C85B558D2B76392F5015D1024C171C0FC6C7C0C0E631BEF57166E660269231C3216FB08B6CFF0A420AA413EC1285B7B5AE9FBB15F9FA6B8AF29EC061996A7612DE524C7E0724766BB51E1264AB50C3A095815645B1D1021060B90C96555E8A001044D16CFFD7719858065EFCA6C2654EA25506F0541FAE242DBB154E420C0DD4E13A79053B431B7C00768BF0F781810A0832A2B814C5517AA1A0949523E12AA35893912256A7370BCD9FAA30788B631B87731CC5C831A26E8F48AD7CF9C935301AA8CB006AC59FD2EA5BDC1736B2A5523FF3C4D8F429DC037292E863A087BB29CC2732BA30BF11490DBB1F3ADB3448D6110A774B25D242602C250999CE69D1B32AD3702602E6D28FDACDBD2A03546764C4FC1C62C0EFB3462C7C88AB8D94E20B +sk = 0FCBAC2FD83A9EEACE0215C784E20260F0991B225897E94ECF93368B79565B478731537EAC74550CD599D5268E03A25CF327606686AB8864677907A3C3555018B478FBE125498652D5259A31C2B4649C14C89BBC5758A9B53C64E95BC9CE30C306372D431CBC642C0D60E25136C3919F3BB48B280B9D5CA0B21BB4E1510AC49AABDF02C9FD66420B475D0731918A4A5D3C7A963A468FB7A86C128988EC36C34F475F2B87791F5604863BA6DCA297EE29238BA79EEEC5096E9B336CF0B24DBCC9FEB8BFD77AC888554472D7732E7492C231302A073680C684870B86A05592355BAF2620B51DDC7B17C9328D7A74DA6367D9EC2B87E9221C297B5398CFB55C10E8A68323AABBED806C2272C192FB180E7A5B958A02DCA5C55654A43C74216B192522BC2A2DC05BF865062CF56839831EBB837A3ED8C7368C15933730667B7463AB7026848BC9BA14616B2E88E17ACA4109B5DB56510B408465523307619FCA752919B947EB40E5E8C19A7B4A9099734D648DAAC8C81C1C628C895400E245DF8A324899273EFB441B564305EC48AB305C69D37E846AC9B77A2917915E82286DDB397936769BE7E37FA7F27A003090C7F2B9B395A41370B5A38C07C2D8314627267FA06BFC416D8AC1155DF645C6150BEE70C4CAD8C6A5C564BA2571C9BC9BFAF0C2D12578C8198D49E1414CBA5749D712556A537A4131F3F085F9047735482E23342B218101AD30122113060CCA4196F778C77CAD2EE58B6F23071A85B79C1215F0A7C8745ABCDB768C3C26042D09A9A0355A5C45745D1ACF52C205B949ACF581AB75CAC74F2364406A43A74269645166FE167642900D169A1E84929DA4CB361E80C42DC702A79364F1D664528B6CEC667BF230078AF06A0B48466DC90B34EA7101512E37D8BA3A351D7023AEE652351AE514B8D217FAF09A07654B0CBA1850041D7206CECB05C8F6703F762C97DBF82255DAAFCC3608E8891E3AD8B3D4E18DBCF6A1C2E74CDEB87D15236D70943DAA722481692890A548D7C69A14FCC1155202CA4941C3900B57A452F281091A94781C64A9583C8D302C21484CC6159B88A931AEDC4291E097982EEB0528C152A43B97DEA2A0B36922FC60C226B61068C792F377B9F655940D73702D41BC515086E8F9266C53A4C15A35907CB2FC2A2F19BC5F974034677A33B648322CC9BFCC6B947B5346DF2044249623E53430895295327C9B35F59ECD4A9521F4B93A4C031A624C12F40BA17B9F36908E462B928AD452EC74B84F9B5C1C69660038C85D6743F8A5A65B3787B5640D683B7A45009A1EFCB5E50A35244C9431F21F1B6826311673832CCBC1794FEA917268F5323726698F67BDB41BCC012218929649C972149393845DCBAC7FB58582964405D4ADEB814037A39E512C3FCF72A22AB70E21FBA3822B493DF9983866412F0439E1A613914042C982739031949B2780D8133E13E632FC4281DE567A333C5D8AD458B848CCD65BC87A8B6B29134556A6780EB7B02E4437AE69C09E304210D5CCE3CA3DFEF261A809BC5DC44787A20AFFF49F3E0156E7B428AE1CBD3292C9D818844D4767342708E4016EB9BB0F7099876C26729F443E7CB3B9666441DBA01C8397953F586E3DA45789C28969078E11664CA1554ECA81B9542BAE2EA8CC12B44E81B3354818141AF0B494543D4674160A086F7E8755A87258E7E6A6AEB96955286924B42636E04583F74184133D8ACB9067925F4969642F274085F70FC12361FF96C3130B143E23797F2A3A6CC757C97454CC8AA5D9C062F9254F4CC7335B44CB66DC712B4677C290CCBBA08CFC3948C535BE29F44736A23B4C8CCB3978404E419A08A67AA555BECB48BCC161CBC5492B55E3498E74BB515C28A7A44A3AFA0148EC3411D82A1AE103513074A13938A5FC17DFABAD006D90455B4B5E45079D7BBE956C7A18A8BEC9A64C1DB72544CB00C6997D545AC7E3BC5C6565885536AF486417E728CC99C78CFA12A1F7697F1AD26EFEB7262800AC4E0121E766AA9BF0A74AE635074C62FB6CA79975761419B12A985ED7A2C8788C9020462FB5764C087681BE1595A5EA4EE7234AA2D22F4119B559A536E0DA0E8D0B2E493C2B5BD576459994ACD684A81A0955684818E1B88E348446A22C9143A4EEFC7D8EC678624763D4548FE2451F078582C93C986B0417E1AABABDD76DC0532E252B59E47370E81951EF75AD48C223316A40237152E3508EC164C7375594F73B5F0483C560F52F250AAEF28431E9D1B2B9DC650D2371BBB7C8360C72369755BD8696FC5C83FCA76A7FC02EFF54CA60579CAEF6341385AEEE34C7182445BFDB549BC59F70B76368DA88D47386F75968ABA093E8F42DD3C7CD68C8028A90CB0C93CB44D42EF9D15E6CA978ED5B88914C4E20768028F2C927A33433D33C5E6A45A6C5AE8C252A83E68EC121347B025865F26912B89A9DA7472B75B9ABA75581852B97D27EA7C9C5C7E8BEBC0094C01947F43A2C6501C97E43231310167ECCBC4C3A2022839584A12AD5B51B4CD308C94302E58C70EFF7B24FAA051CF548B5A73AB4254179EAA038EC95D4D4182D2971084CB33A6CA1106076DFA76EC0C4B3BB5C7266A481001CAD07D12051A77E31603BF47C62DBF959C89774587111DB1B038AE834E0A08C27F2B772A967179A9BADA1AC12BCB8FD3B06CA44B3F11A6762AB51A9A0B67FB83DEF8C9A712A1469B719F2557E5A03C6BAC808D0E0AA304955A3E961618920D0BC2347C74AD6725A9A855D1D8456D2C26ADDD849E59B7CE7C85765064ED6D63039E368E9F18D4FA11E16F8CC88BB3FFB40B4C6269996DA8A6B5586365292B5B1C78BF4161C171E2FC7A6A8293A96D61D683275EAFCADFED74473E30A1026809076A1025398B745BE723A78E008C85B558D2B76392F5015D1024C171C0FC6C7C0C0E631BEF57166E660269231C3216FB08B6CFF0A420AA413EC1285B7B5AE9FBB15F9FA6B8AF29EC061996A7612DE524C7E0724766BB51E1264AB50C3A095815645B1D1021060B90C96555E8A001044D16CFFD7719858065EFCA6C2654EA25506F0541FAE242DBB154E420C0DD4E13A79053B431B7C00768BF0F781810A0832A2B814C5517AA1A0949523E12AA35893912256A7370BCD9FAA30788B631B87731CC5C831A26E8F48AD7CF9C935301AA8CB006AC59FD2EA5BDC1736B2A5523FF3C4D8F429DC037292E863A087BB29CC2732BA30BF11490DBB1F3ADB3448D6110A774B25D242602C250999CE69D1B32AD3702602E6D28FDACDBD2A03546764C4FC1C62C0EFB3462C7C88AB8D94E20B2B757AC0425152BEF72ED852AB1EB44F4359499407BB6A020FF843A31657C5FE99DAF37400CFE59841AFC412EC97F2929DC84A6F3C36F378EE84CE3E46CD1209 +ct = 269412479F44C884A094A5B259F76D28CDCA0361BA64C402491F98789F0D46B7E31E7E93B17E8931AA3F83E3D6B6DF59B1DEC49C1532EFACC9718247529E38856FC982E92AF949AE1BDEDA805E8C43E05D2D8C305E2A753F322098483616C9D48568BB341C3818A7316EE7D19145238C38CD3E04DC1CC6E7934783D3979C0827D0BFA69E5BF8F8A8F3B0299090F7468E1094DDDB0A231E5A516AE2F38275D2F125F850D7B3C6137F0DA50BF680F13BD7F001E978A54C06BFECE1401039215753BEBCCF7B1B99F219E4D562E235BF48976CC59F3A3AB470ECC89B426787AD39C326CFC2E53DDD55FE02D0863C0F9BF1B1E1EF0D397990F9C13A6993D63E140A7F936B8048DECC487576DF2722A00335ED4C620452188C5FE9356169D8C48EAB7E2AC66471A7E35BED338DEA11333B190DA230D8A8063CE734D208141C9EF622F30E5CBC1424488B708F955B5FD1A0E613580BBA1866C1A027CFB83DEF2CC92063693EAAF7C087ADCBAED63F891E2A9CB295659E2B72B0C3CE8C6DB44B9DEC84A0AE491D07DBEBF355C4C05FD2940B30774DDAB5E0E448245D39E13634C1B49450B0E77F9F22F76C053884882C4F32B34748140A4A3DC3A296E6577F84CD047563067ACBB315961278D667E6FB67325F3987A37149F463F2F43416DADC28679A0EB3F1D20C36AF04DA09384DA537AAD03BDD880AD06A606CA720A42C4034801E5DCA8E250140B3C09B9F7EE28E242915E8B23C936529CEBE9C887095B5AD25798C10B474E4D2D682E3C5E7C83CB2B4ADE983AF27636A9C2882DE397DBAF486EFB4464D19F72AA8C6436EC561F9387E4B44B9831405B2462D8293A954688804E2BC620BF767CA7468F5A0431C4A871D521C416A36C8C0039D02CAA91A633838B83B6AE7879E2E9EACA55C1792D9DC0C098B243406A773B79BD7AE46A377341766A1FB173D38A32AF97C75F395248402899ECB0AE883A6E96EC34677E8B14293E8E5F67CF4ED94D4A7EF45B7C3DF12647D3D9DF00A6FCEF8221050E861D539A86438D7694474449DA409589205A7B513C434B95563AEE108FFACDCCD8CD54505F55E086BC615D15328BA7E72C81737E1A2E8B6DC14746B21CAD2273818CCFAA1C9B01B22D347554533FAF1524BCB2AE638DFDE9955F74CCA13A9FF82FD9EADC556704626214E2C928DB464CE895819A4A12D4C4317FB840E8444EABA4C412805D63AD74EDDE6F7A9770FE679FBB028485F210725D0DB99EB221AB67F60EDE0C6EFF26B914B7D887A97F80C752C0035D632D903D2D7351EBFD0B07B50935AC4054787D83B2B98E23C1C8E03E6284B83569C177194FC2B85E9A2FF15FCCB4CCB66D7AA53DE89167036DF23E4DCEB6113407E6C14DF4847ADFAC1628464327F59A37DD26D60E433D4DAA8BFE4124F225E339D91CB9D2A57FCB5968488C29514CCED169E8DABB400B26EC2377D0EA71C1FB3958E4927EDE45DFCB024AD7C16550C69187FBF6DFD055322725160F8C32D8F48DE48E0A52872058A7C6B380510E028260CAE +ss = EFF5E4CE44FE0D0B77CF8109D46C8A888399D1608AD9E2248181BD205A0B23D9 + +count = 8 +seed = CBE5161E8DE02DDA7DE204AEB0FBB4CA81344BA8C30FE357A4664E5D2988A03B64184D7DC69F8D367550E5FEA0876D41 +pk = 764B51D1DABF923518DE898C5E7CB5E0066FD69522F5889DC05C41A472C983583333132052A1C93A464120B325764B8665CA42555B98D8D6A93C88A0A383AB51280F52873F2BE26E12C131677027C616711D478342CB424B0463C88161ED84BF6E869ABE9CB915D13534D2756DD72343359E9911624DC7C6E828B19D6CB178C43A5CEB9360D2939DF2744ACCB4DFE8AA5ECA35BF87C6BA265FB4AB7C4888516EC91E52C4030F5453E6BC9103B9C19CD83E69048272855B11B8AF3EDC09B04AB31179BEE59ABC76726FBE9612D271B7010844F62535F2F30D8417C35F17C1619B055FAB6A0F5458568C753310299FCB335A7697E7CBC9B9EB1B14AC2D0DDB765B266B6D68BDB5B0236895328540B20F91BBD2910625E674B33A4F8B6C1B4F66C4130C2E973AB72D809282CA63EDAB71268C02A9D020BFC805410AAE2DD4B699448A56049D1E9A58C5FC2ABE159DEC69C5027099A3B57D3A2560CE24A6F5017D32E00F3078B792309384421878CCA555B7065D57537C804E10BAC052788769B7C1121A78911A153FB56A365A2F97B070D7B61724D0C4D14C295D78BE57A8AADB873D3AF6B74D020B8654CF48543DE8CA22371A48DED585B7073ECEE0C44EEC27C85B5A68F6B454B0CB10692039CC68EC2C2BF892804520C71BE5B7BADB807B4059A3D87D32548BA3E4B698CA150D784A8C2C35A67A8C92C68AC0037888B65A4C9800BA7A1EC050627AF648FB61C87CC55B8243545AA514CBC550A8804C8598CD35786EB8C6B06077A1E2D4344E4A6BAA789C305B6326E0BBD4402DBE26CEC08A7C1A19457BC2677F15B984A74FBC52CDCE48618D50C47400011B392908AC2CF08A579783A80FB2990CEA90EEE90B7DD81E6CC9C961372D8C720D7EB223D5A6A16D4571C1A93213B32289934F7B30A63527C6399920086940B7696503E623E63A050F4B69810B6E6F6729E5782B572221F596A09A1879BBB46A62A955043A30A2AA3E62E02CE1AB6F3D03693A8CB653E361D8783FFA37274AE06A3F2292F1A6557182006E493FF2653437A64DBEA950BF6A8CA8836407FB489D42A6F6257770310F28715BC6411C81486CEF3CB9AB500558F070F4A15817F8C177D63CAFB176CAF3B2B1CB7B7254C18FE15111FCAB9E9A9682F41C9FD247EC532CCEF514860A3FED330255323DAFE46EED198041D732538C9424D43FE2F5481650470F08906791B2BFE65A445BB26AC87D9BD04AA648A54DC13A137B60E5C2779FE4B5A866620DC2829D42384AEA9AB1552FCA920F8929B7BAA059DEA53E6A5B3E492A6E45B5AE11F6AD24D035D4246A0CD53436687A0204A1DE29AAD2C8B53AD4B938A57C2E29555219544FF64115CBA2668B54C6EA8779146980B58A2E669124A81ED4420C87B0601DE23E3CCBA915FAAD0C2B47EF6238DBA9449274C64CCCCD85E91712470E8F9A2866720059A8501C7762C0883CF9827BFD62BDC0882EE03B457BE2B2794B8BECF74EC0DA4684282200A294C13C8A9FF376C1187911121BDD886F27514846F740B72AAD5544CBD97A7E208635480ACDDF404FC067C82A45B5C97829F06ABCA5201429E9A516F66E65D07075CBC0C60C2A9734BAADD68F421617FBF9515B569FD08BF3AEF948095DE1AFE74BBC3BDBB45FD8F92EDDBF0C682C81A98F930F6165 +sk = A5C7981510819EA27D27A945A0F6619D730DD196B6F3A158A4C48ACFB82D1C348540160B0CC665C43C4C0E4567B46867CED06D2CF228D0B64706227593DB7392395B7EA95360105C1BB05472787430654AA03B6E894C2ADD2A0467EA51B9486F3DF18274C0A2079459DF3B9AEAB15D203B466EA426911572251B0C8FB51A31AA142BDC4142E393D3C527C841A03F796E0CF7CC71DACB47456FDD386527BCCF6E43013EEB755924A22E3A55F74A8974B38E06908349FB3DA5887D1A041C8ACC6F07A75198462353942267D7600D5243095BB012D2A70BE0A3FB2BB599832F8AA68652846BA501BAB3AA574AD08BC991C8B86717B87A45041657D0264F35F0C2B70324EAC43D591202CFDB9A7D357489F70F86D6308D3382CF9139106CB28D947AE3BC389EF18B728C1568436B3EF80644009A80F01EF550C794011E44F2812EF507BD55820A872B90E797626B8EF2D94012B4CF639BC5C8A7B87306753F93CB12E46A66C4B2053C037B87C51436CC83B884F7634A6950C419684AF3B78D41006467105F753194144539DF45AC7FA46E71815F53D2304B474A434B02517B083B058AED078DCF86746313BD8108148EA34658613560CA722A126DDA147AF8C5733705BC8343331BACC5B5B80E424CCF6114955056329A68A2A6403D65197C21DA02A390C41EF713A814A798A434145B9E3A5C31A9614CDAC8A8BCAB6B5274490F5C45B2A307F492C28FF40EE39C2068A5826E8466542559E9409FF11B463E9A4EBA0A2172EC8EA6332D3A5BB66531B670C52CC2F8B651B513E60A9E64795369E0C2CF56A9921669299B6B5399537E112AC358112810ABC6945BDE69AADA92552A10219A630E26E4AC7D9B5C7469A960AC64A6D127971296C53A15DF4C847D061E69CC030B9CABC6E58903C5ADC88882CAC147F2888263ECB6AE97A9B2AA245F131E2E2939F5C8BB8FFC012CB578B9BABF90DB062502B1923CA88B35C424FC6524128FD1D7B5CA719F5A9A538A51A97ABABCE07B006EB701AD8490B74462F93648FC39A2004DB6E951B4C8219CE49395891594353B92B6B496D09376FB28711D87221851A5FDAB80CC52A6352C062F06C80F891DA2A07573B42BF0F6CD5D6B63FD4B1C5BF2572FC8460385A642E6290FB79A9B1CB18CBCB34BD87F7EB595F0598C67709D72011FBDD07A0EB6616A88B8E33571BFA7597BE4CBD6976B93E32C2C088DE3AB59DCF2234E553A5B2AB143C46DF13211E816AED6D02BF6C13FA7F8B282237F249AAEDBD3A6FE8771014C1B811C05FE86102C0B0E7E9B961C1000C82408D8A8AA381552920803418C49E1662C7ED8C3D35763C510585A78664EA0012A8A02F34B2BD7E96EE5C298DC296537C985577CAC3E310568353EC2CA8EEAB4BB1EE2393D5B3CDD25305B148FD8AB11F60B5871E9C9359A46A5DA003E98B61D82C51CD9262764301C86268DB87FA6273F9FA3C35B1C1FD822AAF2F74EDF73AB5AF9175070BDD7D5CC7600A516726C3E49348D138D19836391A54954AC4A0C029B1441C37965422019C2CA49CFCA81317A211E22EA2297B865DA163A0AE2A9DC25701E71847A05754CB733620A824F090D591C51C345420E226B8F3B846FD356E78B87764B51D1DABF923518DE898C5E7CB5E0066FD69522F5889DC05C41A472C983583333132052A1C93A464120B325764B8665CA42555B98D8D6A93C88A0A383AB51280F52873F2BE26E12C131677027C616711D478342CB424B0463C88161ED84BF6E869ABE9CB915D13534D2756DD72343359E9911624DC7C6E828B19D6CB178C43A5CEB9360D2939DF2744ACCB4DFE8AA5ECA35BF87C6BA265FB4AB7C4888516EC91E52C4030F5453E6BC9103B9C19CD83E69048272855B11B8AF3EDC09B04AB31179BEE59ABC76726FBE9612D271B7010844F62535F2F30D8417C35F17C1619B055FAB6A0F5458568C753310299FCB335A7697E7CBC9B9EB1B14AC2D0DDB765B266B6D68BDB5B0236895328540B20F91BBD2910625E674B33A4F8B6C1B4F66C4130C2E973AB72D809282CA63EDAB71268C02A9D020BFC805410AAE2DD4B699448A56049D1E9A58C5FC2ABE159DEC69C5027099A3B57D3A2560CE24A6F5017D32E00F3078B792309384421878CCA555B7065D57537C804E10BAC052788769B7C1121A78911A153FB56A365A2F97B070D7B61724D0C4D14C295D78BE57A8AADB873D3AF6B74D020B8654CF48543DE8CA22371A48DED585B7073ECEE0C44EEC27C85B5A68F6B454B0CB10692039CC68EC2C2BF892804520C71BE5B7BADB807B4059A3D87D32548BA3E4B698CA150D784A8C2C35A67A8C92C68AC0037888B65A4C9800BA7A1EC050627AF648FB61C87CC55B8243545AA514CBC550A8804C8598CD35786EB8C6B06077A1E2D4344E4A6BAA789C305B6326E0BBD4402DBE26CEC08A7C1A19457BC2677F15B984A74FBC52CDCE48618D50C47400011B392908AC2CF08A579783A80FB2990CEA90EEE90B7DD81E6CC9C961372D8C720D7EB223D5A6A16D4571C1A93213B32289934F7B30A63527C6399920086940B7696503E623E63A050F4B69810B6E6F6729E5782B572221F596A09A1879BBB46A62A955043A30A2AA3E62E02CE1AB6F3D03693A8CB653E361D8783FFA37274AE06A3F2292F1A6557182006E493FF2653437A64DBEA950BF6A8CA8836407FB489D42A6F6257770310F28715BC6411C81486CEF3CB9AB500558F070F4A15817F8C177D63CAFB176CAF3B2B1CB7B7254C18FE15111FCAB9E9A9682F41C9FD247EC532CCEF514860A3FED330255323DAFE46EED198041D732538C9424D43FE2F5481650470F08906791B2BFE65A445BB26AC87D9BD04AA648A54DC13A137B60E5C2779FE4B5A866620DC2829D42384AEA9AB1552FCA920F8929B7BAA059DEA53E6A5B3E492A6E45B5AE11F6AD24D035D4246A0CD53436687A0204A1DE29AAD2C8B53AD4B938A57C2E29555219544FF64115CBA2668B54C6EA8779146980B58A2E669124A81ED4420C87B0601DE23E3CCBA915FAAD0C2B47EF6238DBA9449274C64CCCCD85E91712470E8F9A2866720059A8501C7762C0883CF9827BFD62BDC0882EE03B457BE2B2794B8BECF74EC0DA4684282200A294C13C8A9FF376C1187911121BDD886F27514846F740B72AAD5544CBD97A7E208635480ACDDF404FC067C82A45B5C97829F06ABCA5201429E9A516F66E65D07075CBC0C60C2A9734BAADD68F421617FBF9515B569FD08BF3AEF948095DE1AFE74BBC3BDBB45FD8F92EDDBF0C682C81A98F930F616553B9D62E64F9069D9FB94EA2C0806459B201531F4FDDD708D162981CC1FB3757DA1804DDB5AA9B1C6A47A98F8505A49BAE2AFFDE5FE75E69E828E546A6771004 +ct = 106849C5DA689EF3A848336B4AB6542F621C0B9B5E8C5AC0B06D3BDD7336EFFB87DAF2DB0ABA609ACB904FB291FFF9B6CA74BCFDBF7C563B16C0553E608E8D094B8C195BCD2B2D58FE731D4A4660F4743DFF2A16267490F7F00AF42946D0981C7AC0394AC78A44EA1D4CE07751E064A27D8B223ED37A2AE3B74E831CD66855545AB08B7D28473A031A33BD606F0DEABBB62A06812CA11D9D1C33A70C5D214F42BA16C5CCF7D0E9F2B23C76F4E9ECD8D9D80CA64BD04E473A308539570D5959937D0B7670D8554D82AC97E8A0AE8497FFAE014DDBB6A138B37C08B75E8110F2F9BD372153CDAAF3379E88070C16F177D96CB115E14863C098AB2B3B207FECB96122ACDBD207FCEFDEF90AB813AC6D5E1362903875D5B6DA35276069C5C0D3BF1F0261AEF6719EE0861B3E2C5938DDE47860352D02E354C363CAC9D0CD944BAC7C61000BA976B20516998672EBA11E68785C8B8603C1BECDACC1DB883430DEB8501638959D489D8F51BA28BD299BCD46E9188031A906C06D0F54873A8D065900822372D46C9365CE129173201FF301AA423EA13D35896D8CE6491B7BE61190A803F9C53847C22205D011504E1B4C4E98EA395DAC99193B9F44273EC4E0F4CD6468371CABC76708831DE5201ACDE1C5A3A10F51BF5F986E038F26471A1FDC7803762EE240994CFA3C2E9A5C12C4954FEEDDBF49EA264645BAD8BEBC1FF536B02BB4207F2FD1B2E70B3FBB6C23CBDA0DEDACBB1F090E5CDD5210B650990E862F0A6AB2625871FF91650D09D7EA4DA7DBF6CB166AEED23AEE7ADF2379267C708FC5D22BD2C12F22B3B944E04A79C10FFF474A982B6CBF699DECE2104DEC8EA7F6B4D9E486CBD748CD9CE83E76F3F05111753F021D1629D62CD16B0FC4A39128B8B398179F1B33D94017DBDCEA084A9508AABEAE589E6365D48111E849D1656560D13844FC4AD7A2D0157E706B0BDEA00D60240DF2C5D70C223162241EEA92CCA23969CBFB3BE7BA4FD278D831EDD8DC941F74D21E7B296456303D82D4B3E6E5058220804158E23EACA8068354676B94577505D6414A27DE9FA178AE851346FE3254A5F9490917ADB080F332C2F9169D313DAAB26C034502E311685CD57EB66277685EC7AD6C5D53A02909128A348E097F5E0F7B75A7622B88818F8971C0840FA7592D245E32ED9B4A958370EAA14010A0BD92D28220E0F9CD7EFB0C0A296C46DEA9819C6AD0861164C39E7BF6F1B7AFB0DF2D290E233A30B1D6C27B74D2A4F4DD6B3953ADA3A7C0E4E3A4F4F07DDF2DB4F7460204761F717FD5C69F156C15E8206E93CEB426FE89FDEB4282BFE746F50D0B4BF9E5950CE8F03ABAB8B211BC619F580678EBBF9AEB439578BD3F9ABCB44F2C53B7B84495C876B2E1911F9F1ABFAD34122B8B7B660F5D2E84DE2AC504A59AF5E0C722A9265B83B8440B73B9CD130576F3EAE5525F757E23396A755619349E5B168EF891BD742367FF2EE5C5628245E7FC0D0D03FADCF651B4AA7C33C69C3E1F580DECDFE50263200D5085E0D8F19C2AB6 +ss = 25C35F5858D03291C0132C970E6E072D8A7B33419B984B391A12891F878D981F + +count = 9 +seed = B4663A7A9883386A2AE4CBD93787E247BF26087E3826D1B8DBEB679E49C0BB286E114F0E9F42F61F63DEC42B4F974846 +pk = 5A1278BF11B37FBAB1DB212359473012F3B545301DDC833C69A75AFE16744557B5E28BC0EE895DA16C2C5DD34FE6783949D555E580C1BE7994BB008DAF27A47F554932B87222E82EC670490CA5139FF49D5ED896218825056A8639B31D3AC8550356A408A01404C6AA9C2B7284E7C7C27036256B7902445DDE00630D81930F4CCC518B9EFD8AB24FC16A365B8068C90F7E09BBD23C2A6AB12792D245551A9894F704042501C8FC49EEAA0132701E29A3C97834530A7C61F1B8440822CD1BB6B11DCA2A5951B4DEB0B1268C2F5AA8CF76A6BD0BE3013A37CA1A903AC634405ECB3714BC54610BAA63BACF0A263D8CB018B03B0A286083998A7E8B2A573E570179712130A19F9EBC2337D43926F9C96460996CC03199D81A0E19259DA696FECCA7906931A787A5C264826099A3E03339295B587E7A4EFEC6A11AAAAB057AA8689473F1F211C6D85499C46746BB00BA687A17877E6650C678D13861337FAAA7045A16B8EB7173E7C08B6394B5F2B99EA3083BA175C55D350FD61B73AA790CA6F479FD4B01282B6BAEFA00A1946F6DFB855CE7BD50389D42856823301E01A228AC754CB65A0E323A0943B75741CB498CC499C8649B6BF87E991507194983AAD1B57994B7D79BBCF2EB3B5F8734CCF3CEA2662E95D486989144AEA22C94C363571AC7DCD81F577645CF19B313F849B422AFED963CDB701395020C2D18601A40A42429896AA9B0B1C10C4876928AEAC59862414E143722A0B94746ABD157343D15BB9FE500763B18C61B184407449B1B5BA8FB1554E4BB58AB99FAAAC9CDC3B698E64179B089B786204BF95EDA86474EE799440478348989C91C3462446724340CD2376C682907EDB58C85A4CE3EF46CC5D0CA345590AB14844B224735DC05E0E66EDE94258F395FE867AB9D8C1B0FA80743002A15DA197614295DC358F40758C9CC05E45BBC659B93ED611AA58845D94ACC7AA75DEBA56D4D83C640C252975BC3165254C92957B78C9583B370AD785F2C16CD5CB9913839939C7293E6B956E23CC5D14CB3AB2A2E94F179BB076355157920085236F60B84449D43AC89C2B46DAFA6B784438F3510BFC48357A5681043BA7428583BB5E912B08786562579DF58A41BDB82114344B3EA3574B997F8564248210D4E50AB2277100B9A5423178B1F138E9D427762253CFFC3CD095CB53A776F4FE015B5168B1A9759AC4ACC77F90C69B307192B7B866753872A69813B1BCAAB5CBB8126D8998E78D99F5A527992B89495A28E3FA83E75337CA2B896172AC244AB7E30761C8E3A00890046E5F599EEAB65BF1A4CDEB5791CC10ADE7197FB5BC754233F3B10C9BA2240ADFC61C05231C36A6CF71AA752AB3C95C3756EF9373B677105D11F86E68036348BDD181F27407E344BCD297CB02BC44F077976ED588D6A846C2F839BC9BC4872617BDC17A7BAA97AF9A9322FF015956678E8D622CFB1A11ED929F29BB1F094C17F49417C09C1C443369123CAF8701199C43BFF97034EFC6999424144C9395D9063BB153C0ED82B1C5659BFB23D4CD2C758A26B6C448525060F686BB14873CBF5046B3A3033C5C8081027BF5E3C51F6FB6A1D54A77C46B0EA4299A9DA4AB03B95F9D3601F553D46800F661E2C9A7E548CA42E385CC6A0678F9E9D268FFCE02C4B465A46773432109A75 +sk = B04C33B257B199352A85B55624F1A1A42B2AB72C4810B839B2BB2F51A502CD498AA258373EB3BD43E03973D129E4FCB61DF58986809EC4EA4333659F03DC0FAB236CD4E815D3F9524E90A28A3A0AF869735B362FED9837855429700CB815C43A6E650E54D6267A832DC0385696274E1E73A12B5960A8409A4B4564DE909B797771B4839782526FD69ABF516A73F9EB8130F41CD6103A6E67C6724186D1C709D3D90141B1BC1C028E28324DE4846BCC6837FC243C54DBA144C40FCC6223FD19B8F54C11BC0982FFD366530ABAD387946E1495A3C05D9CFBB62B28778905AB7D576610A74B3DAAC9767A051B153AF7C6BF0177A4074397BE410411CB33DDCB895091990DFB85AEE15E9F288D01EC5628034A4ADB01DA09283493BAFFD36D224B1EFE096289A2AFD427B82F8B04EA44319F4A16BB07BD21026F2EF550B919AD01CB3744B37103EB54E62400E03367001510776698E28B4FC367A77F1B4690CC2916E8CCF1FA55AA3495014724F1E66EF7CA8283D917B501C931274D9808A8103004176BB69783C094BBBBECD5B90EA14E7CDB9768498B22332283F6A079991988AC6A85BB591EF299BC57027B0CA9932A41C14C193467374F133BB8539C2D5164EF11B70B4A2CFCDACDF6841CD835C4F4E174BE3C26B55770ACF4137666A431D669FD5775A71749922C0B223ABE36284FC880C3AA2A41F45A4A299C647D6738585287F7A47B88EA1C6C088C6207646D99CEF5F56A2E02CD3EA85202C7725DFC99D04B2D52600F0F89366A3A83F8DC74E4A27FC58A622061A6332403AE8CBD0179149B841F5E0BA193EC237AC57A4CD5528C10545CB75E35A20C3CE63950C09A7B0810B84124F3A00C9EBB67BDA9B2AB42113E631123B4A85897160637A32EB856D55C2905F7C655D40C84E92E773056D2392D43E33C4F9256DBFC7AA0683802D04D218139F829AE362C1F48096FE47B09756C36873CADC5300CEA8094E6F8925C1B81ADE69FEE5420B7E94555286CDB596E08CAA81F758022B3A949059AE91AA9B78A825703CD53D1235800681DBC7657A777BC267637CA2954C09344110A05E2BB90A83F95990986FB559BB1282778933631701393B705A5C122EC3645C1B364367C83444D30FA438EB3A478A0BAE14270CD49556399085C566D9E6C467DCA66A3F36370693AD5F86A9932773AE5064E9BC73FF7979A5510C88198BEEA7EE2AA494EB046E4D70A3F9CA0F88B234F6918F7EB41DB97A327654836510276E0154E7A4DFA088B8ACC5F02F598D1494BFBD07C3132C5EF6C3B466606B3D93DA2E69C96744095435FCACC2D24C3016002B5C4B988877CCDB9233C490A8B121BA7821B529DE85E638168B0565D50F735D1CB54CBA91CFC1B9EFF882A643121E877C43B6147A2A8266196346859CE53340208253CA419276B884DBB3B7A30AC3DE983C75AD73995A0B62DE7563EC9A4A715BCDF376DFB6433DE691C54E660F4AAA4B184015026B6189415E66C90DD32C0B015AEE63B5D8B3CB9EA206E45AB4938BC86FC54C7598C6553C29AC34B2213B90AFD144C8B4629A560382778B28D666667CAAAD49633A8F985730318EB033374B5CBEBACC7F453CCD8E77C5A9ABC12DA1BC1733E5A1278BF11B37FBAB1DB212359473012F3B545301DDC833C69A75AFE16744557B5E28BC0EE895DA16C2C5DD34FE6783949D555E580C1BE7994BB008DAF27A47F554932B87222E82EC670490CA5139FF49D5ED896218825056A8639B31D3AC8550356A408A01404C6AA9C2B7284E7C7C27036256B7902445DDE00630D81930F4CCC518B9EFD8AB24FC16A365B8068C90F7E09BBD23C2A6AB12792D245551A9894F704042501C8FC49EEAA0132701E29A3C97834530A7C61F1B8440822CD1BB6B11DCA2A5951B4DEB0B1268C2F5AA8CF76A6BD0BE3013A37CA1A903AC634405ECB3714BC54610BAA63BACF0A263D8CB018B03B0A286083998A7E8B2A573E570179712130A19F9EBC2337D43926F9C96460996CC03199D81A0E19259DA696FECCA7906931A787A5C264826099A3E03339295B587E7A4EFEC6A11AAAAB057AA8689473F1F211C6D85499C46746BB00BA687A17877E6650C678D13861337FAAA7045A16B8EB7173E7C08B6394B5F2B99EA3083BA175C55D350FD61B73AA790CA6F479FD4B01282B6BAEFA00A1946F6DFB855CE7BD50389D42856823301E01A228AC754CB65A0E323A0943B75741CB498CC499C8649B6BF87E991507194983AAD1B57994B7D79BBCF2EB3B5F8734CCF3CEA2662E95D486989144AEA22C94C363571AC7DCD81F577645CF19B313F849B422AFED963CDB701395020C2D18601A40A42429896AA9B0B1C10C4876928AEAC59862414E143722A0B94746ABD157343D15BB9FE500763B18C61B184407449B1B5BA8FB1554E4BB58AB99FAAAC9CDC3B698E64179B089B786204BF95EDA86474EE799440478348989C91C3462446724340CD2376C682907EDB58C85A4CE3EF46CC5D0CA345590AB14844B224735DC05E0E66EDE94258F395FE867AB9D8C1B0FA80743002A15DA197614295DC358F40758C9CC05E45BBC659B93ED611AA58845D94ACC7AA75DEBA56D4D83C640C252975BC3165254C92957B78C9583B370AD785F2C16CD5CB9913839939C7293E6B956E23CC5D14CB3AB2A2E94F179BB076355157920085236F60B84449D43AC89C2B46DAFA6B784438F3510BFC48357A5681043BA7428583BB5E912B08786562579DF58A41BDB82114344B3EA3574B997F8564248210D4E50AB2277100B9A5423178B1F138E9D427762253CFFC3CD095CB53A776F4FE015B5168B1A9759AC4ACC77F90C69B307192B7B866753872A69813B1BCAAB5CBB8126D8998E78D99F5A527992B89495A28E3FA83E75337CA2B896172AC244AB7E30761C8E3A00890046E5F599EEAB65BF1A4CDEB5791CC10ADE7197FB5BC754233F3B10C9BA2240ADFC61C05231C36A6CF71AA752AB3C95C3756EF9373B677105D11F86E68036348BDD181F27407E344BCD297CB02BC44F077976ED588D6A846C2F839BC9BC4872617BDC17A7BAA97AF9A9322FF015956678E8D622CFB1A11ED929F29BB1F094C17F49417C09C1C443369123CAF8701199C43BFF97034EFC6999424144C9395D9063BB153C0ED82B1C5659BFB23D4CD2C758A26B6C448525060F686BB14873CBF5046B3A3033C5C8081027BF5E3C51F6FB6A1D54A77C46B0EA4299A9DA4AB03B95F9D3601F553D46800F661E2C9A7E548CA42E385CC6A0678F9E9D268FFCE02C4B465A46773432109A759CFECA12DFE978BF0B7AD7271487CF61B2B8F7C60F389F33FC18439A95BCBB6356047447B810CC094D400AB204CF9AE71E3AFA68B88586ECB6498C68AC0E51B9 +ct = FCA7E41C5BB5460CE12E4A40CFB3E7E7DBF18E2D9D386396586475AF17A830D3A738237C05105735E9B4DCA87D114F017B50484BD0381873A5F4DA24C420B6D56EFEC00891BABC52AB22554B68A0E3D3AADFED71D3BFD75FEDBF946C55EC3FE0C050C623636FD486192DDE50EBAA7D12DD8B80418FDD64A5F7979CD660090C05893E3CE334B1F489149012C00F8868BE07AA3FF50B2C255F43040DB1F603C00C5B3C5DD56DECED7B510B96B9A1B31CDEB0E5A73CBABFA0742631D816CFC2A701EA64DCC435578512073E3BC1C78D5EFC68772A971AACDC89448B1E0BCD2B558CF709A513866CD0609A4C314BECA92E894630822C324FC3AB177DFF0EC1C89C92C49292AC28859FEADEC5BF5BDF3FC8C806F2145D0E9B3E9981C40AAEDE9ECA94747EB32DA509D089FED91578E6F7B012F91521974D722416C5EE640DC2F8E46FF56077E1370270839FC131D89C22BCC4107A1CB65E6714A9503F46988EC651E222970372B462314183D54ED825ADDA32C1B807DAB5EEFA2CBF1F910E4B2532377DA539280C9808504EEC2D43F6A24623374D4A9DD50A1F3DD250BE40B20B23CD84B7F1EE317D7D937185528EE1ED4482DCD6F93CDEE40E2469853FECAD614627CA7410E690B3BD2F0736A5C5FE53B14C3DAA2A12B2790D41FBA12E39FA647823831979042878A70313B4CAF8AC0C4FF9005BBA914B636EA375D3259D21F8ACE9D3D5D963ED085FBA924EAADB6EDEC0488CA9E9A629FC3D46D987B8CBC473E8C1EA5B85E00F03AF99F8451DBBB5B8EC72AA7D91F8F6C9B4FA03965D04D2FC652F5F76991D95463EF0D79D5238ACE1A1D6A3452ED8E6A2B482F8B0AB3C9FAB41929B104B18E23F5F49616B704EE79E8B893C998A88D88BBB3A22305EFE28A9BC526D2A8DC6B4D820130F2288469D9D8DFF20673492C6C5F3AE967BFC74162DE3502BFDF498F038F34309FF4FDBFE5DF00B0E568F49562051E24FB2ACF1489615B00DAD14627F04E2BD5B63020A77B0901336A905F8BF20BA788898C4E6754E2788D80BD4B8CE013A3173B5E7EF84F63116833631FE8AC3AF8A0B47BA535C9A88F522AEE02FA077EB056D3AD2DC2A70B22E81A8A4CDB2DC27D3DC92F28024EDAAAF133BCBF691D7F5F28C48207302FD0CB11CF8C8A7EB862243A045D3AFC6FA9E64443A1E598FB6AB325DCD4CB7CDD6E24D0B970DC6667FCD9D448B30DD33BFF1924880C4C42A59F035E9C619EB00E3E0761F994ECA9EA469479CBFB6E1F18447AE8A6C0639774B428E642BB39ABCA7A6F1624A68A810F6482C1B6634EE4A6FFFACB99E28029340EF8AE8C2B456F5D73F79DD704645FBFAAA61897047F5C3297837BABFC16970B88BC1B73E33F17B3D3E8BC7980FD98CF7CE13C3944C8F0B4049E9C281709F990B45EE22628ED9DB89ACB02E01A058E6038F1417F83A4B295238123775D87141E2A5DAA476318015EA84445FDE78A40376486F4DE25B7925B0BD3A163D8785D7C50FBDD9C5038B9A6006ADF424426567AE19AD69F09C6825923BE7 +ss = F9EB1C87813C712CC3054109ACB5F219FC1E29DB10FF33D093A5CD67DF995015 + +count = 10 +seed = 980D0BA7C8F8B23D0E948A6029FF2659810EA1360064663A8994D0333C8543EE5FF5D6D5C9ACF446E61DC464F792B9D3 +pk = C4A90087866B29244C3641310E94B8311A1303465975649288713E79CA67A9085C8F7449C0BB9A6AB196245B0DA028CC1765A8BA0501D5E360CB3064E11554F3FC2914F1260509073B67B4A0570D7F708CA7C435EA987762F2A5A23CAE53907FC9DB26942136D72202D0A0BB10B65D422091ABAA1C21D152DAD59C25D20C016237634741DEF8CA26B9CCE3097FFD896F1BF08300282FCB7000C7E1956673223902AE5B43BC63B6806C469A4EBB8BD34B057B375E725B07EE856FCC0453379B96F89888D21A7BD5EC91F837B90A2C334A97AD70D87BDCC12892D588D06655F6103E033547CF5933EC237B21B2956E5921CF10A0C55A70E4A24A57B93F6FCAAB2A44BB079987EBA57223B4B9DEB60EC6464FAA4058283B8CBA6956C792AE8FF9184E93C2E2152823C15412C102518462C2691DB1C64412EB1EC6D75D47C82FC5A9214670B3297067E30C6D9CE0CF3EB314CC1A4CF35342AE419513EC2BD47182C4EA52626A56F7831DBDC5719F532A5A421A7BD5A115C2195D0532E7C1C0FFE40166404137A5B45D7B2CD31752E1646588021508293FB881123F61034318700EEAC429500905179B283162ED0B69590541EBA0848DECC94BD18C888170A4C030A89305FE97A2B0292390A3B1FD6AA22909CF0134A2754728B6FB5180276B7D65C2FD530B4FF48CC7C7093DFC2B418B97762C42BB0980C7F41D9651C69387173A6718038010F50B79B233187BC3A0F7C770E50ABC62E8ACBE297C58C58055387BC7711473D81CA97B6A6E6504870C0DE1D806E3603ED0B04D01DC62529434014C5068C3AB3D4A909A079947127A8A2746CC8126F0212E21A0318EF273D5E0BE16253848413C5CEA22853C6E63B675CFAC1D6590004A2BB3BB4974E79ACA0DD927607A71D4B4C9980A86E5A2B5A84BCD2E694190491060411B332AA7E7766A4C693B00EB9D68F34E5B0564DE24377D3A6D45F72D82EC24FB268537C07B81AA79B5B28EF5A657E0F8B6B2F3A4279ABCF06CA2A79401312943D1D1086D91B1AD3030D0C0BB21806CB87B56ED391E6BC6AAD974034664B4902336D6E45A7449CB656207D59367F2B142746636E44726F111603B28670F47113D28CE6BB11F464B181CB3205FEBC13CC70D3FB35924A641A1117DF5CB65FD9A69C71BB800FC22A6BC47E52756C23533A3A494733B74D9689D64A849D048A2FFAA62B24BA53CC76CE8489D7515834AD3A2EA920E4F2275F4F7BB361866647C04C573BF47E6B54CD31810C7814AB5CD27DA1905FC5976286B781787D2DB606C036A2616AF7946935713CE2C7AC3FC4972ABAA2229C4C294E7A70F97BB6D119BE54553EEBAB1C80C8DA7459258E44A234357A1C9CC46412794116123D21DB27455063672245460EBC8B6B1116B34F2401169ACE16A514534154E798AE3155809B651CA963F854BA501407920765A14F826DCFA4BC4F21766B05BCEAC55E6854F1AD080D9B2538848A8DC7857F10C4C843C46B172ADECE3707E01C03059313BB96BB144996B127A16006DB4063CA1251F550836E167ADEA545B3A0C55C0AC5DE3FCAB6E8242C2C5C09313646117A95EF46536DC74D869301335A2F9040484FB0C9CB85A3D034D55B03C66725D000C47537E0D5AE249EB884B67DADB110119F1D0A5EA38CDF9F2E0E27C75A43A +sk = A5019E7B82405CAC3C8F45BEC4E70E20590BD7E543D465BA702CB1447C0F114CC44F404A31B091C638347CF5A464106A2F92A0B4E600A3D86AB9F57EFFF088D1887865C695C3AA29BA08356DA1B4042146E8817F2BD56BC014071B896D5B2CBA9FA124CBA45E294A0F30FA01E4EB18262059CC987C64F9185AAA12D7EA1F2780308A91A3B2F171D9C41D166872BC7B070D44AF8556A356B631A6EB2E804CC09C531EECA476ADC8143EEBA767298BF29C19FB2496E0C573938BABCD749EE2D02E9817A3EE5A687F9324E7E1082892142C04AE9715C4A6980D73C6A54C16BEEA97A659DA476E49C1DD1B8292E04321783E0A66A36267673E92C2C7463668B1742987405C1621F94B87CE88AEBAEB7BFD787116B30A5B64A7E8956321463B351A9753A0389937B7AED431A5028D309CBED2D8AE67F859CE371CD1B3CB11A8A70D3B9B92E15530A260D1874118EC505FD451897712AE4104E67B1D2BB2676589AA4E8833E03B017AEB2666464C87BA809F2BA29106B49647666FC58C712B5B8127882DF3723E74A9B9E4B0E5A96BB325144111C75E96A13B5566E8258E36D34A76096F9B013236B3036BDA5E3D431AAD3CA33E9A0916D8CEDCD3466C75C1B5603A3E724C60A796E0844CC0D79686F086C510CA0CB11C2E936ECABA446560AAF0931C6A82298BDC7FA82AA6A0B32D361B3335CB83DDA38417720E9E745BB9CA008908CF6931AB2B4A7B78036704153359DC4FDB5742AB3C39A346005374CF3107B95CB771FF1C9592D59C810A93E3593169AB26DE85077DD79A3B3AA03C332A9D177D7EF88624C285A90099D1D0209A0BB0C425CE6AE9221613B2CD596AA77BA2BB98A385D2898D504D68117ED06233E69C43B541438B3274B579C1A5C27B0D85159836AA48907F768C97B6B2B19F475655022691182B2D9C80AEC12ECA0890C9E47BF764684FF1A94D1083D85905212431AFE09342004B44A090CD71357D2431C923B3CE08BC836B3EDB82AB2FA3C508867EAE87BF2768AD61D4894B123B6F861DB52B9B3EB77A8C99839E9108704C907E258F8D8001567078037AA1AB87B03A46AD3A0A30C753B8BD790923B7454F84C67AB6BBBCC105EDC36AB6AB67C28C1D3A54BD06F9C09C12CAC8483E015301DB6650CA3228ABB8353D2B3D95FA5D99E96BCAB65B37DC8A1E958F7395391BCBB4A944AA955BC2176AA6600A0D40489D0534423776184C85057AE00E9636BFBFA76C2D329625747968F53D1EB26CF4F95D6CCA45C60B2DA0F1899A7A1FC651C12BC2C3A2CA16D8ABA4E05C0CBCBB2B72C48EF55403462AB49CF6576D8C358A865DE1F795CC0629F4B13837B6B1704250B8E97F7A116FB63A0DBC12C955B49A67094CFEEB0E8C7B23ABE4BDABB787D3E45EAD108A96D3206A4977AA128866E596DFCA9D68996D82021A4380C0991561AE40A96BF490DD5538F0718098479A5763787939453A7A87A359643885BC5D6149EA048B5EF1ADC65C78E4A9C917160BDC625352596034B3558F98637B33061F769CBE341F9C764238318882CAA978996D1C321A92838D109C187011BF84D17FEFA0271EAC7D5EC90743130234E79089F5B9A6F0267813939B5A3B22321376FB1792D8BCC4A90087866B29244C3641310E94B8311A1303465975649288713E79CA67A9085C8F7449C0BB9A6AB196245B0DA028CC1765A8BA0501D5E360CB3064E11554F3FC2914F1260509073B67B4A0570D7F708CA7C435EA987762F2A5A23CAE53907FC9DB26942136D72202D0A0BB10B65D422091ABAA1C21D152DAD59C25D20C016237634741DEF8CA26B9CCE3097FFD896F1BF08300282FCB7000C7E1956673223902AE5B43BC63B6806C469A4EBB8BD34B057B375E725B07EE856FCC0453379B96F89888D21A7BD5EC91F837B90A2C334A97AD70D87BDCC12892D588D06655F6103E033547CF5933EC237B21B2956E5921CF10A0C55A70E4A24A57B93F6FCAAB2A44BB079987EBA57223B4B9DEB60EC6464FAA4058283B8CBA6956C792AE8FF9184E93C2E2152823C15412C102518462C2691DB1C64412EB1EC6D75D47C82FC5A9214670B3297067E30C6D9CE0CF3EB314CC1A4CF35342AE419513EC2BD47182C4EA52626A56F7831DBDC5719F532A5A421A7BD5A115C2195D0532E7C1C0FFE40166404137A5B45D7B2CD31752E1646588021508293FB881123F61034318700EEAC429500905179B283162ED0B69590541EBA0848DECC94BD18C888170A4C030A89305FE97A2B0292390A3B1FD6AA22909CF0134A2754728B6FB5180276B7D65C2FD530B4FF48CC7C7093DFC2B418B97762C42BB0980C7F41D9651C69387173A6718038010F50B79B233187BC3A0F7C770E50ABC62E8ACBE297C58C58055387BC7711473D81CA97B6A6E6504870C0DE1D806E3603ED0B04D01DC62529434014C5068C3AB3D4A909A079947127A8A2746CC8126F0212E21A0318EF273D5E0BE16253848413C5CEA22853C6E63B675CFAC1D6590004A2BB3BB4974E79ACA0DD927607A71D4B4C9980A86E5A2B5A84BCD2E694190491060411B332AA7E7766A4C693B00EB9D68F34E5B0564DE24377D3A6D45F72D82EC24FB268537C07B81AA79B5B28EF5A657E0F8B6B2F3A4279ABCF06CA2A79401312943D1D1086D91B1AD3030D0C0BB21806CB87B56ED391E6BC6AAD974034664B4902336D6E45A7449CB656207D59367F2B142746636E44726F111603B28670F47113D28CE6BB11F464B181CB3205FEBC13CC70D3FB35924A641A1117DF5CB65FD9A69C71BB800FC22A6BC47E52756C23533A3A494733B74D9689D64A849D048A2FFAA62B24BA53CC76CE8489D7515834AD3A2EA920E4F2275F4F7BB361866647C04C573BF47E6B54CD31810C7814AB5CD27DA1905FC5976286B781787D2DB606C036A2616AF7946935713CE2C7AC3FC4972ABAA2229C4C294E7A70F97BB6D119BE54553EEBAB1C80C8DA7459258E44A234357A1C9CC46412794116123D21DB27455063672245460EBC8B6B1116B34F2401169ACE16A514534154E798AE3155809B651CA963F854BA501407920765A14F826DCFA4BC4F21766B05BCEAC55E6854F1AD080D9B2538848A8DC7857F10C4C843C46B172ADECE3707E01C03059313BB96BB144996B127A16006DB4063CA1251F550836E167ADEA545B3A0C55C0AC5DE3FCAB6E8242C2C5C09313646117A95EF46536DC74D869301335A2F9040484FB0C9CB85A3D034D55B03C66725D000C47537E0D5AE249EB884B67DADB110119F1D0A5EA38CDF9F2E0E27C75A43A9AA64A30BED5AA8300772066EF577F79BF4813E3315A15F2C28B2665E4DC7E2F8D6C42E7270EE2B77B6045385F3D175984A0E260363166C73B0C70C971644363 +ct = 3639A304E4F743B4E62271BDA171EFD8912E067073B2F05FC8253F82733FC36C76FF5B6C5F17C40CB86F33D033BE899B7995251F678DED9E6CDF423FBA7C5E7014854818E08378459ED5723597AE428125C299356F6621D62F204AF4C3BB80A20B80772443CBCE224A0C0AB0FA5EE004CB11908619E40DBE2772C02E03A2A6D3C7F9A0BB5FB931A6C99F2342432CD7B13DAD5263AB489AD70500F6A855FF44D89C43073BF12F6A21D92C514B0BC4A5A839870E74D83C5B20DE67A88A01E959E587F74EEB2A9F53D05F5EF61022821B554D267A44395494453EBDD237223906F6253C3998F4271D3F1CF95DB10C8EBF18A0DAA2068CB945FA42CCEB8B0C335EB6E7991B57C153CFAF9AF85F243866E44470D32010DC7680826A9B7C85439A69571550C4AC82DECCA718C069BA2D99E832BE9A36EA810F02F82DB81DF7D449DAD5C157B0F10FD01F2BD589313F7CB3042E62912800DACA907D72D967E1DE39EF7258FAFF4EF6A8744B40F2ECEF0FFC151C78C215F98B106BD9577AEC1A3E323E705A202D4A855A0979EF439F8A27320E09F7347B316A24AADA46040B3B49426413565C0A7AA8B471F5FAAF88C9AF1375A7395B006F834D9EBE9EBF178B16A115C8346D31FEAA9E6B04719E9F35ECF7621AC1EBEAEF3EAC0EE7431CEC9E06D7A65CEBE7E6297113FF1D151F02C56C83E7DE1DF7FD00DDE7F91EDC126FBE07CB6CB888C1A2F8FAA35AFDEB10AF14A2F8A8B080891E8BEE23A5AFD86A4D749F97DCC6A3B98DBFC5DF4591A16927C33B9FE08AAEAE00979D178A1882FC1AF0E65D8B6F33DFFB235DD06BCF574D55A3074F8BA607A2178E34C76C72AFC1B8E1CB9F482F0162BDD550078655B0F95B3092B132164358A72A6A48C9550553FE9BC874980404955F481C6A614923B925931337F7E2502880A443CEC707B7238AC1ED70B4B94501EA74EA9BCD989B50B360B891D97FFC786A46E53EAAD2F5D714546A80FF90070F281C16A7BA543EF9A0CEFAD3217FBD2133CDC4F7AAEEC5AE444AAF015614D6625471790F714B68E881C0D6ADEF3A6D6E8FC9E273374FB2CC1C9D6D406B4812653DF1276171BF253AD4B80D7B5F8DE0B4BBEB50E2E2607A4CACE04698D7D0EDFE5AFB900C661A5020B7CB88DF34712FF4325D362435BB45D5A9D352BC13EB66BC599C4A07677103A1D7B40F0AE8393E42315BB62D6AC8CF953B8051516807451033B5404BCB12BE7ABFCC9F6CFB8C9ECCC4998CFED0653808463188AC22961BFDDF8F1AA97AA067DF0E9E9954F79547998759FD08542D0A71CBDD32E6EDEFB11331CAD655408CE2F5DEF7AED94B37E8A4B8B75946A677030C3903A4B201C1F3D2DFA65A06BAB8982A4DCE33418D0ED98E29A94E556F0B4C3AEDB44D887DE5BAA0374EF291C8552F0AECD7DC5BB3CFBE79FC92F0A73020489474C8279CD8044BEC179C7E5A1430965B9BF130314A35F9DE2DDBA517D28ADB3D253EFDE18BADABD6512D516C8147E91BACF3CD43CE5E244767ACDAAE8C2AC56A72E1F0089100 +ss = A2B1D4028AF3777BE109A51FAB5B7014681B0BE94A7C06E8C2100565667F21A7 + +count = 11 +seed = 6C029462CA42ED520F10A579F52687101105E0B90C6E7BFA582A4C112B579D5AD0A0ABD38F72ABCFDCAAF5893A112BDC +pk = E9718A491B3262D206BE72A9CEB000E81B6BE6668D14A124BB49BE524ABB09B91942A60ED38B1974E36376A7724DDC7E5A993EA9C25F40B80C766CC57E807BD5932603403458B84703CA58F8E57C451227128654DF4537FCE6A57BD1BD6FD8C5BE1135B2C82CBFA4B96D577575406F92538034D22D6198A9CD000FC8DC8988F95608C1974C4359ADA14F7DD4870C63BF79886AB2D4CAD1C89A8FE232FC1C8C515B7D2AA9CC35759EF583244EA767916478F8415FDF7B1CF85A80F4D6960298B977A7ABF380709EF904C1706EE3F51ABF415028321E4FC79FB2E15454C47B3572BC09C62C0DC466EFAA759F116E8BA4717F91220F125656BA7C52338AB1FACB0FA6A75CE61F3135911D5714FCDA7A5A271205547018CC0607C5AA7104A4A77266C0525579F054ECC6C62522068E79352AE7A1C3265413459939764A4421CAA937C8F9B2B276A2C77CE7814FE9034783B8AEC29881E2563A63780CBABBCBE72501D68F1B72C6EF3C5D84A4BD7CF4A84686682FE36A151BCB3BB76CE5FA67AE545C9621BED149BE06AA2E72F72D1B24B086836B525915B93A49D90CB3C45877C54204A605CC27F1828DE6CA1E95056938A6C9651EB3B4A9B09C5AA9FC4401215D9EA9015A996F9A7B898CEA466CA14F0065A5B1F374D422B4A277A011F3B3E8143B053507BEE829E582528DCB3C9E950F39D17AD0A849C701779D070E34CC606C84A596650B7776A468659344446BC19186B43CBF042516A7B133065393C83B85313C53B71A5BC4421A91694BEEB39760806D3B910AA8EA546F53763B656C99EA50A179986DC3786A554B819317FB58564DD69428BB1D7BC45A642A8AB9CC013F932A67222D1FD42B455930B8147D6175C66330217246C400C4B619B922182101B2D8165F93BEE58757C14CBFC958552137B904009FCF845321841F8648B8F9E58D1572119B11CBCD59480246A46E255ADCC1649817A052736ED9C18A262C36F7C37918DB789AB177ED39ADD0850A509319888073B54BC3ED81000C780FC87AC5C302235A959B1164B491001B92811D4AA76876065E841B276A27B868822FD1DA7C3FD1831D88C9F5D891FF610CAF264FBC9280B8D4085251774EE20C23576ACE6215B3EB8C1610CA2405115E89421418A7610C05BB526FFA39918E9558C6CB2618A612B6D38BF8A2569B4C3AE902A4AC744ED4BCA8ED783C4EBA450470AEF5EC5370B87DAA419145298170D64CAAFC2EDA7C989645B9285A3FBD16C16E0C1E3FE085A6BC05248426EF106E7F6012E80882682660CD05CE49520785EA66325078F9A91E5FFC3BA0833DE333326FECBCD8878F286064CD1B672F210133E30D106C61AF9A75A7FC64FB5B1E1A1649FAB356C0F26B9062C5DCEAA7CEE502C750A93187A21C11B1B7FCAA45F8B857D38E18287B1E878C7EE59E07966F3619BEE70253D77065C02926BFD9B031260B5AF95846573AD09C42573C8338609FD3E5C0B50092B17A83128A4A9F1A6A232252884504846B3B7DF82981DBB036F6A57C5C19136789AF9690A978145EA6ADB74132EC55840965083F388877A93FC01B006FE4CDE4012A1814B327A12CCA8991CD18027F4485B4025B5583747FBB37916585261ABFEA163B617347ACAF453AE235166CDD8AFBFFDAAAB9919F0CFFDC75D8796FCC28 +sk = 7EC737EBF52EB7905DA8B3C58508928DD74462E8968A1265BB3B9780649210C8202E2950AC11863BD78AF3123AE9899CEFF1992608CF5BD1B4EB0AC1C13CCAAB4CA89A869424BC1AF777CFC7D90A071273F5AA5DF310493FAB17CE5B6477C773D8CC81D995509FF3A40CE80E734A9E8968B7FBE79A9900AB85F7B442077A890688DCBA0BD5E64AE491CE5D39B554E6B82B7602A149A686C19FCEE21B8E3B1792E7529F2307505C77ED84A63A68258E832BF0F118BC05C91A6B216EBCC051B90143B9748B365EC841B6098C4EECE8AA8231BC24B03E732A0EC55AA5B0E3231EFB7C7F0AB21E2544072C22B6B4075049B63FBA05C68A936989BAA2E55AD1846FD1E335568B01D4ACC869E710357708BDC25DB545447E41727224545CA8C16BCA5458EB24D746A12E170EF191CC8DD840E26910CD9484B4E40D0C7446959A521618B9BC472C8001AD0D1C8428C43C0FB3230FA9B17694284375A0E1563FDAEAB6CAD367C9949C4723802D6931F0C212B03004675652B958518D31C8D4B06DFD99820702319E668DFFB5C88622170B0C0EABA56EE7B77EF5D7600B9C0BBBEA5B99E05A9443BB81A68C22C7904A1755D4C80A47AC148ED13C3981C6BF4122A7880FDD597429A32D6046981146743AE85CC8C0CCB715937F29C933D63AB475C2C5483CE07ACC5B8BB4C7456398A9236D02BED9B951F6D43A67EA06F7FB803ACC33E9552E7150C34003A2E2E11BFC0BADFC537EB2B69122352FFB62B285B6CB0935ADFA0385DDA074F7A63ADB76BCF4A80AA83A1C32F87BE3A786537ACAA32178B136C8BF817AC1CB1E25B44654266F4B2B14F33358B9B75A2D916D78E89D3CEC68B782734FE052449598D847B2A02C3056A64E72C5A3B34685E9FB2C0037736E0A21DF39A356310777A36FCE908C243A4A50216B6199CD63C7BDB18B95FBE4615E9799757176FA4A88C93459BC3030E09889EDE148890CC221362472586E3C026B0DC10BA5A823F07ACC1C693E9BF31518B90359B7AAEC54473552835B3590174109337B6171EAC38DE29BDEF8095DA13A8F7014B3F531FC152CA5EB19859673D52067E28C7513141245376BAF368B07627FB1B844FC033361994FFB3B39822A2A2DE17597D16601329866F42C3697A6F5132DCEA2140B871480E50523C3C5227537A5089FB6742CBFCA55BA9C307A321ABE440241E34151B2C2AAB6AD55817B115330C0B15891FA35BF344BE7D93AD44BB27962101982902427242F5B06F85204E738AEC7A333A15001252004B21B5E6FA95A41A4456F74C9522657A9A40F8C4A162F4951CD5BB8A4F334F45A3A73266E1C386CAED53AB52B9A4DFA173B96869FBA6C72987F4B328A0E56A08C96A00D78854D6762EA2394C2A102162143CD40192749CFBC5031739711F1EA8C37DB5B635BCFE9B6396E2902D56BB135EB8975E1B0A171258D39A7AE84AABD46BAF4DC2A6FF18FB6002CE232B7A45A532DD54D3DA8C580D6CEA4209098930477D207622A7CDEDC2E72C24EAF5787D4B2B461889D23AB93A4BA327C371EFF58CFF7F65738886ABD046895834AA06A6CB57973F1011353FCC1452B015A324C406515E9290AFF4356FB393B57F4066077B2152819B6A69DE9718A491B3262D206BE72A9CEB000E81B6BE6668D14A124BB49BE524ABB09B91942A60ED38B1974E36376A7724DDC7E5A993EA9C25F40B80C766CC57E807BD5932603403458B84703CA58F8E57C451227128654DF4537FCE6A57BD1BD6FD8C5BE1135B2C82CBFA4B96D577575406F92538034D22D6198A9CD000FC8DC8988F95608C1974C4359ADA14F7DD4870C63BF79886AB2D4CAD1C89A8FE232FC1C8C515B7D2AA9CC35759EF583244EA767916478F8415FDF7B1CF85A80F4D6960298B977A7ABF380709EF904C1706EE3F51ABF415028321E4FC79FB2E15454C47B3572BC09C62C0DC466EFAA759F116E8BA4717F91220F125656BA7C52338AB1FACB0FA6A75CE61F3135911D5714FCDA7A5A271205547018CC0607C5AA7104A4A77266C0525579F054ECC6C62522068E79352AE7A1C3265413459939764A4421CAA937C8F9B2B276A2C77CE7814FE9034783B8AEC29881E2563A63780CBABBCBE72501D68F1B72C6EF3C5D84A4BD7CF4A84686682FE36A151BCB3BB76CE5FA67AE545C9621BED149BE06AA2E72F72D1B24B086836B525915B93A49D90CB3C45877C54204A605CC27F1828DE6CA1E95056938A6C9651EB3B4A9B09C5AA9FC4401215D9EA9015A996F9A7B898CEA466CA14F0065A5B1F374D422B4A277A011F3B3E8143B053507BEE829E582528DCB3C9E950F39D17AD0A849C701779D070E34CC606C84A596650B7776A468659344446BC19186B43CBF042516A7B133065393C83B85313C53B71A5BC4421A91694BEEB39760806D3B910AA8EA546F53763B656C99EA50A179986DC3786A554B819317FB58564DD69428BB1D7BC45A642A8AB9CC013F932A67222D1FD42B455930B8147D6175C66330217246C400C4B619B922182101B2D8165F93BEE58757C14CBFC958552137B904009FCF845321841F8648B8F9E58D1572119B11CBCD59480246A46E255ADCC1649817A052736ED9C18A262C36F7C37918DB789AB177ED39ADD0850A509319888073B54BC3ED81000C780FC87AC5C302235A959B1164B491001B92811D4AA76876065E841B276A27B868822FD1DA7C3FD1831D88C9F5D891FF610CAF264FBC9280B8D4085251774EE20C23576ACE6215B3EB8C1610CA2405115E89421418A7610C05BB526FFA39918E9558C6CB2618A612B6D38BF8A2569B4C3AE902A4AC744ED4BCA8ED783C4EBA450470AEF5EC5370B87DAA419145298170D64CAAFC2EDA7C989645B9285A3FBD16C16E0C1E3FE085A6BC05248426EF106E7F6012E80882682660CD05CE49520785EA66325078F9A91E5FFC3BA0833DE333326FECBCD8878F286064CD1B672F210133E30D106C61AF9A75A7FC64FB5B1E1A1649FAB356C0F26B9062C5DCEAA7CEE502C750A93187A21C11B1B7FCAA45F8B857D38E18287B1E878C7EE59E07966F3619BEE70253D77065C02926BFD9B031260B5AF95846573AD09C42573C8338609FD3E5C0B50092B17A83128A4A9F1A6A232252884504846B3B7DF82981DBB036F6A57C5C19136789AF9690A978145EA6ADB74132EC55840965083F388877A93FC01B006FE4CDE4012A1814B327A12CCA8991CD18027F4485B4025B5583747FBB37916585261ABFEA163B617347ACAF453AE235166CDD8AFBFFDAAAB9919F0CFFDC75D8796FCC28241E5C7B836862D7482D507973AE3FD8DAE96EEC4ECEBCEDB68FBDA75E04B401812083BFA3B670E3EAF9B443702FB6DB16AC1197656BBD61A8E25ED523B8D1E5 +ct = 6B0D9B262990276B654A5AA1A91DDB9EF72225CB2CF1FAE1108671F4F44BE627C6285ACEDA812207FAB12B6CA0A147C2B36D08818DDFD16AF799F9873EE7DAF236F33A607744147A944790B2917D381435B626003C8DF54967B99786D3B610E449DBE49840355A179E6273FF2B3164B50A0E818AEE095807855641772B2B158B5CDA1EB09BDCB98D3E124C0AB285E105E0573A5A6C7256D3455CF59227D0B421FDBB7399F851E910CAF0FF6D96A4BE8A74C7EEB54261DA68024237EB7E561386EB4EA13C56CCDBA633CAF6CAEADE2657A50EF4E0ECF611C18D2B46AF6E993F7279ACE11439D9C8EB857ED097C9D1208757CE7898CC980DE4635988F398758681307B42F64C86867F5F3177022BAC3C4D8EBDE5960BC9095591DAB21CE23D799FDA79C97095CBADDBC43E2324B8DEB736E43374EA884055E4741508554B309D946FF719006C99DEAFB7154BFCAD158A76D8858817BB0EDD928D9C56E972C8DD3D5E806DA47A0C855D23931D1412A5B801B42121EEF3522A8FCA12575703865DC2350CA616ECC39D1E9AFAF9A87D638F72E1861FC8386ECDA284AC0C220DA5E3BB55895F82186DFE69569EFAF2F4A7346348099704B11E5EDB304C42B78853F376A4C4DFAE3E32F1BEACF3D5C2F1744E02F819EB22927013407D82D9687F83757D3D944524E5957E6AB542C83840F5A2F9B31CD9678C7A589DAB33785F06A94C1B71E4AFD3460F85C2A7C6ED7F83CFC009BD88F1241981AD098D1521C0A09348B816E1458291E58314C10371CCDABF96EF994D2C6685A4C781D4CF8263865A18BA57711269449E509BF8460EC4C1CE7C9788816A31F8F91D3FAD6F27B4F351210FF5C41C11E5B0029E66BB655ED20E8011BD16AFAF2F02CE2BC5188B2A2C34AB074515CC85477FA4B541D4C61611A1DF6AE7D1782A311BEBAC32A28DF255263E308E2B659150ABF2DFB955F7A2D7FAD7EED45E18796D9BAEA414F9F66252A4A7CD833E54F1010585865A66FB23F8B781FBF1E1BEF7771C6E73DDE8A059A0ED5837B9DCB9B5A037A3D77F6DE09F3922C5F7C715B00E1ACB1DFC91C934AE04932888192875A126AF8DF70B21D64CB22D430F64FD4CB836C3B8967063E22C647435421C4D0601A3A6D54E7051C84CBC4BCC6455D19B4CE18E79813B33A562F3780A92AC9160A1CB7A22C79A7B8B67BA7824A914E713BE0C889DC6BB420101506FDA42B2448970A11B3C482CA873EFE65856B1DC7C8FA50A6412B8DA94235488DC67AF11B0C8E988FC844B7F0E6AEB685E4B63DC7C0C0184830410C486E6BC03F87129D99CB6464EA70B6C2B01D58EA3F18DA93B4933567A95472556152FEEADB88C9DE0D5A69D6FEF8EDDA08A34B39BFC5D5138A403E3E2D5E6A15A020E8E463B71F8D90A53FB36A91A825E43CBA2433BAE0F17569D3A83EE793EE99D44EBA560C7EB57341AFF091654DC3FD0E24461962CE9D50F1B8BEEE9BC4A23F232BEBEC8B61236D78309B16DD5B4690E8BC495EE43574398D01A62B0CD0F57CD4EE0B64ACAD4 +ss = 4A2BAC4D2A30597AA5B528D0E20B1630B20A36E8D747B5EC41EEB57950375A5D + +count = 12 +seed = DB00120937570D62331F4C3F19A10465231EFF46465CDEE336A0D46AA1E7493DF80F18617F9FFD0476CF7784A403EF4F +pk = 14345D52853184AAAB60195152259D9B643D864C4EC5FC4978C657C3365EA81212EB91339AAA4BFA87A197A04D46A7B666837F55DB6F16C095DB449E9BAA879AE14016EA4F8BA975DA26CFCF59401237ACCB908EFD17146E9439B1473BAFA07703F2932D5C598276B59B419402D681D87111F70C20D2710E10A407634AB216907D7363AF0BC4647DBA208F9C6744D71A8A1C1A99082A3BD8A843E4CE581412F04877EDB1709D1A9623C3C428EB111A1189073C9A3D34AD16AA1F1551A07E6880147360E60888DDD5B0956036951021AF4699C96382CC0C16B3F0B960135391C6692B0C556A5B9AD2F8A5ED0CB0BAEA2406868AC6F7A5A44B722721535E098FE832C9AF148AE027604C47CE4D3214A1BC974675289AC7BFB9A644DB30235A664417C57A8A46A86E18A10F81B87F4B4727F7234017088F447F28680B0600AD1DD672F0EA19E38A39FCF964CCCC64528C97FA474EF3AA6777676B3DB443D0A2042C744555049C48B2BC2577738A698BC58910F55B0EDE555B171838F6086CA365AED981AA5354561411990707BD3305CF4D10161FD3124156691DAA5CF3795653E2AEE1C4BA021B0EDD0809B14905E46C2CD0BB1E165C8AA428B180EA394E6C92BD6873E12328E5E1916C94C81393172DF3815127B937B9646A783524671FBD8B5F01395178C6A9FF42C47D8B25FB37A2D1DA975F69C7A8286504FAAA6AD5B05307C2D20B4F27640FE59B1EF407110A317CD72023828192B131CB9AF96899A69B0F51125B2828F29493A997A33023661BB7811C4593E4E579F8B17D0CBB6037D9273932AF4EB235F7D01DD398B70752A925968ADBF56CF132B85680ABFFB937C35425C244345E805BDB608CB0666984775AC1852690908CF2A60214F6A888004AA41A44831537E55A5DFAE7B2A4448FE6C562EA66764DFB5FA508B6738C4F52F10D4A852D38F5354981CDFB7A851A675C5A01C2FBE886192582D1F08AB37753BBD81BA6D848949731C99BA92278A2833CC11AC3BF603512BD6557F9684EB980C7588424DB0C1E2BB2BD09196A7DA29D79208DA50C4A0C839284A44D8861706E991EDD099E0B1467B88948C89778787C26DD4436FBC4BFD12B0ACC00AB4D85B613BBA4F928BBFCB04E2EAA51B81845C3A710BBC8458027A4F055061D0B39AD28482646AEBC5458D0E70D396C99A0B456837376110488F49A83F48372327467AB87870D11B3C1E6C112AB3D6D486A99BC2B9B368A0695C6C6251D6BEA5B56FCB96FC23475719B8CC82806875CAD772E4716332FFB02189438E27097E565159E4B1790558273CA887FCA2A6E7226C53879ADBBC07AC1072E6AAFDD2A1DD89677842041F33C447204A3FB91C1E4935111AC739CDC9FD6F2BA8C0C66DFF5552F3B2BDFDB19D4F65CB3B23777292CF97CC54BFBC41ED041E53318386173D229B9288C5D68E87D0CE2032D481C46B646EF71940D97AF370732533260C6AC943272866BB2BC90EC64424C67B1C877F5D2B35C39656957BBE40C53ED88C4124764B726A5E24ABA7B0C866A52385C85C241677F75487D4156C85DB639AD741E0412438BDBCEB6092FA14501FE1C5E95D90833332DEBC0441554A8CB5A8F7826B047882B415B78A0C2E966AC7C67B03EF5106F0A751017B67CC52A3D0E1586C74513D2B5F13260 +sk = D62C6CE5E7594BE682A8167743106A44482E3A79CE257635773513F0B0BF77A161C8274A705B93D2EAA899D8C0126AC8ADB7B3BBB5891711380DA1A9DE0541E4160DCCABC13A165B5C54178DA95B919457C684B9CEF81E97637C73F22A3CE9295DE79BEDD83C3FF871087B9412301863E291B04779457807ABE4687368C84B3408E26AA30BF58BBE4BBDED32ADB03607598714464222524B3C2CD4C15F98A2E6695463257BB8FA9A84131A64D45A57B9A539094B5E957496B79008878396D3B9B2EC41CCA75B66FA6D069A51AF611D4BC03E20CB12A216072D7834D996AE99E1CC6522A42B48C54282CD0AE8CFDD1B874FBB4EC17434AD584AF5B4561BC1597AAB63390B60FE7C052E57846E1A8C4F6C6758798B70503507554946382FA6E2004A616A40DBC2B0C596C2CB2873C38E6FF82FF159BA93563D23671DFC433949D3705F398B3752680169657623937A8C357864C39D82C16DA5C1EE407FC7FAB357C0B114965E89815409964CCDC54CD8D5B17039AA9283A59E746A45A2800E4806064683C292B425C18F73AA2F720A6521A050C5196BDABC9B094895B9527759C1A7210958E11A3411B05E67097FCE2C11ED024A85A22684B51EDD652DED89C23E1440CA5616BB754361C549776222B8B297F8F4BB7F818D3B29B16C369CC8BA9D91E6012BF006999C7057AA2A44C30237314079B2A55C63990C3AB657CB80D41022651097ED680D200195BE82A9B9D08B24F039BFFC42C66459B0C8889DDA6714B63762494A5E6106F34223990772B1CC12DC660F5BE62EB0A15C16D4A0303773D768C7DDA7B749711F7C12720C150D30EC6B625624E3F94861483BE03271D8B05780AB62E0294A8CB193238530B49455718C872428BEA1D84955F54A3BB619DADC6106EA3EF27094A085634624377312648AC46559D7A7DD902497AA9F22879D131A08B9223A05E5B76A00807225B304480F6105CBEC8A11CEA18E8910A9BBA691047C95676C9E2DC7AB76537691DBBEE397738C613E1FB00A79F06698C10EC26C97DC00B82A54AF572A02801AAC20983311F42BCA18699A2684E4B5AED83C7AD89A1705F1605A87CABEFAC499A56058D8B02BD597743524A90C3686D9405E33C3D70880B6449D41A76F83E23759664F1F301D3935998D690A7167AFA11A59CF8B87624283A738C0D221B1B55453504AB64FB89824351A49EBBCC291465AF92F50D7B53874C1190A766DAC5E70706F88097BE4500942534DF5E5887C48B234C11992F32BF3F2867CC055D7D6C3A4D25D2A141BE7D706BC1203814667552888E3BB13221A10DC3A4157D811A7CA23088BA5AA1A3FD60C0C6AF29B3B52AA6DA319D8E359D842C6DC65C29ECCC0523115D15B19A7B90D1090C5949CC66A004F0A0513132640A284A87384C7ED06782607584BF5CDD8F099ACB0229CC9588B024B0F3B5BA80B962218B3BCE4C0F542BAC9E8C235362E33EA30D789094FE82FBF64569907755ED7BFD00C3F6F446DEB00A27B37BB92E454AAAACB69DC854532C718C85508AC8742C7180EA805A78999111915BD414275E92D75C1953C10968C802E4AA6429ECA0A5EF49FB4046ED2C93914400B0D882B67C275C483037E859C8C015114345D52853184AAAB60195152259D9B643D864C4EC5FC4978C657C3365EA81212EB91339AAA4BFA87A197A04D46A7B666837F55DB6F16C095DB449E9BAA879AE14016EA4F8BA975DA26CFCF59401237ACCB908EFD17146E9439B1473BAFA07703F2932D5C598276B59B419402D681D87111F70C20D2710E10A407634AB216907D7363AF0BC4647DBA208F9C6744D71A8A1C1A99082A3BD8A843E4CE581412F04877EDB1709D1A9623C3C428EB111A1189073C9A3D34AD16AA1F1551A07E6880147360E60888DDD5B0956036951021AF4699C96382CC0C16B3F0B960135391C6692B0C556A5B9AD2F8A5ED0CB0BAEA2406868AC6F7A5A44B722721535E098FE832C9AF148AE027604C47CE4D3214A1BC974675289AC7BFB9A644DB30235A664417C57A8A46A86E18A10F81B87F4B4727F7234017088F447F28680B0600AD1DD672F0EA19E38A39FCF964CCCC64528C97FA474EF3AA6777676B3DB443D0A2042C744555049C48B2BC2577738A698BC58910F55B0EDE555B171838F6086CA365AED981AA5354561411990707BD3305CF4D10161FD3124156691DAA5CF3795653E2AEE1C4BA021B0EDD0809B14905E46C2CD0BB1E165C8AA428B180EA394E6C92BD6873E12328E5E1916C94C81393172DF3815127B937B9646A783524671FBD8B5F01395178C6A9FF42C47D8B25FB37A2D1DA975F69C7A8286504FAAA6AD5B05307C2D20B4F27640FE59B1EF407110A317CD72023828192B131CB9AF96899A69B0F51125B2828F29493A997A33023661BB7811C4593E4E579F8B17D0CBB6037D9273932AF4EB235F7D01DD398B70752A925968ADBF56CF132B85680ABFFB937C35425C244345E805BDB608CB0666984775AC1852690908CF2A60214F6A888004AA41A44831537E55A5DFAE7B2A4448FE6C562EA66764DFB5FA508B6738C4F52F10D4A852D38F5354981CDFB7A851A675C5A01C2FBE886192582D1F08AB37753BBD81BA6D848949731C99BA92278A2833CC11AC3BF603512BD6557F9684EB980C7588424DB0C1E2BB2BD09196A7DA29D79208DA50C4A0C839284A44D8861706E991EDD099E0B1467B88948C89778787C26DD4436FBC4BFD12B0ACC00AB4D85B613BBA4F928BBFCB04E2EAA51B81845C3A710BBC8458027A4F055061D0B39AD28482646AEBC5458D0E70D396C99A0B456837376110488F49A83F48372327467AB87870D11B3C1E6C112AB3D6D486A99BC2B9B368A0695C6C6251D6BEA5B56FCB96FC23475719B8CC82806875CAD772E4716332FFB02189438E27097E565159E4B1790558273CA887FCA2A6E7226C53879ADBBC07AC1072E6AAFDD2A1DD89677842041F33C447204A3FB91C1E4935111AC739CDC9FD6F2BA8C0C66DFF5552F3B2BDFDB19D4F65CB3B23777292CF97CC54BFBC41ED041E53318386173D229B9288C5D68E87D0CE2032D481C46B646EF71940D97AF370732533260C6AC943272866BB2BC90EC64424C67B1C877F5D2B35C39656957BBE40C53ED88C4124764B726A5E24ABA7B0C866A52385C85C241677F75487D4156C85DB639AD741E0412438BDBCEB6092FA14501FE1C5E95D90833332DEBC0441554A8CB5A8F7826B047882B415B78A0C2E966AC7C67B03EF5106F0A751017B67CC52A3D0E1586C74513D2B5F132606AD1D739F1598A16C608A240CD13DFAF8263D74866315E2898A3431CF19E46858E9A30597E4B52FFA87A54B83C91D12A5E9C2CD90FCAC2C11B3A348240411A4C +ct = 3ACCE62A918EBD3D80860DD2AAA93B594682527418B4DB700CFFEE66A66C30C228F2566A4F717C8505DD17CB7CC71990AAA00BF04EEEB254154BA0D20025E02D0F476B445E3ECD9E90904695236BB7D6345AA360308AF8A9698A46FF10DABBFDD4537CD96EE0054FB3E7E53DC2D72DD642E079CFA964B8EE9A7E9806A5724C4D659D24AF5EE2669AB399AFC6DF41F1E8CEEEEC0F5910C83CC40A9287F0E44C22CA0CD3ACE7BA56DA39C29402331C3DCA0F6DF27EEC203225C5F2100944516BAC3AAF3470F793966CB9B4DE1A9581A6412CFAF5E058AC21FAB447B5045804AF6D75C27E24C48B4DFAA3B48EBF59B9AFF804BD24B98DA9D29556BC95362E207E662855D927015C92C69034CF0DF2FFB8FE3052713C74843D3BF90516D8627213E1D52167D13BC9C47387D57C8843AD16A102026E9AB2E430B70BD5EDDD8898A5E62E7D6CE8650B18805996118BB95CA0AC22A43FD92D3EEC07D5BEBFE80A7ED737921061ACBB42FC009C59A409EB3327C2931C642207145B826EECF2377374973219834C3E36E31F459793D644475E207AB0DB525649F05873E811988186DEE8A0E07AC3CEA66F3635F531988D9798F0503FDFBA624A350C299C1339435811620FD6B75EA11CFF36B300E6F2C79F5F0B10FC07E1E9E6A9ACAEF599F95DC8ED5C43E95617D407120C5F9A5A7DD2A804682B8214BC5C913A4984FB69DF0CAB7C0B3146592E43FB9869A526CE58148AAAA39E70A378CAB1648F982C0C668675E3522AD1C8647F3925F7DB726B1E50F352234E5CB67F9B55954831E819BDDF6628935A807A468E9724AA2917A2FF8E84D30DF3643275897BE01A2D9B2CD296B4289A4D84C2A5EC6AC1669EA42D9A19294CFD8AD9B9E4F76DF7879D564429BC55459421026CA3ECBA1CCFB04E41546DA705D6B27D193B86A695746FD2A8DE6D39B616B04C468469F69C23E1FE2BB7A554D70086DFE50F5B9F0A12114AF80D146BBC6A6E1E745905E05443F9177C36002C26FF322DEAA7D27074ADE6860B4EEA93755F00E35BBA8A721ED9CEC554A9ECE670C9D8EFE4B31DDD0565F2C18ECEA9326D3A5F8A1D7CC208247CE5F45A75E23FD5A4FE1CA5A20B661A48E2C6E29D847DDFA12EE226310D65D10E3F461998B4A7480F6F200181E6A003FA671010B87EBEF9FC8A2C14352102E1153816ED9B10B3E2F370EC7F8FEAE82282AF5FEC46A5D2B8697A59D1FC354F3854A1344DB6F6FA91C78844B3A414D3FF02BCD1333A88AFC9D55947237A743BAF81F0AFC37A10EAAC892EAECD15B1265A6B37AC075A778FE2466E1D3A7C1D9C1677AE5FA8737DDF4040D7C3D76118540D244CDA0A7AD5C9E4D7DDC377C15E57697F6F9EC14689C085E986F16BDE6884B2978F217C51ECAA2AA9C8FCA9CF6E9ADE1E39BECAAFF2019B5691B70C06286341DCAA4F21B87B38622C1BC996A38BC0428731AD3EB3C7BB0D08EC4B4950DC5EA20095088F317C43C073D2E2CD61B361EFE2CC13B12F1BFA59A309D620F4F8FD58B3A8F32ED9DED4BE8CED +ss = E09C8D7E5D104C0A42B47F031EFE22A79BA1008EFDFB80FFC7532F40FC9B3A94 + +count = 13 +seed = BD26C0B9A33E3B9B4C5D7EA32D5BD1FC371015BE163C86F584E49BFD5362C8D8341161CD1308115B2A03B7E5EADDD418 +pk = 8BD98BE4597242C95C9641B194A093A928B8D3B30F33C10BA326943A8B704C09A6DFA55F700C488C38A3334716CCEB6585008A853162E40A544C0A16878328F47C4E67B5AAD276A2DEC4C320047E2EAB345CC14982B96D1D13566DA409E93072377A1729546117A04CE291A2090B60030A35D5B360F9F871CAD52F37E63954DA0E0A8675ABCC3717972F89469978730607293267CAC89E3C96A98576C2351D8756429722A1278A173A75114BAA4F0EEC6A12B09CAFDC99FEE2C1AF7ACDAE3C747B94B06517464F654ADAE25888A15CB4C5017076C9D3FAC3B1560DD9112D88B2BCF31B15AC420FE5A698D52AB41EF33FA6CA8D8CB9B94D58648F39A138974E8016A972308C7B040D2FA32BFD1096503A3A0E84B9941188A6720E06E6641B896D365190369766995826B72122D780477581BD69B348BB6C5C8F65B4D84AC3F0768EF6645E422B3ED7E38D0A423409C285D0E21BBCA97BE6707557BB0027E755F9A81912D04B9EBB374BD79411B2C283068670431F2DE58D346BB525D192F128C9316742115275E9214DEF7A61DA509B5848013B304216F783D77C3F57B76FB8DC984F05AB557709DAE4691B519C44D41813E4B61E6664AF5C970AE7A810714217745AF087BB00575B18081921A854B7D953E29CB1DE704E6578283292168EA73A03E2082B8B641C819649270011861A7B301DCEF74E9B116A86F717E30BA6C5398E34390072E20C82F570FCFAA2BD8847A7187052E6B9D0D9BC9FEC0217373BCC7B8D38245E40A1597077BB00A408E9EB2BB451C31A746D2AA07FD6432CF176382B6665D45343CF32731817023EE046577ABC342BBE25416DAEE417F2971A8ED4C839126E996A8DB40A55BD424C0E534CAB677FA1C6B692D2B7E322A331305F75289A1ED102ED604722737E76501C7E7ACC69842D6FFB2D31D1003C3B3BD8F4458D93B0270CBA21DB21A7D16E22E18584E68EA5B890EE839DE75B68D60B25D5452BBB91658F3220AAAB200EE7A8F070A5B5AA7FA30A768275970012324FE01910E8647945AE6F8B3A17D08E5C36AF468A7F6308751C4141439B567EAB03D72538DDF71DEBD2AEC5DB13537A2B0130B4C2F6662182BD08EB750EB681FCE77981A3012102C45642BB8A44AD5CB27CDA8369EC28190F64987EB600101ACEAE7A807158CC8100555A82644B3B513D7CB283A363C70A4EA090241C8A96AC562E7FB3C38F3515C3A68FECB271713729FB77A1A68695FCF995855749C1F0AE09F90741EC332E7602CADB69E55438B9D8CCC213119627410488145777907D280DDB7391D2EC9F27371277C266BB1B14F6EB8D46B2C8BCCB0C68F3BEB2D87B07044904D5B08E84305B0686F923985A49ACDCB1A662D1A08948C9B8D95883518D0AD3933976C464A41C18351216D84066D71164A32D41886A153703C584B747555EEFE8309F0810D49C0DF8C5512B245F637C9448C47E1456995E922460B8210C7AC1063047C3764077288A1345C23EE0C8FA6865FDD52ACB49614207285D241C14114DB55CC0C92049F3537ABFF81B8A30A02E5AB013741B36D92191691B3197CCE8D2328BBB6FF61932434899AE01412B231B0EFA18D8381555866091C77981E753F8A2B95E8095765EF7A13BD38F9FED3BF36477916CB802690A213C83F6624A067A5E2C +sk = 212393FA68C40D1153EC29801F4472DB30B8E6516647CCCC6A160BDAC4299D515717D46BB4248673D11558D8AF5A6373720A9C96A4C51BF12AC506CBE51B560AB742EC684DDF86CB08121BDD412E2476842D051E3182C415C49B7184C9322242F70B63A960576296A8AF5451F5D474019C47E1822E2B1503D30CB8EA20B3CEC334A2114FC2381D910A98E633716EF9CA2F7939C7033BAB756371D6C2E906061DF822113C57DD5992C8826ADECBC9AE381931473558AC94FE8A19C9C4BEA3DC40DEFBCBDE234A211623F8D80BDEFC74F657A797098EBBE2B6B57438C2253F89D13BCBD5C0C4204DEF79BB37859E36E920768CA7D0651A7EC9BB63336698ACBFB6C9A384084DEFC1BF5D9C050087B691D40344E107BEF0241BD99463532A05B795F820213392CB16D668605CA86DF134C03C4A7DF581F8CA7DAF732F5AA75146457163C3ABFA9C655F966A607A69AA1234FD1CA2A97213F280A10E84C4AAD26C0EA2CBA6773D63B39EF7350F6D284830EC3275E5BB9A318B03F87CD3F3BBA41632C0F9A1E65989B74B91B23A82BCC22D617AAF8B14C10D0037AB970B8CEBBEC0CB866BE5057964B7CAE6C9B3084A696602A25961DC53558C065D6D8B25248ABA262B1B635322BB82165A8CBEDE60BBF6B72459D47B64A964B3C32CA563BA5AEABA8ED912D81B2E733B4B4587A99AE5037DD21DFC9ACA5D869596E36547C0336AE774B8BA637622A597C05DCD43B092D938429886C708448B24A45A701CE9FB9DB54C67BB531BCFB82EBC15C127409B02A3350D6168F1296784B86F7310B9160681F0133A66356843401B9C0414D7F687AAE41A36857CCD3B26BF8C11DEF30769E30630169365AA3C3B53CC89D9CF47C2CC6C166F197C9E5C5B2408B03C41B0613703CC4872BE78DCC4B28089D7118CA1186BAEAC1355D5B9D4E45515897AE233A26810356A373DCBF6CD5F02CDDE8C468BE006DBC67E60A69908D1171D4A5EC1643B87059CAC80C259788EAF195F4FBCCFC4C0284BE822F94C2978FA119371291657B927F8B332124D61D17E21A36485D2C3F2893865F305589A8D048B06FBA7BB9F087F96D5785678A7F2D16C892CBB2273677ED0CB70F5729AF0A0403B0BF0608ACEC1CE32F2924535C16E8423BE0C8854E439EA395DD792399DC98AEEB7493B64965858BE35977DC053B3C0B3788FB4244CD3B49E40934F90B454C983DA38B2B5C88521347788F832E9C64A6CD012511234275C9F6C251442A87B496743333A161D8C04E3D78BE3097942AACCEDE09B9CB673E1FA261BE71DBEB5C4E1049B2B2A00311ACAD4470F8AFC85172476B949AEFBC0110A261461291B5FF7A74697C88AD40C82770FCCF68B9AD5382125879E637B7CEBC1AAE95B03219CF2488B2E3B2E51480C8CD8022C2092470236FE6042DCEBCA24CB9EE9379386D80E54C232DEC93B99B694E99AB5E41CC8CFB8928D5C08EDC7A707044B49B8A131986A3F37BCDBCAB5255B64B4905A93A719D01A32384A87543B6BA1A22DB75C9BAAD257BC8B9D8B78641B394C7AE064087454CFB17B307BC35A97CCCB842602990747D60F30D220ED3171FFD7A2B77049DC210E2377607B817F24C011DD736D7918874AEA4B8BD98BE4597242C95C9641B194A093A928B8D3B30F33C10BA326943A8B704C09A6DFA55F700C488C38A3334716CCEB6585008A853162E40A544C0A16878328F47C4E67B5AAD276A2DEC4C320047E2EAB345CC14982B96D1D13566DA409E93072377A1729546117A04CE291A2090B60030A35D5B360F9F871CAD52F37E63954DA0E0A8675ABCC3717972F89469978730607293267CAC89E3C96A98576C2351D8756429722A1278A173A75114BAA4F0EEC6A12B09CAFDC99FEE2C1AF7ACDAE3C747B94B06517464F654ADAE25888A15CB4C5017076C9D3FAC3B1560DD9112D88B2BCF31B15AC420FE5A698D52AB41EF33FA6CA8D8CB9B94D58648F39A138974E8016A972308C7B040D2FA32BFD1096503A3A0E84B9941188A6720E06E6641B896D365190369766995826B72122D780477581BD69B348BB6C5C8F65B4D84AC3F0768EF6645E422B3ED7E38D0A423409C285D0E21BBCA97BE6707557BB0027E755F9A81912D04B9EBB374BD79411B2C283068670431F2DE58D346BB525D192F128C9316742115275E9214DEF7A61DA509B5848013B304216F783D77C3F57B76FB8DC984F05AB557709DAE4691B519C44D41813E4B61E6664AF5C970AE7A810714217745AF087BB00575B18081921A854B7D953E29CB1DE704E6578283292168EA73A03E2082B8B641C819649270011861A7B301DCEF74E9B116A86F717E30BA6C5398E34390072E20C82F570FCFAA2BD8847A7187052E6B9D0D9BC9FEC0217373BCC7B8D38245E40A1597077BB00A408E9EB2BB451C31A746D2AA07FD6432CF176382B6665D45343CF32731817023EE046577ABC342BBE25416DAEE417F2971A8ED4C839126E996A8DB40A55BD424C0E534CAB677FA1C6B692D2B7E322A331305F75289A1ED102ED604722737E76501C7E7ACC69842D6FFB2D31D1003C3B3BD8F4458D93B0270CBA21DB21A7D16E22E18584E68EA5B890EE839DE75B68D60B25D5452BBB91658F3220AAAB200EE7A8F070A5B5AA7FA30A768275970012324FE01910E8647945AE6F8B3A17D08E5C36AF468A7F6308751C4141439B567EAB03D72538DDF71DEBD2AEC5DB13537A2B0130B4C2F6662182BD08EB750EB681FCE77981A3012102C45642BB8A44AD5CB27CDA8369EC28190F64987EB600101ACEAE7A807158CC8100555A82644B3B513D7CB283A363C70A4EA090241C8A96AC562E7FB3C38F3515C3A68FECB271713729FB77A1A68695FCF995855749C1F0AE09F90741EC332E7602CADB69E55438B9D8CCC213119627410488145777907D280DDB7391D2EC9F27371277C266BB1B14F6EB8D46B2C8BCCB0C68F3BEB2D87B07044904D5B08E84305B0686F923985A49ACDCB1A662D1A08948C9B8D95883518D0AD3933976C464A41C18351216D84066D71164A32D41886A153703C584B747555EEFE8309F0810D49C0DF8C5512B245F637C9448C47E1456995E922460B8210C7AC1063047C3764077288A1345C23EE0C8FA6865FDD52ACB49614207285D241C14114DB55CC0C92049F3537ABFF81B8A30A02E5AB013741B36D92191691B3197CCE8D2328BBB6FF61932434899AE01412B231B0EFA18D8381555866091C77981E753F8A2B95E8095765EF7A13BD38F9FED3BF36477916CB802690A213C83F6624A067A5E2C9510A2A0B4FCBD414FC61AFF04A8DF579660D14B13C40EC0470C45F639B65A588AEC87A9A79204CEE2986867A2906EB851B734B8B22B91D6749B1A5F07C44E3B +ct = 9DC66C77C56800C40A5E71DC3CF139A83AC4308527DF4ADFBD930307EF72D020AEE3E44C3D548C67CAD24E04C21FDCFB69EF121985A565CC897A06CD2C7F4CDD767A5FF8F9353FFAED3363CF5F315ED386AF41BB5A3B0E395DBF12DD24FDAD29FBCD6056FBBC6D354739710EF74B1F4F7C212785F1451D3FA18443EA1F8E4357B7D0368C086C395B4FE548240F7F085DB4A361490412D034363F3514ACDA224E4F72FD7AC410FEC9D7E194FC9F074E8435D4A2049F9FA8663773D1087AC0721AF6665C1057AF23C2B5F3C478F16DAF711BFD0FA253DC1185F008FB8604568EE21C8B93CD1C0BE2CF4D7869C9DFBB94F4B7A1C038F834EF1B45144E8C1C4F3A7587CC0F9BFE3C6A2CF22AE9B835EE38B6D6CF89AB32316D307DE771DF9444B6B23E7054182CCF799CA0D0D0D3034DF22AB6FC27C507782E8196CEA3550A76B3246DDD1B9EB68AA110955C3F3FE19EF762CE5EBDA48A0B59DCE90550293AA4D550CBE5AC94E5FD79901D11B7C5BB261C598CF0C49AEEF25ED8ADB9042791B7377035C41638BB4D06551D80472D159A33854BCFA31555D95506466D118E6B2051E900EB7BA9B6DF3CB9E7D51BA93271DF965F274C4370266F8D0E1EE346D046250486173F96FFE819C231AE3E08EA12BDB2EE3B47434E6F68E19DF6043465D145AB978860DB6918995DC8E995069773ABB5F033EBC58DE26E6C4214177F1CEAAD65FF523FEED2761BDA7ACBA7340077FC0CDE9A938D3B333333FD32B9618459A180D55A34892E6B569810ACE45421980D9A1A2489BADC1E617F4E5A8B3B628DB737AB8668BF047598FC79FC74DD21FC783DF41833E033688CF3915F8328D557C1F482FC78EDE767EC705EE6767D25691DFAEF3A1EF7D076480CA1621888C6282FFD037FFA0128769A30530D92EB7FF4C4E1C86C0D5EA911C7AA2F2B37F1019B061CD6D6BF0F70E76E8139131EE149AA4197D2F2F284CAE33B96B5FE8C5F846D277C59F04DABA036DA670B821A4E5FB0532D0FE03F90AB8E223F06EE5FE9D982047DEEBFB69A02B145E703DC60AB95918971CA3A25DF7C32DCCEA0019F19D83E245F532F5207F8ED19D9A2F7F94F22FA60B1FB666DC21CCDEF046215C50095301D2902FC0D4882908A16B810FB44409B9A23D8228D7CCD0D510051256E4879395FAABECC95542C07E8A07458FCE35D1D882606B41794BC69481E22C53F7BAE8B5BF6492BA14AC16F8E80918360C3C7BE0F2E6985A2C32CDFD36EEEA99B2C5C140CD56E1AC51ACA07DFB53D58D8DB395A28057AB62EB16DE9DA139DA54D4934DD7E5E0997F35FA77FCF0E9C6387E854DE1D9DF06950FE039719B5F278FAB8BB81882EDAD67369D0D0FB1ED57BF36B00D961D87BDE080787729753A9ECF0A48F5B92A369FD71F8347E97170CD0F0A9CED646A120F73A414D6CB8217583BE56255628CBBB91F088C2CA1B1C0E0A302D573CE50D13F22D76AD4DD03908B9A84F4EDC74A234C16CD210E4A7D4880F96A43AC6C003D011CAA39CE78EFB2F8731FDEF17B6B4 +ss = 1F8D087B541B57A9D85F0737C39E73FDE01DB5BBE539834D8F918426A57DF9E5 + +count = 14 +seed = E2819EF86853BCA1B9DEE7EE1C1619988964F9A913E635AACF0D96CA6E0300D084329DABD8F149E24176D22757404260 +pk = A6BB3B93C181B651918A25235E22779CF052E1D30E6852557CA32AAF841834B423A9E61CC24B5231D7590F863E814AA19F123C0CBA97CB3773740871AC23868731748355A85F03B275B3273486142153BE4920BC9EE77AB5C05D2B96228906586EC831EBE8CF6F9BAC3631B7CC904DFC768B1A717274B33F70D08B6A79C4AEC3597E1C9664C9472B6C100C1601F27BC0AED37152E20B327B5D32646F2980BD780C8F476715AC04BF1E03C2D4A31DA23B14DC0233C1A2C2D983627BBC845F023E349CA59626A99EEBA5DCC12E8B82076EF2295238667308451C2052C6F9B127778A3C656213A23DC7E25660443183298753475BCAF667A9483192C6BF553B7E50B44A84A4B881B0365FE513FC661A03689581E045D2F921444C6A76E6344ED8A335B6681CCBC7B42B50B9B03558C64DA65088F60B136882012135A8A659355503918BA25DA1C167B9FB9F771B5727493C921338C1ACCCEFA80201039D28C968AA3A40C2A28835F63BDE23B9722A245EE3C859997F45E10A11F1906C1485B0B51093F51819963393A692ECDB1DDA2C88A6133F69F401B124CAD796217C818152A528F7D073BFCB9EACCC6CC8825AC4612533126C1CCC736DB53F648201FF29A6C3F77B41E01DE2087986F237200014E5FA540735513400004B5925CF64B0FFE9575E27AC19AC5644F355231BCDD70348C4507C80780F1D51ABF6AC4C5E2957A94325A3F64E83A0A192516F6CBB40B8ABBA5F8B85BF2AA60E44B46585BF009A723FE1A44FC97543F269F670C593935BDF87A52A1A31CD2B9AD92807407B5851B49EB1A2318611CACAA7710B6764A7E57F8962BC3FC483A8393640E602CA55526EB1BE56F2C61CE802B9592F24C14AAA75AA4B002AC9B81FC1327B2A93AA889C9EB178BEBDC91579CA7BD30796CC324447892558D2C052308946A451CA49816C06AAD39603DD3841EF03CCC1075DF164739FEB342ADCCE87AA12F550200CE94765EB4F291A5152941B4EEABA91C3A59257C03017C0B7E0003B07657BA60B4256A8A4B205D7646813246385B348EC157DC6EB3BE4546D7EB85C29512840018968743D2CE147F071C8F96C7436596337D69F5074485BF4A288833F2855787F8A18D874C5A2A41422157F65B62B5E581C2181A7023698FDC1AC60A8340A34B29F81B03DC35DA2B453FA61293070B1C6DB57F3040C3AF7766C69B84D624DBA1163FEB0C71FAB6582473F93C8753D67B0259A2EEE1C847B1B8A73455A74FA10C3A4C21A35AD20FC36D563BE9BC55350F565E4076670F0C77B3C4AA2A06F7BF2AD1BFC4FC8721618454D640189A6F8B3D6C71086DBA68B213F4C51100A6037E717147893CDAE20A97759204B2C684D8206FDCB10DF575799AAA3DE388CEAD4446DCBA8E14368F7202520C71E453B41CCE426BE6C1E29AC475C45742DDACF7C520DA15780A9056183900559129E5E3CBB3FEAA288B25B6FC69BB8B164C1DB8E24391172A8C23859545E98A13725130E45C3D1CBB5D6F5C0DC275608163916013E6E466C29502902C97D3BC33DD006ABAAF2AACC40C046E55951D744E31887155A3FA880058A8767B35684445982767C697540CE339A0F4C29C2AE42B5DAC5047C12C22BCC155A63A8610DB945708CB5425CE0C3C651532A43D32473F236519D54FDFE0A815D +sk = 69E774DB244D05192A2E064257F3A7B9B08941A2018ACA28C610B8BFAB59176BAD88B9A7781222CB03AABE6A4C2937BE24645A28C3A7931240503769EDD1865F72B44C4842114980BA64A59A647438C5476A700D0DC4A63277C4DC73A3DC9B59BFEB0DDF0817612AB73AB14378E93FA4982D15131C5016B36A639E4F689E9B6B2D2BB2501E130EEDF72AFE4861AE7CBE7E717B4C4001B78BAC719C6AFD40969392CFB1D918794B4988A7C03A23C8C5A751ED2C39D3E18474B43CF8B7814A5932224141FD543871AC102BB0A349153EB4A13AD57AC06602BFC6C1B4425284EAD058572A1C7C0CAFDC6756555B2033D2CE67F9155B16726625928EA26D13E2C0C0A66988EAB99643B4CF23AC68724CE635188DD8B3F2F421E8E8A9F838B707A16FBF27445A7555CFC052982CB002130CA3500CC428AEF14281564997D5F37D0A1C411CF73D3D2082E4C26C3BB7BEB9FBA2D9EC631F8953B3D03075318B4B720B4FB5B177D43C11E8979C640639136FA20B718C0846404B2F0604C55CA82F519241D811A697000DBCE1C743410E92922E83446410A93150178A4A2B52123174DB128B2EB97DF4E8A617D5876AB9977DAA8B7845537DB0A2B6E0599C0CC165438329D1251D6AA09D5B30F27040082A135C2B831B7722C416072C655C4D511E1FDC0284932849126D49B5A03B3593894BCA250B0D198601A02900C9406D8F5B69BEDA735A3512BD355DAD587BCA7330364031573B44EB9C2BD103BAFB7283C1B923AC3A41F0607D4B7B7E1E681AAC9B4090538B6B7975B9C5C64C6196577B7861CC88ED6C3365AABCC9B97A6A318A39A2BA8B17376509A563B58DFBF4584E6B00D56BBBEC309164982D1B906635A146C04BAD613C02C8E2C2D0597FC285779C628F3E290A84D8710745C444410F129A140358991D601FDC787FAF4506C6003E2130C2E03B3FFED39CA3B9BBAAA34ABAE794D4266E59A80EFB44528B2B234D70025767A5DEA09032767722C61E53423417458DE9E809A42257A27001E9C8AD43B775BC853D8475ABDAC86811D568E9E38747618AFF0B0901283A3913B6595CB2A85B6D42101DCBC90146AB85EA5449850BC9D8B1356F820EF365731F176EC0A0A5B7F35D9848C426F32D6A37046574A93CFCC043614E8708026621A06AC00582DA7B64421D4F50AAAC1BB10D6BBAEA31808712B891344B7B865243614CD706C2DC098B0A069FCEDB89ECD67DE8319C92F3AA0A9B92A1FA256302587A5859408B5CAB563EF1814CEA386BECD756DB669FDF87A003EA1E7654CAB281220B21CB234AC1C4B459EE48517BC838082191DE35B265D5264119C05CB500A05307C806AE8246128A8194F61024F5B2B7C410689150C0A8F68E1B3A51DFAA834B7C8ED989B351E683AF7BA73DD91E9733282FA2559AC53AA2819811190B5827000D98433241A3DA2B77F4E588B0088E3D3318CFD049C4777F7B08678144618E2406B9B6B72698888C4529B7E3B272E92620BB36792266C3DA4C9C403D1D49650B5530BE017C3B99C068890F2705702440AA0BFCA823059822C18981A03B16670E127386265487665ACA4C171E023621A853965A629757148E37833D31E453DC9B20191C94230833A6BB3B93C181B651918A25235E22779CF052E1D30E6852557CA32AAF841834B423A9E61CC24B5231D7590F863E814AA19F123C0CBA97CB3773740871AC23868731748355A85F03B275B3273486142153BE4920BC9EE77AB5C05D2B96228906586EC831EBE8CF6F9BAC3631B7CC904DFC768B1A717274B33F70D08B6A79C4AEC3597E1C9664C9472B6C100C1601F27BC0AED37152E20B327B5D32646F2980BD780C8F476715AC04BF1E03C2D4A31DA23B14DC0233C1A2C2D983627BBC845F023E349CA59626A99EEBA5DCC12E8B82076EF2295238667308451C2052C6F9B127778A3C656213A23DC7E25660443183298753475BCAF667A9483192C6BF553B7E50B44A84A4B881B0365FE513FC661A03689581E045D2F921444C6A76E6344ED8A335B6681CCBC7B42B50B9B03558C64DA65088F60B136882012135A8A659355503918BA25DA1C167B9FB9F771B5727493C921338C1ACCCEFA80201039D28C968AA3A40C2A28835F63BDE23B9722A245EE3C859997F45E10A11F1906C1485B0B51093F51819963393A692ECDB1DDA2C88A6133F69F401B124CAD796217C818152A528F7D073BFCB9EACCC6CC8825AC4612533126C1CCC736DB53F648201FF29A6C3F77B41E01DE2087986F237200014E5FA540735513400004B5925CF64B0FFE9575E27AC19AC5644F355231BCDD70348C4507C80780F1D51ABF6AC4C5E2957A94325A3F64E83A0A192516F6CBB40B8ABBA5F8B85BF2AA60E44B46585BF009A723FE1A44FC97543F269F670C593935BDF87A52A1A31CD2B9AD92807407B5851B49EB1A2318611CACAA7710B6764A7E57F8962BC3FC483A8393640E602CA55526EB1BE56F2C61CE802B9592F24C14AAA75AA4B002AC9B81FC1327B2A93AA889C9EB178BEBDC91579CA7BD30796CC324447892558D2C052308946A451CA49816C06AAD39603DD3841EF03CCC1075DF164739FEB342ADCCE87AA12F550200CE94765EB4F291A5152941B4EEABA91C3A59257C03017C0B7E0003B07657BA60B4256A8A4B205D7646813246385B348EC157DC6EB3BE4546D7EB85C29512840018968743D2CE147F071C8F96C7436596337D69F5074485BF4A288833F2855787F8A18D874C5A2A41422157F65B62B5E581C2181A7023698FDC1AC60A8340A34B29F81B03DC35DA2B453FA61293070B1C6DB57F3040C3AF7766C69B84D624DBA1163FEB0C71FAB6582473F93C8753D67B0259A2EEE1C847B1B8A73455A74FA10C3A4C21A35AD20FC36D563BE9BC55350F565E4076670F0C77B3C4AA2A06F7BF2AD1BFC4FC8721618454D640189A6F8B3D6C71086DBA68B213F4C51100A6037E717147893CDAE20A97759204B2C684D8206FDCB10DF575799AAA3DE388CEAD4446DCBA8E14368F7202520C71E453B41CCE426BE6C1E29AC475C45742DDACF7C520DA15780A9056183900559129E5E3CBB3FEAA288B25B6FC69BB8B164C1DB8E24391172A8C23859545E98A13725130E45C3D1CBB5D6F5C0DC275608163916013E6E466C29502902C97D3BC33DD006ABAAF2AACC40C046E55951D744E31887155A3FA880058A8767B35684445982767C697540CE339A0F4C29C2AE42B5DAC5047C12C22BCC155A63A8610DB945708CB5425CE0C3C651532A43D32473F236519D54FDFE0A815DCFBE9649D9D1C384BAAD67B91B2F3E21F2FADD6BB582A0B9CB016051DD82C75AA2ACF359556DF4A2ABAEB9DCEE945829BEB71185B4D6BD18B76E5668F253383A +ct = 438BD56B10F4813575D7CB4D4F502AF16B0CB43BABB8B636088AB627CADAFAC7FA8A3B3AC3E8903C6F72A6A060ECFB81F2F86974E324BFC5A6EECA115AC1F632BD83BE1741204499997E1255C547E3F6F4D2B4C92D8671FB3342C1DF8C0B1B927E33477D589F74732BD047DD9898CFE6293D1F6108F74924D68215CA691552AC1CA07487FC7099DB19BD26B16B4474873D352384ADC22AAFA0C36CDFE4A5A486372398E2117A894C3FF3DF86F724553A419362BD1AADBA1730A85EFE908BEEBC4AEA15C83A02E0C5424CB39261697E3BD534652DA23B6E64118DB7A355438BDEB1D3D895D281F0B095871EC4B108354DDA84D252C819019FD3C0469014EDE38B16FAF69F12688FC7A17FF074414A6157E4FE4C9F92699D3B57D00D31232FC8BA2A05B4253CAF6E9F550FF9DDD063B4D2939A5431021450DE80538614DF20CD2C21C644DAE73C1621B6B7DE5CD08EA474383A9F842E69EC29C37BDBAB43012313C984D8EBDB386DDAD5429467F6E3CA94D1EEE89F77783724ADE7D1D375C6DFF1F483D6849BA5CD09C6EB8740CB1BC463F0D4C9441B6F248C029D8E94F994DB46E892C2B546C1DD3C1B71C78BB5B4C4D15F3F3382DC075E8CF29AA3D4700DDCEC71BF6C836CF84FDFBC60C145DBDCCC49929CC989A206E104A72A6967ADC2B1CF682BB4AEDA52475851DFC72EF76A33231DE8F44266C13CF3323FE8142D73FA5A6D021D31C15FB95DC3998BA113154ADB6CA2370B9627F7C15A8E858C15BA769AFC33339DC55F783322C41FDCE25EFD438879EEAB6293A1E47C5089C1CFECE5F194740567B2488998F7B10D0C63B5212F556B2C0B1F300A22A54185AA8431FA20F2C59B898339C6A9A2462EF5330C9CA2CCABD333666689753440882152E7CD74F965111BD75AB4A1B9D50F8F09C8E63268CCE09BE63C293E875C3CCD5518C2B9665226825FA269D8D5C078F50ED5FA2B0278E75E7AB2444FBF4C4B33E3C2E9FF7EA7D720208A582399D0A381CB3EB087BEC172F99F76948ACD97D7CABEEA2D2EF4859C087DF9F8216B904CA595993D81CB21FADB7E5DD1BA854DFE16B4E4818A2A4C7BFEF3FF1F499D30CF53ADF2E9DFAA03147931760A359213F58A8ACE9BE58E50B888F85CA6F022F7D1C152743E341B68BD6DF17CA099FF891A5F702E8AD845F092C8DA5A5F584FEBEFBCD0280473A7F4AEEDF0701D7F69BF8B94311D87F1C03222EA9698ADEFC602D7C4FB8ACD59008AF4FDD75B5A930323B742887A0D91CA209063754E55E21E8894FCAF8944675002244D0134A41E43270A9E918753C1224D2992B34CD5E0B8C1E79EAAEB74B70A215C7B75E9298C7AFD0F4B26CEC3EBD13D7462FE0569BE3145AEB4393B3BB1F5D13281C7FC4214168E062F76D7EB2A7B7D16A1EFBE155025CB0085DFC4A706E79C0670CBFAE9BC7A8390C6DDDDF1FD4E83D56D242AF36DED7B0C38BF82081C631A3905EE477F70165BCBE327658768EDAAA49548CF446AA574B7C97071EE2D0063A8D8D2FEE0092D2687F60E005BF0 +ss = 0DA3B9B56FA25F4CA356D3206B99AC83FE84A09CF7FD55A33268C122A8FB51AB + +count = 15 +seed = 669C4EF8A051CE201DA65FC4BC34D398EC1F806276FC5D987AD71D93BC12DC8F107B58BE6E8422A0795C88CB9A0E7488 +pk = 8452A77401C4E343BDCBDC985B70189EA976E3D65C47649593C9CFC112A4292238302253118CAB8EC52060305392E6A131F0445A0BB4E11A1A8D7465E704B3134C3807D9BE9F8B2ABD57A00758685392592FA0B01E116410706A669A0EC5ACB524D1561A265E307C24068B12897568490458121C572C2CC43B2464F2703212641202A40B27A41FAFC4B24BEA9F26711F28B1050645A38757708AD607FF6763F14C15A2CAADFC2BC4D23C576E5CAE6A20B10CC9CF610A5931AB4C59ECBE67EA079BC3911A96B24B86A0D6B99CF85AA44094B0F6C55924776C4E1BC9CFC88A127B8195145DA3515288F933DA602F1A2747A6856657B2102774BC1946163B534D02A1CE2E641CD9FC7F7D48B6F643AB53045BC690A249433553845B34A5953C873C1C686C83BA46ACEC4E91046F9E7590196C9C24A747C6D986B4B414C223A52A6C88475405232C78AB3AAE8861A45A817EBB16C3A3070B8E842527E965013244FE50907BAC3883122393340B1E06728FA0400791B1DC3BA103C8AADB6CB0328B5EFBC85694164D0934C207B63614CCA28ECA71E5F63A58604599EB6D1D248A37EBCB17335713C4C9A0500FBF893DF475CF7C19792FD56FE0A7505DE0158F34603E0071B2AA0BDC8A12376A1313F571D33686D505660C4BACE8EA40820918E05BC15B381B90D9B31BF52E1B18C422C3935D04140170542829CDCFC883BC344606E75A2EE7AF469C5A81DAA1071771FFF275F2358472B409B1EC31EC887FD6E76CEEC6812D40BA4469B3EEB028A0A6875A19B7ACA51465CC3FE78566A3EB1B98C621EB3BBDA4E7BEB5F2344B64013EC233FB5714BC68B767DA8B60A6B0FFC8565369C19877C16D7C70F17B85F7A228D28A5936968915D026CF683C762714830C1742AB4DFF789F1F43782622A070A4AB52633EFC52693B695DAB939BC24944733905AE86801C4577324C625159B141C5A1014A6E458B71A959001839C461E17A3AC46DA47AB687D2342FF63B83D3331510C98AC484F44B7FB6A31F6926CF047982C400008BB3B0D1EBBA3CB2345613680531B0708A64B937C88B2985C01A10EEA22FE5022912F9AD2BC667CEA16B0A091F3FA9BBB9B8C30160717B21CEF9D74458241BEEDC215D44900CF40709F6671F221D39C804EB6756C812364DF0503355B8B01102574AC3F07234BBB1B658EA822D52A452545DA3544C041C3A3F89BA30005A992B432178BFBA078686A07971601F8B12C22B23B69C05A89ADC2469287F052A6D4F58798E10A464DB4AA71AB30A94854D1B8C16893B432A8DC2859C66A168C8C5AD4D04559056C4588B0A8755013E378545B47EFBE90CA97552C9B8711D3281CC7B9057F78A68A59D5AA642D1E9233DE093DF5705D8639D702097F0DBC98451A46905AE72D876E1243546590599FC5923B37B4CF0A3F7CB47DFE8AF00F6A999127A256681A5705BF5100D7096713C49149C7C561C0783E048CC3444776BF8997671970535C2CAC5360C9B53E0D952AF348A28E4826DB9810F07110A48771C2C9B21DA3CA719C7A5407B92020AAA0180B4D6B3AE42A1C09CA38FA59D1ED02A3A0079F2E922D0B36D9795C1FA42354CA51DDC11A315515A45BC7E1E21BCD3287E18BB0AC3F8119A88D1FBCE1D3419BEF67B6694D9FA1BB309CC61C819176964DC +sk = 48C78CB714B9CF88A8B317A6FBB681B8F47D56524122156503823B600236D3726EDD9087504705CB4698A1515DC0D80B3F87C63D575170F45D121A848D897C3C0063DFE9B2D616A96552384FB72D6226A193F90E15B364AE667C34BA27FDD0AC0DEBCF450578C6D182DA365D40786522C37B54E0126ED7B3C6BCCF28F40770F23736B394210B67EBFA72F6B27799FB1F6E48CB7407261A86884621C529974635B35F5B4C530E68BEE8CC213387B66A4127D01223180067A2EC24B2EBB579F74BFD5417FE995BBF816737722912B5B4DBB4C938D0686D1C2A44880FA7231944C195FBD67C67E60861D169DDC41F8150B52A68C14425190BE2ABBCF5BABB734AA03538899678D4290738CC63EEE611E4344EA73B9C41F36C712A4C6C72422000CB93E144F3C588A2299D5704CB347B90B2905CBF69CF1DC5C670909C478094E88C01BB3B3E4FE246F8DC3C62DA37BB13B6E2046911D85D5790869FA4A54FF16794620480919C0DD74B9887BB5C125C34D76B3527A42A46B689FC4C57571AF13C44B7D30A041028E97C0A1E50621567374DE7A4207ACD4CB18417C7984645CF4F2B5A5434BE8F119798C0760229301E14431B0B652C643C0EA0CCAA13CBC6FA6DC8D348B908B78343978FD5A0EEE90CA5104184F33F107837B3EC667EB207000570DD33856939BC8BA671B3731EDB2A94596A8F2F37BBBF5048087091FD2AB164F5C6A8F92F65239F08844ED4F605E3BC1BF780877EEB3F4C85BF696C691F85A947461331AA33B15973AB4923F429C7913731BC025539232217F801EC7078E2F0AF3EC7494684BFC40B4FF31798467746F60BC9BCCB5B1E397DFC6165773A965E55034DD1094966694D7806F2F505CEBC3B3DC307405431FCA21614089C633B522510A5FCA73462B32FD69200DC614C5E88454F181D845B19B8866259A2372BB3361B9ABD5AA278B1773057E26108BB020A9610BC19AF13454DF46B4FB5A68C3E7ABA6E7197AD63439C7252CF9507E32072E437296883C93902250165A1AEE8BE0CE6ACC2029E10E97536EB958B691AE3E3AA9996986805C6D1F6356D26C1E63C550381B292FB1B95E183CA933D5BE1BAF6294C4B248B4264724712B2A2816ED3D09042287EB8A17AD6C86255AC492F53A21EBCC19B3C8BB1E78F58BA98BC8AA77F6A5CB90C0456E1CD663137E11185536B02D8708644539701B193BA52258064B289D053404BC78A397AB86895BAF1934E8B2F6CC3AE48869BE7422E581A6FF748519BC30BC96C716B0A24A02679ACD5151CB2A0FA127C81EA513C3CCC3B84A34025522486CE424BC04C860EDC5758AA990FED372DB324614FE91589D78ACC88C43C2643D540A509F090EBFA6214832C76CA982FAA1CA4465F9C14AB4E6459F072558946CEBA113B5FC7024A364970C72933331A6A4B0D4196B9E6219595E229F3E28FB2D5C6C4C041DB226AB611B04C3A80FB5A7F15E08DF3347DEF02663AA39409AC4E8C8BB0934B46B6A8816CC70C8C0B11A7EC1CCE57BF5BAA30E69207D7E59C9E386D5CF7863C133BA1B510F5E06C4876BA7849611BACC369B039EFE173DF6B8A22469E1F200F2AA53FF84390B88302D9F9915C4B8257754B3423097E7C6B8452A77401C4E343BDCBDC985B70189EA976E3D65C47649593C9CFC112A4292238302253118CAB8EC52060305392E6A131F0445A0BB4E11A1A8D7465E704B3134C3807D9BE9F8B2ABD57A00758685392592FA0B01E116410706A669A0EC5ACB524D1561A265E307C24068B12897568490458121C572C2CC43B2464F2703212641202A40B27A41FAFC4B24BEA9F26711F28B1050645A38757708AD607FF6763F14C15A2CAADFC2BC4D23C576E5CAE6A20B10CC9CF610A5931AB4C59ECBE67EA079BC3911A96B24B86A0D6B99CF85AA44094B0F6C55924776C4E1BC9CFC88A127B8195145DA3515288F933DA602F1A2747A6856657B2102774BC1946163B534D02A1CE2E641CD9FC7F7D48B6F643AB53045BC690A249433553845B34A5953C873C1C686C83BA46ACEC4E91046F9E7590196C9C24A747C6D986B4B414C223A52A6C88475405232C78AB3AAE8861A45A817EBB16C3A3070B8E842527E965013244FE50907BAC3883122393340B1E06728FA0400791B1DC3BA103C8AADB6CB0328B5EFBC85694164D0934C207B63614CCA28ECA71E5F63A58604599EB6D1D248A37EBCB17335713C4C9A0500FBF893DF475CF7C19792FD56FE0A7505DE0158F34603E0071B2AA0BDC8A12376A1313F571D33686D505660C4BACE8EA40820918E05BC15B381B90D9B31BF52E1B18C422C3935D04140170542829CDCFC883BC344606E75A2EE7AF469C5A81DAA1071771FFF275F2358472B409B1EC31EC887FD6E76CEEC6812D40BA4469B3EEB028A0A6875A19B7ACA51465CC3FE78566A3EB1B98C621EB3BBDA4E7BEB5F2344B64013EC233FB5714BC68B767DA8B60A6B0FFC8565369C19877C16D7C70F17B85F7A228D28A5936968915D026CF683C762714830C1742AB4DFF789F1F43782622A070A4AB52633EFC52693B695DAB939BC24944733905AE86801C4577324C625159B141C5A1014A6E458B71A959001839C461E17A3AC46DA47AB687D2342FF63B83D3331510C98AC484F44B7FB6A31F6926CF047982C400008BB3B0D1EBBA3CB2345613680531B0708A64B937C88B2985C01A10EEA22FE5022912F9AD2BC667CEA16B0A091F3FA9BBB9B8C30160717B21CEF9D74458241BEEDC215D44900CF40709F6671F221D39C804EB6756C812364DF0503355B8B01102574AC3F07234BBB1B658EA822D52A452545DA3544C041C3A3F89BA30005A992B432178BFBA078686A07971601F8B12C22B23B69C05A89ADC2469287F052A6D4F58798E10A464DB4AA71AB30A94854D1B8C16893B432A8DC2859C66A168C8C5AD4D04559056C4588B0A8755013E378545B47EFBE90CA97552C9B8711D3281CC7B9057F78A68A59D5AA642D1E9233DE093DF5705D8639D702097F0DBC98451A46905AE72D876E1243546590599FC5923B37B4CF0A3F7CB47DFE8AF00F6A999127A256681A5705BF5100D7096713C49149C7C561C0783E048CC3444776BF8997671970535C2CAC5360C9B53E0D952AF348A28E4826DB9810F07110A48771C2C9B21DA3CA719C7A5407B92020AAA0180B4D6B3AE42A1C09CA38FA59D1ED02A3A0079F2E922D0B36D9795C1FA42354CA51DDC11A315515A45BC7E1E21BCD3287E18BB0AC3F8119A88D1FBCE1D3419BEF67B6694D9FA1BB309CC61C819176964DCA19C2C9C907B129D01CC44A95949121C39534CC98B6D105E60FE519A000CC2AEDF05318B5F655EFE36F1B678CF4B875108A18DB2FA312261CAF839F84BD956C5 +ct = 38E00521B95D89079394AEE0B444233F135FB37AB4337A575430DAAFA341059049A49D1E7D3B6EC52EF44F73154A6827BF791A2986309C7D88A855A3E278F42880B35260C340E913FA227D0ABCA526065DECA1837ADA0ECB4D4911BDE561E6F3624AC6F4601CCBFB5851DC74A80B5C3DAC2C3B3E4FB0B1D53653C9FFC4440025F70D09EDB2EC62AE4330A85B0E1D1936E9EF2E82A7E7C3C61E74252A997F4D5B0A5C9070D3DFF6855455C94D22498583016B9C108F8EC0D80BAD19272D982A85BC2688736D50FE7BEDC3D1DB893D42331A60658A4FF202C46450D24A2F1F5BB90342D26904B0E07A3E5D23DC9CA9E8901FEA9CCC49914549A913D8CFB3F0ACE306176E377624DF734967FCBA76FE125BB1B7D9FCE809617114B0F761B4A8381F28F20B5B53DA07B0B31A644D7B11FE444B9B59E4110589CAF921488E176A830DFAE522DE3C651A0E17AE0C42CC9981E906534CF95A013653636A655EB564B89ECFA9C538CD3C6D8AE6D1DD541538CEC73669356E18F2D7D1B668C5A7BB9B9F6F96A590E31FF19EA85FA9AB51418BFE7ADDB99D627645152AEF8E518C625EB3B49F22F93E827784EB5272F9D04826A04D89589F52E16C7B1B48C4C5625E76F2DC8CE6E1F092F9CB9157766E15286149513BA24F9F64016B165E6441F97137629526343520FFC30BC48B4523FE68813885103D0289501275238B7E9F5832E5A0299804A00E3AFA2F1F3D0A247DB2AE9D58D3B8FE09763AD0C5EA658820C540026D4CC5A1528C63BAB66AB97CA8E4F1C81CAADE9491DAAACEF0940866756CBBD61047D882E3150AC1E47DFF9AB68D4B0C282887AB37E2EABE5B265B9BF3910C3C24B8125752F4006F9625918D2DF1FFBEEFEAE895C5B31D865F16EFC9FCDFEEABD6EB1A688FC45D197FE5D4CC8CAACFA1E264A203234375D8A4F141E25FB263A63EE1FAA6842BE1B935956494775B379D91D828E9981013A7E6CD049EDE515D4EE4BA74976C9D68417A27FFB03BB3E2A0FFBD8C801C4AC78C41E9CAE33EA6BC1F9A8ED736724F9EDA52E3E2BDC8BC11E67DEC594FF4AE3DEFB5B643CC5C607102270AEEFF76238D7B5FC858F7FAFF305F300D99EA7989E3141DEA159C32D622B693939F100E8F5B4A633C7BC6E3255ABFD45DD80C7AEB51896813864FFC75CEB576B681F8967C14C720E01950B6DC7AAC1C845EC01E21F378A8B4512119B3DAF1EF9DD5FAEADA667F599C953C0BA321B3C2D03987F3B169C3E5BB4ACDA824921759E557DCCDF82EBE520EFDB1D3A3F082AB063B51ABF1CAF89057B807591A977BB89C659C14A2BF12154956FB3EF13486130272BD8B8655BFAF83A304B85F38D07CA0E5D5854191F0B21B59296A9377E83972F665763D405CF4C01D03104E4855D3B8573961446FD1F5199A6DA97AFDDB8F4B0822C4A1E9F668D04DDCE81D0192F32BF8D0B94AC57895F3209E616D3449309832DF9FAD95233FDD4B3036AC0075E3DC2A25D70C1B922FC9925F20C296A93F307E5933B4C62AE1947EE2D35EAF6389 +ss = 806390146332DAF2AC2CE5499D2ABEC128137CF7DB02C27FB457663C18A0D7B0 + +count = 16 +seed = 9DEBCCFE818F6B5204DB4EA09C03EC9A19DCF1629C1527685B8A29776BB1DAAEC45F8ABF8F0ADC9A8C8BD6E2DF6D8048 +pk = A16730C3D8A8484295A1D995716A3BF93C7270671AFB7886F397AF65F5BAC1B1A1A49084D1A672A1F98BCA762287E90410AB01098C74869B42479C2CAE5906AB354970C05CD256514F5C2E763230B6770884E7B700544977993DF1F57969E0265FAC4F474B76648B36F5711163638069820232B8A64F16BDE83557B0540405D7987CC39069923DFA984CA4045999A77483E04FE6EB0BE954A74C13CFCEA79ED0D8124B01B740A26ED961B2BC496CBDC539A10B8151E0078F66751FE78D2F3A5100761C8BEB514923A7B4F3AE208766FD852222DC31FC1A59A883C401459DC73468EB35AF61D28EC1DA147C882CC7F5AD5204BD8DA270E4C91DC37BAAE1811CFF4CBF8605BB48AC8585094327A8C17527BF5B3968AA268E152B6896A288A9722183E199F608CD7A412CA949113E87A956E4AD12737D53C3BE4752533BC755F7A1C4B07661E988210AC72131B4496941893A9C6F1180BA622436EEB02F3A3A090C00B1FFD310E811A7A8B87984D275D76B0F99ABBFA45CC5096A1562A375F0599D9698B18012A84A0628601C731CE1CE6824907F1B16878A75418C2FB0751202FCC988779BE2326E2E5228C9493A0E628441B13D58B3C79DF34B7B53C7BE816CC7368F2F31C380296250B33269158C4F9706D75B3B5536ADFE5B0BCF514899287B4B637BB4249DB25A0413533D628597DDD745A7F5270D136763E48A517CA62E116913350E7361580CF77BCDB5B607B38D49E1581654A61AD9602F4415F484BCCBD833255A29D2E76262B401F7FA5A1E68BB136771C41B29333B653602B79A2ABA21004E8A257DF7362163B6512EDA4E1376ABA1FACF04D1AA56C814000D718B5B504F1B9D2E627B8A678D0294C5E3B186A67C082B90ABB1C839232912C39C3E02717A65E24A185A5D96E99851EB538A4AB872148C2D7BC52EC4270F708690D0678D43C783CA194B4AAEB6F2156297355D7823E0F80890608768C65073E04E7E5B45ACBB1CB6446483E7C315A0A0C2066F080A53818A4EC0E4973F630F6822A437F6684FC9431F20A306A055F9906435172699B3CD0D46457BE26560F692864A97F80B493093270B5225980287F1F5711B355F9CCC018D670ED8BA64F10BA98B0068E7714074E14736087819EC2CBC960FE6939A4E9A4DE2045B53E81FBB845B0E546DE6B34EE9E91ECF0C9F74C569DEC949D3EA11785639126BBD45137021E9670735488E46A325342A2B4A959297816D1AC731CB501D628BC09083AB5C4DAFC09A36C7C70F2885A6622BB7162AA2C999927A1FB749BAE280237DB21418E2CEC419990288B813E80765B47E4C314171B849E570C7533CC5BB77CB9F10272926C382FC0796F39924B6971FE6B54638C4CF25318E146AA02769E64C47E4DA2D5264B282B32933D8C74242AA73C15875934E99D6C570572E03C54E47726E3B0416D3737A29624169778970E99DE64BC2B16039AE97C7472A41C9A6C6FD45BD7738CB662505BB26A307A2CFB9680F5CAC086F9BBF7799263C0B5367032196F1BD842534601094668A33BD339DB59746D63BA6007887AB750F5887453E02B22C3148BF6C48C806A94CB7BF23568789A1260C87AF0548C71881401C565268317756A211B6955ED03C49E0BEB46C4EA9FF7BE444932E61D464966BFFC96BEC0647AB34F2 +sk = 953B6E6F452FFAB6B9E27B707F600992E228F5FAC92680AAF31300154B218AE51A012A4CF53840CFD714CB63CB4C7AA0E8EA6E50803CA370BB38C7205D9365448B38308868C83348ACC365BE62B4FA763ECC5112A48558E57230D92B5869D77D99A5C0BEF49819500B333300910117E05B082D15368AE529923C6BC9D3594AB33C91B81549829A2EE55AD152493E80AA80399F770899EC05417A698E6493AA647691FEDC92854C23702CAAFC8AB3A3194CE8437B8E2A7F69454ADF3170C282972ABB93CF152DD85587F6272B0B71590C81B3A9F680D19445FFF0C395310A17F55272CC3E1364A9AEA7A67AF4561CF10043B7B7EB4AB0791A8D62814F4B6536CFA69CA0493FEC1A53D58709FBAB9C87578D83C9441D62C267E7AA4EF0AFC7106C9F834A5A13206C4B58D7378AF90B85F7E05237559D6D7819F455AA01D68BC297A8DD760A0DF971542919979218B4861A49E45AAB12BE67080D197C25CA53483D781BA27893D23BAECD393DD1643DC2A53275C84A19900B364CCC94A8BA3B5768F8DBBE08A7B08FD2746BEC62C98C5E5198695B12048BA5C98753AABA88BFBBC6C8DE490AFAA8343D334AAEB72532C63D60667079B41B6A287B04C797458ACD9104C94E96BF18137B0868737DC00A8E2164E0980B9B2135DC7C0E80E1B930C22874FC2CDBE0B5542732E8FA80E407A1A6E5AF0AA3168A963587379AA3E6A2B082A8A35604BAD827BD6AA1FEA76A608100DDC40B17283EDDAB2335B8796DC1BB57887787A4273C4185867368BE581F6E5767BBF0580F07B003556ECFFC3AE336260FA0A80A2C9E4C9914144551C89A9D68373ED9C7AFA83C75C6B8AFFB54187D3B46ABDC61D9E070B5584BE7564F932985EA4C739CC906732A7CF79A65F0F7B0682CAA5D2070B3E0699B1BB3AC0B38CAF22CA4DB9472D06B02954E36C0A3D8890473588C77E43990DA1C7103985761CA711109BEC0B805607D732A36BAF897E93C6D9A988B94C67A4592B7583126FD452FF0B45A033824983715C60478685B9C2D013D41B47EB342A05FB76232554DF30990D6F1B37EA9172020C66FAC8F415615EBE07833A2588EF622034074B214CCD9395648071821D1109DAA87C0E00CD9573254538EC3B8459CE56578C09CA66A508E88C4DBF6183A268B86FA4B7733A8CC89AC81619AF8F56D8ADB1F665A7AC413005BE730AA41CEF2B06A7FBA535552C8CEF73E90A8584A8B799C323F61FAAD4B8C25D06CB883493147069EB1C9C8FB262B699693D0601262E9CE5B383A0D27C1572C49547BC908C003490827343A690859A15B20119975C35AA991183052F117B53D06C5F4683D19CA5BA6F5595B8B269D96C1B3524CC8FC6EEC750CA33B5518603F59B50741D246642BB88EF61A8BD4C54F48AF3F573D4CDC5143ECBDDAB5A281400721544E16E35EA7A05F161003A6C3ADAF690189BCB074F546BC2033B1E8B00D56CF32E0733DC81D05EB358D148A91FACA963B814A9C5FDFDB4DE79B729DFC26C3D9B48A4730337B0BAC8C2A3628268159979F6B10AA9AB90ADAB98B9C0928FC4E3570AB01F02D5A64C5F605596E3498EA532472760F61CB2EB734C174E48237C656636645886B65C566BF95D927A16730C3D8A8484295A1D995716A3BF93C7270671AFB7886F397AF65F5BAC1B1A1A49084D1A672A1F98BCA762287E90410AB01098C74869B42479C2CAE5906AB354970C05CD256514F5C2E763230B6770884E7B700544977993DF1F57969E0265FAC4F474B76648B36F5711163638069820232B8A64F16BDE83557B0540405D7987CC39069923DFA984CA4045999A77483E04FE6EB0BE954A74C13CFCEA79ED0D8124B01B740A26ED961B2BC496CBDC539A10B8151E0078F66751FE78D2F3A5100761C8BEB514923A7B4F3AE208766FD852222DC31FC1A59A883C401459DC73468EB35AF61D28EC1DA147C882CC7F5AD5204BD8DA270E4C91DC37BAAE1811CFF4CBF8605BB48AC8585094327A8C17527BF5B3968AA268E152B6896A288A9722183E199F608CD7A412CA949113E87A956E4AD12737D53C3BE4752533BC755F7A1C4B07661E988210AC72131B4496941893A9C6F1180BA622436EEB02F3A3A090C00B1FFD310E811A7A8B87984D275D76B0F99ABBFA45CC5096A1562A375F0599D9698B18012A84A0628601C731CE1CE6824907F1B16878A75418C2FB0751202FCC988779BE2326E2E5228C9493A0E628441B13D58B3C79DF34B7B53C7BE816CC7368F2F31C380296250B33269158C4F9706D75B3B5536ADFE5B0BCF514899287B4B637BB4249DB25A0413533D628597DDD745A7F5270D136763E48A517CA62E116913350E7361580CF77BCDB5B607B38D49E1581654A61AD9602F4415F484BCCBD833255A29D2E76262B401F7FA5A1E68BB136771C41B29333B653602B79A2ABA21004E8A257DF7362163B6512EDA4E1376ABA1FACF04D1AA56C814000D718B5B504F1B9D2E627B8A678D0294C5E3B186A67C082B90ABB1C839232912C39C3E02717A65E24A185A5D96E99851EB538A4AB872148C2D7BC52EC4270F708690D0678D43C783CA194B4AAEB6F2156297355D7823E0F80890608768C65073E04E7E5B45ACBB1CB6446483E7C315A0A0C2066F080A53818A4EC0E4973F630F6822A437F6684FC9431F20A306A055F9906435172699B3CD0D46457BE26560F692864A97F80B493093270B5225980287F1F5711B355F9CCC018D670ED8BA64F10BA98B0068E7714074E14736087819EC2CBC960FE6939A4E9A4DE2045B53E81FBB845B0E546DE6B34EE9E91ECF0C9F74C569DEC949D3EA11785639126BBD45137021E9670735488E46A325342A2B4A959297816D1AC731CB501D628BC09083AB5C4DAFC09A36C7C70F2885A6622BB7162AA2C999927A1FB749BAE280237DB21418E2CEC419990288B813E80765B47E4C314171B849E570C7533CC5BB77CB9F10272926C382FC0796F39924B6971FE6B54638C4CF25318E146AA02769E64C47E4DA2D5264B282B32933D8C74242AA73C15875934E99D6C570572E03C54E47726E3B0416D3737A29624169778970E99DE64BC2B16039AE97C7472A41C9A6C6FD45BD7738CB662505BB26A307A2CFB9680F5CAC086F9BBF7799263C0B5367032196F1BD842534601094668A33BD339DB59746D63BA6007887AB750F5887453E02B22C3148BF6C48C806A94CB7BF23568789A1260C87AF0548C71881401C565268317756A211B6955ED03C49E0BEB46C4EA9FF7BE444932E61D464966BFFC96BEC0647AB34F2E4174B6E7542FBE80AB2BC06DFB802F691AFF147FF90332D5EA739216C18D872DF7D92DDA83E6B2EF4CCE08C9134563063068A196D7B1A1A13623E48AE12528E +ct = 7678F9F69052E083A490965D779518878DF36A286624797D9A00D562D4BC7072292A63B24C01A747DBF24822CA2EBC078EC3BAAB0DB9DEAFB0F3CBD655AFF659514016EF3D93E8B52340A850089E5FB8292F72C86A879485387B190ACC8E9277AB4A8EAFC7BE2F32138504BB7B67ACDFD9B912D66E76DFC7F66F6E46231FAA4D01FEB97E1913B602477DA05EEA0158C4D33C2E701986411F9EE8B8518B8187EB0A98484800A2FF2C483CFD811A64D3A9412EA798996C87801F1227C19CE8139A53F42DA6E5BD508B429ABE96AC93147FD660B431FD2E146017C037DFEB89F8C5419DC721018B1979044A20FCAACB9D7D2F77FA0A370D469E253B89E58A1EB7DAA6BFD983642E45D746ABB642E0736D20595E8A4E67583D9366D66CC8DAE93E0F579BCA7989C97D9EC0A175194AD55E54ADB1988803B208322041A6F3CE5DA12C0279909CDD937DA9E4CB781E98DB46FC57733F8DA3DE1F86E5DB7103AE7D385F1F0980A669360D67DFA4F91E7F415B545E46D6F0D702A838BA8F248B3A86E18366B6EC489AA8F4196BE731C8FF811A079242640A5FBBD2622253525AC11E74237727BE9F94F376C81755303629D34DDA91F4C0157FE10FC7FB7D9D3E86F6B7646A0332D09EC2A8DE94F6530D3C93A85CFEFBD7BBA955BD41B433158EA148EDFE6F9441D1969DCA81E0319FA2CFDFA528C6B0846EA08C9C36D786D164C80E6938B8CC8BACF096A4E196A601DC1DFA5F85EF588752700215E4DE5A6E7D312EC9EA6704CB5E57EF64CDEC044539D536E5CDCA0F288864EEFF859A9444A078913942EA0A909B4BC3A9F4669C45C242150711DA385AFEE36C2C9B4186D74059E54C111682FD5E75B46CE6A971E9AB0263EED4BF29522E2D60F9599D594ACE2B5F528E2EBDA0C32045F2A90361AEA23733479749F168539DE860146FB9687EF7D0F2AC8C5DF48A3C4A5D44CA2F464B92BBA5756503672184A48A6CE33D5336BE21DBBF177DAC7F70230DE92EF9AC6E510537F7966FBABEC20CFE0E3A7009C8BB54E07AD7B3B4320ACB6D9425467F83D1C9C263627835685A3B2637C1D199ECB1B4C6C2094FB338D4A9BF78F599A533F0B115A4EDB9F58D5ED0FF59B8B2FFB02D1B7F44119D7F0DF89B05BC1772E85555E8CA00D38F95F62298455B6EBBC502ED3C5EC0FC7051C58317B3ECD7C1B6F1DDF9203C98F901423F337C81FB02663D06161271247F139944D6C38C5EC86EA82A542657838EFF141A1CC0BD88511D57709F751F7B2CE7CA6CCF57C9BEE805B81E553C9322348DC35D9C09AD45F167694ED753FFC8D9D0FA4DA6EEDC97BDADC4F0360687299975F9798F70F8E47D40B94039CB416A08FBEBEA26FA87D32621CC509472C19E8A7D83A00C82F00A6A1962CCBBC6612C8CA884DD88F3B0112CEEC63EF74138E53FD14DBA053B7BB39DA8B0D43313D18F75F5E6AE20895BEEA14E7FF3E94C504D5795162CAC8B168A2DBDE89F3AA874F4F9287DBD34252BCA7B3557C00E191ACDD44AB8ADF8931FAF6E6336E4441045 +ss = 5C32A0ECC8FD7E70C1B389FE25C91899C37CE4CE672E299A41C7732F4F0D03B2 + +count = 17 +seed = 8098AE7A92C10F707D405F7DEA02C2EFBEF44EFA132BA8AEFE81BD45E543ECEC74F10920AE48A40B0653D63532517F2A +pk = AD735E9E838DA63AC7A3E1CD3E574DB17C2601D3927CC2A9D228A05F5C1E51A63634383FF5E03151F43C66A07BE9E992AA65CA4CA17B1E021E06B261CCAA89B12A4916A5A4E39826A94C86BCBA9FC7D65FF04549DB70B300B1CB280B3A41E82B6C8B0A4A3C5E40EBA59FD18F004CA3E4C15BEDF22E099C99A3D114EB0C5988BA02873B9581107A23E54A8E51AE62375A887929F7333D4D763E23B20A246785E07700BB16C531692531433EB6A6594D1464BCA7348022C1D4219CD8AA6614862C42376C3A0C4674181983F2A2CE8B7F32659AE87ACCAB6023938592E188A3C1015E98720EACC9AA837A49C4617A850C89E1212478F3C6BBA51C30A64A8A1C225274C92EA953872342A96CA3235CA7A9467BE55250796126B30694F71B2F75B56D84AC89C4B635118145C7B8967DE515ECC719E35804194B7EA9304636283CBF72339474CE1DA00106110A596725574747DC07B3F0C7C527ACA703CB23BAA080BB7A4CFC1009B3E5AA89659121E365FD6CB6FD15AFED70779A978B3FF50F915B6C16A350141721EFD61085189C3265530C1A17491B317031B4E4667EB8314AD34CB7DAA50566A9812377CF24076FC3DC748FD58865B1B02DBB831B25B7B7383579376FDAA6C8A5323230025A4BC66977F6A458374FAEB14E47F70E654C42C94A5FC5E386A57ABDE3F29349623E4DE92F900527C165870FCC26A2F95FA1850F2C940FB7B87686E253DD54B6706A84A0C70E3AB04CA8446EFB77609E9815A261AF5A135836064D44A485B5E850F10153653838E5874B76568516E847A2A9B186E8A50C34C2D2B0839EE58024211018B0A13FC781623CC313B30C26A258106941A66B3CD9481ACA7C7E3CE3202F098746C42C58F4C7DBE52FB5F606FBF31B9B5022E691CBEF1464F6942AA503147EBA081817AE28581ECDD867A96195DB320BD2D91C36DB01ADE9AFFB6B00F86C13E2E252C988300B05AFCD007470CC3022E96AF0768DBEBBCF62B53345B213C1544491F1BC75BA96BD73BE57A2CD6874511B44BF2DD27F4FC87C167815FEC59F7A043F699BA4D23400886A7214160C23DC96056BBCC7007A0049435C534B66971E6E5C90EFFA6645C45031C0C905B9887700181565B53165BAB605A51BCACA0DD0C308A46432794C38F21E04172005F4348211C63A40CFFD7C32BCD57FDE852FEC793CB7013E74504721F6BFB7637F73319F75B08E3C25777C969C6EA000C9B79D6F16A00CC4B00AD7CA4F8704B2E54D9D27524F6B80A6D51F85447B22C29AF0036C6BA486862C8B4FB03F26042A0E195A3E91BC303770AC844E77805E41EC6ACA920FF3A1A3ABE81B598C193723B20C8685590131DA89C0ACE08A592489791911C92C7E6ED55F642CAF918173F190B2FB8CC0CB2139FB6CAA259B5A4634CFD0A532B719903E32831489A2D390B4C5A5066B4AB5A3316441B162407096A0BC0342599804752FD4F21C45923705A7A04012AE4A900C01D584F9F41676C36681994C2F4037BDFB84A69A81FA561E5BE05777B571922988EAC714FF249926FC9CC4E93666E198308A434DF74DFF3C5A440948437A7C500582124574AE225F52D322D0909B5E946A5E22AC8F774F69C48B7874417BB1C0B93CC0A90D2A9640377808CCC2673495C4839FDA0D1038B27BEFE3D22E2B727A +sk = 87C0B4D44CC9EB48C126C5877FF87929B08485FB81E479139C3299C70C43C3FC8C238A81D4E61E62A33DB2499C866B7107D116B7FCB1B0530A7E758A8D487D11575079265B3158302A23732BD07330071BD7CB7199476C39B583A2446109E99FD5C95BE21A292CF37490906E84A82605B8455825C82ECA4B7E218644460CE581214C78AC4473688BD6A9A826217490AD791B7835A85935782847981CA97B6DFE88B63701CFBE3929A2DBAB1628155506C353639D153656B90C5AFF36BAEDF1B87DA5BCE2A108FB6C3B29E77DAE803A0DCBA48AC6882F6C1194E88387F30A47C27D02C37D988346A2A29584A55CB5D3C44C05A18619A4FD412BABC31A046221B3994C8F22CE272C9E6E948C3D043295F413349796C38911F8DCADEAE47351C15E9A1743EB65BDC7471F37FCC93CEC867CD4808ECB281FC17EFD004DD64AB432D664864B43F8A9B1E763529AE2C413ABBCF30A4A478A30A0104D802037C4A8AF01B534DD600E31A1630FF13B2F730924CB790166AF3B7322BAF4409CBBA500C1BB32894E65445F04E4B4B4933DE51267635037FAA44E2775CAA4212F4E0600E51069ABA662C86145E2117347BB1748D63E412550C004237CF02B02AABB18D8533D19B1A879A079B31D529AACBF5258483C80738B380C83119C12B23CDCBC7D027506F3705CE1316DD24594A4BD32D10382F8AB47478F23763898398D7430264203A76B0C4455237F3E765EA5516388595CE9E2BCE2DC2258B5B96C782865FB5354427A2D7806123B0CCA782B1C329411C6C133934BA4A959DA88A072BC6E2D63A007572E36B82C5643564BEC47BC8953D4AAABD146AB5EB36E33F825FB9CA01E223253C320F76C98F810CA52A2C604622F7A60378809A59B19680AA69EED2003E272B8A1F3C8A55BCA129640C5A00D187BCAF465204C73CEE66A2FEEA414F02859C9988356D26665196674D25E64CC5689965CFDB2C0E47A531CE32B3DAA9C649954342A3F62253FDF826AAFCA7DC85A7A8E15161435212D7A4A3BD4B57A2CCCA3506999D407D9B6ABCC97209FA97454B0974DC2C7CF3C3FA40306CD6239DC450536974A8AB773374504B9889CB42BCE4EF4606BDAA559346F18D087BF8B7F0D9B21B0C9B75B5903194B0744A1C47483488EB4C1CA2C83D8198CC6A523D9329F6582863CAC2951268C01770A8081C1C26587D7610088E6068E020E10472C825C395AC6783F074EFA8597FEAC3734399BFA247E4E1531EAC70FE49355E44B3BA5439EA1E65EDA94485FB710124BB968490F1C8B68E87A4C4682156FC06A33275B6B202AA0D508B3789AACA627F0F0C19026CEC38A95F7547D936B255BE7A7525C97AB4282714C32A23C4723A82298F2CE90FCB4761B9EEE869E4D3484BA2B222DC28BC612B1F41607CF57781990009F29617549C0B2179705A34916DB154AA3747867C3EF6A0693BBA5C1D42E14B3247B41059F92607A60AFCDECC1C6F3839DB943F5EBC4D340AABE21269095B3F7D9BDE9EBC21DE788794B63E1098CC2903A83CA2027E8BCB78B855FD56FCF16B45E47994AAC71FC815C521AC1A1B697A18569AC2816F52640CF9059C4EB95E6FA1B32B77BD7CBCB6AB384DE74B6A2708400E980AD735E9E838DA63AC7A3E1CD3E574DB17C2601D3927CC2A9D228A05F5C1E51A63634383FF5E03151F43C66A07BE9E992AA65CA4CA17B1E021E06B261CCAA89B12A4916A5A4E39826A94C86BCBA9FC7D65FF04549DB70B300B1CB280B3A41E82B6C8B0A4A3C5E40EBA59FD18F004CA3E4C15BEDF22E099C99A3D114EB0C5988BA02873B9581107A23E54A8E51AE62375A887929F7333D4D763E23B20A246785E07700BB16C531692531433EB6A6594D1464BCA7348022C1D4219CD8AA6614862C42376C3A0C4674181983F2A2CE8B7F32659AE87ACCAB6023938592E188A3C1015E98720EACC9AA837A49C4617A850C89E1212478F3C6BBA51C30A64A8A1C225274C92EA953872342A96CA3235CA7A9467BE55250796126B30694F71B2F75B56D84AC89C4B635118145C7B8967DE515ECC719E35804194B7EA9304636283CBF72339474CE1DA00106110A596725574747DC07B3F0C7C527ACA703CB23BAA080BB7A4CFC1009B3E5AA89659121E365FD6CB6FD15AFED70779A978B3FF50F915B6C16A350141721EFD61085189C3265530C1A17491B317031B4E4667EB8314AD34CB7DAA50566A9812377CF24076FC3DC748FD58865B1B02DBB831B25B7B7383579376FDAA6C8A5323230025A4BC66977F6A458374FAEB14E47F70E654C42C94A5FC5E386A57ABDE3F29349623E4DE92F900527C165870FCC26A2F95FA1850F2C940FB7B87686E253DD54B6706A84A0C70E3AB04CA8446EFB77609E9815A261AF5A135836064D44A485B5E850F10153653838E5874B76568516E847A2A9B186E8A50C34C2D2B0839EE58024211018B0A13FC781623CC313B30C26A258106941A66B3CD9481ACA7C7E3CE3202F098746C42C58F4C7DBE52FB5F606FBF31B9B5022E691CBEF1464F6942AA503147EBA081817AE28581ECDD867A96195DB320BD2D91C36DB01ADE9AFFB6B00F86C13E2E252C988300B05AFCD007470CC3022E96AF0768DBEBBCF62B53345B213C1544491F1BC75BA96BD73BE57A2CD6874511B44BF2DD27F4FC87C167815FEC59F7A043F699BA4D23400886A7214160C23DC96056BBCC7007A0049435C534B66971E6E5C90EFFA6645C45031C0C905B9887700181565B53165BAB605A51BCACA0DD0C308A46432794C38F21E04172005F4348211C63A40CFFD7C32BCD57FDE852FEC793CB7013E74504721F6BFB7637F73319F75B08E3C25777C969C6EA000C9B79D6F16A00CC4B00AD7CA4F8704B2E54D9D27524F6B80A6D51F85447B22C29AF0036C6BA486862C8B4FB03F26042A0E195A3E91BC303770AC844E77805E41EC6ACA920FF3A1A3ABE81B598C193723B20C8685590131DA89C0ACE08A592489791911C92C7E6ED55F642CAF918173F190B2FB8CC0CB2139FB6CAA259B5A4634CFD0A532B719903E32831489A2D390B4C5A5066B4AB5A3316441B162407096A0BC0342599804752FD4F21C45923705A7A04012AE4A900C01D584F9F41676C36681994C2F4037BDFB84A69A81FA561E5BE05777B571922988EAC714FF249926FC9CC4E93666E198308A434DF74DFF3C5A440948437A7C500582124574AE225F52D322D0909B5E946A5E22AC8F774F69C48B7874417BB1C0B93CC0A90D2A9640377808CCC2673495C4839FDA0D1038B27BEFE3D22E2B727A2006A70FA33FF4A65B00553734C5BD8CCA0A65EB3A115D96B8AA90F8FDC5F8F40F6AA3E88F7FA8A96067F8CDAECEEAC90C2D0B5E277E56E9C405EC9420C30252 +ct = 8B6066F2A728AE7D0BC110336DCCC3FE0F6357DCE815FF647B494FE508C69A7ED6E55C11453DB91AEE3BA1C211216EDC8DB6A45EE71552A75B6B168FEB3FB85EC871C7DB796DE7BAAF09511EBDB584EA318A07A7121B1F2DE7A99A08A0F9CFEF11900FC897DC8B315BC62DF134D054E053777E39436DFFCFCCC673DBF48440276467329301CAC24DB50EB48BDEA5085D50E40E7D2D34E0D193419D423DFA565B0B8278718EDC2839B764F97C796EE6C719285BF2CAEDA377845382E29B614CE12D31702D98B0BF73CE2B695D407BEFCC62B69634CB5BB3803251697C1660B1411C475C62AAB58F5AB9BC4C8DEC50921FC21452E08B27095A8D87FCD581CC81C223A5AA2DD679CD19F87127065C1368C8B29454A9351A0B17A85873BABA9132D4F905DB6A15BE3EA0E61DD4BDB7C506E7014137EEB3943794F5AC765103C9F2C596401CF443D0979557D15F930580D34DB141403E278E2B79E4E2BEE3CB69F1187326D55A584DA85C98A300931E0DEBED6CB3C200ADD1CE524CC7230AF50A93EDAD2707E452DCACF7F81CFBCFD47CD9457A6A713E1FD9B8F8DAAB5440A7BF30E10A244238D02EBCED353667C1F5EDED23E1816DFC8999E46C7E1CFB910BDC06388D12B9C7F32D3611A7F7E38AF8EDB14E2E80EA10E9DDD676FE4D921B4E24DD175CA69D82EA6896820F5311447AD8A37774AD535781AF80F98B89F982C3600EF2101C8527F0B1DC2EB39F47D21DC7112D9F6E96D6D74FFDDA89F3E1B0CC0CD09C2D1061D0E2725A30F88EC62D95633F40303811458954A0178BFA7F7F9D44FAD3607D96475B0BE47E3182216E561C2CA147298D1EE0F23884E658AE146DAE13AE35B8C4BCB6006279955088AA34E0E31284A39AFC316E5F83B05D2271FC3AA5172DC29B751AEB2E854691E5942012B87C2A5C7A0D97551D77927610C01D60CEDE43C4489650A3C4BF1817B12C61DB829386EC110431DD09CC9127EABAF96673B8795C8AE2BD97DAFBEDC4E4D726E90207D43402A761D754DC0C0FEF6403C23F0F8249E8AB153C768B1A42EA982433C45141853A4755D93B62A9DE2C29D83FE8262B1D8D0D6E7E918FF2C8E88CF20705701C8A86A9986E4BAE2C697F45D4DBCFAAC1F11F11A2A1A728F44D70D31F85CE8BBA588C095ED854DBCE17C6751BFB2EE1A86713A796D968BB0271293C9210B420CE454D329EEEA558DD60052466B051477D25152F6BEA1E04C521FAB8D00BE3B0C5CC166FEA82BA49773BBDAA958C5C7E8F50BFB5E345C29801024C39E597F66AC08FA1510FCED31E21F599097F5FCB604B88E3FF893FFFFF9F81AF2D5E1CE0FD4BDAB7A541FF7DC9B55D0EB4D54EADDE6C5A9D688A3C2851976FF51FA915DB037155BBE715F0998C17CB2539AB0300CDA62A0F84817259B2D64DF12AE065CBEF43648F5181ACDCE5B434877F4F90E95E19D5ABC106F568F1B4C48305EAD8A35EDDBD35404E2D46C8ADDD2CC4DA632F2BACF96A0529BB37EE7530739154E01F50116476333D4D0EF1CBA1A85E4338896B +ss = 4FC71B4D0A7CD5D80824E137B93F8356AEDA6A13A55C0515AA74EEF21447CACA + +count = 18 +seed = D5F23808871544E9C1D6EACE2028362B48E225312F77663E9F78CAFEB512B908CD9E25875D61A16EC615F4B8FF826856 +pk = E0B9190B548BC164BB826874C1800980DAB529866B951C01C20CB4AD363C681336B13105FC338B1788AFBFF321BD981974C33D98A35666EAABE3612E61839D6AD65490D71AE992111719AACF12A060648667E34D09343D93DB88ABC69E0E098A63749BDAD39F8C6B93D75990B0731621CC04E6E2061E93CC4B51209EC92ABB303BC638C52AB2AE40D746CFCC43B7576A240540BF410C14744F80A442D0555D474192BCD9B187A56691B63965973C7793668682852F91CFBCE70D6D4832A1855CC4B83A847734C24019C508B2D29539FD1A114F787285E197B51BC092F80B559446F1076F02E984A1B27CAE7AA1D0B50967939AAC74CF2335AD421021E3225D94FA3B09148E60C20E8454C68A8022043206B7BB1E799C9B69286509A188DB29A9EBB078420A0844C858CF4B11F9B4959934002BE0229E714350451B9C2775A5CC8C45B07E121290EEE32A73D46F8D7C55311A8C29027356139F153CB405FA14064C5C31060D7A964B33D76BCD4809D21B34A2F7806486BD2835B7F871164AE496D4264F89FB4EB15B7E5A7232B6C68B11351A41B09BB0C92C8437534D2B4C0CA2538023B29DF93D93C98136780FF6F82846CC2868664322AB28DCD7279F68994BA5A5ED406D4D717D16C14DFDDA58DB1524F7C53F3CB170D45A411B07CD64F001DAA0AD1BF63A11550C0C154D20F5096DB44D1AB0A1C9D66581891A9314C18F778330A0936E7A2F3E19C18F7BC87CF078627770DFC5A2FE71B27EB8276863C3295C11E08703EF4A4FF6B3A1871C7B42C43A6EEB6BD1526AA95B7DCD6B38EDC207C630BED1768CE9505544E9053E5C8CBF6A181A1A0F48C8A98B59C3ADEBCC3A5C99E61588834024CFC71C9DFAB1DF558711B311404A739F79B45B1A8A7633081A27A08C3C16478C9D24C1229723ADDCEA225D39BDE7851345B18B1B08254181B01623347A9A57F5D902290B10476083949556663309059815626C3CCB5302B978B2CE82AF231934FFC7732352B990B21B69210F2ACC048387B95C346974C2181148078154416E08564D664DB3045DBA82C9A7934DE51AB5C1D7346A391BACA48209C8C7235309943C1CB9CAB4771C7EAF59321B510D430C88473AB16F54AE461A5DC613C6FEC61A5E899552E835EFF57FC34B7992755D178A0365C52B3F020AB40020CE21B45717654634606DFB2917FCC266193E2E5B2C4559CC5652AAD1121CCA0711E26C23EB33C1F7D389F2D742F384725D3268F8159F8C463585998289E58369FBB883CAAE21B87139E52D7EBB92B011CBE6426390458247C45F06F2519AB35B35675BF93325351617AD3AC470F73D3D3985E10277A647C96A6C56CC2346563CC496DB232FD742AEA3ADCFBC506CA8CBADA7B040A04F6E329FCEA77BEC0683E1A87C396113639159D9CA52A5A5484D2839869A2E80557A6BF7CE2EE295A464AAF835C542457D021C65C2B2A457C771FCC47F8B1056C8B7AA61D1843A40C4C9B083269B2E89FA3BA5959F89972805FA4B46E35ABEF0C57D875C54804DE77071F1219195BC8B4F7C18A19A7953573E7F4157CA03BE2852461A784E736110157BA3F83A6947AAA09E9BCAE730B9B212BB837627293A485ED6B42CA1CF26792676C1F4BEF1609E71524B877F53FD3133BF71AB13912BF37C2CD7A359EAB035CD +sk = 4DBA785B32456E16A8E9A20FA7536F1B4555A9B403A09738657A148361788D3C358A7BABA8B4C58AC979C4F786E588AE245CB0C12C284F848B89585F76892FD65CB906D39B385A04D2F5B2154ABD1E77AD9501ABAC73237780B33C601FAC50BA3FC07E8525819593B7D7E69FDEA46F14F1128A475E4784AF38985501DCA6D20BC8DC1C5C7740B33804358F71B6E97B2A0E7350F7608321736083DC54E0253C6E5C5665D0B7E68355D4E98DAA753C1ABC1429B397DA773B043459E5AABD093A5B0210502BC2CAB250041997861286924AA0A190307431719588CC2E6FB68711C964FC20393C73B7C967C603120A3CC11B2EFCA3DD6616D0E2C835FA92946A40C4CC2F4655301ECB09424286B3C7A07AD3C6EA37BF6132AAE2D9A335E34B6C816D93CC7EDE020AB723B272B70F494834CCD93BD7800BC39919DEA4BE4C585F827A4351E233026760DC83377329CCBFF180A562AC50833C0F861E795C00EE74B584F693222B28EEFCB445F19B06154ABD0110C6A017ED525B5FA30C64E60663573B8691BA68E2BC580157F1C66EBE388AA2747C50919AF644ACD903A801A5C04A6A2EAC686C89835CF59A791AD5642274A0F78244491670C66C9BCE24BA5CF6B86967AEFE6728DCE8973FD29045DB844DC80022297CF530C8ECA4808F603A90A840AD70A803E6A0BFB44B38616816073C5D7BA26A64048F81A3BAD3A0C9CB0672C7466E38824529298A7C0D82940540C312F429411B403F64E419CF720E1F73026184CEE538B27CFB91F16186DCD3904BA6A34254155B3CB3157937D5618568F46F283C7C0E88696324A4FD77C3E6FA5B5DC0A13116274E5792FED69EABA973730A79878103BF63934D179143DC23ED39585D40C06A99AEE0F4462F123B8A6B539DEA9E05117B08338DD6754398E7496F612B4D892CA54A13EC9B2DC7022CF779668809AD6DB97A6E8B15FF0A862E664D292C4AF549195A23C19E2B9FCDB9B4A5B9AE517873CCC644993196DE5C2716D58D50E7CF11558F44A16580C980654C8CA581671121CB2F8CC6F90529C9754CF0700B30943EEA1A7B05F0BC8FDC1CF776B0CF2C2EAB927DC83197A4071DABFC07F983BF4D2C613E087976ECCAAC031B88420CECEB6DF0350F04BA61AB39CAD4C6B2B32503D773A34514B7D5BBB9D5E7BB6DD9AB5BDB8F34A9880C49AB5C40970C435508E26CBA50705C6538686249D344BDB7C820A5C8869B371B8FE13922A5AF390BBB7B809C392266541671C75CC2B7A7248D0234FCA16DA64265E5C70257D770D2E9982D5A1C6D19BF0BA48B53AB900FC8280C754C14774939B83C63592A12F35D198194679942EC227B46CC8F353A0547E929175C3585107239AAAFCA151DF3C835E770921E5C9B134CA7E27A18C7656BFD6A4FD2431CE1743576E575DBBA8905F4CC38108E3CDCBF0155B5300A100958AA99940BCB473EF64B05BAF55E91952C46851D313B0990EBCF2148CF28130CF49C8D080841FB81384E73367C792A11099F5B898416946826714E252457B23A3A1E33A36EE2612372CB2C04030840A87F96A31913A428CCCDD2817B38372DA4637F46044F2218C28D525A57D9C0CD2864FD43AA5C9A003A09A35BA786A7520CE0B9190B548BC164BB826874C1800980DAB529866B951C01C20CB4AD363C681336B13105FC338B1788AFBFF321BD981974C33D98A35666EAABE3612E61839D6AD65490D71AE992111719AACF12A060648667E34D09343D93DB88ABC69E0E098A63749BDAD39F8C6B93D75990B0731621CC04E6E2061E93CC4B51209EC92ABB303BC638C52AB2AE40D746CFCC43B7576A240540BF410C14744F80A442D0555D474192BCD9B187A56691B63965973C7793668682852F91CFBCE70D6D4832A1855CC4B83A847734C24019C508B2D29539FD1A114F787285E197B51BC092F80B559446F1076F02E984A1B27CAE7AA1D0B50967939AAC74CF2335AD421021E3225D94FA3B09148E60C20E8454C68A8022043206B7BB1E799C9B69286509A188DB29A9EBB078420A0844C858CF4B11F9B4959934002BE0229E714350451B9C2775A5CC8C45B07E121290EEE32A73D46F8D7C55311A8C29027356139F153CB405FA14064C5C31060D7A964B33D76BCD4809D21B34A2F7806486BD2835B7F871164AE496D4264F89FB4EB15B7E5A7232B6C68B11351A41B09BB0C92C8437534D2B4C0CA2538023B29DF93D93C98136780FF6F82846CC2868664322AB28DCD7279F68994BA5A5ED406D4D717D16C14DFDDA58DB1524F7C53F3CB170D45A411B07CD64F001DAA0AD1BF63A11550C0C154D20F5096DB44D1AB0A1C9D66581891A9314C18F778330A0936E7A2F3E19C18F7BC87CF078627770DFC5A2FE71B27EB8276863C3295C11E08703EF4A4FF6B3A1871C7B42C43A6EEB6BD1526AA95B7DCD6B38EDC207C630BED1768CE9505544E9053E5C8CBF6A181A1A0F48C8A98B59C3ADEBCC3A5C99E61588834024CFC71C9DFAB1DF558711B311404A739F79B45B1A8A7633081A27A08C3C16478C9D24C1229723ADDCEA225D39BDE7851345B18B1B08254181B01623347A9A57F5D902290B10476083949556663309059815626C3CCB5302B978B2CE82AF231934FFC7732352B990B21B69210F2ACC048387B95C346974C2181148078154416E08564D664DB3045DBA82C9A7934DE51AB5C1D7346A391BACA48209C8C7235309943C1CB9CAB4771C7EAF59321B510D430C88473AB16F54AE461A5DC613C6FEC61A5E899552E835EFF57FC34B7992755D178A0365C52B3F020AB40020CE21B45717654634606DFB2917FCC266193E2E5B2C4559CC5652AAD1121CCA0711E26C23EB33C1F7D389F2D742F384725D3268F8159F8C463585998289E58369FBB883CAAE21B87139E52D7EBB92B011CBE6426390458247C45F06F2519AB35B35675BF93325351617AD3AC470F73D3D3985E10277A647C96A6C56CC2346563CC496DB232FD742AEA3ADCFBC506CA8CBADA7B040A04F6E329FCEA77BEC0683E1A87C396113639159D9CA52A5A5484D2839869A2E80557A6BF7CE2EE295A464AAF835C542457D021C65C2B2A457C771FCC47F8B1056C8B7AA61D1843A40C4C9B083269B2E89FA3BA5959F89972805FA4B46E35ABEF0C57D875C54804DE77071F1219195BC8B4F7C18A19A7953573E7F4157CA03BE2852461A784E736110157BA3F83A6947AAA09E9BCAE730B9B212BB837627293A485ED6B42CA1CF26792676C1F4BEF1609E71524B877F53FD3133BF71AB13912BF37C2CD7A359EAB035CD631E1DE2556AE65D57E600C21E8E355A4ED586D667177CA0B7545CB5A23D669F4F3029E1BE4E1C0258C3A22FF5B50B2674CC094BA7018DA2A61569845C17D26F +ct = 35B5A9E583FD8BAA2044FC15E93BE2D0D1B199196F10BDD90D274C4C56C3DAF791A9CBAE48772EF76AF0C325C7DD84029B2D44B4676558A5A409F6E64D3538E9C7F6C39A19CD737916A1C4DB7DF79AE1850A0F3EA6DF53A956C93BBB5AB3D5384AAC5030AAA99111B17AD156A9307004AB9C3B1C7ADDB735A16699C0A7FD69CE08C244B6258CE70285F56875AC2343A18868A93061DDA2CFE9E6AA2C0CAF7FD0EFC593D9D06A4F6861E0643ABBC0A91E71CF244384F45E7D3DD88A27887AE4695572E98506DA6E32DAA744AD32F0A44A7679F3F0DC7C868207AED7BCD90F62F36CD695B6B4786C5290D74CAC91A28A0D3EC3D6CA53A7DCDD4353476E54FCDAD93E21C4F9CA58B069BF5BBD9BA268B058875FEA449E68B3F93839C1B6FFC1B095BD0AA6BCF24BC5AB14FB4C8B975E701CA0190F9381FC6D47207A53F3C281CCCC0145748222390F364F6F5444614325AB382B3F7EB659EB61CF2360270269B93EBE68825EEE071273BC880751548C281AE9D94EAA1764CE70FE1857E4315C610D776BE9DDC12E6848E09192E5A7AABE46BF12A268614D138557630737ABE83ABCFBBA6F886F5DBA7D1090854432BAFCFB1A61054A1F7DED94A9B1E6C1DA0E6ED87DA24ABFD24A61339F8241C87C7AA8927744137EAC239190267B338FEA6F3F564B0E30F0C08AC24D8D17C6A7C748695957680E775F494CA2472614E5F6B6B6C703673DD9C93FAE721292981A45C714E9E50FC0FCB173D5A92D52167695E4F659A5BBD6920F61F5FFC6B63E0608689D85A919E1544EFAEE4E2525B4A20B1B89FB4D5A20F2B2FA389196EADA7F12EC01901828EA8D726EAFC62420BBD9074E753559361A9CFB371D459AFCAA3F11D893B5907688A12A99FCCBD8F390EA00E4ACAFC5BA86BA6D735045CCE689CEB35B3DA81D6F21CD8E6BFBE2ECB870DF4B3AEA67948FE7426471D3325A39BB041A0974C8768D832398B0EE9273F1F488A0D8829454E17AEBDCA048B7B3014C5C3E93E5BC15317DEFDAA4DE18094523B0491A3537896689027F57436557F65D70A5440AC28681FA0224DE0958B60DED0A4A6846316B8DC836BFE99855AFAAFF6A4EFC9A5149610D0E1C3D8FD8AE4E7B489734444258A30F14681D5DD3179F530E9C0A5FF42100AA851707E3216FDF5B5DC42C0DE6EC2031E9DF703A6BBE7385396C711218B445CCC15B83C1FC1E19AACD8507A60034BE48C59C23C71EF836A7F4F05A07DD953B6DEFD09A7ADD8697097123A4DF8EF6ABDCFB74F9711E8F2719033585D63386F32CA50F72F833FED12EB70F2C1C34DC7F26205149D68652468B7D156C3B957F64BE1272766FD82725BD00BEEFC5AB6F52E0740F7E37FCFBF0D0988EE07435B41BB58DCDEC0D8B0C90C43DB5130A153DB8994A1E54EA218668CDB2C42380FE4AD204A910F0AD61777CA661B8A68F43808235C01187E6101131A32DFACF091021F9107B4964A55A3F19CD55218611AA5C479107A4EF33D76B68B9809D4CA773C4CE0347C64D13100B44A837AC87CFDA +ss = 5A864018C4C8C17C01C5EF38D7154668D9099994D92ED2EF55F02CF6B3623FD1 + +count = 19 +seed = 822CB47BE2266E182F34546924D753A5E3369011047E6950B00BC392F8FEC19EA87C26D8021D377DF86DC76C24C5F827 +pk = F1390E49F3B488AC39D0E43292B70042C52355EB48B841887EA256055A688FCAC5A71C896414CE75F57BBA12967215C50D4B5BE692B6DCD1AD2190A3D785C19E283F87F784A03C8F52A23E150734FDD7BEA2AB6D122C928606BFB60570BD696D9676397AC3AA1D062EE1AB3922A2C9B5B02D14557164149C62E8029B139E6950B3F8ACC9E8C30274B69926C1658F7836F479C8CC70138B829848C7698B179643B7550E9193D6FA87350503C2B69136B08CC298B5C335B1AB95054D13C9260625E34C6C2FB8186E1916C137AD9907C8B2AC9D88FAAAA0375236751A47918F96477B7EC01819F8AE1D72951E21608C87532A9428BDF4CB5658440CB025CE3B271652961BD935624B9EB70047E63184B9503ADCD057B6744FE42908CFA325E401B9D0DB5ADA201F5D64350D392C4FB842823895E15720DD7785C7F5986F15CC2565A71F6CA11B854A293C9CE6C9A1F4AA3917130308F2A2ACA964790BAF960AA12DE3334D146E64DB81EF09563C9667381424C809441EE989EEC93597E7C5B558A89DFAA976F6934CD18B8EACB6F2F54E8F748E4BDB69B0764FD59352575066DC242DC0F1356FAB4467C8064FD23F8823148B77A4ACC642EB2C181FD5CA251B323561191CB15F2FF0784900A15F67014B518453C4C3663528FFB53271E195C27533FEC8C3B159AC1BF39C6FDC69DD5A5FE5872FFB6B2271A09966A5C738C48E63E141D65315051610F0F5588AC97F14100027B144AA23774F199D0D9A122953ACA8782A4136820FFBCC1F2692BB919B674AA1F4D679E8418E8597C74D60C5C287CDE6D44492411222636B03CB661AD66FB442193690A5F1D6B80A947442A46BDD239FE3989E6DA86949474E395056A5E6CB42B25343A7C73B650D843527444243852518A9034B9EFA7A6BB8505BF605EC238FFBC08CBEE35A94845D7319144B381819D0928C27023B727656EA843140649C03098FE74C717AABE91948EA7698DB0A86D34296B5E50DC0A9949C8BA07F64CE60DA2B6E62458DA229D52C08B9B696A124A8CBB791C0D255D3E4A69ED2C242000DC6476B4555552DEAB63EC19FE8783151DAAF78E561E1844886D4418E7510BD025299B1C83C7BA22F63335B9823043336DA897A44FC6A28B44C68A49B436B0DFA406BE642A5BD303BB0D633685364D80440CD7189B6B34F6535101979BA9D251474FC91BF2497670BAD0DA78AB3C13EEAAC864572A2F919546A57C719BCABC9DC8215B492D53118C2D379E879234A700638370A530577700982C4334673AA5D71DB98627384E8CA876E24B5A31575EA3C334D3C7D3ABB6D8891B4904B8F5DB93D0531CAFF25BE53E28C45C94758E309B83ABC2BA66D98D3BDBC53B7D06592F2712663C777DB60AFF496A217E82D8272C3A218AD8C8B04AE7C66BE35C08E3A955FBC18EDD07E8E68A806FC3FE218B87F87BC332B86C2625D8FF01C9FF6214B75A20CC465F847511030B47EA664A75B3D4ED9038A9C747C6872DE0A57F3B76C60585ADE64570A21CF8548A5BE4996BC22B3D16A7BBBD20149034764B820892B9394581697E39F9B35077EAAADB06702968A5E5418983110A97D4749D3160DDB2B9C587767FB56B9ED9BB3D91CBEAE141769C2128E0ACADBAFD72FCA96AED457CAAFAF51DC8C30CEAC70CB4621CD4D7B4C +sk = ED55584416844E1CB3C75ACFB3771013D1AAF1FB3CA8A5B718A8CE02A15AE26BACC7534F8B084A665B0608780E532A161686B07FAA83884C6A0EFB490A8A3FCABB50ADD21F58AC43EF4355246B1A661C5937562FA6067E7AA66978E4B36EA1431ED41E4E4282D4003D5BBC06CDF7AF225B6560C44F43A278677ABBA8C6B79741B3CE7C0D0769AB407C9B39C032F0E42D1866ADDF2115E2F3336384C61CE9319CC92AC1350B264CBC4059B94372631C8241CA376AA6F76111537018C01D1346019D628F1F00CDF828B48C47CBF958989B846ED893BB0B6444BC2A35C6443F77D757A0CC957716373460A7A94151CC548F0C78AA5A323581C192D00B4D96219806A04B1A0AC829002B7FCBC8CBF8A8E3ABAFD3DC2164D03A24C19D50133E967C7668AA8B81977B400067FAD2CA802A76716B95E3D28BE5603E4977C33D3BA5DF2446F6265827464641204ED972286B58567BA129BEC0CD6F1644C4032EDD6239309AAA259A3D997B1ECC535F17D773AB1C5350E3C82C600175269700A56B0D4211DD02C13D4BC7C54238F40163441702613A1DE34BA9B0B42EF0A29300098667E8003588577E64B031139DD2180DB113623FC4B74E946EEF86A1A6BB52764C6C12911765E37A685400888AA9140A3ADFC48712688435258D56337FB8D8A9E1F34BD2E818AE3B7480F500FB6BB03BD50019C33BD37B060BC2C45E8A2267D18927C0AF66076619889FF6B1769FE59E5F131F5FE40DB2815BB6886B7BCA9DA659935DB493DED9A808157E4151B04C153E673333424B7AA939559E4CA973F7644A813B8D9C1DB8C87CAC6365C0E008E329403C69490976CD3F006F3138114A6B3E6B3C4F054451E5BBCB7D232F285A2EF5202B81740053512F8E4B33FDA87EA61042D1F9736ED58E9047C8744735A728B636DBA7ABC33B2DE0B1572A28B23C25A8668CEF9291990A499BC8935F955E1CF0301A65BE870B7F01F06099192431F3436AA5AA6564C4689C1D2E11540355138C91BA6E0182B6DABA0E7A177FF320C6B04977D47DA0D51672EB96CA054AD2D4A0F72930061775592AA40E9C9418CA611893044460495D8A46B242201886CB52E38D91D25D7FA8262290628D91323DD2A51F8C7A33487232F4934133117699028381751D8594FD94910EE4115389C57262BA579220567A7B5B42441A641FD6630D7BC06802878C76BB9EA576965EE45ACB90BA549A01B6E873A1D8C741662067A116E64C8897E83204170C9BF2676EF60C20F3450804C7A1B80725DA17F9DB18F715B7894CCBB53321CF01755D168D19A96356EC07EFC62D9A8C3A8FFB15500433F915137AC42A474B8E43F283BDB2B46CD62D509A5AEE8CBE23B74CD48079D82293BFC9CD931289A0AA27D8A930BEB2000ACC2019E3CCE107A18E9C4408C516FBE19E45459ED77231851B88B6B73156EC820A4C097072C2FD61C83D23413AD510662894DAEB238992138F98185042B53A637AEFA83378B026FA7BC314516B25D343F0E0AA7772CD2DA27F8B39A8BECB44923792A7D586631B2AB963AE537768E45961F5F96CB42320E75738A964168B9403D5B3591AC5679A61857C818B2A486BB299019C7B03BEB50D2D40A17E84712AAC01F1390E49F3B488AC39D0E43292B70042C52355EB48B841887EA256055A688FCAC5A71C896414CE75F57BBA12967215C50D4B5BE692B6DCD1AD2190A3D785C19E283F87F784A03C8F52A23E150734FDD7BEA2AB6D122C928606BFB60570BD696D9676397AC3AA1D062EE1AB3922A2C9B5B02D14557164149C62E8029B139E6950B3F8ACC9E8C30274B69926C1658F7836F479C8CC70138B829848C7698B179643B7550E9193D6FA87350503C2B69136B08CC298B5C335B1AB95054D13C9260625E34C6C2FB8186E1916C137AD9907C8B2AC9D88FAAAA0375236751A47918F96477B7EC01819F8AE1D72951E21608C87532A9428BDF4CB5658440CB025CE3B271652961BD935624B9EB70047E63184B9503ADCD057B6744FE42908CFA325E401B9D0DB5ADA201F5D64350D392C4FB842823895E15720DD7785C7F5986F15CC2565A71F6CA11B854A293C9CE6C9A1F4AA3917130308F2A2ACA964790BAF960AA12DE3334D146E64DB81EF09563C9667381424C809441EE989EEC93597E7C5B558A89DFAA976F6934CD18B8EACB6F2F54E8F748E4BDB69B0764FD59352575066DC242DC0F1356FAB4467C8064FD23F8823148B77A4ACC642EB2C181FD5CA251B323561191CB15F2FF0784900A15F67014B518453C4C3663528FFB53271E195C27533FEC8C3B159AC1BF39C6FDC69DD5A5FE5872FFB6B2271A09966A5C738C48E63E141D65315051610F0F5588AC97F14100027B144AA23774F199D0D9A122953ACA8782A4136820FFBCC1F2692BB919B674AA1F4D679E8418E8597C74D60C5C287CDE6D44492411222636B03CB661AD66FB442193690A5F1D6B80A947442A46BDD239FE3989E6DA86949474E395056A5E6CB42B25343A7C73B650D843527444243852518A9034B9EFA7A6BB8505BF605EC238FFBC08CBEE35A94845D7319144B381819D0928C27023B727656EA843140649C03098FE74C717AABE91948EA7698DB0A86D34296B5E50DC0A9949C8BA07F64CE60DA2B6E62458DA229D52C08B9B696A124A8CBB791C0D255D3E4A69ED2C242000DC6476B4555552DEAB63EC19FE8783151DAAF78E561E1844886D4418E7510BD025299B1C83C7BA22F63335B9823043336DA897A44FC6A28B44C68A49B436B0DFA406BE642A5BD303BB0D633685364D80440CD7189B6B34F6535101979BA9D251474FC91BF2497670BAD0DA78AB3C13EEAAC864572A2F919546A57C719BCABC9DC8215B492D53118C2D379E879234A700638370A530577700982C4334673AA5D71DB98627384E8CA876E24B5A31575EA3C334D3C7D3ABB6D8891B4904B8F5DB93D0531CAFF25BE53E28C45C94758E309B83ABC2BA66D98D3BDBC53B7D06592F2712663C777DB60AFF496A217E82D8272C3A218AD8C8B04AE7C66BE35C08E3A955FBC18EDD07E8E68A806FC3FE218B87F87BC332B86C2625D8FF01C9FF6214B75A20CC465F847511030B47EA664A75B3D4ED9038A9C747C6872DE0A57F3B76C60585ADE64570A21CF8548A5BE4996BC22B3D16A7BBBD20149034764B820892B9394581697E39F9B35077EAAADB06702968A5E5418983110A97D4749D3160DDB2B9C587767FB56B9ED9BB3D91CBEAE141769C2128E0ACADBAFD72FCA96AED457CAAFAF51DC8C30CEAC70CB4621CD4D7B4C87F3829EFF562789B3E19FAFEC92E4B5F95B45F3786F12D9C24915CA484A49CE1C0EC046899A777655233E4E1B5CA44E9AFBDC67964BFD5D5E3DBB45E60D03CF +ct = 8AC0D6E2C157FB04C753D97F8EA4C0415FFC46D2406D65B51E3991A286A66A87FD7E7F5DF13F446F0DEBA8D783CCD9164EEC2CF4AB002DC6DE315F3F6A3BBEF9E2A0CBC833E12F1097D11158D73C579836B41DC1C0186844E2CA224855F8A2ED24F31B92827F0A3125EAF79140612ECE54F5A9DA73BF775D8112220FEDE4B590C32B08F4A7B91B7497739C3EC80E64F2165E7F032D5A583F0AD2D7AF369F903913114A2829C8DBE77B460B06ABC23D184A7ABCF6853283828623E89286CCD3E4866C57F28146203100665792E128AD7E105DF6F283ACC30A1BAAB1E84A78E86C3B49D0950F93E1B88E655DD6B3C689988EF7E2517812006D38EE0F9FFD7969A789AE2D8ABFDE2A8F1423D628737DE52AEFF8362218317968163A5A562BE757C3E9F806AC7F8A0E5B5465841016A694861AA1DF8637A345D25EF933EEA840C5CD37E67E7489F48914A07C3D6E8118ADC55CB436E8F283ECF5CD46084B41F24430A80C6FC1099FCEB3C05CBCFFAFE17F129CCE938C0DFDDA9A440E1BA6FBA8391F84020E7BC29ECEFB06AEED4272FCFD947C689EBC9FF59848EC8D5D8F69360F74DE5CC384CC547B31249D06EC288A013BA2E07C05AC634FB3BCBC284268458D441C42545F823C546AEEA8E2DB8832D683709B06B7E6BE4D68EAF8A5EC172EC63E625576E32A5865E2F124FBF6A513FAE2AE5DEF871E89BAC25AA35D026E7121D4D2DE17DCFEF4F021AAA8AFB7B5CB9B5A424652320468E658AE8AB9141F66C35EFC4C1E46D7A8145D9CA9D57D0D5BE1723E7B13585F16919988F7F4FAEFFA4E9FBFAC36968E96B3DDA7F6F922337B15BC910C25CD3ABDDFC4938B21519D914EB51479ECC5ADFAAD5E844BDC958659F38E2A31BAE0F1894FC5A39446FAE1EEDB445CB1ECE0B0FEB796AF4124F60A318E5D52F59995478AE1CA6433A1338B132DC236366CE44D63C1930CD3BCE9EAB66A911EB0E25512631C96D7B45F53BE8C0D0E9D37987167B2FEBFEC0ACCDE2D31FF4A83150674DC11863CBAFC2BDDDF72232287A7C9D05221FBC916D6AF6A9043575BE8BC086795504DF62C50B859FE9443A08322F943EC913B2C3A3CEFF992480590BA4FBA1A956301125F7F1EE6FD5A78356554E5123C4587C4CBE4D4ACE2A00B847494CE8F88C60ABF6D4F86EA6C3FD05A01678E212734911A1F1EB0FB94FBB5F10003342E8DABD2C6FDD670652B77A8CAB31ED4E15DCA52421EA6328DFEEBB387B64BC3474A53D0CE7BAD442ACD0C6C9A615B32C1795DB075D9B25AAA48D32219FFB7BCAAF2B5B53F03CF4BAC5FDC6F0045067DD9F55D8C0B4DA63A91B8C40CE5BFF3E6E6BF71943A67FF828FB69E7C1A0EC4E10099F1EB76371DD43044F0007A22AB9F9EE22F663CCFD1E0F2E5849913C89808E7609F594E14A7135C94B4088F726A0A3BDE5CEDF9BE2F7402BE553D1A5BF8A15B90E711EB5BD84454F0219BF7DB0F9E031F93175BBDEAD918BEF03C68D279368FC8DE7818811EE6D5B09F4B773BB3100B688FDD6DE7C8A5B3218D4B53 +ss = C8B9932975C3EF329424392DA29B103F367FFF38CF402B40A0299BCD2CF10FCA + +count = 20 +seed = 81401DB81138D6874E91B7C11D59596E4ACE543F5A3471B6FB00999221765FEC3CA057ABE20F03B2D59003375FD71FE8 +pk = 2D7B0180596BE297A4631ABE0D48A046DCC99C8912B8255FC45592A2A61230652BC7C450A674CCC3ABB27395738D177E7579AFDCC30E74E7C7B5AC5DC235176343CFC4920ED8D9472E13C9B36A6D38BB44756BC31FBAB62893656DA065901303700A14B2F785D98896AE97953BA358FD53091012B97498CD7516B0E1898E2F6803C5A13D70F5BEC346917249940BA35E3EA954F6CA13C343A09CFC02D8E66852C1AE0FF8B22E7424F53B1897EA11268A6B866C09EFE8694031754ED1A2A147C0086283284133AA6C324E0B0570469F09E0901F25213FF9B113147990B54CB241268E0B6C7A3A90C638B7C483C71AC1344BD65C988736C4756E0B71111BF5B810FB3CC4187363A94EFA020DE1C3CB9A005CF472BEC5685322FAAD5BD1CB0F240458B56FCC5A6167F22577565DAC1BA9B984C33C348BABB70506B87926540547389B805BA01E4443B5D60B9A407F8B060FCD96C4B717BAAEB72400EAAA9853B962E8A0C8D966458CC4CFF31E960C447C6B205629419478360CDC945D6B9A55504D853C1E51364E7A9AAD82B64FC37A02E4139B9E6C392DC83C04005F6D1299D990A89ED68ACC31B5D1D224F2C8B3CD5280A12C6E088CC2F9D3C59AFCB9FEE458AF5135C9B4B477D878F34723E3912189D2764F9366AB8752C9248A5684296ED46F404A1739BA72D5D652C614860D41898E45B72BF66D587089FCF49E3B94CD26999D7539C32BDBAC0139B20988CC7B578ED880048885355F193DDB1690B9092AA2A86AF03A41797120BE84334EF25C2E70BFE8E0A658F03435B65787F38BC9452DDC584162955F8B8560991C407FA0C12D770E80FA4A2CF7B853708BEF2A44F959B9D05B6FAEF83F6F41A2454257B0157C55047AE7D0CC17079E118C8A4EE3358D877251970EAF86684EC70858A94BBAA4BD2FD1895C2223320CCADCE636C2156471B76C48D53E6A6C12A1317C39C48BF3A0AA0DBC8AFC034B43398B9F1C56D407A4B7C2BAC134024DF6AE9800B230E2592F529F79F0AB048867A349684B242BC4D2284A6106DBA36DE7B3A114B6353B479D014A69E33ACF5C465CED6669B22027D6657F12379ABBD248C6967834239E2D3A0211B73A77D681B61892877B7E102A53CB4602E3DC1704EC92A9E260D9817C6393062BF520F7A845FFF19123A1662FD241090AC81EE1748EEA878D53969FEA20FB95688FCB3D235910F154BD09A75556D890409CCE0A20C6CD2A59664BC4ECCA3D4725910D210DB0C848CE7242CCA945F1568561BB90D9A4C3DFBA83074A16FB3AC934C865DCEBAF6FD90D5B458C22542DED5111E77C12D8656908557649E9155A8472D5213B46F739F095B5FD4A2418074EF7DB9385F19D6630AA29B28881AA3474B7AC352C5DFBFB20FD7B8A0B87CF3933547CD498256A9E17733AD6967D7B9C7ADC64A951EC5C8ECB75B9190064F3A862D10CB5707215F456CAA10A2C240619925A140B6CBA878A0D40283EFB9E1562C227D716D2935E8D96649C06AE9465AEBF552D68DA1E7991BF987A4DFF4371049A0DC9E56F110779D562959F278B069B3C7712AF29027AAD6109BB0C3201565C0B0892A62AA74CA7BD6B48039066A95DBCA4E76A3A323612269546B18BA1BDA19C123C24504ECDF72189DFA1CD24EBF011A3BB66D35F78633E1EE7B249FF +sk = FFD8874D8B37C946409D69CB03529B7D1A43DDB24792D4773CC723643567671B8E0FC2B903D302679A530118AC453B0541A2389C46B38F317B43130972271D8146A66593B8FE659DB570C941F1ABB4F295493085A85277062C3D4DB168E466015EA506B5B8A805A435EF6812A6B68AFA9372776717C1042E24E7A10A842182E7C40C4CC547B98FE007A1D98804AC5BC3C31B6511425A558C73E5B1935C7A664EE224955B6D67CA54D47B04E1622716A27B21F12A2EB27C16D26A541CB0C1BA5A1A8629B7F2222B84CDFED9CB6F666B41C92FD0B074F42B5D2EE72E8C5443F34C5DC2920DA165558AF074E3CCAE84C1CBF1F70624E1A3A30A7DB045A2C4A79BB1A4B0F01187BBD8B29A8C60B07068A72264D9B305B5E391521BB945D53CE1D65436441932EC5867549408B47F28D3BF37D7AF0DF432CCFC3667F4ACE969542CD626637B570FD84210B3AB5456B23B8B339F4885E9A96BB17CCF1CA4A962C5667D0C3DFB356146C04BB8391197D54D0F4202F160824D900B27B36BF8ABC7876CA331C2C3A8A161D98523ADFC1EF9D538C9203A6729CFCF6089F7D72F57093EA3A34113749F23EC21C051AB2C836679B0210A549F2678C7187691DE949994A25769D4647FD992BE411E24E302C07569CF26C11F3942CA505391A794D42C77DA0A324B05908AEB9C70B88B38A95F371B1902E06D071457BBCB382AE4C36F14AB3A747A30CB7E9D35791879873A0333B3FAB967770465A056DE9C4420662C046AA8CA32093AE23ABD80406FE60BDCD1725DAAB0E50931C575A0C9137FA61442B1101B05686D398A6FDC0BBBBB25A073E99C3702B9268CA91420A1198B5C54501A03C878B6827E6D586AB42C2FA47258D1255711654968FC80E1364886F18E98FC10EB85645B399788DC225B1A233FE564604A86397A4483C102203188DF667961BAC9EF19B99432475C0A2C9978C81CF5314A2B2AB37479549B14C8D70ED8F0C6625938CA4A92BEE5A7AADB286E507EE8890772C3353E35C2DE8696041BCC8B81997F8C7800417C91C32E9B8B34B62A25E5C2AF2854CF902269C3C5B50A5209DC1C63F8835B3A73137D855C69F9335FC66EFB985933F4A66B084AA58909E658998A15AE8B087120F59A00426CF9A327DD48467F8C12CFBAACEA7BCA7407060C42950CF9543CAC1EDF9C296D978A2C36AAD92B665D6C9513B59278AC1CC781204E555E27F81E976A74D3055A48035203472960E596C7C4C2D0158A006D884F40681C6610F1124574EB9FF5323E10480D0E306F1E398AD1E6CF8057024D072DEF4719E3A6BE9AEAA07B56077BE495A635C67066A2945376C9836EBF4C413A05A9B1348C31329884BC7D820A6BAD7A63BD62518878A97FB525332433573973DF74A00EC02D50198A2B1306005335E6A51191505FB244999CC333BCFA4E7845B766B050CF66607982014D28548A4454F86A06E9321C82781478CB938C709EC5CC81EA1A9269543DC8EBC6D253BE1698990C81C587D7263E7445BAF53316C23EB8863D151A4E5659928AD704C1C7B2BD2A1987907A05CCBD2F0C78232A10653452E3DABB7598CA83D37166791EF11A2524F371180984BF72A6E2291301606B7351A284A1A62D7B0180596BE297A4631ABE0D48A046DCC99C8912B8255FC45592A2A61230652BC7C450A674CCC3ABB27395738D177E7579AFDCC30E74E7C7B5AC5DC235176343CFC4920ED8D9472E13C9B36A6D38BB44756BC31FBAB62893656DA065901303700A14B2F785D98896AE97953BA358FD53091012B97498CD7516B0E1898E2F6803C5A13D70F5BEC346917249940BA35E3EA954F6CA13C343A09CFC02D8E66852C1AE0FF8B22E7424F53B1897EA11268A6B866C09EFE8694031754ED1A2A147C0086283284133AA6C324E0B0570469F09E0901F25213FF9B113147990B54CB241268E0B6C7A3A90C638B7C483C71AC1344BD65C988736C4756E0B71111BF5B810FB3CC4187363A94EFA020DE1C3CB9A005CF472BEC5685322FAAD5BD1CB0F240458B56FCC5A6167F22577565DAC1BA9B984C33C348BABB70506B87926540547389B805BA01E4443B5D60B9A407F8B060FCD96C4B717BAAEB72400EAAA9853B962E8A0C8D966458CC4CFF31E960C447C6B205629419478360CDC945D6B9A55504D853C1E51364E7A9AAD82B64FC37A02E4139B9E6C392DC83C04005F6D1299D990A89ED68ACC31B5D1D224F2C8B3CD5280A12C6E088CC2F9D3C59AFCB9FEE458AF5135C9B4B477D878F34723E3912189D2764F9366AB8752C9248A5684296ED46F404A1739BA72D5D652C614860D41898E45B72BF66D587089FCF49E3B94CD26999D7539C32BDBAC0139B20988CC7B578ED880048885355F193DDB1690B9092AA2A86AF03A41797120BE84334EF25C2E70BFE8E0A658F03435B65787F38BC9452DDC584162955F8B8560991C407FA0C12D770E80FA4A2CF7B853708BEF2A44F959B9D05B6FAEF83F6F41A2454257B0157C55047AE7D0CC17079E118C8A4EE3358D877251970EAF86684EC70858A94BBAA4BD2FD1895C2223320CCADCE636C2156471B76C48D53E6A6C12A1317C39C48BF3A0AA0DBC8AFC034B43398B9F1C56D407A4B7C2BAC134024DF6AE9800B230E2592F529F79F0AB048867A349684B242BC4D2284A6106DBA36DE7B3A114B6353B479D014A69E33ACF5C465CED6669B22027D6657F12379ABBD248C6967834239E2D3A0211B73A77D681B61892877B7E102A53CB4602E3DC1704EC92A9E260D9817C6393062BF520F7A845FFF19123A1662FD241090AC81EE1748EEA878D53969FEA20FB95688FCB3D235910F154BD09A75556D890409CCE0A20C6CD2A59664BC4ECCA3D4725910D210DB0C848CE7242CCA945F1568561BB90D9A4C3DFBA83074A16FB3AC934C865DCEBAF6FD90D5B458C22542DED5111E77C12D8656908557649E9155A8472D5213B46F739F095B5FD4A2418074EF7DB9385F19D6630AA29B28881AA3474B7AC352C5DFBFB20FD7B8A0B87CF3933547CD498256A9E17733AD6967D7B9C7ADC64A951EC5C8ECB75B9190064F3A862D10CB5707215F456CAA10A2C240619925A140B6CBA878A0D40283EFB9E1562C227D716D2935E8D96649C06AE9465AEBF552D68DA1E7991BF987A4DFF4371049A0DC9E56F110779D562959F278B069B3C7712AF29027AAD6109BB0C3201565C0B0892A62AA74CA7BD6B48039066A95DBCA4E76A3A323612269546B18BA1BDA19C123C24504ECDF72189DFA1CD24EBF011A3BB66D35F78633E1EE7B249FF699FB2F061A75F111F4A7A60195D9045DC01716B6502CC107CBCEDF122E8F6196590A2E5C7ED86CF2C5C2A898662BC9A81418720BBB632EF9CF0B845ED052D73 +ct = 88BA446E3DACEFE9158DDF1619C9B1C6BC274B8E8F819342BDECCE593F705B29EDC21B69F1B65EC4674F71CEBE673D7FCB0CE2FF757F8EE5D5A5F8F5035A58E1D75713EDE33F0E7B98056F1EEFC0C692DEF07029C0EF3A857D6972723C7F49B79855703461A3F83857AC0F2331E7F8B3889FACDF6373F8CC49DFB5408B57DF0CB0484862970993C5DA712D87335F7F7D8C4B818E8B96FEDDDC435E131F47DEFF13919A470B25332F346A8317F0D3F8B13CD16A12C63FF17F7943275E2B4BC0B3F4AD52B67EED6A0F499DB79AEEF56964029E1FC686B78631FE0AC8162E2D3C3D36E2958DD95312FBD18ECE60716E398627437655603D1428771F24D2F39FE6D1B759A46E303BA9ACD68866F2729CA6FFCD91FFBA30D8DA6433383DC8755772C94975A6A1AB6B5A2105901363C8B94A20A48618311E4E59975C87E46AB0687D30A7BCA3E13EDCB560706405FD83184F98784EDB59535CC3CDFCDE98EE989DA0990BE3FAFF402220AC0070FB31CCF352E26727B06F253F8A5E47C10F95456705FEA41AA9A41AF7BB1A5E3DB02F9E1DFB406FD4F27FD78C25E86D9C04FA5B0C6B2D6A6D43D760F2D1D01D1AEEEA971A9BA64A95FD63C9A95B0EA5B4A83282C920E0E395110AB2DBC59C8FCE8307B6106AACB58AFB4C38A868B4D20D7772810E9DA53A5AAEFB991CFEEAE0D54A1A4934A22BE3F8F33D945F66F79AAF3B88A6D18963660D8F1E8EB23644E487E4EA68897C34628F30FF3EACDEE3353269D87B2FE2FD837FE2A6EC7B1EF99341E470AA67004DDE57EC6A2B334A2B1B90291D73D8C1BD43C38FA82E088893ED5D2149F568BA80A68E08131CEAB491A61FCAF07DBCFDE77C530C60BAFDCF55DC8BA1F9478B28D9C6A53BB9DDF4491026B754AC31214D5E774075DDED90B670181300190F9A5B3F47CB3CAA6AC0233E7AFC708DEEB1590266DD8FBA964B32880AF48EED81534B9D47F63A7195CF60EB827D2A0D94D84EEACE28C34711D116D011074B118C655380F6B2E3106ABEECECF7186B2D45A324452BFFF6EB37DD17C4CB034DE10D5F24963EA898B5F19641BF1177B64F6832331678EAF080B9A65F93636D2D4F5DCEEC96DDE5C1E8C7EB505D4638A6ACF4746AFF7EC6456E1DFD2035CA2CE87FE16EE3E69F5C06CDC5BAC084F9605AC9F07BE61787B1057C1CF5F7E3AF45064BF8920596522EC0A48E73F385EA60A256ADFAB1EED0E08104FE20AA1EEA2CC466E0B64E4F94AB0378605B7A2C38BE7FD606229C74B5D3A35B2BD5F46A3A4F180111E6F35594BA9A754C4D00E57B0C62BBC3D326DF497DEB7BD50401CE2E5AF6F75CCD6781BB944922329AB94BDA5557869E28133AE070669BD9818397C5E5A1229C145BDC17B95834BDFE9A2FC672F091C8F71735499E4A032D34906FFEF9D297AE68DA67C76770E2E9EC362B6DCF520B9338E170BCD1DC4BB9F94C564264D5B6439CC128AD54FDF6CFE5CA16AABBC65415B91485CEB77120E03B56C558D4899952F64CC140BEDDC8B3AF3BF805C12D21F6BA22C2 +ss = 578E4E308F2B426A7B1ED7D80C72396A914CE77A4A7A6D16B26E4AF3D59B491B + +count = 21 +seed = 30B5DE5B73681EC08AAA03F6F2D2169525D25F4042A5E3695A20A52CA54927B85F8BB948FC21DF7DEFC3910B28674994 +pk = F3576FF861541032094855B18CF574D868B0EB783CE9011F28FC14C486B122CC80093897BFC8AC1082421F99767BC42B0FF41B22DC7B50D5556041338E6C4368AB190E92608F6CC69D8B33F1AB04DE68CF96D9C5882C97CF28C30B86924AA57849954369C5427C876A9B1CA341E8522E1357E60A4450B69F150658715403D1E1C957E5A914B9A3BC4C45489053306329C7984E76F169C8639DE4080DB1671ED01A24724A101DF89E45B5B385CA2EF663586AE58D9B33ADE9738F84482E6E28909E7641AA673AD772B125161A316166E1717FDBDC8D02B2B2B6DC21805619D4FACC40E9A21BCCA9D4DA71220A4631E95B25E960192A22A39B904BBB02F1184B79A97B3CC16B5E4B5EAF278913B7A195F3107342A77A68CAC90C1B5A3CA9B354A6095C29C09C5AC2B44C6CB28A250834D5F2A307EA3434977D0087017CA2692B79008640B770B41EE2C2C77BCC2605F1857368C8E12983AFA8633C870115A3818D6BCBCEE864A8DB694F4B77BCF63A8AEC407A45716AF6358065C30B77B68C2198B2FB558F463A7477B9FA7680F1E65706A888B8740A87CC7E7949156F896C182B53E464721E46A258820201887CE9B83D43250B63E2AB29900A115084A6E66584F767853B2E684C547D97266B36B6838AABA73298DAB79C58C88F1B51113EE752736B7566EB5759CC4DBC37551135BB3C87B1A6C83AC5A38DBD78106EC0C5E9967A6D81139CD516027C25AFBB6C47E3802D56079E6265C4F21F1315A96AB994597214B814CC53E8566330CD51FB4045F605DF1C7C9C255166651DE6041B7FD85C7E376E28076AD352051C65494A1054C30930621C53EE8947DCE3C55BD686F186CD5AA21AFC17664D36A2D7F5008AE83950B93AE510847552A5C2F761207B0F478C73C4D6313C8ACC25B13EA64A72EE3334013CBC0A855B55E88EA17466534786B6176B9053CA9D0494C6B4A940B70B68F40BF570C461F11795952E69F21EC4562DEC99448263188EF44E71A1681D626CAC69C6B56AB51AE656BE1CA028672D97D044E43577F26329D50851B0F8A4A1B6C2B673AC6418CCD58005AD400C27D274DD4732E56B5D7C0B6EE731A99E15229F7295C153AA3A873C20C23A35B6137C824F6FB021A0E28F98BB3BE8DC07A5B038DC89944952913AF7A39A9B00F1A038A628686A735DBD4C45E0B8BCDC1C1A902CC4D0571CBD589F507A0C0DCB81BD39811E723358D6320A3049BCC90D776562EB34877978C9929548286A85EFB85F7C6C76FF255F13A0CF5E70304F1CC838FA398FB34E26CA662759C8F3657125DC2AACDC4615653EF074A784500EC60980BE4AAC94B0C7A9012DBE73CDBF1687A684AC63526778926654A4AE4CC779A600A836E3273ACB95A802051F18AF32683F52363572583FDFE30287B2632874CB04832F55E0944712C86D37420137C56F6251A1352AE37A0C3FDB885CB561E63A493A15BEB5E3B123ACA6B6B7294D8002E7EC758AD2C22D336AAE3C067703821842CBA2DC0B1B7A45CC0A48202A002F927122C040F84A884C1334C1E17347108B91C055D331C0B170C6F06048B40CA0BED838AD963FB8747CA714CF1D3267B701132046699798421ACC06A3BC1ADE172FC62123235C2D8DBFE40DD56CE5DE6756CC4B6AFDF64050DA2EECD9953E893C53BF7FFB +sk = D32CBC1116AC88219F9AF2C33BEB59BB94B372F97815278F0FAB2C690C94B8F209DD1575BD7C0BC7F48AA133BFA068CF1AF1612C3325B8D08963BBC66D938F46843FEE424357E535C2259ED958A75CA6203286190BE53A9B46373F8B41CB38C1CAE2BCB91898669A872F1A8D9CD21227E42ED655569202CC6B494CC6A6BDB08731CDE417F48B86554CCAF953B8FB70AEC727085510CDBAA7CD2A0BA853928886332FB1E3A419C49B34EC90FD31B716252ACCE7A79D05CC04074D69AB3CC9809102261A2191A086231DC70AA583E86912E5BEB2C1A22E841F39DB531D5C26CC333834A20480D6B1CCF19A654149045791D33B414696375DC3C7B0644626E8822C5325D52BA764F2361D853D244416CB9A5BC0540E1238CCB53438C90A196A45571F743894F060F6031FD623ABEBB4AFEA05190DD9452C981352A78E09579F05E24DB2033AACFB10D9335986E8542D9480BF5603FA932D2D0878C3753E6524A809324AD6F169D7FB6D9C0264423A632996ABF297707D8412A6B86160B69980E18ADD1C372FAA406F540C00ED0A75C3544811759C3B5026E6C19102B7160883ED002DE5807B5933934FA01559C4A790230EE93C215BD75AFF117D0F170B4FEB7AEF5B007ACA616E688161FC00CB037C8232CF2DCA569F01A2E1DC2AF7ECB6111181F2EBCB1DF27C6EA84251D8A2B6B6582EF915E2B8C7F8FB6BE8844478FC570B8054A067B34120B47FC6AC68125CCA8514DB4540B7796C9FD05523E7014DB34B8EC94D5EB66C9F5CAE2F838191D2234F43C72262A18DEBA17AB495B7F0529D89B8E1E407BD5A185EAA2444D20C6C9566526B8707B13BB0CC8D9589773DB90952A5CD78E43BDC68CFA4401D7912618F456EB4F97AC1B49AB948592976233F962B1916531FD1672BB69BE320A2985B38B80279572488C5F86BF3D55FB9FB90449B66FC874B94292000466786FB7E393765C7057051999711D234B4D277419320E0046EC0925B41D6B89C62133BD2734E296DCFE90BF6344219A6A22D2CB50C75BC02B07FD0DA11FE0A0A0B9AAD76001D5D7C8FEDE065DDE87D5D47821E756A926638395883879A91B94C6164A40895476269917CAEB12944DC956174B6CC5154944571A6F6553F604D3212728FB08AF6E8C0EA00265AC0C5464595B31A9131871D79298867AAB426D009480C0BEFC08ACE14991399079CB62DE9E6BC80C88C3339640FC667EC837B691C3DA4556A952B3E63C162EC911101C5A49B35475AE68634A7B0CEFCCFBEE608CD4C43C8EBA7A8F957DB595645C64ECF08B50C7438BFBB415C27A45AE940AD077E5A533825D998A9095A735B5D23887B0048AF49CA85F18395C7D3CD06BB687C92CDA9AC9C03A9333A866A9639803C76B5B189294A269F389ABB5010789D410B88215C554008CB10274F781ED6B0BE3903576CD16934C4B6B65296C477AA174043F06792F3944EFD0206E34042D827CAFFD2989B936B91694825C4BD8B10C0777B11971CC1EFB93EC1B3674AFB4FD07568FFE89C707B5785C140D51B433B7942D88A6EF9BC9D091472833004005AA803A050CE03B2BB551F62FB1FAC6649D3E14F0141B2EACA73B700489B73A8D840834A7802A96864610B10F3576FF861541032094855B18CF574D868B0EB783CE9011F28FC14C486B122CC80093897BFC8AC1082421F99767BC42B0FF41B22DC7B50D5556041338E6C4368AB190E92608F6CC69D8B33F1AB04DE68CF96D9C5882C97CF28C30B86924AA57849954369C5427C876A9B1CA341E8522E1357E60A4450B69F150658715403D1E1C957E5A914B9A3BC4C45489053306329C7984E76F169C8639DE4080DB1671ED01A24724A101DF89E45B5B385CA2EF663586AE58D9B33ADE9738F84482E6E28909E7641AA673AD772B125161A316166E1717FDBDC8D02B2B2B6DC21805619D4FACC40E9A21BCCA9D4DA71220A4631E95B25E960192A22A39B904BBB02F1184B79A97B3CC16B5E4B5EAF278913B7A195F3107342A77A68CAC90C1B5A3CA9B354A6095C29C09C5AC2B44C6CB28A250834D5F2A307EA3434977D0087017CA2692B79008640B770B41EE2C2C77BCC2605F1857368C8E12983AFA8633C870115A3818D6BCBCEE864A8DB694F4B77BCF63A8AEC407A45716AF6358065C30B77B68C2198B2FB558F463A7477B9FA7680F1E65706A888B8740A87CC7E7949156F896C182B53E464721E46A258820201887CE9B83D43250B63E2AB29900A115084A6E66584F767853B2E684C547D97266B36B6838AABA73298DAB79C58C88F1B51113EE752736B7566EB5759CC4DBC37551135BB3C87B1A6C83AC5A38DBD78106EC0C5E9967A6D81139CD516027C25AFBB6C47E3802D56079E6265C4F21F1315A96AB994597214B814CC53E8566330CD51FB4045F605DF1C7C9C255166651DE6041B7FD85C7E376E28076AD352051C65494A1054C30930621C53EE8947DCE3C55BD686F186CD5AA21AFC17664D36A2D7F5008AE83950B93AE510847552A5C2F761207B0F478C73C4D6313C8ACC25B13EA64A72EE3334013CBC0A855B55E88EA17466534786B6176B9053CA9D0494C6B4A940B70B68F40BF570C461F11795952E69F21EC4562DEC99448263188EF44E71A1681D626CAC69C6B56AB51AE656BE1CA028672D97D044E43577F26329D50851B0F8A4A1B6C2B673AC6418CCD58005AD400C27D274DD4732E56B5D7C0B6EE731A99E15229F7295C153AA3A873C20C23A35B6137C824F6FB021A0E28F98BB3BE8DC07A5B038DC89944952913AF7A39A9B00F1A038A628686A735DBD4C45E0B8BCDC1C1A902CC4D0571CBD589F507A0C0DCB81BD39811E723358D6320A3049BCC90D776562EB34877978C9929548286A85EFB85F7C6C76FF255F13A0CF5E70304F1CC838FA398FB34E26CA662759C8F3657125DC2AACDC4615653EF074A784500EC60980BE4AAC94B0C7A9012DBE73CDBF1687A684AC63526778926654A4AE4CC779A600A836E3273ACB95A802051F18AF32683F52363572583FDFE30287B2632874CB04832F55E0944712C86D37420137C56F6251A1352AE37A0C3FDB885CB561E63A493A15BEB5E3B123ACA6B6B7294D8002E7EC758AD2C22D336AAE3C067703821842CBA2DC0B1B7A45CC0A48202A002F927122C040F84A884C1334C1E17347108B91C055D331C0B170C6F06048B40CA0BED838AD963FB8747CA714CF1D3267B701132046699798421ACC06A3BC1ADE172FC62123235C2D8DBFE40DD56CE5DE6756CC4B6AFDF64050DA2EECD9953E893C53BF7FFBD3413880D082F26986FCF452A84A8DA934ED06198B290ADA1789E74D9081A9E7B6591121E25D64010C25A18676033E1D7278AC5F2D0B43A31F3A4156AE710465 +ct = F33AA44E8B475A3E664A1585C8A1058B26E2849754F17E4FECB0414D2EF214AE903CC1B8436B302A06BAFB52754F9908496F00B79C8EA49C3FF6B3CA9F7AB4FE2DAB7B915958CCE56FC53EA3F168E79898C06E99B2A5C7F39987D21084317FD5B99BD6B1121A1E2F719B64E54A40C1766A8A0487133272801A7D9B589119104886E2914356BC14C7B9A1DD2B424599A059AFFC963B5866A7EC744C20166B0CEB632ADB3722CF0DD49C85165B6FC05D5B20847A416482472A567A33B8653CC9E455291ABB5E65C83D051EAE887C946DF46D00CEFA7313406674FF748EB33C6351E3A18821801CF0379FC77DF7A3291515AAA7BD5538C7C5DC49EB8CB61463984A3BF34ECDEDFEB5FDDB630BFA20EB3AB4BDBAE85AC6A15162C6D27833F50D9B00DB134601B7D3B32A4D1A6220B98966E51CC1D59926DFACD2EA8EEBD5B9C1B0581F16E5E79389A7F716B0C07E353BCEF084778A9C61491456DE86AC155309583B512F719B6D2C74549009AE11583099812486239A69AFDD7571AD30C622AC4BE434F25A4D70A7EEBEDA51085A918B0E3BCD20C1E1421A527D62046AF8CDB6EAE295E10DC25C4DED82E9067CA0E1B0B289D1DD14866CE32F6D12EE0EAA215FDFBA68DF0B0C5808B76A2C24AA00AA92B08AC4C0ED48A573841D265FD079EE835925A224D2055639BD642ADFC9D5AAE4885B0F7C17163A53D0CE55246DFA31943BF03B6B1D90A7CD2AB06B099EBB67A3C28661789A9D7DAB10F29E1D4BC4D3C6102667018935BD9EAF14CC8501F9A84BFB0868B922C16417B227B2C149BD3D176C429147112AB1DA57ABBCB07D85D936E62053F4EC915792080BEB2CC142BDEC7AF12919CA448074A601BD3AA1235B499B96FC9FEB8C5B3108AF77BB1D0931F92E527ADA040A1FBEAE4A7AD92CABA96F5DE69C0FD78DB39DC2BE90F81F2BE00B4949BEE566B80B7881905B59A824506852BA8DD37E44C4A534A7A6A790D9A243439CC5A548B9B07AB0D4050676EDBC6DD4B84823E7B8DCF4EF8021D5F6FDFCC470DFC8FCB717C2FCD5CF26AA1EC03CB72FEB58A50B831C5E36B63E6A5AD7C8D57B6DF835F414D3B2D0A86ADE0F85E76E5F3B770345D3A2DF2370BF8E994E4A5116D5AA3E2C2BCEF9D1D268781453FB3D1E9BAE21595BAFAEBF72B1B4FCCD32C84897D712B720DD962C5ED46803DED0AD4FC417647DB85C22970EDED391F065143A7CB8BA660FFCA69327C2CCFDDAC83C0215818712332A79881ACA7321098AEE4F733D44F31F3A79BD78CA4B932B1EBCCFEF5C3C987FF95485F6239DFD607E3F68BF6A746F17CF0F4F438020BFDA627C5C01C65E0049914C822ED9463B6FE957847722F659621BAAF475014FCE9CF5B1A11D7392DD286CCC616EDABE08C80E56E77A41584261DC2F09D7E55A8BAE0B0D3354A1C00A6CE7D3C65BF61F3B45D81C75BBE8A0C3780CBEB6C5CCE34CCD76318017215ECED1C686224D322C3239A0E3ED6D007195207DB057125ABB40CCADE2ADA3C09ABA1F66AEFFC81F119EFA0828FA3D +ss = 70080E3BAAB3FA55E8A308E84FE9ABAE780BE8C09E211651F6EBF6053F8F264E + +count = 22 +seed = E335DF8FC0D890588C3E305AC92C7160FF199E07C85760A828933750E3FED8C83B0DBE802234481ECF890A32D7A2884F +pk = 4C376BA98C3A0415A3BFB0AB42D0A3D68CB171109C5F83147C33ADDA2CB07C62A9025B44523B0AE4CB8A8BEA5E550B717CA6C8271997CFD6C5ED76AA44E43DA2A02D35610787F22966298FFBB45FD78A8D36EAB454675D6951A70472CAF06640BC1B97D6760E74B41C577855BC0756ABE528EB4894E8776F1E739DA45A9F84C9BF3C72B43262525B547F75176AB2E12D8EA808D3B0355766BD69D964EB3B450A96C835D7B238220FEBD62443B03985731333C54382D20200E30E4CBB2B607AC998F20DEF865BDF47CE78AC3DBC1ABE33245D6FA7583B31B6FE7B6EDE7A8EC776B20F7BBE7E376578F0933B761BB0952161123D61282CD6C80CDC8A85F9632ABA1A8EF5925E410BB80BEABC67735D07E4ABDD587827745A3220A24A7B3902416BEFAB3073C2CB1FA76FF04315B653B3E7C18343391F92015939829DABD0289B5AABC4CB5335D963AB842865BB7C38106EB1274ECCD0140B415901279E8719C0415517B5101394F78A48F565317909371A3154D291698B0BEDE17052F30786DC2D46E71EDC438C288CBD44445F993926BFF0A8CA1A033B656C2362A659EABBCF37B2CB5916940AA9B3E850E51039C08C8588347E1099A0D8380CCC4B8CD0C87218BC24F09126A82A3D530A75500254510AC765CC1DE612A4CEB14DB78A7141109F947B4329158F87E4C8B41A92AFCCC9EB749D66A71159DB90E7A36642636AF22CC0D541CE52DB7AB44BAF30560691A637C93193A11A00EFEC075289953FDC9DF3EC3390342AEE44C08D661632FB0303681E1F89CE1300B0C1A36E63E5A45886A4C76534FA78B87A75CF96AC66205C28766BA5EEF7062363C19091C61C543D5C1B8A547372515722EE515E8EF52BF8E089D93377E2C8458E626D3391953D658CDB05C7A40077F4E19DC0B132BE719014C12B0CC242466112E94809630B63FAD12C99D271DBD38E5AFA54C894542B940415354203A0C8A785AB94200EE0CB976991C642257D9AF6998B61BA27B236FDFAB86F834FB2D47CC0904B9D6ACD2F8311F0D4B8AD81A24F712D92272587220E8023A8BC13BD17572D38851778F319607752466CB0DE7C5C12103FAE4C57D953B96BE93262BA9CB05405A5D2A9E012B21A22A2EF33A385C898C80AA9663565B63241A1B206F3379ABE8262CFA49BA05C3B43E9485E60CD38D66EAED114EF81AFD66B2594BAA361D3C3B02069B1A164BC387632E24C82A91BE2CA390EB585E900173699A8B26B8916E52BD643645D3225DF38BA50A50EA013B4B2A86EE1F76278E27F5A4142F034004B567F309C52ACCA3C7530162ED744A67481CA338861CCC3E8331E1C67886023743719493CC3CAEA51438E28AC4EA06B906789A65220E3C7407C874C6322BE1F9B627386081753AD618A8DCC013395F20F5017AE2B57BA908617490460D5A67FAE2660A56C4C4D97BABDA0BAE0F494260877F7077AF2536B2CA46E297C61DD8422BBE515519210DABC02E7047B13F16607AC15E4950574C43BF8C39A2528ADDFA2782506635E5626967A1F30C02FA3442FA93250571A8173999A88DC27B43C476468A6A4739972DC1B68493413A2743B9B563283CC886916ECA5887796A4F833AAED6639B9D531EFE5CADF9225573A23664C9CEA086428DCD19FF40A06186A41FEC0723953781475F648 +sk = 818B55FA5AC30A81891F3A3643924B2B046FEB6765A61CC81C9059D1F82F6A0067A102825C88A530D15F0DD95F0B4742D29ABE7044C62D45A05BDAC46130305E3C3417D67F60B92EDEB6B2A398119AD160EE3CB0FB52144435A5BB5412C0512DC6121BF6E72D0F87A3834AB5338196FDC950A3CB1B7354C4E50369BD4364CEE9066A221DFCD580F1B914C0C335F547748BB19264B7879F206A9C610573B8676BD0BDFD777A2A0CA5EC891A1317C5289784DE114E84C53B983778BF8933805256C9A9BD05A11AF8F5AC271AC3F1E635EB9A8263C855BB230F58EA3B7E8287D76258AA57646B97560E593944C4CB3567A2C382A795C991F69BC2DF2CBA8837C9A3B58A9DAC5E4D84B50722A144737EA38B14BE51C41CC55C53340ED158AB4A0B0F0A2612962B89CC2AA8B29198F2E04B0F0CB586F271C6414F31A71A45ECCDA8C597C38415D262571BF0A7BFA17115E0C7731C70C2D01C492C85DE16C511102C5A96973C724F3B58B504EB65F56116AA7779B76B2554736D9D6176DFC6BA007A590A311D4B86A7A6251FFFE6086AB3319DB48C4DCB91FE680F45A9480241242E4AC9861B62860837CC813FADF00751C8021F7A1C4D7A1E5F13BC3E8462F372CD7498197D172EFF98B1F8BBC37974B025295A80E3525D282FBA8467F8079D78FA6068E23BDBB3349A31506E474EA228C3927A554D7747BD3621A0343CB155BC786075C3015C3692C0FC65B194A12152A14153A03D5147B0CDB423A3B50ED6461813F9AE1FD63AB7A53031DAC2D0F87CACD1CB81461C8C08BF367C4CCAE7626343469D417ACC705546293498035195240387FB1F2E7C005DE000E530B9E21CC7DBE463E7D24ADEAC1127026843B87CF6FC1BB94674399B0636506B1ACAB72F623ADEF866F883762B5B4509CBB2BE142C5C550046E10D29FA431F9B7D977253928A8D2D4C33ADD899AD736B40CB4FC656BE02D90BF8D393D632A1AB509C432511F1CA16B01139CB0627F6503BBA75440414AF97A04BC5239567C060EF94C9BA7221D4612EAA640BDBB8B72E32A4668401AA79421BA68115261A8D94878C90A0468510B247968B7463FF49A0578044C5E9147F0739F6A17B18828BDCF56966B1CAA125CDE7BA6DCE939E56D350E896CA6219A6B8947E3909361754593FB8A85E742CACB74E1D45704FA4CFC91C142453BA5C08558DE1321AD6A6A2804769A0BF69770A1264BA5148B40A3A9BE3C513A382CFA3C244C9A138EA9CB8DA7627B350CFF87AB064A079876893D893250EF59F369C41F9EA40DAA5A5984C19CE06CF9BEC2947932133A4157BB8CC3C72A1FD25715962A9C88026C018B7202885224019466540C9EB5482A87E665157BE7722BC64133C827C20B97D9E692342F23FDB1B75AB2CCB6FA5973820B92EF1BB45C2B5ED1330C1417CCFB39FC6301B8A749D3613B3803A6ABBA20990151305CB32BA6A5B558265C2E27D8D49AEF3E91819920DB20360355919D5F641922233A1C24C0045172CB10F9564A029F07578A48A4D215248F3AC7A912EF8E56E366B03C567AB978C750D85454C68A5806AC38B7B3395F19FE78A001C5867D3E90E9B54BD63954761AB7F4A57B1FA32B65F285742C1207AA0684C376BA98C3A0415A3BFB0AB42D0A3D68CB171109C5F83147C33ADDA2CB07C62A9025B44523B0AE4CB8A8BEA5E550B717CA6C8271997CFD6C5ED76AA44E43DA2A02D35610787F22966298FFBB45FD78A8D36EAB454675D6951A70472CAF06640BC1B97D6760E74B41C577855BC0756ABE528EB4894E8776F1E739DA45A9F84C9BF3C72B43262525B547F75176AB2E12D8EA808D3B0355766BD69D964EB3B450A96C835D7B238220FEBD62443B03985731333C54382D20200E30E4CBB2B607AC998F20DEF865BDF47CE78AC3DBC1ABE33245D6FA7583B31B6FE7B6EDE7A8EC776B20F7BBE7E376578F0933B761BB0952161123D61282CD6C80CDC8A85F9632ABA1A8EF5925E410BB80BEABC67735D07E4ABDD587827745A3220A24A7B3902416BEFAB3073C2CB1FA76FF04315B653B3E7C18343391F92015939829DABD0289B5AABC4CB5335D963AB842865BB7C38106EB1274ECCD0140B415901279E8719C0415517B5101394F78A48F565317909371A3154D291698B0BEDE17052F30786DC2D46E71EDC438C288CBD44445F993926BFF0A8CA1A033B656C2362A659EABBCF37B2CB5916940AA9B3E850E51039C08C8588347E1099A0D8380CCC4B8CD0C87218BC24F09126A82A3D530A75500254510AC765CC1DE612A4CEB14DB78A7141109F947B4329158F87E4C8B41A92AFCCC9EB749D66A71159DB90E7A36642636AF22CC0D541CE52DB7AB44BAF30560691A637C93193A11A00EFEC075289953FDC9DF3EC3390342AEE44C08D661632FB0303681E1F89CE1300B0C1A36E63E5A45886A4C76534FA78B87A75CF96AC66205C28766BA5EEF7062363C19091C61C543D5C1B8A547372515722EE515E8EF52BF8E089D93377E2C8458E626D3391953D658CDB05C7A40077F4E19DC0B132BE719014C12B0CC242466112E94809630B63FAD12C99D271DBD38E5AFA54C894542B940415354203A0C8A785AB94200EE0CB976991C642257D9AF6998B61BA27B236FDFAB86F834FB2D47CC0904B9D6ACD2F8311F0D4B8AD81A24F712D92272587220E8023A8BC13BD17572D38851778F319607752466CB0DE7C5C12103FAE4C57D953B96BE93262BA9CB05405A5D2A9E012B21A22A2EF33A385C898C80AA9663565B63241A1B206F3379ABE8262CFA49BA05C3B43E9485E60CD38D66EAED114EF81AFD66B2594BAA361D3C3B02069B1A164BC387632E24C82A91BE2CA390EB585E900173699A8B26B8916E52BD643645D3225DF38BA50A50EA013B4B2A86EE1F76278E27F5A4142F034004B567F309C52ACCA3C7530162ED744A67481CA338861CCC3E8331E1C67886023743719493CC3CAEA51438E28AC4EA06B906789A65220E3C7407C874C6322BE1F9B627386081753AD618A8DCC013395F20F5017AE2B57BA908617490460D5A67FAE2660A56C4C4D97BABDA0BAE0F494260877F7077AF2536B2CA46E297C61DD8422BBE515519210DABC02E7047B13F16607AC15E4950574C43BF8C39A2528ADDFA2782506635E5626967A1F30C02FA3442FA93250571A8173999A88DC27B43C476468A6A4739972DC1B68493413A2743B9B563283CC886916ECA5887796A4F833AAED6639B9D531EFE5CADF9225573A23664C9CEA086428DCD19FF40A06186A41FEC0723953781475F648E6EEC2929FEAC2A86C9DACFA6214E2E353FDA2D547C3829F5678025FF8418A1A76EAE84D11C4528382828F7A689A0D5CFF87B8CA0BBA97FEACB39B935A8788CB +ct = A91F16FAFFAD2674D7E14B4CA55F230D862469E3FD04E9FFBAD5683615ADE14CCE1B9C911004C7B3D9B934A6C9294544D6CD1D3B97FDAC0D5BEFB7303F349FA70739A9C9017A0EBA508367B01D14733BB3C7DC8334EB2177FC553B7423BC340412E57BFBFC622E45D32E2715C37CDF1C856173CB214673A4CC53C79AFCFE81535D66F2A60F1272ADA087AEBD39E86E820CEA4D94E9271A1962127E4B9FC49FA67F9F3BD931373BF8B10B813917A339848AEE8DD118182E5C2D9CAE2C3FC1421474B78C108804AB7B3B546F46B7862D65BB28D33E260CAEDC91583EFB84B0535BD17C6CB4461E05253945700716E1C40CB829E729136E5073B0B86364934E26F25BABBE1D1F1F0D9E625DF872E6C136832E1D4CCEE3EC60126ED28841BB39A390A6F9289B4878224E3E857B1BECB231099822F337EE5A69577D3522174F7FB4E6B539CAA67734ED07BD8F73ABE46EFB903B5B9965FB414720CE5A8BB43DC13D441D4C62F10D4AFD7FC574DC802E15156C7FC4C76551C11CE3D2C7ADEFBA4ABD98586577BF0A9B54B0A433093B9AF348AF3C5F8E4FEF6C07C0A0DE1866F4BA1244DC4B815909FBD5397F0872079DEF58563D5E044066D898A9D738D8E5F4979980ADA72855E3C8994BE26C8670B8A4ECFCCCEA8809AF9B692FA184376C739A99CB46A050C825DF16039B92AFCE8D9F8894895A189BB544130A11096ABB902EA8924A13C81E00C7927C0D28B4EAD8E859CEC719FE9C914B0DDE9B36AB400135AD3A21382FCFAAD250A6609B971867A5EECAFF42A8AE051BCE111C4A154F15C3FAFCD92657A65F179E0FB050B2E4DB6E8CECAAAC4DE222FEF1B502B55F327A0E2E17059073E03C1AFB260B2242BC90BFC0ED6A035BCC5C8A56C36CAB2F12AB315F174750B6CA4FC7E9C1734B652D3FD97A1EF442B7BA7353FAF2BAA855EBFA3E329A4901D3B82A23B49513550D432D29B4098D31874E9772CEC94B208AC079ACCD959A4D71979B57A7AD48B7CA2E06545CC85293F7ED2F6CF474DBBAA31EFE9F09B2191076DB3B691E3CC790E35D249D2F37B3AA045EEE5D2D15E953BFA0A7AD6442D87C3D51F319A0E9B69F0D6C1869216348A033ED2331D9AE51E2F5BD0491EC12739BB567436F5F1D425FAA076565D868E7BA2E60C30E61C3DC9158C8245EA97CA49C5697A721FB0CC21C069D1064BAB42B1FAEB337FEC21416FA7456743A7FF7D523B3455035B590B2CB39ADAD6A290723837EC393D468721DBD5FCC116022F7DF742353863675DB7D83EB7AE2E71CDE3623B0ABE8C7BC8AA50C5E875F158802E3E3B115A3BB4728E111E09CA5226AACD911C70B737D7839C9FA2393734D06AC51E1DC80166ED17BA95A10B20E65494289598CA8EBFD57FE8290F7AB7CA8942FBEEB8D017FE52823F2BB7263C2C029E445375B0523CA565BE10EC0C7BBCC14EEB49AB97A382E315495F496672F8A8B293622AF02C74D4DB911C735EA9EAD60ED4427DC68E45E8449C0196355A593E6B84E42717F32C9ED2404E72B508F447E87 +ss = F804333E26C5981EB749E8E9FECBE8F8886E493CF8013A6760A1BF5D4A37200E + +count = 23 +seed = FBEA1BC2C379F4F8FDCB0DE260D31CDB064C9EA9B1D6DFBE91B3692ADD1D34DEC9C9FFAE7BF5E72ED2743BA3F9F2E43D +pk = C8735813347C3C7C05F81A176264A5FF791D9801AF88047574008C870635457126B4069071242C24DC0977A8C13D43B889D27F08984D9EA657D241922BB12AA28A1408825B02663B970778BF669D585A975ABBA6BCF8513C11BC73A0C33897991C3428A5CB4DFED155B9A2909E6597DD8CAC1AD62F9CFBCB27088860512859761885C5B6C5D89FD6B18F9E324EE8F80B4C507626762A22F4CB7F4527527896AAA97A69B8AA4FB09B16CBAFD73A667E9CB085F7CA36067D4F740694E6C83C671071762FBBA26A640C86422197894CAF01B0AF66960651998073BA7FCCD3189148187BA22DD2661262766399A6B8BB943AEDC590FA048816D1B9D827CA80935D30E1830C8115B18B754F20ACD7A376272C119CC8210C9AA112D604B2022326F51AD674AA1579C081F12DF04A9A2B4571FC1C21A8A4AE2C701EB2EBB0CE65CD2FC22FEE530FB3DAA6D82B3D46E33E9C918F6D33ABAEC34F45391245453EF4D128C4C068227A6511800D69F6A31A1421E2D322F897145961ABEA377C9393ACBFA72AB3C3AAF7F04DDAD50077E7C36AC46E083075265C58DB4B7B47DA253B8A9361C08A1248B53098C6B797622E228939F110ECE18C02AC613E00B624C61EFF4524F92C1EA632553D9B90CD886FD2C364B25C877459BA6DE0AC8CC2A8B0F2C6D71A051F8727C2892D1934857EB995A8D728B9739872EA472E6602F2C39484D290109BA924933D6AE52C30EB4D80935F0D2C87D4DABF07582CAE3C2F21692F0825C079EA6700065A6086B197582B76CAC90A58451D7479965475AC8A6AF662C7D23055C404246264C97BD23D280B43CDEB59BE0CB31E04474CACC4A1453FA10A9E1E4050F97CA3E9AB31E561AB18CB3AF721570380023A9349ED6BBC5DF66BB243928DD3A4B5E113A0F99725C9C8BF673818B89030DB28EDC536C9620A1625C8A647BD3D7055039753E11C4B1BE3AE79EB565E6367690B5338C554CFDA9369E9B1BA75651A0234D2325ED82369BCD415089692547B325EF28189482714C80DCDC5BFF72A6152B70AC2F16707C63A42830DD6CB88EE646D882338D3DCB202408FC5210C71D1A8BA02B8C2AB7E06E43CCD85CE39A215E67914369C749C3978778592D9E34B7671283DC787446B5B70A32C4C1CA4613B01A5D0BFE55016B897130D1BCFB49BB5F08C5DF9F15B6D531B06C53A389500675AAFCA9700FBC310FFF968300360AB631AD95649F0BB47E55B90B2593D9A60BB0477BA848C0DB9F8BF6C774CF8348C65695B31B921E4439E976B4306A47069C25E4A7515866C0BD77B44C7881121025CD2F28430383600E4BA0BD28074B7BBF2A2A3BD62A73BA240D644AB1F89ACE0C8A83AE62F642237DE265765458D6744273E4372ADD9CF5215BD39FA516575BAD72034288CA3E0D3BE57DBC7ADA731F5F13FC0252BC5A9213F502C342A451B933D3060A2AD8A9C13013E3D93455327C187547809FA57FAA299A843A251F8368A715508C32AA57A42F9551520433F9675ADD0359C5997C341464264986FCF67261D16B7A6989EE33730754A2CA0F66B6C98CB421C8E4B36002561B1A5550B93B144D5552AFEE236357C8093932829F864963159A8E7CA992B8FAE006190B55C6A4FC08AD10190D2A178865ABFA35607E1A88B47EC8EA71B102D7F1567BED46A +sk = 91C087E623025864C3C5D9049E865C6226CDD2B39F8A1578EB69A864CCB2FA155DB32702DEF5B50E973495997E18C6C21756568802A4BBB86C5018016FCB0655B09E6A4B39A8BA2D70E32BBB255BDD296C998A21F5716D49968DD02A9C4F4CB9DC72C874C232011225F8E8840F7589C2D285C1E72C8588C0A33A502A385D0527186CC6809185408E9C7FE6262725528A439332F93A5BA2943E6DD7B30D79A25939A4C0802BF57C755A5A0EBBDC8390F8AEE407A541C46CB1530FE1642215556D20AB942DDBCD1627826648ACC3FA1367DB0B45075470196B46697D9EC6974F477EDA553F80B701E853398C69A6E4970A746534928631E6B811E533A4D1E89CDD6969BFE0C861D2CEC3E16D0035BB50573ED61B5DBD45C8C5B223CEF4266C5A6DAF104949EABD27D3319BF12A7AAA4E5F636732B28E902A1098972977D98C00A267225B84AF1C8C404A52472B8D1A793E370B17A9935EE590331256620E302E390474DD6A17D17A50291B6BB940BC43F89FDD22109A72C8ECF9ACB1E67EF6A423396225E6ACBFF2880C35673135C5183BA37DF968330CE992DAE04E9455267A195A41893194BC51C67393251A11ED3C0829D99A3D23CEAA387208E00974E73178459BDA539BCBE89F5EEB05EE21BE3B1159018A3262120C21D4972ABA1A1350231D3A646BA70FA5B641EBEA1B130470A5EC7C40627035B03D15696BE1313B458CC9AC8460CF281A6976A9D2CCAEB9FB157300B4289A55ECA386D3D8A7D16C21102AACF361578010042C3A6397E2CB2EA5224141A1D451B38FAC14D7B64BD7B72DB17408B0A8906CEC108BB926DF54299261B6B5C6A636B395ACB651CE6B6018EA9C92C1525DE1624B5570F7000466CC09A909CF36F34687265B61DB6BF2882514705FB37346385CBF4DF33B98686E0189BDDEA7268F598DB1B6CC7B32792D5546E242A807E760ECE7080392823004453048C6F743B87C1670C6D10E3001008A24590294BC9AC899BD588197530FEF9C2B85AC66520A195C77A7AFF61672C8CB74C07D43A2BAB7A764E750663091A005C9AF8CC4B55D502169D4293E79B365F60085B1CC2F4900541588819B5EDCAA3B80253178639F63A3091701C7E7B04E95435BDD2114BBD3ABEFB23355591B0FF102BC94B56B338083B82328712733F2762C5B1D0845073CB3B46AA28CE2CB282A4347F2118A6E062D7E8524147545488A01378A853D489C03EB0C6527307FB0CA5F7AAB6C328438D33CEDC10733AB8A68C7AB88E0B06FC51C92C557FD59488B6245796B7DC291728121BC7643AA5D56C483186CB55086D7E8654691CD5EB97580F0A553A2613C486C0B9566A6F05F9D2B82B57345AEEC1368CC126AC53B9E794BE471C16A498B743C1848A14D53478FC341A0ADA42BC2E0717FB6965737876468515195050D64079D624DA1596F88819FDF95653B8217F9885D151821A9529420AC95DD928FC429674025882C9758226194615304F1F5CAAA456182C1BB11F0A02B6C758EEC4AB6441879A42450A024559697C4494D8AAC2F7045342234CD8081C0077C9232E66838460EA26274329988AF3A82B898C4EFB033FF4101F302A898E84BCEDCC45E369CD1BB7F3517280D6655C8735813347C3C7C05F81A176264A5FF791D9801AF88047574008C870635457126B4069071242C24DC0977A8C13D43B889D27F08984D9EA657D241922BB12AA28A1408825B02663B970778BF669D585A975ABBA6BCF8513C11BC73A0C33897991C3428A5CB4DFED155B9A2909E6597DD8CAC1AD62F9CFBCB27088860512859761885C5B6C5D89FD6B18F9E324EE8F80B4C507626762A22F4CB7F4527527896AAA97A69B8AA4FB09B16CBAFD73A667E9CB085F7CA36067D4F740694E6C83C671071762FBBA26A640C86422197894CAF01B0AF66960651998073BA7FCCD3189148187BA22DD2661262766399A6B8BB943AEDC590FA048816D1B9D827CA80935D30E1830C8115B18B754F20ACD7A376272C119CC8210C9AA112D604B2022326F51AD674AA1579C081F12DF04A9A2B4571FC1C21A8A4AE2C701EB2EBB0CE65CD2FC22FEE530FB3DAA6D82B3D46E33E9C918F6D33ABAEC34F45391245453EF4D128C4C068227A6511800D69F6A31A1421E2D322F897145961ABEA377C9393ACBFA72AB3C3AAF7F04DDAD50077E7C36AC46E083075265C58DB4B7B47DA253B8A9361C08A1248B53098C6B797622E228939F110ECE18C02AC613E00B624C61EFF4524F92C1EA632553D9B90CD886FD2C364B25C877459BA6DE0AC8CC2A8B0F2C6D71A051F8727C2892D1934857EB995A8D728B9739872EA472E6602F2C39484D290109BA924933D6AE52C30EB4D80935F0D2C87D4DABF07582CAE3C2F21692F0825C079EA6700065A6086B197582B76CAC90A58451D7479965475AC8A6AF662C7D23055C404246264C97BD23D280B43CDEB59BE0CB31E04474CACC4A1453FA10A9E1E4050F97CA3E9AB31E561AB18CB3AF721570380023A9349ED6BBC5DF66BB243928DD3A4B5E113A0F99725C9C8BF673818B89030DB28EDC536C9620A1625C8A647BD3D7055039753E11C4B1BE3AE79EB565E6367690B5338C554CFDA9369E9B1BA75651A0234D2325ED82369BCD415089692547B325EF28189482714C80DCDC5BFF72A6152B70AC2F16707C63A42830DD6CB88EE646D882338D3DCB202408FC5210C71D1A8BA02B8C2AB7E06E43CCD85CE39A215E67914369C749C3978778592D9E34B7671283DC787446B5B70A32C4C1CA4613B01A5D0BFE55016B897130D1BCFB49BB5F08C5DF9F15B6D531B06C53A389500675AAFCA9700FBC310FFF968300360AB631AD95649F0BB47E55B90B2593D9A60BB0477BA848C0DB9F8BF6C774CF8348C65695B31B921E4439E976B4306A47069C25E4A7515866C0BD77B44C7881121025CD2F28430383600E4BA0BD28074B7BBF2A2A3BD62A73BA240D644AB1F89ACE0C8A83AE62F642237DE265765458D6744273E4372ADD9CF5215BD39FA516575BAD72034288CA3E0D3BE57DBC7ADA731F5F13FC0252BC5A9213F502C342A451B933D3060A2AD8A9C13013E3D93455327C187547809FA57FAA299A843A251F8368A715508C32AA57A42F9551520433F9675ADD0359C5997C341464264986FCF67261D16B7A6989EE33730754A2CA0F66B6C98CB421C8E4B36002561B1A5550B93B144D5552AFEE236357C8093932829F864963159A8E7CA992B8FAE006190B55C6A4FC08AD10190D2A178865ABFA35607E1A88B47EC8EA71B102D7F1567BED46AC74F3B7FA6E2EF8CE99508C89CF3C71D666AB065A262581A5FB01B2C9B9444FAFC9EBBE336DC464489861DB8253606971BD0A9008A433ED17752D04023781552 +ct = EEDF2D6926813F52F9128C8EC075ED6B5D0B8B0BBEF802E11D302B47A3E53FFB33C246E79CEC593AED58A77B29C69DAC0E76B0A2B69C596ACA154034AEDF3DE6BEC9F7A0A3D1EF7B4E05EFB0789670E0575FD82A042E35EA81B9AF40546B266B42828439E1BAA4A58D3DBBEB1935578A5D6556F48A839311218F47B18E99CF20E406D968F446C575128E4AEFA43943F9804B6AAFE944AA03682F5FCA2DB078B6CFF32834828FBF0DAD0DDCB41D20AC649A65E009666644B0D3337FBF8D0CE4A95BCDB22AA816BC8037F5DD83AD82CF49E2A9089B778691EFBD5688B2F544CD67D419B6F230CC008FB0AB871C2825EA97EE31D4D72F2970D95276E5F3E156021C595CF1D522B8AB8CD3AE352519A3C733F7EB6A35564D8722725E5CAFB40CD178E3C680F6D531FDF024C0253BD0B9F2613662A35673F68BD1A9C322229C5804E594B7A5BF0EF05E10DA09DDA2AE2CAF143279A60586E9FBC920CF6ADE5B03842EB71BD4F38107C065642F0D80CD10BB866C9C2E422B6B506277C7F87E4A2957A0AF81C276A3FA84FDCAF11C50D708C798B1B136895FE50528D14DF38E74B173823750F7C1EFD787402F9C67D5CDA236AF22D2E189CCE0AFDCC1B6F96163C2C4DD65891E2E39683F5472FDADBD3D4EDF0AC320FD157C0BA236E98B6002E58B42AB9010E27028625D9DBF17EB8DE52AE9928C6390D7EAD758E62C21367AA2D24F07302C6FBA6B5E220467EF632CB331353F62D13C385CCBAE56DCD7B5C7A915855F24C41107B3E512572C31FF5CA29DD7CAC21A831EC1076D7DEBEAE0E51471DABEC57758EAA84903CFCB4710188287C07E5E87FF678D5CE229EDC40F532983FFBDFABFDB0DC4B14C74170B4A2B575C1E929C9466633FB78DD1CF72A42EE3D9BA4E0366FEEA959DD1056E38E18FA56B7B4C6AD7722048D8F3E639823BF26CE29333E60088B7C7C097229D784ABD1326B2C65DF4143CE50579BE5DF3F66FFA725346F0508EC94A4611AD088DB7C3F7825D5A8D0C7CF5E90FC9AAC1000D62F3366CE0EC54836FFBAE061A5CEFD72946D356FFEC1D2047B7F269ECE849A1473E83AC86BBC3F705C0980F380FAEDE71D5AA64A64C0F3372AA3B0F03B4850E1A1D17715D0B546A0D1959F739D520E330627BFEB52519B209255DCC60D6C7F25D0A256E15CF932FC98A392FC390CAF61FD3855F2E9D871E163E08E9D70A895BFE95EDF93432B98E330C7B228708DC2947B13FB3757A9BE1BDEDD859EFE809650D92BEE40D6C4029AC4B41C8F55188E56BFCB5EF665A11FCF62ACEDBC0AD627B46ACBB9444725AAD4A6DC8EB45AC1099F48E451CBEF50C71E10149D91467BB04582CBF7B7B3F26899E22DB449FD5C53DBFF4BCEF470F622C50F133611D7F3F9F8EEE66F1142CC8218580BB42F84AA7E6083C3EBC0DF6571A0425B2DCE8D1F83A5A2C97F055479DED547B8836B7BEDE8177818EAA65CB9286172D9C9E5AC9C7F01AAC5421F6826147DD0EFBCFD92BB4156B03D2B3AD62A0EBBD28B879FE5E6F43881000C521 +ss = EB9B44605E6B8FF3A59E567C1C16C6F96B6079F8E2C4D70F706D30DF82F09902 + +count = 24 +seed = 7E87FB886BC3C7C9FC12569F465D2ECD12532E76CC27C65644C8D3DD603B0CB2D036C5974E675058F271D5C82AD7A813 +pk = 04A592C364AACB2C89689106ABA29029C58DDF7050A2C78787358571AA506570288E747A4204C43E8C6020AA3E2D77B36C3440A618C55F3CAE6D43B979786E6A181D4107CB723BB6D0729CE3EB98E7A979CAEA9508563D5A0B7A7BA55B8985B71F3C489B370D37A66CE048A9DD27AD17B38C66880491985B2AF8916C547E9C6CB16B506170F29304C4393E8274EE254A3F13C6B0E31105442BF92799F21774BE9A0F64970E6AB581626115A1AA3EE4DA7936504D036B75BE6046E5778F58CABA93F8640BDB24982C17BA3445F2AB983B685644B596EF66ACF739039AD0A3CD61BB80B000F7E8BF53F60EBE235C0BF22C7873AECC6B3AE2F3B2CC3BB47D1B88423A188393C43C4999C32A886807CC4262BCD5A588C5E1BF8ED6A6EA9910C19A6042679926F314E7C7C85BF550482735E7FA088C857AC1578560A1A2F7E831223CBDE33A46632B7E24D400A82A8C7307C23D6CA25075B58E727673D7CB5554042CFB9B7F95B11A55A9FD63B1B9F0B60F6931A0BA1AD28B485753446B0005E8710D7189BF438407B8BA36A1687A48E550FA37CF4C6B591AFCB0AF6B8D2EA5A97B6C1729E7AE22E28F2082A5E653B5BABB0D147A8748F2606DDCC7847C24F0D32771B910CCBA85BEFCBD2B89C5035B2062E6B9BB40828902B82E12B752D48D52B7A6599AC014731E8DA091CB30186C849B61954DFF867899E5BF27428229376AC7D97FA03996160964ABE56D3D0278F9F91FEC6BC821FC822949AD5EC8A9D728B95B19052AD9442FA0527B3935F4697CFA3C7413CA2E81B32A57F69479E89760A46D710032EFBB662F9467F0D03C806B619B9228135076FA235D502230E56669E2354C1B412ECFD01A429B5C76B17AE2AB99C73B4110957AA38C22C8FA39C00261C78AA571B953D868690761655FF700803A477917AC8A6105CBFC220A30A0CC1466D7598B2058B3899C567A71A66D5C9DA75085686AA4AD4015100360C6102C84C336C13B229FF599DEE4CB2C90A1516682330722DA110F42F7C0A4F23A2089ADD65438DC66246671BE41E7766641B4C9139777E08CB4D5B953E602931A7DB3E1CE70D765516242AE8987454B898F19C5103BAD39207BB16771B5D4191ABBBDCA9B5BEA711081CA6521149B60975E02CC2250A355897960A8E203BA148F8BE76452420D2134B607976F7809CE97597D8CA57337FBBD6748C03227607FA082195B49753C43047B95A020C7D195B01DD3CDDC4C091916C37E447ACB606F2D232C37C9871831C1FB9A8D00717762F18E62E7995A7393E0A82617DA4674078D8F10065A28649E53377A88BB0F996D84FC83E9496564344D65B73AB96C4E887107D6C14488E604DFA15E55004FDA8B65AE19006EA7C8A7471B354A4E746703D5C79857A02EC222B78B966ECF161D97BA7CF39B37FE173485A0156C3712A6ECB14E629899DA9163709B672A243D1B87E15C0AD611419D85522252BB5A02AB725CB5EAEA5BDA73976D534A881B8C32C5328D117306FC5217AAB89CF51C6174489AD241D1CB261D449F24A235FCD46FC19A8D14A4281906236738A060061A494947BD91604431B1A2871080616EE2E915863B2BF2D9CD86743B0CC12A5D21C6C745B34247C17F9447579FCB9BD38AF3B64CC94782E299E1D98E68F8BCEFA20D1E8DB8552516 +sk = 817471E55466B5BABF92A2AD879C9C951BA60D230ADD630984B2528F9AA07FF755D7D79A2F9AB53D8986FD90895D5401DD97AD3F7A922516279B5858F2087E6491B7BC42B8A52A5952F23622D5603A0A3152990CFD6AB9CD863345D8BE5E295C06B79332B0AC89282E61E5534FE0AAC95ACA140398B64175235B94417B8799A4B6D6933A8B815BFBDCCF886664E7B8C5CB0B999BDCB2BDB288D569666C421E2A950D198158C0D36CED3A74D9032AB7A2B9F276BE025296A773266E516826480E520B844EB69710120373A94705F9030CA200A7F85A94DB1F55D46081570925A476099C3EBDB32C532A6D8F16BE4DE6416D0C30D450808CD3C08131A92551985B92255282BE6087703F182156A13CD144ACA3924FD15492DFD253EE5C9E78853590930521E843A0E37A26994197B3161EE1A60861C344720286B6566796787B05CB8FD76A419C364F1830FE2BCD3A2970E2DAC1DBBB3803F8053591B29BF64C2DC660EA9938200738E2C0C318B77FF86749C43C72F9667D80D462D549BDFEA30CB0D9641B29308A461DF72914B4B40213B62E68B161F83224C1A45472B5464F97C6D6371C69CA0D520426DB8C1E938A934D50AE0B03BE706B74CB8C674EA955A4D8AE1F6C0B56263041FCA1871A5799921C45D9BBF13C01F0A9C5D973086B33ACF923A2721C8B2FA7B058BB2E64F43BD80260B6BB19F26A4F55D53E7CCB1BFE3AA424976132C3B4B3A00908E722557A3657D285C8580EF45B76A207CB31A71402BA1EF280048378B80DC3312F78A74065B2DC873B22D37990E465E425B992722A25009A93A7A005D91B9460AB7C2336BD303883A151E829234C964265E42FBF8252CB89858D590CF0830E59C54021B83DA94884A173BE6BC454AD5A719252BEB52A4F7544A7FBC03CE9091E9ACC0568306E5BEC2ED942B39A8455FA341B84571AC3FCA43C14563F91395D117AB021C8F141A4EC7364BA4ABDD8896BC6B281C751A66C767AC960AB52058335E14E7FD8A4E1D44DE2670F9BBC67F682A0657530EBA11C31381897D989BD392FAE02D0AFBAA5AFA1748A80847AF4B326F970C6161E15B212A1C66003A4317348374E66B29FE87F36D01AF5F1C75BE11BFEA21DD8626765C46F0C153D0555B419227D50DA5232810D8517B1A5E4147A52AD07012D8DA23829F39A40C70D565937C58A11B1A25B27C8207246C4E1B40230E39E4F089D43D562EF954F332B7EA6B36EA28A9D26EB251AB562C0E44BD238874E93A4D3B900A4B2B08A0B68C2B82C0CB56325548DA3316279672913D2021D742C3619823C4391E64112B5B77E8D707F9C1A37D3464CD5F96543F720A0CC6C9631458CD9CEDEA7B6FCAA76D1E60C44F74B986A772CF593AE712214E21179519C39FA533A724FE8177EA59B1123E831E1DC561543A7E559697572157B60499C4C615D02099D34B0738581061A85B2DCAAF13556208B3E5AF388392490FC338DBC55BBF7D25F49F61BD7363CBE3841AAFAB88524B0CA3381F5B22DC84C6A112979C3C39E45157C0749C04B022F83F53733A21E1F1842E0E72F78C6AE1E337B53215AE8563B16D99EBD6225766185A0D92F9A28BBF4E2B444B7C8225148F601D014BBB8839B4B04A592C364AACB2C89689106ABA29029C58DDF7050A2C78787358571AA506570288E747A4204C43E8C6020AA3E2D77B36C3440A618C55F3CAE6D43B979786E6A181D4107CB723BB6D0729CE3EB98E7A979CAEA9508563D5A0B7A7BA55B8985B71F3C489B370D37A66CE048A9DD27AD17B38C66880491985B2AF8916C547E9C6CB16B506170F29304C4393E8274EE254A3F13C6B0E31105442BF92799F21774BE9A0F64970E6AB581626115A1AA3EE4DA7936504D036B75BE6046E5778F58CABA93F8640BDB24982C17BA3445F2AB983B685644B596EF66ACF739039AD0A3CD61BB80B000F7E8BF53F60EBE235C0BF22C7873AECC6B3AE2F3B2CC3BB47D1B88423A188393C43C4999C32A886807CC4262BCD5A588C5E1BF8ED6A6EA9910C19A6042679926F314E7C7C85BF550482735E7FA088C857AC1578560A1A2F7E831223CBDE33A46632B7E24D400A82A8C7307C23D6CA25075B58E727673D7CB5554042CFB9B7F95B11A55A9FD63B1B9F0B60F6931A0BA1AD28B485753446B0005E8710D7189BF438407B8BA36A1687A48E550FA37CF4C6B591AFCB0AF6B8D2EA5A97B6C1729E7AE22E28F2082A5E653B5BABB0D147A8748F2606DDCC7847C24F0D32771B910CCBA85BEFCBD2B89C5035B2062E6B9BB40828902B82E12B752D48D52B7A6599AC014731E8DA091CB30186C849B61954DFF867899E5BF27428229376AC7D97FA03996160964ABE56D3D0278F9F91FEC6BC821FC822949AD5EC8A9D728B95B19052AD9442FA0527B3935F4697CFA3C7413CA2E81B32A57F69479E89760A46D710032EFBB662F9467F0D03C806B619B9228135076FA235D502230E56669E2354C1B412ECFD01A429B5C76B17AE2AB99C73B4110957AA38C22C8FA39C00261C78AA571B953D868690761655FF700803A477917AC8A6105CBFC220A30A0CC1466D7598B2058B3899C567A71A66D5C9DA75085686AA4AD4015100360C6102C84C336C13B229FF599DEE4CB2C90A1516682330722DA110F42F7C0A4F23A2089ADD65438DC66246671BE41E7766641B4C9139777E08CB4D5B953E602931A7DB3E1CE70D765516242AE8987454B898F19C5103BAD39207BB16771B5D4191ABBBDCA9B5BEA711081CA6521149B60975E02CC2250A355897960A8E203BA148F8BE76452420D2134B607976F7809CE97597D8CA57337FBBD6748C03227607FA082195B49753C43047B95A020C7D195B01DD3CDDC4C091916C37E447ACB606F2D232C37C9871831C1FB9A8D00717762F18E62E7995A7393E0A82617DA4674078D8F10065A28649E53377A88BB0F996D84FC83E9496564344D65B73AB96C4E887107D6C14488E604DFA15E55004FDA8B65AE19006EA7C8A7471B354A4E746703D5C79857A02EC222B78B966ECF161D97BA7CF39B37FE173485A0156C3712A6ECB14E629899DA9163709B672A243D1B87E15C0AD611419D85522252BB5A02AB725CB5EAEA5BDA73976D534A881B8C32C5328D117306FC5217AAB89CF51C6174489AD241D1CB261D449F24A235FCD46FC19A8D14A4281906236738A060061A494947BD91604431B1A2871080616EE2E915863B2BF2D9CD86743B0CC12A5D21C6C745B34247C17F9447579FCB9BD38AF3B64CC94782E299E1D98E68F8BCEFA20D1E8DB85525167378EF967195C977D43A50D03205044006715A6A8A8263D717F40170B49E6BD0FF8563038AAD865A817CAB9CE98846BA75BE9363718ECF5FEA538AEA90B2A558 +ct = B36A4CFD44E71ACB92C3E25C36178609188A91E88AE7096874ABCA6C47E37ADF762D028541985915FFB85F3417B024C47B9C0C2BBF682E76C04F6B69EFAB7E2B4DD0B1E72E9408BBB61C0200272F02A8DE1E7ACAAF9E6A7EF4A4C54C224CB35C7782A503C0DA7577D4696C491870ED05F930E0E93C1A16441B603E76E125AAB09BF1EE9152158C9BE7AACAE8688BA2FCCB23E5932A818EE089566F8D0A3EFE3E59AB73F73972679215710E92235219692F27FCDF08699E5D1AE5CC07F9508512EFAAEBB86D86E29C6368184C7B4EDFA14901274EB3E19E0D3B542550F03D3E8CB752376FB9A23E467C4DD8062ED6FB10B53433A9A122F52621D4138AF03F48D3CCD10F701C33D0324A3341595433215E00AC76959255332DC35EE687045FF208ADD581F3AD9BDB7C7D435954CB437F995EF3BF22C0A475979D97BE46A91F9C3934170505037A79B29112A2D3F3AFBDA3188BC43E3C3B746647E8D722455D0844957557B355F424AF2909E46B9DDC68F4B287CF7CABDFB703D92DEA065623E9A3B7F4622E7C5365C04D667D04D172FC2E9E82A2A526441EA71B524DCEF1844746B06CBF7D083C09A020268F8FBEB92491B8556813781F74F32985267CD7457619FFE986AF32254F5538329904CFD8E438C248FB005A085B81448C45FF17BA45223E2B47246FB6B1B4A2444505FB372388ED77F4A8CE7AA2B9145E2CBD7DA00663E58300C919AB354C77E29A276E2D6DFF26594DACB12F56562447BADD8DEC8476F56567A65C44B791BED29E50AFDCE15FCCF57A5531D7614ECFE51AF936F6E4182B281B1B39DA59C20B3B0807A770DE434A8B72BEBA95D2FDFBF08AB29DE3E1C417DA199F98EADB3EAD1F25B40762D7E7487A3DA02E3072E0A15A33DBEDB5209C3E32CF9B19FE4825FAEABEAB1E2E63DC8E8B4E5A50575DF7103F7B58E4CC1307553ACDA05172787CA52BA594824AD90FE1CC702263C8BAB4AD690E11ACBA025BDCD9A299FCC1F801199272FFB5A39A6137F127B83B98DF5B19D940BE257FB0844804107F6D5A7D1089F17C8DAC90D59035C28297DAF136600C18515DBEF0036CDCBDCAF8BE6C4AEB1179E389AA345CB5DF024F9907342435657D5599FA424E51AAC32CDC57E025B672DDB87658DC23C3C54BD8DFC916863829E3F7DEE39B28B93B2001B8434EF90D1E5FE0BEDFF2D31B5AF01FE5F996951F31AD0D6F173F50CDCD5A7333E7B3908D8B626E3F08FB1D9EEDCC360E6ECC4B74BC33834AAABC355CD4432B09C40C011CF7AA90AD8A756340D30B3D7A3E465C9A19173B58245B1A8F42C875F96336D39CF60F1BB341680177D31724E6ADBE668AF76720C2E398A5B42C3C2C84384EADB951914398C1CB092B870449C8AE1BB844CB5DC7B32B8F661CAB9B298E8F90CD4B4ABC63B590A6D6D183DE03B3F61D5C266DA83C14847F71E5E344441CE178DB44B2CD4C644EEE4371E7B9793343F86361E13D1F8664FE439217241ECF8C68467941F48939485046BD833A3ED8582B9415F25C2C7650EA1E51 +ss = 5635FED1A43168075134D0E6DD4C9CFF6E85F3860B3E9F1CAC06B249D62892DE + +count = 25 +seed = AD1424E804F306C7FF513DA4C1E8D445AFCA7BC942FAC5C0B335733AAF70693712ECBDE26EA726EE0F9FD9D52A83B1A4 +pk = BFD11FC259A2115806F9F68AB15859A763A49D169D615B4999714D550707E8A0C0A93C8DB2FB5E4DE7C93111206F052A7D7A5E0B5632D94C7A87596D24E950B361A185F065FA96435F312745164693FAB8D3A741C56C6F10D8BE52C06A5D83CB1BD327E5B28DB12291D907A2888136B6FA3A20A48990C6B6C81499DE2BB12D19B591234D55C4549A3861626167C5A17CC2A4CC9F668DF0707D26795DE7F771BC614B994B574FA309A1E1C8B4A0A4AD6240286BB78BA701ECC430269A37843149E1F1AAB731523359C735694F09298E2A1A08C6EC273B4A1D57118B20524FDA18190C2029DA4095EAD53212F609A76A343D5C68FF17CE6B92B340DBB8CC6C03AE4B29DF243B93233AF6B95EB5A7A8B8643B0CF5A8114152B8EA54F0E3668511CEFF536D888BAEF85A62299C641769023B7B92088546F338448C1977804B71781A554BCA5F13C0480B42C5A6626904516139ABAA54B429E7A0502B17A5A2727A7F230D63C5764DD497F164B24E5BA3A626785AD1B917A6B77B175E64323783C9791832A7C442B895EB338E6A29EF671D4D7C0230668C14BC794CF11340229AC905891CF1C51EF62B6A4A0553331F7F581054DA45C370BF606126B39492E4A3B8592BBE0359BC017557379471EF922367D82635D8494C88BD38A7720669A1F9145367A92090FC5DF15C034B82CDD9B7CB9CA76E74B2069C36987556012BF0746424677F60ADE29C9CB52C6D9CC2052394691D7306952C65EF498DA41279EEABCCC66B3A41747A8B447D7EE81116EABC04F4B776923C93A28FFE888652FC34415BAAEB6854D4732745A4BD5BA61C35678780063ED874C81823CEAE41B9684A05410266F7ECAFFBFCB5285472E5B02FB8C15D126410F0BA3BA8536CFDB65D23797414A55F2620BE653A98F33C95690714FBD3418C6893F8693908D41D6D69A744E63B2B0C190E3B1696A5C8B1CBBAA4719A0BD184F896C9D8F926DC933BA81B2785C05A51B22A95191F43DC23B42C050DC9133DE2B003A5B6F1A5730F490454C58AF291CD8D46ACDE69842DF79353670A54E2C88CC693745516EE64C2AFEBB95DF25EC0608AE4AA9C89215D471BBF68DC6530FC0FEE495FDFA09E98BA8D37F9636B270BD1102579EB7F1BF0B911CB79F03537168867EAF60D77D48BE27BC935B02662929DBF2263270670E0601E5E43008BCC07F06451E54755FCAB421D584BB603008C9909CAA61CF99A4B43A93EA8A3440991BA402C9A8FC51F90584C55EAA450B7A600342E98420D728A8B6344659F2A0263140E69AB86BDC6B20B3AA0920B90C70C0108358C8A92B27635154AF9A0A76080EE593CE3D37E40FA33D0C654AA77171F822E0082C95CB60B54A6A26099443F671E863889F35A0B9597B3442A71FA704F164834FC9C8E2C63847C9992CD73C1BFE7ABD3D75448D21926DA0938F92B9133A92E426DFD2634A677878EA9820F5C26A2382FDB1C4B8ED59DB74B4490B87B0DFC35F5B22112E5110D494E53C50D3FD6C64CB485BF5AB37F7A1B709122C7086D3FA56FDDC966DB2C53E09B976F986A334290DD8C3C7E6582C4EAAB182766FF70503B03B4E68261CD0303F7A83732795CBF84A04D78A541A0929691C94A094B7B8F92C5D5A3BC95122A6A7968DBB1334A712823D470766B3B9E7B55672D02AE +sk = 60E93BEB5544294BBD612141956430CFF041E0F969E954A48298C7B5F321B9E1B70B7C796A753CC5BB93722B20380ABD6B8AAC4F0B102DDAB380B88AB9DC040FCAA8B775882A673864FB757A3453273627DF0690C90000B54112DCA50235BA14FEA59A764736A018A091B822A636AE7934A33BC5C15A7B77E1E53289C9757EC75CBBB792645325D6755D79B972AE993C9E3413AC040B3BCC85C4F98A2E185BF4EA1D19A4737DC78547847B7EF385D2A07BFE272764CC873BE8CB1286A0E7C83539D2B9BAD5A17F0893CCF41E2B5CAB8F66706955C5E168A99E9820A8402CB25A434F1A149F0148761014D32A51BC73A8CDBCB104C29BE554B2724107EF314C25D082C7252E0CE68833A47A619A611B08394960A64D8C22C25AA1121A8033605C9BF35221730B15E6269CC25FEBCB8E3336870B3C1C9D3A89DE4A9042758F517B55F85133B403C501590A0F53542239118F93874B319BE0D063AD82144ECA6156051424235D785C92AC00C412F8AC0FF5B88F056142F8A0934734B09BA14C00089BBA136279A5FE462082AB4B0709A6DB3279F8E9544F3909FF78B264399C2ED129C803B341D816EAE96BC531952D55059EF0233B0C18E1F7AEE5498FF6F11DBE801DFE193BB61B870008AE57483DAEB8CA7CCB460193C68A509E8DC738FF227FDA89B21EBA0053992A4D3A1F8767C0D3F3419838C8C7A2C0B3D68E737BA77221C68A8570948A322A143E5A03888C08A1BB7C42E9DB9111819ED94523848BC32781A881A468D26AA7FA4ACB926AB8695B24A094B8CCB0423192CEA88C1FAC818A6B0CA19E423B7AFCB51B121D48EA44037963EC1A325DC0BF7555977F468FEB49B8346338DB983E512B2FDEB35A300495F437CBA88C36D01536F7A56BC9DABD1000B77751031102CABA7182E2C440919435A14BC1AE1B354499324862885C9C301B7258FAF778CD0A4721F26EE32C5DCC7A7283DC10E3CB04713255D0044BF1D9234F5180F32483F7079B2C0558B95C622DB01BE885B2580931FC8617B6940DDFD54CB327712DA02F90A6A8DDB6BA17A31FB1D7231D94CAC2FAB88A43B0F56968FE2B724FC8A97E1A371C96A9A17A94FDA08897BA1EDF959F37029A84E707EF676B89FCB5E94B8997D95542E26CBD28A7D01B1FEF76B1C91AC327874C04F01B2D6280FDC60CEAD3587BC0AA6EC76F064B3263B2419BF3120AA7791053BFA6E089F6CB8BB020B5C5E2517D4B2F34EC3C4237AF98DAB3F4D44AE161773ED53F391A689D7B38F01155FCD080869656E15BAF9A2A6419B38C2EC39112B4216FBC5D94771FCC4369EB90AACCF3A752020E24F97C30C4C67632180E9B928A0941C23C03CE588F7D841AAB91B74B7959BFD8B5B042294EBB094B523DFC425E9EF70BD2E2BCB2937EEDBA0AD018737BA91A3691030C1A6E54C0BD4336A4BBB7C5DC79057EF5C574C04DFCF9C8407CAC999A54975B1A45519075CA167B8285B2D554EB81702E30626897413051AA546BC63A42723BB95F0DCC525944C967D7A5793C34C7638EE59608C8680F2418B648B7450B09C31BEBAABB956E1203BFB3D377373B5483C93378F15DCF2959D0E02A15E2277B7AB78CB2BA78703F13DAB307BA1B663C86BFD11FC259A2115806F9F68AB15859A763A49D169D615B4999714D550707E8A0C0A93C8DB2FB5E4DE7C93111206F052A7D7A5E0B5632D94C7A87596D24E950B361A185F065FA96435F312745164693FAB8D3A741C56C6F10D8BE52C06A5D83CB1BD327E5B28DB12291D907A2888136B6FA3A20A48990C6B6C81499DE2BB12D19B591234D55C4549A3861626167C5A17CC2A4CC9F668DF0707D26795DE7F771BC614B994B574FA309A1E1C8B4A0A4AD6240286BB78BA701ECC430269A37843149E1F1AAB731523359C735694F09298E2A1A08C6EC273B4A1D57118B20524FDA18190C2029DA4095EAD53212F609A76A343D5C68FF17CE6B92B340DBB8CC6C03AE4B29DF243B93233AF6B95EB5A7A8B8643B0CF5A8114152B8EA54F0E3668511CEFF536D888BAEF85A62299C641769023B7B92088546F338448C1977804B71781A554BCA5F13C0480B42C5A6626904516139ABAA54B429E7A0502B17A5A2727A7F230D63C5764DD497F164B24E5BA3A626785AD1B917A6B77B175E64323783C9791832A7C442B895EB338E6A29EF671D4D7C0230668C14BC794CF11340229AC905891CF1C51EF62B6A4A0553331F7F581054DA45C370BF606126B39492E4A3B8592BBE0359BC017557379471EF922367D82635D8494C88BD38A7720669A1F9145367A92090FC5DF15C034B82CDD9B7CB9CA76E74B2069C36987556012BF0746424677F60ADE29C9CB52C6D9CC2052394691D7306952C65EF498DA41279EEABCCC66B3A41747A8B447D7EE81116EABC04F4B776923C93A28FFE888652FC34415BAAEB6854D4732745A4BD5BA61C35678780063ED874C81823CEAE41B9684A05410266F7ECAFFBFCB5285472E5B02FB8C15D126410F0BA3BA8536CFDB65D23797414A55F2620BE653A98F33C95690714FBD3418C6893F8693908D41D6D69A744E63B2B0C190E3B1696A5C8B1CBBAA4719A0BD184F896C9D8F926DC933BA81B2785C05A51B22A95191F43DC23B42C050DC9133DE2B003A5B6F1A5730F490454C58AF291CD8D46ACDE69842DF79353670A54E2C88CC693745516EE64C2AFEBB95DF25EC0608AE4AA9C89215D471BBF68DC6530FC0FEE495FDFA09E98BA8D37F9636B270BD1102579EB7F1BF0B911CB79F03537168867EAF60D77D48BE27BC935B02662929DBF2263270670E0601E5E43008BCC07F06451E54755FCAB421D584BB603008C9909CAA61CF99A4B43A93EA8A3440991BA402C9A8FC51F90584C55EAA450B7A600342E98420D728A8B6344659F2A0263140E69AB86BDC6B20B3AA0920B90C70C0108358C8A92B27635154AF9A0A76080EE593CE3D37E40FA33D0C654AA77171F822E0082C95CB60B54A6A26099443F671E863889F35A0B9597B3442A71FA704F164834FC9C8E2C63847C9992CD73C1BFE7ABD3D75448D21926DA0938F92B9133A92E426DFD2634A677878EA9820F5C26A2382FDB1C4B8ED59DB74B4490B87B0DFC35F5B22112E5110D494E53C50D3FD6C64CB485BF5AB37F7A1B709122C7086D3FA56FDDC966DB2C53E09B976F986A334290DD8C3C7E6582C4EAAB182766FF70503B03B4E68261CD0303F7A83732795CBF84A04D78A541A0929691C94A094B7B8F92C5D5A3BC95122A6A7968DBB1334A712823D470766B3B9E7B55672D02AE16FE956BE4601573D72306A251F69BC2181253E2417E178341FD6553303AC189E1FB7456AC0AA1B97068F452CBA64EBDC138BCF5D36B0A0FADA2A3B374141EB9 +ct = 535A002076557FC2CA495E8000B26F513DC41524C6E04F786763FF14F915D56BD6BE3F26729E41FC2E43456CC5F70DD25EC772E9030FF80A81A16E352CE7B6FFB5BA34DE56290D1EA1578A56B8D17A0CB5AFAE7987D15CE029516D88ABB555AE84B9F626960FD8DA732BF8F1A650307030316B8623B0596DC6CD8C72354584FC806DA654B0ADF1313ED3DD6A4B8F81A5C2600E36C57F28AC00AD18A48C00C8CFF0CEA1F8A53D227E89D78D533834816ED9B2A9EF48F6C5FF4D572EEDF497342ED6EBBA80EAD83EE6764F84DD09C5F372F263CD7195A50DD5695CB9B09C8E996994D7C94A19966FE74FED01139D2658AD75AFE22E0ED321D12D271CE2DEC1099E77573A3983574A63BFDFC9EA559A220135C9D8FC22F4C7A3A0506D649BD4EDC66D67A398B4B1B6040284AB0BDC60EA62F0B67D42F5CB6F5A3C6AB38EB3B2BFF6D7385143F40EC5CBDDAE52DC941235D980E4DDD79059790897FE235C11BF88A92EBA7E6EF524A4AEB827C057B75E802539BCCFCB33B5BC5B00DA2731B8F4A5A42A7AE901EB8B7783A017128C3765AA8A3BBF92EEBADC48D983BA16FA0043499302781AE46E2F066C312DE84EF0C0A837E8B6F9F633F8D2C2190A129D9A00A18E04B2DBBA18A0590BD6B50B31E470D85C803FBD35ADE162982AB659D7A627811B76217435A104860173AED6865A3E1967939BC8465D4F3E5D3C88091D1013FE12A2110E6FA39EEAB39A9EE545DE65263E1BC956BBC5ACEB6D6EE2FC0F1C4EF945C21C36CD76DBDBEAC43D440C1128A30A0CD581F434B2E5F45AD26B4C59CB6B003D945343F8413681B590C6627B12058D671B220DF6A0270DB87F1A81F01ADF0E33AFB686E76DC414684023455EF3465E26208E66F4A4C5C4C685B415DE1182DA6782DBA4CE1370D00E411CD2709D3596B337788F40574B43691F6A13741A75C8A973C626FE6B5595DEE15F997594C873605E8DD3F0137D358A2A5B1BBA8A9AF285E1C02D05944041CD7082BA247C24810140E5E9AF32D010196EF97CC40B95F5040469FE88E7557EB30F2E638647CCA2DC1845E582416345F9DE6DBBC6A007DD368F1827E7B29E296123FDDB818D9A25FDB429D45CBC59D0D74D5380E582EA7C73EBDBA8A4CDA6582B68FC07A402FC1EF8F24C1473661C091A942E4F316602470F779067D74B1B6BC61B8133ADF1E5FBD374DB3EAF8CE169E02DFD2162AF1718E7F21CFEFB86EB5AB879615408A91B0EDF44281A5693FEBB6C229A0203E66E6746747AE342EDD2C3F7B528EA2A86140E8041F7FE6D671C999DAA5A50C5B01B3CCC35CA43ACC3DABF6A1ACADB4208D83CF49DBAA37843C51A55765E5F5AF141DAF67D3D5AE31A72F7A4756AD27BEBDA0B7B5AA204C8A8E726B42FCE4633DDE43EE434029D60938A3C4C3AAF119E2B3116D5299B6B7C80F9D49D17389101E7CBD668A038C223E7B820FB057543F8EFD37760006006F61035D41ACB177BD95AA8F44CCD4EA8DCD8309D795945ADE186EF9BC22D9921DC2843BCB627C2F865B1A56E +ss = A920DF59AB127D563D7E7E96AFE8075D8A7242B0AD88D72F367545FAC6DAA4C5 + +count = 26 +seed = 7C33CA0E987226C8524DD56C811FA4D1CCF9995B1E4E4DD5B1481974E88CFABFBF6787775C2611CEFB27ED4403EA9B46 +pk = 12422CEA108045D2888E2C29CE0BCD454B95C09730D6C4698E779987523DE0E972332544C34350D29C7BC030BB6273B9F1C98C3A63170ABB2641C54DAD64790E83387C51AAC922814F834C4745409273AB00051B2A819EEFC9A048F222626409FA7B3F8D27A0DD754F9372AA37EB92F6454FDBE3116D406B571203DC05201C31A52BA8B2B95B191A7B7B55E743C4CCB80A710863AB741B727F176224012C539AF2BD062BA6BE7A42EAC08C5B6B420BECBB41B55454EC1F41347CCD984F11767BFC82665286A56DD31598834B37CA6EE93658999798EAD094298160B7E6C76978370DB3180273401532315168A161E087D4C6086846A3B60B80103C1AD814843BCA7AB329C7914982ED32BF16507B3024A16F231281A732D3D155FA60260064919C484C1741874BA96CFD91AEBE5C314E407A66D7CC4C846176D759618654AC2A52FE69C69A375ECF625E2889ABEBF395FA20561BA6300A72A2091356FCF197C866AB5468A3AF7BB3DE755836D9784F7C0949445D83B3358721C7DB3C09B5120F7F757BFE3366AE4365B677255EA680F27C310F768E56F1AAB8792259340BD6B984406148A254BB605A291C0946C83B1E9C5BB3F879A787B9106F98809E94BDC23C062D592318F9854DF04BCC343D64387BAF398599BB352F82B1F0A5B530E824CFD69D7A4A15CB5624F70CBEFE1C61302B8FCA337D70D1900DC817837619FA893208DA873C350F02892097708CC637093EB25BFB4B3C793331F0FC73C5446CB11276824CBE419378A224A683FA0D17C671FB8C4BDAF18C20C53A21A4BB8FBA9AB7A1B7ECCC81946BB5FCB15E1D08ADA7761A55D503DBA912B73765FF93A6AB642B5FB72ED4F16657AC448A1957413CAE547CCD76D9936C860C70C5635C28754421AF13448959D67CDEA3997EE923AA326129B5397C15AB90F95832F263E080A42460CF9F081152AA59CF17263D008ACBF146F34A7808257689A3148E58A0A0117FBB47BCA97810A42A7E0F734C0A17745AFC6ADE752080B39F3267399C20B1FDFA195437B83EF5125405ABA8D2CA42040371C541A5FC339772948A21B7EFC30C909C7938779BD012642441083150118CE431BAA72E989425210945A7C47479F4873E3C3CA6698ECB2A050415066D0BBE5E240222A2884B3CC17BACC14164BE0D21330456A279547579F8A4E9443D913A154210A3FD1A1A263186445A8E1B884BBE8B54D0196AFFDC47544C8D10A69378FA139BC8A422C44C5568555F9080F170BC6E97284F448E6C23885D603A732C469B376A762B5068E29E80B74F994588D9822F3E81BA6FFC273A9C905D0910062BBE94AA1E0C8C3424303845779F8C9B515DFA0864578A66DA8AD7B56DA2810C11E1A2888B88BB55B8C096A145B62AD9D2C98E003658C9729D7B82550527411A9C0B981F3479251C1774014749D211687DDA83626C6BFCD5B08F8075954BC10F48623838A736E38C1143B9472B4DF5D30D37F0BD7C727A2F16A3CBE0015DAB5A12E27A63F7AEDB841D6D9BB1A79A5C3E903C9E374DA62A298C549B9842B77C33AAB6B4939AEB55704CB610D084950C41B746AFD7157613618F6F1574BA51B36F7828AF0AA4F79C0840EA3D679013DF619046E935E0BD96EC59643250A0B38F9779B0142A9E546EB525E72AD204D1EB31A6 +sk = 3A756D6DD157ABA65D60721C41EB4EDBEC38834C22E9AC88F03119B472BDA0961D1F5C3268EC6492F92D5D066DCBA69CE9C20311E1C15FA81FA5014C6C956F88055FC2D35E6B295D05D6167E4375BFF23257BA72C0F97F452B609F22B57F7C27F71A4F259938B5AA18097399A0D32C3602203BB6769015495B4BB7317C9E99C966215C58D3455EFCD36003826C2C7B1BB437A66A968DCBA35DAD7098FCE9133110A109C2B91764719CA25866C98550082E88F29E78B38B40A53C4D626FE63390A290B54389624C597909D79FD6A658E2166704C386EB1C8E951B4C7619B7B79349C3F59505809B1095405949CC55C109A1108649552D5F83A970083BFFEB6550893B5C5106417B0CF1E44B6B05A9F9093E386C9D43F14D4CFBABD3B17EFB49AA2C571AE99197D2E4B7D58775962570D528B8EBB8032E8065BDCAA391837D483A27239A4A8C0B8F13013F4AAA6BAC0CA86E532523D9620BF9C2C3E2AED2365E90A1699A4CBF454C4D2E2C4273E93456142F737C8B3697B9821039142C3E25B346D020C829850D6CE2649087AB762C25BAA2639C8C7A852BC76D456EE69747FE561E267844A7E51AE05C5820F0C2B880B05CC935A3BBADE2C6A4881CAC21938A304C4CD2C1CC1BFABD932B777CC459BAE4BE75389862464367C6318A0521DD62C5F070A139A95522D10D2E4134C06522CF52834562A208B22A95431014934F51EC49F5EC087D1435DB935BB5223C3EC87BB7F7427A458232474AD9CC222B422149977C7F366F48B0B14AB260BD0A8C04623F9B12091AE049725064D0BB4A249075816AA249718F1A7768C3469AAC7182D2F01D6373038D7C4CA24802693A354C19C66DBA1C05EB180AD04C1FB095B42947D16B66139384C71206BD0BA9AD9BBB5DD7593D08616C214FD9013E792A5B4930122D1C571F1315D235562C167D7546C8EF7536A929982F6A55CE7209B0D5735F69AC6C52A824E508D2481A5BE01075C54D8743BCD76767B69B5E350989E629C97AC1982A75806126245FA692DEF22B15A29499C82EF7F993EB3472F850527D900DA2F513A9366A4FA978038B9E46752DBB8084FB12CBC591008D692544078343E9AD67909DBD77C18BF18F02607210F4A0F5DC749F8B0BF371309027968968678B0135AF65138C5544ABD57ED8A646409224D32052BB14BAB4D51DAC981CCD838B4A513A36A351B81A0785CA281D7106872583B8BABBD62A5787BAB8EC9019C7009130EC6BE4E25D9992AA1DD13DA9C1A7F1CA27FD78968741436003789B8C781C599C98D2465C7513CFE85154D7A655216E5B3B800DEAA6B9DC7C0D998B9CE2B99DA6AFC27A5EF6C152EB16184D91CD038CBA69835AB3500AC2E87368F37888BA90F219CE9DA24109F0B3E1894DB5F640A17B0E705195A350A61EC62B2C7A216231C530F557D4C5605346A6500B7C1484012FC87DD4526823C447B71A726D65753716B30C212565DAC474CA3ACEE664218285A5C4A726F681E98619E2A289D08895BEA26BD6A3BFF3A5C5C1EA894CB6440D075004F879B41A14EBB82B74AB0131D0B3348742DB7244E750AE2B7BB57F8A95379502827880F8A50ECB1394DB2553C07627C113A300078DB1BAC7B5007812422CEA108045D2888E2C29CE0BCD454B95C09730D6C4698E779987523DE0E972332544C34350D29C7BC030BB6273B9F1C98C3A63170ABB2641C54DAD64790E83387C51AAC922814F834C4745409273AB00051B2A819EEFC9A048F222626409FA7B3F8D27A0DD754F9372AA37EB92F6454FDBE3116D406B571203DC05201C31A52BA8B2B95B191A7B7B55E743C4CCB80A710863AB741B727F176224012C539AF2BD062BA6BE7A42EAC08C5B6B420BECBB41B55454EC1F41347CCD984F11767BFC82665286A56DD31598834B37CA6EE93658999798EAD094298160B7E6C76978370DB3180273401532315168A161E087D4C6086846A3B60B80103C1AD814843BCA7AB329C7914982ED32BF16507B3024A16F231281A732D3D155FA60260064919C484C1741874BA96CFD91AEBE5C314E407A66D7CC4C846176D759618654AC2A52FE69C69A375ECF625E2889ABEBF395FA20561BA6300A72A2091356FCF197C866AB5468A3AF7BB3DE755836D9784F7C0949445D83B3358721C7DB3C09B5120F7F757BFE3366AE4365B677255EA680F27C310F768E56F1AAB8792259340BD6B984406148A254BB605A291C0946C83B1E9C5BB3F879A787B9106F98809E94BDC23C062D592318F9854DF04BCC343D64387BAF398599BB352F82B1F0A5B530E824CFD69D7A4A15CB5624F70CBEFE1C61302B8FCA337D70D1900DC817837619FA893208DA873C350F02892097708CC637093EB25BFB4B3C793331F0FC73C5446CB11276824CBE419378A224A683FA0D17C671FB8C4BDAF18C20C53A21A4BB8FBA9AB7A1B7ECCC81946BB5FCB15E1D08ADA7761A55D503DBA912B73765FF93A6AB642B5FB72ED4F16657AC448A1957413CAE547CCD76D9936C860C70C5635C28754421AF13448959D67CDEA3997EE923AA326129B5397C15AB90F95832F263E080A42460CF9F081152AA59CF17263D008ACBF146F34A7808257689A3148E58A0A0117FBB47BCA97810A42A7E0F734C0A17745AFC6ADE752080B39F3267399C20B1FDFA195437B83EF5125405ABA8D2CA42040371C541A5FC339772948A21B7EFC30C909C7938779BD012642441083150118CE431BAA72E989425210945A7C47479F4873E3C3CA6698ECB2A050415066D0BBE5E240222A2884B3CC17BACC14164BE0D21330456A279547579F8A4E9443D913A154210A3FD1A1A263186445A8E1B884BBE8B54D0196AFFDC47544C8D10A69378FA139BC8A422C44C5568555F9080F170BC6E97284F448E6C23885D603A732C469B376A762B5068E29E80B74F994588D9822F3E81BA6FFC273A9C905D0910062BBE94AA1E0C8C3424303845779F8C9B515DFA0864578A66DA8AD7B56DA2810C11E1A2888B88BB55B8C096A145B62AD9D2C98E003658C9729D7B82550527411A9C0B981F3479251C1774014749D211687DDA83626C6BFCD5B08F8075954BC10F48623838A736E38C1143B9472B4DF5D30D37F0BD7C727A2F16A3CBE0015DAB5A12E27A63F7AEDB841D6D9BB1A79A5C3E903C9E374DA62A298C549B9842B77C33AAB6B4939AEB55704CB610D084950C41B746AFD7157613618F6F1574BA51B36F7828AF0AA4F79C0840EA3D679013DF619046E935E0BD96EC59643250A0B38F9779B0142A9E546EB525E72AD204D1EB31A6633BEE89571E8FC16151491EA71234AB83289426559F90C67903A36E4AFAA6F49DA0C5DA5F195B80FBB99C2E8B06926074F3F604B3F6195B5A5B9737876BBA72 +ct = 66290E0ECE573C5EE5C15E6FED6DAC0FEED44F3A2C6FDF910F5816097505979D8822228DF92F10708F9AD6C9AD71F52BF21068B9E7FC986358C5E7D9B822A359976B5C5D8DC2EA584FF47B3CD97BF8DED0318564BD8263FD6E48FA68BE689DAB249B21B7F4DD81C7B5985260689EC56179975E3CA1597A76B35423172DA506967C0017CECA7977BB31A607B6040A7C92AB6F028A6FB641A2CB4496C25630604095EBBD767465CAB5B39AB0CD296E910AD218B8114BA81EB02E19B317AF3CE56856C8C24176125FE51A0ABDE9CBC44CEB3A5F40B24B6AF0AD28C238BB6D24BEE9A584C368F916DE89F7089B80BE3582B0152E5D775195E643DE9B9947AEBA9E2626CA018476087E35299083E937CB7CEF1B4AE0D42ECCF9A65D12959AB715B0361553C124708EB86F91A986BDF98E1338B692E2B2EE1EE862E6956E6B03E6340A6DC7799A0928EAB7F34DF2F39B990D4E5B7E2E6004642A2B97B9E927AD7668A0C7E56AD51E24DA07FE4139B2876A6C9C22CCA399E2C288C6A9A72F2AEA27410CD58B6216BEEC4D0EAC3220B019CC1D9CA094B73B57C487E8852467D0F3EF354F49AEE5971000B7058F69C6D470BA6DCE6DE957004F1835DF92EAF70FD4F0B9B6C83082D24859DB13547C93B3C3C235BE12ADA95897BC6C151B2147579135B69516CACD5D65AB08726698B7BE6FCC8C0631A3BD7FBF0EA06EBB09999A33A9C6183FFBA9789318A8CCAF16DF3078AFB5CC2C2767D32ECC24A562290F9C1C803F8DA15547E59C38C10673894407930D1F6062D805CAA53DDFB271FF4D7E70DDB921261549478C97E0FE218C319377C9266C518675C53D68E7D2A8705F88A6DB7159D7E4B79BB134098539AD9746B080BBCBC89F7B95B664F3BBE078C24C4BDF833FFA4BF22261D48C4E23B08E330EB523C5E62C15713C07A52183E6D4B539FF789216D39C8C6D5CAFC1C956AEC2931AB89D852AE9C89C74DE09E4052D5955A1CABD0995E1CA0779699BF12511D822CC06CD8B6C225E2B4C8ADEE2F56F0DF582674361FC457117780D60E5A33EB00B609239AD032904A85031A1A9F493904DDFEC5DF8F7B660893650D40C103F9912FE2AF880A7C29817B5BB59A3C5378558152461936A0EFF233B3896DCDED4EB0ACB36246B0B474996C147F7DC2150C5AEEEE1D36C96D0BBA1085A0554E7A4FFC2D7BAFCE6D5353A38C312FBEEADC5D41281ADE8198062A49AAC73FB69E0F657F536418B71A16F04C33C6348025BB2CA8D2544413C6D371B3C7A87C1D8ABC6A1B4DC32C39FBEEDE611AF4F651B536E82468736AF4EC3AE521AAB2FBBE823E76A4A3CCF8853E310E644999528A8D0F4CD434A5B1559367B87FE108FABF95905D98BAE6046F29D3C7EEC102B93072EF8003F2AF04522A5C03FD0B60CCDF3AA7069BD1C6D4E05C964305F6B7065905FF650411B017634D3C0D843F0C1266E7FE6D2F4FE86851F9158936C7038BCB584B1D73F4457EE50D4C491E86BEB7F03815F86484A3A8C106C45B1F665B2ED341789D10E53070B +ss = 462F8AE0143A9173E7FB5A0B476ADAC03F2600FFF5779CC1DF9DCAD9B1E7AB84 + +count = 27 +seed = 54770EA1252EA2857D6635151194F5F520ADEA8A41E409FF498D40C271359858FE2B084D5B96BEE087B8E8F4DD4E00C5 +pk = ACE2AF54375D684A6CB1FB38BD9C803A158483F91175263779E75B6D42734DC72FA02BC3B09630A0F79E2F95CB067C7DABF42F409A9635D55106E91E32341AAA4808DF6528C3BA98886184E0195E3CA09D9CC525980CB5A2E9027C6A88E9042BF77653B9DC02AD3CBB04F594BAE08DA4683DFC960708D85E39A28AD6E6A7DC81A2F0F8167633901298628B695CC1868756A97D80B1AFEBB71EBA5969A1086DE4D611F737AF56A83C7378C6E5E04E79A8967514CC668BC8FB7C7A1A671E29D55068E34D883A8320438AE7A44F01DB1D4DD07304081D684796A9257154381EC44562A8D005F3DC4C94D5CE9E36705132ACC8876142194DA54934095C2D5725A10E376432B17BF7D1B085D342CB3C633A085E950248CCC9C7FF350EFC341D07D0CA06E6BEC943353C479506691F2347A29CCB34AD09C929692ED98640E6B8560529CB17030EBFA4C769FC7707C75D86C234EDD78E7B3010FE86BF71748CC1C5B00023944774200B2163B403B8207093DFC959B6AA09FE6B98F6E83F972A50ABF113E9DA2FB9FA10D0D05789CCAF05C448854249BA8973A19C537DD69D3F39744DA89DEBB58705EC90EA56CDF428087D8333B16B1A9E59794D49A40B513B50867979230243B27F3D784932E1CAADF8B58FE11BBEA62DA4875D004A73FBCC90B566AB998A45099194D449CC60B0562570648AD588B213CB99A01283706878287930A71B68B43F87023D2F49829ABCBDE6A37A941182B78B8CC1B93982C7A24457A9E1683D2BCC97B4259518E0102760100E1C26CDD85022A04A91168486BA3413613DDD6C42CCB563379A08096B287B41A011FC9594D132E33957F2A5BC1DB4C57B4C8D9D3135476095DED35B2FDC09D8F996E332BAF7939EFB1032E529606677BB1144374C41C08807C9C0868B0C32772F18B755D7BC5C5B12F8EB9CA9DAB589185553B74408301062C90B2D68504F0718D42A1989F050F9097889AACDC175CD7E6768D626A8C9AA1B0CD6CBE91B10AF1A3E507575B47B6AC8C2B7C801A81985A81AD4AC04B32D0DD880D43B3D36857738369B7898B231B24CE6E9944526B9EF370354E21E38F6AAEFACBDA63497A85327A2112A5DB95179C5285D805698209F2A1B67A7730405B02B3507B4E4B65298734F5EB1B66BCB68F9369ABC01C7E4545568D432A685A6E038122253987EDC55EFAA3D926413DBDC43F9908DF1925031F45D28712734FBCEC3724653B019F7D5698DA7B0C3C90EECE1A1BE3567A253A143723B9550C8F7333DDAE88208667353A6184853A85A99C0C463189EB5763FE59D678349F536C56D014CD92B56ED2AA6B0518F1221A49FD6588650057FF00AA29B93F182B3437386F1F846D2A3C60CD900559425B2B7A5FF88CFABE24BEDCC825552577B5C12E4856DDCD91B0713526098B5FA555F105A0F1219110347AF9016254951C3CB5C7EBE602564242276399B0048AD8D370B544B1CB9789694C7753EF2CD4AB51513CB33F38BBB10C83C9A1A5FD1489D97476D9BB314849581D688C3DBA01662B539C50B0DB8E889A4654E6AF708A64910FC503CFA0ABC21B8ABC233AB978965059C41D1123A4BB90306AA09263B25BE885F4DB186D0E720E97524464C7F1B57E338A864D6C447ED4E29D88C30BAC7D2D0CDBAC43E9F4176F0078C715ACC +sk = 0BAA531A985251B6B10153C8FCE6938A280E93F9ACE7A56DC7F44FA8BB2F88C09290888DA8134A0FC43CCBB75B50B6A724D6812183ACF876036DC252FC893419280314C7611750875821B2F3AC4F1C20B06365709BC07AD4161C94C41930568996F8CCA58C4A0536CD5668488715593E66621F96C87A2178A36438DD4C390CA0532D30B88DB712CD3C50D30BAA91C98CF0BACF32C60C81468307CA35B47ABFE59174E53467CF7B1D376758F1A5926FE225F0078FF288AE24D23241709E471624285C4FBD35A333088DD643CF6CB0AB6B27C8B679792ECB8BA4C28CD8B09677F0A7EBB692ECA6777922C4ED6C20402533CBB9A3F1E0C10250209EF128A626B763B30B5E49C4C4691E3A13C2C2601B6666ABA1D099987990BD1BB00AB5806390CE8088CAE30A5B20567295ACA7F0191CBDB4795E78BF150C7954F9A49880C218C23E59014620E18F18C536DA0B7807B0C9E11B1E341C2E7E5BA799653FC669C1032AA014CB79769361B01091B5E000CBE100933C6D05714481F491B2355E72638831D0C4F4DAA18C6B4AE6E825E688CB812490FA13B43D306E5BC857FBC18A61923F6B685E5FBB5BE9C1871A9822FF07CAEFF40318482144143CECC5B0C579C84FC949EF359F0B24B20FC0A9F3300A3217A8058469C78B7998744024E275CD1C70A96A75FD86019CA031FEC081DBDB796A56186D9A1DF8C098940527D34A1DF2DB50B5136B6737829F0CB1DA3B131AB238207A011F02BCD346A0A7138EBE3CA2D78646D7F98D5A886A24B83F8FE84AE81627011A2633F1C159C3870F7C69126B3C31F50D356888F9077FC207168CB075E0940FB7A0BECC556DE78089ED512A39A6ADCDA9C3C5126D874B50C163BA7B091656E52F9813CB318C87ABAB12A3F8996A4CB446D0793055CA177A1BF455CB956443E56C160F4788CDC6B008C086403BC910332D3E3274F9825E9964484D7A52C91C275E153A496801C0E6C8084B25B53C8EBA77A9412291DF78BD39895DFED82FD3C92947A1BEAB598D33DA8344C88A9E073E28549FC939CF5C6978B6F74CCB23675616899FB69C5ECA0C6B68090A338EAB57A222FBB5A482837C097BD40141659A2A71D81E3BD38D60D0A903592B768B0CE60A7044350A75FB02F19482138603A9D8CB89BA6A32D37A15549548AACE4636047D66CA4DE6CF7643C2A5939478A39873820578150172F965D4DC6CC6D7ADFC360568A53C97D268900B7B20122E50CC5E460304927333BEB7BF73446064D76C3AF1274B503203804774B00F02534772CCB83CAA8475651460B156A7238DA2A9847D445F55687A84BAA06DD69D4A637EFCC1C09F81BB97B541FD77A96883869731AC776913ED6C02EF03183B27B4655639509B1E8BBA74837375628152814448F270B6DD865C888180AA071A2AB42740E93F05B32A9C85A069420BE2ECC5335738F9D46C90C5AF1625779F3A329DD693706618AFB300B5C7099C220126C8398FBB8F32A2A35888BCAA187950365F022585C2E08243F53122B6C5EE9A95B84151AFD10B2110135C2A940BB8370565BCD8739609C44F4AAA7C5C266C6EF7CAB87B351236702E327B3E53555E24ABB670CA6E505DF0E0AECF7513F7E36374988DACE2AF54375D684A6CB1FB38BD9C803A158483F91175263779E75B6D42734DC72FA02BC3B09630A0F79E2F95CB067C7DABF42F409A9635D55106E91E32341AAA4808DF6528C3BA98886184E0195E3CA09D9CC525980CB5A2E9027C6A88E9042BF77653B9DC02AD3CBB04F594BAE08DA4683DFC960708D85E39A28AD6E6A7DC81A2F0F8167633901298628B695CC1868756A97D80B1AFEBB71EBA5969A1086DE4D611F737AF56A83C7378C6E5E04E79A8967514CC668BC8FB7C7A1A671E29D55068E34D883A8320438AE7A44F01DB1D4DD07304081D684796A9257154381EC44562A8D005F3DC4C94D5CE9E36705132ACC8876142194DA54934095C2D5725A10E376432B17BF7D1B085D342CB3C633A085E950248CCC9C7FF350EFC341D07D0CA06E6BEC943353C479506691F2347A29CCB34AD09C929692ED98640E6B8560529CB17030EBFA4C769FC7707C75D86C234EDD78E7B3010FE86BF71748CC1C5B00023944774200B2163B403B8207093DFC959B6AA09FE6B98F6E83F972A50ABF113E9DA2FB9FA10D0D05789CCAF05C448854249BA8973A19C537DD69D3F39744DA89DEBB58705EC90EA56CDF428087D8333B16B1A9E59794D49A40B513B50867979230243B27F3D784932E1CAADF8B58FE11BBEA62DA4875D004A73FBCC90B566AB998A45099194D449CC60B0562570648AD588B213CB99A01283706878287930A71B68B43F87023D2F49829ABCBDE6A37A941182B78B8CC1B93982C7A24457A9E1683D2BCC97B4259518E0102760100E1C26CDD85022A04A91168486BA3413613DDD6C42CCB563379A08096B287B41A011FC9594D132E33957F2A5BC1DB4C57B4C8D9D3135476095DED35B2FDC09D8F996E332BAF7939EFB1032E529606677BB1144374C41C08807C9C0868B0C32772F18B755D7BC5C5B12F8EB9CA9DAB589185553B74408301062C90B2D68504F0718D42A1989F050F9097889AACDC175CD7E6768D626A8C9AA1B0CD6CBE91B10AF1A3E507575B47B6AC8C2B7C801A81985A81AD4AC04B32D0DD880D43B3D36857738369B7898B231B24CE6E9944526B9EF370354E21E38F6AAEFACBDA63497A85327A2112A5DB95179C5285D805698209F2A1B67A7730405B02B3507B4E4B65298734F5EB1B66BCB68F9369ABC01C7E4545568D432A685A6E038122253987EDC55EFAA3D926413DBDC43F9908DF1925031F45D28712734FBCEC3724653B019F7D5698DA7B0C3C90EECE1A1BE3567A253A143723B9550C8F7333DDAE88208667353A6184853A85A99C0C463189EB5763FE59D678349F536C56D014CD92B56ED2AA6B0518F1221A49FD6588650057FF00AA29B93F182B3437386F1F846D2A3C60CD900559425B2B7A5FF88CFABE24BEDCC825552577B5C12E4856DDCD91B0713526098B5FA555F105A0F1219110347AF9016254951C3CB5C7EBE602564242276399B0048AD8D370B544B1CB9789694C7753EF2CD4AB51513CB33F38BBB10C83C9A1A5FD1489D97476D9BB314849581D688C3DBA01662B539C50B0DB8E889A4654E6AF708A64910FC503CFA0ABC21B8ABC233AB978965059C41D1123A4BB90306AA09263B25BE885F4DB186D0E720E97524464C7F1B57E338A864D6C447ED4E29D88C30BAC7D2D0CDBAC43E9F4176F0078C715ACC3217D034B472A846CD317681C0F36FEEA187BD40E546DC4AD69C2E67FD9D830371600A8982C350DF524CDE514431DED7AEC23576530894BCBF0EC0BFEF0BB64F +ct = 7613DDA749B9B371C3430BA4A29B0E4BE5CA55287B1A1D0C760939DA3C998C7D88B2C8FD7D43F1F2C5B573EF16B48D339738D0D3AA0CE094D5F1077E23EDA6E6E8189C6CA76A7517FFED4C3C59184E8D96E74C0B284E8D21076426FDCE05C3A4115CD8ADFC0EC21EB5B86059D415D515287E44EE2E733EC27D6AB5945DBCA92B9BA4339DEE417428ABFE9F113D5E13C602AB11AE380E54421C4F713F0AF28C9C97B430A3B6DD7113EF98A93752F5F7FE4C763D3D7EAA53C8DEC6A796A37D97CFF28ADD820D317AC023DD3202C072303D5F172492AEEEF6B1486399E45167D8CFCB35011BFA166DAC078F10B49A776F9A00A227531E4B1390E3C9EBFA49C1C80046A093CCE478E1C91F0AABEA97BC0042330B26D01BA19C07355FF5612BCE097E351D891184725F2D1F95B544E615020DAC8691365149E5AED1E387B68B0E7914BF8E3E94267C5E1E525D8994221401A4048ACA3AB586B352FCAC09D41609012683B748661B5F60FF64C95F410D4163B07225E9D429A22B3DE3A8E391352331216C3D229DFCCA782F832DC7D0A830ACA4B9B1ED37AF42E6D9746286AB161A719F02B4A241CC65156E5A05359AEA4FEB750DB28B6799523CD42D70A1F84EFBD98D5F02229A97071D9105948C372AA52E9F132DD96D4AD3391599D155DEC585DC0C423B4175F5DB53BCC6DFBE384CE6705416C64F8D60A8704822E20AA05BF226C512B0AAD25D5D038E1D33FEB4376364CBAA41116D9B79D061DD61F8EC03E6D731574C83BB05EEA5AB730E51C31F7CAC2FD4F675824031AB5ECFD784AC57871092FC3CAD566E460856F77308424C7418FB6F9C4E9F3EAA8F3F2A5AB544C18579DEBB41B02347294E6816A873171F8C2A6E4C529205B98C1D77638FE2DB105CBCED66817051DAA83E89ABFBA25DDFD1D10620C94245645265A1094B8BBD75851925448629673BBC222B93A2DBAEF4B58A370204752CD993F3A10D6CF379A17DEC1A909DB1AD047F84BB50B244D15742543F097CA97E2597E2EF03DA5E50F054B8B439059EF9E82852A6E9A22C6DC6782333F858CD4D6B07C3BFA8ACAB2271E32D13297235934F4272969F5CFFC744CAB9BA3584AE869B52E97FDA0D77C11D255046CEC3D57E2408EB5AAEFE91E541C03247E28E96905997372D9ED7A31378351A4433F1624CE6A1AE1CA2A7B27DC2F41E126B776C3B72DB38CE2D7C1AB8E3CE8E7006D0E98EE2B9F3CFEB5697F302E5AA5B59064FB5CC2BA5C688B7056ADC0D204578EE44DFE1D113310BDB08CB49051363D8BFE16F2F782FB3BB992E3815E84F3EB3268A21A356178D09F4770AD6BB62CC8F82A29BD18A854F05E2F3135AD8BB60B752A8460DC53C869D4695E44B6BFEE3AF8920113DA5BA5747EB35BE4D5DF27DB9A77C6181143F0831410B50A487F918BA58A30FDE87ACAA561E662D31AEAE4672894E7EF8382027FDBF019893503209352FB63446C8E851AFC0DC22D62DBEEE29F43BC40E49B66DA3AE7D1E2ED93E760BC94BBA7FD1F47CF4D41C9E7A3C7AB2 +ss = BAD63432A274BEC85E9C361191A3431D6F211F1FCC69173B9FB00C0517AC3B3C + +count = 28 +seed = CD6CFE94E9C0A1CC4FFDCD2D7876504BE5F50F1D1CA5CF93482943465B268276056F2781F4DE805C138976CA72621387 +pk = A9C823EFC5C946DAB44B5B2068D61F00E7B0D87CA67706343927BFE4C12D20D69C4A5BA892F97EEEAB7B5A45742CC4AC4D37219AD72AC312051D31B8385CA2293415A13BB8983B8457B8AF9DCCA9E6322094CA68399AB77DBB9F6AA7CED5F224641C3FA07507DA9A08E0D180D52585DFB3B2FC95CDC733A573A888D403CBBB71C120BAAE2A195278370BF33299B9B2684ACCC5288A3CBA1277FD3999839A6ED29BB91D71A528BB2E4F953778BA23341CBA4B9B3C17F9A8366212AF3B722397419E24874B163470B3B2B7F24AE62258983B6161C6773B5AC90969C03D01CF4669B9D1F46E05705D4F676D464264D7549E1E2C3290C9B2BF5A71132057531714BEDBC7A91BC0AD56254D298908D33D588951333B3CB7924ABF14B0D70652C45AA62CC3062D851E45C866C6200DF4E74A9E559B9E6AB738F2B0DA9693CCEC3D968A866F0220CA95B7C6E8B04EC41D39C17EAFAB77444AAD4CA3A9D6B5B5D4611A6C074FDFB01F7DF68AD2440EFC5588F3B4A5C4106EFA3B9B6BB35C327465C7B656D1C1C6409993FD91CC20172E53190DAD63CE02691AC326904CBB6424C906BD091312C1BFE6969BA6AABEF954B5C8D439DA5064A248C92988961FD2254479946DEC829C76CBA61690E3C541648228B59805D7FB2ADB6AABA70718985279452A2FB1414E4704AC3DC84D3EB767101C8F4FEB24BC8148316609BF963AFA826A9B87638424052067CE8FB393D9AC579AB1080D1C549FD5103312A1FF9988DFE7805ED906FE9228E25942D49484A4510E0FF9A4A54A22CBA6BE945126EBE461C5940A74E1517C60603B2651E8371973DA7051EB7197713F5583BA51B92A9EB3179B45A8A8A5099B40C29F59146F25A563291364F236038C79B784BF09524FC6810F91B777BAE252E5B723E8059C06157653E335549784A15553FF9A7A29407D87725AA6B7A2A2669CC776BB810672967CB5B8B9A9BA751A9E69A8DDF796B1F324348712FF0C23F49A1DEBF210C027995B8A7CC5B288C4C74218E5086112237128CC57F4BFEDDC21ED23BAD00C58D835B5A3F0C8FDF1001E0AB26C2CAD47D5CAF2252CAFD3520E36AE21119E56FB456F277132059CA18623BFD994878C794545BA4A04436D804231F430B12808FB01647FA15D94B975BB6798AB7C3F6355B9BD50BC1CA00EE76342C8609BE0BC893DEB398B65A453BA08BEF83B805B61945229D98422F59C27E86022DA5620D737867828540C20B097076BC6C03E5435AEE1B9AF19958A7DFB921DA414280429DA389EEFE23FC9578B714B4F2E5B19B792903FF45ACA045BEC0B3D83C204747A2E24971B440C10119941D9316F45A87C4AB2AC0F7C4BDE9BC8EF73A7F42513BE3420C56720DDB984CB173587462AED9996D2A848D11344EAC02351E6C5A18CC7AE813BFDC50D5B143F4D07AC72A213A0577F9802043A585D95031D017B319358A24B06B7C2EA19F22B6634146CC0A123A8051C51E6AD6A956B1A935FFE00BC65C44A60534D1375570BC036EDFBCE66255F523BB377B2256C29B870DA2C870868299828F6FBBD8E0A109386B8D743A6E7A38384D5933E64565A037B9F520ECF8466F2073EEAF03D1B606F947CA2D2CA49E4B41DE9011FFBD23920C0D2D0CB20E3A9C63BFF3E047504A8965639E8FD0DB690FFA1E791FD +sk = E0C2121F06048FBC565FDAA305202D439AB3A81B31FA257AA6F4273547C1465610AE51C2C1C8603AA36D1575754A86C9194B1CC6A9B8C9F77CE6484C5198A193EA4369293798943F7918142F849C8D7479EB0588E6E6B4ABC4CE81A406642414EB4137C2DA905CE4AD2B750E7D966D34A3B1BFA8CA5C8070456B1F6D5B71E582C9E1E2BF9DC37AB60A09E797A43F66B27B04C13C034FA6F594264C9D7DA884C762B159D775F7750A1862216E8BC992C9B2E0D18513F409DF8B0811EA89D2A69B66D34E59BC93F5C7BDE25140A976A3195541EE22A7EDFB7F9D647616B31399B6C924022F036225AF7C34E6D221213AB5F7A20B908325835266DA1B456F5649B895BB032142FC5C700CFAC4C2A44CF1F96D57B8BA1EF2C9332A612E8BB9043559B5567090873D3F9450F37670B473A96F812CE1D71892E43C9FE61FA594601A27A98EC817DD822C625B98E0FA8F2D5A311A87A6C23B4DFDF44D7511373E64A4A18A833D654A946B0DA9694329023086013A919971CC4C8A45916901B45C25C28EB6051600644660796935E65A4700496BC32204201D5C8708FDECCBFE949D1339947C6BAABCC67EC901659D220FA4D1A3DA1A4ADC2B1B323BC4CABB6065D9032CCCA3DD3C8689C9A35810BCB30B99B3F55CF2AC8258C5B85C696A372C7AAB5B0DD62ABA06804466FA4C22B2CA0E09B7D47C4644898AACF6899C79B5321110F010CD40253E40C5920DB980A57C01B55C506A6662BE1253FF171412820272613940704F63E70340414322B69B60B50BBB4459C1D6A0F25065DA032455598EDF678505F54B51713209565FC4812AD5F8A05A926340FC3853719146D049017475A09A1FD2D47B35371D715C455DEBB3A40A8A0E83247B6B8FFC05B2E857B5D8B201E56C109DC155B720B2528301C49237F7A629234231FBA25C75D600BD360796A68991BC68CAFB5B0B7C748AB7039D8C4FD1B3B4DE76C193123E50109BA70956B9556F245CCD4330B888D43A84714E8CF17E5713B5AE5A9FC3A331718C227EF4BDCE131F31028D68529F06A218AC32317E9B7634C572513974DA2BC3DDC4C07F2C6B8D3AAF5734B5D9E691D790B0FA67CBCF36C0372C056C268E0C243132DB5DE7365310F5732151B80BC98A2BB76F9E8C616FB1C90A5B83CA5738BFA9CF1FB96242998A44D667A57B517A834834AC0F2AC00E91B32E4E7AAB452249D31575BC96C8652CA8E4C3C0D3277A60F5CA7BEB80B563391A3B8E1A1A97C85823928877954C28D052A2C116BDC325B687D26D1CCB3386CAC9BD4C10C3AC381E056F9060C89E25A910C78E677964D153B74554C8F38939F881543F820B6F11989589302EAC53111A45F7664616999D7A64AA26E4CD74539DD496A1F0FC530415B16FAA4AC86341C5400CB1BBCFFD2707BE12C31ACC9B5C94B806B71DAFAB1EAAA087EFC1419CD2978EC1B973336D27B69AF2FA85F6C33B73770C0F6B85D855938ED8758E6AA5724B8C0D457B29A9394A3528DE99CBD7A875BB5B299C8A6DFE416104A59AA9E958E3828D3C651B5A9A7E81D7738374692033C4C68254D5170204F83A9B8520016466FD9189EFBACAA23AB8F962AF7D66AEC2E27E468B9C326711673839541262A9C823EFC5C946DAB44B5B2068D61F00E7B0D87CA67706343927BFE4C12D20D69C4A5BA892F97EEEAB7B5A45742CC4AC4D37219AD72AC312051D31B8385CA2293415A13BB8983B8457B8AF9DCCA9E6322094CA68399AB77DBB9F6AA7CED5F224641C3FA07507DA9A08E0D180D52585DFB3B2FC95CDC733A573A888D403CBBB71C120BAAE2A195278370BF33299B9B2684ACCC5288A3CBA1277FD3999839A6ED29BB91D71A528BB2E4F953778BA23341CBA4B9B3C17F9A8366212AF3B722397419E24874B163470B3B2B7F24AE62258983B6161C6773B5AC90969C03D01CF4669B9D1F46E05705D4F676D464264D7549E1E2C3290C9B2BF5A71132057531714BEDBC7A91BC0AD56254D298908D33D588951333B3CB7924ABF14B0D70652C45AA62CC3062D851E45C866C6200DF4E74A9E559B9E6AB738F2B0DA9693CCEC3D968A866F0220CA95B7C6E8B04EC41D39C17EAFAB77444AAD4CA3A9D6B5B5D4611A6C074FDFB01F7DF68AD2440EFC5588F3B4A5C4106EFA3B9B6BB35C327465C7B656D1C1C6409993FD91CC20172E53190DAD63CE02691AC326904CBB6424C906BD091312C1BFE6969BA6AABEF954B5C8D439DA5064A248C92988961FD2254479946DEC829C76CBA61690E3C541648228B59805D7FB2ADB6AABA70718985279452A2FB1414E4704AC3DC84D3EB767101C8F4FEB24BC8148316609BF963AFA826A9B87638424052067CE8FB393D9AC579AB1080D1C549FD5103312A1FF9988DFE7805ED906FE9228E25942D49484A4510E0FF9A4A54A22CBA6BE945126EBE461C5940A74E1517C60603B2651E8371973DA7051EB7197713F5583BA51B92A9EB3179B45A8A8A5099B40C29F59146F25A563291364F236038C79B784BF09524FC6810F91B777BAE252E5B723E8059C06157653E335549784A15553FF9A7A29407D87725AA6B7A2A2669CC776BB810672967CB5B8B9A9BA751A9E69A8DDF796B1F324348712FF0C23F49A1DEBF210C027995B8A7CC5B288C4C74218E5086112237128CC57F4BFEDDC21ED23BAD00C58D835B5A3F0C8FDF1001E0AB26C2CAD47D5CAF2252CAFD3520E36AE21119E56FB456F277132059CA18623BFD994878C794545BA4A04436D804231F430B12808FB01647FA15D94B975BB6798AB7C3F6355B9BD50BC1CA00EE76342C8609BE0BC893DEB398B65A453BA08BEF83B805B61945229D98422F59C27E86022DA5620D737867828540C20B097076BC6C03E5435AEE1B9AF19958A7DFB921DA414280429DA389EEFE23FC9578B714B4F2E5B19B792903FF45ACA045BEC0B3D83C204747A2E24971B440C10119941D9316F45A87C4AB2AC0F7C4BDE9BC8EF73A7F42513BE3420C56720DDB984CB173587462AED9996D2A848D11344EAC02351E6C5A18CC7AE813BFDC50D5B143F4D07AC72A213A0577F9802043A585D95031D017B319358A24B06B7C2EA19F22B6634146CC0A123A8051C51E6AD6A956B1A935FFE00BC65C44A60534D1375570BC036EDFBCE66255F523BB377B2256C29B870DA2C870868299828F6FBBD8E0A109386B8D743A6E7A38384D5933E64565A037B9F520ECF8466F2073EEAF03D1B606F947CA2D2CA49E4B41DE9011FFBD23920C0D2D0CB20E3A9C63BFF3E047504A8965639E8FD0DB690FFA1E791FDD1756ECFAEB695001AC490F36C4638151BEE98D367FB7ADF0E06A470844068AF0E145E44AAE52CFC609E6F47FD7A6F6AF877190FF52256D0AC5B05B89C3F449F +ct = 626889818F1C1732EBE9F4D16EB41D7A7BC195CF1B20D4CE5EF88D7AB66480D993C7C4D9F5538A0B6CD7789EF1483F18727C32165CC2A482D33EDA191877544F8ABD849EFF8F3F7C7032D95B34E8D8D4307FFF26CE4E02F031FE8DAE875A5CED281B114EC35BA6569FAEB5DED0A3B945E4B249154EC199732DD0C86487A3B9CC8F7867C5D10976413D5A78A8C7AC92312E1F47A33BEE8352389776ECE26A02926CC9E7992E40BEC9BCBB4206E498C27999567F421BFBC4471CC7C3C4E34521694C67465B0902910DCCC207056203790DC3D11D42BA445D0C9038B727DB8D7C0649CB7217E362020F3552071D50AA00BB05C1799841DB2D9625A6F9F2E3EEF16D5374BB46F839AB64A1314ACF5780F6E5894AB344A257894A2AB5CEDCEF54A5248040A2093639A63FE91F2FF779767270188DB6FAB919181633EE0E2D0F93EE0D5F9792BC0B73A1E3C40DC04DF30EB2B1752DC1B620E683619A0CB3C3B9620DF3FC2E517EBF7B457E5B4F331A1E5D54C107AFF06909040D1773842B44CCC74923C997F8AB0901542CA97C4C74DE7310B50F091ED8664A6DB07FADFFD1E815C3258753B0BDBF652BA5FA35D128B786804F7C7AA54DCF8A50ACA2B1924A95C8567F597934BEBDB6268EE2D4B95500203E17CE616CBDC69A379B2F26A4948899EEB69852442B2CA1F447E27FB865E64952CA9F80E7CC2A4FC734FFDBEBA2EA5D4D4BE1E36F39991F63AC0664399FFF6FE09F35BBFB6F4C15FF925FCDFB633B9D66BFFDF5EEBDE9BD1A00878E12142C3E49278B3BB6385E421E5DCF42432E5FAC086A270CEA48C475C0F9539DA658A7F4144F3B751666B93975A2E590923ABC30E02C068A3F11999626DC3DD49CFDD5CB076CD683F18880BB2651CAC442C45B4121ACE9E0AD70C3EF99C0E76ECDEA7C038A8E168B31A13D3F54710062B88BA7397DCCF6E433F463B6E9E587EDFDD1AE54EA1773496AC41CD6DF262B79F607396C9A3BC94944E8C5CA41CDEAE9CCC5B27ECD6E3FE10995AC59886B74C2C5E0B9D7C95375327B22FF6B713091E740E3B8DA20C07AAC0115A7706D753A0EC5EAA337054A63E089A0855ECC74061CE44F5D8BBB229F19A5C772C40D362A0EFBFAFFFBB9D71BC0B52AC16DDC02541086A411E45EA131AB12D6D7EBC007374D3C916FEFD01557699E7A713DADB5B4C385CE17FBE90F04844BC9F496520DC3DB1FEE0CD89D3F5C9F71342CAF8688BD0DC6860F581512AD1E7B32CE166C78430A9BB7B83F3FBA095330CA3E5CD0707C436B0A065E5208C448EFAAD85F246695039518CFB88DA79843B95DD1186CA5D71CD4B80ABA89ED704CDC93072632AD6B8075ED8F211F7F193F4A8DD4505F6FB8AFC9FD1F5F6DD086F2DBB314E1FA14DB5D7FBC4706D09688495EAD12EA3C331B4E13589CA3D4BB63499DC54B4893F838C103B01BA7C49FEB8B9202E3D86A06F80C932FD182A1CAD2615B1DF729D00E9F6C3D881A6CB6A837ECC400452C015F8E263BABA09C258B293576F2EAFD79A60D308CC0DCE6B145 +ss = 50CD9D6042E7708F347B3D187430D070F0D8712E0BF68350AB47F4B50F04962E + +count = 29 +seed = 265EB2DE7099E4BD5614E5DE7F0C2A05C78EF3E8E2DD4AE4CB70F3E5E59C8D1D88248303F07DE0C5508652DA66B47222 +pk = E71B4FF986BEE57636F904C856AC93E0C18775864B7B932AF200251B0328F5B3CAA38116C5A187305622B4A152CA337ED7A3690C31161862447B847F5639C5851133F627B5980572023B4ACC37C32F6B70B3555E0EC4C5809C9582407A0E59A866991564CA55B21A48EE530676A435D26B749C1264F9E58C3FC619D1A23EF5F6300E96665EAB70E7350852115F5859BBF1A8308977648AE5CF5A55C9FB42801ACA4F0592254461A632A94A9C3A7CCD05C8B7C3B09666BE54F072CDC58D8CBA687D609D1F021115085C340153CE63A37750ACBDA01A6944A46CD16CAD098464A109BBB611A83346CE6B59A5F4CA3CBB4394DACA06E5708459CC777534EB80A620C308DD779B074C11F31679AE98AE569BBE79CB04BB127208E24BA008BEA28C5DB5EC18F31C50712171E27042651701C3004E057A6865D54763843D27873220C174C57154C9A9705DA162E8685A035B34E15C411FD1B7220C57265C2BA7579F4BD9AB1461650E8027C0BA79F2BA3F14093CAB6015D8CC092905A6B8F09DBFD5743818489ADA2BEDF88CE592396074A79824457F7CAEFE334FC84869FF43641821AD60E80407649EDAA8BDC2FA877ECCACCAAB8A1F35A1573546AC382222C193BDDB31275B84374CB4679A5FFD803EFF07987ED085FBD43E45752DD9A32F5EC03E7B74567ED9674E1070B026801E99CA27EBC0ED24742530507E19B97A09877A1B511DA3B9835268AC35AE44187EA14B996DD96C35686EB98A81F1B2AD90A80D0C989B12813E7DF2B34573B876289E7C79481C7247E637A60F9B2D3FC129C379A759756408636048565CBEB24C2186A875606A43D20BDDD8B9D70781B1848BE54A075FE978A3E112A567223D21BEB3395921D1A100C578E7EA0455949B7B420B6494688AEAC00697AE1914084EAB375D86243B50A948874DC973B7670C8F9173228B64647E58761442A2CC90165B188B58025F8EBA65CC654575A1BB3823A1A29633AAEA1763F24486AACAFD611C28774C98D89B3CE8A696E29F62775B5D5C50847C3AD4BB968C441086AA070097508DA888B5B202E5A3B5DB579943F0861A5B6E2D58415019182262C444FABB77679E019CCED4E0A3854507FCD0935BF81B0E8500DC6C0B3C154ECBA94D166407C5DCC67BFA6AEA8B4EF0C53859BA4416D5C1975C1FEB6BCAD8076E6B020A62B077F0141DEB5AB5986B386D51CB7E8C779654AF5E5485A969467012C572F62DAF788D1F58BF9DDB4BC6E04B00218CB671CE8B2515B072B76CF253A4006AC5437C107A077F162A3984586978CEB3752B1FA1A2B525961F96C63D7207ECC4C0268A354AFB00231B1CB6EB4E4A694524448E7A043C22A5BC1094B23D3C5D0A9641F909A778EB64BAB84FEEC3A53730405C92130F756050771999E469CF07CC8C308ECE9B827D7558BF882630556150A602D9400E3D4ABB229A9D8B8132A7F0C0C5475BB852000B63228C490472B42488AAC0ED647B1E834F248534FE2195ADF6952B83B6705593A1E53F0315613D2596AAD44E27A26D632B9C71E9C9E5A6AB733C7E81E54DB3437D894A19B4710A3CD5075602B176EC369F5116638775574C74425789154B0BDE48BAD6E52C91C451C87B48EC406674A75B0CD39D1173C3F411AD1EFDD8BF4BE2AFEA69C2327BD070CD1432C8D219 +sk = 25933617206AE881C4DE291B4F269F2E51897FF29D3C6803E1A4C58E53051E879F1AF333393C75B366CFE2E84CF9CC930D1928298897480571D7050751601BC119B1071412EFE8873AD325BC00420D13A752D33087BB6F884628DEF98F4FD21D01113219203F93419875C91CD33C7976B7A45F510F70E6002957AC49B862CD35640CE84E6B989201A74EB76422F88B31C94ACFA811605A32634199BE1639A50B709E89683C5CB0C975D627B76223EA48A2352C8BCC254ABC60812A6A5AB7747CA82073D1D31FEF708866A9801AD067A6DA0D848C409861C350DB559A0AB1D91C9BE0C149D6C241A13849D9EB2DA4B9B9B30B348217491449A43EA4544467824FF954C4869C8DC0B2BA2744C8D38BA584CB78EA6F6188BCD090267BA46882F16964AA003E2C60105415F937CF13B9CD00456D3545BC5E48B6DDF61A14ECCBAC23BB1D071BB14361B4C9ACB7B48805B7890C3676B550238391B388260CB0E2567F725B0382C7174440D82BA8A6D226D325CDD1C26ABD510ABB195B73D203F9DB7DB44ABBA87581A3C57F079B44A9455E3FA16EC87A0CC14368569B35517272220BA7760A8A0508BF0033031D42763FE89B611366B8B93D2D523D5C872BB99BBB099515A5911F1182404B7B4CCEA91462C6A5ABC16C64F55AB38A763A03BA48E0268819B6DF8BA88704AB4C7BCD8F8A150CA434AB0632ADC522A49C0E45997375D69901416792F845FCBC1A18789B22870401D6872374B15C851ABA4C3CF5A8930D34C74FD444A2C87F90D9353CD77361E26C99C8027B50504BC5B3F2BC27F3978822113E13D71E19E3915A9A4F0646AEF6D513E155B41237B2AB08BDF38322BF4C00706C0F22854D080BB8ECF58CC9B75D19A0185412A74B3C7D61A04DD8CB07BB37156C46221A7183BEB9321C58A924048AB86032F54815DA1BB33AD4312391C1A6778D9070B1A4542AAE231AAC97BB5E1A1CF42792C9921313C07ABA3A8C15DB5D1BE417C3888A2E0921A7AA1926044AB865935A2738B4378484B44471DA250E41925E976BEECA9F93D191B0C85B487BADFCEC4BE7C7683C508412E096AE888BAFB97CEBD3266EF7397004CC56741F53683034FC3160522E6BDABAD190C51F31926AA94B2F2A4506D69705623E3047176B46169AB8A715B84848BB4FB9830BE744CAD7591DD8D128C1A40F8A5B2829A92177D73CB1F319C0F45557A69AD790C87A6B8314E618444081C221C07C4BA5C1C450B8080DB278770A0C110DC386FB8411D4B983503964F7B6AFA10AC5154CCEA9E6222B4A70E5175F125B0A83010474311F8EF84FDF3AAB6D508B313A93C29675ABE12CDE50BD4B5B7E13C7228D9AC9DF569CC1BBC995EAACBC2290B0293A2BBA70AE8757C5A7CE84386093E02B3201573C56BCC368A7DD404371453C38823BA4752EDB663E5FB99C5E91CA9BA94CAEBC9D60A6318CF62168A86C0C419CAD1BC4FE514A745BB2C81701B89BA371CC1F10B50D95086D99778383108DFED849A1F74696464AA1D67F7F40BBC69C1FD907696D6227CF20750D68A3D36C600448C91A523A16E5C84B40819BBB2BFABB2CB03B658FD0656F410752F52BFC9BBA4A3A8D09D5835B1540F5DC673DF71540F560E71B4FF986BEE57636F904C856AC93E0C18775864B7B932AF200251B0328F5B3CAA38116C5A187305622B4A152CA337ED7A3690C31161862447B847F5639C5851133F627B5980572023B4ACC37C32F6B70B3555E0EC4C5809C9582407A0E59A866991564CA55B21A48EE530676A435D26B749C1264F9E58C3FC619D1A23EF5F6300E96665EAB70E7350852115F5859BBF1A8308977648AE5CF5A55C9FB42801ACA4F0592254461A632A94A9C3A7CCD05C8B7C3B09666BE54F072CDC58D8CBA687D609D1F021115085C340153CE63A37750ACBDA01A6944A46CD16CAD098464A109BBB611A83346CE6B59A5F4CA3CBB4394DACA06E5708459CC777534EB80A620C308DD779B074C11F31679AE98AE569BBE79CB04BB127208E24BA008BEA28C5DB5EC18F31C50712171E27042651701C3004E057A6865D54763843D27873220C174C57154C9A9705DA162E8685A035B34E15C411FD1B7220C57265C2BA7579F4BD9AB1461650E8027C0BA79F2BA3F14093CAB6015D8CC092905A6B8F09DBFD5743818489ADA2BEDF88CE592396074A79824457F7CAEFE334FC84869FF43641821AD60E80407649EDAA8BDC2FA877ECCACCAAB8A1F35A1573546AC382222C193BDDB31275B84374CB4679A5FFD803EFF07987ED085FBD43E45752DD9A32F5EC03E7B74567ED9674E1070B026801E99CA27EBC0ED24742530507E19B97A09877A1B511DA3B9835268AC35AE44187EA14B996DD96C35686EB98A81F1B2AD90A80D0C989B12813E7DF2B34573B876289E7C79481C7247E637A60F9B2D3FC129C379A759756408636048565CBEB24C2186A875606A43D20BDDD8B9D70781B1848BE54A075FE978A3E112A567223D21BEB3395921D1A100C578E7EA0455949B7B420B6494688AEAC00697AE1914084EAB375D86243B50A948874DC973B7670C8F9173228B64647E58761442A2CC90165B188B58025F8EBA65CC654575A1BB3823A1A29633AAEA1763F24486AACAFD611C28774C98D89B3CE8A696E29F62775B5D5C50847C3AD4BB968C441086AA070097508DA888B5B202E5A3B5DB579943F0861A5B6E2D58415019182262C444FABB77679E019CCED4E0A3854507FCD0935BF81B0E8500DC6C0B3C154ECBA94D166407C5DCC67BFA6AEA8B4EF0C53859BA4416D5C1975C1FEB6BCAD8076E6B020A62B077F0141DEB5AB5986B386D51CB7E8C779654AF5E5485A969467012C572F62DAF788D1F58BF9DDB4BC6E04B00218CB671CE8B2515B072B76CF253A4006AC5437C107A077F162A3984586978CEB3752B1FA1A2B525961F96C63D7207ECC4C0268A354AFB00231B1CB6EB4E4A694524448E7A043C22A5BC1094B23D3C5D0A9641F909A778EB64BAB84FEEC3A53730405C92130F756050771999E469CF07CC8C308ECE9B827D7558BF882630556150A602D9400E3D4ABB229A9D8B8132A7F0C0C5475BB852000B63228C490472B42488AAC0ED647B1E834F248534FE2195ADF6952B83B6705593A1E53F0315613D2596AAD44E27A26D632B9C71E9C9E5A6AB733C7E81E54DB3437D894A19B4710A3CD5075602B176EC369F5116638775574C74425789154B0BDE48BAD6E52C91C451C87B48EC406674A75B0CD39D1173C3F411AD1EFDD8BF4BE2AFEA69C2327BD070CD1432C8D2191B1B0A8682CAF72DF2E0A48513A7358EDBC77A615D6BE6FE2A7145BE66B7C50950A7A2354F7E5CEFA6F4A4E9A1C411EB9364506E9E1204A8ACB3CB77FBD2C4ED +ct = 589B45383FD87E438A2036E96032F3FF220B23EB53244CA47E77379D46C333F3BED4F24D0582E9949DDB32AF9EDA732E6DC529FA9250D635E160316F7585A473BD3B59B0084122EC07E73CA921080AD90729565C5297B624315ABCFC027253642C6972EC426833EFA33FED5399F768B422259857F40D0A11C3C2CFA2920DE96CE3DB945DB087C39F0D97C041457C21B0E9FEF68927ADBF34195CF17871515357CE6B72BEC5D3D77D10E1D1A3CE3740600841B3E58CAF96C4C3F86E60502B8618FC918118E14699060E5E87851990EA933B0E60A7F750FE7947F449442C24F5FDA9E39B68BB51EF9AFE2D2A786388921A01F5C228783DAE97CB91CAF9C5D21C64098CD3B290C77462131BCF46DA587267354478647083BEE9110A9DCAB4EF3B2AE080E8F991C7B641DD7A0F0DCFA5F133636658853C52BA1F36F23C6EEBDF9FE230819F77B39086313F6A96FEEE877D9855D24A8582BC2D38E05384043FC23800CB0447DC2708AAC562A39889EC6C341F88EFFE499F970E0AC8BD3636EFF3DD5919C679680DF277CAA89829E03BB0D01D0D1BF2904BF8734D45AA1A5483762CF3704B1A756357179473D4D6DDD30FF0D180843C3A9C6CA2E9C8CC7BECCA7BF76663C7F0483207423F30FB219F330073787D8C6928499657B9B17208B0C4A37E5BED81E166B69E708A0388C2ED1EE4892A9B48D0CD1DE52C747ECF25694F2B909D368D5AEC537A0EFBB10F770D2C444BAF1B25AB0C1DB0EBAD0A5BA111443010393B330898B2C4251C9E682B1AD66D4E58B9C898A77AB6AA0D9E60DA99D80188580A7D50DC8EB976F3E1C75FDFB51866D7FAAECE97D56A440C96398E76BECE663FFC53D2B06EE6D11062805F7AABAAEB65568BCC6510E26DBF3C8C66C7BDB2E70264AD2B68D6D066304C15D2228ACCECC8CC0ED3FB8DE863F56930DE5DC94D80CEFA1EF24C0746FD78A5FEE6FFEB6FD1DF1E20A0F21875CD22081B12C68B73E7BE9FE7125D503D0BA57F8F4D210FA0E39668509E841F8664D52C65413E8FDD715BF34C852988C9E1857977A503A6FD5ED158BE6371CB29E4A2A13DE00006062C56F160704E1AF1B79E0EC175E11FF0F705291BAA1825FFBFFF4384D2003B726D794EFA99B8E9061C0D20381A892A67ED2B0155ED494D8FFDAD329E9B4B610FCF34183DF518C681F8CA2D7E36561C9A7271B9DD4A18A71949F9991EE0F6F43F5DD5D44DBE793FC512F13B7463BEA6682CEC42713A725E1E71F06550435963C9AE8D7D908DD9B5F99555E4A668CC9355FC2D931E1B68001A6B3E20B4594304DABFDFE9BE0EA26F92627820A849B6A1E2C68F97EAE111EE4786F1908F268A56053C739E44F7DF80EF8A85B86ED0CEEFD7B0FCA38A91DCB1CEFCCD1034097A0FAE6127A0C47F1FFD2D044F808BE041B5968291FE4BA63444CAF4DA65B7182C654F1DD45771B464302D9B0EE14FF0AD361DB76FCE8C808049C884DEAAD6D4EC8A201B99BF31CD1DC9A8C1716EFC01ACABD5965FA97371274E385DBD75E47D5A61A9E56E +ss = 2E610015C6B440280D6F28D5E3CED35CBF65A70A171151363C4CC882D7899E0E + +count = 30 +seed = 806BBD111F27C2668318387BD0830F65EC21A51AF01985EF48D03D64E1958FF7EE5133A4EBF6DBF36329BCAAF65F40EA +pk = 8518C8D8DBAB01F270C3131AC1586BB783B35DB82F3C24AE2B767E2C4A7D15C2A86EB19FDFC41113A7501367CD70D73D0F63705487AC4E0BB1C84001FE6657610C7D64FA3DF4538BB6069128C4597EC9B291938EA5D7CD46897AC2179B52F1CAC91B6C36F37A59780E454C50C5DC354B56A43040804DE2394BEA14C2D385E082C5F181228D62307F5A6A1AAA1EABB84F90F34310844DF95A4E6D423D8C993FA7F390E6984E482024C2968254B54B7D3418D6F859E295665262246E1BC8CD6C9B726581CEE69140F85C02024C5B59AA0711813D66433AA384B2A4A3447939378A1E6A98936BF04AD075981D93C53E9635B5E285F96755F8689B5CE5429142AF6FA02EDEB1A719B272F6B0A6211A5B9807CE6FF368739B51D4D9480BD884C8B456569027B08A3CB928645D450C6264C5FCE2A2DE2B241F965034A08716649A3C71020A6986FBC8BFB5B4A2CB162749264CC1E44BD66223F3DB1B9BD2C68744B52ED7BBA0B9773DF128883110D2CC4757DACAF7F4C90FE02884E1A581D89AF687AC79444C9D801D156325590A3A24441B7C2C893B777386198C16374329E640B6A439FE5BC71AB3AE195575A71CBAB773AE6F0B5AB2D750D222A5D36B86EA2AA2006C54940A5F843AB708D19D5937643309C12D522DD479C3B2D57DD5696D25615ABBB573FDB62EEE5C6A6546CB1FB188F356800FF4177C69B636CBBF9EE9A7C7D512CA156490C96B347A5BC2CB257A061452DAB5FD15BDF5026677F14967B6C825D03EB782CD0422BD1078B7781624DC318A33B0C437D6C35997A22E30496E876762BA5DCF5146C5188DDE6C684C265A8F05031904572F7554123832C78767FF4B5FF525680C773AB3BA1A93776897D57B0D507B9391712344326F090B3D964DF8C293B6638FA36815C7CB9B7962956F903F62C4CE3D7646EBC1A8EC04A815191CB4BB085EC8693F2188F490731C087C23A8BC7CFB32FC019D106934B2D17706526CC6F787BE424BCE5B26329591C47402D57548110CCB42955C422323ADDB4987FB0F3441558964BF14021A54277BA14C5773A10B81C1427F51173F5C6CBE1B7575A4B6766AC355BC443E479A2953A51F7010F7B04B23E0CA93D08836432E3AE5A1A6BB62F5476C07914F88532CECD00CEB340588AB675F93C286E7288DA1C6CA3621AD6A4AE1FC64AA15B27A7C3EABC120E7460737585B5773AB18E23EE185C900ECC3B765983CB807E2F7047E6C999C6716E26801EA938302ABC312AA797535358196B63309846675BCF1B33343BC3D4D172DB81947643A84FD2173FCB0477AB87B57B55899A308D51311C9BA6916F15947D707D88B9228D0488DDACCB25455CF782B7A18264E55C9B6798F39A53F53240C82FBAF461364CD5202C5C94CDFF23E0F731624E69310E5B47964B2BFD3A59A5B0D55A026E260731DE346F74938ABC607B4F579B8B200ECEBB633614A46983E60E442A4914C93FA62219025E4A99D71032F0B00906126365C467E0A235570A544A7640F23800CD5F2A825479A632343F20801F1774F0E8B7DB96A860FD40A43CB7ABAE76039C6BC80B94EC315AD49E9904908A20CB444BFE219452C464EEB2914EC19031152CACAA00DD541FDE81ECAF1F339E468BE45459E708BFB464D0C480A1BECDBC021A06AF7AAC4772545EB +sk = 719950ED1960FF6C2D7D59BBECB83AABE1CCB569B76CD9B053389C552CB6BF847CF4FC1F18A03E66F02CDB284C15D656151644F78CAEEAFA8B12CB7C616256C032CE6112735A74285D66A90F3A745ED8733C195F6B1B9B272897520A02FAFCB958A9669990B73420BCCE373ACF5A1C86A555C3C48F78166C0FBB023C49608592261060884B408C9FDB1F4B023506D3516956B02637AF26FC7B1D9345F8B54B5AF96997D39FA32C01AB64A6AB7491D50303B4E8A134086110D220462395B9D89D9651205AEA9E1B88BC80C4C8BAC44AF4F1886EA788A0B259DDA78116051059853D2CD073ED8CADAD9AB04F7175D57C3224E953509588E788713D5A6714D0AA48E972F4FA55F16579D9BC6988F562CCF1286E87AA785929BF8266D7E340022C0221736C3CB372B85723042382092545A45032EB727BDC750449C786145ACF42B85D4618B0D6F009D0224A816620F1DB67F59713090B0849559A51B9589532CE2DC25DF8F09AEBDA932073A2AC2115B12C5F94C64750220D645B34C14AC1B2208565377D61426D7F2A25CBD969A2705EA330B676EA6EEFCBBC6CD40DA9C0716D147B398B7D469A919D83BAACCA80F0E41414382804B0A321362E14E766DB2450F599963CC2899E1048D839754858910D12C23F99158A9A3149362690A9C5540133E5F217A7B66B0D627321C810F7D1639CCA948D708616047F85BA41CEE9211DF72731AC0986D1C3149854B71683FAF68179799B12C031A2A84574B9A67C96A708355F7A86BFABE63DDB94B6C048359481CA7A45CBAECBCF34407D8E378733F812926599DF5C156A94945FC7911DB26BEF17074470A7BD6B60F771CC3F396E847195CE26444B641F91B468FA1670D0184942472667AA76E42976FAC48E78DA72EF0C207FC7400F92699B46345E4C9972A35DAEA31ADBE87980438DE4F211B005C8DCEC1A6EECB56D891677F9006C49385E8AB20A19B74325A9A95083BC711537480DB30719815352616B2C5721979BD4267FB134188A75B9CB303215A76A246D8F69ACBD173D069B2B99B727829AA5469A0212C006A88AA4A6B614674674FA75500AA294711C178B741B0275280BDA27813647A5DCAC3A258991DB4BF436C23F37C697115143A2755FDC199FF32B19209D7FF904FEAABFF7383884C1BAE3C0CC20D019066653B99C1CAFE366567C9238785B0F0B4D1432A9E02CA2D9A3B37D84646B157684D7AC720727AF4533749A9FF99BAD8F3877DBE5CFF9C75B38C4002178CE30773EE36A14F1497AB386CB36420F04D85C8312CE25B357D3108226925F6B85C7A3729064F81AA66336163C00506BBFC82030F4F33A5BE7330926BB3F849D1DCB09F5CB814BA8A722506D0A037E6EB26216AA3C4D4C05D5CBCF0358501936AD2BEB3563C341E2315DE6D68404ACAB0149BAFA84491AB67A2DD82972220B0DF528DA7C4D441C8CDAF508CFA2C0224932E7E5215572AA433C9212022899E43A93CC7C8F4AAC6ED5ACBD0162E4DA4B897B7BDCD72A0B2A2354F61A6C211089C11E476715F3369859C3021584B6593B5784344D53B40DA0725A90804C45D02F6EB7670071660478C53281B5E290BFC77AC46602B530B1300628A7A4F20CE227688518C8D8DBAB01F270C3131AC1586BB783B35DB82F3C24AE2B767E2C4A7D15C2A86EB19FDFC41113A7501367CD70D73D0F63705487AC4E0BB1C84001FE6657610C7D64FA3DF4538BB6069128C4597EC9B291938EA5D7CD46897AC2179B52F1CAC91B6C36F37A59780E454C50C5DC354B56A43040804DE2394BEA14C2D385E082C5F181228D62307F5A6A1AAA1EABB84F90F34310844DF95A4E6D423D8C993FA7F390E6984E482024C2968254B54B7D3418D6F859E295665262246E1BC8CD6C9B726581CEE69140F85C02024C5B59AA0711813D66433AA384B2A4A3447939378A1E6A98936BF04AD075981D93C53E9635B5E285F96755F8689B5CE5429142AF6FA02EDEB1A719B272F6B0A6211A5B9807CE6FF368739B51D4D9480BD884C8B456569027B08A3CB928645D450C6264C5FCE2A2DE2B241F965034A08716649A3C71020A6986FBC8BFB5B4A2CB162749264CC1E44BD66223F3DB1B9BD2C68744B52ED7BBA0B9773DF128883110D2CC4757DACAF7F4C90FE02884E1A581D89AF687AC79444C9D801D156325590A3A24441B7C2C893B777386198C16374329E640B6A439FE5BC71AB3AE195575A71CBAB773AE6F0B5AB2D750D222A5D36B86EA2AA2006C54940A5F843AB708D19D5937643309C12D522DD479C3B2D57DD5696D25615ABBB573FDB62EEE5C6A6546CB1FB188F356800FF4177C69B636CBBF9EE9A7C7D512CA156490C96B347A5BC2CB257A061452DAB5FD15BDF5026677F14967B6C825D03EB782CD0422BD1078B7781624DC318A33B0C437D6C35997A22E30496E876762BA5DCF5146C5188DDE6C684C265A8F05031904572F7554123832C78767FF4B5FF525680C773AB3BA1A93776897D57B0D507B9391712344326F090B3D964DF8C293B6638FA36815C7CB9B7962956F903F62C4CE3D7646EBC1A8EC04A815191CB4BB085EC8693F2188F490731C087C23A8BC7CFB32FC019D106934B2D17706526CC6F787BE424BCE5B26329591C47402D57548110CCB42955C422323ADDB4987FB0F3441558964BF14021A54277BA14C5773A10B81C1427F51173F5C6CBE1B7575A4B6766AC355BC443E479A2953A51F7010F7B04B23E0CA93D08836432E3AE5A1A6BB62F5476C07914F88532CECD00CEB340588AB675F93C286E7288DA1C6CA3621AD6A4AE1FC64AA15B27A7C3EABC120E7460737585B5773AB18E23EE185C900ECC3B765983CB807E2F7047E6C999C6716E26801EA938302ABC312AA797535358196B63309846675BCF1B33343BC3D4D172DB81947643A84FD2173FCB0477AB87B57B55899A308D51311C9BA6916F15947D707D88B9228D0488DDACCB25455CF782B7A18264E55C9B6798F39A53F53240C82FBAF461364CD5202C5C94CDFF23E0F731624E69310E5B47964B2BFD3A59A5B0D55A026E260731DE346F74938ABC607B4F579B8B200ECEBB633614A46983E60E442A4914C93FA62219025E4A99D71032F0B00906126365C467E0A235570A544A7640F23800CD5F2A825479A632343F20801F1774F0E8B7DB96A860FD40A43CB7ABAE76039C6BC80B94EC315AD49E9904908A20CB444BFE219452C464EEB2914EC19031152CACAA00DD541FDE81ECAF1F339E468BE45459E708BFB464D0C480A1BECDBC021A06AF7AAC4772545EB2C54DF6E9020E1E44B11B471DEA97A382A2FE8D1042565BCD51EF21CC0884D68F072D9B5A99F9C7A0A011E4DC10F6B600D611F40BBA75071E7BEE61D23FD5EDA +ct = F3F451B8F76002C10A67C10AEE76209E067B1B997C3B476373F7726B3F631BAF10D274224E86AF9D333D26522A951F3FBD36C72C6A261059016FBE4B3949DA0616205FC724ACFE2946C4D694AD1999CBEFDA3F0167D1CFCBD8BBD51A630687014AE826305E48D6E3AD6E68AD5542C3358CAE7141494821DA7A3BEE623096A5128C6DE1AB616DA91BE228BE402990D81F73031BFFF794DB1F8954738115649492B630FF50DA5F06FEF7D712B3BADBD175E290FB78351C1F408B5ADABAB395BFC0A5D5D2414C2131B4014592E2D5583E81286E677FA1F858EDA8708B2BF25147887433BF56D523636605F91629FB49B1CEE98CBCE6C6C9E76C587F50FC8B56821479BF3B97ABCA13804F08DFF1EE164AA269F6DB96DF267FA32F5B2EBFB3ADB3029859B5C802B0049B05CEF0A9BA390C49D38B6E11483B255856E0B2BB23685AF3843F5A6685FAE0A3D7424DA52B061DAA81390BC1335A841990C94EE87FD4AC9F2C56136BB755460F2698822D1152E33BB2294DBDEDD3A6630699655723B99B285A3707E194F2A7E53CACE9D4B4A60D78B6A8C74DB6F47E50C3B46E589D59F7EA24A051C143884FEF1C0A1B5DB65CB2C9982B86AF978BD6416617544AEAC67220B85746C4A304DA347636A23780DDAC9A5E79BE26BE127B0D3EB11E8372561C13A998B4B2123EFC24150048E8516CF1A2C6E7FF77090E472CBA93CE350C858B5104E8440CFBACA0D765FC95D7225E37475D048F89E6245A2147207475772F65399EBEBB920569137ACEC2AB035DE7C661B25356F5AE0DD99F016EE6460D999402641503CF6DF3E6F3380719A13A76C6FF6E54DFDB33D454C8E42E0A7B482BC8FB8E12A13E2E8105E876E1AFC9B9E5F28CA61E280D714224F835D8434401979B7635996627125EBDFD40EEEF5DA6D249A7FF15FAC662C9A3044C0D95D2B5029DAFBB535EC065EE675F4B76847F54BA66135126FC0B95D69D6C484ABAA11F60441E50863C7B27306283E58BF97E43E73164CFC143673940E2E723864488E48451F891C687F33BB24E4464ECC4CCDA8813947B54E22C3C368D97670980038BD6A6CAD485CDB8DADE3856069476E6F7D54E772BE8FB2E7B4C6019AD2EBC84DB2BF3D680385A93C7802B1F7534777A8E9C5E060C5F2148A5159140DF4BB35600344863E9F1E86F70BA9815D3051D865C7E6456D624113E6C76521884B1C2B59E6C2EFE4575E125A7E22776A80A756BFE25B0C0A5942C450AEF71AB8ED5CA425A09DF67670908FBB6F3BC4C7E8F4D3B9298E796D6BE36106F22FC6FFC0C9BD4BF1761B6859377EEBFCD5646A3D4B044D3424A743DA85116521A3FFE3C39C898591E669E204DC317928A7EB77DFA7B915FF832E7D7D9F1DA40AC7926F5B8733D661A4205228F0CE968FA3AD4EB5707D184EC4E72A9D6783A3641637957A2B6B22EA8BE95414DC06685CD7DC06BFF16479F490017DC78CE2D2DAD427DCDBBED163AFA58E2539C410BD8599A2DFC66D0C14DF9255A86B928F17094BDDC4A8BE4A202B36CB4 +ss = 91961EFE34B53285433FA9F780A04B8E47261E7A6EF77D46658E7671D800E2F2 + +count = 31 +seed = AD540A9CE816D6FB1661E5483C44F6FDD00C9E7BD1A8CEDA4B4C4D3697D4F78ED0A56954996CCB7DA96ECB8F5CB15809 +pk = 5E55633267468551B3EE117792C80C1A802230AC805F769807976C06399B97B3C93FB83BDC136CB3CBA70BB4AB5F11602E977ED051115508668C244A44E09569A13507D4009AB72B16CC3BC615C12ADA7C56D50BA6307D00801BEDF8526F0A9366869A4830314D162F63AB8F51996663C1138641275E164DDF60C7708A75376BC235E16D5C22033DE1A149153D1868679E1825F638967BECAB5B9644A6E201906771A703B7844CB5CAB61748D202D38B5B8F03CC45626027895E23D0C1C1B526C6D519620436ED593B58732164A39639C813F6032EB902B05DB15C5D8825C8B11815768D29522536698A751BC1F9964DC579358ADC57EB83A0D2201B9B9354B1B39C6E7008D5F3189902964973AF9A9C694EEC1298D68D3372783D34700B0280D692998B49A9BB76293D7A95363B317670352A71822F415B1C97742934713C5995FE5CA9642C3AC18B73C43357D4D497B3905DF7F58C6566621EEB25DDA29D97B598970684C5780F665243FEB854F9F566177200F9331CE353CD1A23CCE8AA4529BB667D1B9E59B1A312A7C6FF08871CD95C6934419F475C1C08395CE1A3AFF83DD14784303B4BA7751054AA59F5710E4AC6039F3168C1B601A5278562B525ABB11E66193DC9D34446BBCC8163578CB8065F89B9F43407F79246CAD2B6B8B40F16B839A060A95B76855237BAB2FA315DB48E40842F8306125FB04145356BC50B00E3389DCCA26FF048AF5A730AC573B5B80331D2597C4188227682075BC0000186B8FD26A383E1BCE5C19F13B18CB21602F2160DAB202BB07B63D925B71708095DAA662CF25DCBECC99395400A79842F5C40E79B46B5384CE730439F537BBC8A8608F61520E120EA9843456118A0A4CF36384832B12076044C65F06C8F8CC31752469C8A1E33DC529AC05485548A6E075F46A089AA8446C0D465BD43CDF0343ACC9668FBA2A7F7191A9D29BE7E9300CEF33D13A11EDB2B409DE297F30B8A7B077FD4CA4D1AC74B31092ADED0503CCB5818D1834A734E15B74D3FE550EE49773A800D86F129B4E0250EA1C43DA3A3B802B0757C6401EA090F98A28291621341A9D98C67BB001E46E89973F40C1C4950B0E34F07772BA6379FB6A93ECB57369B48B3ACA26EF815C615B4A97AC2190FD2B15E83AA10545FB859635D084A57B0268FF085D9EA4B7EE1763B914E67B33DC46037F39815A1F8C58663C88662B91BAB0DB6758288C682372A269C64CF3AB5C46DE2C8F0F1B7780A068948B9480C6AF10251453C1FE213855D74675CACC7B162917730AE74EC7A8E7673A7D0887EDC175791309AB28E6CCC629BF79C6D69B19269A19488B7B88A45A199841916BA4A2A1C2456A108A5CB4DE1B15356CA737369668B0B5C7BC10E22377D6B5FEF7515B4F348015872E3518C2676079B8A06DE8B53BD189EC9766C04C084E74C6E747C783FF3A99B930547A72FC3A179CBD62B52D46207E79E37D65C9F3C4839D1AFC167AE4041671E2C1BF3324D875B78615067DFE11653E6BD4DD5414579AD8C942081DB4F1A10B0E1054FA3D79AF6A285F2107D4232700676B8A007057D15C923A7889F115762B4C242392CE7C4438C68C6C3FBCCCAE4A071E404C24274F5066DEAF5359EB3382EDA6D6338F166ACD09E376826299B77B781250C2224486EF23D424BDD +sk = 4DA026F053C3EC1712C7F294DC891E26196894A1B620F97429574EDEE9568E113FEB564D89A1883D5A0329929CA57AC001925C8D616791842DCD291627D61C7C2C3F842B547F074F46F082A06BB4282323A291C3CC07904079125CD5A854168D83BA8AB6B160B5E1881D25403B297C73048E3298287F51529A8BA2DEDA6B4D7665A373171B03B1C0BAAB6482C50CA3A028D485CA8491B1B73767EC9EF8874A54D4CA414895D2E49FB2AC0CC80C9D248B97DDC51D00A10CA3324FA8A6373A99C5DC1BB7A389CD9A3C6931FC7BEE05ABCBA579251B742F46383AFB48FAA514319B8F9A0491F9212DA443ACF9B9CE5B29A6E723A4EAFBA5C1A7B3E017870FB35DBA8A69F1F7995EF2AFF817907DE5C66899824889A760CA4A38A57B3AFA880A3524E138B37487B2EE7332D2689F99A5A3748020FBCA43ED6045A5ABA65F6C67783CB74C217BA987AD381938B4A651B6908FA4F18E6D073A6992160438BA3C9547E4557E1E724192414C912648D25907BD8B069C845465616969161C483927F5D610C815638E242323465839D36A8149BAD494B71F1336A3F0A954369D4265B6CAB935F06694C482B500CB77BB32C4D805A295A692648A31611B206D06C2E86C61675577053A747BD3A748F452B480028EDCBECA8A10EB843EA8A71E21E9B822D80860764D8C5A77EF0222F8004C902C832F1A344758776EEB99C3EC8B24CCBC03F5BCBE59027FB424E6C580CC3B41C041984EA552BDD6396D52867887430A2534A44BA544A0B285C061D7D6618C76945A5C3B29BBBB09A724B1AC53E5954F66708C8C0B2D7DA57C62FC8B80E73D737741F9141F7164B4EAC08822A4C340B5B74CB5C2D407B9D63365C55C14C5E6AB43A8BC68908C34074A9BF4816E000DDB464656C379FDD829B6961C22E5345674243CA64705212D52E616664587F90947FEEB4366A7ABA98B76D9F79A1ECC4BF50571A07CC57E0CB1AF828BB26263A8A898BF3B7B0ED07988E82DBE3C0405D46B1CDC37600570FC37AD9B2237E3032BAB1A0AE420B6F011A653987305AACC8876AC4D014B7E619227B8B35BA2616C9575506870FAD2585549A2F902B185D7A61139C027912EE2A00EE460328B16CCEEB259149A0881F8152D563BC0243302D29FB98CC57A45369517640BF0BF63A555A900269878C4BA567F8D376176D6941D34957E1373B7520483394C3606089D14AEE0917059227BD848BB22E088DEF4194BFCB36EAA81D4DA713E37BE79E52F51BA2C32F05D06405947838625E49F5F6BCDA5E683D014A12FCC0C81601B52F80C39B6659606A8FEA82C62E061A939CB4451869922083268561E16381B026152170104E11F30B2399F4097B94078ADC66F23F85BA6651E861237700BCB1AE92E2BC652CBF19BC0FCA0D7F7577C9C96DBC9B8B07B917F258C15661DA17621DB1287EBAA7714A54052FA660F034F227198EA14C2467B46CF9877F4E0C29962992B560A7DB93C8EC13343F734D86BC548246A57473D1285463D0942F288245D933DDAB7A09766A9F8C178EF539F9CE9A0E97364CAC0366B5B08B4C1B081E01D198C2AA5288617A50019EB3A40A300AF538119D733F2544D18B9094F387A3F4C17BAF01523F1455E55633267468551B3EE117792C80C1A802230AC805F769807976C06399B97B3C93FB83BDC136CB3CBA70BB4AB5F11602E977ED051115508668C244A44E09569A13507D4009AB72B16CC3BC615C12ADA7C56D50BA6307D00801BEDF8526F0A9366869A4830314D162F63AB8F51996663C1138641275E164DDF60C7708A75376BC235E16D5C22033DE1A149153D1868679E1825F638967BECAB5B9644A6E201906771A703B7844CB5CAB61748D202D38B5B8F03CC45626027895E23D0C1C1B526C6D519620436ED593B58732164A39639C813F6032EB902B05DB15C5D8825C8B11815768D29522536698A751BC1F9964DC579358ADC57EB83A0D2201B9B9354B1B39C6E7008D5F3189902964973AF9A9C694EEC1298D68D3372783D34700B0280D692998B49A9BB76293D7A95363B317670352A71822F415B1C97742934713C5995FE5CA9642C3AC18B73C43357D4D497B3905DF7F58C6566621EEB25DDA29D97B598970684C5780F665243FEB854F9F566177200F9331CE353CD1A23CCE8AA4529BB667D1B9E59B1A312A7C6FF08871CD95C6934419F475C1C08395CE1A3AFF83DD14784303B4BA7751054AA59F5710E4AC6039F3168C1B601A5278562B525ABB11E66193DC9D34446BBCC8163578CB8065F89B9F43407F79246CAD2B6B8B40F16B839A060A95B76855237BAB2FA315DB48E40842F8306125FB04145356BC50B00E3389DCCA26FF048AF5A730AC573B5B80331D2597C4188227682075BC0000186B8FD26A383E1BCE5C19F13B18CB21602F2160DAB202BB07B63D925B71708095DAA662CF25DCBECC99395400A79842F5C40E79B46B5384CE730439F537BBC8A8608F61520E120EA9843456118A0A4CF36384832B12076044C65F06C8F8CC31752469C8A1E33DC529AC05485548A6E075F46A089AA8446C0D465BD43CDF0343ACC9668FBA2A7F7191A9D29BE7E9300CEF33D13A11EDB2B409DE297F30B8A7B077FD4CA4D1AC74B31092ADED0503CCB5818D1834A734E15B74D3FE550EE49773A800D86F129B4E0250EA1C43DA3A3B802B0757C6401EA090F98A28291621341A9D98C67BB001E46E89973F40C1C4950B0E34F07772BA6379FB6A93ECB57369B48B3ACA26EF815C615B4A97AC2190FD2B15E83AA10545FB859635D084A57B0268FF085D9EA4B7EE1763B914E67B33DC46037F39815A1F8C58663C88662B91BAB0DB6758288C682372A269C64CF3AB5C46DE2C8F0F1B7780A068948B9480C6AF10251453C1FE213855D74675CACC7B162917730AE74EC7A8E7673A7D0887EDC175791309AB28E6CCC629BF79C6D69B19269A19488B7B88A45A199841916BA4A2A1C2456A108A5CB4DE1B15356CA737369668B0B5C7BC10E22377D6B5FEF7515B4F348015872E3518C2676079B8A06DE8B53BD189EC9766C04C084E74C6E747C783FF3A99B930547A72FC3A179CBD62B52D46207E79E37D65C9F3C4839D1AFC167AE4041671E2C1BF3324D875B78615067DFE11653E6BD4DD5414579AD8C942081DB4F1A10B0E1054FA3D79AF6A285F2107D4232700676B8A007057D15C923A7889F115762B4C242392CE7C4438C68C6C3FBCCCAE4A071E404C24274F5066DEAF5359EB3382EDA6D6338F166ACD09E376826299B77B781250C2224486EF23D424BDDBDCAF7B417DA8B8933279B33068F6FDA313826C2EEC500B224CBE046ABEB37A75A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DDAD +ct = CC162C96F45C1BFE20D4EC4930FA6BABCC176B7B28948F6B3723F9A652AED6B8814C7C2F2BF11BE0321AE217EF12836547C0DA7CA4E7881AFA5C13B089F00249746D4EF05731B7F0A9189F6D092D267F88BD6064B820C0A995D27EFEC31FEDEFFA29BD61E16F35564627B8C07FD5100CF4512AF33689E215D92635278ED6E6135E14ACB1C167C8C3E4B843F4DBF0549468FB047C837125E8E80D453E39C44FF524119149C55AA31C7CACB5088EEFE93B7D493809A85330A67AE11F188EED63821340FAB8A7E9321F53FA389635E800BA2F6209D36F79EB7099F43B98B484730E95B58CEF65DC8A751FF3CC07B7644C99C243F6A3F314B239233E458A2BCBB6FA612B764EB5051A8DF7343267A7FDEE9EAC48E9577AC389B7ADF2653791184B69942B6191918BB3D6F88B80E208261C8D393002979026E954559634DAA1700FB328327DAAE0FDB1097837E91263AF9EC3C1864B509D98E039B666C875BD5CD390B7219ABB32ADB52EA6C3FD81C52F1A31A3A77366F7A44EBC666F912FBC898EC79B7FE554753B7EA41E0EB5EA366A329CEBB3EEBD449639EB8E2ADE3E5E92C44A587CBCA397077A4B756EA4FD425E2B780CBB3C8104D5CC5DFFC7A38318506BB8993979E0F00897F5F3319526F049470A37C9BCF52B0426332B9717D6336B4E277C363186D1A8F58B6107E382C77B5E25141EB6F5DAF19DCFA95676D2037524772E804D3BEB87E75FFF624CA9F5BB6098E3239BCEC265A88D2D7870560888CDB6805E68177489C21C8B3A2FF9949764F1A8D9D80F91F27C180245A7046717917650FD6F550296D8655F4E546E0780036FD90652C02786910F230A5E2C6467E6EC1687FB6AAC12C06451FAF6B7B2AB3C8C0C1885451E04FD54E05956D2174099E5F691D690A48BF5DE1E67BB5D84288415E429184ADCE1DD7B00EB94C33ABF63F5AE80AF202E772EAA576CD65E65B63ECB1F98FCD96DA6C58D4985021A1EB5A953AA105C73CF9391AD3633919BA794A26F2052878E4607D4489AC7E084009A582731990E8CC087A459470042ACC5BF481DEEFF132C86615A5FB41E47C8D7D18C8CE3A478EF621F965099A1554597BC32FB119367C25DC0373739B8E228DBE85F688B005C9CE688E12142D51D4D06DAC00690C1076702D8BBDF608127F7745BBCCEEDA28CF9A067CF6235742A230506C5DD4B9FB38CB9EFFDB2E97C07316131F7A47FAB847EC5BC93C88275DCE4F1781590043208A838884778A58EC5296C1935DB4F8F32F11C209A697B40726293D18AA908D4D7BFC8C4258F4535295708DC80DAA68ADABED79FC459956E1A7BC277789FA94DFB5CB69EADCA03A0B9C0A21BD5A7DE051FF255D6DF229F306E75A8095A2A511DC372EF601AE9D8A4575A4043380ADDAFD25AC1D044A73722C0255974939D9FFC2B2658C5FFD7F1E7E0F33AC809A1B1648527AB57EE858109D30FD29356D74C79087CBD2FC436DB8DE5179483CF4CCF6511C2CB58FA7C5431C25D1EF9CE8C75891449D738BAF2457E1F8753485E38 +ss = E4983D6021D6C10E71F474D76650F7B5E23E02805F755F57A1012882DAA77ABE + +count = 32 +seed = 288A5F2684D862A86D2790AFDDDDBAC6FDA934EE7D2E6DA1508BB550838609E8107312B28E00A6C01706374CCD3AEFA7 +pk = 420A3005A17C7B4A08178B83F8540601145B102970B3FC29F30A4CA1A8A5BC4164051931ED68A59EFB2B50D549BDC1A65E9909F5AA690B0235D32B1C6B2886CE2959FA189E2CE24224E99255863E6D964D4F422C02646A461BB5ABF86F4B4C0975765A5B0CA01081677334AF26C3467DA771CDF40EC4293608801CAD9C61D5F80839774EAFF772B139051BEAA65632120F00171AD020276A1FBF23517582149AD2C73450B11315CA4B244E7218800350AEB5808DA774030635BC247508144740634AC4A078A5AF2816E9206A645287DE06263277242DBA12AF2A82CE13BA6787C5AC3020E5D30CBB92452985AE41027056F492BB1A5E23332698240B5038302E552C5ACC0443A8795804126E15369AE96CEBD7C9765233982458AD6520550BAAD77BC74296BADCD4CC37240D0163CAF8C806A0CCC3F4125A0874CDC1C67E4626C9C753453FA37B208CAF5F523388D6308248B7688C80F6C925895670A1397880933AF0152DA1E54F7A7B512AA87499F7A718E62A7CC5BF5687ADD09060426B0D3CD292AB9B8372083EE462182872815CD740FD69ACDD24615110BB618CA1EF662715F028864BA0872B8C199ABE40F35F91906A821B8CE0742F931C661C65AA2445371A300E68F23B767382F3701CE685CEA5F59C50E82E45234169C3BBAC814AB9D68F83842C513A8FAF475590B3BAC2E3A4685B8F71208357D221AE41310E8454D315670C3A3409A2A95258B9057B42DEF7A7C6F588F6DA61183ACFB18A7CEDF138C7984B50A940F17C687E5A2F83451D94398F4C82C93A375BE195B4B219232E9A766E77040D3B9125E70FA4097D807A6D25323342508F2490A59702575D64AF146088F59802AA2CAB3537A8B4E92A10EC447BD89F9FE738D92A5F83C2861628601E42BB427B87C2153D4BC44B19413B79BAA5EF55325BA8A42E1A88548155D03AB116E47EE0455F0E5A71BAE3A03EF476F77A9A9CC6526DF1ADBEA64930B6995F60181544356C0982E957C5E5186F321B9467D05DD5970A96E226C89673E50A056E7C0A8027ACA8A5CD93723353CA1991730DFEA1AEE943CB0D62537CB5AD88C14F52A78CB6228EF4750EB7DB0AA831A4202B178EF47446A06A17E7CAF5274F384B36832A07AE0A66069BC59FE439F7B6005F064D865B550505210768BD636C61F0E7A1BDCB3C3065908D51302EE234A3FA113A1A1A2A618750075A6EC277CBDAC535FC1524A62E3C0601AAD1C46026AB6B8495C1B7093F776F9E6B3B533267AB99801E83BD18570166387F14ECB4D279B86CFBBAF90649E5C514E432561F850497D47C2BDA1BC2C398B306751991392C399DF6F408FF836F989C41CF76234B9445D9F81F4AAA987C1721C0C726EFE44C311A589ABB5E0AFBC4ADD9BFF6F87597A52E16A53D6C3551B7E6BE0A1958A89A739E0717F0A86BE0385C5CA433B68AB9506BA3A6E00DEBEB1AD0519E228B5B2D9AA3C9B4A2BFC8B35BF0A04B5A9D0154AEF1A9478DF4C8A0354F8878331F76C8CB6851940C996109113446367497CC73D395B34A9C7DD9621C9BB277BBACA6D976C3E65FC3FB4588643AB523BB35F551F1F30D0CD1C40D14B09429215E0C5325BB2B069B85C9E0BD9FA841771AA7C9709046B442990CF89513930F122152632A3C3D7C15C8018E1C23AA33CB89AD +sk = 1F83902BBB77A97B032277079CD0CA70D09D57385CE5C1B3C08B80ED95B2BBE70C101CC1912B71B29B87DD08254B593D616A31FF4957C7C0C325F82024F6A7B125B0FF799FFF47AFA6A9A7055382BCA08CBFBA71EA1B530BDA5A4548922C90C6DE8927494370EFA6C96780086BF585AE6534DC05344DC1941EF793EAE214312A371ECCCEA680C1A166BA97E128064748269922C9A19CEE4B8A669ABD146491ABE31A57B724F3A173740269A33309F651C934E09A564627896150ADDB8BA181CF2503256512B0DD5588F4372781F35CFC0328C0DAC842A1B3F418B6E8C567F410568F2C6BE8EAC9BAB558DEB08389BA08BBAA50E1EC5DCE044EFE5830743402402A167A9369E1D281D37713EB656662600840409C4FB971C0FA7771BA53B6C13EBFFCBB85AAB3316A3A99A9CED8BC4596932B3D052FBB13A5CBFB762AD7A08CA4AAF33862B6325BADDB0E56D395E8F92EBC7347E847956B471695C978DC2431EF7286C0E0A880F7871BB05160209900C0C403DA599B988A8EF0A716A9535B71002B3BCDADE60053F5A8BC66419FC907F1EA718B7BAD6BB76FD3F710E6778587C36BA5E4C2D7796185BB72C5FBB839B6C91119AE6C954E9B66C3EDB500D884428BE2C7CB6A6C86B807A6059739E23F70433D8A7A4AA768975AA6B0C3924CC8827CFC731A464121090A685820068019197F489315A2274A7133422B2968830271FC94B1C775C5A21E3B07BCE543B32F00B7250CABD0D04A2529347848830C975261A54717324533EBC0EC627F2064BA693A9BF9A16FCE87A8D7270759A06C00EAAB71A5CC25034120445334A39D63BAA2AB3254D77A921209750F6869E6971D05DA1E1BB29CEC9CB7B4962370E5C139BA472A75114B28BBB8E7069C5A8201B730DB571C1EE0B10E1C42B4A97FB7F7AE54670D12859D68199443157DDEA85760445895E7175EF8BB919C7213F427301C4F6561AFFFB0B03CF1AD05613C52DC5CA71A74545ABE77D239576303BC9678272873D9B28F4A4AACFDB46940F59B0A82A75642A0CD794D63D03D43F65E753A6AA2B58E0CC664A48CA3D8A3B18C7B05CF8293D3E23FDFDA93506C831455B648E2017FD866C87683AB307C6FD9CF24212509D777F34B0618776864EBAE9FA5318E739692C5AA86648D49778B67F81347B434CCFA990EE9A79DE94C94054E6E4A8A152B5F4757B89F075A27AC464CD1801D02AB64BBBA4F932C0003458FF73011282BF444961C54C5275408C4F79C3C553424AA4AA13A53D59B1B785C0FFB686FDA185D5438AF5C494D98B80381C821C493BC0E7797CD1995DB681EC9E18859A9229C497CC251AF12D9CFEBC6A19C599C9D364E587C7D32245145A60CEEB54CC7EC5B541B71DAE959C800A747EAAB53F8CD24365C91F53B7B0B9D3630361D41ADE4C82C85E04D8BA243763B3F9DD65D60921F962337A3421051D36889253A423939ABEB0AD962CE1E1A9931C960D9F4948723CA17A731ADFB4834615693F622470225CFA7B036B931A2240564CC35E59A7ACAE48707491576CC1410A304E0885534F577692C5A237344A5F674EC7C45BDA3242D70B004D5AB620CA2B1AC0A56C0CD5B942529B054E0F840E3C1837E0053539B4A420A3005A17C7B4A08178B83F8540601145B102970B3FC29F30A4CA1A8A5BC4164051931ED68A59EFB2B50D549BDC1A65E9909F5AA690B0235D32B1C6B2886CE2959FA189E2CE24224E99255863E6D964D4F422C02646A461BB5ABF86F4B4C0975765A5B0CA01081677334AF26C3467DA771CDF40EC4293608801CAD9C61D5F80839774EAFF772B139051BEAA65632120F00171AD020276A1FBF23517582149AD2C73450B11315CA4B244E7218800350AEB5808DA774030635BC247508144740634AC4A078A5AF2816E9206A645287DE06263277242DBA12AF2A82CE13BA6787C5AC3020E5D30CBB92452985AE41027056F492BB1A5E23332698240B5038302E552C5ACC0443A8795804126E15369AE96CEBD7C9765233982458AD6520550BAAD77BC74296BADCD4CC37240D0163CAF8C806A0CCC3F4125A0874CDC1C67E4626C9C753453FA37B208CAF5F523388D6308248B7688C80F6C925895670A1397880933AF0152DA1E54F7A7B512AA87499F7A718E62A7CC5BF5687ADD09060426B0D3CD292AB9B8372083EE462182872815CD740FD69ACDD24615110BB618CA1EF662715F028864BA0872B8C199ABE40F35F91906A821B8CE0742F931C661C65AA2445371A300E68F23B767382F3701CE685CEA5F59C50E82E45234169C3BBAC814AB9D68F83842C513A8FAF475590B3BAC2E3A4685B8F71208357D221AE41310E8454D315670C3A3409A2A95258B9057B42DEF7A7C6F588F6DA61183ACFB18A7CEDF138C7984B50A940F17C687E5A2F83451D94398F4C82C93A375BE195B4B219232E9A766E77040D3B9125E70FA4097D807A6D25323342508F2490A59702575D64AF146088F59802AA2CAB3537A8B4E92A10EC447BD89F9FE738D92A5F83C2861628601E42BB427B87C2153D4BC44B19413B79BAA5EF55325BA8A42E1A88548155D03AB116E47EE0455F0E5A71BAE3A03EF476F77A9A9CC6526DF1ADBEA64930B6995F60181544356C0982E957C5E5186F321B9467D05DD5970A96E226C89673E50A056E7C0A8027ACA8A5CD93723353CA1991730DFEA1AEE943CB0D62537CB5AD88C14F52A78CB6228EF4750EB7DB0AA831A4202B178EF47446A06A17E7CAF5274F384B36832A07AE0A66069BC59FE439F7B6005F064D865B550505210768BD636C61F0E7A1BDCB3C3065908D51302EE234A3FA113A1A1A2A618750075A6EC277CBDAC535FC1524A62E3C0601AAD1C46026AB6B8495C1B7093F776F9E6B3B533267AB99801E83BD18570166387F14ECB4D279B86CFBBAF90649E5C514E432561F850497D47C2BDA1BC2C398B306751991392C399DF6F408FF836F989C41CF76234B9445D9F81F4AAA987C1721C0C726EFE44C311A589ABB5E0AFBC4ADD9BFF6F87597A52E16A53D6C3551B7E6BE0A1958A89A739E0717F0A86BE0385C5CA433B68AB9506BA3A6E00DEBEB1AD0519E228B5B2D9AA3C9B4A2BFC8B35BF0A04B5A9D0154AEF1A9478DF4C8A0354F8878331F76C8CB6851940C996109113446367497CC73D395B34A9C7DD9621C9BB277BBACA6D976C3E65FC3FB4588643AB523BB35F551F1F30D0CD1C40D14B09429215E0C5325BB2B069B85C9E0BD9FA841771AA7C9709046B442990CF89513930F122152632A3C3D7C15C8018E1C23AA33CB89AD61E27E954728E2E2E230C94FF009417D7372938E2C29C38AF22184EED530FA1F36B817736CBC5F7B1DD6EEF5FE6332FB1A598F3871E5470D440FD2EA631DA28A +ct = 6EECD129797B2891B41E176111251FC114AF2179FD711D4D4C6F0E825AF1251C686757EF29970B63D621AD3FD6087CAAE604D416E06F444465245F34272980672E099F0BE19818760FE474F0E299AAFFFAA6551A0592EEC262000456377E54AFBF5E217F39D7C8C9B19E03B472EE47947580481B451B535486C28E3C61E983BE8A5802469CC95AC9CE38BBC371BD45F9783D0DA21253A478A042427D490F0247C8542648488416970BB58F7F0849502361149DCAD935AF84987BED520EE79D3FDB1B6D478652C892ED1BE4BE91601554D092F0EA15889D4D6B3D8BC38D0A2AB98B19A2213BB688B92325236CBE248B183A6C94FBC22E89250286ECF018AAF17416196F3D1598B63A6A3A780147197895CE6A814C130984CE05A9FE30870395E4289144B529B1D1E04ED3207B0130EE490CE86C49966DC6F0B58DD651D9E650D7F6F7B6F2B6B398CB3DEC5DBCBEEDF1D448892FED8C9EF32D681608E5ADA2958C3D47B0749AAFA33B95B1DCA91E6975EF842F1702777937450157C1B7739EE03B73B7601DB13747C4762AE8245D90D706636BEC3EFAC18F88FFFF3E2068BE9E18FCCBFE34FF834D937BE6413AC20A3E49C9CAD9E7E5B7B7E64D10A99C8BD916E2F3691706A2F64592CEFBE5563B68425ABA971D80A2D7428C623D42099F1B37B679F0EF039528374FA8F7A3D6D4C0A6FE7A110F72636B6C2668ADEF2261530BAB8FB057D26551D97A491E735FA3AD4845ACB832EF4EFBA71D565962AA94E46E17849FAEF065C888912AAE678C0C3314C8A05F2007F3AE1DB1AA4AFB1DFB3F74E937530953FF48B280C389CB13A42AB31F275318885801195B92FD167D17A46FC897E4EFEE985279195889E58C88F88C9F907B9315FC66F9BCFF1D2F0B2EFB7D4ACD7EBA6AD108B5220A1EC22D7EA83E85E5280D2BC06C62FE7615635EBB5C2C25507E46FFCF32E19A3E662AFC952511B2F0AC509CE93910D995A26AC5534CF2B181D624CEC786B86AF927D4BC1BDF396EA99F6DB7F259E30059595A654B2381CE1419E75A5B175455E127E7F1AEAC0B8903CE4F0CC6F26C72A40C358AEDF833AAE85B975F1B4EFB40D7C4A1708574CF0E98A2E787B9C68E568B465A53A0CF492BE54BF76E0C804BF51A5B74981593F3088367829CA08683986EFD8C9D777816158139E8EB22B6EDD93030F3F279E80D958C5592B0E39BB831AB6826A7923D8A2208B6C2D2BD8CD32604DE47722AFC0AB9E5D7FCCA2CA1391AE4AF8E43A5A878229D54EC256A6E42BB89750E97FBF3679F9FBDE1EC3D901B82CC45330BB2CAFB861665542A4FD34317A12CF9C75F6D9ED49FA081FC31212874E74D2F6514040C69A70CB56453618A4F983E63DA0ADE52BE5840A9508EA3BDCF70313173F018485209DC8DD229E36F854C778095C2C85D3B5B2F8E23EC88608362AA183D028F8988C18EF88373DB13CED999479A325FE49E9DA01844E1CF37D5BA098AF7B8005F1F1921B850B4CFE545E7F0441F24548DCEE473BD11846F0B6EB9CC412672CDB0EE +ss = 807703887AD9601806D0BFD5F9D9B6CB01BEE01F82500F525CF4CCA6E4B21FD6 + +count = 33 +seed = 4635DC5BB92EF98CDB6220DF0DD717C7F8158375EAA2B78FC3F0B58E9C9653E92684CAD3461D9158A481DA3D14694C44 +pk = 63992E0D6A8F811B3F0D30807456C84C8BBB008D3B126A31424954CBC6CDBCE91E25B19928F4A41B1371447BA3D173915580BBD7899E9ADCA37B4B5A21E715101717710BC7EEC56EC2E58002127D1898BC55F8A3BE385D607B3BA6561991AC6F0913617303830DA25F0CF0AC14E67ABB8097D17B0AD1EA8C6C267ADF51A15A9A363D7AA5C8EA535A89115C984AC5D6BFA922C6FC44A3B35CB667F939FA6B2676BA212C17BCD25C82E8172F6A7506E8B77D82CB21D7066DA93A7EB3CAB8E881A24C7592BC6B656E459AF33A06FC2846D71221F1DA641004B68BD65DC28A59036CA678508614B15A93E74F89B8AF58200D50E718DAB1C41C4556CD47B43F14092CA47397243983406E12E423233C90CFEB661A32CE65AB464DB58C922BB693F56553961868B064E17A11162A7F0E3AB0B0AA76B8494BA394C902C598C23721DC16C51D46B8258C635763776B922FCAC747985B94C006696F18BA49D0C5EB0525CAD1349745691320969B6BCFF69C30851B41E66AAC3353C6894AB0097B4EC49783CFE4960D61A6F94B317D488D2D04A8B42C7FB7D89D52D89B2DE30336333C50895348870BBC311611F27845C7775128A9CC831966FCCC06292D86B582A18C6AB2FB3CCE03701BA91047227A9FCBC6F16130710756C5DC288BA92402B5B7DC90C39193737C206F3F8230261852F1694258D47C469C7452156E70634384825BC52B03E90720066B609A4102862433E2621987E23AF51121BED807810501200B776F847FF615C0F594420DC29CA6573276559C1C84B0723569DC2A76728909D9D1279A8C240A3979B0B44003687A412389581B8EBF0CCB06C797F7F5815CCBB434132ED5F1340E2C669430B13A709F7D1612AF876454F06CCB7841F84C60F3806D5E423CB34B23BBA90AB630403A46783329707388A1F4232785D4723C993CC62284D0E35242E52CFD6981268B86F598B11472900F83333C48627D402ABBA59C6740B4A40ABC3200B5D9E13010FB4DD6BB503548C777256E0729905A89BB386459E0B885B6E3017C94BA93C7518F017695F5BF5B99214C8555BDA863FDD11D40053C0D652696286D2BA14D569915E4532132527CE1B88122640AD668A20964476DB20AFCA5CA663C6C17156AB3CC8E4B723B3A5209D2D10767DA52B2443764F91A7F3AABB35137EE18A1F744562E22385716892CA77D518C4BEC578E0F1145B3241C1831BF782C760F9081A1191812790531648954163B10E6A1F02B2B9E17CDD439C6707AAB0DF09236BA33D9B271196A398FF0B2C9521E57B6C8833489C5328F4866C14D2CC1CE037400DC610B28CD99150404A175662102F9617205C1CBC24B5716C7B9B0E8635BF960BE5B632A976156C64078CBB23EB86B7BE9A2D3E12F5B56406CC51796C66A6E871DEB601CC767C0B8E45744346DE60BB160808210506C5779BC275940E000314F30555677689F23009A583CD6F9779C83530E5B2A5A0A771BF1376F0091C627AFECAC104FB2BA251C074E359E5FC44DEC244CCB78423532A7EB27C8313A341DC1431035162838835C85C677A420B67C847DC6605821587C8064E0BC2F4FE6A6B22113E73519125B92B3A66F15564666023EA99273D0D5657CFE1B1B3BBF85039A8189076A3752784E23D8A802023FD0743EB03D989A6968 +sk = 8B78635AC351C94BB6B1D2B861E4914DCBA415F66CCC465B370578E136330A2C5CB0CA2857E1CB733A75E5CC4FCDF7A12580017F1C0FF484401CB23318A98000637B3D065608678103940D8BA75CCBE58206C130ED62BBC0132317B6556A9C2AE8F71A43712002D795CA52007782652D291DFE535F75034B0D624277527A6EF623168AACFBF721A9E8753195B82EB9855467322AAB0AB1701546C470AD139944B6736E1C97C9768370846B45693AAED9C80A7B53B863830DF61FE9600AD5717BFA2C8E59E30C8A20179B27B59341C855677880330AFD1A227B6C6313E17C46E87D109A4AEC4C1795908DB6046598483159907A667378F80BCB84472D5A748043B1BAC10BA5BCF61B07A2B13B12C347F3253E26C25EF0AF6A003A67B0BEE98A7C5A489C9EC9AC1F042C6F2BC7585CB01BB4B55496A93DE903EC974398E277CA7CC25E3265A879420EA0BD8451716AC21F1BB806C12B3488D408EBF18B89B79B1F8C09EACA235F1C165F9504FF987139590F9977513EE037249B4E25E51A296526BA76CD3295895A571CAC279BC65642CBA501C8F131EB52B5C7CB73B17757440B1EE4E9295D404177E542BD744AA587738BFAC0EF3C1FA0F19B0A5C5E28B53C2340C7FA061AD354C85AD26993087B61AC2002795D5ADA7A3E6747AB8110367C824988CA705B818D7A921DBA33371405AD235B18E463A8AC88180C88F071579FA5AB6D904A2F53B03F7C7EC39C473632369F984F8CC66DBD1924206A6376706CA36601BE7B16EDD17E93CB9A0437B3615374329B0712794F5058790D88182BE4863293133A83AA00E07C8E79C6F12C33FA9437ED984A1392903DA89BD43184DB6C8DACE3789AF5CBBA092010B889CA98AF99E5B0B3D4399BF61266E833A55A85E11784708B98EFAB223A27AEA1A16E76A73C2027759FD97A7DB870F9FC79AFC89435D092DB556E0A738C133B259F86C98D78A43A49744F306DA8CC6C9098A5A9CB091C9BAD94970F03B543D669A9AA4944E0C08DDFCC1D7D485FA414B0765A88F175AB6C94B12A2177DCD4998E6AA263EC3FD5BAA2466CA04568869466887F7BCF636C7A1F084277532841F51C3EDC5C1873BCE0F07A8871740C4AA82BB5AB164916082B795EB0660BE32DA9972840C927B7BB4061343D56757258BA4C91624F21DA11CB265B00B9AAFBB1665679C86EABBDA12B74F1C5917101D0EA2BB293C71AD5B556369378A8D5B7297C9731705DD4493DBB173AD01458686A93287B6DA0A6923B913989B69612A915A03A0962379BBC466A03F5517AAA0C0B030C6CA420636B2EE8821916E9C7F2BA228BB2AEABBC292F6C07AD85C6F43CA90D42629759536046394936C3AC5AB979D5CEC1A1CC19B5C17EDB47B0F47F34D616027B29A12725BF14B62FBAC4F2CC6EECE89CA0467D4868C11C17299373687B657D132C55785080F5B87F0E3C1504673825B98E8A0AA35F2C8D84F41B060AB43A930E7BE1C9D04746169BB4AB403ED8C74AACB868B4A93F1DC55144738E2736749AC64170CA7D0F0348A9550EE494466A49617B541068F2C57AD4108AB813DB58526C7647D55C1CB657CCD1143343AAA8421C23BD0C822F763B6A82B7D0041648A143BCC43163992E0D6A8F811B3F0D30807456C84C8BBB008D3B126A31424954CBC6CDBCE91E25B19928F4A41B1371447BA3D173915580BBD7899E9ADCA37B4B5A21E715101717710BC7EEC56EC2E58002127D1898BC55F8A3BE385D607B3BA6561991AC6F0913617303830DA25F0CF0AC14E67ABB8097D17B0AD1EA8C6C267ADF51A15A9A363D7AA5C8EA535A89115C984AC5D6BFA922C6FC44A3B35CB667F939FA6B2676BA212C17BCD25C82E8172F6A7506E8B77D82CB21D7066DA93A7EB3CAB8E881A24C7592BC6B656E459AF33A06FC2846D71221F1DA641004B68BD65DC28A59036CA678508614B15A93E74F89B8AF58200D50E718DAB1C41C4556CD47B43F14092CA47397243983406E12E423233C90CFEB661A32CE65AB464DB58C922BB693F56553961868B064E17A11162A7F0E3AB0B0AA76B8494BA394C902C598C23721DC16C51D46B8258C635763776B922FCAC747985B94C006696F18BA49D0C5EB0525CAD1349745691320969B6BCFF69C30851B41E66AAC3353C6894AB0097B4EC49783CFE4960D61A6F94B317D488D2D04A8B42C7FB7D89D52D89B2DE30336333C50895348870BBC311611F27845C7775128A9CC831966FCCC06292D86B582A18C6AB2FB3CCE03701BA91047227A9FCBC6F16130710756C5DC288BA92402B5B7DC90C39193737C206F3F8230261852F1694258D47C469C7452156E70634384825BC52B03E90720066B609A4102862433E2621987E23AF51121BED807810501200B776F847FF615C0F594420DC29CA6573276559C1C84B0723569DC2A76728909D9D1279A8C240A3979B0B44003687A412389581B8EBF0CCB06C797F7F5815CCBB434132ED5F1340E2C669430B13A709F7D1612AF876454F06CCB7841F84C60F3806D5E423CB34B23BBA90AB630403A46783329707388A1F4232785D4723C993CC62284D0E35242E52CFD6981268B86F598B11472900F83333C48627D402ABBA59C6740B4A40ABC3200B5D9E13010FB4DD6BB503548C777256E0729905A89BB386459E0B885B6E3017C94BA93C7518F017695F5BF5B99214C8555BDA863FDD11D40053C0D652696286D2BA14D569915E4532132527CE1B88122640AD668A20964476DB20AFCA5CA663C6C17156AB3CC8E4B723B3A5209D2D10767DA52B2443764F91A7F3AABB35137EE18A1F744562E22385716892CA77D518C4BEC578E0F1145B3241C1831BF782C760F9081A1191812790531648954163B10E6A1F02B2B9E17CDD439C6707AAB0DF09236BA33D9B271196A398FF0B2C9521E57B6C8833489C5328F4866C14D2CC1CE037400DC610B28CD99150404A175662102F9617205C1CBC24B5716C7B9B0E8635BF960BE5B632A976156C64078CBB23EB86B7BE9A2D3E12F5B56406CC51796C66A6E871DEB601CC767C0B8E45744346DE60BB160808210506C5779BC275940E000314F30555677689F23009A583CD6F9779C83530E5B2A5A0A771BF1376F0091C627AFECAC104FB2BA251C074E359E5FC44DEC244CCB78423532A7EB27C8313A341DC1431035162838835C85C677A420B67C847DC6605821587C8064E0BC2F4FE6A6B22113E73519125B92B3A66F15564666023EA99273D0D5657CFE1B1B3BBF85039A8189076A3752784E23D8A802023FD0743EB03D989A6968672E53B28D579974D268132187E7BD72238639C6F2CA154D50D98C74096EC33075D12195EC32A8686D0600E45D4A7F54219B0D7A3826D193A51B9156ECF2EDD6 +ct = F145A8D9CE4F94ED02E2693AA6A5458962997E212A3DCC11C56BAF8DE75A68F67C69EBD87B212596C90201BEEAB5E2A0DD8FB0F9C3308EA0B0797A6921E7B7A036047A78F254ED699393FFC4B904EA2E00C7CE3D149BCA5D763C2CCDDD386EFA74DE0D1E42E1F7E96B1B92C346F5610612E30E970360DCDC541435974C33976B13B069270DC5D78072E9CBC434E92D7B30CE2459812D5A25D33AAC97D3DBA1A4ADBDD08DA548DDFC83D22EDCC5015B09AB361DF9AEE747572A4229E6BB5F5FA85579BF47DF4525880A6BE4D871D38E0354DB9FDD331F8A1591566938C747F14F388395043FEBA7678FFE17D712BF651D544E6F307E30DE4AA7022ED3B758D306C8D526C29048BE699A9E5D77EE1CFA5961AFDD94C867B46D74FFD16EE258E6E8D3F4BFCA7D810796A2BBF456CB5D00ED9C736286B2E57D10633227BF7B91BE1B08361C90A57D6D4AEF79271B1AC6E2295797671B7F0C7DBB5830D2EDDB2B7AF062BB73967964C0D740F7BF562648634B40E5F2DA69260FA4DF1CB9A99247157A8911B8C2916E6307CB684CED9FD738C05179931992BD64F7541699F8DB7DCDFF73085E9BA500FC1E7130CEA36E4C67183179654913E33D9C47D76A3FC74F553BF32CC2B0167C4D3357A7C5CB26428FDA06A3BFF9CEBA276F2A412B21E04216A052BC4C201E5D36BB704DE258D30E5CE1112D9AC8E0940C4035789A1C3C2194A3FDCCEA8F4FF9CFECC01CFFAE1334013113ABDBA5D6574167D1AAA2B95257AFE1DAA39B8EA30F7F3843CCBD2B0DD373E9CBC9CE254BDBAF462A0486CF38EB7F90B5A7FA77D007636641639C7BAAC4563CD27B44D9B104C04990EB0D45B9FEFB05D987B64A5FE8916F906720628961490A91252DBB44972B7FD2BD5C11292F40B6C92317BA3641B4DA563FAAC61972FB552553CC006945311B8C79F88F7A59103306565447ED94AF5C2D1C10DF6D5BA6754932FCB98F3AD1D47D39394AAA810739E1E326AF312D94605198FE30E7174EDAB76391D4956ED0E4C2AB6954D38E00DBD02E76F2357C350F7E93C1974D2C1CBB3C638604DBCAD41790E7E402B80261405A52C2A0F9F0CE637A769CEF5BD800CFFC976598869C24FD9F8C83C55AD840BEB08EABB33877C2CAF3F8328C2DB2E575254E4F129A1E969D91EA02C77000ACDBEC1CF6B1003CA9C8AF77B22F6F9E8E831E4196585450B61E0E9AB6ED12B703C990FAF295FEB56FE39AF4B9DBCB2447B250FF4C13078FAD781A6CD5703FB4DC4A49FFA0FCC342E3638C6FC407602818E0F3C557EA1E9455272929E63B6BF746882769C5C482A413901F04623DD386186392922E0CC3B051F87C4783A90702B0FF33DD37AA924A2557E7461652444C9DFCE842DED51BBE97336FFF712974A3B60344FD9A7898FDF1F5BCF9AA6F0F28EA66FF64A76EE2D6080AA47C8829E1E8292185DB9921A4F4B3FE28786AFA28B25E87BBD63087A08A9234C6F12351B7F622A00F81E46462882936219FD8434CEE7B5EC0F18ACA21B13B5C995918B13B852121 +ss = 9D28091B20946B5507AE42BC4355A71ACD2B5EAD20D4181B22A5031EC53CA00F + +count = 34 +seed = 5DA2C51B4ACF488C8BDED5E985CC4702E4A7BCB248B5AC18AABA529F7F9CBF30EFA776E99F76D5C1686E94F50FB57DAE +pk = 192042D43A4271E44D1546306137A4427130C86A2025BCC297EB36D3C44E7CD4B0B1C22005FA702AC12569BCCCCAF6AC9256A1693C8B677C5CA243B9C8556CB3A268165596FD0470400CCF5E3B56714792F7A87B9E03019751425695AD70E4CE0B2769571901C6C2003B58152FA9757922BD28A094771B0CB1DCC73741B14B402E8AB86DC0F647525C131E9AA1A9729075EBB3CDEA4D31F6C3B23A5BCBF74A3C653D4C015CE5F65FD1042A137453462B8710704BEA463204C463273BB71056378850AD28F37EDE664E38514DD735BF9AB9B95D367C54D84FF085650AD33EBBC982A329C6FE3A516EF387BD0A0417C2655A5476F51A68CBDB4AEBC53F00C11E78E5BA6692A516C076330C20D0A09F167BBFE1C956A619825A8305D1AA9AC5736E6D24145924B2409A8688B41F33A181A9E4858325140A797F2BA81D50F21AF88650CD0BA8E662077708551A947C97C0A3355852A77576CA5B054D3B0B9FD973DADA618BD02FFF1CB59EB56B12C71B24BB1F02E27282D21281493AC7D07A20B124AAC30B7BCB8C2FF24B2C927D3D62ADE0357BBF7C1281FC94DA2B21D10A5E5EE07A3FD9CF93E34615B871C8DA7DB5441020D0522C12711E1963BE54739BD43949999083115988A09C6020CA88124B35C34EBFB0743B494B2666CCF5B5235968275FABCF9A054EF92833D8EC816D68C07FC53634A02CA192A411C87DD1F17FFEA094B6868638716CF593B33483591E4049E4E7C65C8618B242B17D6021BF0A70C7C59BC81C34F5441B063B9A1D95481E6529602B95F874BF1C649D95A072E70A52E9252E1DD1BCCDF64332345355F7CC48EB7DD1AA2F2C31AD1FD58B8B3A711D113C270A90AA2C5C79958F3907AE3BA071AA6144B88BA6C5575BDCF5331729A65D8ACF3DB97ACA4191B72A2BC1433FB3483EFFF09698C291DD868275DC5A86D06D97305BA596515E434A8D956B2B73B3C00821BA055AA7541E4F35896113ACFD9320FA91585F3212CFD5B023A77D7C5C0CEB746723C2C7D7417BFB740E4BFB2299B29F987698EDFC1B8D7B33DE2C80D0CBCB44F05B1DDBC667005B6E4335751AC281022CBCFAC0A55226FA69CFF845007B9A16D2B6BAB3135B325B12C263A81FD423120A6FA639910159B693406411A289863736557A028BBAA23E0C984F04543E61916D9BCEB4F64FD48823A4B13E4F83B43D443F62ECC72FD304F71772CCE318C1DA9A57A67502A1119313B93C4A66D03C2316C2CC5C2285B1E80C413B2F29C447DC975923D9100BEC9DB958ACD7850AB0777D82814929121BB87A6F4F07880510331EE6171797BDF23850D5FC1802E432B2F51B3CBC37631C9729892B6A09BAF6717E6EC39EC2B3489B33BAF257C35B9CBEFFDC1A1334380FC35DF386116BAA9BAD3A0A8381C4FDFC4B1B98836F23AB923175EAF72C59D9C500E10944FB0FD701BA5142B3CC358BFAF2732D643D0B135C8F991B0C73789C465A7E1B3EA6804B5AB9AB2E42CA1E91158019306855A5767893BCD17E92A41470D721F6432448FBC370C64C3E330D83987F3A9479F000C75320A296393E253A68E0E1C05969784F5612ADBAA2662459B09638202B74D8D5CBD2B01A915AB2AD06B08670546D8B76877B8B2EAA1ABB3132E55D8BD5B08678BFA4243430BB4D059B58A4B0CF0FD26E +sk = BDDB6A1BB704F8B530860B719752402098C84AE4809B01C8EC7583A66A3F4BC290BF2173ABB41868225606D54991F5B547C2254C74391717045997A57BA534A97B3605E1AD9F7C6446AC08BBFB1999179BB8F67731A63CE1C717F30B57FD17BC00605E8E14127EB0C26E324AABD45138484A51A15DD2464440178CA7E966D4D58383F6BF9BB2A971729074781A8D978965F9A51EB2729BA8C308474D56089F2CC869B523C41C409507A671F0F3621E057662454D49C49A398343D64CCA74B7822D773373D5185426B7B3951256154A7B78CB1F5049DF0371B840AB21B83944FB383CC84AD9E24FF42B2731276C1D26B6120534438B029C4AC7C0739453C2860D32ACD75229C63A23A7201C303032BC0A410319035D38A3C9802D41A56A8C6C2496DB10441A2BCD13A81F90CDA2564CC9E4020A47595A30994888B383E996115AA282EAC3E3594447110C2D07774F9312D796C6B74A7634B6C0DA2291458A35D3022BEE048483461CFEB152E1D2CA9195AFD1F9AA82131804D35E739299C539B913C54A0C58683259B3137AA464B9C6E03B0EB751999B6C5354D6171C78CBBEF1B456EC4C88199764A5761D18C0849C1B0A263EA401B86CBA549C712E4A251830F7B6EE16B2BFABCA3CE018C3833BB881385C272DEE151AC35A2C9561B3C1266855219B0C6B485E669FCBC49B24C50C6C3237AA6B116085085405115E0422D956BEAFF9360B58BF915654B9B887AD9733F425A5C6990B3F0223D8099BC0E95C6A5702CF5667209ACE08FB4697D02DC45CACA8074185F54EC4641B35BACD2F0B770FC215FDC171C98BAA7AB6C0450BA6E47A838575A528F7BE221C3C91F02734269A9425A2EDB76CB6D077ED76040A716D39C9C87A58AD8867954C752367A905AA158E0A9019DDA50A6213C260F7BD8A0A6E8CF581FB74CB17283F3A1A8AA9A0418C79A948199365A6A1045238104280AC704B33791E156A2377BC83E9B9C86D0A3D2AA3287272BE6431BB4E598232312D10D03BCB13B4D838A9A624566C6A25FA44A0934AB6CC333E6D52AF3EC26A6FB97615CC3C77102D1A315486BC69C555A3E8271660222A406022E8D97251308A90A15F748153C1168CB133593C1641E164C8A06CC008059C55449413C2B28667B99122AC42B8BFFBC15FE395003249C676DB7589D2896E7405BEF8AC510782FF204454C8A0390C332CEB7A5A3123EB1A1AD0470096058358BA779DF70106E24990DA77AAF09705110993F16A2320A941D8865B387236CB8528BABBF2D9196C15898BF71040D3BA500CB7B1AC85DF11003A058D838C2652D4577306023C756AE9715136E91B20699FEF425E48953FECE15BAF27489D929876803EB0B5764E6338BF5970C2F35D1E815BB5B0B1BAB630138859B729923343C3D24922A8522E38E19868B8A4585ACF14B795FF3A609D93B1A5CCAB08F877C5B71EA78C2819113FB3632D5D995B02926663F2AB8E3A73DD6AB93503192E0243F2593618E3A809684BB6A31674E77802828FEFEA3A50FCAEB1088F7EDC036CB84329C988D965071E97C1311643BB1CA2B43CC57C84CD5EA9109AE36DE2801CBDCA3BB6F977959578954AC17D303841D5726631663F12816EDAB5192042D43A4271E44D1546306137A4427130C86A2025BCC297EB36D3C44E7CD4B0B1C22005FA702AC12569BCCCCAF6AC9256A1693C8B677C5CA243B9C8556CB3A268165596FD0470400CCF5E3B56714792F7A87B9E03019751425695AD70E4CE0B2769571901C6C2003B58152FA9757922BD28A094771B0CB1DCC73741B14B402E8AB86DC0F647525C131E9AA1A9729075EBB3CDEA4D31F6C3B23A5BCBF74A3C653D4C015CE5F65FD1042A137453462B8710704BEA463204C463273BB71056378850AD28F37EDE664E38514DD735BF9AB9B95D367C54D84FF085650AD33EBBC982A329C6FE3A516EF387BD0A0417C2655A5476F51A68CBDB4AEBC53F00C11E78E5BA6692A516C076330C20D0A09F167BBFE1C956A619825A8305D1AA9AC5736E6D24145924B2409A8688B41F33A181A9E4858325140A797F2BA81D50F21AF88650CD0BA8E662077708551A947C97C0A3355852A77576CA5B054D3B0B9FD973DADA618BD02FFF1CB59EB56B12C71B24BB1F02E27282D21281493AC7D07A20B124AAC30B7BCB8C2FF24B2C927D3D62ADE0357BBF7C1281FC94DA2B21D10A5E5EE07A3FD9CF93E34615B871C8DA7DB5441020D0522C12711E1963BE54739BD43949999083115988A09C6020CA88124B35C34EBFB0743B494B2666CCF5B5235968275FABCF9A054EF92833D8EC816D68C07FC53634A02CA192A411C87DD1F17FFEA094B6868638716CF593B33483591E4049E4E7C65C8618B242B17D6021BF0A70C7C59BC81C34F5441B063B9A1D95481E6529602B95F874BF1C649D95A072E70A52E9252E1DD1BCCDF64332345355F7CC48EB7DD1AA2F2C31AD1FD58B8B3A711D113C270A90AA2C5C79958F3907AE3BA071AA6144B88BA6C5575BDCF5331729A65D8ACF3DB97ACA4191B72A2BC1433FB3483EFFF09698C291DD868275DC5A86D06D97305BA596515E434A8D956B2B73B3C00821BA055AA7541E4F35896113ACFD9320FA91585F3212CFD5B023A77D7C5C0CEB746723C2C7D7417BFB740E4BFB2299B29F987698EDFC1B8D7B33DE2C80D0CBCB44F05B1DDBC667005B6E4335751AC281022CBCFAC0A55226FA69CFF845007B9A16D2B6BAB3135B325B12C263A81FD423120A6FA639910159B693406411A289863736557A028BBAA23E0C984F04543E61916D9BCEB4F64FD48823A4B13E4F83B43D443F62ECC72FD304F71772CCE318C1DA9A57A67502A1119313B93C4A66D03C2316C2CC5C2285B1E80C413B2F29C447DC975923D9100BEC9DB958ACD7850AB0777D82814929121BB87A6F4F07880510331EE6171797BDF23850D5FC1802E432B2F51B3CBC37631C9729892B6A09BAF6717E6EC39EC2B3489B33BAF257C35B9CBEFFDC1A1334380FC35DF386116BAA9BAD3A0A8381C4FDFC4B1B98836F23AB923175EAF72C59D9C500E10944FB0FD701BA5142B3CC358BFAF2732D643D0B135C8F991B0C73789C465A7E1B3EA6804B5AB9AB2E42CA1E91158019306855A5767893BCD17E92A41470D721F6432448FBC370C64C3E330D83987F3A9479F000C75320A296393E253A68E0E1C05969784F5612ADBAA2662459B09638202B74D8D5CBD2B01A915AB2AD06B08670546D8B76877B8B2EAA1ABB3132E55D8BD5B08678BFA4243430BB4D059B58A4B0CF0FD26EB86D5B13BB8B72A9FB81245AB712F0D10F0E2E09B222143C420E3F2C3ACEA27B248C0A21EA0BB6D6F56F12300E8584D8E9A34E0E6F52227281151AE4C305FB8F +ct = 62CF02A7A2D09168AD13B88990D97D6A9B0490491EE43B8234B585382834B03FBA539DB1958800624B86051987EEAF09091C288F6564383E1AA98094850CD37C2A695D8AD8548B12FDC9FE827C63A360135EAC409C76D0A8B2390A64F012161A2DD3AE0DA8F626E2F5E053520C6DEDE4EC8D64B045B278B1E140988B3A13DA6ED4DE14513E04FF00EE7B07A05A79CE27FC8A183582F2F987B44B95770083CBA46A2E2DC384754D0ACAD94FA54EBF73568552318EE862C87D22315A7BB4126B2ED7D9E190456EDA589994EAF5991253A191FE3D7156BEE8FCB9A02213A477339507BF4A1CEEB0C64AB07D1B9F3A492437269FD8E932077C80EA7E3701F6AAE89718C2C96D6C46244A3A1E760D0E758A47A5547D403DEE7135E876345D0B725E2218A9A004C567F5BB00905A00039C3B6850CF5C8EDDE3FC1A4118118EF1EE524D312BF82C3F9A089DABAD769C4D459C414F06BA28DDD48B86E079367FC77285AD70D0ED6E46BE65DCAE0FC2A68312397B8E2771EDA4911E4C09E88D0F3055D01DB4B3B1ABC968EA78D8784CC0A0A429490E862B3A6FA629CC335873B55E88E5A0F320125BB16C621C4CA6ED3C69DC3B190D595EBF8685E7A22CC63451209D29413E7260DA471B602F9C7203877D69FB0DB331BA950F0AAF45C8697704A3A641CC04999907D70BE17EB56D316D6F196941E130AF65B0C1E4555BBA7A2C69676AB4AC7CF9FCBE9B498C46998A396A5175F06D31887DD119C92A02788909AF9997FAF43D148E4B00751249B6D569D16758503EFE6B808C5909DF65485AE901A32000D0023F034CF9A20729A7901049EE12DF1A1611F609F060DA51B0016A988054F5805D37920BB7DF00E5E7B99C19299567CF93CA8A9C13516C7B8CE59E0A71B6BDEE58290911D9B44A26D1C48400DE5C246AA5FA3159324BF31DFA3D1F223FB2472FCC0674D6FC19B0B730F2BA7DDAD33428A78E087F751061C7E21AF59F3945151DA4F97BA65064E8D4792FDB1A29D9B9ADA763A0F743CEE9A535A19A2260258BA86F21F0874A8782F5F36883369A655CB3D622C8F828EE4ACFE15B534B8D81775E0CF0C77625A2965C8820D1EAE140D940C1ACB3AC9C216DA291588C8414B91DA8E08F5B192CF007CED7F1B1110670F877B4F8132E6E53B3D47B4147129407BD14AECC4250BC5F054E3C25B255B1F15583B4DA510347A6BFCC5C0C25200D9DB9ACDF58B1E2B7EF968D1D18DE9C67D05BDF49C28D8FB4845CF634E490DE1E99D8398123C9730FE0CFC63B5E34B3E7D73A970A1AD1C963E442B9528D8530DD38A6DEE6FD64C24093BB650E1D6A9C79C05A9282025185DC4A08BBC50F1E335931490638283EFCC4618F2023F06407F70F076B30A7C3A3799967CD707E578A2EE156CFD9249852E5EDC08CC27A1AAB18A0846D066E61596B928BB6C994CEAED604C0ED5B42F9AE38756E8AEF19C47CECBBA7A56FC7EE51E394D0B8AD32DCECD50031C047C519CCDE7EB20E61D8944D5AFF66626541982FF2DA65F211D85F5E89D8BA +ss = 98498206D1F4D3C94A054C3C3A6087760B210D2F3628C71CCF3F0ADE9694ED7A + +count = 35 +seed = 4D2239E84B052109A78DBAB6D80C51A86D38248105970476B74A0B78B9CFAB6283E30D5A406FAE1C7F54F8BAE1110EE4 +pk = 38E84DF3C6A2DC2389897C3745183E08C1681B5B9F57C16AA2C12778528510868964122C1747662CF97D8B0353BF23693A70B3B2A7C8CD5C5508A227261CB7C3022058E318D3DC39E320770724351AD78010EB423FFBAE6714999226895AC23735A9119622BBC0811516D617353C7F769628925BBD49629FE0AA333D1909A16C5C27604B7DB0B4E602AB27987DF23C3718630BA4C2846444B83FE914D840CC8ED79A85B645A32809CA069FFBB8B3201131CB129DB9282B73174F8D4A14A37393552B109D2271EDDA8D968AC3FF67AA3374A2355C2EC895441873325DB71C91020E91F19347D965F1410F606862F69643216B869673B5A70583FD1218639B5036CC11D051A13D219F3969C817326D2B60BA5C13CD8CBC9313AAB478833D73716A2A48438FC529084C241BCB4FD67179D1F5494B4BAC2B05A5767B9647EC8829A500D1365BCA7B8CE7B75BFEA0C68F8A28EDB7BC4A3817C0D32C4E10169832B9ABE271CB0B473AAC2C3DD39CE895551A297A61F47162D97C41F051D48B62E5A8882DA62FCEE16EACFB89B98A12AB626E69D77CEB3B6B02878CE346AE5CF754C3F6097E0B5EB7AC80B9B8CCD9418F63E545D01C7D17A71E45EA3A6D927484D4976CA936FE392CF2052535C201DE9464008C932617CAD94085C5816AA41973A8D21610430AC4B3080DD480169258E65B53E340759BFB70D68B15B868C4098847901A6B255938ECD15D5EA94232B2971E3BCD56205FC6F0425F50AB880821F56C7B25F51F2412CD7FA023852CAD04F2704D4103D4362E965473ADD3563D9B36E5097C982506865454BA30AF132BC17C807309723847257C697C525E27CC570A88A1688134F4193DB67EFF018F54751E578483A77A119210106FD03066C403B3303CE54B39493323C4334D4A7A20AAE04D8EF529A15CB7D0900FBC4236C717310246C9CBA14D6874BEAC61B566593B5EC5887272B914EA655D254D595824288A666F10C7DA583F933052F43B0B0FA59248B0584F193AD548A12A845FDF14A73A0A37ADFB4D1845AFE6B56EA50B00A5503CB542C254A26F456AA3286B0126350272638EF0B4A3ABC56FC8D0AEA2F7396D97B64C56817D58C32103996DB88345D377FB7B2644FC99A24258C50730045B897AC908F7FCCB81BC2B51C286899C8C499C1757C6B0A6AC0A8482159D564CDB746037A1224CA72177F79ED19A398040426664ABFBBB7B7BA99906E7982B665A551881E0F02A97409A3E2ACD37FA96A4F9293F786A11B21E1F0BB22CF400DA06081BF68111A9BB64469487D4CBC10578106B381B8B054EE29339E1830DD613E19A9BAF9A81C2B9AD1D121A47D40234BC9D4B79C2F5F165BAB5A2DB68C59C0737E0E4786990A92476AEA44105F3C77FEEFC342B458E4310B9B110A8B2C01593B512F069944828A3F6A219354BBDBB1C344F24AA0784160CA704BFD89C4933B6123C4434CB9A6CE16D3F042F1FC571DB728119F6A33E4A9F6981193D60BE6AB916818B8E1FF9A1D1A59DE8824F808043A1949A5520B675D8834EF65C1D47AFDE2710C6B63998D43AB47A681F0A856D166C24494081E076D5FC05B541145D3155E232A5AF0AB96ECC0B09C2C41E285D350500A4F8BB32E99B4B05D558EA7918A7881BCF516457AD2C3AB72EF2E04E3A4ACB85A987C2 +sk = C6389F081CA0932AB66F658046C1278B38BC42B5C4E1A7C7A51B09D8A159773B67AAE1C2AA8666000C6E6A014B5C0369DFF147688AC6FD48C73D783E3025C92D782A479ACBDE8A7548384B763A868C46178345A773A9852016B9FE765DB0BBABA5751E8056B7564C53FEE8040D3C0125115D323C62A3F0A2B518330B6CC4ABCA84F62C792D07C1E1A0BBBD7C5B9A698CB683981F8828EE69912600311A0281DBF9C6C9E69DAA26A446D136E8B0310F236D7A5A49B2BC616FD346C3462AB09544998C8D5EF641E7B48C35BA7A68F25414F703FB02B501C69C58A9B798C8C76923272ED9BF432208BAB30F2DB45E1CDC56F6EC11792A33EC1A62B3FC992441527E63328A46003DB49B7DC07F73F705CA0220DE94BEA4967213D612B5A03B2C16A9BD4C66E0AC893263169A87AEAE67843944628E6374B5518BF40919840B8E6C64172BE3A35EE5A29777C035463380203072EA50E7DAA4F906D01C502560621137B91649C97417CC2D3E1677006226D4621073CB1AA213525199BBBFA78F1899A53CB2B8D00819869867A41B2F48C615EFE2C8DA15A4E6965BEF0C4207A499A2156EBFB611478182D85A71C9F8776D28051D1A6E4A104E54615992E0595CA9B0CB2A0AB0159575863F3145B3401498949502B2EA4392C77728215F8700C93F5846A1A8126EB6B72248BD1047BBE62AA58737268428509E53575F945735E75B42DB2BA2F21B24C990A847241D2C3533B10D50847C85D98143FBB2EB5138ACCB055A8B8BCEC8AFD7B5697306165AF982190821A14301EF0A90C3D829ED9035430725A99C67745CA415600D10D7C29B228998D7402EFC1F0D0476C4D74C34754AF9A1AA1213C9A0198065378DE2D023EB73B3A4BC5801D98213AB7040CB63318B8395DBAD6C7C604760CA679B301AB08EF1A948A5A83DEBB39651310B368C736A56977F78AF0916364F278A4E3973374213F7A28BA70296D1916FC65CAD3B33C4E1597F818CBC489BA970680999C373DBC246740C07D97C5E1EA5AA1D627757F4467E84AB9C5BAFD9BA484F1212706788CF5AC1829C7FF0A66F26C30AAE327BB7E167BDE95FB5829340B187162A5FDE3A7CC6A0A05FDB6F26902BDB0C6C4F75692E67AB1C8B1B46A40E53FC901DD892A3E612AFD1CB2CD52BC5B0C3191137E602B0A5872D3A961EF7168990B634F438B744375D75995943CAAA47E3CC5DC634432B6CF2DB29B637A5E22559A59971BE46004FE2A40F7C330610377A5B0EACF79D85F3C86223A4C90C31C2495314748601431FA1F49ABFF2575410AF33F7367C5540084B75D6736ECAA010290839EE2456EE16BBCB57C601F26AA104916254A689C24CAE98296E4BCEF8770ED7485511F55A46C75592C88D6F76005356C397EB1E61CAA04BF55A05C8409E644055759A7E60C1C8210221FB97780B92C2C8AAFB6B94C259A9CE6291E18A801A82456B93C221A625129A1720328F11574A5C35C3650A7B57619C61F47ED6319329F118F4C31358A26A7E9191CAB61012A71B27B47FA13CB0B2C959D913A2F4BBB3D106AB695A4C13D41256A0B442F0428DE78F90609A11B8CBB475083712539E1AB034903C30F6B73BB8229ED50F901B142A597E7FE48B38E84DF3C6A2DC2389897C3745183E08C1681B5B9F57C16AA2C12778528510868964122C1747662CF97D8B0353BF23693A70B3B2A7C8CD5C5508A227261CB7C3022058E318D3DC39E320770724351AD78010EB423FFBAE6714999226895AC23735A9119622BBC0811516D617353C7F769628925BBD49629FE0AA333D1909A16C5C27604B7DB0B4E602AB27987DF23C3718630BA4C2846444B83FE914D840CC8ED79A85B645A32809CA069FFBB8B3201131CB129DB9282B73174F8D4A14A37393552B109D2271EDDA8D968AC3FF67AA3374A2355C2EC895441873325DB71C91020E91F19347D965F1410F606862F69643216B869673B5A70583FD1218639B5036CC11D051A13D219F3969C817326D2B60BA5C13CD8CBC9313AAB478833D73716A2A48438FC529084C241BCB4FD67179D1F5494B4BAC2B05A5767B9647EC8829A500D1365BCA7B8CE7B75BFEA0C68F8A28EDB7BC4A3817C0D32C4E10169832B9ABE271CB0B473AAC2C3DD39CE895551A297A61F47162D97C41F051D48B62E5A8882DA62FCEE16EACFB89B98A12AB626E69D77CEB3B6B02878CE346AE5CF754C3F6097E0B5EB7AC80B9B8CCD9418F63E545D01C7D17A71E45EA3A6D927484D4976CA936FE392CF2052535C201DE9464008C932617CAD94085C5816AA41973A8D21610430AC4B3080DD480169258E65B53E340759BFB70D68B15B868C4098847901A6B255938ECD15D5EA94232B2971E3BCD56205FC6F0425F50AB880821F56C7B25F51F2412CD7FA023852CAD04F2704D4103D4362E965473ADD3563D9B36E5097C982506865454BA30AF132BC17C807309723847257C697C525E27CC570A88A1688134F4193DB67EFF018F54751E578483A77A119210106FD03066C403B3303CE54B39493323C4334D4A7A20AAE04D8EF529A15CB7D0900FBC4236C717310246C9CBA14D6874BEAC61B566593B5EC5887272B914EA655D254D595824288A666F10C7DA583F933052F43B0B0FA59248B0584F193AD548A12A845FDF14A73A0A37ADFB4D1845AFE6B56EA50B00A5503CB542C254A26F456AA3286B0126350272638EF0B4A3ABC56FC8D0AEA2F7396D97B64C56817D58C32103996DB88345D377FB7B2644FC99A24258C50730045B897AC908F7FCCB81BC2B51C286899C8C499C1757C6B0A6AC0A8482159D564CDB746037A1224CA72177F79ED19A398040426664ABFBBB7B7BA99906E7982B665A551881E0F02A97409A3E2ACD37FA96A4F9293F786A11B21E1F0BB22CF400DA06081BF68111A9BB64469487D4CBC10578106B381B8B054EE29339E1830DD613E19A9BAF9A81C2B9AD1D121A47D40234BC9D4B79C2F5F165BAB5A2DB68C59C0737E0E4786990A92476AEA44105F3C77FEEFC342B458E4310B9B110A8B2C01593B512F069944828A3F6A219354BBDBB1C344F24AA0784160CA704BFD89C4933B6123C4434CB9A6CE16D3F042F1FC571DB728119F6A33E4A9F6981193D60BE6AB916818B8E1FF9A1D1A59DE8824F808043A1949A5520B675D8834EF65C1D47AFDE2710C6B63998D43AB47A681F0A856D166C24494081E076D5FC05B541145D3155E232A5AF0AB96ECC0B09C2C41E285D350500A4F8BB32E99B4B05D558EA7918A7881BCF516457AD2C3AB72EF2E04E3A4ACB85A987C285441CBD71C18717E9DE7359B920A9A3BB7F32E619806F4E4718C585085BE6241646460817A0FCE5836BDFE124A7448E7ADF7B8ECC2652AC6D280E986682DF71 +ct = 47F3F5F8E8ADECA6F32B9692FD13D7E042FD9C7612634D5E3886871D5B18006B8BCAD0E4B8E91BF063FECEC9E54D10A2980C24369FF8ABC2753EC4E45BFB30FBE64CF5BD5B53F3101913B558DFEFC745D3C5CC96C1D71607A933E98314C340330BAA8EF4A08916E3A2A98177D4C1FF6C499BE66949A14D44361383E6A6C23A5E2A99856126BA269BF386889B8493CDB375D27AF17ED20B504E74F2A9FE4C00DE019EBEDD147591F8A53266C56A9ACE2DF3DF3CF0182596D78B07A67FDB0745CB0B6457F4467A7C9563947B2BD0B112819AD2471B8019C3AEA82ACB84954717CA91FB62099AEFF49F81226704B8D268177FC77A422CC951F1CB68D25028C94203686F3A43DC95611AE78FB30BDC987992B9BD810C362E29C8F8C4C50B94A4DD640C70BBAF28A2C77643400848B0EE5E4991CEAE312F0EFE2FA0B90205E170F44F8708CA30446F83DD743989575425F5960F30CB8A2A36EA62E9D2FBA6F13E555366191B0EBC79C0F8D0CD0E2F25EA617370675CCE484125C7B6699F3A83B265F43FFB29C72499A9BE90AD58660FC69435EFDEE5C5EA405106C09B00EA849FD9CF7AB0F4B55D12690C1E65C4F5369F32D337E319BFAC00D8D8EE8FC4697A5248C096FA4CCF6D95203D85D9E2AB4EB1F4953B761DFE76DB5D987EB0167A535C43AC756A68E3D08B99E71182F2FA3D13212671393DC33DEBCC3F080F03317128ED38CE785C3ED0772CF86FC7411BDC840AD1C754AD6E871EEB8ED6927EEF33148D31DE4B4B3EF5A7F0885B4E9792677480F518C250172D985981CECA7117B79EE38C99092BBEA8FA1B0036FC35BA1DDC545130BC23DE8EDE4EC7A2908A1C8D3FEBD0C1EB811CDC90B74BE2C0A4AB7F2D75828D0BB7F4DDDA80813D381016795F49045F31C0AEC4FCAE74134F5E799C2528DB055C1CB3C748ACD9DEA26B07A817594B902A76DF4AD66F641C65A609514BDC608103609387DD7BD80937B791EE7D14928EC937C6438D62E7C05EFC089D3FF646E8C04A03BF00094E3B04DEE0B81EFA2660392F03DF2CA7DA4231EBEC0CEA1C57599FF84617E3458D40A762BCA1DD3C777BC790B7C366980B8D2FB4183FB71B7472E448878D7F50BE104657302EA90FF27AF7CE9AEA771D7201C8AB3EE0754F77452E8056D96D4CDDCB69C1458A5117713DF0FB210E98B8270F378BA4C551CB469B10014422CF48009AA936A5E0E63847235214AC5D62FF0C4628793D7C4B9659967450ED3E1365F946A7A0445590D260FA87CFEAB8DE4F2BE784738DD534D0C6EEA04691C21396A406FFB15006D4E5A19C137D0776B63FC37AFE8618D4E10208823DABFFF3C80BDD953B758B89E81108AC146D05547C2E3139ECF4E2F3FE41125AB7D5BE50CDB427D46C2768EAD3940D3F4CB701EB41DDE06A191629A3E94082F203B2736F6DF03E206D2937860235B6E4DD1F8AAA4BD95586CFE18BF5FE4522D5F85E77C0FCB472ADAB84DF092C4CEA53D14E0FE7703F3FF8787827555697CEA6A8011E4E525B8BAF1ABB6E216DC617 +ss = C93350D1F27F771801B7C3E03A2E7672146809D37F33BA262E9E0CE7809B2187 + +count = 36 +seed = EE762F5C9021C36446706A88EF16312F4A12C725CD7AFFF1484337C91EDA8E89F7007F3705747D29907B3FB7500E5074 +pk = BE390596BAB505E51B3FC147AF616E0F94506635A758964B3E7CC067B80827DB21DC87450FE1415EE41FCA8A2B56B355FFF13616622FD1A19A7CD98F5084610D1AC9F1B8A6E78CAD9281A0AFA5A7C2A9A87916710EC9C5B3544B76B4808D01399F219B745962536026C79841F11961B63C10C99074EDBCB4ED786F7E8C3826609533E5BB4CB80F3E515299EB757C217DA2806D26664F154C0CC2B4A644B224933502ADF5A66F5B54CD45A71589219AAC65BE0623CF5B4C0DF17E72CAB64B91BFBD903D75E164E2A0C9E2C997F36A0B432177DE617F5E6746BD82984BB9375B4A0A12E96D06045A3A984667D03D8C08CD980B59CB2B0983B13F9C53790FD43653E78255882F9B0C980EF6B062789332A6B67B2B78E9E370B78181531846B9980A8AF905FEF403F47B891A6B440EE71CC5D6BF3BA5C7B087A31123AB61EC9F2D0C89E1EAA7DAC36613A15F147938D32673402164B001975D9C4A8BA5CE84D20B47F26EBA5909183C6FE1343D062389B9B99CEDD21E30D5841FB68F3450A47F4C4BE5E8C413C37EA4D5AD629141D7430938158CD04492BBA8AEDF7477ED13A0B97C8217A300DFCB22DE05449547626D21409F491098162D7AB477E3EBAF0E15124F449F08E47D8EC6847A0AC839BC5D237B3D509A8B5C44C8FB6705A467A3D4D9102FF2B6ED976CA9D856E9F257D5D586C7D8A4C2617DCA73AAA65719A21538D9E6997C5637DF8C5A2AB98A169A5BA8F708BBA55F2C0A9463C9B4EF0C9822FA64ECC72C8BDA4030157BDE5073FAE6A6E6F036121125DFC5A9DCA1504A1225E6DA9DB4D0665F6413386153AE25BE78B3410369BBDBD84A86C6C7BC924DD70005BEC0C54E07B4ADFA2DAEB8265DD98BCB8968A2F683A3B07633AAA0290550665C01FDEB22398ABA31140FA7494FD6A0087194673F51AC7D759D649A2FA4D7520FC67138F445287B681F5C3D1678B497129BC6624163E3515C8381E85C173D6A4CC0038DFC2064A213C557931E2E7138FA1A6BC3EABA08965BD803BD5759332CB1BBC4C41337BCCCA153905990970C261CF63A53204B6F8CB228D4234F08837425A82F1DA9BE43775DF88A20A0381F70044C76B3524B437CF365CB131BAA14EA6F24502336762C8E126AFD009E1997B8B3BC20C246070DF7B33BC9A7BDFA8CCD576925968915F186CA4A5A4934528DC75282E246B0824EF7118D39DC1F07449A218836D47CBB7365B677EC7D6222ABAF33068B5730D9E674CC008125226CBC5382A76A9823DB1B42976C5C90C23BC02EB7B874DFF93699E6035A838B22A7126AA42D62682505F9BBC77143DCA061F5C38E99652FC2E28E30CA8D62127AF02186BD9C95602992E20BAA636AB050AB870B11C52DA19B3A68B7A07A8CFBE7BB016A2537E50464265FF6F065D7A8C30F659998A35D79032F887B4629D07BB2DC895F09AC0387CCA9C5CD1AEBC08A687798721F24CA43C2C5AD42D1B6641838EFC2A72EF210BAD10218846F25DA336A4C00C4A29EAC8A608F2261B8C76B18F10B7ABA755771376DC7B876152F9FBA5370262919511D4AD50D76AA5CD6566C29225DABB3B668608D9DE5BAC08320CFC3570A0AC8DEB4BBF3D941F9325AAF546FC368AF005CAAB7AC6A7DD70D90506DDBB5F53A83079ABA0927BD52A68E278D3F01AC19EBA6BD +sk = F75196A57024BE817EDC544DBD552F6B42BA121C2B8EA95E55017856A10C5905A8BB2590E63B449364802C6B438FC19EEFC875017ACF652A8F0D6AB0F7F5ACA1F1833ED3551D37419D906D2B55123EC14D5F109ABCD9382E990628BB30D882CCA8665957346C3A08553C870D32F77E66348CA9DC321960B7D50B09DE64178411439C021899F2B8C583762043A4508C3160544ED2264735C600A6AB43C8515532130583298A11450AE3B7C99FF559A1D33115DC2D2489934518BD52FBA1CB9A019D918464B59CC90941599253957364DCCA9F95A08035F8BE5BD36DB6B19F1F191A6E4B7FCD493B7A41C90BC76FE882AA0F3B39B6F454785C5DD1D106C80960BBE5846D90BCDE837CD277A039DC22427B86A6658F97A60101665F3F69125445647F3BB2D3125C80D89AAE6096A01C24902321933909A8A2925FAA1E7407B3C90C8A53D958C1C83465E557AB620E53509EE8C960B3C547FEA08D4FFA215742113ED9661B57AE1B30BA5768645C632DE76B96161A9B6C34B8DA48B75D176C2C849AAD55C6680BD0863273C345C4C7379CF3F873FA5953F53B9A026A4DC120C96E279085566C7D090EBA276A0928693E639B5564A59C08AEAFD25915F5478DD86E938A11529BB9A2B0B83487C696E79F1FD034EF000FA502328184BE42B8959D9C0683F3BC20E71902423AB14A4744E162F6A2B474DBC4A6F21FC0432CA7422CFB253D0F952BE9C13125458DF8753F5D551CAA38BCCA1625B533051C5226C8768335854E7477064320CB765AB9EB311A1859B4B5A006D918BD8508A971205E6902897CF95E0B652E09030794B46FCF7A784560C0A18B8E6334A57EC177BA56A8BB9A857013C6B9998975379BB04B540015A14A76C658F856BECCA363CB37997BB85B185AA0104063696F1020BD1B443419989798826E141A24A3533494391FA233CF848451CBD609D014508FE137534C42D6F22ED2CB82363C847865AA243CA993B14992572CBF5535845CC708BB09A1E8A7834C200D8036768755AFAB53ABA85813EB859EE83EFEA7563EE4BC158599F0CB04033393C829AEDBDA289ED852E1EB1FEDA9484777051F967E048041BA3C313A1414D463CF3EC36801AAA1AA540DEAB122AB530ECACA30101A1089087311972B338B045A1637189020C3030E63F707FEEA9AF844C7E1B20B4A5348C1A432F341BB9F598B8C0C2F6F55C4D2C2C22B187430748F82842DABA92283DBC4BD20636B6754B20A7127F01FCFD4013A1155E4746DBF3CA1F34991FE7C39ED99BDF5760D39DB8E6C428F2DE8157BE0139415AEA96BCF6FAB633F2257B582312D3C7ACAF6A5F8E55AD699672160CA01246545059E58502E28199CD0F5505ADCB91900A283F0B059F33D1A8B352010A3C815717FB3A9482C946DF0C74A526353D5C9ECD2590C5050996393A02286841580AB599BFBC8838A53301BB11D5FD492AF40BA26224505969D88F6B193EA42B0348954180E17124EC2C64B962A92AA9C3FE2D72F94301531C4AAF847243702BC8F9C37D64B54F20AC003B844C52417E1436D2E75AC09C313C83B8575E791A7C95D0412CC61521A6826997561485DEC26AD7BAA8E065E9A279ADD7301C5C74C5B95C1B6915EBE390596BAB505E51B3FC147AF616E0F94506635A758964B3E7CC067B80827DB21DC87450FE1415EE41FCA8A2B56B355FFF13616622FD1A19A7CD98F5084610D1AC9F1B8A6E78CAD9281A0AFA5A7C2A9A87916710EC9C5B3544B76B4808D01399F219B745962536026C79841F11961B63C10C99074EDBCB4ED786F7E8C3826609533E5BB4CB80F3E515299EB757C217DA2806D26664F154C0CC2B4A644B224933502ADF5A66F5B54CD45A71589219AAC65BE0623CF5B4C0DF17E72CAB64B91BFBD903D75E164E2A0C9E2C997F36A0B432177DE617F5E6746BD82984BB9375B4A0A12E96D06045A3A984667D03D8C08CD980B59CB2B0983B13F9C53790FD43653E78255882F9B0C980EF6B062789332A6B67B2B78E9E370B78181531846B9980A8AF905FEF403F47B891A6B440EE71CC5D6BF3BA5C7B087A31123AB61EC9F2D0C89E1EAA7DAC36613A15F147938D32673402164B001975D9C4A8BA5CE84D20B47F26EBA5909183C6FE1343D062389B9B99CEDD21E30D5841FB68F3450A47F4C4BE5E8C413C37EA4D5AD629141D7430938158CD04492BBA8AEDF7477ED13A0B97C8217A300DFCB22DE05449547626D21409F491098162D7AB477E3EBAF0E15124F449F08E47D8EC6847A0AC839BC5D237B3D509A8B5C44C8FB6705A467A3D4D9102FF2B6ED976CA9D856E9F257D5D586C7D8A4C2617DCA73AAA65719A21538D9E6997C5637DF8C5A2AB98A169A5BA8F708BBA55F2C0A9463C9B4EF0C9822FA64ECC72C8BDA4030157BDE5073FAE6A6E6F036121125DFC5A9DCA1504A1225E6DA9DB4D0665F6413386153AE25BE78B3410369BBDBD84A86C6C7BC924DD70005BEC0C54E07B4ADFA2DAEB8265DD98BCB8968A2F683A3B07633AAA0290550665C01FDEB22398ABA31140FA7494FD6A0087194673F51AC7D759D649A2FA4D7520FC67138F445287B681F5C3D1678B497129BC6624163E3515C8381E85C173D6A4CC0038DFC2064A213C557931E2E7138FA1A6BC3EABA08965BD803BD5759332CB1BBC4C41337BCCCA153905990970C261CF63A53204B6F8CB228D4234F08837425A82F1DA9BE43775DF88A20A0381F70044C76B3524B437CF365CB131BAA14EA6F24502336762C8E126AFD009E1997B8B3BC20C246070DF7B33BC9A7BDFA8CCD576925968915F186CA4A5A4934528DC75282E246B0824EF7118D39DC1F07449A218836D47CBB7365B677EC7D6222ABAF33068B5730D9E674CC008125226CBC5382A76A9823DB1B42976C5C90C23BC02EB7B874DFF93699E6035A838B22A7126AA42D62682505F9BBC77143DCA061F5C38E99652FC2E28E30CA8D62127AF02186BD9C95602992E20BAA636AB050AB870B11C52DA19B3A68B7A07A8CFBE7BB016A2537E50464265FF6F065D7A8C30F659998A35D79032F887B4629D07BB2DC895F09AC0387CCA9C5CD1AEBC08A687798721F24CA43C2C5AD42D1B6641838EFC2A72EF210BAD10218846F25DA336A4C00C4A29EAC8A608F2261B8C76B18F10B7ABA755771376DC7B876152F9FBA5370262919511D4AD50D76AA5CD6566C29225DABB3B668608D9DE5BAC08320CFC3570A0AC8DEB4BBF3D941F9325AAF546FC368AF005CAAB7AC6A7DD70D90506DDBB5F53A83079ABA0927BD52A68E278D3F01AC19EBA6BD065FB6156ACAAC591F1BF3CE71C4A046BE8C6C55EB9A84D29569BD2B144C73E279238A80DCFD7C992D84B2DFFA67493E669243D4FA38C46B090BDF86BC548411 +ct = 8E4B06F53205ECA407728FC67D6329388825377114DA064425E780EE4F23C8CC01EB544DC02C70950C6F2193FBB7959E5459325514D1E76FEC98ADFDA3CD84A8FF0AB0AAC32A0E6C0D184D6B6AE5B020F3BCFA7612A8A8469E3B97CFDA17BFA20080B493451DBC852E9B59055381C382C12B1D8CE94AF1207408F2909E2BFF4C38F7D244182441DEF635C7B46721161597105271DEFFB3EB435F596D88D3B60BF26EEC93DAC19BB52DC05605668D9789EED2CC785112ED45B098D7CB1E26FEB3582FD505D933AF94265B100C998A7850F3A58937E6B3EC8FA19F229021C5441B93FE82B7D20B23EFACB18DB8208A141844386DAA9CE61BE318B0B410AD2C3FEE8B448C649908E282F9D172E62A507F26D1ABE910D98EDAEA3E8429CE1144522BFB938BF0509EF0454DCC4DB999AEB0F9AD283A3FDB5EC6BEC935182FAEE081F8DC6D42CF9DEF8296F2C30A691A2ED84E759A8EE4F3AC8BC3498AD3F7B96C9140647E81339107F1614E0DA2B0F53E0309F19E5FE6584C37F2931BB1BCF93B9FFBEB1A10B0835B27AB81672B2C2E65FE7D1B7F2C75B4247A8FD03F5BB18B0B45693495C5DFA4DC3C50FBCA60347AA9463333AD7CF27743FEE4E0C50D439834192E4F62CB29B3BF7C0CF222403149796916D4067F82BD26F00ACEDFF40458FA66DCBEA64A0C1F885812F505B120292487294D531C077C376D90489B70D51984E35B687C5DA6A153564A31515CFB9E484EE16F2B0EE8910AEFC2CF34E9328BA1DA84F5FA671C4E043BBBC19C032E7A871A74A9BD5F2F3A9722465861E19646E6ADCEEE098FD3356B6A7E356DA59052C2DDA1462CC1711C9B3162243E47E3BF45930D6F3313994FB1CDA44C60C0871AA424C9796AF27505D0B743D7AA1E2D5EA502301116FB607DAF2039FD6DDB1A5FE4D5A6D53A32E7AADC7C7AE0E8EE23F8F55A8643EAAC5A8FA38C1C631DC65F0EC02D3226A85092847AACB7C03A412BF89FB046606CB3B0C2AF16712286FE4EDAE49FC7A0526B2BE181C0074E62E2021A1F80651EC53A24E5B48F5FD20058EEAD3706E40FD8D9F9FE81212550425F2FBC3D2049035B267617696DE3EE56A11B4F6B7D9BC0EE61D570799F7BDA55065BDA83A15A252B1F587628F9D082D9F969A776DED5EAE9364BD9628C1FBD70CD288E515614ADF9DB015387AC8CF37DDB74C05080D993786642243B04F9DC44DEE0EC2C396478F8A6BDF08A0174DE3086A39FB0E555E159E862C997CEFBF359395D4D1EF80002EAB509144A619DE33307411919A90E35168AE2953054E0D2CB5805653BD6A9DE76CDEA4078B46BF6BB631CFAAFF55186F612F4A04B2A9884C9D15D5CE6964DDB3671F63059A5D38DD5E75DB1606057A9FA272263AA2CFD17D7D09989CDA1DCA94B94B1FDC691E6E51D7AE2DFBBAA8D82CDA242A98A78E84F4E3B5D8D9FE10D2503E25B9B3C6E0D9206310B7698EA3435B3A6AADAC0795B5302A653AEF8ABE079E412A2B2182883F4B80B76EA49402D966ADD85D72F1DEC212AA890D4CB7091 +ss = 387E023A733BBA407F35D4456A9EDEC3922B151C3B49C67BF3541BBEE5BDA18B + +count = 37 +seed = D882BA69AC8BBC88715F1C6387531F53273A5DAB87E66FAA8221A7F628D2BDEEE1CBC59C0E08D0ADD84520A3A70C1389 +pk = 99315A88D083BF5196F65CCA4541BD4CE3526E514DCCAA8ED176BA58014BD0AC486056240CE06C6C182040606DD98978D6CBA367EB0EC18401ED348743780DDBD277F2BA22E1B34208F215F8F91A048CA497EC37A7663587AC85F221810E64ACF87478A101062535287250907D0854B93A9D4BB39CD5788BE361C00FAA87BBE078B26353A51B7BDBA58D17E5496EFB263DF826A59296A13535ABD799CB931FA5886E35476DFFF97E82870653D5C4BA09C2658A9A22838BA0C6AAA4AB7B19699B8B27243C42634045506762AB1817534F419591B04622C650B828B3D4A66D9B163D09847BD172BA8FF452759184C07B11183665C0185E0A089C957135DCE64BDA52338B6492A27A1238AA567F017DFFA796DE84532FD5BEC8FA800FF4C5E34791CC5AA02901B73885557CBA188F72AB5A35B489E98AB377691033934029118A34AF7D176A436139AAB3AC127A8F510C8719936E8676CAAC2211C8292A42F274C7FA85C542B21422C5790079F34A26F0678C005818BF4981A2B4C7DB780C0BD43AD55C0ACDF1AE0E0761D7527813076F3174A1D49C74659A453E09C2B4468DE6F185D5F3C04F2B7E59E05317586E743285E6817283CA11FAAB44271A4667912DF262C0C03843730ACC24E80E2EE0251CCA86A83853E6251E3036714576B1C171A112E7A15CA215F63039AAA7632EC77880B89EF8A45CB0B3746202ACE1D7221FC98AFB73A28A6AC2AE443F16E6072D6B3DA1A3BE5FAC533A9175A5F176FE131F021795F8880D320C6096AB63F53525D01B32A2CA90E1A9138E4CA72502785976BEE4E566DC0CC1F3827733B0A7D00CB58B6B89C5E26D2DA00429A2450E269DA77C46B5C954CEE6BDC0339BA357A9B9951802A255B74A4F4CA1297D124056147A0F8123EB903071546D2C22723367308601A22F199F9588734FE1241450A45FD7395DF965F46574A030581CC714A50C08DA03A51B367B524A2EE4E56752DB9B66D9C6B07702EC23BCEF798D68300859383C5BACA9D8F08B71409AE5552209B5237E697BA55328A1693AF7FA0BA27020DE2C35F643514DB292C061C8E2085D06C101644C94D17C07560811C093AFE61C6B4FFB970382CE9FD25F76C6728108842B3841DBBAC62504185EDC32DFB817C45878189A7AC02859ECA77AB445797E030E910243B121A859A05D8CAA3C32FA54D033714D20A771C7CCA73999F6D91D4DB4683A9543D3C978F1D56816D75590642CD4AA7D9E9C709C6CB5AEA8832D7C84C576AFBC837B6615B8290078E2C0AC9A8CCFA8338B36649B9F7C41D0064DCA53B8FA1793CBDC8F7B75306F19C4127A214E5532884274646B91F49A1E36A3B42CFB90B27425D2645C5ACC2482289D0B4B84A6359007F23B9F528718E6C499590D6BB2A5BB674E89561AB1A48E3988927AC41D05BA143799214701B2F6D708D365BE84BAA60DF8BF7D969A425C93452A0277F218790C80C60B4B59FC6131E7865D1135AC84A6655507C1D98F6665C932093D61FA578E7ACBFDF49F2E15C138BAB4152C005ECC44FEC299094A285FF50B09388B6AC3972911CFB8ECC9F0EA58761741ED23CE16FC02AF5A341F65043F0802C0353D987C718FB72D3D922CDC861BB6A8AE003197C8F9C878A367C021DB7E9273FE2E03A2716683DAB6CAED5C770F6E7984 +sk = F8FB5BA9D24C8681558CD13593F0CEBB335B6F65BD5DDA6DE6D19E09F15165051F981AC6472B263CEC43883A79149707093066FC129AE148B04F860C2DF119F8A51056EAA5DFD89BFC564226E56DC391ADE1CC2A1DF58EDD4572C5A147BBE21283B97F1B213BC276A471B63A7DF1CDC86C7A69A34ED17A425B37AEF969C1CD079529BA29A2E2C3412C5615E23523F3124C00C778752BB9B3677B90885CC21B0E257BB7F335FD53928B737D19DA3B3208219E6C898E96B45F801135A09A1425A0986C597E2B4042C1A4E6D7A4D0E30E729C73F2BBBE85B579C3C13A34344A7403B95D425936486C3B602804C08EF6F5AB22C400B9523EA3345ABFE666023BCE6A1B63A872C33E3AAF0CCAC2C40A4D5A48107D0C7AB09001EA67CA6F4C1FA7137D259C860D032C396BCBCB4177F82439852463B640855CE604F91C8F2E4A0899B2102C6059DC077D5EE6054355C546C2148077B8DEFBC313C71F1A420DACE126B16C21E40064E2522F9E224CC8E3526B1A99A2F4A81EFC2DD3609043246D461C7C1AF025B56A9C7E72ADEA57584CF044C2F0BB60352C32400D1631C034572EE46B71EDBC0334031AED7BC26AF543028C3918109DA52A6ABF3217A2219C0607BA9EDAB5B4DAAD5EC7948393C4A670C340688541AA713B596843E5CCB9616B54E92610539BFD39159FAB36D4928EE9CC8B1291AC0134257E242FAEB595100AC113AC416FF517866021B550B6D063512DC37477117D025964C95C13535C2F09A96740037FE1846EFEC4446EC03F93FA6B6FD8B539F0196444A61823B08CB74B7520618C08324F0667F142BEB3A34C2C5286B3D159FCE3B046079F07E558BA28A8893A8C94F9711C227FAC6900114C8BB6AA5369B059DBBCA008482A1843B62A1B06C68C6B2F40BAC6F02B6CAC1633055A178A396EF35F59F1A76543953D3B07E2B8BE217C5D5B1A82F9C080F4119D22275958026280BB8C96626C1D0BAEA6658A29546E09418AAF85A121F8647CB4789484BEE0189B9AB10852C397A2E25B9B15B71EF17440DC3554DB740289BA05111979614AEDCCA79699021F4BC3A4C68B39D0256D88CDD7A24E3AC31DAC35388720671A12A765D705F8429D0891C3E0D8062AD45A0B882BC53016DFB007D1C550998963D7E12FA51C7361D86156EA3A8AD7018C627A9EA18F9D3787AB3B88A27B3F9443AA87AB75EB1364A4C66C50E8170892A08FD15CF2913749D0C61305C4DE45A1BA2550009726A0873C70049705009DC8327BE3610F61F9BC60A26D14DC0C3E67CDAE4B5AC0D5A0638804D6C6B4CEB351F0C19F0974324CFA28FAB704B4677AA3F2BF65686C22100B74CB9AB5F7215452CBE8D6909754304573A9314B3C8362CFC34C6302B3CBD5DC482E76576FC5900B367016C03A860A88744928CAE55413231CA8A5008D210CD2E317D1BB6BC8624ECB83002E66092D8AA77FA0C6766532178A8CFB532C70F1114E5156E91486C3C7658E2A22CF0A77873C944A5A4BD70BA1686146E18B328D30813C9850C3003698C5AFA2082B3425C785200596592FBFD7B2AD5568F9D278FA24C523251BFC966A69CA882E707426563D2E099295305FE2E2A96F968A92E9423DC4A1F6662F68299899315A88D083BF5196F65CCA4541BD4CE3526E514DCCAA8ED176BA58014BD0AC486056240CE06C6C182040606DD98978D6CBA367EB0EC18401ED348743780DDBD277F2BA22E1B34208F215F8F91A048CA497EC37A7663587AC85F221810E64ACF87478A101062535287250907D0854B93A9D4BB39CD5788BE361C00FAA87BBE078B26353A51B7BDBA58D17E5496EFB263DF826A59296A13535ABD799CB931FA5886E35476DFFF97E82870653D5C4BA09C2658A9A22838BA0C6AAA4AB7B19699B8B27243C42634045506762AB1817534F419591B04622C650B828B3D4A66D9B163D09847BD172BA8FF452759184C07B11183665C0185E0A089C957135DCE64BDA52338B6492A27A1238AA567F017DFFA796DE84532FD5BEC8FA800FF4C5E34791CC5AA02901B73885557CBA188F72AB5A35B489E98AB377691033934029118A34AF7D176A436139AAB3AC127A8F510C8719936E8676CAAC2211C8292A42F274C7FA85C542B21422C5790079F34A26F0678C005818BF4981A2B4C7DB780C0BD43AD55C0ACDF1AE0E0761D7527813076F3174A1D49C74659A453E09C2B4468DE6F185D5F3C04F2B7E59E05317586E743285E6817283CA11FAAB44271A4667912DF262C0C03843730ACC24E80E2EE0251CCA86A83853E6251E3036714576B1C171A112E7A15CA215F63039AAA7632EC77880B89EF8A45CB0B3746202ACE1D7221FC98AFB73A28A6AC2AE443F16E6072D6B3DA1A3BE5FAC533A9175A5F176FE131F021795F8880D320C6096AB63F53525D01B32A2CA90E1A9138E4CA72502785976BEE4E566DC0CC1F3827733B0A7D00CB58B6B89C5E26D2DA00429A2450E269DA77C46B5C954CEE6BDC0339BA357A9B9951802A255B74A4F4CA1297D124056147A0F8123EB903071546D2C22723367308601A22F199F9588734FE1241450A45FD7395DF965F46574A030581CC714A50C08DA03A51B367B524A2EE4E56752DB9B66D9C6B07702EC23BCEF798D68300859383C5BACA9D8F08B71409AE5552209B5237E697BA55328A1693AF7FA0BA27020DE2C35F643514DB292C061C8E2085D06C101644C94D17C07560811C093AFE61C6B4FFB970382CE9FD25F76C6728108842B3841DBBAC62504185EDC32DFB817C45878189A7AC02859ECA77AB445797E030E910243B121A859A05D8CAA3C32FA54D033714D20A771C7CCA73999F6D91D4DB4683A9543D3C978F1D56816D75590642CD4AA7D9E9C709C6CB5AEA8832D7C84C576AFBC837B6615B8290078E2C0AC9A8CCFA8338B36649B9F7C41D0064DCA53B8FA1793CBDC8F7B75306F19C4127A214E5532884274646B91F49A1E36A3B42CFB90B27425D2645C5ACC2482289D0B4B84A6359007F23B9F528718E6C499590D6BB2A5BB674E89561AB1A48E3988927AC41D05BA143799214701B2F6D708D365BE84BAA60DF8BF7D969A425C93452A0277F218790C80C60B4B59FC6131E7865D1135AC84A6655507C1D98F6665C932093D61FA578E7ACBFDF49F2E15C138BAB4152C005ECC44FEC299094A285FF50B09388B6AC3972911CFB8ECC9F0EA58761741ED23CE16FC02AF5A341F65043F0802C0353D987C718FB72D3D922CDC861BB6A8AE003197C8F9C878A367C021DB7E9273FE2E03A2716683DAB6CAED5C770F6E7984CED77D358342759291C2BD225B0BD82D659D28A24BBC5EDA8F47975B780CD1291F135CF64B6403E103AFAE34DA038613E2853BBFC36BAAFA3C6A95347193F37C +ct = D3327E35289A936A09CDD9B5FA00BFD73B28FFCB330E1CB018EC9970FEB3CA6EC7FBA6F9F8EAECDDD84B38C52BB98519E52FD7F7B91249C091C7543C142F0898D489F811BCC6F6A8ECC355C1957FE73E8ADFAADEF10495AE5DAE171DEA5965C3F303D9B731A5579089B1C99EDB32BB02BEC73304CC2F3677571FDA0BE46A90D36CB6A2F3DCEBFD7041ACB2EE2110676ECCEEEBDF2EA834765D9984BB335AE06CAAD76DFCD95D385E91C63D18702989B8C739F59B129BBF421FBA018E04B96F5FF08E7C05498681E129A1D84C378DABBE83E9B7EEA55AE4BDD1FE7B5544F6328E82899777E2CF76A4B23B6DF71F76A8F0475B4A587D8A0B8D12FF0B76CB59BAA831F6F7901887FDE2CF58B0661016FAF6BA44CADA98AB984A7BCBE8448C86B1E7E1E21873B034E0ABBC0A9C77BEDD69FA62278C41A08C83AD8B3E3EFC601595860E6ED1A1E4EA6382CB92009CC15CEFE8095604250593032F1E4F4564FAA616191ECFD79F8DAE40E7831C7B23DB7789D9D3270ADA144CBA1938D6FDCB1EDB624D8DDE05CF82E13F422C05883B6EFD9E0EBE538E3D7D6348B205DB5D282AF9D77AAFA42152EE11F58E2773E2666CFB3582C24F86EB8B20353231F5C2A5E91FBE2E40351D48DF2C7207FF2E77AD345DF3A79371E8D5A0708967A979C9114A887D52AF199EC2445CD21478876D097A0CC4212136AA12099FC59D6E2296C4FAEC109516C8464889DE22CBA68DD230BAA33A544C8A01EE58CA60D3199E90B9E2E262C68FABB8E255CFF75DD4280AB779DED376751473DE107CD1499C85D2B5876A4E0284406140692B4F1620BC945F737557EF3ECC54CDF0833D7A7E5085FEDA3275C991B533DFB25603826C88DFB0EBA60A709D3AA4AA69B5C04D455257F9053CD2769161281D6B5C60EF7EF10D10A1D7BA229B667AA9FA7BECA9729EDB18A166D991B57B15B1139F63B25BDB1BEFF61B38ECEC8DCBDBC984CC164D92E6A418F625B59EE736B66C154F9ACDC5B30FC3105E87CB2FF8ACC4A85AAFB2042C0F34C1D04CEE54387251D89AAB11A12953BE99960A5FC9AC1D384FEE498FF315531F50A7D6D4EB58814E224569ADE954316EDA1C2EEA60A39A97361547F82D7971BF27D5EE092BA1ED514552361AE54616D1007C7688FBEAC04AD4E3B9DA9B96ABD4D3A5284E008779297A01234D8C2A51727D9C8CE9715882A948A3B93B87EFA6C9821D439ACCBE562D00EA6298B304795606DEC5AFF0590E55516C9A8BE95E5F2D9B5AB426B294D75A0F689F8CE080CF01080FA1F1712EC169508BB7C49BD8D3F65FB12028437C524C5BDB1A72062D7D4928595B55E86787469B81D4BEB8A0061150A7465D36EC838249AD80D55E6F7B5EB92C62D381093965BDFD3810050A43E7539D556FB4C835C5E4AC6156BCC5E97CA5F85617448822EB529FF1F794C8FDA9E5D222C1BE8A3B68AF5FAC61CDA9996EA1E6B4394E9F7BD74A70C7A766CDEAD893673F7C2B54D077BCBAFF31539CB9836792149C563E52B1D08EF2748515781237C8A6 +ss = 4D91655D2BD77339BB81F82916A1A77329071B3919CFB35CC1D1655C2DA5A2F7 + +count = 38 +seed = 6C3AFF39F5D097096D882F24717718C8A702382DC4AAFFD7629763FDA73C163CF084807BBB0C9F600CD31A7135F48AEC +pk = 2E7240107059C16C3EACF4A1A8342B73911DB6A51D3CF12BB168229A1B29F7C334D0D1AD99932F21BABFD8153BAE937FDD2393D9748518F12689CA7627A1041D868094AA7440C6724B4430EBD20776B602940C9D1FCB5A109978573434DA891962B645002508E46992C0C148F5A039609826BAF5834BA7271C443B69DC5110C4B7089068D16202CBAB2E1E4525738A19C8315FAE806FD139BE91F4C1E192A2C04983291340DAD4018A8A83C27A57C622408F933A51B7618148B16375A80E0A901F10AAF6E7803CB2A693ABCD4CA8BAFB942086F42F6B743937098E3D2A607F212F766603C9D89ACCF7AC584491F230BB1108B1465B865F824215D79FED2525D7E95C7976946E22A9E6510AFA2A9E8AF29DDB65C47BE8820561661050B70EF3B7BB249B7FD0CEDD688C37D7A3DE667626C2B389B38BE066089405703BD51FA32199E9C83D5265BD62A2AA2CE521B69973A18777E32151D3D5BA1983C8659A79AC978FFA15CEAB733B49EA8F7A853D4B06CAFDFC64C9D00E55D814536171496037036A078D026164D7B07E3277B7ECAA770B06DD291B9AD29241C3BB43553BCCF66A1DD81FE2E2BF79F1A21E1539D0BC517A9BA8EDE2C39DEAC4CDB7C65FF96048461BA2E350017095A35C1BFA25C242B000AFFC8AF29495A2D349133C343D680EEA815CDCD89C4FC283CD5136B89ABD473B4AEFE2228F4CBA5E0C10EC7A1083833735F081034AA7BBF20C11319CA263B52262096E505C45805E73619E2CEB242E559883D20DDDD4120F0C9E49F4995376284147CC2D2A96A046BDB3F56B6DC1889976AE1ED732EBA43AF5941831B2202D6091C16B680001A82D98CCCCEC212B79B5A884756C75CB2545316FC072D903C670864D5A13534E545D836276EE594D3A7841E5F91D6B738D97E73A7274671D6470CD2719B0515FDD67C6E4969AD213254502C5AC9BA23C264A375237369B46D0C45745041A20511459D3321EE9B395978F2C575EBE1C6CAED03AFC7027BC457E03F527B0CCBAEC71850E0955F0A2B54D9BCE69B6C8FBF90850168ADAC411AD5C973B578424C55CE01B3EC2825B0085232469968B8A96FE7B9F26846F789323A15AAE6397242A712CD26B0465BC038A4AA30DAC42C0036C062C21C3A4178A0C92B8992CBD54A6044B789D943F1EABB0BB24C3D0D4C067251779374579B27C84FB435E6C745334485FBA84676750A27C520F79366D008E4BE93FE8A958E8D06B8EC323BFD5BD01E86B1F13302EB17AA3AA8FDB3445AE5775111B2124E2A35021C04945661B2C510A29264AD855836C7D8EABC069011F8814934BB4B32176C0B59B04C5FB6CDBC8BC41B0BCFEF4423635C0C7AC43E4D5286C74920EF37C951266B92074D239B2BD0A0D6C096141FB6A718A213A3387D75B927CE176169738ABE0CFA6B68D3B064157C3CB03C5793A7400C1960351B059E43A7F1B28AE5073780CC606F7E40AEB458DBE95A31C23AF7E760001B0BD601647AD1805C4329E46F490575CA928FA908B5A30FD31520C61C9F1CC5EF18578B350A929164DE33B008338180CE41C45327152090A91B8C9B3928C2629A48D78ABD1992720E841A52CA91A15A1C7953D18B4BA1F990AF34CA408BA2D449F94385651C3B4C0503726CAFA118167110E848FBED995526B458D362061A1 +sk = 5B47B61CE23572623C431A498E378C6B71A5CDCCB58E225310217F6F2B1B7140B97349B965D9C95332A66D7A9879F24C479851A0EA485254755DB347BFF9A06D00502AE3A910C06771AACC0A51ADD07A291496AC10E2899B6562DCDA7B6B9B7EB516335D222C43498859D87A44CB8AD589A06E609FC5798CA06744051533D5C6154608C790A8ABD776CBD2984B57E1CF4E0638C77915DD89249D3C0775B45CC159B44BD32F49A51A1E398763E35DBF5C6CCB100929C9B91047A1AB98A140E00F77F5076310C33179A8C80449591C4156C244EB8C8B3009328139C18F8C59E1961A2B91C840D552C2E4B3897265B16C28DE6ABB72D218EF713A1D179CEA38561663C9BF21B68166AAA45748316877A9A5BED6F5230D3015193AA5A9E1B34DC6576B57692B543FFF321B14879A24728DE3D6A297C06AC6CB28EC3482DA708ABAB28FA815272624AF6E26A879F65C6432812470C52DE01EDCE20681DB43A967069DC9BB34F9C540A21B8D7322A3675FEE059F5F655CFC480BA31255E899C48A7C25588303D67055434702ECCA24D31A9D69796DF408328912ADA084AB122C6AC53C3C349C105270C9AEAC73923614EA9129CE4C9FD8D78BD33045D8557AD3D0A698B34A7C073B93783670662F8558375647747905402A6AABD1698D1D3B430CE8B5EE8665771A34CA73B2DEE04497C997C9E74044230690354B7AF23BD94AA02CF599554391095C0D53F5C1DB19AC33189B2B9AA3C48BC4E09BCDC5029BD3B45A370C59045ABCBFB257DDF30085DA053056C17DD0B5DDC6494524875AC189E6C7A7CD483288F03ABC155BC2022EB427B7D5093F4616C124B7C29A0043181C7BDED83DE7592511E3617A75652D4568D7C7B3AB2B7464C514CE6CCF54FA8D73E61834E534966620DC59196AB44B736151A27C02E065A000611542FC296A69A24989331EF980F708142D7274EA863669A52039B59D48B90BCC75CE4B434F5751CEF621CF3A29873C003A57276128E70BB4AA5DE581834946741A8134890491D37B6051959739FA8EB81C6947141704683124136C1C382760E13F00C59AB5BCBCEF98B973831B91BA87FEC02216619F012859FAA6B01B1649786B626348182398226CF794095681D1C25800B18BF33CC71123898AD2AEE46905A8118916BA8651328A051697F8041667789C874394E96A0EFCDA8998D420684217952496AE9117C6C618513C147148979F5C8BFEF8C7CA1836430C3CFB66B17CBCA63ED1A2157961CEE600617157AAD986B5021F4F69C3BEE6AE181A076C3CABF076903BD59814352F4EE2C04A138AE0EB018A2193CED58981CAA3BB032317499E6EC4BC5CFAB8B389467EF295DBE7305BD1CD099364D7596B1801008ED734D7775C5606AF0F1A2978733DD7F55556DBC5FBAACA5A95BBC287B6D3A43AA9B78AD10A025F46AF233512B126230CF928FAC14D753160BAD961BDCC4D5E1B4EDD241609A0ADC6B3C6CC9660E5371D6C1655B4465F16D535ADCC54F8376371B758CACB81D84A7B3E6B8754B430C0753982A89D5CA8B2F4244AABE0BF05F75ED0B092F332AA83808F897BA21906AF25E68A88B61A357A10ECE1977199203E465EF9BC020E145F6421ABD11B182E7240107059C16C3EACF4A1A8342B73911DB6A51D3CF12BB168229A1B29F7C334D0D1AD99932F21BABFD8153BAE937FDD2393D9748518F12689CA7627A1041D868094AA7440C6724B4430EBD20776B602940C9D1FCB5A109978573434DA891962B645002508E46992C0C148F5A039609826BAF5834BA7271C443B69DC5110C4B7089068D16202CBAB2E1E4525738A19C8315FAE806FD139BE91F4C1E192A2C04983291340DAD4018A8A83C27A57C622408F933A51B7618148B16375A80E0A901F10AAF6E7803CB2A693ABCD4CA8BAFB942086F42F6B743937098E3D2A607F212F766603C9D89ACCF7AC584491F230BB1108B1465B865F824215D79FED2525D7E95C7976946E22A9E6510AFA2A9E8AF29DDB65C47BE8820561661050B70EF3B7BB249B7FD0CEDD688C37D7A3DE667626C2B389B38BE066089405703BD51FA32199E9C83D5265BD62A2AA2CE521B69973A18777E32151D3D5BA1983C8659A79AC978FFA15CEAB733B49EA8F7A853D4B06CAFDFC64C9D00E55D814536171496037036A078D026164D7B07E3277B7ECAA770B06DD291B9AD29241C3BB43553BCCF66A1DD81FE2E2BF79F1A21E1539D0BC517A9BA8EDE2C39DEAC4CDB7C65FF96048461BA2E350017095A35C1BFA25C242B000AFFC8AF29495A2D349133C343D680EEA815CDCD89C4FC283CD5136B89ABD473B4AEFE2228F4CBA5E0C10EC7A1083833735F081034AA7BBF20C11319CA263B52262096E505C45805E73619E2CEB242E559883D20DDDD4120F0C9E49F4995376284147CC2D2A96A046BDB3F56B6DC1889976AE1ED732EBA43AF5941831B2202D6091C16B680001A82D98CCCCEC212B79B5A884756C75CB2545316FC072D903C670864D5A13534E545D836276EE594D3A7841E5F91D6B738D97E73A7274671D6470CD2719B0515FDD67C6E4969AD213254502C5AC9BA23C264A375237369B46D0C45745041A20511459D3321EE9B395978F2C575EBE1C6CAED03AFC7027BC457E03F527B0CCBAEC71850E0955F0A2B54D9BCE69B6C8FBF90850168ADAC411AD5C973B578424C55CE01B3EC2825B0085232469968B8A96FE7B9F26846F789323A15AAE6397242A712CD26B0465BC038A4AA30DAC42C0036C062C21C3A4178A0C92B8992CBD54A6044B789D943F1EABB0BB24C3D0D4C067251779374579B27C84FB435E6C745334485FBA84676750A27C520F79366D008E4BE93FE8A958E8D06B8EC323BFD5BD01E86B1F13302EB17AA3AA8FDB3445AE5775111B2124E2A35021C04945661B2C510A29264AD855836C7D8EABC069011F8814934BB4B32176C0B59B04C5FB6CDBC8BC41B0BCFEF4423635C0C7AC43E4D5286C74920EF37C951266B92074D239B2BD0A0D6C096141FB6A718A213A3387D75B927CE176169738ABE0CFA6B68D3B064157C3CB03C5793A7400C1960351B059E43A7F1B28AE5073780CC606F7E40AEB458DBE95A31C23AF7E760001B0BD601647AD1805C4329E46F490575CA928FA908B5A30FD31520C61C9F1CC5EF18578B350A929164DE33B008338180CE41C45327152090A91B8C9B3928C2629A48D78ABD1992720E841A52CA91A15A1C7953D18B4BA1F990AF34CA408BA2D449F94385651C3B4C0503726CAFA118167110E848FBED995526B458D362061A12FDB7C7E39CE1625C20A13A1C91AA5909D8B03B064D00877DCE2415020370C7262D7033947AE42CA53522A65FBAFE18D3BC3E0CB66164E9A094FE4B44D8977ED +ct = 1B064FBEEE1ED7023765654313B62170F23F4C7E4AA5F23C5498E7F5F82A8DB67780CA831E660289BEED5DEB0C8D6D49E8CA85AB1738EF7F0C487F61BB2535730041398D2FB4F2FEB04D4B238C3DF61784F226D31BBFD6D92FA486B344E713506F12F625653380D8CB3FBD2095E9CC32973194561D9F2B6966D17133936CA643105F9FF845760596BB95D12E7F9FBD5DFC36AAC052D64A7C08E26A641C938D83AE795977FD5D2757DFC9166B38687043CE1DE9AFDD799FA18A164269FDBAF52AC4B1DF518DEB9138D55D161018BD64B74E125943F42FF6548B2C673F647237ABB78CB3D87CC9B980C1D5F46B1E73AAAF600B628BAA2FD4D20A466DFD4B3F6EC33E91497280B782E5D4D94DC40907D0CD7A53B99948E8D39C1E059ECA344D697D009EA926E95957A10B401C436A95133A219DEED9BA76A8B87D2A9F6D0FC9CCFA183622F794A1CB29061EE4561796DA05659FCEF032A65613DAB8CFD117F5F1CEF02EEC44A13956FE83E796FC8E5F4C589B8574AE1E1E702A97C6268F34E809BE6ADA4BFA00D9EE7F890A8E54E1A6FD0F33C111BD835466EB64C1622CB349B1C15D648CE49C951391ADAE8380CAD2EF3D615DCCF177294072FFDD678F55AA814DF60B6FF875B28D2FBC3BFE3A2675A63E4CFC60634BA08E6602D449D76B29FBC7AEB54E97550A1995C6A9B47A48E6FF23CB62D35520BDC492F1AC12CCB9F18AF78C92494F22B56C684917C0A768D030426121321B1EA5B41442A791E7FD036F7010C25EB45FBC472F526C82C956F0D3AFCE7C16055FC470C61CC3CA1F05ADFDB3DF3724C5D38D9289E49D702E620ED0749D5C13376CCEC5666E8F46B60BE05D005E1F59DE58C70833172A0E0728A26C6658AADD56A9A1145E1C1FD6F3077E75DE450137166445DBC096733DFC8B8BDEDFD13F2E8FC53432F794BFDC09E9FE2070147A8EB260A4069B097CE368A7171628A6D06E5091A85CAA5D9819973ED338AD1FDF261E8A4C70DB6E78B6BE4B908D5CD3A875F321A24C4D1375AA6A97C76489D005E475ADD32524DE9B64E4468B44CD0F730B10219A0FD481800FA857C67ECDE250AF0EAFF95B43E377C32BE2F794ECA806F09E10EB4B0FB038E07535534CEE9816BB4E6EF0244043E49B2676F837079F2EE3CE9C29897202D75EB19322E6440C49D58E984DD441231A79D479851A0CA63D33E77E3191CCE8CA1C69CFBDF06D63AA52D1CEF72AB7B3F57C179B7C382F1CB7749C197C9BB0B501F97E96E893AC60336C8FA3E97631E770C3F2F544805767E3BA0FAB80020A42CF64858BC001D156ED33336F8207A439A82F07CBEA0D00F5D5942C1E9528034F60875422BA40F0AB503E32E61514ACB3D6F3F3F4AB1F9EB6AEA8BB6197E7EB0E143223532DE74B12834B889BE7DB31B93551CAA8F464E1F38F8F882A252682623459CA11DEFE125334FD0C0718974A3B6DCA46FEB0AA49D104ED96C301537A3174AB466DBB164AD68B59358F0CDF1D8A159CCFB9DAC867424F4504D3DE7BC0D686E24967A57B70 +ss = 3D0D1AD5E2825DB1F539515AF2392F0D212E8166B34F3D8CF2EBE97E51785EC0 + +count = 39 +seed = CF520B92A2E3677AFD003EC1EC6EF136A709D78F828C9C0DD4946EFBD451C5FAABFC83CA66F9D3D17EE4220553B7A69F +pk = 45FC2D1BB1872A743763F12D29D937F3F2A41D257531C1172AF59C90806C7E5A15972A8CB9DCA049BC92700A72B4FA5A739033437C946EE062AA86C12103B557822A08084BE63C4C74D1B92608C3B02C6520B2991F8499470114FB659F89A937A25897FABA6C0DD142D8D4868EE3C6483128241B287CBA0AE49430DD6A28D1339605A4B750E6029F73BAA1FA8CE6219C36A40E5542AB45CC781A613FDF416502743DF8CBB3C4B864D0B448A20C0B0942A829601F2B131FB038587A99B80EF44033061B2E4B8F9A12C3C03193506B62AA1C7AB08569C7D0A88C8A098F87061EE41000FD202E2C3AF4E625B34787BCE55F74AA58EEB9124DE7089E51A581893354B36FE035CE5FECAB74018EE6209B75FC2702429C932ABF71D89B8C82C047D77725CB6ED98608F2BA0B3462C1D428352C6376F6269D9869AFF4BC821870B63F2284D296677B6145683BA6282C12C72512EF015EB19BA86B3571BE7438F17311655C118A530266BBC6D9D10636B6347C630607864949DABFA558522C100F6C7941A076109253B5FFD76328C99590F48B3FC7AE7A5847CC958FA5523F540AB54EA0A302174E6C401341759C121B355C9280D2AB6A84F9028634BF7E3CA90679ACA188667D5086DF35B88D95B262E8478561A414B627F43B0FB8731D3BDA73C6396594694A9F7024CFD55D3AB88342516CB34A922E6835EB8C067BD35CE0B3711D7BAD2D7529464C493ADC40D8EC8679C903E8984850034EF4A828D3FABCAE9474F7278CBE79C8E5C1C948B94798D4C68DA8255237AD8B0B38CD4A8DFDE5ABF6B2CFAD98A677A8C40E208206774661490C3C212D23327A46A23DD6855275B78D29830B23900B13C638E31B4745A917D4FBA95A04956C371212E475271CCF94F6295346118806316EC01D08454B0CD922D6F1A3E4A651A7A931F380042A09244BB39973EC5872C28C8D41C4BCC72CA4409A363C49995C45C7909522128C03814612214A5EB01527B67BCE4463202CC14E31225B36A7D7D10E26966BEB389877AC0062F9172C0517CA8676F5A44A10106FE75A31A4AA86688C075918A4D8A7461DCC1EA1193913C259E3B44C2D976EC67613468358886A9108ACC7D0C6A25F5A991D7C53B8638C24A585F07AA074B5A2CB514BF7178E14112C8B31727A38BDD20A5AD087746768957F837179D50D25F6697F4A88D056451A593E385B74DE8A01CF0244E70AC9AE36B2D76CB91E5419165C6507D141148869D6676F28645653BC78C96B9E7F382CB0C6768E2968C513C7AB076928781A6530CD3AE3286B0C681743A58D9C524BE5120C880605BC139F672E30174095932A000800D58A926CF40873C44AE6096940A3BDB6E7966595BB3D23C9915BC7E29AAAC9F0344C9B6BBB25CB0AA084F616332197295163989E1448784082C327075DACBB7D912025E4786710B0C7452F827ACEDA11A73ADA09C3E54B404419DBF3A8F8B6096A73528DC50FCD230155A97A614663174683D1095D97B7C0E994764DF2095AB7BC029B7DDA3799E5A88ED825CF1674AEE01BB0C17A5C84B8AC1BA061302BA9CC20CD46F769E1021C03C43AB07BAB1BB0C7F3426D252A15ED5A27854CA7B177A6F79502789842E229637FD32A677F68DABFA371062D8B8CE9DFE0D90BF06044AC3A840CEB626B16E134 +sk = 2C021F19322A908456F1677D31DC8A4A2A734A2571D19C421C47AECC507C3C53A931113290B693AFD1B7FFECA87CC90B0419C48BC4359D64146D9932BEEC78766408F59216C692228FE59B768C92F4D5A3CCFA6A35599DA2695766D754C1F682AB13C8966997F37A74985551C36828224C177D3A3ADE3C2C20A907C830BC32906DF70B021B47C38C606EF951ACF7C1512AC15FC0D761C9057A7DB1AC6C56198F9A8ED2F67A0F159A5EE6612109254D57745736CC3CDB634F5658FB684D805888FEA8582135BD4890343A545E4E0A6F0C130B8539125AB06358F8BCC0A4B44A7A4903D018C960CA45779BB564A30CF1B340B4C317CB77DA50BF899C10B4676F3C295B90E93C2540A9E17C3BDE560F351C81C58B545306449585718E9199A6302E3B0CA1E737C07A4B7E21EC154604590D415F4B82778778905360CC2E49BE4B08C94A744995F18959D4492F0B7A3F53A98F9A8D914863B9583D866712FE583FD2677E8A3B8BA5341902178824F4C41BA21CBF7A4B666ACB413C31CFA744B9A5405EFC5B53A2C64481270484134753C1B0407E23B95850A8C026843643E42B329BCBB7422DF5CBB968B04F39210A4EC959E1B5C9CB32A180588B9BAA690F7459B1282D9E9200BD1A0E910A3EFD948C3BD0AF04D866EDC61C866B48D7AA22E6FB5025C6892C66116E271B998B888E0481ABDA592C8B36F7464704FC22C51B5BA995928FE03594A8073AD790798AA304579822255E61D11557092BC9B5BD4C94068C60B2940C180831C5167487B7538C9AB47DC268215C8C7F324563D3973FA73BBAF07C771B15070D880478D2693535425FCCAE0F8272CD7224F3795A70241D480425E4A74922309906E1C11C5107E9F34FAC3536354100F911234D55769B763CF2408B9812AA6B7C2601161953CABF0733CD3AF819F5158A136621FB159DB3DC6C3F3220ADB8ACAA8CCCB7CB2EE583B9909C903FF43612D178C568AA7E9217E345CF4DAA9AAF17CCA1B5A4A5A73CE9B0581E73BCC019BCE2B68C8C273DFE588BA0861C5A73A6EDD9BBDD66935AF04E5EA81A55D62C9A8C51B3E6A402587FF4F837C16380AEF5640F333DB08A6CDDB425CB4189ED773D8ADB91E2708F12B78A0105BFFEE30873C1B6D5D5469F6464705741EC4310A8185A1553372F6091C769109F19527E95A6802C2A49127077B21126E7531A5941298BAE199309CBE00D97513BDE1AC82292CA1A76957D20A306932F83994A00F21D89519E16138F0477667F338A67450E1248A682142A79D9AB6B58B88754362A32AF3402D062A554CA8A40DA0481BA721A9B023DA71987B744C6B9AB5E80830F8B7200241007F0EB72AE3694EE92814DF4B1DB269F4404CD0C77A844D2B751F5A0BD1CB93D61A628098D0EEBC941827F77139831575B98E47B7DC3676D887B56D0AD96BCAA1F280049776339CB3FEF6489DBD26205530CB08C53FB0839B49909864AB06B2C3FE15957DDA96CCDA90C51904DF02C6A1E5846F892A1683838B9760AB900664A1A039B6A1C75F9C4B05340EDE9881F48869DC881DA0191E24BB5AEC448EA052E57E69EDF254575FCA87A1B50E6D39520630688B04328A70CA1A871FFBCB0A8823DFD4747DC859B45FC2D1BB1872A743763F12D29D937F3F2A41D257531C1172AF59C90806C7E5A15972A8CB9DCA049BC92700A72B4FA5A739033437C946EE062AA86C12103B557822A08084BE63C4C74D1B92608C3B02C6520B2991F8499470114FB659F89A937A25897FABA6C0DD142D8D4868EE3C6483128241B287CBA0AE49430DD6A28D1339605A4B750E6029F73BAA1FA8CE6219C36A40E5542AB45CC781A613FDF416502743DF8CBB3C4B864D0B448A20C0B0942A829601F2B131FB038587A99B80EF44033061B2E4B8F9A12C3C03193506B62AA1C7AB08569C7D0A88C8A098F87061EE41000FD202E2C3AF4E625B34787BCE55F74AA58EEB9124DE7089E51A581893354B36FE035CE5FECAB74018EE6209B75FC2702429C932ABF71D89B8C82C047D77725CB6ED98608F2BA0B3462C1D428352C6376F6269D9869AFF4BC821870B63F2284D296677B6145683BA6282C12C72512EF015EB19BA86B3571BE7438F17311655C118A530266BBC6D9D10636B6347C630607864949DABFA558522C100F6C7941A076109253B5FFD76328C99590F48B3FC7AE7A5847CC958FA5523F540AB54EA0A302174E6C401341759C121B355C9280D2AB6A84F9028634BF7E3CA90679ACA188667D5086DF35B88D95B262E8478561A414B627F43B0FB8731D3BDA73C6396594694A9F7024CFD55D3AB88342516CB34A922E6835EB8C067BD35CE0B3711D7BAD2D7529464C493ADC40D8EC8679C903E8984850034EF4A828D3FABCAE9474F7278CBE79C8E5C1C948B94798D4C68DA8255237AD8B0B38CD4A8DFDE5ABF6B2CFAD98A677A8C40E208206774661490C3C212D23327A46A23DD6855275B78D29830B23900B13C638E31B4745A917D4FBA95A04956C371212E475271CCF94F6295346118806316EC01D08454B0CD922D6F1A3E4A651A7A931F380042A09244BB39973EC5872C28C8D41C4BCC72CA4409A363C49995C45C7909522128C03814612214A5EB01527B67BCE4463202CC14E31225B36A7D7D10E26966BEB389877AC0062F9172C0517CA8676F5A44A10106FE75A31A4AA86688C075918A4D8A7461DCC1EA1193913C259E3B44C2D976EC67613468358886A9108ACC7D0C6A25F5A991D7C53B8638C24A585F07AA074B5A2CB514BF7178E14112C8B31727A38BDD20A5AD087746768957F837179D50D25F6697F4A88D056451A593E385B74DE8A01CF0244E70AC9AE36B2D76CB91E5419165C6507D141148869D6676F28645653BC78C96B9E7F382CB0C6768E2968C513C7AB076928781A6530CD3AE3286B0C681743A58D9C524BE5120C880605BC139F672E30174095932A000800D58A926CF40873C44AE6096940A3BDB6E7966595BB3D23C9915BC7E29AAAC9F0344C9B6BBB25CB0AA084F616332197295163989E1448784082C327075DACBB7D912025E4786710B0C7452F827ACEDA11A73ADA09C3E54B404419DBF3A8F8B6096A73528DC50FCD230155A97A614663174683D1095D97B7C0E994764DF2095AB7BC029B7DDA3799E5A88ED825CF1674AEE01BB0C17A5C84B8AC1BA061302BA9CC20CD46F769E1021C03C43AB07BAB1BB0C7F3426D252A15ED5A27854CA7B177A6F79502789842E229637FD32A677F68DABFA371062D8B8CE9DFE0D90BF06044AC3A840CEB626B16E13486BB11E7D9C1368FBBA34CE3A2F169C2464EF5FBC11F73843C456467B6CDBD4E01C8E376FDB140EE343106C093AF7CB149B316BA79446CEB4E5E0CEDB9B164F9 +ct = A2877C3D4B092D4196F99FCAC16B38EA10D653E03446CB3BBD61252A938ABB30F3F4B32127ED8936F48A28B0A5202506E7D4CAAC4A073C5CB940B89711AD903E4C43EA9C783A0082F2A831B5FAB803D97723DB32CCB3C0793B1B858E6F71A39A1BFF4700953ECD249CD244AED4FF748110910313585D19F6562F2B5AD187A2FA5383A55E6ACD134A97DEA0AB34E464299DA2C7D5C25A06DC9728FC48DE1FA9A72CB51E08AC79D09D2266831F55AC5BED2A383E8FCA1E2B402C0AFF8AA8EEAB9E277F80C474F8017F8CAEFAEC1480E8FF37EF2DD6E3A8223CBC0AC6AB488084A257BA0F65137C9F9DFB573F9302168A77A8CD7EC9DF435D0CBE0AB9EBBA107FF2FB8ED9548F816DC367777BB2254F8821F22128B9F1624A6B45CC91BC76D5C57FEFC1BB567A2CDBD66CC9970E08BABA6F8C25C3FBE1AB9703BCBAD4EE3C0316738EEAE7488AC7081EB97B2C7F9B236344DB66692B9623384CC8F6E3A6247DE3A75890CA89C3C56F0CE28CD448CB17C4F4C19E727CB2B3724E2FECBCE57AB0BC80147E6B2032E876790A15933FB3822C89C891B8034B081AC74A68A7704BC9435E085B50260480435A6E9E87E12B81F64E75AB3753DF34BE96DB9AB2E49AD18774DD4B5AE0EA2C319DEDF6E0AF04AEE38CEA0B14BD58299AEECFE63FD818055854291C0E81C97EB485592CA06D1BA83A61010E5B6786A353EC7C7C46E658BF095D34A01F486D7CA278DCAA2D92FE3D13103F9241F7E949AB007F362B54C504C4B92C9A40C980E3EF925476E5354A2FCCCD8FBAE94CE8574B7B461632C56EE33FB2D7E2F41E7E759D0945D5A9DF0CC07D6B01059C71CB05AE9553AAF3B60266D422DB11AD1A01ED8757F1931968A16E7945A6EC9DFEA453322F9ACA9639F0CCDE621E95D01CA58FD21BA030E7EA518F601AE849796CC83B5D02E6152C2B9DA2394113DBCF0BE0F2781087370AD6F581D75AF5D6C979E1D3F43105E48E62F6EDF377203815DECB1690C914FE6B5C5BBCF1C4297A253BC2ED7D3E53E90C1FCD61CBD8C1640AA60CCA213CB8E58F137D6BB6FFBC30697AE85782F0A4AB4584FDD332BFCB4A2BF45B5059F9E87EE76EA451B5F684517BBC1407B06DA076AABC83CA7532650C45CA468A07CAE1161B4AA88BCF0816F4CFB0229CD993FFB428A9E5AFC8C0C94C922333692551890FFD307D87CFD4681ABA84FD82035ED32007B4B96E963324BEBAFE589C5D65552F379F1B8C4905A5D7C9F93B0880B9EBB7073A0DCC35E77A20D358115A9C0C9C007AB49B0BD78EC1936D301F39C976176B2B8DAB9CA040ADAAF26A85CB616002834D630D2DB28A48362C15A5637A2CB45DF5AFB1DD3C632219723F55F4F65D2EAEA810DC84A4C243D30BD49E0214BD97CFBD1968275351B0D1182F316067A9F43776F923A429E6EAF29E5E620CDA06008030735A1D3AAD5C47A0F12102C0F28269D7F2CB89E3DFF8D9B73A5AEE6C395CD9D6FE209134D46BA65A4F8AA59A5C37F180A5C287D8130678EFD51406C52858EE1FE24ED2B038 +ss = FF9A0D1AE64C97E4C51512B315D044C14CA34771DF320BA0C16C8531D6A40D78 + +count = 40 +seed = 197E5D562DE7E01BED4FC597DB28DC6EFDF0179F3A5BDA5F94CAA39D67BAE730540534D59A7A06C8448F628DA8B7859F +pk = F6446774B30FEF5B426F563962CC29FF78ADE42B497DC3B970F1B848B1141D7A5F45A37C25B125AED61863F22732A06128BCA08EFC8CB176AB6343239B572E1C8C138D829810227AFAABB81CCA0A73131155377730A120558231E8F8A598A2B730578EDC7800B0D6C5627530EE92930EB2B40A9888CF648263B688F0A12E08F004F4BB449A25282029CFB73C32F8D31229D0A58E6AA08698517FBC5F619837AE3331CF763631D305E88C8F85413E9D5420CC282BAD24A783011184011A79A3B305DB5B3032B75C55907CA5C7F839320028305C439C39484895212B1E87925999681819416DCBC7EAD45AC2B1262154BCE16866C04561EBA2C9EC6022B07A57A67C7B901B5DA3BB8025C7585C86BDA0810C442C39374040236A82884199159729834663D3B1967DF9955DE3A387D93D50F5001924C4FE433D016BC2B6614F2D3BA72FDA226864AD6BA5B8C31681DC104348EC2B29C39FC9F567CAE17BDF1C6E215C92EFFC60E2D6A3A3106BCED0BF301B542F7987B582B0780B6D398631EB8559459B1DB01A0443100DCC731291C737499C2F86452394C0B6662401FB57A4DB232E40D1B0F2511EE1EB15DBF7B603E2A67808C064FC5103FA7C9C954FCD12BC619582F82590B323698A328CC14ACB87C217E39C309421C7E6EA15BA6C3BD8587126C5AA02C26308C9912D7262DBB91AC2C2CDBB9CB009A3AE10761771740B2E6558FAE775DEBA7A66086859270EC07B584334900C278002D8A47D01547DBA3036336616A8C12415B86A1423A6C9AAB5F085C7FABB6355B3DB4023E47C7917C10C284333110BC978B2C08E16512BA95A07237CC35C97BFA51BB1B25E30750E65664377BA49200AA6E935B4C7451E547859EDF03BCFC6904DF05220C02F5E576604A873EE82B7693B962853B5522A5B0986348DA63DF86A64671737C17201ED556E92ACB56F065EEBD31BEF43CA85DB1FEAC395E19110A2F0C5B90459838CBF779C27247709765569E5A649BF160301003169E4AC2BAAA4C4697F25869AB99179F9F792D9B19DF0C148DF7C6B9AA20E63426697D83A6E33B35F4C7E798175BFD73CE60A050146A3D893C4DC9B2FABF5960BD80FA0679433BB33BB91915E93C1EB2AA16CB13E0B9870FEF99835A674B1BB76946BC4064CAFDE3063498CA30AEB3983F5CDB3A6B9C4970459D969F4D8B6BA27755B6CA8FBCA178DEC28DFEB2AC03318BE7002A9A4CD7B1749A7FC7F09A6B560740DA89BAAB8130872510C99630F3B588069D50A9550C97F8198B7A46148FA7AC1580632DB1EF49528F9125784A5BB2757235FE44E74529A7CE88E91543B2FF81D9ED78E2647AA07033CF3422D34942E7830191B104C7ED56B8951A9C8706E4CB33CB0B918387B869084386420C13B09BE75D2A5E9276246B674E96BAC7782541E1CA441E53FF3B9C702CB95CEAB628D1617704A448EF743E8B811FE52C659CBAAE22377F28646C45642A9886628C9B73C510BBFB645D4077C1D8B954BDC8B707B7F6BC4701BB1AF0F28B88DD282B78B7EE96732521AA6180B6021AABB415839DC3A1F6F545C1320C58B965B62993ABF6A10C18A22CE6A45539685F297B1F04A130465845D189D17552E2F4917E924CC0D2DBC2DDC739F6B876472EB12CE233CCD402DDEF61523FD6FEE69A88F34A34C +sk = 47A7741316BE87861AEC518A9B38146B43AA54A98F47E242866B8D79F731D98C754B572A2A9170A7EB4B0D73B38D6665D1E43AF0B61AB95CB54879707805BD787913EE369D231C600B76949BF86366579AB62724CAA1BEABBB02FC945BF007CF57A225AFA67393CC58804A15016A12DFB90D5A52BE41F907B1F2C4FE93712F555B0AE896E85931020089642A23E4C38581D4C40A46AA8DDB3C26DB0E29FA5F7A12B6CA32CD2AB6B50327AD0DD8139AD83DCE676AB2DC0C2774C86A2C72A5FA2D4DCAB588A66D6551C040E91AE045698AC0A1DFB95048C545D08654C1B560384561AB07BD8C61182F99C79A2267C961AE66434321E8501D474AD84AA71286A948C5AD187232CF72576F167D63992F62D3423CE75577C2052EF84019404B0E1706BA704FE3D116A518293112B8B80708C094BDE829AC38E362A404BEB67026EA6782362035CAE099302C5660931CE31B93B665059633699EC44C28C2BD230B1942421F12388900081618BB29E315BEEAA090A06AC7FEDA567FD1A12D1A41EBA931C279ACDB875D9DDB7CD9A6ADBFB32239E843012A8CB91776775408316B056FBC42758772C1E53EC0344479C2791B837A6A34AA77710D35593A55E57572FA99711BBE5A83454BCA7990E834BA285A09AA11666CB2B2F39704904354687D0524888CF6461EF302139B042540138E322453619B3DD715B617230E08C4585478F9996798E9B47C712F82BA45857551EA4C79B4A0577938666403174E84585E684783D33F3B701420F66D48473FC6BB627B399E90697E760783A3E09D6531CC524568DEF8507F0437314488AF7376BF2A6BACF783B632197D8565F9456D04A8476DA8CD6C988D26A56D29479A2DBB85AFC18DC81A8611BC4ADAAAAA440471B530053ADB874DB67102B6A64FFCA8BF8487E18B2F7582B71FD78D85F819C24B892741A83E67585B6B1AE5AB6AD1F5CC02AB78D0ECBE01087F46AC9BFCA464A4B9CA817C3A1AF5CB0A6A3F1DD3A2EC06774E805E001B44C8194660A280D0D59BFEB35EBE9C943E626B98E488F8984275401BDC4959993345C38BC801B95D56BBB47A2B23F5F1223D5A0E2A827D4578948CFC5432627C9586275679202E3C970FCC980AF56757912080072A4AF234DD030EC481A6ED8030921691D6126839635C6B270497CA4A87D4BEF47CAC60752383712636752A4AA18AF13BB36EF445FE653628704E4DC2CADD62839F9842F9B2C264AB4FF648C59D15708F55AE4A396D5F4BC75D20603C03CDEC4252FACC579A0CBD1F64A734E8350F03ACEAA2734DE2B486F6B93C36AC11803E564070ABA97D2309078FB43768F98EF5D03B09FA10FFBB0BEB3B5FE01310065508100206A640B93DE87BD94A634907730E30800803B233B95D1CC7CCE49C08AB143734347F3459A5BE0230F9481D50B4B835A91736D6A7B351C8082A4D080967B43B0553835BF52943A380051F48C27823C5AA0B20B7B733DCB004B2A7819BEBA4B3FCB1F991789C2C57CA01B50523214AF309FDF421187492C411C14128744BF4A83599A30B86194473C2BC9222FB4BA34108689AA8065AA24FF3559A76F759768C81A8CC5AA2A6792F3033B2437B05068BED096475D9280BF349F6446774B30FEF5B426F563962CC29FF78ADE42B497DC3B970F1B848B1141D7A5F45A37C25B125AED61863F22732A06128BCA08EFC8CB176AB6343239B572E1C8C138D829810227AFAABB81CCA0A73131155377730A120558231E8F8A598A2B730578EDC7800B0D6C5627530EE92930EB2B40A9888CF648263B688F0A12E08F004F4BB449A25282029CFB73C32F8D31229D0A58E6AA08698517FBC5F619837AE3331CF763631D305E88C8F85413E9D5420CC282BAD24A783011184011A79A3B305DB5B3032B75C55907CA5C7F839320028305C439C39484895212B1E87925999681819416DCBC7EAD45AC2B1262154BCE16866C04561EBA2C9EC6022B07A57A67C7B901B5DA3BB8025C7585C86BDA0810C442C39374040236A82884199159729834663D3B1967DF9955DE3A387D93D50F5001924C4FE433D016BC2B6614F2D3BA72FDA226864AD6BA5B8C31681DC104348EC2B29C39FC9F567CAE17BDF1C6E215C92EFFC60E2D6A3A3106BCED0BF301B542F7987B582B0780B6D398631EB8559459B1DB01A0443100DCC731291C737499C2F86452394C0B6662401FB57A4DB232E40D1B0F2511EE1EB15DBF7B603E2A67808C064FC5103FA7C9C954FCD12BC619582F82590B323698A328CC14ACB87C217E39C309421C7E6EA15BA6C3BD8587126C5AA02C26308C9912D7262DBB91AC2C2CDBB9CB009A3AE10761771740B2E6558FAE775DEBA7A66086859270EC07B584334900C278002D8A47D01547DBA3036336616A8C12415B86A1423A6C9AAB5F085C7FABB6355B3DB4023E47C7917C10C284333110BC978B2C08E16512BA95A07237CC35C97BFA51BB1B25E30750E65664377BA49200AA6E935B4C7451E547859EDF03BCFC6904DF05220C02F5E576604A873EE82B7693B962853B5522A5B0986348DA63DF86A64671737C17201ED556E92ACB56F065EEBD31BEF43CA85DB1FEAC395E19110A2F0C5B90459838CBF779C27247709765569E5A649BF160301003169E4AC2BAAA4C4697F25869AB99179F9F792D9B19DF0C148DF7C6B9AA20E63426697D83A6E33B35F4C7E798175BFD73CE60A050146A3D893C4DC9B2FABF5960BD80FA0679433BB33BB91915E93C1EB2AA16CB13E0B9870FEF99835A674B1BB76946BC4064CAFDE3063498CA30AEB3983F5CDB3A6B9C4970459D969F4D8B6BA27755B6CA8FBCA178DEC28DFEB2AC03318BE7002A9A4CD7B1749A7FC7F09A6B560740DA89BAAB8130872510C99630F3B588069D50A9550C97F8198B7A46148FA7AC1580632DB1EF49528F9125784A5BB2757235FE44E74529A7CE88E91543B2FF81D9ED78E2647AA07033CF3422D34942E7830191B104C7ED56B8951A9C8706E4CB33CB0B918387B869084386420C13B09BE75D2A5E9276246B674E96BAC7782541E1CA441E53FF3B9C702CB95CEAB628D1617704A448EF743E8B811FE52C659CBAAE22377F28646C45642A9886628C9B73C510BBFB645D4077C1D8B954BDC8B707B7F6BC4701BB1AF0F28B88DD282B78B7EE96732521AA6180B6021AABB415839DC3A1F6F545C1320C58B965B62993ABF6A10C18A22CE6A45539685F297B1F04A130465845D189D17552E2F4917E924CC0D2DBC2DDC739F6B876472EB12CE233CCD402DDEF61523FD6FEE69A88F34A34C29253478090CB4D580BC2A912645BC685061E5D4437B3811EDA69C865EA9923C0E860576285483BB5FD36E2F944D32C4317BEBC1E441470C1372046A790D79D4 +ct = EB55C9D3D46D32C021F0D7E61E5382C2B74BF1608E0C8F09E080C2820AB0CB10886E141A282A7C80B73CEA0272D08E16366F2C900DA1144039E5A8EF7031DC26A5CFCEE8F47C3F997C940A056D68D3507E7481E13835B911CDE8976F0E7494170D98386316AFE41F97B56FFB8B5C85C70048FF2B5E2508D19B06D8E03A91F6973DE1F903452D0A95F5E8FEC22D033669FEBCBB2E09904307FDD7BCF55BFF0C097D31B62B08D75A144E8064B7001DE832BD6AFD9FADBD00BA148A5DB0B0085FA6756AEED4E2D1CFF7E8BCDD3F8E6096FBE2EB19F10E1EE84678EC8E140CD4101D300FD0E110BB7ADFC580EC1EA5AF38CC6CF984DCBA6921230304DC19B38A1D3C9BE8C479FEAF98E097FAA5C45A957D8F33A2928C1692EA8E8B528B33D49460516DFD50FEE3F5D0590171ECC3DC287E4F63AC5FAAB29D1B6436195EE4F6F29AB15C9C3C27683554C44F0D9CFA94920E9000BFE9DA83AA15A605A6E2474D29460AFF929BA74A38C465FDC8988C7C2F02B5CFB44C16BEE8B9065B049FD6342F976CDE143BA0D48CE4AC03F2CCB0767F94FF4DE46DFF7077790B1F1FE14093034F8E021C2857A148C14FCAC87797E455F36472F3791073F5F47C5C02BC40063A6C0435958B9CE3B403051CFD6A538B05A63B924950EADA692FE82433DEE2F7BE1202B5E1DBE0D5D17E0532F09F7C3D2F815BDA7A6D6E61B6BB2E755C1A181EFD721444A928BAF9EEA4ABCFFFDE4A1053BE769077146B4487ED00B2F3CEF170FB7EB4A3B61BB19706AF4C6FD9B6A29EB698101835CB24FF1580E00C36274220FDD56200D74716053C38F7D4E3FB1D733F54DDABBB14F3CFAABE62507D50920FEDC87E5190BD84200C96C6967CAA3912C6126EE409DD4BDCF8859AEF9561E523A26B31F5632816FC9053DA5B9EFCD9CC05E6A1D81078D6ED3246A46E2CE4F0C09F11CBE1FB5994EFD758207F7B9E2AEDF2A8386F9175259325B9B7AFBC9C8B9715E973EFC1573526D6CAD3579BD57920172694C7A5A02B2CF3DA1C78CCE8C9E204A4D2605C510552836E2231841873F2153A60E77E381EA4345A0A4CB0622020CC5D3FC168D84EAFE1D38E0F2DC8B890D7843BAA29E2925D5F1BE93A9E266DCC99C00C5D6681190E07A833090AFB8575AADF55333E8B3F3D9FE2E7337A3C122DE1EC3264C61B47EEBAEFC7B1F276F8EBC1CC53DE806801A8EAE9FDA8BD5E7D2F83CEB6C072103D190ACA2AFE8313B43AE7083845B6FC26ADB1A7E3C17C0FDEE0A1590FA66127EA4423B6F7AFDFED7C7E2DAF1B7490F09DBAA9CE15E209E1405E71531D3ACEFCF6096B8B76EE28246697A41C6AC8E0CB4E0CD1CFD80997E19014F083167FA47BB4BEFCF207A369051C5F37477A2BEDEA8A65913D557F896EA0041D77182BE50BD355F7544245624F6DB4E918E1308BE489CAD3C7C430D707BF91B79763691EF5FC0DB233895B361CD85158250DCFD5BC90A3850B60118159B3EAF31B8AD3AECC555330D1E084C06033CE41EBF6A5A6928B624D308C48919BA8FBD6923E +ss = 0E40BEF57DC97B87EF89E5308F9DB94FFF59A475DC35EAD3F2D5B6B89D24CA2D + +count = 41 +seed = F170583CB451D8A45D105457C02C01A33A40350616ED8515BD49067142F61EFB00F07857E4FFF3FE11E7164C648C76ED +pk = 5FD557F7434FCB61B199E793C5E763764C48DF412ACB7C756E1370CD117F8C10CAFB39CBF0C8C3F5DC8DA1855203D02B39647856B55C38E944617B8348D16A8221962A42398FB61978F40328C83A0B49BC843060D1711E289434DB4B5B0838CD87949DF5AC0727D8A528B8B5BF30CCB9E37A6664050CC5880D34C13CA42C1779B8D098C5E0876627C17A79B6BAD44A9A38C56883D97CF2D2B114A1C4F1A502AB4A9B7B5398D9E73E543B860F87062E27A9FD1A2035185F0D98857B0759BF1C39A41984C8C1A1A9027944417F84CCA0DD4206E9133F6EB6A989075D004ACCD9F57CDC928CD455443F0222DCAB9A8890004C2596EFEB06903B5D0AF33A88F14FEC760FC074A3DCDC744E9864E7EBC608A56002E483E60B8202B31377DC7F5A486D5A060733FCA9836AAEEAE05909C6B6B0DB4531271FE4F3548BD5BFF1E92160321218F963081C518874C0CBB792FDA4513F7902BE6547745A0879BA6CCD7C0F73B123DC605BC7995BDD14B018D8278C8C3966AA87A24B4A4BD3ABAFE0C8173C028DF14DAAD39C288943EAC139210392BED70C38D7AF7439697BE96977D23A27CB6E7DE7B785673C9D1B33A081A9CD417129430C6C6300C496B04E1796C9C781E4211915162DE147501B7BC55F8913C66C5CBD209BA6D115F753BA739417C8EB182200113CE17C935A0622DCBC674553B9DABCDA17BDBFB4865D58143C149512CC2E74A2B508F67BE8058461252D95042F8B7641E1D85161521B81A616A02110D7EA3BCA4723D003A4DB1673D64273B34C9432AC981A0C01DC8B8C0ED5A05D20C5331831CE56014AB0732B301CA2F8569FC061DDAA95D63667B9ACC7A1EA656F821D55A31B41F32DFB3B66DDD5CD2155438DB6923069430B61C85AB309BF56B0ECD990427C1B7D93991E783A647B1DD66696659B5C926485E1642854F0839033138A3A54C349C138977275E71E0FE985493CB85E0923095804037462AE248780006D0778334F664262E88498FCBB22D46D4F4291BB90AFBBD40FBF2B302415CF195542DCF3375E78602FE1067638AB995B70E6DBAF7B75BC11701207E489F361512B590A860401A3FACC1EF1375D8B64E0E5C7F863786D3984710C2F55ECAC578C41170194D832929075671B814FABF45C6E2BCDF8C0CBE2954C5A414E3F8878AB68CA13189D97F316517ABB4C5187DBB03413DA654E650EC1CCA0BC9472BD4BCC60CA6FCDCB26E77A025EB70EC0E60E20B19D30FC261AD11D3C0C56ACE53DE82C6A38CA5D59E9C24568B7CD15A0531315DEC20D9CC957FCF8958E3747471A8D944A6678F6AC8A8763A1759B3DC83EDD18CEEDA5036C31A897B65612D2B176E9648352899BB2869F48B1E70C1FF04864487258526226A7DC64306B6838F4286B9A81A3193F5C9C711DFC5B9FE79BC6CC14C934591F93860B66511AAB061295AF186B8CEFF5772FE50DFFBA4F5256522B5C7C55A6BA9B13B615FB3B3BDC4B159A1C84C85D717824A0573CBF219FD9B2A32AB66BF8A498A04AA4E22509A5057997B74AB5A1B27B96656BC194AF08114551709A41142B715C6E167E5BA5945729BFA702C236073FDDDB4CEADA972810253D642EC094333C028B0AF40CE2E29993369EB7DDD07164969A62466B80918873A4EA56CD80A8E559FB30F6CCE44F1F8FE60A +sk = 35E4451348CFB9A06F1836296178B6AF41A1C0196F26525831C081EA779E6B8C4B3F150AFE2963AA756968358BFCD47D76415ED4294F02A843F89B87D6803BAD504A9165B9BEDB0C946058965B64BBF953E719160B53552C100D251CC9C111837E0A7C4C043BA0777E53B39F658B41B5F8900D4721268A8AB868B15A12C3B8F41316DCBE117AB3A027B8FC2CBF3566569A130D6DB132DDCCC5EED69A392BAE8E4A7BD6C9708A48BADEBAA79FA1AC1E729EEE0399803A374D3733AE501F1A846CD2F5166DC31B4D53750BCCCF937B1CA43C3A6CD5601EEAC251F9AAB8B2489E22CEFF436F1142CCD1BB17DFC75DB6125A1A433325A5599FD23B49BBC3D1B9195B984303735F9F2646EFD050097AB23A8AA5569AB744A934C2991BA046CB012467D39C3936EBA9CFEC4268E1A0EEA559980133B4121F9D5A603E092C199818C057B7C841A7DD00AF2C0AB3637878A9EA90BF377874FA38BF290FEA6131345340857A1A53D4BDD9201B99FB628D975A91001F907A2E9AD37C9B99B8AF915070339FDF76125D9556B1716CB74A9F18092AFD887880526FD82CB002CA49E879C50E33AF2E747104674EB1F30859E3C22F3AAEBFD30FD672B6AB855928C4085130488540C8CBDB832AE25249F46B7178AF9769A4B359664BA48DA4A746C215C58AC2752E43835B5C2A9EF0A3FCA159D29038CD60CD60F5BF508521D3D59C4F083653264776501B4FC62337FC37562973A1F9BD9532B4BDB25C21597A11E17096B155CD43C76874C44F25C1AA1BBCEA897367536ECF4124FEB6CDF2360CD5A082AC03B5E94232DFB44E1F124FDF65A4BD03B16ED729884065D77135F1F730A7A91FC2EB43271C0B2BFB8E615C07DF54041917A95B0544E8513E8C6060D14C0FB802C0F2680051341960654F3594C9972C08664B7BD30B2F031827307B95FC525A2632C2456041B1286D6F175BC0B41942E8B8BE69BB364A11AB4CC199F20AEB516CED1ACC1F4B2B91B860331677290C643BB9A00B4B65644592C5CA5BB19B25D2A7080CC32B08910C137946A3FAB6C8E31A1E97A4735A5C0A239B073C6E056053CD6498117497870718D35235019B3EE6050DCAAC31A27167FE35CE57586C364C13BCC7587CA066C6E05673E2BA0186281D94843DF10BB3A93C05025C0C691A0C41B229A55B7B506724026C4F1B48313788A212B0C951783EC9447E64314E878734AB59401923ADA0586225C7A5C00A5F97BB76632DEC47C15C06C7C20090C790404B3044136C79F46181CB1123A7D3CF969B72F6CABE063A35774A60863267B1BA34B93A5D3DB25FECE84A02429A9D142ED897320BFCC114391BCC097A078B04BD9356113B3CB993C19384886DF182E37BA659D5B8BEE24445411E318CBD092B8F8E53C63BFA3896A2CDBDC66E27F25C83FA85C260A34FD6CFE6872172F1361AA125E6C5C6C902CDEC68708C14C175E910CF002AD647A317F78F52F76BAE006A3AA51780D37A00AA20C6A532281719C5AC88641A9D15549088B5A4DDA23F443335ABFC5C2F7C5BE2A142740CBFD612A83AF271AF0AACB43833B56295B51A885D798825C3A2C04B399C528530CA24117B6E762C7B6527B0509B5963B68560015DB4D4895FD557F7434FCB61B199E793C5E763764C48DF412ACB7C756E1370CD117F8C10CAFB39CBF0C8C3F5DC8DA1855203D02B39647856B55C38E944617B8348D16A8221962A42398FB61978F40328C83A0B49BC843060D1711E289434DB4B5B0838CD87949DF5AC0727D8A528B8B5BF30CCB9E37A6664050CC5880D34C13CA42C1779B8D098C5E0876627C17A79B6BAD44A9A38C56883D97CF2D2B114A1C4F1A502AB4A9B7B5398D9E73E543B860F87062E27A9FD1A2035185F0D98857B0759BF1C39A41984C8C1A1A9027944417F84CCA0DD4206E9133F6EB6A989075D004ACCD9F57CDC928CD455443F0222DCAB9A8890004C2596EFEB06903B5D0AF33A88F14FEC760FC074A3DCDC744E9864E7EBC608A56002E483E60B8202B31377DC7F5A486D5A060733FCA9836AAEEAE05909C6B6B0DB4531271FE4F3548BD5BFF1E92160321218F963081C518874C0CBB792FDA4513F7902BE6547745A0879BA6CCD7C0F73B123DC605BC7995BDD14B018D8278C8C3966AA87A24B4A4BD3ABAFE0C8173C028DF14DAAD39C288943EAC139210392BED70C38D7AF7439697BE96977D23A27CB6E7DE7B785673C9D1B33A081A9CD417129430C6C6300C496B04E1796C9C781E4211915162DE147501B7BC55F8913C66C5CBD209BA6D115F753BA739417C8EB182200113CE17C935A0622DCBC674553B9DABCDA17BDBFB4865D58143C149512CC2E74A2B508F67BE8058461252D95042F8B7641E1D85161521B81A616A02110D7EA3BCA4723D003A4DB1673D64273B34C9432AC981A0C01DC8B8C0ED5A05D20C5331831CE56014AB0732B301CA2F8569FC061DDAA95D63667B9ACC7A1EA656F821D55A31B41F32DFB3B66DDD5CD2155438DB6923069430B61C85AB309BF56B0ECD990427C1B7D93991E783A647B1DD66696659B5C926485E1642854F0839033138A3A54C349C138977275E71E0FE985493CB85E0923095804037462AE248780006D0778334F664262E88498FCBB22D46D4F4291BB90AFBBD40FBF2B302415CF195542DCF3375E78602FE1067638AB995B70E6DBAF7B75BC11701207E489F361512B590A860401A3FACC1EF1375D8B64E0E5C7F863786D3984710C2F55ECAC578C41170194D832929075671B814FABF45C6E2BCDF8C0CBE2954C5A414E3F8878AB68CA13189D97F316517ABB4C5187DBB03413DA654E650EC1CCA0BC9472BD4BCC60CA6FCDCB26E77A025EB70EC0E60E20B19D30FC261AD11D3C0C56ACE53DE82C6A38CA5D59E9C24568B7CD15A0531315DEC20D9CC957FCF8958E3747471A8D944A6678F6AC8A8763A1759B3DC83EDD18CEEDA5036C31A897B65612D2B176E9648352899BB2869F48B1E70C1FF04864487258526226A7DC64306B6838F4286B9A81A3193F5C9C711DFC5B9FE79BC6CC14C934591F93860B66511AAB061295AF186B8CEFF5772FE50DFFBA4F5256522B5C7C55A6BA9B13B615FB3B3BDC4B159A1C84C85D717824A0573CBF219FD9B2A32AB66BF8A498A04AA4E22509A5057997B74AB5A1B27B96656BC194AF08114551709A41142B715C6E167E5BA5945729BFA702C236073FDDDB4CEADA972810253D642EC094333C028B0AF40CE2E29993369EB7DDD07164969A62466B80918873A4EA56CD80A8E559FB30F6CCE44F1F8FE60A286DE7DC142EFE935E84B0AEEBBD32D050FD9D8B008A94E59454B19EA401611DF89D7D99D5C3E0D10D6EF9AF054D842375F695ABB28E3B8EB495100F04306E92 +ct = 5DC80EE57203C2A3A593240F5C226FB63EA02A9289CA40186D14AF3D9A02094554F7B14EF4453AE4F183E307BF7B9278D01E0F2C3335BD69C14642ED5FF79C29C45AFE9B515675C913AC83BBED109F7EF75BA845F6595EBAC11A0E80AD13B284F035C25E9671D7BBF6D0D2C7552DA1888B61A5F011BDBD83C63C2B03C8979D3868E08B5582152F4D3127FCD9E587B08A1860DA14AB9D078769E7114A40D559754637E0141E3163215B30587E985329A2683BAED7523E46BF08AD415E8AFF8E92AF2815A8129BD516119E54815A2A529EC01565F1A6CDCE2D60343BCCD6B705A2FFF6EEAFC75B73B7187769B0AF07879775557278F537FE44DE5D57F4854C9E0A2E7E6B55435D801C5133D133089B15064F702583F228257D9A0CAD4162230596242AEF6A26E5E8C79F9B405B2F196EEAA922C464EAA9F3D312560DDFE0DE9650F53B07464EA6F28FDED35F78A351397E23FC38BC1A790E39DA5D41D33494DEFD5A5533834A5095ADBD2B03DB0E560DF6BD4C64B41C502309B89F73C0EE40B9C6AAE58D835D95E650EE2AD57CD0D393D76D5C9BF0B90915878942DBB05D8C5780734821937C929F1BA55C487FCE1C1831524BAFAAABF4D29472C82C105798A9BB324112E1B28490965C14A402E4E855DA0F3E83A2DF80F3F3BD8807112FE74907FDAAAF6C8D4DDF5C1E57DA71B4680F81BACE717B766A38C261CEED6245B9662530DAE047872C4B7655FCB0BA1A3290A34110BD31A97A51D92443F6E6540B0516B1164D783A610A3F87BDDF21593FB5EE66617E2BB370EDA0C1DA30268A6DA145003CFE65114FFEA6AC3AD209D9B3DA1F39CBB1E564D91A9AE448C23690B77E8C9292AB6820C793E767B26CBC2EEDACAC6B04F0F1F742D147FC0E2B898052E1E56BAD108335CB72B6D6AE792794F804DB1FFCE2B40C2C97048B5E8A1C6CE5FA34966FA6445ADCED31F6921D56A24CC323A4AD2AD53EBF4CD336998D06496724C1F9805C1B3A89B3511A143DEEBCBCAA4B76C8F28D9DDE856F35CC7BE4FF03D7C147486270B6FDBEFBB08C502225AED31489ECEEECAD5626A028F7A7E4535211B2E85CDFA40F1380C91AB7D6F6B544BAA8A1E6FD69001D0D47E2215C5158BEB50BFD8CBCDC828207C5027F39CDBB75FFB878AEBFB0D713DDAABD1872BF36775457BF5C2CB50B499CC3237AA4BA7AE6E62C69E317916B7548F14684CFB0DFCB1614F2D7F344BB8CC97014ACA7787A133C59EEF7EF6D010E9BA76367E0065BD41D9CE4D38C1A98838A43296B6CEF7C1FCD671537ADBC2F00AD206D742ABC670ED2A52793971A63F2678E37426A34616C69EF57430568F3BCFA11973ABC280FD527DCFFAC2FB7E612C168AD943F0AEC1A7945DD77109B18901A3DF62CDCBED7DC4F75D6AF7A1458D0FD1ECB7CBFBF09F94AE3B593BC4F842C3B2B42934A2B62963E8BF6AFF0CAAE36C1C887C97D2E5FB89572551DFE322593B2082CF2B37B807C2A60F23CF191FDEA019D05E39A36403D595F97F46910D2AD65D812481402CE51B810 +ss = 6134219801B78F6FA5A998377643F828C19AB6FEE69E7DBA03C7B8E20915DE13 + +count = 42 +seed = 44A6774B2CAC02DFF210FF861A090561A453DB311F47B6FEDB81811872D5D9489F5FC4103010139AE53FCAED209DC9BE +pk = D5F135D06AA99635C9B53244E1F898D8494B681312BFD243C8EA5B7E71CCB7A5386E477D01FCA3EF4122A63934843450A446CAFF55184D052923A393FD887DF6B045659CC282D1424B19B17CC2A2384132EFF067A0347F88C6B392AA56A3519A440438D3F90F6941112124C91FC31187AB0CE6752D9B336A1E230F97837A657599E253B7798C912A66A48314447C352B84590941355C6BD1C0951374105858A46502EF39CBB58B8E63A64E2B99C4825912155695893A62AF6745E76058D551A946161F25F1B8FC045602344A7F342FACC50E9565C1D59A459D34233C1921CEAC6E0BD936B496C8FD6A619D8B0649EB458F8943EAC97293635092666688DB559D255CE9F280227755C3605D6ED007CA718527227FA1F40DBCD88792801D8DB6B2374A23178A72276C790F902D7E969F2686C9508186788905E77132DD909397F6B6BAD3CE77E8CD4C4A3B9686CAC35ABC86D57E911CB58B0C997C1935CA64918370809D3B1B70CB09641878E7C0A141573030AA2B687761BF43AC89A81E73376793ECB32DB53368EC9E079172E9AA482FD8652583B9155683DA3467E4546F26AC98371487527C37B6646CA582017892A188FB2440CA7240C3C22577230B59AB8EC038BB95CC49C2A2F59A4A22C0C482713544FBCA9D7404B3A6AD86E8764A601B7084289858BF62A2828D3091FF015089726CA23B1CA0F87195BA1ABF80B01F101F8584C15289196744500000B431A60267174F2CC56860BC5AB4EC20D19BA8ED47535EB42FE1D33F2980BA211805A3618F2FF64D1CC634CAA6B40FD23615538366DBAF41971D8B5857298C1E406A293C1B8B7F4A499A97BE8CC51B5382020EA9C7CF809FA7323134290FA461218F4A6F495CABA2D1511EA48B7E0905B0465F7A6711F2716B17DCBB4B9A1B31933D7D3622315C79F3F11A93C8058FBC01C4839A808A5D2D45B99F7918FAF52DB1D81D669C7988BA7EB8847187AC7B76404B1A139DC4E4917C9B4E29833FD9FBC36E4BBA96E25BDE691CE0C369ACE7183C762BD04785EFCC6B614165C014A0FC4B64B24B3B46418AC5B6B7BF69CBC75090B69AAE46B4A12FEABD4E134BCAF14922367B50F17976C6705E175FF34612CF7B086ED733DEAAB0CA815A53C99B2985963DB89BDC284D251340B0E3AE20990EE93344DEA18063DB6EF4374A331244EDE00B46676475937A9472C82E124B1751A9E4203BECC77ACE092B055ABF0892637B39C3A9A011219C88139277B8BB73B9508142421939380ACFC2B81523C72E923609A0505E2979E086AB85F9663E549F3350A694458CE7B02BD8716C0F8B8946A21D99D97632952BEE898989C1ADEB710E15BB25B0A22BE598A65465BF2B899719D00F9D16367E9436803BA8C17B6B3BF62A10A017C177125396BF6745163FE24C455319CEA69393CCBAE42508156167B28A1D1050BDEFA5A789BC389031BD86E72AF5F5BC80A215260737839654998295D5ABA8C11A5417B55D67201243393B7593400D46CCA1D321C027BFB09CB08A1738C88B7D47E876EF7517F8D96CC1C93B9E93B7062227A55996FA958A684AAEDA89587B015A6B336DFB610721298AC6AB713F3A2E37B2AA7B1CCD2A876F03C72546B861E351A73036F4B363137340EFA7764C439F68D3C8E0723683AA8254A66284F447 +sk = 03A941A829C025261F44172ACF806BEA5B216B58BAB845328C36CB925A5169D6B1FF141BA44010FF2C1A446113C443C6D98CA879E673CCCB84D5519067619EDF59C23798B9B6BBCDC0D49DF5F4B21563AE54E287DCCCBE4C53C62918A6A213C460EB8C92377CB57A1B6D6467D40297FB90C6907B6BE5B03DB314C3AD5B2F46999743EC7FF0B055AF2B2753695395C6157C60115E183DDA398D136806B7017BB4FB4F36B7653BD17CABD1BFFEECBAF2EAB65B853C710820818B05AFB86388F327FEA6C3562A027C610AFD9C0BBB23A571489120C2BAA0D7AEFFD196B2DC8B40D4016FDA16062512A64462FE806D5959C49DFC0C9B2955E6480B7AF0011EDB2D44C6A43D08B5F469656CB9396C9C640BB077CC24AC0F293BAB4CBADD998ECDBA31534408B74420CB432826CB5DC8224C48159626053096063841153F723761F83315629C945778A24F826A28A90A5854BA7E80C48E44929EECA17E28304BABCD0AF4198962A045292F09AB5B7197A685A67D07EC9769B69E64EA1457FB8E1A70B23AC4A797132B021244944143E936C6E5D840494B674FDC9AEE84A091175F8E3121150B1375E028D0AB6B709A443F14C56AB67E3A8721A4B698EAC9615FA12C0E5277E4A412508446ED4999687AC5AC626CCF5468F3E944B8D099FDC319337C85E5024A0798556CFABFD47A40146691D32C0F179B5BB3C3088F2CB29E2B961B630610D1528FAB952DC75D23339C26A38F68421C12C2360F369ABCE128CD64551CA29455E02AEC7C359CF9182F5642F1BAB42814AEA8F2844AF15670421E0E113063B4B8C614487F6B6236DCB21E48613C0635E5F6A6A6E070FB665756F98156C65A6F407E1014BD6540A92E8A09EF6C944DB876250B951D16332251C5BB6B79F88928ADF6BEF819A241068B08337136B8BDC33476FDDB0292B68EDE75490DB193E267BBF2F8459FABB17D10BEF7018AE895995200453065AD45457E3E86A12C554DB3617A99613767598031C86BD5815585444DFA41CBE068034FC0A1CC2636D010230870776D2645DB640B409A292ACC909AAA11D0D05A1B1469EA2673020BB7EBC7381190C271E2CF73D37F61F12C8389843B0540117C7AB924C140D1409F701AB0C0596103A1AEF3C93A2A79BE19C7870ABE83232A7DE265A1A1280D30490FF50C414A006D8A403C50948DA4B1054B18BE35A8F9252079C5ACB2104BD42CCB51617839E07380FB3A62B3A5080295BCCA410215AB5C30A89B727363185363027BB1A6B09FE83233D79E4527371ECC8B879C81A25B3E6E088D2E786976396EF8D6C383495B52EB69BB718DD7FACF5F120303EA259FB2BC32A5269AB45E6BD8AB9F9456A68B869A4C13A0B6C98DD1BF276572EFC9A31591ACB33B9945919FD20495DB284BD4BA7C66620754E58396C0A191F20304B545AA2279CBE62D08EB4C82E60569598147F9910EF70ABF792D375420BB999E4A9CC28DB0193A124D0CC78807A54D13933B25B350A16C842E4B31337BC7734104FE564C20F27ED6AB800717BAAC4A9C954C6EC5238BCDF309C6FC497A6A9B9E4973D7D44EA53B90DB26912AC7796C327D24D3705DB5BD0266B17B145FD8CA77624C8ECCAC1C209073B2A639D5F135D06AA99635C9B53244E1F898D8494B681312BFD243C8EA5B7E71CCB7A5386E477D01FCA3EF4122A63934843450A446CAFF55184D052923A393FD887DF6B045659CC282D1424B19B17CC2A2384132EFF067A0347F88C6B392AA56A3519A440438D3F90F6941112124C91FC31187AB0CE6752D9B336A1E230F97837A657599E253B7798C912A66A48314447C352B84590941355C6BD1C0951374105858A46502EF39CBB58B8E63A64E2B99C4825912155695893A62AF6745E76058D551A946161F25F1B8FC045602344A7F342FACC50E9565C1D59A459D34233C1921CEAC6E0BD936B496C8FD6A619D8B0649EB458F8943EAC97293635092666688DB559D255CE9F280227755C3605D6ED007CA718527227FA1F40DBCD88792801D8DB6B2374A23178A72276C790F902D7E969F2686C9508186788905E77132DD909397F6B6BAD3CE77E8CD4C4A3B9686CAC35ABC86D57E911CB58B0C997C1935CA64918370809D3B1B70CB09641878E7C0A141573030AA2B687761BF43AC89A81E73376793ECB32DB53368EC9E079172E9AA482FD8652583B9155683DA3467E4546F26AC98371487527C37B6646CA582017892A188FB2440CA7240C3C22577230B59AB8EC038BB95CC49C2A2F59A4A22C0C482713544FBCA9D7404B3A6AD86E8764A601B7084289858BF62A2828D3091FF015089726CA23B1CA0F87195BA1ABF80B01F101F8584C15289196744500000B431A60267174F2CC56860BC5AB4EC20D19BA8ED47535EB42FE1D33F2980BA211805A3618F2FF64D1CC634CAA6B40FD23615538366DBAF41971D8B5857298C1E406A293C1B8B7F4A499A97BE8CC51B5382020EA9C7CF809FA7323134290FA461218F4A6F495CABA2D1511EA48B7E0905B0465F7A6711F2716B17DCBB4B9A1B31933D7D3622315C79F3F11A93C8058FBC01C4839A808A5D2D45B99F7918FAF52DB1D81D669C7988BA7EB8847187AC7B76404B1A139DC4E4917C9B4E29833FD9FBC36E4BBA96E25BDE691CE0C369ACE7183C762BD04785EFCC6B614165C014A0FC4B64B24B3B46418AC5B6B7BF69CBC75090B69AAE46B4A12FEABD4E134BCAF14922367B50F17976C6705E175FF34612CF7B086ED733DEAAB0CA815A53C99B2985963DB89BDC284D251340B0E3AE20990EE93344DEA18063DB6EF4374A331244EDE00B46676475937A9472C82E124B1751A9E4203BECC77ACE092B055ABF0892637B39C3A9A011219C88139277B8BB73B9508142421939380ACFC2B81523C72E923609A0505E2979E086AB85F9663E549F3350A694458CE7B02BD8716C0F8B8946A21D99D97632952BEE898989C1ADEB710E15BB25B0A22BE598A65465BF2B899719D00F9D16367E9436803BA8C17B6B3BF62A10A017C177125396BF6745163FE24C455319CEA69393CCBAE42508156167B28A1D1050BDEFA5A789BC389031BD86E72AF5F5BC80A215260737839654998295D5ABA8C11A5417B55D67201243393B7593400D46CCA1D321C027BFB09CB08A1738C88B7D47E876EF7517F8D96CC1C93B9E93B7062227A55996FA958A684AAEDA89587B015A6B336DFB610721298AC6AB713F3A2E37B2AA7B1CCD2A876F03C72546B861E351A73036F4B363137340EFA7764C439F68D3C8E0723683AA8254A66284F447029A2E12C3E6AA668AFB5BE8A82576813FAC7B8E61C5A88AFF94ECC2770C585ECD292E4C5F9E1A55E0489BCEFFB204D672A6215F4F3980A646D9F880817C52DD +ct = B998B14D416FF33BFB8B90CEA80CC3B15F1B2B3904EB8BDF16AAF43944782D1158949BF229AC7DE3739AE24D00BE3C97354F87D52DB95D38DE1CCE5861C2C6B51879022ECB412C5A5F6B01968BA26073A2B4D50B3D5187EF0983EA79A5787BE6E23C148979E9AB236630819C8E115063514054590670E7FA6FF25913708DF4C7A30A193021311899BA6E7F33F749EC04679CCC6E24C23CBE59280213056D2C71F903BDB769B545CFC1BF53C9C9E825345AD6EBBC6A6086B19E160B1B11CCE7D76BE9F2E335E115A6FFBE367A3EDAB359216FA57C6DDAA927FE58D1A824EEA6BA19FB63C54BC9C25C83F24B51954E2772BCD80246776E5E5950A30F85E05664C54ECDCB55ABBEC7599ACDD9AC8FA721D6EF099C65E033D2CC319D9C6649D5491E0F7160DD4E7EB998442C45B28A6537B999952A77B908896560DE0DE523329C98E94E440814B9BCC1E3ED4103872EAC7DA049831DB43F643766B412BC417A18591AFCEF418F898B0E1CF9D7E8B3961718F3D8066C2A220F6323C68C2A208DC6503563EB2A0541CB98B50086DF84AD0807378360F0997D51C2A7F803CD3435758002F933A44D099A1D72E791D7B8753EE116D5B896A270C4D6559ABEC9EBDD1FD541073400208332D78934953F0C69C5AE9A3CF1E9855B54DD0080E1108CC38F83D6B4BFEEF37C49668B4AE5CFA7551A5FAA8C3660D92C8385CB64495E243423DADE733E03AF0A6E6513B4B272182BE4B5360673E68AE4999A25B090B063C956247AC6781A60BD0DCD72DA26186DB0597C7BD796C7676387B59148FC19280F6B125448600F19643A2B5C7B65DEEEBCE490928BB42C176D51A41650155B1A528CE6EE74B190032F7EF7D337A45ADB2E3BE9BBD0DDDAC77A1B9336B6560518D098BCC8E24C8CCC4C992B8E2ECFFC89B46794918D6AC78A29E9BCC724FA487CFE1EB6D23AF5F76CCEF6A497CE48A05548B19955174997961085133048F3CDFAF716B6097ACDD43CE2CA1CCC1ACD7FB02EBBA182837246D62C0D12195D8424BB998D093E6E578214FADC5CDEE3B41D11727677BFCB381E38F79731FBDBE585E4A5477225DF9730C5108CD0D4E199778168CA84233B35F362DC40DFDDC120C1E033C508A0673687461874F5FC402AF61A62E5DE21B4B62863557794A851DDDD094A20A59219748BF71D54D4D35A14EEE2098D90044A95B4ECE40A679CCF781214E8C85A5BBC8974206713C659A8915753434314117F9D46011C8C687A4BD867B81405E1B8C53D493FB2443514FFFAA6A11A02EE5EFB90C61F1B93BE985FCBE6189635A35F50F81B0457534FC5A76F541B67C2685BD06D9A00AC4A56DAE3AE6FD44841734F89D2E0B42C04F7CE9A4F0B5BA28BDFCCD378E60E2D6101FF560E379FDCDAA13EE79CCE316C4E4D4D4ADABCE0C1FD7D90FA81360B6DB61F8CA5192AFF6E174B227A2975EEC7CF1A01F6A4CA5488B1263C693F5208B36D21C484E205709D5569DA755E5818CE2D04A04B35063FC2A7AEA853AF1E1DB3550FC7B05BBBBEE59D94 +ss = 787ED075F818BE6A0EAE99B113DBA31002097E0B85A5480003C505A40793403F + +count = 43 +seed = 49E1855588B6235DF2A400C4A70AEDF8AB17B6E5E2891AA745F132FA2E7AB0C8117C1DF37C39F5D57624EB77C2B4A091 +pk = 26AB73A3355199A1833A1268A37A087DDB57AB621046DB1F407C804C488E4196048CEB762B9024C2157E7DCCAA1A762881280715A1467E766DCCB159F4780A39BC4F4A59715700070318C2AE03706B639F79A8A81AF34FBF6C9ACE4843151AB5C3CC81AF08CE392335E4FA913052119904745EC68CF3502F4663BDA74522DDD61A318539E10A853BC90A5B06AA12018C6BAC4A8123719C567719CB723B420540EBCD84C2787F37A76C6C40FC983436C26F7FDB14DF17062BE752AF2C1F1CD1026856500F3831CCA75EFF7A08D4D9C819D295674550C1C951FF9A0155856C3CC143824556C09025D55B0DB7192D969926C18912BF5CA8629401B8C53E23832CEFDB369020583B360595541F48573BA1557FD0C1058A8CC5EA7CA7F092B7DC7B4B04490FA4E72A37AAC0E33B1746ACA327258D9D29ACF140C5F70B8F94A23195D60D30A498259C6F9D06BD69F82398953B4FD39ADECA972851431B59C9614B7867CB1228E2519AC130F003903D801F70BCCD776A9B916684CD89CD71723CA732A21FECBB90D547646B987155CF5425ABBB2406CDC1821AFA8DA120A540D1C3AF175032444E1FD85F43F47903665BE922636755B5E75A90931C66E89345F57CA4A032959BDB4521CB62BB1377DC5C99FBE36C71347B81A80B6B7251FAC3732475009A719F4374BD5FF01CCE4601E761A754E05756968F33FCAC4D6A540D93951D0BB4D0D838A3112872020C2DC67718888DBF408941B877EB6543432675C879AA85F102E608AEDF267E32D333CA9C3860F907F17B553580AEC75902EC304E6C7996EE34061B40A9F4F8BA2CCC55775490DC9C2A6D5C0134E809BD305D7445C9EBF7B89F9604146B2E55A1090597033BAB2A25A3886DC524F4908ADBE98DC2D74386806AD641712D9C23A19562E4AC7F57A86FC98663E455BD963C4E63D8471B504C14EB718D8BCD6475CC45687F55099F8FE2035F3812F081B6DF2A174999765CD69433E5312BE67698346FA1030A40943F8927B2CD8A1E2CF2514333BCE85A89A6A99D03C4A5C0B847550972F9D1448D1819B3582B99A50FF97C124398CFF30967013C4DC4D374379B4E8B037EB0E570AEC147A1C99CADBB651BFB576AD61BC5449C5737BC4BA4A01F24AAD80375ACBCBAAFEB564665A192211B4D6918260C1251EAA1014C6F41427465609310D8B665C6763639C71AD48019905CC0874BE438023936856017B5562A9EE79686BCB55E04A38EB9B3BBFC07ACD4865860A77AF3B5ACF7DB344F139F79D5953778124C2C92D29CBFEDC21678E54861ECA5CD350FA09B1365FB74435316F37386B9B510E2BC585DA30A71ECC7B9913921EC8D8FBA2DBC97807B693B1E306832507CAC90410E0576611BA79C1CA9C0B106D0147680790EC5051798592D3035AEF57A0174CBC70B435710C51695852841907D41A8180123A4D911787B674ACB513C84047BBD5851C3E83A8A046062C06BD84397858241C95B8D8D2A2C53038856247506065A70A5A29B701BAE1B488A68C2BF02472D86BCBFE263E7820902102C612747CD60344957A871C7774A0980B70B56F7BC45F8E2BD2085AF080CB923B55640BAB2AA2C30F206CCBAD17BC9F58C1CDA80399962268F2AE99C43BBC1FA7D8949CD772A745BD9AB018FD3F6ED02F32CD2BF845923 +sk = C842401604C8C4C78D8417C804C2723B14733044AA2755897F65987951218361A07AA84D6AF8A956454036B79E145C93B9D4B862146BD4DB824CABCB61FB91BC306F851C9E93AC266E3C9E9C939BE422B07E512D28503A6EFA9D3EA8861E39B1AD481B8AD1805A8C0D48179AA1203C2ED7BB59D5C8EF651281C77F83AC7B49EB997965B161DB025B47CE6E2C09EDD41F5EAB1C8B7B4D20783D60C90DBFE6AC387B629BE10351868186F6A0BF68905F8C1CF34303FB577C25212919533C7044697D9425BFB76BD9D367F43B2D3613351D95395F4C2BAE63B2A4608C69364F41E85D542A08F35B940FBC3B48F63360B50AA88259C7CB4634E5A34300C5957A3644F6AE381389B53210110329FC61519113C17E64782239941CFBB11A647B814372E313205844592CC3C17319B41FF21A0BDA3F5ACAC3F18BAD085C8F27B7758B7519316653BA9C253DC94CCAD37F98D00B9FE67E2A13662C77921E4A9A86C8089682811E53A60B1089A1038483E615E6EB109A3B7636E02A44C2C3A81B96D84336CF594D24172BE1BBB9C7B3685EA45E45B81D731B9B75CCADBFDB768119B20A0C346156CBCD5BB107A00A0E3C6E949B9DB0B4AE21026C915908C5F38413C648EDB20623F35B382B0CD5F4A8D7062BEBBBCC9E809BDBB5C84042BCE2E81BB0D795C6786AF95A7E7B0629F7978A03558F98709A86319570273BEA71986AA92560260D022569D4C98A85BB98AA198DEFF63DC6BCCD1E6032EBAB8CAEE5CF4717B17D89125C67A8A472C371153A4FC9045FD3304A74B983936060F42C80454A005342C1318A284BC5B9A71A39E748A94739536B517DAC1619C00DB64C81001ACBC2793F9F29B42214442FBA962F331D48C300DA2186D21A4DE61C4B5948C7EDD1B9FA5865CAF2280A81B9F7171137D6A678C92745B1AEB9DB686BA84D65F6BEABE332FF036BD113161FA068E74032CA5736D3EA3A01F1ACFE067DFE5A5B398575BB9B148EE6155BE2B4B67B348420CE758C5855102FD06A1FE8D347EF1B073F064F1F7926BE5B2343029E5B7468E93B8ABEC6BE231B6BEE714031E04ED23C6DA37032ECC00374706EFF7453DD931D80029382F17E82A85AD7A8B25EA97D1D2AA21238B25517008B0400281168328B02869889F7F142CBF1AE8DDBA5EF2713DE649AA9AC56229494DB211B90B96AE3B2829AE528C634110A3BCD355A243F3654295B0B79B9B7D43272321959B3632313AAC107C8B7AEB83172778B7B199E736307FDF5AC6AEB40CFE750B7227F46A00B9000880D405877B63FF6C616BF4A51CA11C863A79B0E099308B42CBB7997420008268A3B762B9A5E181DA14A4A92A5B55E7950268A9A83402889A98835CB9562A5A627750A5348B3398B39783009A081A058BBABCC7740AF00B8CDBB4E0842C7F14B47FF4CB424B6252CCCCEE30398023A9B50B4BB4A2C1FF0A007A0A54EAF421FC2113F0353C7A1DA6CBF3C7F5B448B86534FCE3B3B82C3B82C3420BCA7C865AA22461B3D95522E9792B37B78C5555A62A3439F3BA7646076111336079BB8352A286E542094BB58B07CB832E2B288021034ED4934469B1723E57E57E358942730196140F47658258A761EDCBDC046C08BB89726AB73A3355199A1833A1268A37A087DDB57AB621046DB1F407C804C488E4196048CEB762B9024C2157E7DCCAA1A762881280715A1467E766DCCB159F4780A39BC4F4A59715700070318C2AE03706B639F79A8A81AF34FBF6C9ACE4843151AB5C3CC81AF08CE392335E4FA913052119904745EC68CF3502F4663BDA74522DDD61A318539E10A853BC90A5B06AA12018C6BAC4A8123719C567719CB723B420540EBCD84C2787F37A76C6C40FC983436C26F7FDB14DF17062BE752AF2C1F1CD1026856500F3831CCA75EFF7A08D4D9C819D295674550C1C951FF9A0155856C3CC143824556C09025D55B0DB7192D969926C18912BF5CA8629401B8C53E23832CEFDB369020583B360595541F48573BA1557FD0C1058A8CC5EA7CA7F092B7DC7B4B04490FA4E72A37AAC0E33B1746ACA327258D9D29ACF140C5F70B8F94A23195D60D30A498259C6F9D06BD69F82398953B4FD39ADECA972851431B59C9614B7867CB1228E2519AC130F003903D801F70BCCD776A9B916684CD89CD71723CA732A21FECBB90D547646B987155CF5425ABBB2406CDC1821AFA8DA120A540D1C3AF175032444E1FD85F43F47903665BE922636755B5E75A90931C66E89345F57CA4A032959BDB4521CB62BB1377DC5C99FBE36C71347B81A80B6B7251FAC3732475009A719F4374BD5FF01CCE4601E761A754E05756968F33FCAC4D6A540D93951D0BB4D0D838A3112872020C2DC67718888DBF408941B877EB6543432675C879AA85F102E608AEDF267E32D333CA9C3860F907F17B553580AEC75902EC304E6C7996EE34061B40A9F4F8BA2CCC55775490DC9C2A6D5C0134E809BD305D7445C9EBF7B89F9604146B2E55A1090597033BAB2A25A3886DC524F4908ADBE98DC2D74386806AD641712D9C23A19562E4AC7F57A86FC98663E455BD963C4E63D8471B504C14EB718D8BCD6475CC45687F55099F8FE2035F3812F081B6DF2A174999765CD69433E5312BE67698346FA1030A40943F8927B2CD8A1E2CF2514333BCE85A89A6A99D03C4A5C0B847550972F9D1448D1819B3582B99A50FF97C124398CFF30967013C4DC4D374379B4E8B037EB0E570AEC147A1C99CADBB651BFB576AD61BC5449C5737BC4BA4A01F24AAD80375ACBCBAAFEB564665A192211B4D6918260C1251EAA1014C6F41427465609310D8B665C6763639C71AD48019905CC0874BE438023936856017B5562A9EE79686BCB55E04A38EB9B3BBFC07ACD4865860A77AF3B5ACF7DB344F139F79D5953778124C2C92D29CBFEDC21678E54861ECA5CD350FA09B1365FB74435316F37386B9B510E2BC585DA30A71ECC7B9913921EC8D8FBA2DBC97807B693B1E306832507CAC90410E0576611BA79C1CA9C0B106D0147680790EC5051798592D3035AEF57A0174CBC70B435710C51695852841907D41A8180123A4D911787B674ACB513C84047BBD5851C3E83A8A046062C06BD84397858241C95B8D8D2A2C53038856247506065A70A5A29B701BAE1B488A68C2BF02472D86BCBFE263E7820902102C612747CD60344957A871C7774A0980B70B56F7BC45F8E2BD2085AF080CB923B55640BAB2AA2C30F206CCBAD17BC9F58C1CDA80399962268F2AE99C43BBC1FA7D8949CD772A745BD9AB018FD3F6ED02F32CD2BF845923E3EC3671CC7675A321AF8584A0961101C04A432772431E77F5740BA3B2EF488D8C64C049C6DFC0F1476CFFD520B055756162F7EC94243DE6B14AC0B9E5FB366C +ct = 2CBE4AFF154B9B03FA6B19F8A1CF698078A1876ECAD645E7BF54C76787FB3A9E0E8C80574671A194238B8E9C7C42EEC9BD0A07618D33654F392C2E9D8C2A817A4F9F95232E603B9F047A379788EF8D0C548929544E393BEBBE5733ECD4BC716B0B6ED6073E30D93A064D5F714E697446821D182968FBF5A116D7E3BFE5B941A9ED42B6C5F9EFB7252529F8264200387B846AFBFBE670D72D00708B663262EC6E80308B0DF2EE80CC1320C091F8BF309F84FA5941CDAC43906E009C29A7F7B2D3D300B6DAC7DBC0551A50D449585737D7502C37A06C0297CD0AA7F49AC1CEAB3EA844EFC57851816CC01160AA0E62D5330464EBF8DD7A52A126B4CD8DE48E449749F61FCD56E786FBF8AE843FE7E68F050778BAA5C871EDD2DA3141C59C0C92A2EF8F7ABB6FF994843B77599DAFAA571A2AFDC0D5CCAEAAD4F9E025002D06F2BAA7EC5540D81D19E37A46D1DC4BF96F0F85963ECEAA0ADECE063B2730BD51C1D46A345F25E918ABF9E056F8B8D6AE34FD0E0D06120B3D91661DA17F8E4B3E68AF6915D33ABE1ED9FE8B81D7A6ADF08043F0622F5544FC9450D340E35A27B78272F70348F122D744691F5350AF7A3FB6508FAAD9EFC859FB712EF016964CC7D07940CA8B3F2581F29265369EB6D3F52B05CC82549B325CC3F8B2A4EB0A321700EFA8D86F575EB58C73199E02D04D106E0BFF79F65CEC84995DCB55FF4726B84957B25175A47F13368DE3806B386397DF10E64C365F2821B0C4C52AF2E9FB4BF0989F97D102FD70913E0B8E1E6A540710B62006EC62CFD7F907DAEDD28A7BA49BAD94F60698FDC0E6AEC63B3379D95BC84DF7916AB5A07647A777022BDA537F7E8622C642710CE2D3B0B5024E137D46080217BFB3B28EB4E58C4A9537745C88E5504AE10059B68E1FABF5AB7D3563AE2BB167530B9F9B59ABC5D9315A80318EF928CD0C785383B397F3D0244ABD0E53CC2C8E3ACE455964A66D79742C1EE9E871DEAFF22AB04DBA95BD5A5E41BF08CB7DEF3281E4D5DF9A1FAA70CF30ABECFC907A3FBC64FC3E18E8C86F4BEF19BDF096A311F0ABC76692730FA86C39EFF9451EBA149118DE84A70CD6EA2088F52EAAEC913214C79BEBFC6189E0BFEF3F058358C069A5C1CE7F55A00E951B72221BE1F324190D03F6F2005588BCB76B2BB2D5DAD1287D5E60FAC5A4C07331AF3213EF3AA063AE15A26A983490310AE8EC1F1B9B9C1495473207F0C399D4FE27DC56BE8BB7C8AF3AAC5344CEC1BCC14BCC15CFA9A8F2D58B4BCB5A6515E8FAB65EB21731A6465465A2F16D7672AB6E7BDC3F052727A2CCBB03F76F2444CECBC52B5C79E32D757DED4BD925625E3779BF3725402480F1134D707D9EA3D6A6A30D36B3033D3019D7A537B96EB47908007A396F85B5E20D2667149A3B09A3C87899B58FC1BA0C36A1FADC5D4CA07D435798E1C15D01695C40C6497020AC8BA979E11062957416CF08871AB93BFF007F86C771E3750F7E648C37C95161DD141A80D72F7D73200859FCF81D60A321962A5068CB33A8F31C +ss = B81E1EA69C6A6E1737C78FE18C36CFDCD26CEF62DEB805F22A92C49DF6596C0D + +count = 44 +seed = DF0E41D2F6F86C1F79D31FD5878E7AB434FC0AF3A0D5F47D2AB3FEF31A42BD949B0E3629DF9F575BEFBB62E829E51DAE +pk = BAC16E6E3C5E5D9C8CA207A5C77C7883B917FE0463D3101962B802549A87BF39B9BC7A30A5B654C9C96B14BC61506371E4768429DB8F7C0A6204903B9BC9311C66B907C5825621B7EBFB52F6C7CF75C169C17129595631A2FA95920317AAD4CB338329ADC69C6795158558638C474710C78763E012240CBDC2E586ADF93C028522321A94CB766F9E983FB5110A10476ECBA92FC0C120CC83632409940DB249EC569ED5740471C86623B06962910307781349F342C759886F7C376CE708091019FC407EEAE76409387D151C97CF7270319143471A84994BB596F9B5E1A78D33428740FCBAB415C575E478DB4B4E30771802E409B8C1AD4ECC9CEC1B7396E664645CCE83A40D512684E0B2750D8445D2180BE5B4CFC09BC9FFFC8D6E49B49D68C4D849B584512CBB55283722CED5566149811545609A4C5459F523C1C76667859760E690385F65768331B7654C30B8C0B26F2B8089A3C5B4F21EED42179C54AE61D22736512FA3AAC6EB018946A47CD79ACD545719C829B304477541EA92B10A1CCAE8B36BA83D5AD83083FCB51DF653CE899227C52581699B7150456CFA1910212F7678056A33755DDC7D0648164AA297F196057060009DEA8D87E86B6ABC0106A5536D7C83933AB12E294B4F50870FA0BEA16AB49B88A60BA7790549CCC0E6571E81875D5632DD8A5627E48E0395BB4C243ED9D53CCE7B591949408D2C87A5E295E3C3231F4132E1117B835529456A53D3D748C16280F4D597573685B04780F611094C665C66164A1323C290BA8C8B1031B142A3B53062AD5C59D8D112F9926E5AA591ABA711EE2BA1509AA09B86C60A969020D74E238B849374BCAE7788FAE61296D5AC7AD0927EE30912C4287E3981B7851D5823295076365196BFBEE4A3CC189020254F31B06FD8D70C43A94CF380C01936465A334FA59B3D39296305DC8B775269EE204639BB3A30AC437936CBD734A5C6477B2A451EAA0159E571BB12473B77698621D5247EB5012F608C6F070A67551F6F63ABE87BA12A56B2B2DBA44BF72E01C9A2C490579D2C103CE91A841C4F4B3AAFDDAA0CC3D33D31EC3FFB4A3F9AB87F93494720D386BB13CC482A4ADAC46395479D1421AA91216BBF56BCECB89F11588B4085A62BA0A47EF9A184C2C9346525CE006CA4819857FAC8B1498C9CA1222175CA5B01B6BD502F69F8977A0B3B04987A1897A8F2F20DCDDB098AD070D15C15C099A5672C17087C6B58245BC25C382ED3BFD5BA9B8E48932A27546A089113F37E8C85971FA10D465970D61446F106CCA6200F85EB2DE2947BB4EC57E58C1F7BE6B6FBC025A4A41EB05C516578AE9BA4C197B692D20976116BA35660CC5B612B616269A837012230B65F2913E5D0362D0B510F1272716A4DD2832D3BACC914929FF33354C01217D8A0745C9263B5D80A4F497D99D98A4D895B59A59A1DC173CA6945FA54C398F351C8C3AB8D66CB8971A68157CE3CE82104094FC83C7306D242F1F0497180842BEB8E126988C5A830D2A39C2711B033490FE1D53E432C7A453B4CEB05A5644253797135231228F246BC6A1445EFC16B2F2BC674327A62EC32DBC209F2C4A5C600920D2856DC34549BC4656F7953E697CEA6F2891FD65321F89BF2D90CF3DFC681C2FD81792135E1938CA482EF3C253D8976201852444E +sk = 0C9C633FF39D1C6C29F8356AA02981DCF189D6535E2AC00750C30B111A88B21024E4823E7D543614F30112F7C78F1679DAB68B71AA992538658FD0C8E2984ABDC09647453B3FD99DD860238CF40C9112A7DCB57E06540148EA4AD6F97020474AFB65C5C67AB4FDB1515C6592941B1E38D4097155BD194B5324F464DBE678ECE9B5F8F57822F87ED7F3A6B470CA3FEA3314B4BB404CB66E3BBF8F2953F2682CDB65CFB47906B3962443775796564D75CBB4B9BB24A8A98D7723269E8204BA89782F974AE591808E97CB2468252C8539C2454041C9232F33B43ED8359DD6856C98BA4FC09E92F9A4AD497F8F1159E159B5AF795AB09C20AA753931F47764B6CBAB6968C7A779802B469ABB1E7F677A0A485FF5CAB2F028112EE8C35152703BB14127B33FB00A0CE21CC607E49A73544029BACA215A67091A9AD89A408794C4D2DA78557B1D31686C6B4C3749958EFC60891F12C9E0B7C19613823EEAB1D8F672089339E46C16DAF0C3B7D53727605C26A723518A2651D8762AC373817BBDDBEC1EBCA2CF91FA2A66896C55A4C946A791E5502FF19AA21CB132322BBFD127C10D87563028BC49B222E5401ACDC81991828E4C111A54566E5724B40A452C0F4632B7B85F0445C881938134D516113560B0065BEB409FCEB25F796C0BA0AB190FAC0214007916CA93C2ABB11BD88553AA34C3C518BFEC423728C86E529C300A1F70225F2F683911040FF9405614E1BAAC070E0E90337E134E3C93081514A937F9798EA7B57B3A3A0B829A2697B0778C802116C067A5C368576395C43D33882F97C770519C16426284E19BAC180A2A6CB85D65B1A115316B08541DC231C123C184E82C691F20749A4B92F2D1040D09519DF7678AC282FFF9CF5124ACBE04388CCAB61BF71B87AB3B830A3EF6700A68B06770012424031E89A895AE81C8ACA9169D6495CF01CD8BA0C27AE132C16AAB0EBC4B13ABB37D67CED10A0246E87BE1233FF09A6802F6371858972D21B48D410D8CF3A8A1E664F62028CF851A134037142C20E8EAAD7DE32581B39B5D93221CF72124A73DAA2B61F3D7C8F25A973A815B351206800BBCBA60AC8C2A86A7758B38339751C23EA5523D84EC982A260256C69AF739349D206CE9C9A70DBB0A950A0B63815994A6878711578BC22942914DF8489EC5A09258EBA796E8A6FF5483A71887E55783A94201E5B88898870E67D32EAAB132519624F4B28F22E80903E591331CA792C0CEF824BC62168BE6EB8F7BA299BC519B0C370509E38377F171761521F8FC882D1B8D0DB3C2109A43D1754F75529F7B071B7492B753688FEEF12FDA217CCBA484AB79192B7933781811986430BCC010B50A5621EC15DC7BB545CABC77C336892A0DF4436E732B905D70769865CDEE0A9906438E9D921F521862A3227BAB93202DA0CD19F6221BB68FDA8155AE38132CF2A30A4A5C3DC0B17DF0016FAC3BDD56CD9D06CC8F2C6B4AC41207FC1AEAD0CD87506CAF5C043941513F0A4ABF725818C7686F0745ECE93C23F2951EE263F51A3FB3630076DCA4EA80A156DC6B4248246F638024B8782C9757E076CEAF18CC27284C321BA91766454640AD32D97E65650B39C9B23FA80405F8CEC82ABF70EA4FBAC16E6E3C5E5D9C8CA207A5C77C7883B917FE0463D3101962B802549A87BF39B9BC7A30A5B654C9C96B14BC61506371E4768429DB8F7C0A6204903B9BC9311C66B907C5825621B7EBFB52F6C7CF75C169C17129595631A2FA95920317AAD4CB338329ADC69C6795158558638C474710C78763E012240CBDC2E586ADF93C028522321A94CB766F9E983FB5110A10476ECBA92FC0C120CC83632409940DB249EC569ED5740471C86623B06962910307781349F342C759886F7C376CE708091019FC407EEAE76409387D151C97CF7270319143471A84994BB596F9B5E1A78D33428740FCBAB415C575E478DB4B4E30771802E409B8C1AD4ECC9CEC1B7396E664645CCE83A40D512684E0B2750D8445D2180BE5B4CFC09BC9FFFC8D6E49B49D68C4D849B584512CBB55283722CED5566149811545609A4C5459F523C1C76667859760E690385F65768331B7654C30B8C0B26F2B8089A3C5B4F21EED42179C54AE61D22736512FA3AAC6EB018946A47CD79ACD545719C829B304477541EA92B10A1CCAE8B36BA83D5AD83083FCB51DF653CE899227C52581699B7150456CFA1910212F7678056A33755DDC7D0648164AA297F196057060009DEA8D87E86B6ABC0106A5536D7C83933AB12E294B4F50870FA0BEA16AB49B88A60BA7790549CCC0E6571E81875D5632DD8A5627E48E0395BB4C243ED9D53CCE7B591949408D2C87A5E295E3C3231F4132E1117B835529456A53D3D748C16280F4D597573685B04780F611094C665C66164A1323C290BA8C8B1031B142A3B53062AD5C59D8D112F9926E5AA591ABA711EE2BA1509AA09B86C60A969020D74E238B849374BCAE7788FAE61296D5AC7AD0927EE30912C4287E3981B7851D5823295076365196BFBEE4A3CC189020254F31B06FD8D70C43A94CF380C01936465A334FA59B3D39296305DC8B775269EE204639BB3A30AC437936CBD734A5C6477B2A451EAA0159E571BB12473B77698621D5247EB5012F608C6F070A67551F6F63ABE87BA12A56B2B2DBA44BF72E01C9A2C490579D2C103CE91A841C4F4B3AAFDDAA0CC3D33D31EC3FFB4A3F9AB87F93494720D386BB13CC482A4ADAC46395479D1421AA91216BBF56BCECB89F11588B4085A62BA0A47EF9A184C2C9346525CE006CA4819857FAC8B1498C9CA1222175CA5B01B6BD502F69F8977A0B3B04987A1897A8F2F20DCDDB098AD070D15C15C099A5672C17087C6B58245BC25C382ED3BFD5BA9B8E48932A27546A089113F37E8C85971FA10D465970D61446F106CCA6200F85EB2DE2947BB4EC57E58C1F7BE6B6FBC025A4A41EB05C516578AE9BA4C197B692D20976116BA35660CC5B612B616269A837012230B65F2913E5D0362D0B510F1272716A4DD2832D3BACC914929FF33354C01217D8A0745C9263B5D80A4F497D99D98A4D895B59A59A1DC173CA6945FA54C398F351C8C3AB8D66CB8971A68157CE3CE82104094FC83C7306D242F1F0497180842BEB8E126988C5A830D2A39C2711B033490FE1D53E432C7A453B4CEB05A5644253797135231228F246BC6A1445EFC16B2F2BC674327A62EC32DBC209F2C4A5C600920D2856DC34549BC4656F7953E697CEA6F2891FD65321F89BF2D90CF3DFC681C2FD81792135E1938CA482EF3C253D8976201852444E79836213A513BD4CFD42ED281304E3EE4560E4E0C60FA53781F83D5BD2BBEA52E40771856EB77E4633504899FCB86C6A3D433D0B8D60E26F07BD61F1D4ED69BD +ct = EB1E2D9E00EEC89D9C0133C36834B7704FCB880E87D28F6400D5B6FA85C9585518C29C860958C2B6B1A239BC55B212796ACACBC4A2657D67DD1B61E9C36EE9682FAFD6E2231883B27587CC5CD4C36B7BF29D982D729BDEDABDA928370989F0F3FCE00A44561EFCC2A5B77F16B4C982554783D43CED6A55BAAF9FAB462813A8BB2A98CF16478AB4F1E79D0120D753EC0BCE0B4884FB27E02FDB881F7B28023D91E23340A67DC9E61B64AB16AEC77D36DCD0CE1900A7C6F3758A49D36ACA01E8E24711171F756A3A01923D896BFA63763244794BA3D01710FE2EA4064B70702ED34DB2F715B2E59683EAC0E66B6BB392DC22FC398CCFEF06764CEA27A3E2FFC329DEF35F16F357FB9A7ED25066B6A6310EF657FD348C716B468EBA86594CE6A5314CFB9BFE3FA04F849ED485459980D0FAE670A2134908C38727021AC148D041B496A97D09EFC807F2EF9A2DBE5F1C3043D3082A9E8108C020CE7B7CA6777FB3275CD0C8F8299E8CE81C1972C079BA37BF2C8BA717DA95E26225F7CE0D32A96D42045A1163A384988DFBEB1C9C68F142F1DBE10BE93F0FE5B2A2E4235ADC8300DE98A6FDC2EC76D34C4EE15DCF33DC939E80AF2DDE285E72D33E4E49A6B7DA54E5E29A072C5D19BA548D714EB4C50C9E8FFAECF92CF0B66E2D365127836E4B0B6151F29F7B8081E7DA720AAE3C66EF3D7FF2AAF0693858403AAFB7C8CFBB4104FB2F1F286DBDFCDC9A9652C724CE3F46396DA21D18A8CAC249FB2C564C638A90A3BA10295A3995557E5A171626323B1D5248798E99C8A5E0AB96EFA39BFBB2774BEFDD5939B385F881FD60CF6F86697141738307F8D9EE27863B58D83DEE565FE12308D56887AAA93DFB8DAD892792E9D2E417C4AD98E93969182BE4EEBE50102B2DF3FA72A21D271913342283F679ED232C1CB519F152EF163E3CB85D2C3F7A5E0BD44106ECE5FEC8F7CF339C4ACAEF04A1CE520EF5AEA622D63738848D7E9AC753F95267D141F4369A1E2AD2117C57523342A32716FF775F332DEAA64B6038A4099A8AD44ECF7F38C1395DD2C45ECFD9CFD7F7E3565E48EEA8C90DAF62908C402E2A421613BD321D7DC3065B6825BA8A3ADD20EAE7A9BF762446023F2DBB70AF8722C9B1CB20B4622A79F442C548502DED82CE1762DF2131BBAA0A5384B8ACC0AADC823A0042B91A8A3D32E8B003794EFAF87F28FBA18DC7D4EF29016F59D952722CCF1CB27771E5DD17F395BBD1F1FAED18BBBB579E8FB8F5A704AB587BA645EF4B51EAF09D938C30F9B79C7D67D665A9824738A547FAAE4A6C0953A3C529209C175AC946F733C5606516725A1E0626BF684A4D3AF865FB95EBC5ECA314369D5FC97B53A76FF921371E0F161F1E8D32B471906174A0B667B9C16881442FA631A169061E6B545C2BC32528AC40370884F3E9F362B2CCA5461A92605B0D7D270176B68EF60645AEEE9948FBCC1E1F26F6100E82C1FBA412F5D5BFEE5158044416CD9D4C041B17503863815CAE0ED0792052318B288B5DA1CDEA8C0A49AC381376 +ss = 5D014FDCC992FCFCBDF3AF29E8DBC9E5024F2AC41E71A3EF0EA43A063BF44E79 + +count = 45 +seed = D3C9EBBA6EB03CCB5C9B9D2C8D7F0CFBBF50841E24396CDDF0E56525B38918C2FBE6C34CC1B93F7BCD4F4D5777E1A488 +pk = B873B2397A7C7ADA2F4B0B589EBC97C50174E4317ED5D9CF2878C924937BD258BACBFC83283A218D443D8EE43F8CF3C64459B189E6B3AD100A6C6A3EDE9916F89B8BB67CAC332C0519F502A4C427F5C9AF1A16A59A2122521A0C624A20149765E986339ED63567CC29CFF15D7E8AC026C96F08D6AC4E057DB4E66361B18CCDC3BCFFC300A996AB7346232DB7310662C75B39AD7AA080B23763ECE54960397B8DE836071B8914D56F95A681ACCB8FCB9529E5E4CFC2EC0601F7B0B291524E180AA0A69FA74AC2F17AA88162C481F51543A5A527DA5C42B59F9A72B14DC91574B51E5806ACE3F022D1F19E3EB621560478BB70BEB8407719A01E16313D2F0C785E3B9886F679ACFA465BA974676C0689A149AC04996F4132DC4974F2FC322B56115A64B0B5DBB8DC71869CC655DD61390B032F062B024BB71505640A41CC6174B68870DA11EAEAC28AD061F3ABCCF4E12231655EAF9285B205251EA69371D90527793495835715AC005868A78B1CAE80025426848C4AE869B52034BB266E1B97480AAA7A31E384780442D9933FDB750EFAEAC0BFA802E5314D28A17D374CAA05B46121E16362E8341DD923A66872DF3C942177B58951C40AD1641F53A53D8708EBCC22AAC67EF262B6155007DC6880A1F45CAD3A5312B282055B1E0B181D9B396591FA78DFCCB9D6A92D5CF8189C14C68CF4238654716F0A1E4F2542CD35A7E4E2185814C1F5B16D8C423213C69D5958C46960B8DF589C185087EC5474DF3C5112B5BB6BBCC6AB7160ABDC2AB28801D775CAAFA049479A837CFC8847763559EA86239889385BAA43A2848B489087FB43AA20ACD7AC05606767798500F9271271E52032F21FC2A82D8D15BF774771B69C570EC488053743DC5398C4363AEB3932A5C54D16F45A033386DBE3B2D0A851116C2CD2FA4671B95CF7E60BDCB4976A2393647B714031870B1A6B2D486A5CF2A8093B7B948C9418F3A27F6296EA12336B8A6DD5A5715CE9A70DC6978038369A10332E3AB6C2971961D5C66441ABC3290113B21C46E96C509AAF09E658D9B77928935B9A122E42BBA23F920B58EA48F3F19A7924128669C09E135F772C275E55904400495153A691794A8D182EE1314446371501E87C41A944F850C9CD288CC2EA90A4E27864C79E554CC5924C4CA9A217DCA424EE8B76E49993AE4B085E9809EAE27401EB9C6C794A67A31705876243478F86D5B9F9CB3295422816526439950A412B4D1D28A70C6B9794C959BE155AADB39E00B418EFD0664B08843D20B71C547F1468C5FDD92B9D818336282F34F19B515946A7961B5A9319D9444CDC1ABA840CBB57272E4DA4AB20FACD5FE4958A57C3C812978FD772C2862DEA8B60B30A601B692DADAABA0F361CFF27C5C734A42265341641B861B7899CB311E7E0ACCE396BCE2809F24289C5361B91CBA88493991987C0ACA3B070411481E154104C15780ABAFE725DD3E1ADF00BB0EFF4A29298AC10C63FC0669DF6379294AABB4588AAD2087C9C16C9AFB654F0C9C213D79CEE1A843A84742D574DE252A4F24795E9AA631D5198F07511160300A2E02A402B4CF8AA556CE67BD341307CE5A1EB6609EFEA3F066379865489701783B2C95EE6967F0893D44D76104BF396577FD719D69EB306117F3ABD65385A87AF12D1BB6D0433 +sk = 2ECB7CAA911A2F615A13CB82E5A8BE85E1C2BCF06C71B9696682532639B57A91537E470E8514390949CFADC80B0E5C3EE3ECA869E22250560D8896B5F6EB0FC6EC0A6D01760C9108B7A26CD79039BCB3CF9EA0432FE0581626CFEDABC12F758B407C8E9DFA373F45C377FA6D41A7205A7322B737CDABC8114DF437E864C4ABBB3DD084964F971B36E24406A7A7544A260D917C0EF95CCF33B1833BB6D4232BFCE37B96004ED7779258FAAEDD9ABAEB5051D8F605EB85BE0F9599FF28B40587488FA376729685A8336C0DD213F55447E2C4895111B98E73BD783B2D08960ABCE22F6F894AE5456577A81156C66F6F1BBEBD9C04D1AC43B77936F13060D3305A3893A825781E47928FC492ADC16B31B2669882FCA10581603B400F297B7FE7525D20E82958099B2D118ED3A14A8A915731525C470B7852A9B0EF04B4A3B0B65B4C5D7D486366175540A91E752993BA979D8A446F94088C7C3A02FD5C051F900A141957E63CBD71AA012DB60A02B3872F3A623218A6B1F628FE8580E8725D9FB647F128C2519A8A0CD0649671616B462B83904CE621C95FF44697CA71CE930EAF0B28A6448A1C6B38C14800427683B71C954E49B6A3B978417B78DDB1A1B9729B89160B4C7BA49F312E23632460913D82D655D6E00B5B17A635827D8A0781E12A68C536AB40909F46A7173FA9CC9990371DCBC0B8A433436133AC123A73664A14E1409B4476AB001C17F26EBE968ED8C6A9D491B92F234499435E2DF615C849BE5F6422C8BC9DE8F148A7C0713D93642DC852B33652287010F02B1D7B77972C797ADD3A38651B4C11EA968CE53F10D38DF4160101FB0EE557BCF5B3328E12150A7C0D769812ABF2AD2C1C7661844E6B34B25E7A30EC64B6E7D4282F48344BFC6F33AB3C428C76705CB9B1E9637721C9EE60874017013374082892B4AF174749041C606B3F6690146BF1B0C8D2844F80594F265A8FB639E209C9B7FC418A230AAF340BBA34C1C66B7D570918ED6CAF8F62768620058CC7CB4FE1C762AA96A5015B82216E204C5821022CAA84AF9B12B9C9BC683747A2724C88E650539779742EDCA6A6A6C5F5D68FAAF73D4CC7AAB9B105F3A1B46CC96C915912E807AA6C841F6BE63812062ED1D07BC9164ECCEC7E6662056313CC32F63C6181CF3343ADC9073888D5756F508D65025BF6490A5F6B164A942466E60C4410C72AA69D2CA10459B890A4CB22A7613D44E70AC96ACA21169F932A6134D27A6C05582E830C0BA137DF060C6249B360831CC6B993E3D455C2E61694B11B520C64078BB552A65A3BAB407D46C0EE173BBB52A95C7CBD8612380FC0CF1655C8E691BB0493103EC80A5FC92B4951A0D78768504284AD52580F16247B3C44AF0A397F28CE3D0C0E4D34CC48B26B3998B060F2A9A013889685446B6281B3341C08E8300A013390A881A3A4937B412BF4745B069ACBF5315B9955AA4999BA827BCCBBF776829291A9067272059104522D69D1834886BDE76C078A6061305833FEFA710EBBC0DD0729493A285ACBCF2708CF93ECC76B85691E20BFA4379C8521420C231F68429BB5C76E69378F6EF3475FCA5760A5BE829C2B4FA955E0E0931423B0A615194C26225BC538E2DB29B873B2397A7C7ADA2F4B0B589EBC97C50174E4317ED5D9CF2878C924937BD258BACBFC83283A218D443D8EE43F8CF3C64459B189E6B3AD100A6C6A3EDE9916F89B8BB67CAC332C0519F502A4C427F5C9AF1A16A59A2122521A0C624A20149765E986339ED63567CC29CFF15D7E8AC026C96F08D6AC4E057DB4E66361B18CCDC3BCFFC300A996AB7346232DB7310662C75B39AD7AA080B23763ECE54960397B8DE836071B8914D56F95A681ACCB8FCB9529E5E4CFC2EC0601F7B0B291524E180AA0A69FA74AC2F17AA88162C481F51543A5A527DA5C42B59F9A72B14DC91574B51E5806ACE3F022D1F19E3EB621560478BB70BEB8407719A01E16313D2F0C785E3B9886F679ACFA465BA974676C0689A149AC04996F4132DC4974F2FC322B56115A64B0B5DBB8DC71869CC655DD61390B032F062B024BB71505640A41CC6174B68870DA11EAEAC28AD061F3ABCCF4E12231655EAF9285B205251EA69371D90527793495835715AC005868A78B1CAE80025426848C4AE869B52034BB266E1B97480AAA7A31E384780442D9933FDB750EFAEAC0BFA802E5314D28A17D374CAA05B46121E16362E8341DD923A66872DF3C942177B58951C40AD1641F53A53D8708EBCC22AAC67EF262B6155007DC6880A1F45CAD3A5312B282055B1E0B181D9B396591FA78DFCCB9D6A92D5CF8189C14C68CF4238654716F0A1E4F2542CD35A7E4E2185814C1F5B16D8C423213C69D5958C46960B8DF589C185087EC5474DF3C5112B5BB6BBCC6AB7160ABDC2AB28801D775CAAFA049479A837CFC8847763559EA86239889385BAA43A2848B489087FB43AA20ACD7AC05606767798500F9271271E52032F21FC2A82D8D15BF774771B69C570EC488053743DC5398C4363AEB3932A5C54D16F45A033386DBE3B2D0A851116C2CD2FA4671B95CF7E60BDCB4976A2393647B714031870B1A6B2D486A5CF2A8093B7B948C9418F3A27F6296EA12336B8A6DD5A5715CE9A70DC6978038369A10332E3AB6C2971961D5C66441ABC3290113B21C46E96C509AAF09E658D9B77928935B9A122E42BBA23F920B58EA48F3F19A7924128669C09E135F772C275E55904400495153A691794A8D182EE1314446371501E87C41A944F850C9CD288CC2EA90A4E27864C79E554CC5924C4CA9A217DCA424EE8B76E49993AE4B085E9809EAE27401EB9C6C794A67A31705876243478F86D5B9F9CB3295422816526439950A412B4D1D28A70C6B9794C959BE155AADB39E00B418EFD0664B08843D20B71C547F1468C5FDD92B9D818336282F34F19B515946A7961B5A9319D9444CDC1ABA840CBB57272E4DA4AB20FACD5FE4958A57C3C812978FD772C2862DEA8B60B30A601B692DADAABA0F361CFF27C5C734A42265341641B861B7899CB311E7E0ACCE396BCE2809F24289C5361B91CBA88493991987C0ACA3B070411481E154104C15780ABAFE725DD3E1ADF00BB0EFF4A29298AC10C63FC0669DF6379294AABB4588AAD2087C9C16C9AFB654F0C9C213D79CEE1A843A84742D574DE252A4F24795E9AA631D5198F07511160300A2E02A402B4CF8AA556CE67BD341307CE5A1EB6609EFEA3F066379865489701783B2C95EE6967F0893D44D76104BF396577FD719D69EB306117F3ABD65385A87AF12D1BB6D04330C2E803C2872400C49E1BB10232946AB939319E84FF32CD354DC15D082CDE5A3DED5EDAEC5DE3BF5B4D7C2F2E18E87F499C1968993EFF196753DB8045E2C8BA8 +ct = 388475CB89B7F408D2A18DD764070424C7598C459F203221847E08ECF1FDBD3B5F1878CB148EA1E42A1790BAA2432029C674916130A30AAD99DCA2ADC8AABE96C9437AAA361C0E28110A8B6BD9AAC047191B728D9C84EBEEBC7EA2154EDE6065F9313C47DDB6A05413FF5E3571F69BCA571770E9E217136038607BEF7F60CF079E766CACA7875DECF7BF7A8B54D688BCB63EF920586F4733AB3D86BBA18540A20D27C135119CBB7DB4E0F8896B0744557DFBB3C0F615130505E59FBA005B57A317FF4C87BE8906B54870A0C46136BC89E144502F41A2B4564DA200E0AB5A3FA91836F4858FF298456F0C475BB3B8BD057A63B6F9B5DAFDD76C2C111F7B3A933A2F3CE069427077C58EC94A158B6CB4C13FB027CFF9DF3FC7CAE5BDCCD31E3F6A3BC95E6EFAF8CA24F773056AF6C8D9B2798057E2366BDD54FF417B8BDCAD4FC0FF8E64C6D258438F98DD0682A716BA2FCBA64B4CB559630635D115DD846B7182DB50A7B92C73463673CB017EBE6CCE190700E73EF73A790FA85F04656D0085023F483F50DCD5BA9F0EEF8B3E5EDDCF0F4090BC2D243215321E606C4107FEA5564041C07705C545D7956A8E163B9B641C7CEA51AB67A2C29BFFE9C7CF0D3941C0E45664A40F2AB5031C2BDE8EE7E5AA4228685A845F4CBDE42DC3F9157F4FA03631299C84149206B7E087CD56A5809BE0A7CBE54509A29AAD8465BB737DF2631E86DCCC3ABF5ACEA6091813F1E9DC49D9F998C56E72972D9CD51A95A95B59B9AC98B8EB07957E59547FDB243F873FD5A3E77478A6F2368177BFBB95F2D8B2F7924655E271850A72680D2C7ED2CFE57ABB59BE1DB29A84C715828AD7E06E1928747CFE2E1351FD07534AB50855818EFF4CA87A60E86217F991C12380255CCCA0FEFF97C35C7214157F533AF3605B54902AC8300C8E4CD496033D3D05752B3AAA85F5CEFE81632B19263F944C637DCE318E55A8A4BC5AC296DE727708D86367970C17DAF3012DF0AF19A32169153E6C07C28379761B64CA1B87D7A1B8680B9749936D205DA28B2E8E9AFCDFA26C975914332538A54730D96037AE74439289AA97D76045103540230003A430A067C58C881BFBF224DF4DA5841D1B6781937F933267C32698908A6D31BC0402E3274657ADF416C3C9D7378338593442D4CCDCDF7ABC61A45C4EBA05C0737EF175C6F01CB7022A7905A365866961F7D45FAFF18455553012D1A79225A08871971D926D978B5ADFA1723314991467782B9CF2FD063CA70A49EDAFE31BAF3CE55016713CD15F8828A09FA4D6D093C29DE550EBB0BE37FCF1C5A4B6556153578587A0762054EC01E0A114AE186FBBD97BD83F30B411563B4E4369D7A24033ABDF1C0CDDF0958F2CA2272AD358F4C60EC7251E899C6C11B001E4025A6733B270A893F384EAA93DA2F6C4D8C2DD92A1B9305252BE65C3776F5B6DBD92EBDB9E12955C1358C011AFBA5FB7E52AC27D64FAEB290177CF6195658E6D2BE5D6040DE2D26677D47349FFC38123B576A6382ADF7816344D7E257EBD +ss = 80548D4687DA93177D06D98C1E2DEF33FE85E770F8B871D2F74CAE533F654692 + +count = 46 +seed = 6B3996E8BC6F52879F2B7BE012C44AD555707CB7E5FD8ABB3457A298336D6FDC9EB7853008FF13201D5969A315C7E493 +pk = 0846C63E2C3018BC8733F05F8CE3B614088A787669205AC9889BCE2D3B523F366F4BF811F004666B2B654431B135D97A70A00FB9A3928C1A4A2C7285F6F7B19BB766BBE6B966B4013EC06833EC6F1118A772C2465D81B77BA740B7EA33129218542A41E2F1B10F42BB42396E9A6C5011351E783641AA692A982272D9544AC93580FA6A51B8C7B6A4B5B1CE3B58F1D901855BBB2B68B988953AB63607D988999ED96E5A4B963497A061AC69BD90C4EAB7C0DC17820B6963B0293D4CA30D82F5997A877A9AA71C5C7893C1D153AC6779D0A88190B13DF828BF3AFAC9D7EA392FEA899EF844535187AF673972399A5FA31034C02D70B57B97434ECBF3B1985C86EC75B23AC0AFAA67225F12A257B78341966BFD2569670680E012899C112AD3873AAAF26D2F4A5C8CC133C92B9A446530C169B6B87B118D03329374A71ADA1778A2035986CEAE200C763A12B6E2B2FDB672B4D58D8BE640E61576F2CAC617A5ADA5D1B874BBAC9D272EE4C881BBDCCA1C9A84626012B988395EB5A4A48BAB1E7551B6CB57EA7B627138C3AC252BDA1A83CCFAAD69E38CEDA6B149C1B3BA295FD5025C63225CE88CCDFBFA6B3950CBCDF96E14DC0962745A5FA32D10525F71D895A2085620C89024D922359741BE366CE9038AA3B260320A456858A7B8D01BCA12316E9C6D1782BEDCB590A1D2AD9ADA0C26D3818652CE6F3B6403C94DBCD1424D090E9DEAC559472C9AC19CBB26C16E8B27DB9140A1161EA96A171728689CD6B6BA0C8002BA6C46719A1A0C175638770CD088AE29A7FA958209788ADE14354A1B0880F05EF7C15A6786BE063B357FC7521973ABE4FCAC0A8C26F3EAA052959E2F973709C9C6BBF4C889C8B76C0AC81353B4A4DC81B7D316F75ACCDD1911DF10A7E838A7C2023EA1EB0A956ABB53FBA02C48396807229F492966796805E04AD62B8107493AAB264A5BEB32F5459C06AA6E7F79ACBF171899A911FA910DFA6687B2C28C1D419A4817ABCF656FF669B587B72374F3CC20B92858361D21BB85A3B9ABA157100875C993B54CCBC84DB2D72374BCAE29C5479CC95197E625DA047447EA5797551595853651912DAEC4891E68901BB67FAA98BC5050BB50E913645874FB7A0E51C816ACC88A7F8A4AD383170A583A2E17B0D5766E12DCC827386BA8D868EE16B2FB892ACA3941CDFA7A487C13AF9787A309779B759CDC037C13E839314803BB10A3AB19B7FAE477C8C322BF05BD3AD9CFB0B241371C85FFCB607748CB518A6C896830B191737BA289B15288AB59869E22637C57019818801EF9A6B7160AC1B5B4D7519B41905E6687B3FA7230EB88A3C9530813561308B68BD2B740E7AA08CA72CD6468C008CCAB34AB99B6773C533B3914B19B2B80BF7E783E7BD9366C8962E7F3410F34651EE606EB737E6C9C5F6D306AF7348CE955228CF02D15B8ABAED16994B56260221BEB1A29BE5596E204B9CE111127989BD2AB49CF27C976F74AA7B084FA6B8400A25F3C36213F7C2D160045D865C75AA14542F5A4E4D1459B5676491C6A3FA0A2F0319CA1A63A401C9C3A14C94F0016A9A69E64C522AEE93E8B96B4F6691322242B20353E0D8B995A6A9129E961AE7349F92C92A90B833E82B9FAE1AD459AD417635C409C28F9EF936AE28D221563E30F83162CEF01B482889E +sk = F3AC3178BC3E6B8002EB20046EE3288F9CC63C1ABD0B14A118D52E2C9A998D4C67E2014415084F520945F55B985ADAC8C503079789AECC491EB7BA540F32BE8823A4A837786BE140D260CFF5D46186588F4FE2419E0C4BA1B619567B9D8206B53AB1289640520F2259F5D6854871498B23696A321813D7A544E77FB3100B34C89AF2C63856FB43BB0A74A6073958D1199B4098386984847962B353B4D81AAF4CF65349C8197DB8C1B29A91FDE5AF1F9749A96B3B82C567207A81A163347919AEA565304B4820369799D352CE72415CF1C692537A48AB603B9DC741A08A66D874BF46DAAD570B6F1F4133067A1D900CA87CC25E91C4CE1C84B46D3C5BAAD46FED227268F1A9DBA968EFF27249B3C6E4C7C19E8A13046A2B45BC24F4304A80C09D37AC289F924F33E97181B8393EAA82A6FA54F2E76DD88791B5C3773707046C362D94EA547C3050AB251953464F4E540764B08103A88E448446F6B82375C15E3CA9A98798639B83638ADA857BDC1E3C6705471975C51B8087A26348BABEFD234D27D6C055D3AAB7560B28DCC13D343A79530AC868B5F6AC83AF04B8D7A20B64DABE9DE32A5C1B2C2ACACCC4588C1BA26F5462AAA5C1BDBC36467F346A1AB5C5840A07BD33CEB44093659BB0451C4C87CA4852172DC0BC3674B4275078CD2B9A3AFD61BFE454107D092E5840C4968C547ADC723C1970CFE705C5D33E3A4533F0028655C6BA44AB22C2A4C85A82B4B6DCC09765124E43C985459CB2AB1519DB1EC6F348D017A785484802D90E0222CA2313B4FBC465DEC0CD4F3A5675E33CF0DB79145867D5F0B8F340526C8A744929728CECCD146B6E66D03F660AA4E2E15D200B5960F3A03B571BB2E59160048E498C15379027E07987DDD841BDACA79764BCAA1C9843FCCC65B53695335D9D4CC789E062571665DA99B4E10368467AA551775C39C7C9DFE7624E8940F294C8655503F2F970071B40F6BA3544C64C41887184828BE6057A9E972631604901A7870733580C6AB8D4AA18B49CB4D567577AA8B0CA2490EDC68B168583B8B38415D32F5558996CC911A9470951430C36F71712F1C579A12327C41C441C980C286B71A31748EA54DF2A557FD1701C3173944B7B40117EF9CB08A7D03D45531B8DE4C753F697EC4B4303448C260B0783C81ED599425D9B16806828BF795C8CF65A95F366BB90110CC75D3E6064BEE17CF1497F36C48E68B46EC07417B2A876CB556C705C7DDC387D74F2B0AEEC9070D227AF09A324495F551680A474328D379AAC253A6F4C42C865A183D7C2F4F8CA94A92388B1AFBB5408CB1C0FCD3C945E2923ACDB7E16A45C03EC3298B3C44E9C1E75D049B2EBBCF2F29A2D3B7FC68644530010E052A0D357809009CD786604A39898B385B70AD7B3BE011EA83B93D4426F4F20A3D0836FC6FB532FA14536285013050C16D01C5752884E49A82A4A0BDBC8BC2C7598D548278703AB4C607A16B1BAB64052F40A06D3915CD03825F12C069D956F2A5662E05804183932B5216CA66274214ACF5C01A7F4C77EBF522DB776068F94151F7AC33831259B53BC48E99C50B260FAEC0B7BD3CD4FA9B5A5C2588CF098FCE5AAEEB15FE651355537953D9B8580313B56336F0846C63E2C3018BC8733F05F8CE3B614088A787669205AC9889BCE2D3B523F366F4BF811F004666B2B654431B135D97A70A00FB9A3928C1A4A2C7285F6F7B19BB766BBE6B966B4013EC06833EC6F1118A772C2465D81B77BA740B7EA33129218542A41E2F1B10F42BB42396E9A6C5011351E783641AA692A982272D9544AC93580FA6A51B8C7B6A4B5B1CE3B58F1D901855BBB2B68B988953AB63607D988999ED96E5A4B963497A061AC69BD90C4EAB7C0DC17820B6963B0293D4CA30D82F5997A877A9AA71C5C7893C1D153AC6779D0A88190B13DF828BF3AFAC9D7EA392FEA899EF844535187AF673972399A5FA31034C02D70B57B97434ECBF3B1985C86EC75B23AC0AFAA67225F12A257B78341966BFD2569670680E012899C112AD3873AAAF26D2F4A5C8CC133C92B9A446530C169B6B87B118D03329374A71ADA1778A2035986CEAE200C763A12B6E2B2FDB672B4D58D8BE640E61576F2CAC617A5ADA5D1B874BBAC9D272EE4C881BBDCCA1C9A84626012B988395EB5A4A48BAB1E7551B6CB57EA7B627138C3AC252BDA1A83CCFAAD69E38CEDA6B149C1B3BA295FD5025C63225CE88CCDFBFA6B3950CBCDF96E14DC0962745A5FA32D10525F71D895A2085620C89024D922359741BE366CE9038AA3B260320A456858A7B8D01BCA12316E9C6D1782BEDCB590A1D2AD9ADA0C26D3818652CE6F3B6403C94DBCD1424D090E9DEAC559472C9AC19CBB26C16E8B27DB9140A1161EA96A171728689CD6B6BA0C8002BA6C46719A1A0C175638770CD088AE29A7FA958209788ADE14354A1B0880F05EF7C15A6786BE063B357FC7521973ABE4FCAC0A8C26F3EAA052959E2F973709C9C6BBF4C889C8B76C0AC81353B4A4DC81B7D316F75ACCDD1911DF10A7E838A7C2023EA1EB0A956ABB53FBA02C48396807229F492966796805E04AD62B8107493AAB264A5BEB32F5459C06AA6E7F79ACBF171899A911FA910DFA6687B2C28C1D419A4817ABCF656FF669B587B72374F3CC20B92858361D21BB85A3B9ABA157100875C993B54CCBC84DB2D72374BCAE29C5479CC95197E625DA047447EA5797551595853651912DAEC4891E68901BB67FAA98BC5050BB50E913645874FB7A0E51C816ACC88A7F8A4AD383170A583A2E17B0D5766E12DCC827386BA8D868EE16B2FB892ACA3941CDFA7A487C13AF9787A309779B759CDC037C13E839314803BB10A3AB19B7FAE477C8C322BF05BD3AD9CFB0B241371C85FFCB607748CB518A6C896830B191737BA289B15288AB59869E22637C57019818801EF9A6B7160AC1B5B4D7519B41905E6687B3FA7230EB88A3C9530813561308B68BD2B740E7AA08CA72CD6468C008CCAB34AB99B6773C533B3914B19B2B80BF7E783E7BD9366C8962E7F3410F34651EE606EB737E6C9C5F6D306AF7348CE955228CF02D15B8ABAED16994B56260221BEB1A29BE5596E204B9CE111127989BD2AB49CF27C976F74AA7B084FA6B8400A25F3C36213F7C2D160045D865C75AA14542F5A4E4D1459B5676491C6A3FA0A2F0319CA1A63A401C9C3A14C94F0016A9A69E64C522AEE93E8B96B4F6691322242B20353E0D8B995A6A9129E961AE7349F92C92A90B833E82B9FAE1AD459AD417635C409C28F9EF936AE28D221563E30F83162CEF01B482889E5818AC8D7A38C781E3A0BC43D088E6D391D1D67D9639B260BB6F58A19A57150D1C96249919CEDC2369D8D739AB125E0D2CCB82DFEBCD90240A545CDFE07511F2 +ct = AF94CC0284B48C7858A08B77AE1161A30C07A30D48FADFC030089988BF1B24FF5607C9B5C714AE299658BC5E8801AF51E8876908120917B00751B558FFB7F54E875B71D91E02FB9C218EA63F2BAEB28A16F912896652D7A20861311BEDCB97846CA5F5C43EFC5E09BEC6B699C2EFC6D634F6C310E97793F0FA496970E2B9A3F74B35F96890468FAAB476C179AD7F0D3C601CD54D583C6763DE4A839B7855E68F3BA4756A2AA1EC59FECDEB1D7FAC0B9EB71184240AEEB740A9579BA6350F8F6B930A8AC33D3BFCD3D28DE47430FC34248EE1B292B94BB27BDDC9D9B1A6CDD7B5AAB7FA324295E1B80AC76E04465A50310E0F3DEE3A8414C1927CA2AC9921A50E970A48571C8B73D07C54F58E7D3CDA82BC4A609A9840F3FFEBFD7EC71E52D875712EE5CA94A500E28F5D3193A3EC22C83A2159DEF810FB3640440BDC870295C70CE4D45B9FC902D5F8590C0E1B45A5BC150D379053F277E3D8368EFA67D333031A2B131B8FAB6522D6701BD119E5493C5E6B4862535D4C119265FDF2682A7949BBC1D4BEF0893D979E35719F0D418317D0A828BE60E9F81A35DBA44FF1C286DB5D7BCD3734576C6F5C8A7BAC8DD8364465378557237BF26F539FF9D68FA86244BDB364FB1F6C893CFEF73A9D312037F161482CE9480ABF28809B05318F7A4749983E3577CA3F19E60492BE75DE65171FB51A87301DB5DF692FBB49906696842636B85D6DD6DD020C5B67FEEE25B7FDC68B0FC389B76DC02DAD17C2B58A1B3DD2C7FB17848442F49A674ABE74838095A97949F664F474DAAC1E708F9BAEDD23A32A2A5556F42AF0F2FF57C487E7C97B5CC6E4CCD3E923976E5101AE7C4AE8EEB07FA20CC7BC1EE39F26B002AA0149B84AA7E868ECEC02C304ECF5AEFA03B98F613738D23C09903901481D8F14160BD18DFC0686DA00595C7178DFFEE5A4A9A1F4B8F27B563C4EE84B8BF033EEE964277944D86E416D67F663AD2200922762F1900CB0F65A81EEEE4F758BB20962A85D2FA0155296ED38AC8A4A642E6BDF4E772B7309F4E0280552DB9FDF107D2C3ADED893A015764069D3D6D5E689F1DFAF26A8FDC8628F6B33E8B5D209AB3F3CC4960409486C52D539E32D27687C2BA004201CCFAA17DEECF6533D47CEF4DDF9B6CC8E25F3648BCE3298423485045762E4CD4B85E28B5FBE22C332EE0BC587B2C31AF7B98FD97E95CA1FBC9A57E654BD8B5E54C9D1B3FB59527B1C8F9736E95293BB74613708721281C0E80B79C73E1DB9DBC4B1378A18174D068C5A2B6CFB4F2020EDD74A40FA308D5E60174696E8DF28063198F58605B5DDCD759B6BFB1C0C2CFC9F31FD5E041F047EC94A716758BF66782127771FCE174DC0F141E866241573D48AB0EFA04497686BB3948C785A3F3381BA34E44090E02F5911FFF19570341A7AD12D3E7A487865950462C7DB9F7290E8453981EA4DB3F39619F27DE8B68866BE3A2C1BB6901A646A180E152802831D12FB305CF084DD64C5ADA579BE82A7C55846B550FCD3F4C3274297F08AE37C4C2B61 +ss = 2F2F58E23DBA54D8A44BA11AA4546EE3F1819C6243E986249B7102019DE3A777 + +count = 47 +seed = 730B65ECE22DE27D573CE3AEA7CB021C415DF210D228808D91D4F380070FFCB0778B683C71D4853DEB569C822765F2A3 +pk = 964435FC16BE2CD2276B7BC78EE8B5C963AF2AF4673A93940B429131663CC124BE5A706BFF5C157DC17DC5CBC2A11418DC4B8A28C841C5A831B1A2BA989A20FDD17DD06706CEABC0D20714D5595D54216E9FB6824E3272DE0A1E262AA246494152B1CFD95C970F38AA35FC0337B26E76C77A0A76BC2C57B80757550B11807A423B85E32DDB537AB6D4694CB8B9ED58B11C9A6ACC746749C21011A66DBD7896329C3A31D0A7E1E78EFC93574CB7B051D79188EA4981DC6299EB9BD1BC1A133A41565305CD4A09FBB10934E7A3D132BB0EB83559C484EBC92F7CF93E445020B7187E2705A2D1A8386C008EC7F22FE172088360CD3FD160E7020B6D0C747CCBBEDDB1B84FA7549F625DBC064621FC2E13F720188C200C1AC1F10394FE4117018B9640632FBED570C942575FF61A7149A51F9993B90827EA2A08C32A330747CA27ECAE452154CE1A6A67A8B63676998AF929E8A7A9D2AB709E2162A2E0BC0721BFC7E49C5B2C9BA975B3BD881AA3782391F5CEE4CC1835C83732C84F54B373EB18869B2C90E9F986A0EA345CBB020333893B463671C95E6AA07193D06F7E62BF4361CD0009B1E528C85D147D0E650CEA7B0C67F1B4FB754BF2F1A7B9CC621D4C34682A6195776BBB9B2CC866CFA94C368A2B4B346C75A2A6BFE946CEF09416AEF21B15D3C72B7CB408141608C058E506271380841656963174C70E09C1F593ACDFB9BF4A3A9387B693F882495149C62A77595574C0BC745B51BA8338C6361A293402E74DF74A7A70B49FAA1AC4D66B89FB6C31DAE59F318B610F00BF4F4A282F752A070582F2F3C141E168F6FA037F23945893766215B9EE9A3A1DE662060A5B1FD34BC8DAC56C0875A6F82ECF8863C1692DC2073CF517CBED3C362A853BEEF1A8CF2247000CC4CD8176CE980D683B8AD89B3EABA3B962624F5AB3695FA10A88055DDD664A2BA0749E439A39C6999496999BE3BA7BBA2FFE06388B1A6C83068AE70A1C6F8A36E788B8AA148933C896EDA61EFC86CBB7D5C9CC96C9F137C6A9210347289010979BC1E16700A610C7C990D685550F537AB0C45B2BC57E5EF4C08B2220961C6E17E95E2E4482A4A94DA2E17B6854CE57C263D69429E1566BAB646FDB216E0444CD8FCB7DF4168AE66223A0CCAD971583B5917C4805271A17B4A1E17462815CB39332699AC447332A3F7ACEDC03541E93A822A96089D6A1F47A7DF35CC9B659CF419BCD2131B98AACA67343CDBAFA3DB35661C38C0BA1E18043A4C945067ADEE46E428A16011ABFEB58C1BC8B2330288B57CC319389921857C9D015A0471128C34CBC13417DB24B91A3567AC299CFA6D4C2F1123661A3CE0996111D340D9613B966955C6A758FA7F3556F6716E5AC7AD3A93174B2032A983CC0C73C0DE302F9F83A0DE89A1FB576CD3B41505B5BA712C387730C45399B8CF0B0E548CBED984E7BB5095CF7263B05CBA437AC6FC369EBCA85E0211715133BCC314723D79C9B93ABAC57AD3D3A5E77F2986A3539EB795A5B4967AC7753115B916236A97900870B658B9D4B3E35827E1AA9ADC3500FD9BA18FC6B03465903858C61C1259CF485338CB700EB731F31643B469BB259210CEC78C158E3290573C5228518E4697F19171D8F1A3A633448FE9C83BD28097BB29A168DB5AF1D1B354B6881A2CE509B +sk = 37F7089480382622AC6687B4B15BBDBC1A9AD7467E8FF4CF44F0614DE74B9591B9C5410D2D7084BB57AC27963AAFAC148DE80DDA6232F4A0C634D677A80C226FE67063191C05A54AFC026080877538F63DF93CC6FDECBBC0A9A0A4215488DA1A2F7B1EA8F8B917F32F397B94C80170BCD423C1F1BA4C736449F84BAFD6711B0070DAE72DE1EA3923435FE15A4FB35AC98D6379F0A44C200A37704B5B269BA3A555961ACA5E2CC1518FA4BAD3C23438E06952C9317D198B0C112D79A89560DC3361F5732F820CE4D16ED448AC2ED221C8EA3601602C27F640DCC394A7ECB5079978CF52B80DE15C3015839A44B9EE36837866C5C8E9579849B331E53DBC049E46DBB524C2090A54BA793C845420A7C2C29E78A9B8C83C310D780F74127C02A59AB68C1B29952DFF1196D0940EDC338DF3E1C1C8E34FD0DAC4D5596F97A2AFA98B1E8BE46BC0A96DF412639AE5B52229086229B5BC79AC020B61A56C04091C10CF9940F798A9C50BA1F5FB30BFA947F20B62A60215C5A88D23B70C0E299C53F49A1ED511AC5812558133D9F195E1FB5D77314559EA79E63A88E781C4224155ABB5CA91F089C0C609CECCA32E549B0CBA167D9307A3A64681A815A69C5D7E787751162483E7701437034F0864D8D53201FAB9763C7921ECA6F11247E7EA364298C1C3AB893549572BEC45C1A8C3B88659CFD526810B23F2095AA6C1424C7178187109F83063B52547B9C731F9933622A33C7A8B927A50191593488F9A0D12331017919159C7A027C3956FE109393A167A6475CEBB49224736847319D161490EC52396D7BABFB638BDEA29F50C9CE37314FC858455F63FCC70CFCB751DF12274FEEB45A124AB1B997C917A550C3469A0C185EB0238FFCB4DCBF751E12CA17A71B807B1446EA7180EE302E6998EF8D12A857C84FFC377F5E42FD41238A54345229916A715977025B3B4A6060F778DE7D426A2F95927335CB202BF4080B8510CC0DA12C4EAEC4BBFA42997E21504B8C5D32604F1D66E8D55B50C393F973ACD37A236DB595E3EF08239C42FB5E9243D967181B9B94F4521C104A8AA726DEC057ABD419BC8C6CF350C91ACB78B0832144F409F78992652E30EED7BA2375B3245D877C8E8B873F0427071C956633495381A2C642B15282B9945C758910FE469CD091B4458218105DA96A479BE0AC6B3BA155D359B2815916E93E9BAD3D431945B852E519DF0129174B24A32CC9FB8A62DE96733D153A799CB8FBA3C86B9101CF3D4A97BD3B699467991A57129607C27274D3224CD1848C17F1550BE47B71A119873045E215BB817CB92C12A7BDC6347DF8B64DD686873D800B4672AADE8AF56D2995546CC37C06F9212A54745C5597184EA85CEDCA7B980386FB91B8AE677A035A4547B5848879C2567C8CD6AC285F6F2460DBC0B73F5AE0993C988418C234895380C556042ACD15A6C015A13EBE16CDEA4BE38528A9D244230A0AB053C568E31C64D06A3D7BCA0E5207B7669811A3512F8AC6887137B0B7627D2401CCD604AE786753FB6568CB522B28712211208C1849D1F75CC4FB951D2AA081ADA952998B0B0E938B77359233A76C135897E91059CC5639E978C12C6BBFB735FEF4BCB1D60180DF21D964435FC16BE2CD2276B7BC78EE8B5C963AF2AF4673A93940B429131663CC124BE5A706BFF5C157DC17DC5CBC2A11418DC4B8A28C841C5A831B1A2BA989A20FDD17DD06706CEABC0D20714D5595D54216E9FB6824E3272DE0A1E262AA246494152B1CFD95C970F38AA35FC0337B26E76C77A0A76BC2C57B80757550B11807A423B85E32DDB537AB6D4694CB8B9ED58B11C9A6ACC746749C21011A66DBD7896329C3A31D0A7E1E78EFC93574CB7B051D79188EA4981DC6299EB9BD1BC1A133A41565305CD4A09FBB10934E7A3D132BB0EB83559C484EBC92F7CF93E445020B7187E2705A2D1A8386C008EC7F22FE172088360CD3FD160E7020B6D0C747CCBBEDDB1B84FA7549F625DBC064621FC2E13F720188C200C1AC1F10394FE4117018B9640632FBED570C942575FF61A7149A51F9993B90827EA2A08C32A330747CA27ECAE452154CE1A6A67A8B63676998AF929E8A7A9D2AB709E2162A2E0BC0721BFC7E49C5B2C9BA975B3BD881AA3782391F5CEE4CC1835C83732C84F54B373EB18869B2C90E9F986A0EA345CBB020333893B463671C95E6AA07193D06F7E62BF4361CD0009B1E528C85D147D0E650CEA7B0C67F1B4FB754BF2F1A7B9CC621D4C34682A6195776BBB9B2CC866CFA94C368A2B4B346C75A2A6BFE946CEF09416AEF21B15D3C72B7CB408141608C058E506271380841656963174C70E09C1F593ACDFB9BF4A3A9387B693F882495149C62A77595574C0BC745B51BA8338C6361A293402E74DF74A7A70B49FAA1AC4D66B89FB6C31DAE59F318B610F00BF4F4A282F752A070582F2F3C141E168F6FA037F23945893766215B9EE9A3A1DE662060A5B1FD34BC8DAC56C0875A6F82ECF8863C1692DC2073CF517CBED3C362A853BEEF1A8CF2247000CC4CD8176CE980D683B8AD89B3EABA3B962624F5AB3695FA10A88055DDD664A2BA0749E439A39C6999496999BE3BA7BBA2FFE06388B1A6C83068AE70A1C6F8A36E788B8AA148933C896EDA61EFC86CBB7D5C9CC96C9F137C6A9210347289010979BC1E16700A610C7C990D685550F537AB0C45B2BC57E5EF4C08B2220961C6E17E95E2E4482A4A94DA2E17B6854CE57C263D69429E1566BAB646FDB216E0444CD8FCB7DF4168AE66223A0CCAD971583B5917C4805271A17B4A1E17462815CB39332699AC447332A3F7ACEDC03541E93A822A96089D6A1F47A7DF35CC9B659CF419BCD2131B98AACA67343CDBAFA3DB35661C38C0BA1E18043A4C945067ADEE46E428A16011ABFEB58C1BC8B2330288B57CC319389921857C9D015A0471128C34CBC13417DB24B91A3567AC299CFA6D4C2F1123661A3CE0996111D340D9613B966955C6A758FA7F3556F6716E5AC7AD3A93174B2032A983CC0C73C0DE302F9F83A0DE89A1FB576CD3B41505B5BA712C387730C45399B8CF0B0E548CBED984E7BB5095CF7263B05CBA437AC6FC369EBCA85E0211715133BCC314723D79C9B93ABAC57AD3D3A5E77F2986A3539EB795A5B4967AC7753115B916236A97900870B658B9D4B3E35827E1AA9ADC3500FD9BA18FC6B03465903858C61C1259CF485338CB700EB731F31643B469BB259210CEC78C158E3290573C5228518E4697F19171D8F1A3A633448FE9C83BD28097BB29A168DB5AF1D1B354B6881A2CE509B172CF4F8DACE8A96B8F70DA966080A5E3F132873CA7544343377A99B65E8147FBDC370460375A778D1A31D01C42B66367ED8D9E8F84551002F552F0E52102B5D +ct = 2E1DD8799B0911BAD860CF08F4A53162A559277EF400A1120A024C0B0BA064D1746AB3926225882CBDAF2B01013FCFF1AF978C02CF3650866AF47564DDDDAB692292F6A1233B0BC4C296DD98FC24FF962E8F3A8336729268EC7FC97D30EFCFC45C2D77AC5FFAA428E1D3BA6087F0CED8406F9C86F1A2119B0539CE5B3251C9A0C0836EF690DFADF37F16040DA580814B865777882332591977D4181320BE97A091E8281ED130A15FC6AD629EC1103CFA0AF8FE257F3C3DBF737231C023C1314484A582F2599BC1249BDB7C5C9088B60E760F57621F4D04D9F32C8B5B354F8943D8917C68030CB263B78C4DA1BAD57C67B07DED2BAF8B52D3F864380DBBB0DFF30152C11F86A0529B29C78E97F91E3DD901676F97E6E1EB3756B213BC19D90DEBDD774F805B30E00AAD86956014C64C09B816B149EA939232B4CBB96F0DA9A9FB422F1154314171BFD2DE10F69767834B90AB15099D30415D66F8442589B8855ED001CCC2DBD6A633AE846D25BCC754838F8316DABD1A58A61C6E7EB763611BDC4CAEA5FAB7A19EC95BD168A4742308A07E8A0E0214C1173FC7D2386E33D187F2D2E5ECCEC18A3180025129065644A8E917554DE34A1CCEE3E9509F9DE89FD35345A9465D02D25704318D5E6EDA8CA7F6A6FBAEEE2D519929DF566062F672825F8BFD3370FCCC384571A1C82575BD9F6B3B4173E255446A5A3F2E2143565C11F12D8FF48FB8105E2E19518CCB1B60F04E7988C58DFC76AD3D1E3FA107A7193AF691D80D3DB1F940CC2E5F50F02D5BBAE18E1F598DF690E82E7BAE5334936B8D1C194663391D3F819CD2FAC47D185192EB9596DDA35B0A8DB158C025961CE2F570F7097D076384F9A548A1B774624C5ED3BF042A06E50FA6E24D7796F813F5C63DDDC70A1BBC85E730ADA2A2FADEBBA236CD0A9BE983FA40166823E52218F729ABFACE09D7AA6F6CFBF6BA25DE959A779CDF2E385A83B2666B5E0CD8A049428B18786D93A125832AF72A6C3202DB30D83E34DB9C2E127B1D7E027A0D8F30AE69C90A5CFD4D3BD610F77751940536174247CDB7A9DD7DF9A010E28E8BF22E346A3AED521FC8B7E3891847F27B7EA06157FF21F14CA7F474D7DF1CCDB371DD9155F8A8958D391A934072EFA43625244B1A79FF2C29753053C42378F338D11D722C283D1436D87FBD38AED972EB4BCCBDD3DFFB9F6F7B2CC2B1EC58F199E0E09ADA57200031E3B26F0556AF815A04112A784E5762AD828737F7F26B55969FF023BF853E4FFCCCFA3A6E3E5D7363B039C2AFEF6A5114E7D2D28405091E258CFE54C3B991A5AED242DBC60430A95EA07776314140BE80C633DD3E2171B2E9121F16FF37548E52650F6241960E6A6C23EB18EC2C6FAEA35B8E3AEE9CC2F7CB0E3DBA2FAD334255CE1E92F684A2E1F8281CEB9EC7A497C41ED0362F9D25281064AE282E8947ECA454E3ECEE228B0F219C243BCEFE589ECA239EA619B152606EED03F788E9824226E2FB390207DFBE953AC99FFB9BEDF0C0F602F0968490BFDDF86E7D0F0E +ss = 0936224EF45E29DFE9263C6237A22798E94E81A932796174271CECCB78188554 + +count = 48 +seed = 5522A5A891A9A9B5514F4556AFD8DF40B9CEC63A01492F0CB8A1DB073A285A963E4A9FF2376C88662F7D8D241F8ACF17 +pk = 58718343322DB0162D26965D5E946B700AB88D702FD5A1376920B5BE702297AACDE28588DA91C719D40C1FAB0AF109742AC26C456961338C44C93C83AB58581635499545CCA66160E15A35BA4931E2B91FEE68A8734ACBF72755E8D452D17215457161284435EB6A7A2933C8D146A12679143B80740F68AE052087EEB988771A8FB43B34D6EC79868A0670551BDD19CB5313892BCAC9E4FB500D3375AE471A3ED551B2D9C76142B22607615454A910F8578E44B448AA9200D805CF4C15EB635013BB80A65593FF578C794066F05ABDDB850FF976C74ED6ACB4C41064FB5EEAB479A13BA57DCACF7F02421603194A3CB549F08C0D700790809EE0E585DCE4088F96A740320C57D5A632C8BF5DC173F0F841173AA47CA42004B808EBC2A6A1770AD9DC06027557F80420DB47B0158A1D1FF32007FC058875C4F5D21FABB67BFE8909E10B51BB35C76D0605D0E6A97E56CB93DCC58F722D95F33008B0A237B711420A20269A7097396A4A98BE20B8226E103CB1136EA3FA39D438B305B63FA049C420CC378392B9F911BD7800BBAAF2BDD7586780C7078DEA622DF51C7190841585BB16BAB9A0D83625D55826E3949AE018E7C4703CA082466B9A078393C30A4F6B7B1FC775C9DFF7CFB5909CAFBC66EA946E6F098F881B3039C251FD3AC142029E8728082F838A202CC3586672CB6285B021C41E3C16F5787CE6E319D849483FE40D989C246F7C36C11A991234AE7FEA68770C79D8290AAE3BB72BA014AA1279FD13977A49B0CDD494CA00C610CC2306059B695686399C1590F274F735142639425DD88026F8BE0F260CD66672A12B5C7B5C7323408A2711677F062625EB8F3541098D079C13208415DCCF3FF72D1999721DB3C271F7521DFB0F129B3CB6885310A0689166A3B97B09610347CEEA5579650720DB621DB20EEEC24EEC2144FB523ED2D30F64B9C6655928B3D06E1FD9B088AC8B7C964213E5674757C7BD48A3D066355F0249A50548F430C55A6CA0471953EB7C67E140AAF6322B7741225931622DB114ED46B9EA997974C9AE2F54B87125CE79E8621D712688B50C7A49877D52091643A4A43148550135F27BB30EA131521583F5B79255309465F4B9F2233027855CC0E7C93BB33705136C88392CCA717254640C540573D3A20032C9B297EB5B02C954C744C4C6143A56EB48F1D15439F885803BA5ACB524F3D54BED37145CD9173ED92A00F724273787CF1B89C788184DE0905BEA74FB331DDBA00CDA70C1547C634C706A8447145489752B0633628BA4F5286851E1B5FFB8A7FA2BBAD3F92C542ACE74E67AA07B467E70B6A7D3056592B36A7A37C6C7114C610721E9C6EA933742E43609C41F6F3803E99A8D5A27B069BB73C892BF07524A8B2989633C96CCF33791BA29F3D575F249C640093046D1684FBC701AC633381BB349BB7D351230A8BB1A22223DE3850258AC7043B887770A307C3746002CADA2826E47F7694EF51F94FB9E3645AECE6273298592BF00C0FDF14C07D8C9FCA401FF351D2E35491AEB55AED9B1B0EBC2424CC729AC7EB07630B8B11D0E47C323D6B3C0BA12DC235D5C310CE2C7BC1F0A8467D627568A185855750E12717760355A0B8A756468E95406D375F6A1289B8CDBFED9F6518D7031C57FD3455D4544735CF52680424C90F14F +sk = 5E43BFE8EA443466AB6B087DEADC672E7AADC85521D549B978B054A9B8949E519E3FC3A653607D794491341039713037D31C9824EACE39E7127A974403441E25B714FAFBA4B98041E85B2FD8D8ACC2A69AEA9C80930306B46BAF5245A505D48E293A77AA4174D1C095B0B4A45754A4A94BCB01D4543BF7C7DEF2AE2009408725C58BC76BDE03ABEF3C4EE0831D3C6B2632609707B3B861F093E857902D52A2A48619B1EC20DDE7A923412F79C22389601473076965959B2AA3C79DD31B98CA9847731C89B0929EF5174CC6B92972CE2C07C8139A62C901216245CFC92B2DA158079E1C93C8E08FF438A02DDCA4CA948F47A106D40AB6A5B0AFAF52052F237E44F0765B3436271421308611845785E257CAE691C39FB8C80BBC1C5FD687A547B7E8E3AA1D7C15A918984B6B359CD24711CBBBB95716EA54A8D3511C5DC983FA1B019E0B0D7DE90C3C0A9E7652C18E72CAD6F9C510E64F0CDA8CBD86502A5880EE1536EDD16AB36BCFD859CE879B3F5D6A0D90630668B7385C8599ECB1849A4942D87A91497129E196309156C9AB245F4C637080C963F9648FB2BA6F32D2566F88BCE680203DFB827438295F8670C9BCC34A98497851BDB0E631EA06ACCC26373809986DA62FA714012D2579D5D61443330E3B882C800B6C9D02C98E9859A4022DB4A09510FC91A3B95BCBF73B3A09311CD13E52B61733E02DBB400E8A54A30668311AC02FAE2B55FE05C95AC43875D92F3C2ACB3D4A6B53D363D5D75A697061055A3A788BCDFA051EDF97C3515CA920EBAC9E7A998BB598B8436BDB63550E416D2AEA5057562A901B609B129D92B27536E02C26EC6A3B2C5F6B733D0529330E9A89600B089DD30A0BB52530A3062BE741B09818A78B4FB9F274B7262CA23B3F2A40542CAA64FE38A6ED06BEB5498733A38A7FD0B5AEC2673ACA2B07E00909E68D40AA207FB179CF7A60A9E13719635A15CB221D1CC88B921E950C94CEE17D60F80CA5B4A656F501D7136D1245207479A1DA42C26C48664297562A0BAE0E7906E9D853FC7C490E4078B5B3B226B37101A31B5D05A26F1CA1F231A853F23F59D86A3FD269A0256EEBD02CC0C6B77F1B1C613114E1084D8D1CBABD0C7702F43D2EE01DB985382C562F1B7885A7015EDF59BD8988B5BCEA1CB04639BBF5B119E6293F908245455070DA3013D2B6E2116776694B44E3A7E433407099A51940870B336F547677665C7066E181CE266FF0E508268731BD13AFA2ECB4546276A5DC50772A6FA38541AF968AE5C59E2D04C3B6002C7120A6A970ADA2671590411552E48E7119C7B7F7AC97429E9B7CC0B5242DF277CC10E7C48976266643A9B2308CF1799324780743F95E65851C03599FEA7129D5552B86AC35AED10B5F00058A8742C02A3E4F6CBF5DF61C66143EBE933060C98A4BB55318566184601BB395625FC86E4BD47377B54459B45E50C145596B9178D57D01BBBAA9A63BF444889FC810F1E40E07D289E0B04A58F84348463B9FCA3176AAAE6C1C119CF679BACC6EB685B9F443C2A9E304BBA0ADF3888B42698AC1F68F1626439E796E1967C7BEF581DBABB6C22C9C16029E18D8493A524FC2A41738A25E735C665E79AC423ACA37B5222D970358718343322DB0162D26965D5E946B700AB88D702FD5A1376920B5BE702297AACDE28588DA91C719D40C1FAB0AF109742AC26C456961338C44C93C83AB58581635499545CCA66160E15A35BA4931E2B91FEE68A8734ACBF72755E8D452D17215457161284435EB6A7A2933C8D146A12679143B80740F68AE052087EEB988771A8FB43B34D6EC79868A0670551BDD19CB5313892BCAC9E4FB500D3375AE471A3ED551B2D9C76142B22607615454A910F8578E44B448AA9200D805CF4C15EB635013BB80A65593FF578C794066F05ABDDB850FF976C74ED6ACB4C41064FB5EEAB479A13BA57DCACF7F02421603194A3CB549F08C0D700790809EE0E585DCE4088F96A740320C57D5A632C8BF5DC173F0F841173AA47CA42004B808EBC2A6A1770AD9DC06027557F80420DB47B0158A1D1FF32007FC058875C4F5D21FABB67BFE8909E10B51BB35C76D0605D0E6A97E56CB93DCC58F722D95F33008B0A237B711420A20269A7097396A4A98BE20B8226E103CB1136EA3FA39D438B305B63FA049C420CC378392B9F911BD7800BBAAF2BDD7586780C7078DEA622DF51C7190841585BB16BAB9A0D83625D55826E3949AE018E7C4703CA082466B9A078393C30A4F6B7B1FC775C9DFF7CFB5909CAFBC66EA946E6F098F881B3039C251FD3AC142029E8728082F838A202CC3586672CB6285B021C41E3C16F5787CE6E319D849483FE40D989C246F7C36C11A991234AE7FEA68770C79D8290AAE3BB72BA014AA1279FD13977A49B0CDD494CA00C610CC2306059B695686399C1590F274F735142639425DD88026F8BE0F260CD66672A12B5C7B5C7323408A2711677F062625EB8F3541098D079C13208415DCCF3FF72D1999721DB3C271F7521DFB0F129B3CB6885310A0689166A3B97B09610347CEEA5579650720DB621DB20EEEC24EEC2144FB523ED2D30F64B9C6655928B3D06E1FD9B088AC8B7C964213E5674757C7BD48A3D066355F0249A50548F430C55A6CA0471953EB7C67E140AAF6322B7741225931622DB114ED46B9EA997974C9AE2F54B87125CE79E8621D712688B50C7A49877D52091643A4A43148550135F27BB30EA131521583F5B79255309465F4B9F2233027855CC0E7C93BB33705136C88392CCA717254640C540573D3A20032C9B297EB5B02C954C744C4C6143A56EB48F1D15439F885803BA5ACB524F3D54BED37145CD9173ED92A00F724273787CF1B89C788184DE0905BEA74FB331DDBA00CDA70C1547C634C706A8447145489752B0633628BA4F5286851E1B5FFB8A7FA2BBAD3F92C542ACE74E67AA07B467E70B6A7D3056592B36A7A37C6C7114C610721E9C6EA933742E43609C41F6F3803E99A8D5A27B069BB73C892BF07524A8B2989633C96CCF33791BA29F3D575F249C640093046D1684FBC701AC633381BB349BB7D351230A8BB1A22223DE3850258AC7043B887770A307C3746002CADA2826E47F7694EF51F94FB9E3645AECE6273298592BF00C0FDF14C07D8C9FCA401FF351D2E35491AEB55AED9B1B0EBC2424CC729AC7EB07630B8B11D0E47C323D6B3C0BA12DC235D5C310CE2C7BC1F0A8467D627568A185855750E12717760355A0B8A756468E95406D375F6A1289B8CDBFED9F6518D7031C57FD3455D4544735CF52680424C90F14F268B6356F92C57DA6DD34494B927E8764ADF0AD519612EF0D1B8951E50966C2FFD5A08F656A6EB8CD20679930A31CAA6A6331C4B133A6838C223EF9F769F6246 +ct = 19444F1E4399BA6307612AC8FF6794B0708DDCC06538D89BB5F49FC3B8AF7C2F31C965417CC17555AA48A9C17445580F27AD4C825937FD7068EFBCBCF3B5AB055DD0D772E5A801935F475D45A63541A9CC892C87AB0CA912731819E4F270564F50BE11E0EEFEB954EB6F4042C4ABA4595AC8EEC5896AEBD7D66C0D1B8E34ADA6F6C4903986D9E0C17E8ADB7A4AB87917B9584C6D43FFD09318D867710CB41112FFBB8D888A536E3A4AFF8CC1896C7AEA3700B501FC468126D0EB82519A336EFC13BBBACAF4C1F48D187CE71BCB2B8F95CA66468485C445629EE33A3EC1C4EC34A193F68C752DB1701D07A9CF6D815CA93C93C6E4FCF4B21F8B0523DB993D25F581C91C5DD94B594EDCA516D6046354B4309CD9EC53BE0F9FF210213DEE06C0066665D325A10C5D2491DA37498644907FDF719515EC507217DCECF16D4B3CD45EAB811684198C48567BFBD65D831ADF41FF4612E9FFFA0587B7B3FC9F2B726DB5D4FD1DCD3D4BD06E309EFB1007C39401FD0A98B2BD6E3D354FFB8FB556F289E858A1244A602CC1D0A41055087A714EABCB42AA85F484F2F27548831B2F32D883A488B74D1C7BB28A8F735F161F2086B346CF0C45153354C690C92D68FE943D723F7E243D0AAC615AD54C3FA336B7E43262E14C850E9EB89978AA10EA10507230209E255192A3695D6FA3CB55EFD7BC69174A44EA0A2C15FD17A22856E571C39A519E94A5A022B04DF98E6C84FCC6D5A5AE3980E651731753517FB87333C02044C12531730F3445AFC02CD54A0A8460F7146F98187CDA6555A8EDF2CBDF6CE301950EA5204DFEADAF64952BC871F7F01517ADADB0A1AC33C34EEF75B7DCC1F64AE20A9101AE95AE24020D8AF3242AE911B3604284D93DF937E74DF3F74F26275D7413CB6D07ED995AB853E180A50F8D0EA305528DDE43F5413F927289CBCFA6B426B615320D635B85B63FFC640E7EC4B121AC71E85811815EC5DF1B9A5A2DC7F79C8A7E6380CA7D49CB3D7901BC28D1E249BCC86EC54EBC31D92D5324A0663222FBE93EA2CB0BD9BFC5AB43D63C8DA12051A4157C210DC10E737B37962C1DE186E286944E1C588B570766F81E944850FB4269491E0FC23F86602CAA9968CDA290D83E7B2EE9917693E47951EFB86F6CFF49CDB80CB04774E51DED7A184BA8E2656861ECC8A90795DE698D70AA85216FD715A11AD8E1D5D07C16A1F10C22DAC064F011D1829826D34C242F8D0DC853DF36D4DA431489785373C8E050EB8A34CE55C6F2FC1745DE58BE0B903C9CC25392A9378A379F6353F04C52DC5AEB80048BB0F13DC7DC9548266729B410C7B809C10116F30A6204AE7F46F7CC68F5ED8202832FF90E1C482B3AF44E85AE6E44A131BF9789147C21B1D5658493CE4CE3BADF7458C26870392494A65AE4F53CFCDD337D07C801A6AC90443A8F78DAD7A7E3ECD7DE8448809FD38B533A3F41512FE7011425E6FD360395F62687EA7E66977B0C3AC4FEDCD1C91F1026E216FA754A4D64F0265B0AAC854C8AEC1F25EC93F70A10E3 +ss = 2073CEA69B598292F44EBF4AF3F7035E1738AFB7203AD67531A7140150176E5E + +count = 49 +seed = 1853E72329353B3F89AE6A1B1EF700DA8ED3C10D19F9E61EE9252E28EBB0E15802EE43083A12A0B7527088832605E3AB +pk = D8279F9A0681CB98BC38CB551320031F46262799C182B0355EEC82CDB58D750596A4E6BF1213490810415A4B347E13C9E8514890A0995843936BE342E81C7F4971BF9B75925D61AC8C961492A85D83FA8E33C12FA37BA08D7C681C521ED4060481F58BE673007A081321E01E21419E232283A01CB1A4481550DBADE263382EB93B7E42470B265027A933C480CDA340A9A4065B4BC47990833786456AAAB5A81C0A46E0076B91BA5BB4D4ABE21C6AB193B3A3671C18479DB082A706768A63109D2C4224D71C7C95755CA24B056C355E9C22CF5006662B3218EDD4B317B19962CB514AF123245B152EAC41391CB432C6CAF9295C66DA4E5737AE3D60023F46AA7A604C64A6C403306CA4B96FC2929AED5B4CE7E6C631B473D7D61CBCD19826AB82C0C58880D77CE8F9BCDBF59D645424BAACCCE334809B43ACB99248BBD966C88793A273AE857946902649F97B5516FA2EA2A84FCFBC054653852D8421B6B78C289B49080C8EFAF85DF195AB5562A03E7099C43C439A25AB41390B86DB4F57188F002129F3EA1FFDBB9E9C688EBBB26E0D7AC6EEA395B698A134F70F98480E87313B79444963557CEE82534E9C1CF10B74718CAEDE3BCBD98A68D9956FACD8A45E2184C16B14048B9D28E8BFBF5AB43D1B650EE8CF13148CAF451CFB144656052CBAF82E2F765C8C9C66C23B0CBAE0257D6000F247200AB87F93B5167478A27B42AD7681B6919529BB1430DFCC809E171A334B33A0527A1D9519C18130971C55F6EC172B86248059830FC57C7356C9BD8263F7D571D0F7BD87D2A1686A7C41DB9306558CBDF39F0176959A188B4D457B40C152B7EA09F6860D4D945E78C45EB68B579D48774EB26AD43BC1BE3C0AC327C80B4C1115C2CB58BBC24A18146470ABC223AD51FA10EEFC311F1AC02AF4C7432210233A4ABC408B1DB484E7885D239C0C2B9C4952E577A8EBC3D6A7684E711E12DB96E1F988DF423A395301D2C15FE2F1ABF708BC64147A30E2717F7868FF602D50FA9A3D0B3A0097259AC52057DCC14319C438E113DA967F6DFBA4279245B72CC86CF724C81769DAE271E18C0B6CFA84B916AC89B12A1F8B05D88527AD40346775CC832713146806A2B2884E35628169BC12F67811B507BEE3BBEBCA81AB93B5D700AA92898B3F5CB6E9D345483CA3743457FAD8CC5BEC2A8E7A22A41BA8B67641AB181D42ABAF94D0055206B648C81361F8486408B610BB3552299316B5C0B7D301D9F1C3D55621859AB2EE922C59B11EA9F2A1EFE277C534128F2CAE6B598C0FA059EFC2C24E8A0C2337BC2C57A0BC64A7FCE190C656B529D21244EB66A900288B5C484BB033020B9B9BA3019B72387F2746B3B893A1427882BC3135F0A17F8271F9C8480EB60732672D44336B32F851A283224144C480AA302C05836EDC1AC4569A6020130B341466322D17811229441C4513A2E8041C85E035113992F16799DFE8C1EEF3AFF8CA2F341628808A81E8B66EE5BA47AD0863C735A904565F036A85FB1203058137AAD2206C303F22D3027E732542A342CAF3376D6B065A745E31E865FC2243DA31CE08EABBF8183B4294700BF8928DA8CA78BC08490810C39747FD3851211B22F26451F6772E0C75659133E8D8C063CD3044DA1719855FBBD9796314B11DF8459EBD2D92B7FDC94C4C +sk = 469963001D4D93DA7CBAAC0ACDFC833C47601AE334DCC0022A9220138C16B9ECA73AD1863431A34F593ADDCA4F0EA393FC4595D22A7CADD0A8D89827086A955400ABAD84226541114CFCB3E3A240FB600DD6C0960A7976175C56B0B48C66721E13882E3AA5784E12869F0C8518037955F876997975D27A7C92D4CF005AB859590504C768B02576A94263C87C4BBFE1AFB09B8C0A5C067776A0D96A5D12925B44AB3D3E57C6971B0A86617F65A16C7E9B42C283577219409E1CA4DE08A92DC5B4E8E87051680C1B24068DDA801FE871E0B28AB0611BBB97CD49BCBF159B7785830BC9D302C0A61AD138277AFC2374AA64E983506BD11288F4A20376B50AE1C1233A1ACF30AF1DA67301A5A420AA826DB58322DC1C7AD8BFD25C3B21025B565C357B4A0802E615A35A384F1794A0612E030228A865A0390197E7C27F45A4258FE26082C850170CAE86721BB5C68CB32153B9934DE4CB11528C570AF363925AB0FEDAC79748B3489B7180E81FF6DB702D5A100336955EC02FD2B9C86C2CC001833B0BA1B7DBC9699C6556B448324D29B0F6A4028BF48A49B1CF60B4A9F91321AA64CA849848CEE2BE0A29219F783008417DA307710F87CAFA2603FD206E5698177E81470AF4C608A6128908541183A5B4769E74166349E55B4D2A2A84600EF712C2D1F13F4FB3C91BCA8CAD209CB5BA0FF578BD6E29A0CF07A972D262A2EA3C4DD44A5D55446C174B345B96871076FCF785CCA68545EB6BE64BC9BE17A7D5914D8A50B286D3A2A8E1A53FAA53815ACF0237B8BF204C34766E97883071E56539361BBDF29187C180414C83D9C09E30983995AA4850A6B2358AA6240642CB9B0FDB739FA5A93EC60C11061AA8B5E71316A517BE2BAEA2F74BAEE32EEAA0A75D2030F5E8BBE1B517F56511FD8AA499621A9EF6C88B96A9F33B2B3CF04381B5C97B743063A6286751AD9EE14903C4674B308DD5E28BC700134C43C788B04460DB78A0E795E24698553722B4C3A095784828960672CBCAFC11AF32C918ACE0580D5BCEAA574409854051A2419F148809147133866F9B651A38622F21E0614F10139BA53724831FF312157146169EA29293D2A3F1250AB9CC877D448ECB53139E6C5487DC2931D45B4A74C34BBA11CBB965E1E664ECFCA54DB7BFE7E61DB2382E50076A70A9AA028670A354013C894B729945830B1125AA53F4D352BFF33FDBE7C64BF70A4C3ACFF3680976FB26368693D928122ED5707B453A1DD714FA9C5A8E6534D45B53A2BA464E217DC0461BE31C5763715BB66B6F3A4C0E7A3A4CC107602CC3B67487A7D162422468B5CF33C8E5A63F801C2016B15C40398F914CBCDAC9664B7601680346FDD3A499D89B5CDB7E77CC8A1215661AA34737149BD0734F7BE6A0C20BB94E6A89DFB9B0A9D6C4BFB86408922FDC9650DF7577E5A89215C8636D5C376F4596C329158964084200C91AF4A7699018C6D139F521204BC521110AA222203774DB88AC0AC94CB97720A71411EABEE0B2863C35607A617E761298825ACD91C73685198BE96B84A98AC7295142F6C19BAB0082C53A8A50A3A39EEC2A34E859CFA2C88C9CBC77B1BDB5377981F61C1FC394D70820336BAF21820D44C0956E09A5D8279F9A0681CB98BC38CB551320031F46262799C182B0355EEC82CDB58D750596A4E6BF1213490810415A4B347E13C9E8514890A0995843936BE342E81C7F4971BF9B75925D61AC8C961492A85D83FA8E33C12FA37BA08D7C681C521ED4060481F58BE673007A081321E01E21419E232283A01CB1A4481550DBADE263382EB93B7E42470B265027A933C480CDA340A9A4065B4BC47990833786456AAAB5A81C0A46E0076B91BA5BB4D4ABE21C6AB193B3A3671C18479DB082A706768A63109D2C4224D71C7C95755CA24B056C355E9C22CF5006662B3218EDD4B317B19962CB514AF123245B152EAC41391CB432C6CAF9295C66DA4E5737AE3D60023F46AA7A604C64A6C403306CA4B96FC2929AED5B4CE7E6C631B473D7D61CBCD19826AB82C0C58880D77CE8F9BCDBF59D645424BAACCCE334809B43ACB99248BBD966C88793A273AE857946902649F97B5516FA2EA2A84FCFBC054653852D8421B6B78C289B49080C8EFAF85DF195AB5562A03E7099C43C439A25AB41390B86DB4F57188F002129F3EA1FFDBB9E9C688EBBB26E0D7AC6EEA395B698A134F70F98480E87313B79444963557CEE82534E9C1CF10B74718CAEDE3BCBD98A68D9956FACD8A45E2184C16B14048B9D28E8BFBF5AB43D1B650EE8CF13148CAF451CFB144656052CBAF82E2F765C8C9C66C23B0CBAE0257D6000F247200AB87F93B5167478A27B42AD7681B6919529BB1430DFCC809E171A334B33A0527A1D9519C18130971C55F6EC172B86248059830FC57C7356C9BD8263F7D571D0F7BD87D2A1686A7C41DB9306558CBDF39F0176959A188B4D457B40C152B7EA09F6860D4D945E78C45EB68B579D48774EB26AD43BC1BE3C0AC327C80B4C1115C2CB58BBC24A18146470ABC223AD51FA10EEFC311F1AC02AF4C7432210233A4ABC408B1DB484E7885D239C0C2B9C4952E577A8EBC3D6A7684E711E12DB96E1F988DF423A395301D2C15FE2F1ABF708BC64147A30E2717F7868FF602D50FA9A3D0B3A0097259AC52057DCC14319C438E113DA967F6DFBA4279245B72CC86CF724C81769DAE271E18C0B6CFA84B916AC89B12A1F8B05D88527AD40346775CC832713146806A2B2884E35628169BC12F67811B507BEE3BBEBCA81AB93B5D700AA92898B3F5CB6E9D345483CA3743457FAD8CC5BEC2A8E7A22A41BA8B67641AB181D42ABAF94D0055206B648C81361F8486408B610BB3552299316B5C0B7D301D9F1C3D55621859AB2EE922C59B11EA9F2A1EFE277C534128F2CAE6B598C0FA059EFC2C24E8A0C2337BC2C57A0BC64A7FCE190C656B529D21244EB66A900288B5C484BB033020B9B9BA3019B72387F2746B3B893A1427882BC3135F0A17F8271F9C8480EB60732672D44336B32F851A283224144C480AA302C05836EDC1AC4569A6020130B341466322D17811229441C4513A2E8041C85E035113992F16799DFE8C1EEF3AFF8CA2F341628808A81E8B66EE5BA47AD0863C735A904565F036A85FB1203058137AAD2206C303F22D3027E732542A342CAF3376D6B065A745E31E865FC2243DA31CE08EABBF8183B4294700BF8928DA8CA78BC08490810C39747FD3851211B22F26451F6772E0C75659133E8D8C063CD3044DA1719855FBBD9796314B11DF8459EBD2D92B7FDC94C4C4C6D304E0494D88D83B5E3AA5761DF3B299551A24F28994D2747B2B08945BEAD20A7237801F470FCC2BD9FD7BEA8322859B850F7882D362947432913DD068C01 +ct = A95AC6C09FB64C6D773EEF1690F3B87550BC37513FD8AFD9B1BD88B7B51BDAF9EC20EF1E5B2F7856C02211A7936FECD414F991C098A77F7C2652B0BF095D368F02A2A293F6300932BAA5AF1311D05EE3C4EF967003DDBE06DAF30277636292E5F435DF449904A9C47597DEEE95152D0296F0DB4013609A986A27FB8C50C453A76906D8494416434B048A2B411D25AAE800469B2ECB73592A2BBAAD4E392F3C5367B7FFF2C9A4DBF65C296873230782E4CBBB2C613FBE8E5892ED04524F353F97B6A83CBAA6ECA393BE675AA3FADC2615FB5A2DDF89745F36C83C1FC204580B7E4CE24029E0273DB147666A6550DE9364BED46F3C20E80F42CC013196FFE4E06CA8FB9FC421C798B6A287189861CAA148EE2B6B4326D73F51B9FFC2B97132EC6F4C0D52DDECAB76ADE333C6A53E090759AC5D8B43779911FD98C080463938E0FB7DC6F69FB35F71919179D82DEF20AB425CB56554893541CDCE3652BE623D49052EE9DEAFB39549B85DB84CDDF45F3D113E815CC0D32B3F180E59FF69415DD50B756624C84579071DE883E2187FEF0A63189EE9D342679FF0DCB98A2E963B490BCA4D60A309D08FB6C31A1CACBDA0D004B6D666676725EAEEA9D31F7205D3C02D12939C3926EF259429642A9D9C375D77F51B8356CFC1F504858BD56E445F05CCFF5109F73B89560788EC833AB196A51E877C751B70A67357C70CEE24DAA81BE2C666BA20D1B7DF9818CF9900D2CBD83FF74E47F999689D2F5BB178E9A6D4B4D49538706136F4096A919469B4006766D5279453735B84D2066389FDE6F600B49D4DE09BE55E09E7C462F314C921F225E0168342DC4D306DDE23B39139627E6AEF656E1F803EC3DB9697A8FA5772994C7F5A0E6E23F71B025D007FB106E81E76C3D9C718930A1A33767DD2B24B3DCBB2728E9746429625330006CC71604950F1A5124C3A820AD98ACC2DCADB4A1FE4EE3B04FFA3FE7305700AD11C06183AA4864FC8A254D9B6319D3C8C42BE03DB71EB74E585EF4A8D8066FC9D6C5D4FBAB3345D8241A9E6F960E238007F8897A50C6FD1EE62EB24AA67EDD962A2F2A9286A365282333932BE877227D0F5E77767CD69FBC6001CE647F29D89E145A91A16D477DF0424F73C6D310C68897E50F3DF553008DE313D9F9ED621E3C43617FFEB5E969C015DFC361A06E9E649195ADF7C4E9BB6AAB204256F1D7F6D0B080E2981932281937175940EA11583F862D7A001BC33A0E142AFD918CFF3764E99E52D3E920591A0030B3AA55C88589C0AAF243EAEBC6F08E2E3B3083E6A41E500150B90C0172F534B597C958B0430AF44204165344E218FD84BFABF8F580489F89748103B451FD9F5462288A03FA317FC72BF986EE03CD87709B646C4C611143536FFE596DA2BF049EDF32F8E40B0C465B24EB81FA09D775C7C5A99F5ACF2C6F24BD13616E6D7E27CF2DC938CF5BC17D8F4EA78549377747A23E341F19455B7C95764A8476AA41F1D33B2344938BC3FDA480F646DC973321108BFB7638767660FDE1FADC387EF +ss = 633D9672D83A112A260B9D4C17812359B5591900A3B80424B3590B403A5DFBA9 + +count = 50 +seed = 027C3D5847ED4470931141104F25B19AE76117CBB64B224EE424FFB782E9A0E988839E0BDED0DF666FE8E5FCBB5DBC09 +pk = 41AA7B69158362A41767486EC3DA09AB4335FE2A25DD6C07366478CDA91C691C5ED9264F771124C1F3693050802F480F5DF89D5BE189DA765337A69C5C838488A0A4BA7880E91871FE346CF3ABB0AAEBADB211B5ACD3B773C9146CF97920E509DC202F79B14734C9777A567CD44A43500B5EB8005BF4C5A387701286639E6D9AC2574B33F2432B3A787039E34B2AE511A27825CBA7A8E09B401CFC6123D3B4C42318E7B032331230DA960A09F61A6A196DC185BB8BF1C1A6B691A06CB57F12BE1E45269C56490E256A83C13352A878C724242FF0681881160ED03166612D69894951D65B95E690DB46129D149AFBA2C835D3B138036931423D2F84CA51179466A1028D1601D5C397CC81B1B5E468869185B25095A0E5B5DD6A421B5C7ECEB58C4CF97B7FEB114FBC435C78857C65098D3017FF8A58F5927E5EE7712FA0C2962939B9D8C84BB6428B3902881188DF17479EC01E4709B7840235CCD77ACB0BB3A05995693781FB711D61F2883827A96DDACE29A9CD43EC6ABD4691BE1A758B72A629F6AAE1C795981C0D8BF8160BFB3B8F5047E1A410CDD49C6A42ADF0BCAFED1B21EEB95D504B1A48B1ACE228BB5E1508BF05128F0CB63F5597851B9DF4CAA5B6AC10F7F6188DC41B02761F840CAA42871C55205CD09771AC9125D6265DDC56A466249FBD774EE53756035349CA12A48237221BD53D7FF1AC18242442935BA818A3B50007A3FC14A2FA3ABE437FF14705DF0CB5AF97561A608A3FEA42A809A7A7D5491453C849DAB7ACD99636931C007A70D01655C7302F9A26012C494DE47839C1EA2951A87FF73968DAE83A86F392F021873BE4C75D2B0700A3B540F50CF6FB664A4627DDA9C75394032F434655755D12D4C781E2324AE00DD61744CEF6C5EC9680F379A26284BF9590A33350905E080E9B70547AC1CF3AD888F30232FDEA7BD2C184F9E1A9B6835401E737204C5EBF2B28F2B58EDD399F873C7849CBA8064B8A20C9C391841875B4963BBA2097B958D752739383BF26787E64EC215974B45848185F44B8780C0714B9651A7685E673CD1B6230C5D6639EA5629C20659802BC6F2B95DF274836241165A524EA99A941312FEFC7CDD2FA8016D69B652C3E94E73C70C97F65B3ADF14BBA2D31916522701D80252E9C7FBD7A17D306A4E1E02CDA405F3F07B38EB65824D5C9D8B91F7013784FBA0DF0348F21B00EF5A325C745A829714A5B9ABA16ACBDF029771D5415E867590CC5A57360A8969407F0749AB8A08A65E37E70146FC1B7BC40D789EAE83761E77749A07859BBC046B5A87E3A92A5368251127F12D27789318F8B9C3C1F79211922C852A0B0E10BBB631599190B49A66937920B3F113185D89C6E37DA5F7CE9C12D37C12CC24741CB9A79446606EABE8C9AB06D8963C959955F198E03A0BD127242DBF2A2180281A7B65F54C28EC9C6CAFE64881D6456C07607CDFB89E2CA2FB3BA8F8357720051C30952734932B08B508402A6A2F4F9C76B053C12A267618928032B5D9E41990A18C2C04BA7C2868AD9F4538FF1B494707EB9DA6B81374D7F9731F9A26089D7033A8C24600944D65871D313387B4101C0AAA27AE19D978653638577BCF4CAF48083EEEB57F401544D4DA3B73DC1C5C4A047B0A5EA85EDAC7BEC66F4D87FD2FE422E7DBCD02D1455 +sk = 3C14BDD913CDA0F267ABAA8B0A30A5EAA527638C01926623B0BC2BA55B0B596A92BAD72E92845828E8050F4C2F40873918E4524CEA8505208D345783F71202496721E361A582C5445FA31FB662A64941ABF9FC203AB4A741C9214C1B80B4CA617C4976C819794F53CACDB3509978A6DF5900016278388234CC1A09B804679F36718255B2DB60A7EEE5BC3BC78BCEEA8060354B54031C4C76B30A1A8B1EBB697FF8606CE408FBA72DBF0856E5B53B1E4A4ECC746CDFC77545B46060974C8A788A1D59529A9AAA571B895BE01ED5C23A0D22707D89467A5B9C662767A0D77D5C49ADCA983CE7401F34526DAB1CB9FE744BDE8C54C230705548B9ED00B9F4EA055466CDE77019324C0A7C9BA404B641A6530AE64A964EA47E6E80AAA4652C9A8B66061103F385479E50A780249A909C92B7913329A478880162D8857D58FA39D3283F5A2A7F8FF6ABFFE2463DB40728D06166627E9C92283FA57A2E46190AB869B6C21FBEAC86911284153B259BD2A442070D1CC581FDD333E5990F84AC67F47491DF01128F0959ADA0891C236E0ACA87755289C0E6C8FB136974C97DBB1B8871A4C70AA001FC950F0CBB3ACE4AC44F800252F5BD76FC1DC09A3D2F8860385A4BF8D765B49C5379140E0A2801DAC947C23803AB6B467F2BB1B019B9D53771418312F51B28DB18BE216794A0467D79AC8ABAF2C90F4B1B3474C168BCBCC1E6AE59C5781296467F2B8D63D5842D67935DD429BF8319BC0B8199CCA9D3F78C483B8E0771622EA764FA610EE13C1A188C56D0B5C17094C1B7A45321BB69D99A666A7963268A1D0A0491B8B5CB700A7D86AB9039330EDD8BB17CF1AC79355A82166458D2323E070AC109C98D201358F22BF9A3B513B8BBA43905D1A790A7B1A11F682583AB4FE0A82F3E316B7C70AFDD823C8FB7ACFD330B22F378E8597CA5357454A71197CB4039E9A81D7995D14587B479657584407B281886D6A7FE9B6170A056D2003BF898027C275B7C1C3D1D0C157145BA52D264699B969D60AA3873A9606041C20B17C90055B8016EA703539638CFF8AA0A219542BF51B68CF153A86149881C087D898EF9C3A089CC70A8656117131AA3F233C73CBF439022D224422920501C07243432AEB925C4023185D3F897A79A983D857C6D1422F9B22234005E00882F77C7704CC74ADEA4C8F3971E7964BA1A530C1F722EF696828C46946F0B329D909A47B83353330630359EB8E9B7E78ABC50FCA8C3AA9AF967C89F464430C815D1959A21A226A966A6434301FA600A4D129886826803EC49A54A34ACD62B50E33FD782937571816421341CD76A3570C17AC9C338E4AC4C51077650B98AE445D236904DA694F755C1A5B288275B517B4C9B896C49BBC18933E52D34969B6AD8ADD604B526488C6397842A54B6657B93386B0ED7D36FD2F448EFE43B0A144C33F729DF530C8B6340CD61897B3C50B0D8BA81228604F7A4BCD120CD2A7BBBA3B4818177C435A2B0C3AD838C6D9BD3903D64B32B8A8DA5D93589021251D14C920328C4063C2AF3C8C41228355527ADF41037E1AC6AA69A427A55354CA9D54025306C16F93154776B4A7AF9C9EF2298DBA9B669C40BD0601ABD410357B8940511BEB6C96541AA7B69158362A41767486EC3DA09AB4335FE2A25DD6C07366478CDA91C691C5ED9264F771124C1F3693050802F480F5DF89D5BE189DA765337A69C5C838488A0A4BA7880E91871FE346CF3ABB0AAEBADB211B5ACD3B773C9146CF97920E509DC202F79B14734C9777A567CD44A43500B5EB8005BF4C5A387701286639E6D9AC2574B33F2432B3A787039E34B2AE511A27825CBA7A8E09B401CFC6123D3B4C42318E7B032331230DA960A09F61A6A196DC185BB8BF1C1A6B691A06CB57F12BE1E45269C56490E256A83C13352A878C724242FF0681881160ED03166612D69894951D65B95E690DB46129D149AFBA2C835D3B138036931423D2F84CA51179466A1028D1601D5C397CC81B1B5E468869185B25095A0E5B5DD6A421B5C7ECEB58C4CF97B7FEB114FBC435C78857C65098D3017FF8A58F5927E5EE7712FA0C2962939B9D8C84BB6428B3902881188DF17479EC01E4709B7840235CCD77ACB0BB3A05995693781FB711D61F2883827A96DDACE29A9CD43EC6ABD4691BE1A758B72A629F6AAE1C795981C0D8BF8160BFB3B8F5047E1A410CDD49C6A42ADF0BCAFED1B21EEB95D504B1A48B1ACE228BB5E1508BF05128F0CB63F5597851B9DF4CAA5B6AC10F7F6188DC41B02761F840CAA42871C55205CD09771AC9125D6265DDC56A466249FBD774EE53756035349CA12A48237221BD53D7FF1AC18242442935BA818A3B50007A3FC14A2FA3ABE437FF14705DF0CB5AF97561A608A3FEA42A809A7A7D5491453C849DAB7ACD99636931C007A70D01655C7302F9A26012C494DE47839C1EA2951A87FF73968DAE83A86F392F021873BE4C75D2B0700A3B540F50CF6FB664A4627DDA9C75394032F434655755D12D4C781E2324AE00DD61744CEF6C5EC9680F379A26284BF9590A33350905E080E9B70547AC1CF3AD888F30232FDEA7BD2C184F9E1A9B6835401E737204C5EBF2B28F2B58EDD399F873C7849CBA8064B8A20C9C391841875B4963BBA2097B958D752739383BF26787E64EC215974B45848185F44B8780C0714B9651A7685E673CD1B6230C5D6639EA5629C20659802BC6F2B95DF274836241165A524EA99A941312FEFC7CDD2FA8016D69B652C3E94E73C70C97F65B3ADF14BBA2D31916522701D80252E9C7FBD7A17D306A4E1E02CDA405F3F07B38EB65824D5C9D8B91F7013784FBA0DF0348F21B00EF5A325C745A829714A5B9ABA16ACBDF029771D5415E867590CC5A57360A8969407F0749AB8A08A65E37E70146FC1B7BC40D789EAE83761E77749A07859BBC046B5A87E3A92A5368251127F12D27789318F8B9C3C1F79211922C852A0B0E10BBB631599190B49A66937920B3F113185D89C6E37DA5F7CE9C12D37C12CC24741CB9A79446606EABE8C9AB06D8963C959955F198E03A0BD127242DBF2A2180281A7B65F54C28EC9C6CAFE64881D6456C07607CDFB89E2CA2FB3BA8F8357720051C30952734932B08B508402A6A2F4F9C76B053C12A267618928032B5D9E41990A18C2C04BA7C2868AD9F4538FF1B494707EB9DA6B81374D7F9731F9A26089D7033A8C24600944D65871D313387B4101C0AAA27AE19D978653638577BCF4CAF48083EEEB57F401544D4DA3B73DC1C5C4A047B0A5EA85EDAC7BEC66F4D87FD2FE422E7DBCD02D145572BE2F5CD569E6229F00014854633F7B278E90AF4EA593411909467A03E29CFB7B534537ADDABA4ECF14F02AB317D36CB9F0F50222CED7CF029DFF8A0D3D2FD9 +ct = 90606786779293D177977750726975F4EB4D2843F8F693800A1DD52AFBE25A79C5E48D83D02E9CDA1E3909D1C23DB2E382ED3DE92FBEAF611F326DD2A34E597CE9695E211FF7590CEA226B588A5BF394E8AEA1AA959B45E32E7AF8DC01500F950F9AF77878B8F280E917579650DD9ADD147D1879F249FFA2B48E170B5172B97DDD0BE9BECA1843BE63C7532F7BA2B85E508A600B1592759EFFB657EED4162855ED6B6BD143A91523A3D033BF5F6199F8D1BC7021A37ABFBB82886777797EAE296F9D5748FFC0A1276575FCDFA8056030AF0DC936AD79D24E68228F9C50F3F406CF0DCFC8C7767285B67EB6BAEAD90391D8DD18781752FE025407B96C6F042D251556B610755D1BDF36A806230A11C2852827A048E835875239F99BC4A31455E13ED565961E1EC56AC4719993F2D02CC08F03941F9FE37A7E18A66DCB2E5EF5A591FC5A4C5128EFB1435FB97A2A396B749F911160CB4078F5D34FCC42572B95E4BC5929302E1C77F5E13F633CAC285A61C2DE38877D8CB44D9110FB415C4B7B7132A04050890602D7ECFCC1747600E8F2CC27CE59C9389B227AE001B1133BA633D0B332EFB1D2E1E6CBFEFBD162CC62002A9603CC2F0B580AE0C541D4DBE47E527BE1095112855F97CFE206A38583EC34D7B87CD37824206D7EA069FE35A9C8AD0F14C45E5324A28013C1A2D705364B67D710FE03EB273218CC5EF9DE14243B6F097E7129D90D770B7515E214DBFE7BBB53D816EFF35714CA0B940027145B80598A2031180251C5B508B52970C98DB719F53C11A16E4E8161FD9341AD76EEDCB6AE20B6FF1C0AFF2E78E538515B8819BA6110ED4BE125037533489E0C76E52231A0EC0569DB5EF47F6492B7D6ADA2276F93AD2D53B08E45E8872378AD44710C2254556435483D4BABBA906E60EBEA08D652C17DACB971FF31350EC86E61B655D106D0A7D8BB8D224687C77D9BF70FF94E55D658CBA09EE778ABE08D01FFB05252F98B378DB8467CF5254CE62269C1D42DA233FC59D032B7E69FDCCB57B568BFC40A1050FD73D9E04D29BE0B4E63FB7A817DB603EE7CDBE280E772F7D18B4C2E3805F6EFEA65F1FA09A9F3175F4104C2642B0867DD997AA26D55428F41B522B8CDD48206FBFB97DA0E7CAD7BAB9215B7850B6AD4389148CFAC1F9DF17D1F6B8F629BF5AB4409E99B24016EC0F425ED4EFAC98FAA2166C6B6CD39022BFA01B3FD57D30EDF1F2298601420DC2CF757E3702E34B7EBD285D2DC6BD0FD07967EF1BB9447DAF0F0B5F52F2C61DB0E7849FF02D03C50703961A5C03FA23807218A04FAB9466633563B8833784DAC8E23B11A0D895A5EEDDAB644C23F6332735FDB0AF36345DB18EBA4E5FB4F4A30000DA7AAB1860853103792D4C32FE13B8EADE1451F6537212DDE6D0B1160A151BC4F33725698930774D5E26FF1B57FEE3D2C19A5E5AD0FB0A0093C4875159947DC8B7D915AE10FBDBE2FD73ED5342BAE093D764C26ABD30271EA1AAE78FFBB55B2CCF97CB8D75FC6438147718B4E844D14EFA5965BD6 +ss = 7EFDC40486793DCBC7C030273F8EDB4178075955EDBFBBF0F21B793206A172D4 + +count = 51 +seed = 450751D4401737459C6D93E6C5F2FBCC4A3AF7CD7250CCF404BBB817A67BAB7B4C9D0EF4570BFE25CF919DA331C31D88 +pk = 32B6C92F059443501427AC964FA569CBB074C71053F179BF1963AC704489EBB9936E23950E51AB7E26A98D6031C652701FA4AC59AA7C15D88C0337A067257B8D916DB0456FAD9622F44A928DF6CCE84A3E6634C9CACA246208920C487B9A666342ABC389C14C499785BCB91A95DC868FA20D25B08AC0E48C72E9B486151F21B11731D1BF049174ADF279F9020AA98C38372877299C4F54A4493A3B20F8BC71CBC490B363C4162055CF3A5C13650DB1154687462FC01B5E5B78C9F603255A24189B808358E17E01B9CF736A77D78A32520B6DDC9C1DD65A00E84B562B607B6AB472D5173AB53A97DB08B322E95CB3378D5D088CD3CA6FA4739C6633A27D686ABF040DCAA766BCC18D6B8A2F91E51ED6D49AA37AA44531BD9DFA25C116A842E50F53A68BF1617245E8B7DA778EB3343D3F2575EA84627C640A6509133F4C5D78151A6695245659955CD3824F264A7DF58EC87C8AA3066ECD1B68D848CB758487E647223C0154388912ED028AE364A9FA9A018D8558C3E9B179B66F2488C2BE8792B1849FAC0401A9756F209889FA637CF7ECC4F2C0249EB5C6F7E0219FAA2A9433759AC70DABC7BAAB623C2023CF7EC869B75BCE953CA3316B7A6FA685BDC7C8D467273268A0797B8D6FE57DDFDB03FFF7AD3D5B9C80DC1939720EE8810933A04F51B78262910D7E28C0EAB06B91980B65056472A293F2361183125670AC2426E514790B945D6B09C9EC354FE7C895A30231D95794F89EE60761AC9B2AAA9A75EF168C0950AFB498915B2518E010C3800764BC5A65C0C54B2AF686B7D954E77BC4CF8137AB398FE93429DD0AB80FC846D4CC8DB2B9B2B4BB36D4C4121639C1E74622E59250701302301B4DF96B2FA62736B29CAF0866096F842898B2C6012B93B5AC23D1F39E192002FF0B9005FBB8CFEB8930562A4E0AAE7A40C5032B8B33D0760D96C7C203920E2439D3EA02372C7F5D80B92259349076BA20C3AD4FD21752A3963CC5126342A963A363C1157F33189732F7243E465B14969F1CA199AF45B50851266742151A235A8BA9A595534BD6AA31CCF52B8C5885D571A93D2577C57057E2CAAE68C9C84F565C72681FB15056A345236B02A1E5B13289388F035A2F8E03402F8B0A44259179A904C94725319ACACD28AC1E449B87E8916091940E33861A4A35A8600267F04FFC6A3E06C60858D578BEC60EE7716FD4B0225E5CCEB5FC5437387522200F66FC880E0C874119C71F462CB4EAA24E67BE77CA67278344199B27E2A55B50F372B65345122225D7324CA9504CE4D12BC101639E93B331E3B60E1B520E03C9703A69F54C2B1A52254AC44B86F310A711263A5A9B87A7116EC5654F7297EA76B63F939C1F49CE99D52BC58876160401558193AD98C7C8F4B6822712429679214BB2B6E8B324B58E1F57695DC8968BCA7EC3717DF12C1279408183B49679B349E2E45686E722C3A57BD9547A65656CBC79AEC1D3B129837D84A6975D018C7AB04C88775E9C68839955775FD66AB02AAD69B76307F51DB2AB33915ACA61969AEFF14674A557C322AF6997B1A8D9C51445884779227EE742986446EA1719808996049038E0D9AECEE828BA054417CC3A683A7295066AAEE9CB429C4740531990744A987152DCA2388BA27E3769C8BF287E54E41CBC0ECCA95CE621F2 +sk = 2D149D32C41889573CCB5166C597C3FE207CB806BD13A8A7BDF86267A93DA7110A31F22221A17A5381C367EB1B9CD00810189C1F12358B59ADBFF2060ED6AC6712C660B51B553402D406BCC1D2444A863B6FF261E17AAFFFD01BAA2B05CD83050AB460CED09BC7C0C2963784B7F9798D837BBC0483001539F0EA65A0574B46785645019B25130095725FB71556ADD2832EA245E250973F504DC58A4BA3C45CC8259E7906588D688F4F4CC79A1A955EE31E0FE931D16CC9DA767C3A48BAD09874F7730FA74C349D2163638AADFB59A462E904C5530A0B485541E391B6037041EC6A0560563F186BE2AB97A42520A7DACEABF1216E16870437CF012A6B6D082BBB23349628AF4DD8CA9EA986498A80EDFCC2418C3F5A627BA8BAADF3739B3C578B2F193F57B72DC2827A2DC379AA31B6127C65352338C012CFCCE0AF1B33150D488CF47134E06B5EBAF0432C172090FA6671670BF7B66002E135E7C43D938343D5729E22E5597A06209E0793E65417DE945B5E1AAEB2740FB1B350C902C1390A97586564FA94120CF7538B21AACC0AC0831B477E37C9E984B73EC91ED88705EF4CAFD2F15A50227C0E4C0627D2A6D7875E9605AFEC339799690BB6F0A5B01141A6976FD51AA7A079827D37CA89726686BA95D6F275A59341FA229B4C163C260C4DBC4587C50AB8F0AC777849B5F700209F17C15251854C35AA23C20D486122EC8145565966F4A067251B96461950AC2171F1996E94517610338B88C091C356804CC691922449DB0645A404AE4A641D1482B58E6230C7965C23605D66E96C8F0418AD786801D7530CFA2B5B757E06ABC10518B274E3992E538922B717866C7EEF827D2BB4C05FFA3322981CD8069DFE028D878A8B7A002472D302253A83AB84ADF5530CC5F4671BF5219FE600BA97ABD2555C52857ABB76CCF4760ADB30346C55AA5340B189E1968F72999E64C0B76297D232412B3C9384783457B83309BA7EF74ABD50D16EA1C32A2362AAEBD02DA7790FB8827FF368261CEC14F3A2095323502446703783CA9B6AA595D690031297C59B25414455C155924A47896716AC45330CE7069D131B75A57769FD4B4CA1990170A3570160CDBEF1C930063D56E3546F09B1CD913C82057C0BB89111E6B1BBA88EB8CBCD72078FCBF5059FE25C84BB5607D7B20BD0733FD96DBAE2ABD9531DDBE3CDD89A926361BB56EA0E5F9181B2C8C1532312F3F9005135C07DC211B824B1E63AC96E64845C35C41E0313511A5D429663796ABF2443908D353766D40F47A910FD04A710BA5D6A5B301832A5B6016338D8858B220E8219512B643B8B60CA2A9347EC39638B787FDB44CE72408DCD2504DE24AF91130ABC09B2E7C9BB26B3393EE06FD77019ED3466E019AC92A416C9683DA22CAFB1A9AD3475AF17A15EE9F97446096647578F77FA02E79904FCC008FE509425446CA2A4C1DFF32CDFA4CE120230BB5CC9CB49A2E2841BF69A1C49A762EC171698CA0445201C485A15FEF2562EACABAD3259119C9BA4185677E03AA0470CA848709C4BA0C8E5814416C5678033C819773DB36E7A90C65FA82FFDF6921C38285122163BC0744DE5C5363C9A973428A6DAAD20E5A62D37017B464DA7637D32B6C92F059443501427AC964FA569CBB074C71053F179BF1963AC704489EBB9936E23950E51AB7E26A98D6031C652701FA4AC59AA7C15D88C0337A067257B8D916DB0456FAD9622F44A928DF6CCE84A3E6634C9CACA246208920C487B9A666342ABC389C14C499785BCB91A95DC868FA20D25B08AC0E48C72E9B486151F21B11731D1BF049174ADF279F9020AA98C38372877299C4F54A4493A3B20F8BC71CBC490B363C4162055CF3A5C13650DB1154687462FC01B5E5B78C9F603255A24189B808358E17E01B9CF736A77D78A32520B6DDC9C1DD65A00E84B562B607B6AB472D5173AB53A97DB08B322E95CB3378D5D088CD3CA6FA4739C6633A27D686ABF040DCAA766BCC18D6B8A2F91E51ED6D49AA37AA44531BD9DFA25C116A842E50F53A68BF1617245E8B7DA778EB3343D3F2575EA84627C640A6509133F4C5D78151A6695245659955CD3824F264A7DF58EC87C8AA3066ECD1B68D848CB758487E647223C0154388912ED028AE364A9FA9A018D8558C3E9B179B66F2488C2BE8792B1849FAC0401A9756F209889FA637CF7ECC4F2C0249EB5C6F7E0219FAA2A9433759AC70DABC7BAAB623C2023CF7EC869B75BCE953CA3316B7A6FA685BDC7C8D467273268A0797B8D6FE57DDFDB03FFF7AD3D5B9C80DC1939720EE8810933A04F51B78262910D7E28C0EAB06B91980B65056472A293F2361183125670AC2426E514790B945D6B09C9EC354FE7C895A30231D95794F89EE60761AC9B2AAA9A75EF168C0950AFB498915B2518E010C3800764BC5A65C0C54B2AF686B7D954E77BC4CF8137AB398FE93429DD0AB80FC846D4CC8DB2B9B2B4BB36D4C4121639C1E74622E59250701302301B4DF96B2FA62736B29CAF0866096F842898B2C6012B93B5AC23D1F39E192002FF0B9005FBB8CFEB8930562A4E0AAE7A40C5032B8B33D0760D96C7C203920E2439D3EA02372C7F5D80B92259349076BA20C3AD4FD21752A3963CC5126342A963A363C1157F33189732F7243E465B14969F1CA199AF45B50851266742151A235A8BA9A595534BD6AA31CCF52B8C5885D571A93D2577C57057E2CAAE68C9C84F565C72681FB15056A345236B02A1E5B13289388F035A2F8E03402F8B0A44259179A904C94725319ACACD28AC1E449B87E8916091940E33861A4A35A8600267F04FFC6A3E06C60858D578BEC60EE7716FD4B0225E5CCEB5FC5437387522200F66FC880E0C874119C71F462CB4EAA24E67BE77CA67278344199B27E2A55B50F372B65345122225D7324CA9504CE4D12BC101639E93B331E3B60E1B520E03C9703A69F54C2B1A52254AC44B86F310A711263A5A9B87A7116EC5654F7297EA76B63F939C1F49CE99D52BC58876160401558193AD98C7C8F4B6822712429679214BB2B6E8B324B58E1F57695DC8968BCA7EC3717DF12C1279408183B49679B349E2E45686E722C3A57BD9547A65656CBC79AEC1D3B129837D84A6975D018C7AB04C88775E9C68839955775FD66AB02AAD69B76307F51DB2AB33915ACA61969AEFF14674A557C322AF6997B1A8D9C51445884779227EE742986446EA1719808996049038E0D9AECEE828BA054417CC3A683A7295066AAEE9CB429C4740531990744A987152DCA2388BA27E3769C8BF287E54E41CBC0ECCA95CE621F20831C75B153FA17D336A79FF6E88DDF485DAF7B1B0BCF39D8DF15319D52AC67EF48A9254DD40B117941FA35A66BB50296327B725525DEEF70E128CA8045EC451 +ct = EAC0E656E53BD64C8F7B2BE3647A96712E4F83B04FA4555F1D3B8F9B796B9841C2D239956674CB51CA6DD945F2B9C40CB3341881E883A6A4B356538CC01E6E42B72DE8754BF38C4363C5F39C9661C13B207DC92767B34AE07C3D38BDE0BE4910E4AD5DDADCD4AFD41C5B6B8A00D537ABA8F5796F940B892EA5B797D2A19021168CF55F0054B6C6C7D43B192632F3DAAAF4DC99C2157EC5035E8039809A95126DA22408AAD3558C2C52528B46F313B32D8730CD5C5EFAC4F58F539CB7DDDF931C6EB9AE718BAD5B5F10561A922D4C0EFE6531FA7012568E5A372F6380D5C31A5F722768B2E9395B8D66768E4D8305DE645927D91BF7627977E9739563761581F438E05A50ABEE8178065406D40CE6818EDC2ED16FBF346DE6B40FF715CE1621FB2D55357E359FC3B67D1010FB65A732F4AB7C7BA83F4A9F8C294C7D96DA285B931F78AE792AACC355B8527FF2CBA6EE903B666691DD4F6ADFBD58F21EC2143571E061F6049B61AAF0A56885B34559DF49BCDC71B1D2DF11EFD96BBE1EC331C8483AF5D9EDFCA14F3955CDED0A2AD957759DDCDB02A93C5876FAF55EB8A32B74975D5ECFD3296B00694EA1DADEBD5932B306307943680AB5A2B25CAD113A22AADFBB9DD8F4C462FD6EFEC2560EB8BA20A0B2BFDEEC2193E8D8EEB70F759E32B3F07BB3F7F5AAFEFB74C5C54D7AA8369D8BE515EA5ACEF7FFBE63BE3AFFDCFF6144FF59BB0E4EBC711A9F001E05D3A4BB4971377462E695FFCB41D81AB63ECB228D47049367504E279E5CEC3D1CBEEE4B1B9AFD9EEEB8565CF6AE4FCC0F62F40686DFFBC7E9A4148EB3AFF9B876987E7D67756FC83DF5B69CF46FD3AB096E5B58F16756DD1EFFF6B898CCA1BF81E19B364C3854420DC8570CC2C5B0E9CEF31180712BC4CFE866465409433B57577EE869F77A3D713BF983195B53D825D6B3A6F1DA471ABC964FDAF6A9CD64D21C979C4609FF77339EF560C793DECC75A6C78D01A8A5A6D1071708FEBE38C7DD95CBFAA4685B5C8E22FB0A17849AD8BD0EE1A613CB2A3C6D1EF0A4D32BC535E45FB5C4022B870F7C410C9D93157D13C47E8C4A89DD9742EAF9603AA98E98020B0EA05E9C6D21752CFBB0D77995DCA48E0CDAD479364AAF3ACB4A99204A006EA3BE92B9819FE611FFC3C9C73F240B147C038151BA94CD1DC0E78EB7EEC32ED7B1D2DECDFC6751664B80EAFBA4600737FC2939413ABC36D14100DDB3F67EDAC9317ACDCF043006FC01FD97FDEF6ECCE4400B542A4AD2BDC4107D975DFB762761739ACEFC9A6B2EC26AB9C80F24059B46CB52DB1EBC929ED159497989131A7B67BDF78E141D8BCAE3DCBA7948CF843C2E1409830B2234EA1638C378B40C87907B1557A81044A5D4407CECEF5AB2DD55A28CF30AD06E741BF47A5652E56DD44AE96FB93E57259542F4EF268EB9221D714E472B4C633D2F4194BBAA72B629B83C7108AD2DDE0122B3A31F5D028C911DE14F1E80E23001FFAC0E8434226A1F0834CF5A5E0CA419D46759CB8D9A7236EF949A9CCACF70DFB4 +ss = A33BBCFF1EC8C4D3E3229AEC78463FFEAD5B96C6C1FA857921F8907A9180AF07 + +count = 52 +seed = 5DE720F2D152BF4E1F96A61E7AE5F1BED6B8548E32638C2CCEC9F43B87D1BB43DFCF334F0582984D27E440D519AB662F +pk = 7C6B065EF3308AFBA0CF3607B2C98D83F76F7C058262B55F7C0746B3C22437F00DE9D7CB69F40AFD60AE74B0506AFB96E30669F51C464A27B4F177666F92459B293DC208A0DAC5654A8058A8FABC2D1853009743A598BAB2C248068750F01227BE5A4F7C4C6948F9167E88894D43B5AA44687FF177DE837E2F0537F708A8F73A11FE6632DC285C9026BB23424AC2D1CBCE39AC6A0A7686F088D617B096436C9F773E7CC50CEA1C08DB20C2949A7878D18E7372CAE746B04558A8FBE97DF0B9A69090449A507E6E1C07A35680412033127037607B2F0502690B47BD300A84C041650DC748AC2C060260C933A0B81847243FB3267F3CC8DBEA4CEA40790F37CD0373A71EC00634BB3B3B087A82CCB1E1DAB77300156D8094A1D61D1F1BB3F977B749C938AB8092D71C93394856ED133075E2BBDD3CC0F27C2A2D34BC0F633F5E55C0A6C989B1E277EE9132F8779923EB2E22F78A1502BA5E55B6D53A05137867C10536E672C7336A3EA1F237263A6046F260ED3871F1D479BE589744361A0D819439779075CC47A5A33E18326615134D9F09B68B6873C6CCB682F6B75662CECDF5432C37189AE09FAF36735EA01C12F9CE64F4116D509C70E0072A242FF126710D178DAAE86539226C92D090D9B60DC63539F51B46DBF24CC8D54EDA255E0AC19B03D34F5A270B6FDA6D6408BCF1D2A46824B5290B8A26A8131402C9AEA052D0101759345F86A66A4D238A20C6531D792170C52DEED889AC3050FF87C659524337830C205622A989736B788092101933C0073C0B686106A9B88C17958A8711D272392AC448B01507634DF4A23846AA9D594C80BCA99F17505AC1793F2877BAB4F1B211D2985842795C4C1B9FC018DD15B510556EF89B687E6B01701CBCE0B56159A90F7B2C6FC1039AA38449A596C087A62B2EE5A7C3799F5A601BFAF8B9C598834FA115AE010F71167FD41B5CCCC45146009752F380CDC56453E554CC779604F976FDC34E9F135261EABFFBF00AFC514F2699AA6A5ABA0638542891C6858C7F6C6C4A12E4CE2D89B50B04C33EF262EE8B0D9A7777D3C56C85B1BAFAC7052FDBAED24303C843110C1892381887EB351134798B9745BC229208B277C2C999570075903DEB530BF22F7906B75DB35C3B24B04751BF6ED41724058C70988952D86B48519264D25EC2B817894AC370BC081362C841EBAEFCD7625A67A48E3CA492D63BB9036A5B9A35D21470586510ACF76FCC683035B18C05ECA7D0702E0453AE00A8144779117D7C19CFFB568A3C0959193D689A6ADBAC13DF43907FD45FBF3313D49425D32AB9D81C6BD9B3486C3636E6E0015152C1CC78C809F3A3FFBC6F0628609B996980B3C43294C0E293940CD65A34BAC8FCF020CC611E3E2C8E52F5AE886B8D9480551D012885318E5E6C1ECEE0A3D75B342667C691D19F34FC7946E7A7047097F7938516CBB6C7F3ABDB85B15E302A5547198AC0B89E7C2BFBF74050970E8DC746CF16BEE6147076BB89C5124A89E070A785427CEA590301CEA7AB28ADA228EE7BC7FCC17074063358A706989C8D6C82677287905722CCA0A24FF91958C44A3044787EAB3599EAF241EADB932B06B151A1A02BA8B244E9262B96144302124DDDB5584ADF5FEF6BDE5872A551B6840E3A082A8AA6DFB7232A6813367038CC +sk = 85B01A4A587BAE308D39792B47F71997FC55FDC2746F881DDF7BC215145C56D399C6447ADA39230866384BB718ADA160A7349747867CF695CCCDB8A4F1FBB3E573ADE85CCF38924F36482BACB9798D481521A0CAE103CC9FC9675184490F281D3516CBEE910287758A4C374C0A4313F1C29251B1655522936DC329F540A1FD887F0C775823436DF736C367AA3013341E66854FB39A9EB90B23CAEC3E84690AD531141F39914A77A767A47B60F2868CF11311AAC9DA94C72E9624D21814CDC99C89A4B35E1C4C63CBB3EDEA06888162E180503CFC6616B24D270601D0D275C03109DD9486220B66D523A8111B4DE5B99D236586A09A4F77A240CACB4A737C770BC4915F55B609075EE68499654BAF90622647052A8369872A93114C80C60FCA1345E20114552119669A0D3A7188D3326017CE92112F0B715C26B40851683478E5C719C11088F00AAC577F5A8763D4A76E3CD00CD9061F021672847BA0D4785EA7B1B28FA364E64C4FB7F718D2352B1FC26858B6552419A4D8E1B22F8C7992E3B5373183D040948777C356D514FDFB2D0C5A636BC5416A799270E5C975C0A62F3A76FB134646B333B75582F7F2C51CF4BD37835C3FDB2CE1EA86306362F8216D27E40CA43A45EDC9554F08C604624659AA10EBD29E59A60F7BD66EEE447F4398ADDC73387579148BC4A26B6749C961926FD34296DB3044CB0D2D1312CA6A6755EC48C46865A36A6330A9AA5D39167C6062EF1A7C82CA5C0AC1B163B85E43C278312C4304AA127D66576E7218C2D0C850108076109919AC6931264DC2E919FF441875E607A97772FEB45F14881FBCB37B4D00B45F416CF56C9501C6598FF9425249740EACCA49D92E31D679A4F16C3CCB4384DB45E47621719C6C585CCC03355216D43625C08760254AE3CC4AEB1287CD5C3F0911641B05C7036C9BB360C72902325830BD25EACB5A88ABDC926E0F205EE857AA66C8C47E434D8BB4A6CFABBD8B681C427846F0E18A2762152B170063B489A3E6B8BA06B00F14A3F2E6AC00725E5724CB629B7A312B3A1221C9460917C07637B71050BB644A38A8192270C857D43EA9304495206BF62B1C4C11B04A817AAA996B2A266CEB8A80AA46674F16207B61BFB484AF461B6DAD9A9E6C22C56F81BB355A6705310E921239497809012159E78A8A249796C155A9DC7CBFE7384DD092239C29773F6610E536A77B879EEF054C5E539A381043C1B53D69566A96D1931B166C6F066CF0EC81E7492A200876D42007724AC916460A1266AB77A327EF1282479685BC43A2718C93A806C3DE3A0CB918C7A734CB04759341C5B1496679987AA5DB93B70F903A5F4024C3DA6FE8BB2EBC27182E1179611C61F8F6214069AB83C7165A46CAA74BBCE0897FABEA9B6B58CD34E7535B0297B4359960D23E4A498CF7610601D92AF2FB6163C4B2761615121B62A7900B08D61065C83A69D51253D48399FC665962AD36275ED3774F114A079F13B8BCE420B44638CFA6CE6018B58BEA422A8287A6680EB21C75456592E8B24CB6C26EC3D3C1DC4A19CA16888E9B7FEA1A863B7A0143307530B533269A8B692CB4522AC1AA27B01D38603FD009E1C02017BBB36DA2049A2C5045A63081266D7C6B065EF3308AFBA0CF3607B2C98D83F76F7C058262B55F7C0746B3C22437F00DE9D7CB69F40AFD60AE74B0506AFB96E30669F51C464A27B4F177666F92459B293DC208A0DAC5654A8058A8FABC2D1853009743A598BAB2C248068750F01227BE5A4F7C4C6948F9167E88894D43B5AA44687FF177DE837E2F0537F708A8F73A11FE6632DC285C9026BB23424AC2D1CBCE39AC6A0A7686F088D617B096436C9F773E7CC50CEA1C08DB20C2949A7878D18E7372CAE746B04558A8FBE97DF0B9A69090449A507E6E1C07A35680412033127037607B2F0502690B47BD300A84C041650DC748AC2C060260C933A0B81847243FB3267F3CC8DBEA4CEA40790F37CD0373A71EC00634BB3B3B087A82CCB1E1DAB77300156D8094A1D61D1F1BB3F977B749C938AB8092D71C93394856ED133075E2BBDD3CC0F27C2A2D34BC0F633F5E55C0A6C989B1E277EE9132F8779923EB2E22F78A1502BA5E55B6D53A05137867C10536E672C7336A3EA1F237263A6046F260ED3871F1D479BE589744361A0D819439779075CC47A5A33E18326615134D9F09B68B6873C6CCB682F6B75662CECDF5432C37189AE09FAF36735EA01C12F9CE64F4116D509C70E0072A242FF126710D178DAAE86539226C92D090D9B60DC63539F51B46DBF24CC8D54EDA255E0AC19B03D34F5A270B6FDA6D6408BCF1D2A46824B5290B8A26A8131402C9AEA052D0101759345F86A66A4D238A20C6531D792170C52DEED889AC3050FF87C659524337830C205622A989736B788092101933C0073C0B686106A9B88C17958A8711D272392AC448B01507634DF4A23846AA9D594C80BCA99F17505AC1793F2877BAB4F1B211D2985842795C4C1B9FC018DD15B510556EF89B687E6B01701CBCE0B56159A90F7B2C6FC1039AA38449A596C087A62B2EE5A7C3799F5A601BFAF8B9C598834FA115AE010F71167FD41B5CCCC45146009752F380CDC56453E554CC779604F976FDC34E9F135261EABFFBF00AFC514F2699AA6A5ABA0638542891C6858C7F6C6C4A12E4CE2D89B50B04C33EF262EE8B0D9A7777D3C56C85B1BAFAC7052FDBAED24303C843110C1892381887EB351134798B9745BC229208B277C2C999570075903DEB530BF22F7906B75DB35C3B24B04751BF6ED41724058C70988952D86B48519264D25EC2B817894AC370BC081362C841EBAEFCD7625A67A48E3CA492D63BB9036A5B9A35D21470586510ACF76FCC683035B18C05ECA7D0702E0453AE00A8144779117D7C19CFFB568A3C0959193D689A6ADBAC13DF43907FD45FBF3313D49425D32AB9D81C6BD9B3486C3636E6E0015152C1CC78C809F3A3FFBC6F0628609B996980B3C43294C0E293940CD65A34BAC8FCF020CC611E3E2C8E52F5AE886B8D9480551D012885318E5E6C1ECEE0A3D75B342667C691D19F34FC7946E7A7047097F7938516CBB6C7F3ABDB85B15E302A5547198AC0B89E7C2BFBF74050970E8DC746CF16BEE6147076BB89C5124A89E070A785427CEA590301CEA7AB28ADA228EE7BC7FCC17074063358A706989C8D6C82677287905722CCA0A24FF91958C44A3044787EAB3599EAF241EADB932B06B151A1A02BA8B244E9262B96144302124DDDB5584ADF5FEF6BDE5872A551B6840E3A082A8AA6DFB7232A6813367038CCB30CEDC4316B63D75B641FBAD2F33241A3FC47AB8B3EE1A3ED597E5B04F77C68E6C45C7FC62329B13C8D29844405DB8FF6860DE474BF727ECD19E54E6E1A141B +ct = 3EE8CAA61756787B200AD5EC90EF835F55359F55AE04C8CAE6D2FA90CC2E32ED38349B52E4A6BA4ABA658A972B95EB04BDF9D9F007FF1DB61055B41052095687D07626DDAE5F9C2D2E7931C6C45250F5604EBD6D6C4044D18C0A193C9CFDCB212393510F1E966377F0BF34DA89597CDA14FAE339D2A82D3415C7652A4B95945AD0BCB12992472766699FD0F5876F728681AF0EE76D6FD4E45563DCD52AA7C2E5E783CF2A6DEAFEEC004C87EE47B2B3DCC98D59486341ED9B282AF0705B69EC8D498517D0CCC5847D6431677A8FB7B5DF6BEA0E5821CAF8D14A81A0AC674089953179A3DD7C0198A9CE8732663261530C138EA09466E68F2A485A492D5875736D590C6BF0AF9238752EA3949593CD15AECDCD783DA5934BA69B70E1D9AE7C56B8885A3AB409098C17A4820CE2BFC365644A8180735EF122F41ECDB5387E87CE5EAFA8AB1414D48C7B57F52F3338AE5E5758E83E560178DE13676A49D69EA415622CED3C09A42F354B3E48205937A660EF1F9053CA4A1FDAB50FB5E83898B6E5FC8A11D6DDC1B06A29EAC43A5F47F2F70FCB085BCDA559BB3CA3B035E119970ECA86B5F373ADF2BA9CF6B5755445FDB574A40650D7E75D7E36F90CD7C96343446A87882AD03464E8ED40797EDCD84DF74FCFAA83584E8A75774DEA67C74F8C5CAFC18F3BE9B2C11EE6EC6E89CE7452D0A98C64C8F6DFA6198D9CA561E86A1631BA17A6FD6D4181186ACDC327E71FB300A9397DB532B88823D8D310ABE4FDABDFEBA7521C939BBF7413BB5199AB40DAE9A8B7EDDCE3C38293D30D6A5F18FFCB12EA2E8ECF1A942E20F8310825BC6960CDD7041BD9186F723743C8C98432536EF35E69F0E7D8E0A0E05F3E40199EB1F2F7A41B18B0E7F2245FC7BBA28B83A3A4F0CEC6CB919D0CB7B66745200FC4074C510795982665FC880D3F6E3820D4CE2333C717D94DDD36C4341F01819002E21C41B12EC7E1184A1F7E3E6FCA6A18971B1C438C773A7124DE94320443C7D80C727237890CB13825436CF0ECE3FCB867A86F8C2BECD314E2274B9BDFEB3971EBE1730BD44E26B587C464E86404B8A18E35C6FC427C7160C4079C394D11CC93F473153967A394D126DDB344441AE12729464DA5E813E5461439B6FB0925A97B726A2D724850829EC1D6E1F3881199CE47E93101D99439304B00FAB1E6875EC82E4D8766912505121628AB17BF0A5094649E8D5803A59CB35999D8E9A2A7D14646A26F9DB4BF0FDAE3527CAE7CD04DD9EC949DDBB122616881AFCAD30959D5022DEFB1A2F86903CC0B1A63DC1D21D477319DF95E7B39322B69F8E3260B0F52D1EBFE21D0754A2076AD4BE30E2E47165EA3EEB054465AA4B5DCDEE133EC90A4D9C9326F153FCDE75D9E3A3351041D13EF0B9117098F2E266EDF666A3F333D8FD17C514A4A351CD2CFCB044FBF406E1DD5C99809731B988458055EB888E00665F3B2EFC0E4E16F81AAA6F28F1C87495B078B236971CFF1148C71C374D52AC1C5E68CEF548A30B0D6223E995D7216F6604409101D7B +ss = BBC0B0A4782E2BB9EB19257F5B80338D1E239AA6A08710CBCBA0ADB974D7DC64 + +count = 53 +seed = D71729DCBB27D7CB39E9E905025D3E55C8602EFBCC483C9B866EBF82326157833169243C14550AD728BD1470F39C642E +pk = 9E686B49D538CF32A05AB82372F7525DF40085B3413F078226B97C234B815EC615B2683F1D9AB32DC0314C6CCE6E9620C8E73B1DC85BED5205CDE5A44F40427865A62356CE44751C7278A3B236BC2D208C7B383129661810A6A2962496D058CA4875AD234C2DF951612E665984BBAE791C279EE835B105202D4751F1A330DC6B0BDCC38FDD6458B0CA7A9BDA026BD64E80868B87B58CCF2A37CA94CB06279EE77A6731E847487142561863B5F38C5AA4C0158AC28E95012C10A8B8E99EF7DB12C05009311A74791C6C8B355E4A861DD3CB6FA085884D7A7E8CD270F656CE29F9BF3B91B798032C16B00F8CD722A1CABFBB25C3002324C56B66DF87182504581A76297EE1181CF05A6D89698CC94021B16574264435F2CB137A7A667A4548C96F835CBBCF27805AE37448674AA998818CF26D15A63689777A9B98219AC3B9ECF84203826EAE294800F5A07FFA886CC86E7D095F42C471C121A69A1972A7906ABBD31003F6C8C0D07EF481B55FE185811084D9A472CCBCC586B6A9A6F24D269AB36126A3F0381B29532D027C2D5E21CC5B9C6EC8303E4B388A6B7216B3E581C0566558107C8B94C599F09C2ECC4B7A824FA3DB9A29722317D5BC5D43827F4BC6D3A91F65DCA56BC26DE9D40BF2F69263CB010A9A24A749C931631EC2D13EA4D5136AA8A97EE019AE1291EA34B0807886FFA323AD3B0F83F82E5D9A2D748945A3CA34B9535D0460A6F734BBEEB66A4E3C257BB079F5D80F6DEB0DBEC130FE4A182FDB16291403F37A191C381723965C3FD90D9F2B67C36CA3AC141030AB516A01453532AA06B73A91B5BA7D1A308E286FCED38F2858801022A453320A857B564179C55F0436B25CB191865DE69877B47041D9D0C2C9BC42CA513F207A72EA9A5CC48B573FB402BA8B5AE6D73F2E0B044B8CA67C1031577099B9975FAD7103C7F6BF80099BB51138D8A7AF7BB509B761A9C6407DD9826B7FF87879098248D779D6F26AA0215084F286AC77C50849AD19F29A32B07EF517000FF71799D6BE1D177508BB969D9479C6C037A5A18BF4302720E240DFA603B7F8745144906BB88522505B19336BEE5572188853A47B4F8ED8A040B251307299BE642E086317E1504784990F2149CB2D89B1A8542E4A19CFAFD57ADE9A234545142AFCB3E544B49DF75B0CC78F5AAB935752746EE7A7F7936777330A66C1063C50BECC4286A3DB4AA66CB602553849B5BAAF83965AC6BDB19A9E5DB8251DE0267EA3C0EEC342B51505469AA7FE936A5829463892645438A3A182859DA136E033B926695421A1891610816E136DBBE36ADC08CF00E4B44649410B2A11EF254144C27787E54CC5A533E8E54F11EA94F7E9C2009D25A6248321F04A53C31787C12ACA9CC78FCC06B161701852215BC6C29D1779F5C183152CACB583A90399746F75C5BB337F1B580B9029B112579884F792EA5A52187A109F547CDA89B7FBBA90C66065A33423DA4515D13BB5FFA074AADB0C55119065A51239511BB33288F994B121DA8913992B979A59BBD64036968621E76AE336096FD6125CDAC4F767A883E6448B078DC04B1F2B7AA49A1180C0F3BC65D2A93458291982652063419A9CB7F1042C38F483C4A90E17ACA78E9FE10B44687F9AA606CAE8888E4C21AB0F7B85EB3D3A2A3D2FE8ED883D1DE0 +sk = CE732E28B21F42F2BBD1B049E6B80264B218B581CBAB8C9186E325F7617895E6320FE5C697FC3B82546681B3CA5F4A52F1F7501B652F86D35CCB9756E869795C166362FAC89C7B5AD41C7C74C596E2A7458E419CD10C10C890C94FD3564AA25F1EC3A3282607D8B1864022CDCCEBB1B1E48961207E29264A9CA86C94B71D5382C9C6B8004C818F51A52006706285BB3281618A157C80C2C00905C33316516C17F04460124FD79A1C330417984220334C84D96A66FC8A5556814C58F7826EE86F17319DA3F504F0124C3F06CA50792C1E1800FEEA8A8E8805A54BCB90C52ECA144677327F5058CCA151617F443DABBA304B353F4A5CAABF0C179A772582711C033B3F3C1225F191B887D8294FD18914850DE6B194B91C250374963BDC7215B07CDAA8001372A21F0C3845979386C27949E0BBEDC0B004258866A01EC5CB82FC751BA2F4510E514A3FA09B6AEA7E5E45762076B81D781C2BA91DD6F40CF13C91E947A7D7ABC2A2AA91A1404D87462B42AA71EB15209A9B0D4990C2265B051163CD2BA8319576758237482F500F7E94B3FF099616225737A766C10B6AEB213B5B073EFF93C3AC91BBF2B93FF47C84D7CA2E794990E2DB4A7E9AB19CB50CD522427E6A935CE3976490B21792CCE5E4B971668C4793CA4954B477703730411DF1F5AD2557CAEF78C914D0C223D836C407936EC58825F3B2A1925A5164B097A94A13D8AD3A27BF1FFB0C08C72B92215CB1B67C7D2C4A7BC7A6A8A054D2A34DE69C78195BB149E4B4CEBAB78F41612DB19540385F2F74757C662C2DA3C7B03A34A9524E2AB90F5CC21FC0D2AD84BB996E6C73426770FFC1C9942CC22AA2934D97A66037A18760C51B0236CA1B1880A2286EE5241FFC220A4C6EC0E296090874B3CA751DD701086A15F419C67EB4514744047D7848980C036107586D36818E74AD98989C8C02AFAB4134EE0B545ED707876A613FFA10BE7C3F10B758B215827ADA9FA1C83B129C6BDC5B621D3A5DA7F396D6E29B184A38D8091B6A2C288EE2CAE833A68A3CB6B30BAC5AD7567C788D8C803A7B622FBD8A253B274B93593115B5B7A5282EAF93706C88C178BAB897B7198C23B844219852A60410E8AFA85C902EDCB9A5E87A31CA84AC6B89A75830566062BC159CB129277AF0645D5817C8822E384040F1621D66D41643897DF21C1013CB1B426A703F120F21C780C67BB011FB3E8CB746C0B14C9F847DC1235F72E6BDFDA1C55BD26E377395C4B17B764A41E0F7312782BF71820DD379BEFE58901A011FADAC1EFAE549E5933AA9F9C64CE2273C486B56251674D56212C0AD7637854C7B8447A135FB960FFC435AC7553DFE935CAA98BF32186817B5ADB42375E96C30D0A96DF39658EDE95912946813CB75CC32B395AA73A916514533857B4C3405FC32C2946CF4F4251B2091B6CBB00CE296459C45E558B5048B79CC4CB8AA01BD7E82320637A62E2038D5B3C0593B42D32A38BE8312AB022EBB496A5FC4A991A1BAEB660A23988FBA329A79DC7144D20B5246466F25AF4AD971014970EBE2B36316B86B3585F6B0753711A0BF3952C688B4CF6C8A24C0964CDC1F5C1C34B3C28359BA232840063AC30BDDA83F0611042FD8B7C2BB439E686B49D538CF32A05AB82372F7525DF40085B3413F078226B97C234B815EC615B2683F1D9AB32DC0314C6CCE6E9620C8E73B1DC85BED5205CDE5A44F40427865A62356CE44751C7278A3B236BC2D208C7B383129661810A6A2962496D058CA4875AD234C2DF951612E665984BBAE791C279EE835B105202D4751F1A330DC6B0BDCC38FDD6458B0CA7A9BDA026BD64E80868B87B58CCF2A37CA94CB06279EE77A6731E847487142561863B5F38C5AA4C0158AC28E95012C10A8B8E99EF7DB12C05009311A74791C6C8B355E4A861DD3CB6FA085884D7A7E8CD270F656CE29F9BF3B91B798032C16B00F8CD722A1CABFBB25C3002324C56B66DF87182504581A76297EE1181CF05A6D89698CC94021B16574264435F2CB137A7A667A4548C96F835CBBCF27805AE37448674AA998818CF26D15A63689777A9B98219AC3B9ECF84203826EAE294800F5A07FFA886CC86E7D095F42C471C121A69A1972A7906ABBD31003F6C8C0D07EF481B55FE185811084D9A472CCBCC586B6A9A6F24D269AB36126A3F0381B29532D027C2D5E21CC5B9C6EC8303E4B388A6B7216B3E581C0566558107C8B94C599F09C2ECC4B7A824FA3DB9A29722317D5BC5D43827F4BC6D3A91F65DCA56BC26DE9D40BF2F69263CB010A9A24A749C931631EC2D13EA4D5136AA8A97EE019AE1291EA34B0807886FFA323AD3B0F83F82E5D9A2D748945A3CA34B9535D0460A6F734BBEEB66A4E3C257BB079F5D80F6DEB0DBEC130FE4A182FDB16291403F37A191C381723965C3FD90D9F2B67C36CA3AC141030AB516A01453532AA06B73A91B5BA7D1A308E286FCED38F2858801022A453320A857B564179C55F0436B25CB191865DE69877B47041D9D0C2C9BC42CA513F207A72EA9A5CC48B573FB402BA8B5AE6D73F2E0B044B8CA67C1031577099B9975FAD7103C7F6BF80099BB51138D8A7AF7BB509B761A9C6407DD9826B7FF87879098248D779D6F26AA0215084F286AC77C50849AD19F29A32B07EF517000FF71799D6BE1D177508BB969D9479C6C037A5A18BF4302720E240DFA603B7F8745144906BB88522505B19336BEE5572188853A47B4F8ED8A040B251307299BE642E086317E1504784990F2149CB2D89B1A8542E4A19CFAFD57ADE9A234545142AFCB3E544B49DF75B0CC78F5AAB935752746EE7A7F7936777330A66C1063C50BECC4286A3DB4AA66CB602553849B5BAAF83965AC6BDB19A9E5DB8251DE0267EA3C0EEC342B51505469AA7FE936A5829463892645438A3A182859DA136E033B926695421A1891610816E136DBBE36ADC08CF00E4B44649410B2A11EF254144C27787E54CC5A533E8E54F11EA94F7E9C2009D25A6248321F04A53C31787C12ACA9CC78FCC06B161701852215BC6C29D1779F5C183152CACB583A90399746F75C5BB337F1B580B9029B112579884F792EA5A52187A109F547CDA89B7FBBA90C66065A33423DA4515D13BB5FFA074AADB0C55119065A51239511BB33288F994B121DA8913992B979A59BBD64036968621E76AE336096FD6125CDAC4F767A883E6448B078DC04B1F2B7AA49A1180C0F3BC65D2A93458291982652063419A9CB7F1042C38F483C4A90E17ACA78E9FE10B44687F9AA606CAE8888E4C21AB0F7B85EB3D3A2A3D2FE8ED883D1DE0EE044DBDF6787FF038DBF9C133557169C62FC1CE2580739369AA87DF00B496485A3407F591791A5DB4578B5972093A95BEC3B8E70C1D542C9B5C9789729F8922 +ct = AB24A548B90EF59F7595D625B44E8A9B3CB8EE09A1AC6213B709B1CC1833B6D3E3ED145524647D33C527F0E7052DF7FD94C2B1EBD99577600DDD3266100218ACE8C5AEFBBBB3C045C5440AED44856616C5A4456D28A304D3D00B51EA20ABFF1E0A1C671BADE1E8BE2E3BB9A41F1C73612803DB0FF713B5C717B9BB751F750C1FF6310DDC3B25A012F3902A6BEF8F2E7C3B0EFEB6C8B267E1BC9152D48F53591CBBB2010E5D40E778368B9E7E8ABBF52BCFD5B61E4B2E84E8CEDE9FE87CC14DF8890FBA78466246888DD36D71742050C8271261BED8199B5D4C7C341F5E34673E47E58F42AA3F9D28CCDB1DE32A7C6E6AE11C346DDC6D7A9B4E1384E85A466711B2F5A5FFCEB0D00C4F10C8B656A878CDAC8D1738B73E003DC44FAD15AA4E30819C98DE28883E02E501BECCCBA97019D18EBB0565CDE8784F0210A9E6199C55A60AE87559A6104662CB9631BFDFD6E3A7F9FE3D7D542C1D01520984455947052C0C9E8C985C0F247CE9FB8C0D8F2E5EBE09BC6D06D1A1EEB2C97CAD3F557CFD8723D2C3D036F1EC38CDBAD6006A6B0002DEFC9E0599D9950157324A3045DC616786ADE0A56E6378793938485C69411EB7AD38267C02E44DD902E8C242C139DCC336997DA91D1659C4582ED0021B4E14A4E77DEE7803B927B8C12383911461794718355C74F366968EE72289A8AEBCD3BF800F9E91C83F22F6D59D372134CE5154E29385CA973E9BBA04CB674F8C87D4DC29386144F577D6B177791CB28DE72CC33226B9003E42EB040C635C80305996A303F8AA82B6DA9BEA52FD11618F9D04B00D5A1540D836829FB363AD62F63ACF4EE550B09F665A62CBA6AFAA9509E5AB22C02ACC0470B144A110A1D497EE5D2A764CAD986F7F96F3BBB4156C7713784D5D7F343F9D4FBB9E7F75114E5C60EFA58DB8499CEB533B4B9E50522364BA540AA3071C80E5FD3139C64DB8279058BDAA72E1515E483609B537A5D524A766E2914F45875D08F7BE6CDBCC08C9357FF06F897FC3A17DB8341C8E2B1D63DE212E512A51D60129A1375FC9261FBF5D8CEC9252331D75F7A4D180219EA5A6BC18E8A612042639A8B33879F2F8073C23A5B8A983B131193B734B66547426541ADABE13990035BC87A780141972ABD4F98559A6D92B9A605D7AD4F00B8D96F3A4EEA619D9F45D4C2F834A00064CDF2C58B51A9ADB542CF8051B73455BE9881E5097CA9D6F81B0240012A4E55369A056DE74C277B5A0915417A5EBA7A572A9B81121B4057F9A50C94191A446844225860096BFFEDF8B7AEA605F193CD60CCD0A2697D8F8DEA9262A3C5D89E8E94E2721A359364FE1B08245EBD344040746665FA6EC5D2B9D113EEAB5CC42450B5330A232D928FE674D53166416E0E8179100E421341DDFAC2E0E5A80FE51A6C6E8F044DF8EB5596809774CCAC4C255710EFDFF2D4614CEB463BCCF6013A74E1F22760A68AD214A1F5B6952E1935DBCCE1811EE19C2CDF8FCD3D38F7B6C6533DD9DE19B67D917BAE686BD9A9A30FEF043FC8C9055AC8B6DCF +ss = 3EEA7528610DAE3539F5F81EFD9BEEDDA4D45EF0B9FF91D3D4F3561B4981D286 + +count = 54 +seed = A7C2C8EDB3601396BEB2DF0657EC82FD5780A2723581A9E03DEE1CDB018440439BB1142CAB0487C5D136E9AF46338AB7 +pk = ECD4C65CEC93A9B26EFE3B667405482E3AA37D48AEEA67C1698008DA4B68683697DFD34FD72A6F39EC0AA0806EA5C59B4554182F6034B9C5B7CB438E21A14774D58AFAB0099E478A4BA8568E192C71DB7C208B7115D29BF649BFB3D23C2D70599682C549EA28DC16597A43AA6E65C77C432F554B067A64AD62AB71492A1AAD6045677C74E3E8773FB8665259ABD821BF07D2157C09199435BF41992628534DAAE814EE4AC64AD89FFA1547442B8CF6F54664C550DA5CAD0D828174805DA5D66F01E584789992BF0A4036D770B6C5B3E21B78F5DA2467DB42479B478F0570D48071F028110F555857E4ACB555B9C7D5B5D913B75D5B393BD4B9B2C12D34027AEDE4A22FD80ABE26A9C93C938C6B1348708D1BDA7FE6C55BF66981695487AB81362F50B7376C6A52CC39769B921F575E5D7A9666ABC2DD9459A5595E3AD631A0C638C3A2181B649704748141394053849B4F996F9B8A68567B73227B8C9E4588EE4A13B75379D2776A7510ABB21941C2B36357E8248686A5D973B946B82E40802290651A073636B367671C9C001AC91AD03B9D6E83721AE1247CC188FC05B0249571656A276EEA09B6D3376C208335618B1FC2748655CEEF805C39165D0CE9BFED062ADD0C0A50E43167C80E5301A076C9CDC1F13852A5987AA3CEF5E5864A706B3DE947D2AC8E8CEA0C3F83745BF3185BAC9FD0162510F70BD20129D7C5215026114C4B5EF044A8A29A3F01FA02A0A3CE928A65CE8CB566848110994E7CE20EA5C30304D6CCBC7477BB78B3EC527758B7828B836DBB2742AF6095A0BB882C2C9D8E162618029C1FB5AAF4B963FCC4A35AB78B0D9942FBDB53D4684CA85218DC27678719CA0D4A8CD8E9BCAEB944B7C0670AB171927C56C35034AD92BB3E6714D0F7C137C2B9A1FC5B72367C35C55D5FEB93D1274B88BC558158C5D478C34B68240AD193E95C0311AA501B3C1C44B20AB6CA2D2DE1C56B65618CA53F0E91550851BFBC289206D1406B27047FE610EC01A86E8BA94516AA926B99879836DBB27A7056C4D54BBD19A44096D1B3F3E9956CAC29E7AB95F175B9D9A0078DA633F10A6FEE899F400533F0F77102DA19FB02610003674828758E23B5EC724C6829B95B8A6750F1988F431E7537CA9D05701AC8AE2034688082C5C20A122C6349DB27AB958504FDB4C527B223B2420DB7246A4A69B58085A3C1E6997DB19FE17A2BC23BCD60B924CC393EBFCA864DA054BA38BB733B00FDF57AB147B922278FB132C5F5774BFE368DC2B66583790D30D282A248B7E9D43A562BA1892A985B75A7AFF961762A05FB35B9420905BB8C4DE00A3846E38CA7D71411E89F9E2C9489C597834C7A5315080130648F5347639184F315BFF2D580FFD0227C9185ADF9203ED50BAA43A9174A7AE9B5655F2245A15C30F877BB7DCB2EC184138792738113895A980DCA31BAF6B5261E10A1D98AB660C066BCB05AC25429775C3BD1550D4A823FC96442CB2770751C812CE67613E48BFBE66A0FDBA909317513220EBC3C55FA1364F318812199009AF24F9F70C36F81B22B20BE53208F0DC44DD3B6ABB7236E1FD37C53FB1EE8C86810863A86B0029A58955DC73EC8A436112B5C3A75CEEC356BBD91355E4C3941A07E45AD3ECB9AE67E7527F70F6E07A757BD112947074D5120A1F2A1 +sk = F76C7D8002B7CA65BFE6A59AA3645A8E51AFE5FB80145241134CC072A60AD4B72D80C2BCBE1630EEDA661CB62E01B0798203A1A287C4B8F725DD422BEEE6627C864149EBABD84280739193067A2348F2861DBB7F1A0914BA2BB3AC6C80D5CA1F483C8B86C1CF5A2C3BF8F6728555799381A1B1F3CD02E445CBE798AC0361E15335380051294667B9149F38D85A1839AE43D331BF14091C4ACCBB24C8E8105A9D1185BA880B7E13CD3563AA235B899E7509525280A37162C043B089D5A0BD48B225EBB2D0538F49C8AC3C3B0677D8093CF70B3404016B4686D653CE4715A85953171BB937F5A1916271AD53318E8155269DBA4D0A520D057963E70CC01E680FE8408D03D3275C95A2C528190924749BC32DC31B21B58C6F5E4B59C157CAB7653C0D146DEC9A3F94E241993B09BD62446F35AD7772279E116464FB316DB8449A3AB7525B3E89B12B54F14FB19057C39510B072894831A5747782D404487926AD756B1BF81CB416D94265DCACEA475FCDAA727D0B5F01B376250B123F717FBB0B1976B7704FE5AE5AC10CD17B87FA8BBD3D824D3B91B567B5C20243677D741AE2CB1C1D049A842B7F9DA9CECE8931851BB35776CAED97C27D395108E42661AA60CC181ABB2774C67773FB29B445F3554D386C87D489D895A43EF268AF0C81F6065E57E744F719120323B013D35801E26BAC2700968566512106F5161EE8528372D45A42B41022239FB0B3CD23C4251927B355719A1F2A0689A4ABC508660DBC282706B765CA4BC1887FD064CF8285B1155863E15B112BCBB1962255B362CE8FA4C51C97CFCEA7004DAA9F746766F2F5487C93B99EE9825CB78AB0A98BF6863A083758E9279245E495AD0A5B86724C1ADC3E67D756C1C8647FB4BA32B75A6DA3A05A870FC1E12CD279666CA046E064A74625530E742EFC72C1D5F959C9D256389C4C63609FA11A8FB5E70E1E2256C8164D80C69FB8F4008A647AF7F3AD960265F55CB786E8726B65689A6A751FE045B7D45AECF50605D135A44793AD2C6BBA5A59D293528BD94D65F54BAE4798EBA5B26DE8B225728EB8836AD1F373F66A2134B8B429A8457B600C5A3274B0157F66F091EC88436D5667802A15749B4C9C499A36C58FC5A7CCC10A604ED00DE74BBF433502C02AB0ED949F5DA8B9EFB83C4A2395E49413A7030F4F95901E8AA2716A3EBB09AAF61C9384586021301DE0F8C085421460A10FDD176C68B4C115C91DAC04121924213855AC22E8C98E3643C3D7C3B6C6C4CA964308510525C5AA00C32AD9BA258BC44A9F521A2873BEDAF7C56BFC26A320C0FE95CFBE12C0038C1A65B62C18C37E61A2B9194C9EC1DB8B9FD036C7C3A620B5C661D8AB0B46A6CD3391E53218E40CBDB082C2207630C2715541B10E3C395BF2A5A15AE8B506880DDE937432ECB150F9B3C136881058A750024D9B247232B7289BD07462C051B7BA599C985C6EB08C7AC22135C99E85930113554C59AC06AE298D5935658F513644B01132B4C1AB84677E342A1F4A8A9D5C6A44659805CC8898E563823C8286D54A1CB4B8DB866A8F5C74F782784E4B6FBAD380C5131FCAE11D4EC89DF82490B4F1BABD4673D7417B9CF04513718F2CD0CFC29707145034ECD4C65CEC93A9B26EFE3B667405482E3AA37D48AEEA67C1698008DA4B68683697DFD34FD72A6F39EC0AA0806EA5C59B4554182F6034B9C5B7CB438E21A14774D58AFAB0099E478A4BA8568E192C71DB7C208B7115D29BF649BFB3D23C2D70599682C549EA28DC16597A43AA6E65C77C432F554B067A64AD62AB71492A1AAD6045677C74E3E8773FB8665259ABD821BF07D2157C09199435BF41992628534DAAE814EE4AC64AD89FFA1547442B8CF6F54664C550DA5CAD0D828174805DA5D66F01E584789992BF0A4036D770B6C5B3E21B78F5DA2467DB42479B478F0570D48071F028110F555857E4ACB555B9C7D5B5D913B75D5B393BD4B9B2C12D34027AEDE4A22FD80ABE26A9C93C938C6B1348708D1BDA7FE6C55BF66981695487AB81362F50B7376C6A52CC39769B921F575E5D7A9666ABC2DD9459A5595E3AD631A0C638C3A2181B649704748141394053849B4F996F9B8A68567B73227B8C9E4588EE4A13B75379D2776A7510ABB21941C2B36357E8248686A5D973B946B82E40802290651A073636B367671C9C001AC91AD03B9D6E83721AE1247CC188FC05B0249571656A276EEA09B6D3376C208335618B1FC2748655CEEF805C39165D0CE9BFED062ADD0C0A50E43167C80E5301A076C9CDC1F13852A5987AA3CEF5E5864A706B3DE947D2AC8E8CEA0C3F83745BF3185BAC9FD0162510F70BD20129D7C5215026114C4B5EF044A8A29A3F01FA02A0A3CE928A65CE8CB566848110994E7CE20EA5C30304D6CCBC7477BB78B3EC527758B7828B836DBB2742AF6095A0BB882C2C9D8E162618029C1FB5AAF4B963FCC4A35AB78B0D9942FBDB53D4684CA85218DC27678719CA0D4A8CD8E9BCAEB944B7C0670AB171927C56C35034AD92BB3E6714D0F7C137C2B9A1FC5B72367C35C55D5FEB93D1274B88BC558158C5D478C34B68240AD193E95C0311AA501B3C1C44B20AB6CA2D2DE1C56B65618CA53F0E91550851BFBC289206D1406B27047FE610EC01A86E8BA94516AA926B99879836DBB27A7056C4D54BBD19A44096D1B3F3E9956CAC29E7AB95F175B9D9A0078DA633F10A6FEE899F400533F0F77102DA19FB02610003674828758E23B5EC724C6829B95B8A6750F1988F431E7537CA9D05701AC8AE2034688082C5C20A122C6349DB27AB958504FDB4C527B223B2420DB7246A4A69B58085A3C1E6997DB19FE17A2BC23BCD60B924CC393EBFCA864DA054BA38BB733B00FDF57AB147B922278FB132C5F5774BFE368DC2B66583790D30D282A248B7E9D43A562BA1892A985B75A7AFF961762A05FB35B9420905BB8C4DE00A3846E38CA7D71411E89F9E2C9489C597834C7A5315080130648F5347639184F315BFF2D580FFD0227C9185ADF9203ED50BAA43A9174A7AE9B5655F2245A15C30F877BB7DCB2EC184138792738113895A980DCA31BAF6B5261E10A1D98AB660C066BCB05AC25429775C3BD1550D4A823FC96442CB2770751C812CE67613E48BFBE66A0FDBA909317513220EBC3C55FA1364F318812199009AF24F9F70C36F81B22B20BE53208F0DC44DD3B6ABB7236E1FD37C53FB1EE8C86810863A86B0029A58955DC73EC8A436112B5C3A75CEEC356BBD91355E4C3941A07E45AD3ECB9AE67E7527F70F6E07A757BD112947074D5120A1F2A1E965AC6995D525E324E8252D8E2C2DA909A29B24BACA8B68DAA5122CB539A474B9402BF02481CE4B27A52E87FEB92C4399C7F2988D40E942E7496AD15AD2AA88 +ct = 9D503732B866FD6CC6482F203FE35AECECBDD76BA5AF3887AF66020597E9ED58EEE4577F0A07623C03124574A8F263775C83DF468839D2E5F17D5B21E811E0A80B0CBFEA3E370762AC0C47E741C234B5A24E803A60C532B92B658D5E46244F96224B989E6EC2BE14FD13A384EF64977D370B06040AD74D11EF41D126BB07CBBB5CB3CC1BE087F8FD7F61B8B8935F515207A26EBDB29DCAD93ED2159926093097F402EB6A2D4DCC96B7F354D3B46C514CAD7230D0A03AE48FF492CEA84B35F5086A2BAB86E37BE1080950674FACDAE004CE59858E2A2D9DF1D83A3E8719D057848A081BC262559DE7F0D30FD2193788CABA528CD3145465F3F1703D1955F87A896F114213752F389170D6B9E3B45BC4D8CC25A09D35D8C182766A97419302ACB59B18959F68CBE30572CD507D32280B9B3DD03E08F7F912DCCDF6465541FC1776B76E884EA1A1F0B6E7B44326F1C984972AB1FD82D1A095D3F8703F26D15A8FDE507E99100FC4204322D4DAAF774CA4CE9A470D560AFD097745AAE98402B1E8E5C0485620F2996E4369EA9B7D91D66A29AB0E8980AB477E6732F267EFAB52F24D1D19119B82FB1FFE9DBF3D77A0CC9CE84729CCDCD5B27D4321B23B1E9FC40F443AD753C0B876507BBA1DD7755914FD861E3006504D7E406BD8FE652E226D3B21CB7510F570CD1EB1BFE43555886E29AE1389C0791ADBC762EFFCA02553D7026A3820DC6C0DE0808FCED176BC010B0B91DEDE1A6770833AFCFE359E4228D04920870E20DD9892D0A5340C93C2EE86115244A43635DB46D28AE4982C3CB8705C250026C3A18DA5DC2DE6320DC4A4E40962FF78AA98B1C17F2BD49495663282E019982423DB6388C972B4540D7F4C26FC3037356011C090EB5AED0706336AABF252B879799BDC529CF75D748413BC2A499354D0CA2E47957E3F032C1C9B6F398C80468A03CBE6E1857C1EC3E6C046BCCEB9D8417FD3E1C7BCCA9A0ADDCACDA0BCA99966994F6234380B5E58163AF74255D6A9FF8397493DD2987633A4A6C5BA61B00FF125C06A1615F993F660EB8CE966551586BB30794CCDEC762C67843A68A84EE658E629AED04191C8BCE6DBD7A112FFBC6A483AF6D0A3F297340E6E9EBDE6D73F39F4DEB96FE0326A8D25CA7335938F502BA77EC126D5A2CA584C838B2166AA0DD926F645F7B4570AFBBC7345F4FFAC34588B54776A35F24474FF2AE8BE60D7A31A415FA32F194875A0D2792DF994E054378BF15D8502F8E2887DACBA3FBC3FD17C7657DE1D099F4FFA8250CCC9C6EFF5C517B90B7C7035017732AA964A4A2941557391836624F8AFE0D5482143B009A633092829612E6024254F1EF8BBB15B5A6B3644C9142B148C4C7337EFDED7A5246674E2739E5823C785A16EF4254B97F86EC3EBBC28B4A1161A66CDC07D3FF5A3FD1DE52F00AC6EE6258821854943FC73B357B27FD154EAD141B187F3B8A7AF61C80D3F324C341F92DCF9F4962C6EB1AE5B0F0711FCCB3E5AEB439E8A7C8F20A580AE50C1EFB1F27923ABCC8F2DF1DF +ss = C5E2F0C1EE4F13FA8FBF2D09A78B04A5E2069AAFA978598F96424ACBCF41AD44 + +count = 55 +seed = 467F6158CB86B724039FF18C47950AE5C49170163C910FC9A9B30141F86E9C06EBCEC91497BCD156D95758C9F0C6EF91 +pk = 8C5785417B65B2E4235CC67947D7B214627D326AC1ADEBCCC3A64017E004499A8887C4A649E443E74720F0B1BEDD52B1A8EB78B3AC2D5516B7A3233BE9448575209675F4A813120422684191D6771EF2B44D92B2CA3BCDD5F5AC20A63EFC237FF9D99BB4F5094AFC187EBBAD39B8B9CE75902190741640BABF653886162645A84262A24B1885C626403F23136707816ACF28950BF181742C98347022CD5941B7B69E21B5CFC2B4C6C5F301BD32A2E7882A1E1A9CD94743FC86AF0CD26B51B3512003CBE8628D299663DA40BAEF443677033DA8B8C21E0A0F12FB93F4D63809375FC877866394A1A5409E2F13B3E5011A2A5877732415281B7B19991E6EE0A470561B6BCB46D87B4086F18CA29C5FDCD622F4315DCFB11DB2C6CF136B7B0A870AE89669AD1011477899B8F679E5C9A8413959CA0CBFB3B54AD58C98B94760058C6F1F499435118D9143723DA05BA8F13E5CCA1813F91CE01092917BA1D798BA3481121026713BE1889B58375E5C4F9BB0BCC5FA808E2C00A36CA575C68B1D232778F71BF0927C5F2092D0629588826D02005DB9BC0DCE456E2B928EC9FB9C7A138E7B1065A2B660C287C3D062144CCA71E5C1294442073AD48AFC555767F1BEBAF550D520659496AF9237A22C27670A080F8A461778AA42C6CA9A954C28A658C73847A586FC3EF266562240ACB6978E026152B1149B8D426AEFE37BBD263A00DA05DF48375E53BACF9C4C11D4BBB055666AD008736B9C323A9974661215495E032AAEC611AF0E6A9244C2BFB6F3195D5121EDC3C0719C3FC1365C2BFC70D5C6140E6A383714A0931CCDFF946ADCF73993AA113C90AEF03374E251ACE73770A350428EC32A9DDB4AED8832526968412863966228644B9AF9842C2E967957F10D350A3499876F25D157BB2812501C8DC95365F83BC64B6340FA6CB4C2816B31824D028726DE0112AA9CCC9E0B6869099D310AA6E5B79609487E7A20A56BA75C45986F92F5A4D1672F3D99927A1193BA15BF5DF2586E823292593C49321BAC9044E4844A7A6BCB08309E2520B6ACF20E73BA5B05931E29BA43B2000A48C72A5DF05EF715CD8865CF16A835A83C271402071D1068A426839CA424CB666545664EA5E7461AF147B9D84583285EA1A05A02732031BB0BA40B14C828BB0E82807FC57882B31D9CF509BE7B712F56994721B55DA921EEE8AD45C8B4E99931C9B71B473A89A2D4821213A1ACFC453A41784D35B522E93C2D994D083674C71583782128476B04FEC71F17CCC65B9C83F52C207B08ADB10824A505B6DA8A78D4C599A5B09979D9491E1383EA155576730614FCBDEC1A8C801B94083A0FB55790B136BC5F37B752F3A6C636481DEBC5DA8892AC1B04AC7447953015E7251838ACBB6E24B508578B62D7450C46C76272806AC407112B73F7946D9654A45E943B406776E057C22E669B34A39D92F87928F8689CB8363B5B07B861BE5A750BEDB4A909605E6E26A489A5A4D9FA7BE3976479F8ABAB955200C479E75983BE821E79682FFB18553B72CF0797B2D2117ADD5AC0ABC71CF0E4CA83C26D218295AEC75872BA3A8B3CA22A2AB83404A046355FD394BF35D66DF46A6124D18B9A4606305A5968C4CCDF6B77A5EF23C5D54C68389E610B30DE122C2B2CDCEA30B3C780612FB9992721E26273 +sk = AB150A2298917B1707AF1AC0941ACC5B6B259D1AAE8F878BB0A37089B845991B203EE4C8F1A58CF9D2CC0059ADE2DB131BDC5FE3049E17F350A805C6F30479BE91B12A36190A5332ECA4737DF5A32FD60CCE222B592060ADD75A62F88D5BF6426FB18A944195F1ECB1BABAC1DCF20C39339ED45AC8C3AB582382480851107683102FA1914E753731964FDFF686F0A354703858C15C99F30A19D9C281AE93004C718D1CA5452FE58183D806DD666792DA7A76B0927DC77793396E4508200EF5097E45095A33AF5683A4DD1A5F6878C1E6FA85771A990EA16F7A28034A897855769DB8E4A9A425860FEC7031D09E96B665F57662B2BB86E362C3F9A706E354C12423AC6CDC74973A0767D73E75F5739747433C3451F8E5B85E5311B6E009F79C00CC07BA26B74D512520496B1998A4445C19249729225044CFFD51679B495511223417B2BAC86CC242241F2B70966E9A7A03C3CC0AB526ABF857DC1A140AD85825757D2B5A59B97B7F8C5015DA02159D013C1F15491FF4CF64C564E50C389F6C85B7C060F98011A4518CD3B48C2DF68C67F3497F439C11F8504E577CF49ACFAE704A2B093238520292602CC2138762D87536F6285C001D6975A242654DDECB5663AC44228BBE5BD58D9B90426C66802B466B21DC8D7A23893A953033874D0A93626C00B6A4FA3FE9EB0DFEBA2F3E789AAD8103CA153FBD7218B95547DE700CA526AED4F159639C59A7699296486188C3CA111479DDAA747F99AC825C7593911D6261683CE92EE8AABB77F82AB14838DB54149194B12791C4991181C66BCF05C67E19F05DCB658D8DFAB09C180967311F4E2AA03D9B8218889F87C5A5680299A7459AFDD69DB27302D9761DAA20BE37900B971694D3B6AEA8C6B5D53A686BEAA478F2ABC17C1C461807597148719925590C1E482AA05BB73077C017C1010EA576BFB5A63031875A23B0A019D608D64A30D0DCB39D750099D1C7583C34AB1CB1DD99A115547E3E4CCDF2A872E821B2330A5F6B30918226B7FCFC9FB4F37D8103437DB12EE073A49D29A7359316F8D922F783797E49B8C2B6146F76C7F8A66838C86364A788D3C4AE67D02CA09391E8547EDFE86CA1D131C5B96CAF479D9562688D1238C6196526B17844B475149AC3A76865C94993E518941A63A2E4559E81A46C8A99AFD2A73B36C633DDC6B32B14723F04A83AF89A420A3D04810311A28880247236A3761236B068A9A4EDF55317E8841218441EB1137342977215992BA99C1EEA7DBEA33AA83382B909BF1EAA9030B4386F8BAAEA643E41531204BC0DF8243F81367F4D979BF0125B84EB5D5DF53318463102938A85214AD7355960300DB40719A2ACAB9297381A6708391C78A8D4029487C324291A7E4A0945A806E0F24368C7A2AF91B8BB155D04C557759228673B548B6A4FEB8944B7334BCCBAB144C84344457B8B794A3D3B4DFC2357BE9227F9C4CE8B98003452C1D8D19C7A8332403A41308086346129D3F929B847BAB1AA5D88935D816A708C6A5E41023BCD4252569CBC724A53DF1B88909267A932186C751339863C8DD49CBE200797186924C26EDB976DE613CC2C46BEB06B39F5C264716A76E67831E4198822D77386592C777A088C5785417B65B2E4235CC67947D7B214627D326AC1ADEBCCC3A64017E004499A8887C4A649E443E74720F0B1BEDD52B1A8EB78B3AC2D5516B7A3233BE9448575209675F4A813120422684191D6771EF2B44D92B2CA3BCDD5F5AC20A63EFC237FF9D99BB4F5094AFC187EBBAD39B8B9CE75902190741640BABF653886162645A84262A24B1885C626403F23136707816ACF28950BF181742C98347022CD5941B7B69E21B5CFC2B4C6C5F301BD32A2E7882A1E1A9CD94743FC86AF0CD26B51B3512003CBE8628D299663DA40BAEF443677033DA8B8C21E0A0F12FB93F4D63809375FC877866394A1A5409E2F13B3E5011A2A5877732415281B7B19991E6EE0A470561B6BCB46D87B4086F18CA29C5FDCD622F4315DCFB11DB2C6CF136B7B0A870AE89669AD1011477899B8F679E5C9A8413959CA0CBFB3B54AD58C98B94760058C6F1F499435118D9143723DA05BA8F13E5CCA1813F91CE01092917BA1D798BA3481121026713BE1889B58375E5C4F9BB0BCC5FA808E2C00A36CA575C68B1D232778F71BF0927C5F2092D0629588826D02005DB9BC0DCE456E2B928EC9FB9C7A138E7B1065A2B660C287C3D062144CCA71E5C1294442073AD48AFC555767F1BEBAF550D520659496AF9237A22C27670A080F8A461778AA42C6CA9A954C28A658C73847A586FC3EF266562240ACB6978E026152B1149B8D426AEFE37BBD263A00DA05DF48375E53BACF9C4C11D4BBB055666AD008736B9C323A9974661215495E032AAEC611AF0E6A9244C2BFB6F3195D5121EDC3C0719C3FC1365C2BFC70D5C6140E6A383714A0931CCDFF946ADCF73993AA113C90AEF03374E251ACE73770A350428EC32A9DDB4AED8832526968412863966228644B9AF9842C2E967957F10D350A3499876F25D157BB2812501C8DC95365F83BC64B6340FA6CB4C2816B31824D028726DE0112AA9CCC9E0B6869099D310AA6E5B79609487E7A20A56BA75C45986F92F5A4D1672F3D99927A1193BA15BF5DF2586E823292593C49321BAC9044E4844A7A6BCB08309E2520B6ACF20E73BA5B05931E29BA43B2000A48C72A5DF05EF715CD8865CF16A835A83C271402071D1068A426839CA424CB666545664EA5E7461AF147B9D84583285EA1A05A02732031BB0BA40B14C828BB0E82807FC57882B31D9CF509BE7B712F56994721B55DA921EEE8AD45C8B4E99931C9B71B473A89A2D4821213A1ACFC453A41784D35B522E93C2D994D083674C71583782128476B04FEC71F17CCC65B9C83F52C207B08ADB10824A505B6DA8A78D4C599A5B09979D9491E1383EA155576730614FCBDEC1A8C801B94083A0FB55790B136BC5F37B752F3A6C636481DEBC5DA8892AC1B04AC7447953015E7251838ACBB6E24B508578B62D7450C46C76272806AC407112B73F7946D9654A45E943B406776E057C22E669B34A39D92F87928F8689CB8363B5B07B861BE5A750BEDB4A909605E6E26A489A5A4D9FA7BE3976479F8ABAB955200C479E75983BE821E79682FFB18553B72CF0797B2D2117ADD5AC0ABC71CF0E4CA83C26D218295AEC75872BA3A8B3CA22A2AB83404A046355FD394BF35D66DF46A6124D18B9A4606305A5968C4CCDF6B77A5EF23C5D54C68389E610B30DE122C2B2CDCEA30B3C780612FB9992721E26273A3D8A85F38CFDA38C66AE39B2F9186EF7BC1E0C98E8976A6CBC6C4875D73D7FB24C3DA70FE850E80AA818301D60C70F3038153866DCD5D179E22DB59B8991BB4 +ct = 05ED6A301313B34C67A40B05211E451869D148917D9CFEAA4144521DAFB1BC3CABE8FC527D998CDB6F1BA7A0609FA2144A3BD8DB8460612C8281586F4AEDA3F599CFFE70130A9C8BB5A91812B259167603B8282E96CA090EE6D83588980AE78ACD18324FACE44CBF68340002F1E0F6483DFCCFE092933D5A823F5ED4F06D38EE5747894CA0ED4A64438B1C6DB6DEA5D1A7DEED2A84F4622764FF3739924F3102912357F030CA7491D1A13F50B891294D3271D029E3402351D78479F253891D726B2C9AFB763E7A12BA3F150C54CEE377A91852B4C669A263D882D98896DDEDEEAEFE850159C3638408CA155BCC2D7D5579F156FCC2F7B77758AD4A5723AA45336054D810181E8BC9EAFB7ABD4349FA0F8A22B0E1418767E62EA6C84C2A7BC74E6E575DB8E6FB7EA79AB108C4985F3DC0424AF17B2BA1BA6C6AA2161D872DAA33B3C86D49CC6C0D5C8C07ED16FED4D2FD7F342B41D3F9B616766EC9CEFA0F1A2FC91CF84925243C344B02D6553B4F28D172ECA7A101B3A2EF6081A101DE8E95B1C32BC8B3327F24FF93C29DD66B9F508BA045339DE2C600469A73A65BD72CC348892AECFD3753F489566479AA7FF5390312081E24D9B64CBF8780D959DB66F9BFAA756EBD7CFAE55F991F81E586BDC74EF77A2FA3F3765905118F19443D3482EA18AC6BDA92A754CDC493E052D4482F57FB4ADDA00F9761F9DEED1B77FDE37FCBDFAD1CAE385BF05DE62880932DEAF957891FA11CD255E7C65619FD71B2641A085A5CD9FF4851FB57CCBDDCC10EDB41376032D6227ACF702B2E6265AC9AEE41A2C183EC16ABA9545E88988BB88EF7C0967E1164FA4F8B8943000CE8261420C53AF5A465F15BC6C76DFE8431439FA598D4EE11C3673EA9AB144893E4261454570702E6311392F79728C54DAB95D1329FD70D33E934FAF5FE220FCF9AACFC4D573798BB0D7DD218CEB8413629154745E6CED8A4A6EFEE1E93DCFB3F3BF3811513D5201F0B0A2C213E307767F989FBE19AAC74BAE70013B5D73905A709566356D4212B68349CFC4C7147F09CF0168AE636600BA31C87741AFE142D1CB03F56095DE4BB034991E54D863A9E56C6B9D1786D54A41C08BDBAE1596AADAD9118D3CC0B8121E25B0EB080A5E089EBCC32438A1DB1B72AD7D7B743A15118674F64992395316F426E365AE04DA9919E1A8FBD0959A2EA2A0938BFE7D2FBE844D89F36683E076F8E54E27AC5805128D0B58CDDC93793633FEDD427989AEF1463AF97643D628CC79DF9725C37F745839E85D9916D1C5337A16B47034FF2A36F3B022232BDC881577845CDC8A5621FC21AE5B5BF8EE0BB4E2ABDBBA1C348F2FD58313C9251B8E84FDEFE3915B8EA3CC13A5687AFFD790EBF25C7E761C90B1A0C7F6E9A3BBE04D6595B45D6FF3BA2D238D85ACF7206B0AE25B326E2191291510324A9FDBAED3BB5C770DB6F215DD693D4090BBF610F2208FDC7ADEC620D82F86CBB17DB7D31FB758A332D17E7FFAC763BFAC78B0F3C8A746BB60530A168FB5A06BC129F8F427BCC +ss = 0B642D9427CAAAB926DFC155993BCB41BFBFB91E6C6D1C4165D8750222CC3688 + +count = 56 +seed = 687C02DE1041ABAC7B2C1E6EC2A7C3375552ED5EDB10E3A8139C24CC76BDA44D719D8121A81D47A0B762B4E9EEB85235 +pk = 605471FEAA9E92B94016A9A05F585F3C52A993A91A6DB73C9AE6364DD2A07B6C2AFB449122E76A3B273D424B94343B3BD7E7B1E1366204820819C8BA8970218A22262CA649D8E3223167BE77D9A466C860AD7C320B227E873A0D68FAAA441C0907805996D64F7759BDEED65CCE25B367F02094714BE404CA9FE56F6AD99E7D38B5396281314898036493002CB516878DB66AB19E09478872C0F76ABBE0F754B443B13DD5AFE610C1ADFC52FB3C82488984DBCC4D9850A0EE4BBC07D0051208C87914A3FA5159C775AD91A552C2FA2AC573787FFA68F456012AF600AF60183F97CB3E2936EF683FD8E2B5742C6DE946B96F825CD0F4807640A532561C70600D4995BF8D2CA543DB1EACD68D28B207617C23CD9A57BBF75ABCB620D941913E6506AA0123F89C261CE9C39C605646904D22586643F4AD250870AFE94DC950913602CC1CDBB77BB9B4DF518D1A18AB0C5A25948302C0535908E70F84587EFF169114161C3E646740893FAAF6B37B42168FDBC494549776D528BFA2C2BAF6A00A7498F403347A646C9A58328C59274AE8CFF8B82787A29D67336DADD3404FB5509640C29C9456FCF82D4ABBCD9899AB108A1FEF872617C5CA780970182861C046A594D62757D33247B79E12873493634C16FA70983C9B593814E69BB160120B4129370519327AC2332063992AF4370D9871E7A27D13420A6FB16ED9B579D1CA1D36A2094EAC96B537109AD83F4DF1A1D2E184C309AB65D75A3E409C57578214EA4035657757AB92AA930A76D251A1B87BC6B58F9D900E38156D73A1961C43BE2E044314C89EA9601937C0A87D9C4B14CB9E79D83E722CC40B048BEC5CCD038304AC0A65BF93B9A787105EB31B5BE8845C5C57B9A9CAF6243F54438ED84159F5B1B8B246073B1715B0F635E8078991118DFEE2CE08887F9680BD4E672D3AA78DF8954554D398D1675D785B85DD28A1675944D7597968F22855999F148CCEABFABC2358C315076C6B4333A82520A8332543AA100034BB0A6776CD959BCB263074FC28956726D0D99B9D81A7DEC14F13AC5CEB5B9EAAECB28E282BB517CAC09809073C3D085718D1DBBD75EC83707CC768BC79A3B637D0ACB34F37C9C2B4C0EEF3233CF91C0BF5A6A9279F6AD136808A9A3515B02E303F4DA26F93264C5AB9010A9C8550B9076D6471C196675EDB08223672C1A229AD31C05EBC4FAB557F46B4BB37DC2B605A87B888A1F475516DB87B92451127436EDA7922BB45B8B8462122542DE969C31622CDD62676A8FAAC5663A8BC2191711383EF4C1CD7A183BB55CC3C83B566E5514F233D79A2963710C5E5225F7B09B0B6176F451A7F77570B1C17B7BA335511BC3C3FEB884E459ADD3A594DD35662419272499B4E9258DC9ACA946CA80911999D455D06407CF9C69E814478A9F5151780BD754A440BC69925155FFF0A675E0C322C69174C27CD804279EBD3260FEB62C0E24EB63C7A042996C25BC9342C589C340E99999F9C5054FF35C760A43974096C5FD23BB9E51E2483722A132B0277BB24010297C4BA2C58BB286C49ED20B7AAE98C5D9B0601F06EE53C1808E07FDA53114EFC6D36B28B906611BE3A29E68A8DA76457BE5419D70059F7C329AAD28692D45892F335D02D36153217D5DB379B621E416A54CE8071DFDA35F639A04B14 +sk = F80C63DD6CBDA93B6CEE719FBAD6BDBE1A03F18B3379306ACE5625FB38C5EDAC9C8C94525C85961E14A76082BBD760CCF9B5AC777088B0CC80E0304FBCFC697CFB13DCF1CF777325EB473D11A43DA4575B697A860445B02CF75E8B945FF9433A337C754E19453D4BBFD2F07C76E8B7A68B92ABC870B56202F7634B9B37902D39BCA04653FAD9A0E4F0BE548ABB97C7A1FA18C34CEBBAE3987F4B3C52A5006629159AC6875276053908B389D931BC7E2871751169B6D81C8D8B5F52854A3E644C5C504675D688BA030E9E78A79E7788522516FFDA2EC9946AA9791A634B6AB6D04456003ACF348BDCD859567A74A7B73556820F8DFC12E467AE2FD11025E430114A5A60D3B42BB43845721637A69596EB953AB7B3E3B28B3BD9923DBC5189A37E9FE7BD9B763FA905314C0A35387A8E8552BF7135698E15B8D99B0777A0A5AF1B7DAFC172AA6A4D69202F10351603771876C580A7D24479DB0D804B6513A09281F291F2706AB128905663AECB0BB31A41046771449D12C335051A2EB50CA81ACE90940A8A6A355B21A9C7505491EA3B48B5323CC567EAD909FBDB380FD504C851452BD34F0F65A39AC62D922A3C50A8566EDAB03358745D701332E4011022BFD4839AE7B6745C66ACA80ABAB8213369E299253B40A7922DF02AB70F9723BACCB1AD563AD20C5EB8A01AE564BE24F40CE91A0F06EC68C0604C74250909D317F8968947A12EA297A279821F1B5377B02653D66897AA526CF51553C268481F7174BD9495DA4B0305650358A637A5FC31C99BA7BA304C6811B555E4B1C2F80EB4223C54032D16238861FB650BCBA24B127026FBA51F5985476103FE1375B94007A06BC2AB048BCB4A78E6D3C748B141BE410992733630B8C917F89960273740A595071824A9D02908D52D334373E8A575D5D52E96E5AD0CC95BF2C761AE577B9EF6BEAD33103E5033E0765D748C409F8A44227B8F55838B38695C5E132F2CB9BFDD7CB8522906E9BC03DDA468A04012277417869277E2169C63112E6A8942A1C13AEE97300FF4CAABF862058B6E7CC16F34C79BA200853701A98D630936A8A595098C8B19820AC91F47451E011069AA688BFBF5AC4EE018C53639A1B0573C8A420C4619166B011E79BD0B843D97766810A48E55D5CE389B5DE4A739F77CCC5FB70D52B3CA5D01729935BF7E4BB984576F2ACB7466C8248F975BAD539B2260568DFA34CF2974D83699761C95405943A7A88374112F8AE79B4D244BF2D683F7CC7A533229BBD8B5E822C8B3449548634FF34BCAEFF25A41AA84A1FA1F52F486F89630A7730E4F81AD23C14D6906816A849810951727042ED0782EF26C31281C0AADE6C9334A88ACB917B781C4F16327196422C24541065B5E80F4374DA0853D478625A68F728A20C1C82CA4FCC4D62744FA658059141221A917D6121187D3B621179AA8F7B7CD0904E6E0787F9A5F65EAA78011B6B63290A55542C80A4BFAD64677467DD1B12785E6BFBC31C1F3D46DB55C0A035604EF658279DB3232C675BC0BC97717CA3EB71D4F44CAAF1B07BDDC90AE982886594F98C41AE7481562CB63D0B2539EEC589146735490A4A87B6EC5CC77BFC0810627AA3452CB061A1648EC7CBB4937605471FEAA9E92B94016A9A05F585F3C52A993A91A6DB73C9AE6364DD2A07B6C2AFB449122E76A3B273D424B94343B3BD7E7B1E1366204820819C8BA8970218A22262CA649D8E3223167BE77D9A466C860AD7C320B227E873A0D68FAAA441C0907805996D64F7759BDEED65CCE25B367F02094714BE404CA9FE56F6AD99E7D38B5396281314898036493002CB516878DB66AB19E09478872C0F76ABBE0F754B443B13DD5AFE610C1ADFC52FB3C82488984DBCC4D9850A0EE4BBC07D0051208C87914A3FA5159C775AD91A552C2FA2AC573787FFA68F456012AF600AF60183F97CB3E2936EF683FD8E2B5742C6DE946B96F825CD0F4807640A532561C70600D4995BF8D2CA543DB1EACD68D28B207617C23CD9A57BBF75ABCB620D941913E6506AA0123F89C261CE9C39C605646904D22586643F4AD250870AFE94DC950913602CC1CDBB77BB9B4DF518D1A18AB0C5A25948302C0535908E70F84587EFF169114161C3E646740893FAAF6B37B42168FDBC494549776D528BFA2C2BAF6A00A7498F403347A646C9A58328C59274AE8CFF8B82787A29D67336DADD3404FB5509640C29C9456FCF82D4ABBCD9899AB108A1FEF872617C5CA780970182861C046A594D62757D33247B79E12873493634C16FA70983C9B593814E69BB160120B4129370519327AC2332063992AF4370D9871E7A27D13420A6FB16ED9B579D1CA1D36A2094EAC96B537109AD83F4DF1A1D2E184C309AB65D75A3E409C57578214EA4035657757AB92AA930A76D251A1B87BC6B58F9D900E38156D73A1961C43BE2E044314C89EA9601937C0A87D9C4B14CB9E79D83E722CC40B048BEC5CCD038304AC0A65BF93B9A787105EB31B5BE8845C5C57B9A9CAF6243F54438ED84159F5B1B8B246073B1715B0F635E8078991118DFEE2CE08887F9680BD4E672D3AA78DF8954554D398D1675D785B85DD28A1675944D7597968F22855999F148CCEABFABC2358C315076C6B4333A82520A8332543AA100034BB0A6776CD959BCB263074FC28956726D0D99B9D81A7DEC14F13AC5CEB5B9EAAECB28E282BB517CAC09809073C3D085718D1DBBD75EC83707CC768BC79A3B637D0ACB34F37C9C2B4C0EEF3233CF91C0BF5A6A9279F6AD136808A9A3515B02E303F4DA26F93264C5AB9010A9C8550B9076D6471C196675EDB08223672C1A229AD31C05EBC4FAB557F46B4BB37DC2B605A87B888A1F475516DB87B92451127436EDA7922BB45B8B8462122542DE969C31622CDD62676A8FAAC5663A8BC2191711383EF4C1CD7A183BB55CC3C83B566E5514F233D79A2963710C5E5225F7B09B0B6176F451A7F77570B1C17B7BA335511BC3C3FEB884E459ADD3A594DD35662419272499B4E9258DC9ACA946CA80911999D455D06407CF9C69E814478A9F5151780BD754A440BC69925155FFF0A675E0C322C69174C27CD804279EBD3260FEB62C0E24EB63C7A042996C25BC9342C589C340E99999F9C5054FF35C760A43974096C5FD23BB9E51E2483722A132B0277BB24010297C4BA2C58BB286C49ED20B7AAE98C5D9B0601F06EE53C1808E07FDA53114EFC6D36B28B906611BE3A29E68A8DA76457BE5419D70059F7C329AAD28692D45892F335D02D36153217D5DB379B621E416A54CE8071DFDA35F639A04B14AA73B40DEDD61E6FDAAC86971965C03AB14AE69E8130426FDF830BD57D0974CE3AFDB8A246A56EE71465591831C371F2EB87467B0559DEDD776BA063EE6D2F93 +ct = 909F5615AFD3C1E5BD517378A979CF9A4267592AE7A8A723314DCD337E5296E07C686EA98FB8FF29067C99D0C8214DF3E1A4A3CD694DD8F53F9B1ECEEFFC203A6BF9E7022ADD6374B08B0C009A0F2B57CB55221FD486E4787ECB8CDE273E980C25B831CE8504E9125B4C402F826EE5F4E2965FBA01771978EDACA1B9AE19E0E302CD019AFFA2FE3714B7C136FE5D3B6F9D7E6622493942323B33DE56202A94D4CF505DF02AF304CB7339460A2DA004D783024AEDE73BEEE0C388816B90B36449F84FB145D99FBED6D46A1B57369F2F1AF1B4887E5AD0B318B527E25F81B0A847188D0BCF722482B90B1E96B114CD0274C8D00401B0A39B29E4C6B07979199A547A27D9EC39DDC7B29FF2D7033CAF8463658113451FC604C0A01656A2968871E153D77D6A1C328EF92ABD4EEE745A3C58D518A0AF004F2C636E2F0BB636436B0517D6F8D6A4323727518B720F55D993E2C9E1653DB50A43F10C4A69FEE9B170C98DA672C1B21A9987E0A231AED4241114D605555955A4FFA66314853FE8E1E4306ADDDF09BFFF1F22EDD64448A2F59ADD8237A759C2B5112DC3AD69404C65C2CA5F97345B492F0100882C83CF33F15E6DC2459976FF8870507865F9616AF8F0AEEE21FC008C9EED3565100F7443A731A5D6392F0D5E88AFC84D6A3F3C3274187A39BEDEE638E5C56E9A1A17047303DB8920A77F17B322C9573FE0096CE446ED1457CEE4FB2BA448D9A9BD690D89C58E47816B08995A36ED6C1A965B4C78CC5D7E90D5EE1CF5FFFDD6874B6B2ABCE7EA3ADA69BEE4CCF3892E8DCC8538CAD74FCED9DC8AA13B976E891ACB8EDA3700BBA39091E4FCB25EBE17F011D392E54B98AB4743FB7DDCAF0840CA05E8691E1C6FF4F46B45663DE89F4BC9B4ABDA850563336C0B82FAD2815D879131F58C4C5850B98AB57EB36A4A3E540E80F7115186754F93719794FD73D7236059A4DBE8169C71F01DD7C4FA1E6E3B3E80E5551C29C428996169E863CA1EC09189138588FE85B759D75C6FAD53746F5B6A6CCD6C2A970D1860FCC12998A7E9CA3DE51050F3B9CEF4A303F80591683CA7FA17909099EB288BE46819EC8E93C54BAB05B67854D7A105AFA20E62DAD71C90924A7FE13C5B0FFCB47DE697B9CCF4F33ABEB151E63A02B1835AD4FB5D4D0D858CD9F0A857801A6AA316076A4ACBB4ADE6F55DEC9B9F77D1633CCB4B391A4F879336AF32C7B54D45DA9683BBD83AE8D8E1A87BAA2E98D1D5C8ACB8418A2BEF076B9C35C45B97B7E5EE24BEE56FEF50D7FE9F30449440EEA673D96F3DEF3FAD0009054C7F4B1F36FEE689BFE6907453F2D08830D7524E311ABA74DB389DF58EDFB4F3715C880779352388ED09E5378760C42105F023574CF146E6A88FD7CD42660DE906BC57DC7F49F6691378FB8575C637979D445E2E74D36961FE0BC675A84E638F8AC4CBB0B85F365B3A73EFA97A4BBBA437A6FFCFF21B50226741F19400751B5B47C1657A259B427FB44FEBE3442123FAEE30EB71EEEBDBDAA798FF7D4DF03B2E5F08B1F248 +ss = 79462708F754BF842716F900E850C228B00996B0E3801B43F6A928BFD4AA9E50 + +count = 57 +seed = 4142237070C216BCBE245A39BD9220533C97651D84832B26727855AD994A0760C52B9319AD404693E4248B8C5FF324B3 +pk = 5B668AE6721C79E07EE5D26233936D195B62B192058CFBCB0A5A73EA0154D78224EBE84B7B611CED7256D0726492A4B41D4A8D6B2CA73A3668F93A77294439B0D8CA9A725C5278C21D896CA5D706E5F03D71526CB175ADE2606E3C3A24D510B4D9816AA6846A77663A80F5AC0D364747307068DA942B15CD2E02A3EED2818F9056D697897B509BD5048B178240C841580BBB77A79423996072F39497869007B19442F401009BA1A039C18F191CCA42F9551713CD791C9FB847690CF6247BB752A17A9873E97BCC36B793B6AD827ACF418543054698D77693F9C38C84354CC81C7A3B6A43ACCCC32DA070FE29411F17A420521FC69C0D09A6425A20AFFC98681568B8CCEA88E54B8DD9F12AEF4B3C10F256EB1519671091984A1DBE972A901BB4B24246D7DB01B86665374BB6CB841B3CDB2593BA5C96E32C20936ECBC4ABFD24AF76158B36A2C752A9BBA8946B34C414EEDB355A3CCB87431221AA2E936B0BD7540E697142DA0817B1B51314FC71CF4017F50544474C572C70BD142C676B69AFBA4292F5F19E88163F2FFBA3B1685073C3BBCAC825B095B5D259228A459FA7E866E09735E4CAB8FA733D4DB6A98172846397883394059C635D23C09FBEE3CAB350B9976C6A8A900C8E1693C3704E779049CD1221CE767651BC23755A3A49C6BE0C314A8C501579F7A447070EFFE0314FA3687AB92090738434E55280A42F22A66EAB77A2932B07E6857A32E31A527A2A909865E053A32148B59CBAC224C12468E444916CA375DC204C600899F90BA7C854B3646F2AF3981797AFC4E261C7A93AABC40A93990DABC82564336D01B2447FD35E8E86A0CBF676CFE6C3D229B256E585D8373D26C3AD66161890325533818F845301D9311BC8035714A722ED9206967123E65410562A745FE28F90D50D772A9CDED6354132688DDB1AE6956EADD896CFAA71C44AA925FB3B2C6B7D5E47CBAE00A91040456F4023174C73DD8A4D50F9714AD1CFF718321677A6962587BA6CA82C341F02A7382BE9715B41994DB91E6D0B487207B9B660793E62470B806A7444B6FAAB38F48747484062FF443AE1DA9E7EF41F797398F0527406787E00E197AC3248EE4A0E5037CF6C754AB9A24D08936E9D3313B99AC18886CFA9972030F1A40E58B25939A21698C434391785A3A98F0445567A9DBC0B4284D49652BB1862BB76FCFC6ABE60831CAC9AEF6469464319411A30F7601B5358568B014E67A76EA42ACACD7C3FC2F983BCE1BC0667897B92590DC724B5284FECF7C36B3842C61C27AF1A2F2EC95899591E707272BEA384CB9C8C9409BB26D743FAF196D3B8B33119A379D5CBF6823D4176CA83BA4E2A426745F346A42861A7B5343AD3AC26EA8895F24A379C449156123ED91A4CA701BD789DA84BA0ED5C707D373634AB7A65680667191F806B6F62CACB4B40AFDD649CC9D1650C3A5E40C8346C91B27EC1B1A957C778EC9C968C670FC84645FC07881C54946B5AB0B6033F45AFCC6A61FBB99746F3991F5B827C22972939C5FF620BDC4B131EB393D108C56556719ABBB978452FF0A12A1D138C9065C304C8514658193232C832B05B0B21A10483C6FAAB378C6B1415B75B43796F314542B9D7C87C1CA5FC13A12E8459454D36096C3BA38E979A3D4C852032429BFE1E663E0C256C2E93 +sk = D809438C90AEA78B897A528534FB009D716DE8D513D32168A1537489E52255D00F49C424BF5B5DB0E15A3A9B9845ECCF287776F9700FF5BB7AB9F40FFEAB7F148A9633546846B672CDA9AB8A37C8F9711B76474E7975AB7E16675A8626F8648B605066A4FB4A5C255A0A39387B03BB7F618C9ED1B37E488D4B7175B593860F6C97D637A2D8761D3B933291B2CCFA6BACC4DCC4DDBCA804C7C55EDB9FC5ABB503036059DA4D2929447CAB1BB1CB746AB01293A2B2F2638BEB06030D476BCD2C335DD5226B7450F8B5B2B130332DC9210640C10DAA5FAAC16C1381C2A0C4AAE3174BE4FAA53CA9CBF29769084715D6F8C163A0185030B0C7C9621336A9875946FBB73BDA9774C07615711451F5594A44313878204C291AB7550AAF981409D4D7CBEE727BA689400DAB7382605F03873F38566421A354B59A3B48BC8F62A09519D932AF5800A9A0C6EFD5783BD93483A0AAAC7853C890C3BA18835D1A2E8F14BD0768CC7D0B951909825C988648F797F5711FBC654380E661BBC41CF89B088E1410F19669AEF65FD817564A4A4F40281B5E16A69BE2B503495A4B6B680A08A54FE0B80AE668041AA120C7A363E38AAF2156CEE293BFD4396DCC503646ACB74B9460142E4476807C058D72C9610E3CBB50A29ED7244419C2C258659B3A8A23E7E69A3047298378424B7A12DF3CCE34F1364732B292B105EEE6A487126815BC0013D66FB7099EFD4931E4301D570BCF2FACBA0B433B9A03147242C298052650416651DB690CE81C268381032B17C429A8E418B7E2BB63D30B570DA588CBC36DC3798C65F81EF05530B9043310E182E88BB3E58356DE408898738C9B3C457FACA42B9B81ED7C4118869D5153338EF4260006C6BE294B528C779BD6C8FFCB16E2AAB439D3032B8AC45216282346200CF1C812033A4F9667AF842481D807F92245BB322E04343971A656087CCA8CE9BD3117013AE816BA745888A4AD51A167A17482EE5B88B0BBA455A565B1D97BD3B9BEEAEAC0B4F2879A727028D4A1C61900D0770F15451A01964366D8A6AD1B5BC520392D43BCA270CCF9A72DF3D68B955C4BED0352B3F78151C4716512097BC92F2CF0A2560923D01358AB1B5F8B7BC687F5C110B04C6512372F119FB23BB852398A6F599F4D145A8AFABAF8AC8726ABAEE569C4579B494A01C67E232B93080D5DF1542DD59F21760A24747E98E26466280C04D1784D9B581B4CABCAC1C3DDE1CA8E00588E0732F76B99EC844032D99EF65C8A9EF4A661E78A47B0542B3129E850647862132C208CB9B3986EB5B510EA1854300EE966B0D3BC09922260FFC96B894A181A95A41F1BB3ACB2572475B3FE8933FE3902C965678B95512289CFBAC30A2B159B8F2B3535E40881D81C204CBA9080B9A7B23190965EB660754368955C0C7929E9447B92AC78E7867C1B4770596047FA820C03A11CAA3C2BA48120E29AD46C289920222C511C9E18343AB20067F926435C6D6B040955F9394601B805E38A751BC8A1853FC05857EAE658A8A7CAD729373E73253E7728FDCA89E347BBFC48A7BAFA48CB167111367F40C93BF71CCF208A891C383BA3B593F2663148D779ED82B23F4B6796209D51425E9168CB22224F39F0695B668AE6721C79E07EE5D26233936D195B62B192058CFBCB0A5A73EA0154D78224EBE84B7B611CED7256D0726492A4B41D4A8D6B2CA73A3668F93A77294439B0D8CA9A725C5278C21D896CA5D706E5F03D71526CB175ADE2606E3C3A24D510B4D9816AA6846A77663A80F5AC0D364747307068DA942B15CD2E02A3EED2818F9056D697897B509BD5048B178240C841580BBB77A79423996072F39497869007B19442F401009BA1A039C18F191CCA42F9551713CD791C9FB847690CF6247BB752A17A9873E97BCC36B793B6AD827ACF418543054698D77693F9C38C84354CC81C7A3B6A43ACCCC32DA070FE29411F17A420521FC69C0D09A6425A20AFFC98681568B8CCEA88E54B8DD9F12AEF4B3C10F256EB1519671091984A1DBE972A901BB4B24246D7DB01B86665374BB6CB841B3CDB2593BA5C96E32C20936ECBC4ABFD24AF76158B36A2C752A9BBA8946B34C414EEDB355A3CCB87431221AA2E936B0BD7540E697142DA0817B1B51314FC71CF4017F50544474C572C70BD142C676B69AFBA4292F5F19E88163F2FFBA3B1685073C3BBCAC825B095B5D259228A459FA7E866E09735E4CAB8FA733D4DB6A98172846397883394059C635D23C09FBEE3CAB350B9976C6A8A900C8E1693C3704E779049CD1221CE767651BC23755A3A49C6BE0C314A8C501579F7A447070EFFE0314FA3687AB92090738434E55280A42F22A66EAB77A2932B07E6857A32E31A527A2A909865E053A32148B59CBAC224C12468E444916CA375DC204C600899F90BA7C854B3646F2AF3981797AFC4E261C7A93AABC40A93990DABC82564336D01B2447FD35E8E86A0CBF676CFE6C3D229B256E585D8373D26C3AD66161890325533818F845301D9311BC8035714A722ED9206967123E65410562A745FE28F90D50D772A9CDED6354132688DDB1AE6956EADD896CFAA71C44AA925FB3B2C6B7D5E47CBAE00A91040456F4023174C73DD8A4D50F9714AD1CFF718321677A6962587BA6CA82C341F02A7382BE9715B41994DB91E6D0B487207B9B660793E62470B806A7444B6FAAB38F48747484062FF443AE1DA9E7EF41F797398F0527406787E00E197AC3248EE4A0E5037CF6C754AB9A24D08936E9D3313B99AC18886CFA9972030F1A40E58B25939A21698C434391785A3A98F0445567A9DBC0B4284D49652BB1862BB76FCFC6ABE60831CAC9AEF6469464319411A30F7601B5358568B014E67A76EA42ACACD7C3FC2F983BCE1BC0667897B92590DC724B5284FECF7C36B3842C61C27AF1A2F2EC95899591E707272BEA384CB9C8C9409BB26D743FAF196D3B8B33119A379D5CBF6823D4176CA83BA4E2A426745F346A42861A7B5343AD3AC26EA8895F24A379C449156123ED91A4CA701BD789DA84BA0ED5C707D373634AB7A65680667191F806B6F62CACB4B40AFDD649CC9D1650C3A5E40C8346C91B27EC1B1A957C778EC9C968C670FC84645FC07881C54946B5AB0B6033F45AFCC6A61FBB99746F3991F5B827C22972939C5FF620BDC4B131EB393D108C56556719ABBB978452FF0A12A1D138C9065C304C8514658193232C832B05B0B21A10483C6FAAB378C6B1415B75B43796F314542B9D7C87C1CA5FC13A12E8459454D36096C3BA38E979A3D4C852032429BFE1E663E0C256C2E93CF754F2EE43694865A09CA7BEB0DEDA9B1328FD0ABDF30CA5C338E27E8BE04B5230E05B7114FF0395CC6634DB1EAE8258072D09C09F291E92D6620B177DC50D7 +ct = 78E7B98228BFDF95F03288762317F3EB2AD2750F51D4078A9FD1F14F002AC59489B6EA1AD30D86EC7AD46296F8D0C69DB4AC9970137901A93F02377F7AF74746C5620A853BDBEB7D706C9B743A78F5AC0F80DD34EA8CC9737EC8DB9B1DA502F14BA2D578EA6836AD314DB2A07133D7C0F80E3A3BD196361CE8E8F24884DD9F602F894656FB68520BA493D064F93F48A9D4D219C8312B9476859A462CB15961F0B045CCEEB860CEF99D4496ABAB16A5FFFC21483E9FDAA826AA9B960F395E8AE4C433E69D10C2687BC17005BEFD809FFCC76070634BF58DC37CCB9806F530EF6ADA63CA422A35CA1349A74A5D0EBDE8036A0801F3F61E838242189D9CB1A8725BE3B93E07AC509CACE9A58426D9CC6D084BEEFF08D8FD3F1020ED2E0A3C0BB7E380049C76B4C8D18F8BA2309A813CF36F247006C247C6A418FE9F070703B80FBCD2AD45DDB3F9707C4F685736C680376D622F79644C2B4EAC7858B960C954C7F1772E708CEDA6812ADB59A6A9A277337C44D0A3156327FED348976D07B500EF61046D2B881B3882AB2358EF741EDD947D72A0EB26C19912DE1D2C77B6F523D277AB762585BDB095162ACA9FD027BBE2BCBB6C4C57EC0B01194363FE086048FCA61489AF4E9A06D8367B28EB465A9F8BF986C207B26BB9EDE3200D6F407DC957A0CE7866882E83CD89AF5702F38FBDC974EDAB62F24BF50C53037437260659EA579348950652F93162BF1A9BCDBB72E44D04B4B3C3975588922EAFF1569837704CC6BB60404E589BB0E1CDBB79E503D0F946186FD35B4E0A294E2CEFDE2C0DCB2B2383348F899176FA5B620B941C68805B52959D0571EC26B9DBDD75F0895561396B3ED20BAA07B7D20D0DEF905B805DBF334601BEB359B93E9D30C56D91AD58CD93193D7DB67DEDDEB02D05B64B23F765368524CDFD40F8F59DFD5CA7280A03E0DA103DB6976331514B965F1D71861A846A59CFF73865BFE35690AE34BA8978876C809BDBADE6726E4ABA2447DF9F0399A06844B1CCA43728EDD3FA348B34B7F15DE627550B1392DD3E0996EE3D8B7351D6A5601C796C4FA317641100ECC8EA2BC8827B6B88344FB5EB4AECC3F24B78FFDCD278DC5D5C7566031DA41BF4B4AF39D11F5355DF82FA68986FF0E84E931B520F600030495E6DDB4AC02F3DFEA6F182FB1332C5F6180D476501118D32A79217A9FDC3CA8DBF3B942158A0CD42C44A426A03101E444CC84DAED5CB8A17DA4E84F56F2C0B9A665E4C144994D982595A22D7E4F1F1E1937E8B0B4C70959621E0EE3F92FEA44FF164B6F7DDBA625C97152494834E604526B8CAF76F995B18F9AFB0BD263ADA10751F45DF9FF83FDF1A64ABF7874EE144E225E39EB4A22179622E7D45DF70BC61237D35BA64E11468C408BEBA085EFE12ADED232044F4BE8EBBC019512EAE687ADA59B8ED47ED82D2B593C46080A75D2B9DD5BD6A612C7C1AF0D76A231DF4D3BAD49F09EF01A38652DC84FF60F3E6F22B471113BDC51DD5C33B73CC65AC2C701F4CBDDBA9B361680FBBD0B4 +ss = BF535EEBD3721E4D832FA4C11369808A154FAED4602220B4070B78900B008358 + +count = 58 +seed = BD334D7B7EB14E00E68863F2E5551A095F8AF10681C28353FD19B9A7E70B8BFE266840860609008A567ABC66316C77CE +pk = 98CCA518437873F144E7E261E8465B3720582CF7706D684F84E618E8834F35857D4A8BBC303134B5E235DD1B2387A81C663876C5530293F99571B97AE5A299DF0C012E9662947089C9F81687722FBDC30CE50689690B30932A8A3CE7BCF6A353BF988DD310A2C347BFE6B30999E69C455B9F472B9BCA0216C84265E5D9486F6A7F1F3125C16467AE41B9F85180497B255ADB06A406A13A221388E14C0DE8CF73B6A952C2B2501644831C3700B7C273B7A3180A7641621F33B41C0F9255EFEC1025FC46F658C64FC89352C54C264B97E5A91C2386CD3790605127740DA2076EAB4876E128F3746843205B8328CFCDC65FEB92C2D973BBBFC68FD7A46DB51641B7830E73589F41D413FB571C37685DFF142863078ACF00043395BFAB3589B0CB435981B84E54318AB46E398389B8E146CAB2A9666330EC4C90A652A0F036951519880A45BF5D000D4E40C6B6554CD222880D0B91B67153C43909EB2C0926354D436C2318C593F9FC214B548E17245C0C9B83174A6783508B97AC6A8D8A88ECD278E2E52C3C9138B1685DABBA2BB1425075B298CB9120E790AFDCB9792C88698CC156CA5A789474992F470B1D554514823E87BCAE52CCC872C951B0C24B4A2B0460F488EE7768D56B07DC79B3B4CC321E5878AC0A5C3146AAEB6CA123206B0C7B5AA6E0BEC5D0A903AC9415DA345AF199CAB86BA99234C9526E6E8812F6DA8001F31337B8498A8374AE527B6032A0CF3142D1D34181A5AFD6AA432A588AE1F644F5A100FA593F0ED2753F441AE5677484738FF694ABCEC58781B06D0213579F827FB4F97B3FC343A445BA3035AEE989685E7B20BE6103FD39AFABC334417379BD666181925ED369680B851A54C41B6546B9C04CA69742B2A814763674ABC9CBCB03E96F9466CBEAEC698CB5C9ACF814E90887F8D15BEE556B28F50B739185EB7A5A06E896ED0048BBD905E016436477A68EBBAB1E172928AC8FA9A8B0A0D999B135A753A29A47D0136865B0F382572B0697D0FCCADC8A77C1B591BD73B639E13F9C21B6F0969B0ABA3EA807303377AFE0F49421B68D0712823FC448FA9A468FA000D5964BCF9A9E7FC92DECE03BF6732A36935B25023B47FC94C15795DD983BB4531E935A19778305D0E8A75C2CC770EB46B6D5759DF503BAC33F0669C775729C59EB94D48223D763880E8B58473683CEE48E309380F7B442E6C83F0EB9BBB0B1AE805B1498471AC1149D578B454041AAA2F5CF13390F10A72DF3385C6A8A1F990BB946F4C888E585069B5849882788A1BE27DA0725276FF9DB130519050B74CFF69A68534222499CC61F5845A8FC0AC5629E0CDA20D3EA2F0046B78A2267FA0187F15721EC53083018772097892BE85C1BE99480247E6E30AAC8FA2C593C630B981E57515E0F7414CFA8B606D931280A950E567C93B319FD23CA1B682FC0B960DD309F80455CABBBC71979C59A025008462C0681465D748FF2A6AE24E86C79922E2845568CEB5063FCB81B78295B93A80B221AE7E14A9A9BB7182C1ACF347F2FA73784835F3375A29ED05E4BD120A119CD0FDA29F76A1EB873AA88D0CB3C661FF0D5652F2B4604E2BDB1497486687F17B8CE7A096A59E0922260AE99BB7412E306CC0B25940FFDDF25214EE4DD4E1AEB851878E2493C05E2BD5A30B5B99D369454 +sk = BA45541CE7B3DE134E6B17030710BCCE09BCDBA837F23566DBF1928C99CFFCB674CAB9C41B3151FAA3078177B9126C7973E25687452DA075965BAA804276859B092D9D4095B5E3A27943776DA65262511F62A3AA875B258C7929B502AD6CBA00E3B38011C943310BB5CB24791A71BC5A2796D6197192D9594936089D88BFE976058CA16C152193838A3D7306B312F8160DF15288F9063514A403ACB76BE298F5C92D65A90A0BCB28A4F438EA447A9C881808A18A2F5C3C1B876B3AE94ED28478FDDC1E98A64FD797A0931CC4A18777E5D481D9E92C0CF2B5F5A58635B368CBC8C25DC733550774C0861795939B74E83A23757C212927805663DE14A0FA00CF10F51850DBB4CDD7CAABD5C09B2818CC0A09A58169E3827969518E8FC7BC8325B45656861A848347A358EF1155E5D43F7910A738A132C8892977075C9A19C1EB6399F2E7BF1DBAB593A907BDA509EF5B0DE35A222FC951A0829A838591A0441294C35CA0B86BE6FC02E1EA1B7D4004E5BCBCAA2A280EF37067D72790BB5D59587E050272DDF8B117286FE80C1BBF078E6D259A9B53BD6FF1B43A86B24ADB27BBFA3546C179B8F295726AB768BC7FC8DC2A62715030D93581165F1E4A03D42374A31039D55741C9C49A1C807468CC826F0380B90C9C3F319CF1F73811D674B05C147BB2613BA56365EA04872B9244B236B0D480DD0B47B7797A23286269F97450E13791B205C8AA3310B72F3423B263D93CA320AE1FF04FE6E3BB703A6C4FC17DCFB6341AEB485576B53D1CAB71D9049DCC68CF86008BDB6152994E70152F96C8AE4A0819102BA5077B26086B2DC6B04B324A31AECCB372CC18976BB9DA42C8EBA89640149ACC544511546C5DD293C3173EF28CA92B85B86188BC6FC09E2725307A2C3802C6086F922CDDC62B5989C5A6846496D2BCBF7775A4B3737EE6C6B69CC3373C96E79675CBC781146C7A78824AAE4322E1A69DBF64336EFC3348E414ECAB04010B9F7399310253679B48AF3C23961BF345B35172C1D472F9A31274C730373A29154A581631A0916A21259A46EFA387B36CC9272B5284085709E46F07BABFCC835959D841B3647F51147A013987DD9556111435124101E5D42FF0848BFE2169A49485C094226EC6994CB50BA9F6476FB2A39522A08145B987593F2FE67A2B2CCB036C4E6540145758C6745A389955CE9744CB8030BD85A838A5904198B318A4D265EEA61C70E5A34156BA00A53F05C9BE7F1AC214F6A75DC8154EECCEC7CA6218B34B8E063231C450EA3A8B48F7C97D9C58FED709C350A28A34873CE76F0FC7A4237AAEA0804E2D3874D726AEC41C3AC8E02706DA459C01736B7A5E0936B3ABCCBEBF146350EA2A246C225BA897473817F28C8D6BBB55FE98A48DE682A91770EDB1BDB190A0EFD677A7FC29FC62690668924CB5887F4078179AADE85C0DC8E3529862B2760B187B7778A56C6B026769E339ACA5F8C948801FDDC4ACC3BCC7FF548DD9FC12CD7A394C24A7CBE18D3D22AE3B48BEB295905B217AF384393705107F33B02547822B0A2CB1B57B6FC637E071C0FDBA2F87F010D0C81C42DB454F5C7BE69AC0069C33330BC40532248FD0B90A28908F7471FBCC543FA94403818698CCA518437873F144E7E261E8465B3720582CF7706D684F84E618E8834F35857D4A8BBC303134B5E235DD1B2387A81C663876C5530293F99571B97AE5A299DF0C012E9662947089C9F81687722FBDC30CE50689690B30932A8A3CE7BCF6A353BF988DD310A2C347BFE6B30999E69C455B9F472B9BCA0216C84265E5D9486F6A7F1F3125C16467AE41B9F85180497B255ADB06A406A13A221388E14C0DE8CF73B6A952C2B2501644831C3700B7C273B7A3180A7641621F33B41C0F9255EFEC1025FC46F658C64FC89352C54C264B97E5A91C2386CD3790605127740DA2076EAB4876E128F3746843205B8328CFCDC65FEB92C2D973BBBFC68FD7A46DB51641B7830E73589F41D413FB571C37685DFF142863078ACF00043395BFAB3589B0CB435981B84E54318AB46E398389B8E146CAB2A9666330EC4C90A652A0F036951519880A45BF5D000D4E40C6B6554CD222880D0B91B67153C43909EB2C0926354D436C2318C593F9FC214B548E17245C0C9B83174A6783508B97AC6A8D8A88ECD278E2E52C3C9138B1685DABBA2BB1425075B298CB9120E790AFDCB9792C88698CC156CA5A789474992F470B1D554514823E87BCAE52CCC872C951B0C24B4A2B0460F488EE7768D56B07DC79B3B4CC321E5878AC0A5C3146AAEB6CA123206B0C7B5AA6E0BEC5D0A903AC9415DA345AF199CAB86BA99234C9526E6E8812F6DA8001F31337B8498A8374AE527B6032A0CF3142D1D34181A5AFD6AA432A588AE1F644F5A100FA593F0ED2753F441AE5677484738FF694ABCEC58781B06D0213579F827FB4F97B3FC343A445BA3035AEE989685E7B20BE6103FD39AFABC334417379BD666181925ED369680B851A54C41B6546B9C04CA69742B2A814763674ABC9CBCB03E96F9466CBEAEC698CB5C9ACF814E90887F8D15BEE556B28F50B739185EB7A5A06E896ED0048BBD905E016436477A68EBBAB1E172928AC8FA9A8B0A0D999B135A753A29A47D0136865B0F382572B0697D0FCCADC8A77C1B591BD73B639E13F9C21B6F0969B0ABA3EA807303377AFE0F49421B68D0712823FC448FA9A468FA000D5964BCF9A9E7FC92DECE03BF6732A36935B25023B47FC94C15795DD983BB4531E935A19778305D0E8A75C2CC770EB46B6D5759DF503BAC33F0669C775729C59EB94D48223D763880E8B58473683CEE48E309380F7B442E6C83F0EB9BBB0B1AE805B1498471AC1149D578B454041AAA2F5CF13390F10A72DF3385C6A8A1F990BB946F4C888E585069B5849882788A1BE27DA0725276FF9DB130519050B74CFF69A68534222499CC61F5845A8FC0AC5629E0CDA20D3EA2F0046B78A2267FA0187F15721EC53083018772097892BE85C1BE99480247E6E30AAC8FA2C593C630B981E57515E0F7414CFA8B606D931280A950E567C93B319FD23CA1B682FC0B960DD309F80455CABBBC71979C59A025008462C0681465D748FF2A6AE24E86C79922E2845568CEB5063FCB81B78295B93A80B221AE7E14A9A9BB7182C1ACF347F2FA73784835F3375A29ED05E4BD120A119CD0FDA29F76A1EB873AA88D0CB3C661FF0D5652F2B4604E2BDB1497486687F17B8CE7A096A59E0922260AE99BB7412E306CC0B25940FFDDF25214EE4DD4E1AEB851878E2493C05E2BD5A30B5B99D3694543A842153DEE9E035299D7E268C9492D71188F9FB24BDC2DD20C1DDCA647A15231100CED48ADD211A5C937B8D6079D8E271AF3F949EDC61F70E60453AEF20DEA9 +ct = D793DFE0884A98CD776624207687CA1753B04CEF55D5DC4B9C5C94264ED0AA15B03251EE0FAF7C60C6221FC790F6E32C36DF947183BA0F3371CAE13EF196F36EE80ED758DF37AC6D9F45F14F351849FA5A18A4B9904B4E47B400B7BD80F7F458B92EE9A1577289A0CBABE7B8D7BDCC1D9BDB1605C96B509514DBF7FC9C84327F692526233F6723B04791CAEAF19B687052CB36CF248A254D4B1ABE5C2AA0D7EDE7174DCDDB2FDE19F5E91014967169A2DB30AA756D794012C290811361DDF4818C6BC1D74C7BB6E7830051C7B3EC51D66C3B1613C8144711CE70585F8FCA8001BCD9CA247DFE8449BFF0F7D52F384E496617449F003F145DDA4B53015AFECC31A72E3803AB561C35A72716D8CE3566A66AA0E921A1098CCF09712086C22C1CE4951791A46C78CAE8734B49C571710EE0EE2CF1138E1FAE19455C4C2B573EB8183DD9892E3D0DC150DAB5ACD32F8237B680865BDDCAAF0D5176FFB2382DCD75EDB2CC8398AE9789B7C49D44E4D4D18E705CAA7E3021229A52D45B12677D8D208EFE1DA2ED0F17C60BEF179C36A5B40B4D2B52A43CB251B65508148666111078D1D0E9ACD129526E48CC09148941E1B53E31392C6BFDB1406B7447589D2FC121E106830935B94AED6AEB66DF8FE843CCE9A0B91AC388E5C4C023E2522026CD518F48345411590AE042B607BD38E33FD15398C721DAA0A1023AEB4704B34125CCD18856EE95910B9044A83560D6EC6B2DD6BAC5BA82F47275B39996BE603485B9A8C8CFC71550F21F1F98458BB29FDB6D1700D47603F64734A910E143094DC3B0FD1B035C6CA03C57B009F4E3DAC49EFBD95D522A130CC70A98145F1B670463BD70917FA0AA10514584F180AD500FCE41902D7C5D1CA1E0BDBA213998FC5050419E2C5D1A149A9739DAD7F64B778D1CF6349939CA95BFD6797DDF9E6FDB14B770874A7F29A8C3CAEED48CD08BCD44931B194E648FEFA354CC754D2DBD1C829DC084EE2292BAEF7F221871E783E5ADC8DC8B2385D24CF98BE75C43628D990EE4B3CA96852F83A300E8FE2A84C1D894B0625036BE83CA29FE97C56DEA2E55C0261C04D5646F2E18CBE6AEEE22EAC0FC9E1A29DB9DF885A612DAB313ECBDE8CA25DA4D689B2D426B55B4FE36BF4512C730F55355CB5A7A980117FC1E63E50BE364D54C91B3001E89C36158D266F36D403CFB90F9CF73B86FB7435FEA20581ADFD570DA4C4C48FC689C1B67B4F457B7EC1C96E9C484FDDC58A27954402CF1D8E2C44BFD518F6B509B8178D4BA3C1B7BD2D1E8CF79C031AAAC3DBE6A9DBD211796A733ABAAF7F43684391368C98069CC42D069815EAC5046E13A8BD6DD39BC4ED2D3F292DA8EE67003947AB77903D72F97E9BDF0C3AF3D916534400545A3075570626F51C00F2BCB9DC611F0BFF8807BBA0A5E8D28CA8B988EAD01B7CD106D61F5D2E72FA46F8B9C80DE2D12778EF8A59444AF28F101B243660CE379C006B8AF92B26C8F1B6186390FEC31183227FC770ACA96B4583773FEE1ED5B1C96949D5DC66F2E76 +ss = 3602269C7AF9FE28EA1019208DC3AB33BA09239D435C509903CA67345717E845 + +count = 59 +seed = A0264C58AB1F2CBCB212077FD378D340307ACCB31F1312137CF84E3D3135044D4EAE8BD38BC3E540A0C14D46458F6179 +pk = 5E451E4C8C85A192C91DF27C17C0684BAA6375B17586F8BF1EF12B91615BD08A340C58629CD45F7A392F10A04916C249AF956B180BC418B8A95F66B2D0847E79D247B430812D682B1FB91879FAAB68F25602579BF0D895073780007B7D61940239913EB217CB16A63EA08B29656712A21A32C754953335C29E769DF17125D84C32B3250EC96067B975BF524091EE4013A8B67A19A331DAF38A396A765F7820A5E3606A734F5BA854D1E6B6E70CB9EE5B00D4D18D928921EBB8048E284A3A05A3DF9469EC53195180AC9F869A8E8866D69019E9730FD6E672DB024B6ECB4DC55729024033703B6FDB7BBEEECB2345782815843B7B7664627CAD52038F98DB605FD23D24080F809A276419C876AAC69977998B1400395829656C97BE262E053197EAD738D9BC995145CB2713B5E181223E04497C8114EC5A05384AA31CB84406F93365D7059DD88DB8F94A8F068FCD10BE96E32A0E926DCA518B3FE9286A755F29D83CF667407758141B2011FBB1764D3334F3A763A17CCE33C2816AC79EC4CC4C2D842B004C352ABA419BE87281779300708BB20143A43413A2A55C41E36444046A3C021A4D7818DD146D1DC335C66152866597AA69A44F39A2814A4830E002672731D93B7FE5F77587B782AA279CC9807D6126392F812E83662D49DB231DD3060F882D71D2A0A4C94ADB3784BA1785187423D7E8A82F379EECBA7E6F6A67B568698AC3A2C0B096B015100BF9ACFEE522A0192E49880439CC1FA9B30FB7A10544E1867B0C34DA981CE6E660CEBB8853545994454815178C60B04DCA7073531AA2A5095F7B8578CD9889F3428A7D1C72B8FB320F304FE5D23A4291666BF7AA1AFB5086532FC5AA347DC29279A4484261614F2774C81374AA453024B68D384B01565A36D98B751297477A61780E98135375AF8EF68359332826DA01BA6A73D5263ABC659454F57D83172D0E515D3754270AD84543D995C0534788A6786927B952698ABE693BFBB358E9E393151AAC991C97FEC8C55CC407BF027DF7E2A505DB531D47344552321107B651FA4E47D4B389C5825E02CA1F42839ADA4D7EEA2CCB24A74E34672BF1BC4F33C88C3603A3FA6CE87AA5CFE30125F99E81550C19B58A807BA8A586415C2924A6E467CA8BC85A5400F910457E8B9D74A11E2668C0F1A2A1D0389361D09900EC6671206139380EBF9390B2401555BA0A57FCA36D2742F569A573096A2B442C5992C3FB65271479291F097CB94589FA15BF73CB9319D93860EACF1CD1BF7D380E03587CE3FAAEB6360D79574803B5C49841B74918768EFB518CA46B26929F68639EB8FA9F73E61A8B69B004CB5D9D92CF0DAC9ABC03171444A03409714DC1514931182701C19E242AE73B465AF335C8D3588FF468346ABF76604B6EF887A7EB8E8B44005BB55AF328155AF7928C732E7805010CF0A50EC68E29ACCCEBC4A39E2ACA10084E2543746BE6C81D482F6F3C1FE0D31C6A69329D783A1BFA0B43E289A2F843C71196809CA4B82C75C59C7AA5D311350AA55E89735D9C34E6982D17C033937253D9778CA31A14A9894C5D801415056552C410484970CF2AC86B374644A37976EC4A123C0603CCC01C6C6E994514F13885BCEB2F8B0A57073E0F3130DACA54C038DC1085402160513337AF2B6DD900B04DC3BDFCC90BDB +sk = 2D80A415A1B29961459E396204E5B5E65540A2A9AE9CD52D867A9E20952FC7565B66151653448353697B09723B17E3B1EF375A3E260A5869B579883FD1EB3A06DA5C11E493F4CC9D18381856FB2C36223E7214AD78A178B2153DCDE882451776478A4E06B392CE9B9D0310A5A134B42C37312A8932151571D85CB69D9333FF8685569568A0FC4568682EC2F5506F59742601C46DB34EFB9665B5815574518FF677BE1C0991B644B5931B112220C6EEE10C37C19316156BCBF354FB661635E42F6B26B07F9552D7B1A65D51C7EB6A132034BD755674DFC14345AA72ACBB85D4724B2BA14925421E570543AE904F9BC4016BC0389FB9922CB12A393A24DF219290DC506E501003C0AE8CBBC685A25A91147265207F93F190B12BAEBE7CC7EDEC476553762EA45E48694DDD172B6787B7D9719E89D77563C9C2CCB77CAEB23D7AA9181B82B6CBA09AEF1851235C7986194C8322280B4192B94262FC79CEACE4B894C86814D4929BD773E6A73FB0C7C36C67391A314555674CF415292055BB39319DCAA7B07230204C068028B3AE7A7223DF112032D60EDD1B6B52EA1ED13B86231A1EFB2969A691CEF0D219835A44E907BB0CD2CE6DA1442AF1460F2AB882959E0862BCCFCC6E3FC2BDB5EB673B218D6E9C5DC6461D8796945B614C81A68F9CF381D256BC1E63285141814077AF5F54C2C6B487DD29CDB1D2CE08F09122D09632AB823CB00D86A57F8933743F347C203894D0043F5692A6E12283ABFA1B98B39C6D638132EA4B94644E89A0ADC35816BE01A408F752B3215029D7661B554BD39ABAA906AF32F877CD4B28BCC217825AC897D06A4C233462FBA602A81321DB93279A19BF44131B86035DB3C4CA911F1FA30146F9BE0333650C3C24A5C85BF5E252413853DEFB040F8A16F4ABB9E18CB3D496A69B356D8206C106864C7464A7A7EC5E998B3FD5B18DF1D947E171272EC5AA1137CCBE50AE73ECC106250C0392A41A73A4861ACEA19257BE33CEF406B7EAC1796F605A709A4BC06BBE40867966E830E8AAC19AF626A4642A8447276F09CFBA6486564079E1AA38D7E179D9634E3398B743A1812F02818E979B4434A4516C2C77672600D5B7D3BB6D7E3253189C3694120DBE2519C62C80558AC1D522855682962DF611FEBC9F33FA27A0787501A42802863B5CDCC6AA81B964CC2C9B8081B63750A6358DB5566A0D3229D2989E98199855A2448F54688ED2487B816F5CD651206350FBBB5CDD995A9DB37B089CAA57AB0DEDDC9392EA1C0F99031A42C350CAB7B6F54C1E4ACDD0E28D7975A188502FEF055FEB5889BF87929B6006562626335B05EDFC544F10CBD927AB3C4C9E806700349B9A0099801D5948CFF3BF0977A9691A25AC880D593A36D1E5436EAB078BD9A6BF25BC3D6B5BDFA02AAB06AB5842C440E40D430AAD9311015A8767417B233FA8CFC64914533031AB39B845A3C50CE00BA0F1A586053768EA48293044F3A831B456320600404761C7E826A0B111AE37DB49B31BB3E9389BD3E354F08879906996DF2036AC49B9C773AF5FEC5375519AE7B8C61CE475AC544D13A5B421B8A686251B6D1C64F8A353406248B0430C8A3A308B600D0C9506D6509AAC9A460935645E451E4C8C85A192C91DF27C17C0684BAA6375B17586F8BF1EF12B91615BD08A340C58629CD45F7A392F10A04916C249AF956B180BC418B8A95F66B2D0847E79D247B430812D682B1FB91879FAAB68F25602579BF0D895073780007B7D61940239913EB217CB16A63EA08B29656712A21A32C754953335C29E769DF17125D84C32B3250EC96067B975BF524091EE4013A8B67A19A331DAF38A396A765F7820A5E3606A734F5BA854D1E6B6E70CB9EE5B00D4D18D928921EBB8048E284A3A05A3DF9469EC53195180AC9F869A8E8866D69019E9730FD6E672DB024B6ECB4DC55729024033703B6FDB7BBEEECB2345782815843B7B7664627CAD52038F98DB605FD23D24080F809A276419C876AAC69977998B1400395829656C97BE262E053197EAD738D9BC995145CB2713B5E181223E04497C8114EC5A05384AA31CB84406F93365D7059DD88DB8F94A8F068FCD10BE96E32A0E926DCA518B3FE9286A755F29D83CF667407758141B2011FBB1764D3334F3A763A17CCE33C2816AC79EC4CC4C2D842B004C352ABA419BE87281779300708BB20143A43413A2A55C41E36444046A3C021A4D7818DD146D1DC335C66152866597AA69A44F39A2814A4830E002672731D93B7FE5F77587B782AA279CC9807D6126392F812E83662D49DB231DD3060F882D71D2A0A4C94ADB3784BA1785187423D7E8A82F379EECBA7E6F6A67B568698AC3A2C0B096B015100BF9ACFEE522A0192E49880439CC1FA9B30FB7A10544E1867B0C34DA981CE6E660CEBB8853545994454815178C60B04DCA7073531AA2A5095F7B8578CD9889F3428A7D1C72B8FB320F304FE5D23A4291666BF7AA1AFB5086532FC5AA347DC29279A4484261614F2774C81374AA453024B68D384B01565A36D98B751297477A61780E98135375AF8EF68359332826DA01BA6A73D5263ABC659454F57D83172D0E515D3754270AD84543D995C0534788A6786927B952698ABE693BFBB358E9E393151AAC991C97FEC8C55CC407BF027DF7E2A505DB531D47344552321107B651FA4E47D4B389C5825E02CA1F42839ADA4D7EEA2CCB24A74E34672BF1BC4F33C88C3603A3FA6CE87AA5CFE30125F99E81550C19B58A807BA8A586415C2924A6E467CA8BC85A5400F910457E8B9D74A11E2668C0F1A2A1D0389361D09900EC6671206139380EBF9390B2401555BA0A57FCA36D2742F569A573096A2B442C5992C3FB65271479291F097CB94589FA15BF73CB9319D93860EACF1CD1BF7D380E03587CE3FAAEB6360D79574803B5C49841B74918768EFB518CA46B26929F68639EB8FA9F73E61A8B69B004CB5D9D92CF0DAC9ABC03171444A03409714DC1514931182701C19E242AE73B465AF335C8D3588FF468346ABF76604B6EF887A7EB8E8B44005BB55AF328155AF7928C732E7805010CF0A50EC68E29ACCCEBC4A39E2ACA10084E2543746BE6C81D482F6F3C1FE0D31C6A69329D783A1BFA0B43E289A2F843C71196809CA4B82C75C59C7AA5D311350AA55E89735D9C34E6982D17C033937253D9778CA31A14A9894C5D801415056552C410484970CF2AC86B374644A37976EC4A123C0603CCC01C6C6E994514F13885BCEB2F8B0A57073E0F3130DACA54C038DC1085402160513337AF2B6DD900B04DC3BDFCC90BDBDA43CAE3C4DA51D69A57EB87094A03CD3A9C3E6B4ED864CC691A60F0509CC6467A3CC8AA3239D4C52CE4C95AFDEFF6EFBFACAC10D294EDC0E7CF4535059BFDBA +ct = 2EF58C14C9258E8E8D59AEC0096B1645D2FC8A2E12F8BDF9813CD87A32835FDA60F096E647CA601C29C41D3331ED6AFF01978D01A0E7D9774211BBA0CBACB6226379A79C8B6575993589B5D73205F92A21A7B30B175CD228B5A449554A99E0C6E6547BE25AC510B9D1E2EAA8E7AF3A6F6F4D43B4887BCD7C5BC9C4C8A1AF737575802AFABAD38B7CA3EDCA440EE9F62F36F5566809572D5712BB03A1936A09E55365905763A631D6FA6D3C441B8B0C90FE04D2CBE0FBEB2ABBA2288EE38AA58E22453A7109F1E0999B3E9E4EBCB39A5763BCDE0290FA7213D9B357359E06DE0F6033433E78585AFE7CAB779A088A9DECF5619BB8C35DD51AACE7A5C3567162017853595D889D57AC96FA8BEDFF46CC035B15C51A72FD865923CB60F8A4562F9C30009EEC7BAD7A9E0C4188EA89A7BA3F719CA1E5243F94A95C2E3B74336D5BE81AB156528B104007F4CBEE6F88346537865CD9CBC40980462890FB2C994119A74A3D65078E24DED0F91718800B72B66629B4E8B534566EE45227A30EC724925066766C4D450AEB655D91B5426B8F2562DB6120BD8EBDF0F96758DEC90DCA1EAEB3479242E65F097EBC602F0AE36B4DD0FF2F7FC067A33B281582E51F93A5948ADFCDBFFF34A51BF8B3826EA030056CCEF16C9288CA0073EC8C50985EECBC97FEADA2C3139F33AF954C03ECDB4A01B468EA4EAE5FF407F27B6F26C1AE5FABFCD592E31C47F8E4567E3D985FE6D93FD7B0255C8D4E00497F93AE1DBF56F55037F2F5D58012757484E9785CC7052778D3198392CB3A7A1CA0E17A9DE34206FEB0BEBC7E454C90DC6351D3C7B8CBA681B8CA70993B19D47A8D12DDBA0105BA12441592FDF4205656A36BB261A42181BE2CB3C967A54C1BD20DEAF6B4882BE7DB475DEF1EEE3F2083A72B77F1C8766DF31C578B48EA5955752E836017213818DD12B0BA8DF7767C5CC432983AB3D82199DFAB7BD98346DF7BDE7D795B96F61417B768F188D3777EE7A17E6D957BC69BA16E1F345D44E4E18E5189705DF89C4BDC10DB1A6CD1429B10596779FF942A703349FFCF6D1144F105A0BA48E04D4A26AF9C9DFFDE23B8BC66B69AF9B7771DBA70A77ECE86564E266B330937921D695145DF0402C8C81B6F2789ADBE07CFAC8ACECDB8D6F8AA0B053FEEFAA1CF4503AB6C3AE6013B93EAFB5AE3C58EA090F1F26E8A96F5BAC73E53FF9FBA367DE06F0B98CBCE936C4C5DFCF19DA140DBF528C431A99787F0698DAE81AC2DF8F5BD837CE013618CB342F8234AC64A5B40A55FD1443F477215A0E8CEFF7A4C0646B0797CE22C495EFCCBD0BF9D6F46B5E2A4065F5E7B0E6196BE5BB6872D1424A1ECED35892FDC4BA8361C21197E5DCBCBB26D34C39E156B2B60EB9105B4172DE9FB8D5950D92E25B4EAC39272D3010792A39943F00C41804D2CC3713E7E321A044F726132689853F954E727FE0B822E5BE6BB0CBD39F6642379C273C0CF30B5DBA4933EF09E9A8C069089C57C6CEE8FEEB1F51692FA5FDFFB0F6AEC6E827E0245E72777B91BCF +ss = 5E039D591CFB128E51D0804E0993084FC92B0BCA9C0F2D84E24F5FEA5EFB3B8B + +count = 60 +seed = 99A9CDBFC674AB3FF2C64CDED7D697A6E27A767434A47AFF7C3FBF3C6A22D6043D27868955286A13EFE3DE36D22EC48E +pk = A20C8DA5745F754B89A990746EF771CF07A6D8109998936B282757F344A1B00B851EAAC27A9A7FBF480D44262868542128461598B5597B10CD3A2A26E3F941A9A4719AB2033FA1181ED08E3247BDD396A834E43F5700522CB307FF4B150BBA9D8B6AAB47361A7947B7A04B8D923202AB1A3D6644BE06BC6C1E0735D5D92821C5B8E9B9A83C343D0C456B181B6FA566B0E83602428B6CD33405A95ABB623A73299C5B4550A7D6C31D6EF81473489BBE457E744B5D1E39AB74D8A051951ABD01A6CFF3942A102A33080327437635C1C17966834340C26654A3F38616E5EACB0E489141B14E9D1B15B7FB30927715273547999B93EA2A1CA2189F5645CC4889943F3CCD95496B71F392F78A82AA1A21D66382C37154323C0616804F50125D6B0698E5DCA3E2D5658CE153BBF57E4B1908C92587B8C863FF4872E9E1963AE6C971C6AC3932BC974B9F15E5743EC069ED203C3624A022F9A7420BA951425A432B46C5E8BB666091D6F223E357CE96C55BF067B3C3F51ABE70ABD85A73A42233800853031313AE9971D280B3AED18489E75CDC16CBB3EBC95A8C97A768AAA6C0BB0DA7943037BF2B4A523E33ABF669C262941F326B11EC6BC8EF51B0666268D6D433B5190BB6996F65925A7EB0761EAB6906178BE9A923D1C61C0B7683CEA681648C44608217D6DC86441A8F423A9D1C288B32EBCD049C15EC151E256A322EE79E2C689A23A53B8D473F4C643AEDC646401761A7B75F7BD4145E837B756003BAB223FF1A74FEACC2E449B5DD9B5777D62FF0E20E4B395821474AB428AA2EA219BFA169B95039616598DAE0B9282C69CE329B534BC7AEA58E17467B1348B1AB2A031324BF835C985371B0F53877DCA53570199B23BC4D70A9425A32B54749082E794E10012E9B458205E106DA807C03AC3202A4350050815487626BD018706C69A6AB02FCB92621114A16CACFBEA02AEC424F82FB874800C61CC23BC6618ED75674A70A6C43C4068E2A7C9723A054967E4DAB09F337695BBB01053A7C5DBC764A0856D2B75DD4A94A9898AF8B95A62B487EC7FA9F00AB75325C9AB8248F1DB65FD7661DFB0B8EECDC2A4134103380988758379D0A73B0F348B00B4B13B115E74674AAAC2BA8C2A7FF440340B622B5C0BCE05CB601259913C488FEE540D7C058A28A0C28B856EA800D26A6A26F8BCDE7D78298314CEA6056B00A845321A245949A8C7C98D9F8821F1264C658A8061A3014249B7E522D586A54AD7A12AD805544247D74058BC9AC0F603A44AC5199BFFB69C1570C4076B345064EC00C5AE0D6A2308947593A84DDB6133BA40577B7B245C20B5D04C5D08281CA0AA10DA2A358386D2A4C048C89A2402C9150A7419C0A1AA17562FE786F00486DC82A9809DAB08F7B16D9432981087B6741269424598EAA99082525D5DB0DEAF1B96F55B41EE209F57ACEB895BABC38828B712724204744834303C496B7171FC458534F46892627AE54800FE6F11D06B6AF2B6B9259144F769B1F16C0586C9CAF01F8491251907FD213AA6C0BCE5B08F060124FB99822D964C502AC49C16CE9FB17EB0C91AF559947C056AF77CA687C4F675C89BE35AAE91584CF82202734379B56784FC5CE56E3852D89B052367D9A5D375D06EC7863E051CB44929F17A4656A2CB2C58D8D457897A1AA0D +sk = CA481DB6775F3D276A56CA0E60CA79BE147E63B6898F4B814C69A06F55111C9824CBC1C109A01A7BAA259DA651A1A51D60BB358432550BC1AA1CF3656E0667D726C69A39AE564BB99162C824634B8B8A706D82175BD9657EC09A308B51A3B429822667A5135FE4350A8B3CA10E8B03B6DA0BBD616CEEC0A08476909C6182EF0314B284CC3F43C337307FACF7B617348779D7493AE0A25D415124BC5D9134182169238CEA1A46A3001A8165713A3E5C16AE03A477207B99C2CC674FCBB14CA439FCC3032E4C2F1E92841D73859C76CFBE245193816D87C12BB3F12763174997760D6887A429A37F78C32CC1AC8FACC587AA235821C254A2341B7C6BCF8B52C908836B67D39D63458AFA9530FC2748DE4A698AF346F8B5405DC7B43B05953554021AF73C585B6EF248C07ED23116BAA18C845571823D25CBAE0AF57D4F6AB2473B5919CBABDD7B4CCCC1BE89150CFC585953389172590EDD61C3885446B500495247AED57A9FB1140CEB6B29F7F9A9F524106D8CADA3432C12468F9BFB9A50B920CDE85654C25249350F6760293DDAA28C771963497C4C5230C05862A4391330F54CADC3B0C92B9798F5BDF8B21016725AC8F565466464C2033872684608111248FCCF94C61337EB6B1A9017E342C29EB2B148936119797FDB2757BEF51A9A2601A00C6F0547B1831B1CA1118CD2E1CDD601A0B491C588CB5ED88AC36AE183848B9F87264CC5B020B2E965E5B89FF74C58CD2B338177BF1350AFDA9A74516A5845381E5FE132B4089506E8CDE6346FCC760759592345927C5C6A97045B0AD3973E806778759B35988953C80B3E7574B7CAA225C744372EE3042E07CCE978A3F964395D40176AAB7905A4BBA98250F594C5A96BAC41851E09F897DF0376A89516040C1F8FCCB93D44AB474C56913826C9E2171EF67510B53EB31153FC028B3625AA7A353BBE79CC76D393E209115DD00B5D6C98F80101705544604351CDB87715618343BC3FA227C1E9FA1EA3989390B02C59EC9174E5165239427592A2D973774CA62DBD9410164BCFD95834C11621F7DA54DC55C44C594785FB0016448F2CC39A05E01D8581658A2410CAA630347C3F0F6C86F344816BD13B3A04313A730F2DE9BB50659B642353F6463D2E2A1A78B722287616CDC266B01098B3544632152DB3B23938D67C63E51949496E13182326D5B7D70B81D90CC6C5D84D4E5907833A7A76D3850AC4993A696C4B210DCF352A32B4C83DC9114305308129BB4FF73A91D733303BCA92FC0083D95D32CA54557A6FF3C42C2BAB46FF913E1D39BA3F6092E30AB47F9985C7C439448C92B245259D388E291C04DE427F378011CA983B21B2BA8BEA9D6EB36001AC4FA5061EE1670066F9252524848973782774CFA795A2285A2669515D4FDA7093BC54439753FB6B4E6B781EEFF574155B2438E074B332417D751EAB1BA1475436E8FC1B670C3928A3553D2BCFD1A59C46EA2542884F91F98A38D42ECC026EBCF91258ACC99A50AE1EDC88B90C98B74C3961B70759F39B3C20175FA80386376CDE2B66DFF213151B800921AB6932B45B720932A540C79CCA0EACA0A9D5BC841C3ACF3C08096C0446326114F05CB09745EBB986DDB76913FAA6A20C8DA5745F754B89A990746EF771CF07A6D8109998936B282757F344A1B00B851EAAC27A9A7FBF480D44262868542128461598B5597B10CD3A2A26E3F941A9A4719AB2033FA1181ED08E3247BDD396A834E43F5700522CB307FF4B150BBA9D8B6AAB47361A7947B7A04B8D923202AB1A3D6644BE06BC6C1E0735D5D92821C5B8E9B9A83C343D0C456B181B6FA566B0E83602428B6CD33405A95ABB623A73299C5B4550A7D6C31D6EF81473489BBE457E744B5D1E39AB74D8A051951ABD01A6CFF3942A102A33080327437635C1C17966834340C26654A3F38616E5EACB0E489141B14E9D1B15B7FB30927715273547999B93EA2A1CA2189F5645CC4889943F3CCD95496B71F392F78A82AA1A21D66382C37154323C0616804F50125D6B0698E5DCA3E2D5658CE153BBF57E4B1908C92587B8C863FF4872E9E1963AE6C971C6AC3932BC974B9F15E5743EC069ED203C3624A022F9A7420BA951425A432B46C5E8BB666091D6F223E357CE96C55BF067B3C3F51ABE70ABD85A73A42233800853031313AE9971D280B3AED18489E75CDC16CBB3EBC95A8C97A768AAA6C0BB0DA7943037BF2B4A523E33ABF669C262941F326B11EC6BC8EF51B0666268D6D433B5190BB6996F65925A7EB0761EAB6906178BE9A923D1C61C0B7683CEA681648C44608217D6DC86441A8F423A9D1C288B32EBCD049C15EC151E256A322EE79E2C689A23A53B8D473F4C643AEDC646401761A7B75F7BD4145E837B756003BAB223FF1A74FEACC2E449B5DD9B5777D62FF0E20E4B395821474AB428AA2EA219BFA169B95039616598DAE0B9282C69CE329B534BC7AEA58E17467B1348B1AB2A031324BF835C985371B0F53877DCA53570199B23BC4D70A9425A32B54749082E794E10012E9B458205E106DA807C03AC3202A4350050815487626BD018706C69A6AB02FCB92621114A16CACFBEA02AEC424F82FB874800C61CC23BC6618ED75674A70A6C43C4068E2A7C9723A054967E4DAB09F337695BBB01053A7C5DBC764A0856D2B75DD4A94A9898AF8B95A62B487EC7FA9F00AB75325C9AB8248F1DB65FD7661DFB0B8EECDC2A4134103380988758379D0A73B0F348B00B4B13B115E74674AAAC2BA8C2A7FF440340B622B5C0BCE05CB601259913C488FEE540D7C058A28A0C28B856EA800D26A6A26F8BCDE7D78298314CEA6056B00A845321A245949A8C7C98D9F8821F1264C658A8061A3014249B7E522D586A54AD7A12AD805544247D74058BC9AC0F603A44AC5199BFFB69C1570C4076B345064EC00C5AE0D6A2308947593A84DDB6133BA40577B7B245C20B5D04C5D08281CA0AA10DA2A358386D2A4C048C89A2402C9150A7419C0A1AA17562FE786F00486DC82A9809DAB08F7B16D9432981087B6741269424598EAA99082525D5DB0DEAF1B96F55B41EE209F57ACEB895BABC38828B712724204744834303C496B7171FC458534F46892627AE54800FE6F11D06B6AF2B6B9259144F769B1F16C0586C9CAF01F8491251907FD213AA6C0BCE5B08F060124FB99822D964C502AC49C16CE9FB17EB0C91AF559947C056AF77CA687C4F675C89BE35AAE91584CF82202734379B56784FC5CE56E3852D89B052367D9A5D375D06EC7863E051CB44929F17A4656A2CB2C58D8D457897A1AA0D6533C524A32345EEFDADC74A3C6AD7E981832797FAF1068955B79F118DFF93588F1481D7CAB000E33FA07DE8DC9627A85E76FABB4428A3376E66300CF12A0787 +ct = CC18BE84B498262137E39C8C5540DE67A3474E2F9E94953081CAED1A428F3DC8FF3CF27DFFAB8278AC4402A1FCD4C285FC13F251BFBD2E7D5F1E79030BAD0D12F4BA296F374546A5C03A8D270FFC8093E276C62E887CF91BC7B17F2C37065982DBA258B0F8ABF6FB391D5A077A0167E16D046DF535A703412D4C9AE46467AB0DE3B2AC5B80BD5E1875E727DBD633E742DEE2A2166303F7998878A0F96A364ED5B92F9BB74505D8F8694613062353EAF64C50AA7098BD142C431352BCCE1DC9D874505A60EC6318B71158ECC0A6A9C225C19C52D8DDDF1C7B3984A3D90896E89D443398BDF1FBC2569280F22353A9307288B0D99D31FBFA3E391BF4B530165870133645310D41BBB4132A51F8A9F4B62D950CDC33C4C0FC231BCF79D90DBD78D8BEB891EEDBCA40FEF6136C488D474217A77EFA163EDAFB5A23A7D424233923F1E7A4DFF5EC8AD07FFEF39E6ED8F5733A7CA4A484B926FE4268728FF7CE3323E67B3891175677DBADEED1EE2612B58791A6E93D3A9B9662015916359E775BF6357F2ED5A71DBF6783873443BAE37E4DE66B14DA166A4410B2C3D1B0CCF2C26E7A5FC9252B7D7077C32B53BF40D745DB6D32D4C9D7ACB4BD1192ACC55F3BED993871547C361C986AB1B356296E17E34F69F41EE8C60CB97999591484DEB6C6D9EC55ADCBED8D21A6BF236BBBF1981372E6CAC0F688945BCCA2EBD6F76B39C705550B38A10BA9B3F8BFA789E5A80310AF1EF038472E960BD7C2FF20B94E347DD985A702A9D63FDF2CD869BD83D132DBC29E2495B29A8DF54CF7551A68541816CBEA53F3FBB7F32FCA6F9971A7E65CD9147BB81BA13B82DCF914254D7AF5BBB3452346653020870C33AFCA72F5DEC04EAC5B834F29FFE71A9B449306F04FC847421EAB8F42AA045F70A2748D56F69A1AFA39F9B24D04D57D7FF7257262F7E4833A50E617B8AC649414A74278225DAB5AB45B1AF3B65E5C4C8BE12E7CA0F2A74F881E7ABBA0B6402A315EB4FF7CE84C6C0F60309612B53C2AD943A5FC485F8766D493363533B13FFE17B9F8C279213E8F942E35858B3D19627394E5C71B74BD84593976BCC50390557942A4DBD0C4D413AA6B5B4492B957E61EA18C61FBB2C719FB1F79890F91B65BBD173C55B29F01853BAAFC6680629682FD16CF8413488AFCB4CC3C70CAA02B02466901ED472836C4384E8B7C0019436553D4D10FBE261CE1CD1B82494F047947C14F11643EFC41699A6DB1E7803382C51BA88783CE64E3952049897E03D181B4E17AB6AFD40A96AB682A97573CCB1E1B1F09D19547BC746A12F7DEB1447CEB4CD54F6F5E2305CA3F10EC3B4EDBC2B2BA34DE88EEC1218EB1276E1C29CDBD9615C3751B278077A05FE2A35863748207D62ABC17435C2DB742BE8FDEDD9EADF5C71258C906E68EEAE12D438A10F409CD9CBDC3CFE72D116B7C3F1D288DFD9A01899B0FAD6AB18FB34687204620282844DDAD79C457BAD5E03C6D6E6AEEBC7AEBEA18B60D34C106EB66A6B07209D2FBBC99506B0475241E2E6C722D +ss = EAE95E643381DF7A1CA1954EB0D529DB88A8001B8C1ED98A4B055936BBC6C038 + +count = 61 +seed = C799D57B41F28C5C446DFC58A5AC6499C4BCF3C162AFD2B09A16549826EC2A6F689E44BAFC4ACC82F5D6AEC23F4A3993 +pk = DB55C6CEC7B63C0721AAD84D2B6551FA941167C78A0C105ED9E5300A24BB2C8B2265251A38EC2B9D05A0635B2849A81A2A7C6F2660504D5602FD2763046820CA168D70B76E35B9641CE46A44F2A394F496DC32353C1A84302381E8D74CE4294A4A260A5B0704797567AE831D7C4410593CB7B9AB74D2042C84805C3AEA6EBD193A927C8189082333B3A5E96857E3970BE7DACA4C884D7BB0B3B9C250CB4135D0B8C90AE320DCB3C423E8A6DE79AD594240AE7AA036E320AD8807CCB7A1BC80C704C9532960864A9528347636B4123337DB7E2DE37823C6AE084418FDD05FF7E904211924FE5A370537762DFA012A2153AF96A46987776D245FDCB9434D66AA10524A3CA74E494C9DE919C8E23C3FF77C58CBD1CBAF5B8A69803A32E23959B2A7D9F808689906A0985AEFF5A8464A2AF64BA053A3C18D89B2CAE3814CD712484288ABF7655063C403F635D7A2AFB9D804E2E89677131BBBF7009C981548036726D25F05F004D605A24B7C2BCCC4294F065C013C8ECB242D25611B5C82BCABEB9E578758F2F3AD3F087BB6813DB1F3990C867A2E679F47F074FD012E87B3B6F51CB1707B9287D99FDBF43C8E58940109C376789E16C4A30B6BC34C870364192C555B81AF58962AE771DF477FF421A9B46C6E64BACD1A8A6D00DA4D9507212C910ED2C62D199C7E330A11982C514F27AAC092A5216B13AD54BEEBAA4049065A68D8CE9B1C969EA01599A71D633197BC33C2F6F958F72CCF14C7C09D973770F170F1F7BB9E458A00936D8677717F4A17655BC7A7EC56119779F7AA391D2356AE3A97D7CA04971CC2515154E148568C176A659A8DECBB2C5C449CCD914D3CB7431CB3A0A400A8C7B59B1CC770C5BB5B64E0932C61783C9979D6CBAC042216A0CC5800EA160C8C8556E0721D610FCE13992396C382E93BAD1514D780CEE046525C443FAE063C5882A01E5A73658A30864B1D6344A6CC46729BAB7810C46F5B480D309A263E30461769A55A2965BA6BA0B44054F211B98C6C2355150ACAB81881E5AC1E561A4BC4B39F9902D1027E56155F5D71B7CA67415185319BA769F88345611CA2C20B233DCACA9DDBA42EDB204576BD028A79BFCA57C9DBB0A54B933C970DE35032B9B51D00C9922ABB5106897CB896065FCA846AA486D9C27F5B616E99EA0ADA711729B75D86669645B9A223959B3C1C2F3AB6536D74295473C4C055AEF8C2CD2D321E9E73CBB872698B3A60667BC768014332083139D08C321157CFF1481F259ED56A7A3FF1717BB64FC951297C709A4AE3C05FE3910D6507AC947F944B970070570FDC9843A8A5BA564141F80F1654766F93048BE6297A1CB76C105A7BA3ADA06A42ED1AB3C17542201712F11824766C07BF14685AB0A9F69A15AD6574E59709D2411B37B509DE3B7FE5E8B0AC65922DF23E680C33141418F9551660467ACCC0C794A67CC530A5B130B4CF1C28747601D26983764ACBDDD30E42EB96125956A5870142574419977209A12E09AB3C5E8A22C1C5252527C90987A816B8830A757EC44B12E2E2BCBF19097D02B19AE47CC7BC99189370A1AACEF36415DED82FA7A63BE809B515F79F06612DABCA5768201C59E2C92EBA6D13B72C31648EE1D504EC3E89C8D796E77FA9A772499AEC973B63E864CE36A29DE99ECEC9695D12112C +sk = 90D7129B79C095B3063F53058A4BAA74C262A99C822894254A050409215FE67773C26C7A6DCC739D8406A6055B388204604C7B065C0CDCCC16FA880858A36D6200C6CEC473BF81B245E09C6E5A55A8D8314334C23DC14FD6A9C011A2CA93753AFA8609320B1D01FB9A2A4263DDEAB8D5A00C40346B8F84AFC7B945F521321103A5219B533F52BEE42256EDD1B9A526013A00CE07D44EBFD66C0BB67775D1ACDE4AADB7C98731931E54F5C458264894971DF5D0CCD93817BB77A2E7D29CE47ABA205C0971F34096280CC725A3C22A4EE24A9938CC2FCD9A670272A463C852EFC04388CA8CE86A8E9F63273AA208610C2274709C55922AD371C197741AF0526218E84C3BCB61355AB94D5C94DCBB4BC08986AC075E01134B4029C8C1D78F829796C1CAB0EA2075BC25B797D82A8E0385EF1094D0A2B1731624308487991A7164D8A507F2390F354B4FA3A225D5A46463145EBB57B98724F1D3CABF11AD4FDC00BFA267D8F3107CEB7DA37C060AA23E247C28AD0069D30681E37807117AB841F23548CAA02212AFBC1BC54297202FA549DEF55DDEB5BA4D10ACE2650511366EBE9C1D61FA9D5574C86C0714AA523CDF946E1FD259148A7E2AB5C21884314E3B8082BC210B5209CCB6B95EAA2EF62203A0B707BF9C5DB1A155169B07D41C0EDB9709744CAAA36622F189773AD7A59DC142317454D9C81D55D1C637876F104B6836A6842B87174290125505461EEA77D63A8DAD03C7941B69D7F66E434922E13A8182FCC35E51C9CE81978E35818504CB32E4A6DFC777227A5484409A38B2A1E2243110E84D024B1FE0E0BB36D4AAC0622152599FEFA177B294BECE391D47553983E420DE5462C72AB588B2934680A399AC40EF35A5E8819458E0A7BED1AFBB29A446ECBCD4E45A50176EE201526E314CDE085AFDA30226039CEB41A14D87256BF566DB30AC77ACB80B29B1F9D602E919707C96863304372A353771E1CE994241A12369FBF42BCB4315592724CD5085A589B1B4CA46DC49CD65A1247178151E455741C8B5D7C9CAFCB75BF27A5B4ED05B22E932B1E3BFB0C93248400E5485486E0C39FD5CCEC680C78E6137BE96823DECA37C6306D31C9142FC03EC540AC0120EBBE9BD5237583E1972D0C4676708AD35B559FB89BD872428A3E0504350451DD65F58BCB292C0BA437394DAE55E6DF13A8F41827939016A081935D1788C4807A53A011B89528FB60F386632E725B163E83E105324C3914F26F389DAC199A926A25A02624D9A530BF0AFAFA4C5FFE6A5EF9422E422019FF337D1BC2FE16A07D9A046D183137D477DDA378E17A95FC7E02ECDDC0D551724A4F36EE7648C9AA771BD15AE29B7259ABB63D0983917156EDE6557BE445735EC539B2199F9816C562842627CC83BCAA659075F5179ABDD1A7056D27F7DD96A6813A940A9321CFB1946E95C16836EF028106BC26A3EE450D8E569EEB23B70722BCBF828821648B1668E6E47869AFB16C0E4B827C4CEC3C4C9948A6C7F874968DC80160A811CD06D58A885D033210341A6F7907F53A82C98468F6BDB7CC7A60107973DB0E70F9A387673234D6665019676215EE4597C65A13A2636CEE74266F373A4E48BB1DB019BF44EBFB0A5DB55C6CEC7B63C0721AAD84D2B6551FA941167C78A0C105ED9E5300A24BB2C8B2265251A38EC2B9D05A0635B2849A81A2A7C6F2660504D5602FD2763046820CA168D70B76E35B9641CE46A44F2A394F496DC32353C1A84302381E8D74CE4294A4A260A5B0704797567AE831D7C4410593CB7B9AB74D2042C84805C3AEA6EBD193A927C8189082333B3A5E96857E3970BE7DACA4C884D7BB0B3B9C250CB4135D0B8C90AE320DCB3C423E8A6DE79AD594240AE7AA036E320AD8807CCB7A1BC80C704C9532960864A9528347636B4123337DB7E2DE37823C6AE084418FDD05FF7E904211924FE5A370537762DFA012A2153AF96A46987776D245FDCB9434D66AA10524A3CA74E494C9DE919C8E23C3FF77C58CBD1CBAF5B8A69803A32E23959B2A7D9F808689906A0985AEFF5A8464A2AF64BA053A3C18D89B2CAE3814CD712484288ABF7655063C403F635D7A2AFB9D804E2E89677131BBBF7009C981548036726D25F05F004D605A24B7C2BCCC4294F065C013C8ECB242D25611B5C82BCABEB9E578758F2F3AD3F087BB6813DB1F3990C867A2E679F47F074FD012E87B3B6F51CB1707B9287D99FDBF43C8E58940109C376789E16C4A30B6BC34C870364192C555B81AF58962AE771DF477FF421A9B46C6E64BACD1A8A6D00DA4D9507212C910ED2C62D199C7E330A11982C514F27AAC092A5216B13AD54BEEBAA4049065A68D8CE9B1C969EA01599A71D633197BC33C2F6F958F72CCF14C7C09D973770F170F1F7BB9E458A00936D8677717F4A17655BC7A7EC56119779F7AA391D2356AE3A97D7CA04971CC2515154E148568C176A659A8DECBB2C5C449CCD914D3CB7431CB3A0A400A8C7B59B1CC770C5BB5B64E0932C61783C9979D6CBAC042216A0CC5800EA160C8C8556E0721D610FCE13992396C382E93BAD1514D780CEE046525C443FAE063C5882A01E5A73658A30864B1D6344A6CC46729BAB7810C46F5B480D309A263E30461769A55A2965BA6BA0B44054F211B98C6C2355150ACAB81881E5AC1E561A4BC4B39F9902D1027E56155F5D71B7CA67415185319BA769F88345611CA2C20B233DCACA9DDBA42EDB204576BD028A79BFCA57C9DBB0A54B933C970DE35032B9B51D00C9922ABB5106897CB896065FCA846AA486D9C27F5B616E99EA0ADA711729B75D86669645B9A223959B3C1C2F3AB6536D74295473C4C055AEF8C2CD2D321E9E73CBB872698B3A60667BC768014332083139D08C321157CFF1481F259ED56A7A3FF1717BB64FC951297C709A4AE3C05FE3910D6507AC947F944B970070570FDC9843A8A5BA564141F80F1654766F93048BE6297A1CB76C105A7BA3ADA06A42ED1AB3C17542201712F11824766C07BF14685AB0A9F69A15AD6574E59709D2411B37B509DE3B7FE5E8B0AC65922DF23E680C33141418F9551660467ACCC0C794A67CC530A5B130B4CF1C28747601D26983764ACBDDD30E42EB96125956A5870142574419977209A12E09AB3C5E8A22C1C5252527C90987A816B8830A757EC44B12E2E2BCBF19097D02B19AE47CC7BC99189370A1AACEF36415DED82FA7A63BE809B515F79F06612DABCA5768201C59E2C92EBA6D13B72C31648EE1D504EC3E89C8D796E77FA9A772499AEC973B63E864CE36A29DE99ECEC9695D12112CE2F60F27DA7F318EB94A74B437F8E0BC9513E9BCC38DAD99C174C1D75E0145F1E2F8D320AC3CB0C52EFDC753282F092BC39BAF4A18783A48EA031A191865EB78 +ct = CBEEC8C5D1013221D499DF4B687FC8DD032863EEE2A09D95CCFD7CCB41BAC0B0A3122FDC92EFA08BABA7D722EA15C19BDA3F4977AA8AFEBDCDFC3F0E1F4274680048F9E060339D3245E7CD07C368B0A132C6AB6C5FBBE6FC4D87BCED0AE4504A62B3E81DB9F586D2F33C61AB9F04939946AE1C38C0D34D97DB4097E424BFF268243D2CDE37211A073BA22C10FA87BDBC19AF7A7F5F07CE8745458F9EF15134BBFC4EEBB6889D668111C83AF7ACF73E63291A25A47650D2E0471B020B06BE0C34B191550CE2D2AB8323A4F224212EC47FBEEF84B36D17E593E4DC3441196F5B091DDF778C6127A9AB08F6B84997CB057BBA3508B7C31982A0A8A017BFB99279BD375DCB94D8F3AC4C6BC61CB3E63CB1FDC5CAA637D1C9330ED8A251037075D44375450E4224176F475A48854D58652637189D2DDBBE38EF9D34F059582F8796066D8D18362A708190AD0ADC3E91F2F51421EA2172E0170600BFBF23730C6CB025ED8CA4B9AE033F6CBD6EF7F69A7DE1E6F711F42D091A79908C7493AD1B68DED11F32DAA940CD4E92BBAC9EABCE85B3FEA56828A10E01847B92C64CE819E72F62BE4AE0C0F4B6FAC1ED60FCD91C166A4E0C17C13D52075F41113D03404BC422FEDA4B37F990C039218C217B5106A095587E2812E66437D8786B8FC9F3365EEAEBFF0C2E6FF6848F0AA570033471A9834EF83FE62884C2022C8934133970DA578C441787E17423EF9CF2BC3A40B8CC481FE29B8380AF23C42E2A808DA7E5EE6D1D7C96B13031898A8AECCCE1928C49C0A81D47BEDCD8CC53ABA9E77BBC83174AF15C7DE9869DA8FD3B924850FF97558207D7134EC48B9FF33501D4021B6F89208E8421BC07F1D37519614BFD0FA4FC195D54D2F05C118681B2465ADE4375807C5314CB21AFE0936098F6ECA70294F6D1F6DD9E512E0D87CDEF023E317CA27D2F1B373BDA5D96733379CA70731D3710FDB7592DB380CC230E13ED0DC3FE8D8CFE15D730CCF7B6E7151353C21CFFC8B53B5DC2BEEB3FC3DFDD1E4F3EDAD81EB1745353B47668022AE0FBEDFC534AE4248286117550B9BDA0E5643FD95B3293DEA31D9F4F2EEE4FFD4FB3964855E9947CB520EFC349B28B42EFEF607C416BC4A339F04D6EB7E1743F631F061CF4FA5440CA2410AD3088F08190A05FAC211345EB0EAFF7DE7E2294A58B7F27C792FD39DC3B8084F390DB55548E45EFC9674249482140B33C8219C7EDEB1ECBFB17C9F4E07A99ACD348628780138ABCE0C15C96840F04EBE7176090E13D0A08990096149CE1F07C865D35E19B9E1873347D25C03ED113CDBDB3EAB39532247EF19EA00361C4388EDAFDE0B12BEE641310C8AF0C184E3C2D8D5BF7769BAF1F7F6C6B7C7CAF0C1E40E6063E6E601ECE23874E7016D2FDC98ACBBB62B1230CC7C1CEAF1699D004E63F1351501D99D6F23760003C2BCADED3A44CF7B0B572243D8E137DC4AA785ACDDDA836D986C1DCA0587827ECB85B579241C5EFA06E30AFE5CD363C2F63C0E3ACD503F8277FA867626845E6578B40E983 +ss = DFFF52CA2AFC33401B4F72F5E6AB5D9BC21C08A6843FFB2CED24775D786B5A0C + +count = 62 +seed = F7AE036A0176A9DE9A036A542DD2840033277C44AE936D10B768566216DE9D4395CD42B116873B69D9804BA6CCBC05D5 +pk = 7A2912329482F244226AE33507BA8FC8366736352380B346CA39A936190F09576C5188C5E82315E3532F34D41F1B50BCCC42C1138802CCD5B50A7846FFA7BCADD91FE757AB7FE30E873BA233E13B21D25461030593433F4F66482D94B916AA8D1B4B8D6786926E9364CB579F52236218F199C3925142B53500291A3164516FABB941F98F0DAAA1E2D619C9622D649A0408AC02D5CCB9B787C1F9B196DA37020E362ECDBAB03CCCB63B659C6347104074B1F8254499C8452364726B1294669A3A24AC8B487752175B30CBA68860184D5F78B845B107BEBA80F8750475D059DAD57CAF827878B926FACBC00B54388F24B7B431347E334FFA046C45E234124C958CF66023DCA620E1400CD5C08B89554A474D7D04086E5CBD0D051C03C4580D3442A575255C833026BC19DD301A70367FED300EF27779D2A49819A370519C7FC404ACB3FA441A931C67A3033799519C883BEA134242F35F92393DC134BCE15713DDB33E252B991AF10C7134A8ACD09408C8CB2ADA36BBC25224E8867A4138ED9B4DAF403A477321614B3EE5C7BC2281441936B0B05513C1525421871D007346BCF52D6E09B756B4529BB5480AA3165E617CEF41720167707F35A4415975A62114C7918AD83BBD8905A283D14D22B2400CB29FB1E102562CBEE5A9C10929229F8C60A4B153C430A361812E75B244E4C3954A945459F735D45572E83B505030C13867C720567FD681C539D7094F5558DC5A86DA79B38049B0A45A1259713AF2C1640EE0279BB7191F0C0EC59C2F91184CA70A2E8B7576CE493E32F2C549C4BAD6C925039C4C57114075281AC7631FF4D94EE0723C3400CB2D73C184489AA5B440AD470CDE548F2F70903D08B9B4CB6DB68A5D4FBB049A5A9727F50F9E6C59295C62BED7182CA96D6093578DD014F7EB0B121AC6FAF917FA9B47F6650C6C7336D8848DEDB92A0F70971E456E9AE625CFE266B1000C4EA6252DE1CE20C014BC161FEF405FF327CDDDA37BE4919C2A0C097D6995B0EB743FF66A548307CEE1080A13841ED12333E62EFF081514A5915022C550C6021A27889BB0421DF3A709AB2F9F3B0C0F6019FA8810CE3A9C37F53CD651ACB4E5BC1D8B231F373B7A4CA6723A9710681016943F29697B09F6ABFC1C60E8FC4C201A9AB05C260D2452C83B88423B904DF74F425A9B4D116DE0D059D96779D61017C2E984C2BCCD6159C82DFA5AE7BC63E59304B1105CA054A71D753E7E583742E715BFECC80E51245FF53C16854AE0AB41C581402221CC8834A5F4556A84C19F6172C7C80C759299A42C71BD67040A29185A45C14B91B56A4AF9178E0BBB0C4C197549B5C9765A8874686C63445DEA7A85D43AC4D0B979B4CA13A80BF8DB634A163FE3F4327210A7A128716B9805BC1920DD322B15C74FC722A126069ABB8C95BD090F84497D832A1AB72358D4193B6542BFD627A139374404DC1998416F46054D1B4B538E778D6D0507FBF5571BD01CE56362164793E58355366495AEC80EEA35463C4044B202451B3604D6AB96ACC3617ACC1015379564D6A5FF1A6AE4D802712A94422A99D90988206776055545172B0282B5162B479D748A2E9D22356AF11DAF2629036665EED0642044B76775CFD9417DDACFDCB371AAEF7ABB3C2CFDCA88891DBF808A90028D4F12C57E4985F7 +sk = 0246C2025246911B525E6C3421584BFDBC83D73AB936E76A26236A85215C78DB7DDD010C2E038E3DDA69B5AA2E9F4997D8589BDBF918BE1C046CD518E6958AE6925146009D185B53456B5E16D59257F20CD0F6677535510D02602D5BA5B61C440FA07FABB1B5FBB38437E90522665776892EF205A41A1A2083902648844DC9D65E633266AF871481F036A2888D3FB9901355397F37875A4494777C781EC40478D09A820204A4115701D25A74B4BD91676EA6391FA160617C80CD05B0A80E040CDF22B29978CA55282F2C40316A35433DCC8FF7CCCF4280C0B11C548B5CC08FA45BD0760CE03A02F25689D0F057FAE44CB1574C42E760CB331C2CE4BE16823DBB2870592BA844F30DC407298590A088425E023B856E106437C6074547260A856E648CBA07E51A23E70D7CC65656B4692EC24277F04905C4AEEAAACD36341C705B504CFABA73201C2745AB06B056F1768447981E0D676EC904698EDB230F369190D8C1DADAA5CA59001EE8A68C302F04298DC5700C56B2B577D89CD9A585B239089847CD3E96CA80D928867B27F3657987724FF9031649C246CBCB4673F6CB8544150C9975A13938C89A68CD0B6DE5237FC8D2B7A6BB94E0C0856F00B821636801E9AC84F35276065EE4108BC1D755C1C428566A1CA3762D050458DBC7093567A4465453AB8656272A3C03B4A3C55929271437724471D5D4926109C9792BA49D117813948106D27C33069EB3C40AA8370B79E23F35934AC28666FE72B43F722151F3C26C96CC3B6A40D9E1876E55970F252811070FEFC00D70A009E4871F136A08515AB239C33E2DE638C4260D0C89CFE30B8F8E5927F2C59FEA3947FFD0BD636B10876C3C387C00E15469B42B80BFEB8681DC7715C2B248CA6FED92A9399B72D1023F9507229593BD9BD936A0F6ABBA09BC3367782370B60D9CBD0E8B3D5744101C8CA97EAB822FA4CC399B5BE3195CB1E3C9260030AF60BBE3295C4DE898C502543589142CF48DBC7505EC9A9D93CB6DD4C9678C1CC0A082C5631A255142603DCC01FC07C27D628D89F09B473816B5D5171C18A3F9737BD6D3420D4BCCBD3A5624A2686E54062CE4696E061C83BC2586F1A618639E51E63BC6C64825EB50D4F88334B29145BACC49E28DD564B7A578217FAC230AD00A44F3ACBF8753AA572D66E1AB9198CECDF9BC722455BD267FAF98424EBA4031C3BBEC8298A9388CABC6B3BEEC7A7FBB1C814811117A9D550407C9E6099CEA65ECE641F69454B6A0CA9BF86A3DD472F7C0A7703C6A5B25464C0B091B29258DE673220857878434EA14CF50054FB2E63547E9BE15107BEB7A78CD5C00CBB1462A0347E72B51A15CCB5C333894ABA511295B37C97C7F4C2EB6D97219559B40A67310F457108015AC1B8E3AE15ACF85689C4058EC8A0BB18B75615011F2701BDE8BA70986B39D3368E1F978675A49FBE8509F1239A1C88F1DF4ADF0AC8B68A87E2A403373FB808A7B1192371C7E68B80854B0E4335739090B953A2B67999F9878A32415B78C22289EEAAEFE3298FD38ABEB6ABCF5A55BCA388004E46375A729CC45926A7C3E3BC8B4E2A2B196AABE5651B642C1CB50F666A1BB6DA4D1CCE8C6344356A68DE044214453D03B5C7A2912329482F244226AE33507BA8FC8366736352380B346CA39A936190F09576C5188C5E82315E3532F34D41F1B50BCCC42C1138802CCD5B50A7846FFA7BCADD91FE757AB7FE30E873BA233E13B21D25461030593433F4F66482D94B916AA8D1B4B8D6786926E9364CB579F52236218F199C3925142B53500291A3164516FABB941F98F0DAAA1E2D619C9622D649A0408AC02D5CCB9B787C1F9B196DA37020E362ECDBAB03CCCB63B659C6347104074B1F8254499C8452364726B1294669A3A24AC8B487752175B30CBA68860184D5F78B845B107BEBA80F8750475D059DAD57CAF827878B926FACBC00B54388F24B7B431347E334FFA046C45E234124C958CF66023DCA620E1400CD5C08B89554A474D7D04086E5CBD0D051C03C4580D3442A575255C833026BC19DD301A70367FED300EF27779D2A49819A370519C7FC404ACB3FA441A931C67A3033799519C883BEA134242F35F92393DC134BCE15713DDB33E252B991AF10C7134A8ACD09408C8CB2ADA36BBC25224E8867A4138ED9B4DAF403A477321614B3EE5C7BC2281441936B0B05513C1525421871D007346BCF52D6E09B756B4529BB5480AA3165E617CEF41720167707F35A4415975A62114C7918AD83BBD8905A283D14D22B2400CB29FB1E102562CBEE5A9C10929229F8C60A4B153C430A361812E75B244E4C3954A945459F735D45572E83B505030C13867C720567FD681C539D7094F5558DC5A86DA79B38049B0A45A1259713AF2C1640EE0279BB7191F0C0EC59C2F91184CA70A2E8B7576CE493E32F2C549C4BAD6C925039C4C57114075281AC7631FF4D94EE0723C3400CB2D73C184489AA5B440AD470CDE548F2F70903D08B9B4CB6DB68A5D4FBB049A5A9727F50F9E6C59295C62BED7182CA96D6093578DD014F7EB0B121AC6FAF917FA9B47F6650C6C7336D8848DEDB92A0F70971E456E9AE625CFE266B1000C4EA6252DE1CE20C014BC161FEF405FF327CDDDA37BE4919C2A0C097D6995B0EB743FF66A548307CEE1080A13841ED12333E62EFF081514A5915022C550C6021A27889BB0421DF3A709AB2F9F3B0C0F6019FA8810CE3A9C37F53CD651ACB4E5BC1D8B231F373B7A4CA6723A9710681016943F29697B09F6ABFC1C60E8FC4C201A9AB05C260D2452C83B88423B904DF74F425A9B4D116DE0D059D96779D61017C2E984C2BCCD6159C82DFA5AE7BC63E59304B1105CA054A71D753E7E583742E715BFECC80E51245FF53C16854AE0AB41C581402221CC8834A5F4556A84C19F6172C7C80C759299A42C71BD67040A29185A45C14B91B56A4AF9178E0BBB0C4C197549B5C9765A8874686C63445DEA7A85D43AC4D0B979B4CA13A80BF8DB634A163FE3F4327210A7A128716B9805BC1920DD322B15C74FC722A126069ABB8C95BD090F84497D832A1AB72358D4193B6542BFD627A139374404DC1998416F46054D1B4B538E778D6D0507FBF5571BD01CE56362164793E58355366495AEC80EEA35463C4044B202451B3604D6AB96ACC3617ACC1015379564D6A5FF1A6AE4D802712A94422A99D90988206776055545172B0282B5162B479D748A2E9D22356AF11DAF2629036665EED0642044B76775CFD9417DDACFDCB371AAEF7ABB3C2CFDCA88891DBF808A90028D4F12C57E4985F7D4BF608793939ECBA27DFF5889D4D921C583999A57E20A48085AC549573E6ABF393308641A9A4647F230201E1389624A296B55192A9819FCB19AB77C25F95445 +ct = 3A3E99CDFA0AFF52920DA4CA405CB98307CE61FAA8BF07561C783E8D1636003E6BA1A0E38FF422D21D7E842D98ABDD2632FE1209D662E08A8E3E1459DE3D8F206C6FB378019611CBEE5A835A23AD221F07574E9AE19DABA2AA1E619D25CB73F7AED357D2A68BEB6CA21A905DD876D55FD28B251C94121F4934E8046DC44E31821E44294AB66A42BDC3A0C87A74352872FADB4CF156977B539666718B51F3F725E0F4BE96AA399DFF16802666ED4DF9CD2D83470B90E3BD5B7CF395D029082F0923285CED2148A983AB4D11F525CD9043D261B15EE0D51287E85DB7FDB7215C3363E5E6D2DBC93A546AEE48705A40BB9C8580864AC705499639E7536DB42044D7DAFC6D3ECC7F843CC1AC3374EAD10F60A0F7D31414C3893777A43FC2D9F99BC46D175640A105A0E297EF62D8BD7507A54060ADFD1654AD8446D9B359E6C331D9112DCA7AD22A5A4319EC7FC9BC4ACA3A32CD5F4F34FCB1035521E46E52FF8538A4AD7EC024E9C49F03A6720C55514FB874553875CAFD8924DB711971CA4BCBF8F29BD7571CBF318FAA88E2BD408527A627A1268C96979505FBE85D47720C01DD721795C3A75ACC8DE5184E8EEBAB9F1FF4C4D12FFD3A7C4625C23A2893B1A4C45F4544530F3E9AC72709684B3B3DF2E47E405E84A5339073AD3BBB6C20D9E2300998BE532DB686DDFA4D8EDDED3F5EF868EC100B1D517197313165ED23EC974880D5ADA8D915549121EAF1F0851D9572844D804596573CE5C1A32D2C7BBA0E8FE1190FFE1AF0280E6D781DD31D767FD38899BF7D46BBAD2F7AC2E4CB5FD6E949E259E1EFF9C8A27D8C9C383BB02385C47635D7F631438C560AFB7E4331F1FE6786B6F07379A1CE0A68FEA618616E3F1E5D59C9928C98BA8F00EB1011641F0B2718AE378E4F9CE04C5A539AD899988070E4FFF6CAED2F74F885FF9541BB6B3B713C12FA642C86B075489D06EE26EADC5DFADB91A619E9BFD0BC00B9645605B4B10E5E4029CD30D53C98CAC5C449014E460674F41664F953F624AB6D15DB60365C4FF87AF8993371AE1ABE09428DD55A04154D5A6183D7F2FC1F02B714839A5C7A1EF97B96A3C77E5032191468C43A43107004857F360A0FABEFC62EEDFBE21FC76D148FA89E435CD0004460FA6DCA391393AC3A2E4351C6DA5D9C504E49E8A3988FCF260DCAA781B2882897C6C6913DC72B813634FB39A67C7D341CE8BD5494DD499ACC1824F7585D9A0AF542B8C8D50C6CF42BD79DE25F4575AF276544A3A55B11081CD798053B56C36BA4D0F4BC68E197A4B6BFF7F00E5A3EF02878D5333C0E35C4288A541EA49991C5652D6B751307A15CACDA2774D676EC53C0D36535ECA12BD7428660FA8A8C1C1BE54CEF68D23DA94C0BF547B3EDF5B3D4BC618A5CF67D96A9E8F71839098404573C83E3B0E6CD698B1344697BD4E348A5D56EC3D87C32A1B083C21845251DBB844B16EA2528571E42B631F5A48698658AE63ABCC46E36E721997CDB747F05492BA5701DA2848617A84087D31D040F1DD2DEA513AE87C4 +ss = C870A7BE3DC7BBF5836727E5BD82CF977B1332E7DB276473E4029ED95204ACDA + +count = 63 +seed = D995D38F934B6E1A7CA77C9522E3D037676CC939B0C8BD4B84394B3DC91A791F09D2D97199258C9943DA955E7F7B26FC +pk = 8E892A62437CE84445F2E82B495C9730FAB393DC6F3B36BB2A63759A79AE27B162250076A608522440AC1E04630BA766B4C256341C6AC967B36E6934DC58CDA15621827B9558076361192E89708ED88A71826A20E8EC948B9C7915566C70A7C15A72C36ECC7A3CC644EAE696022657C53500A0F13A8AE50FDFA432D8D2530999275E5B9C1D341FB34B8A5A7421B7D290CBC3218486B555C92572BAC8F1085F058A87FD48796824844553261CA11F06978A03F3A8D68657C22064AF83166280AF52270E004731D20B18982283E51CA3DB7A2679DA6FB0AABA1E75A2D283ADD699A797E1BE93502C6823007BA5B9760A338768615B671BAEDC6A6A6937B9E1C35575776A4A791FEC7751079C6683BA29EA28BAD199175B9629C44BBF219CD88A19F1089AA551946E58032A9C9DFD29BC4CA3B654F494990CC02BBB8E1280B54BA3920EF98903F171C27A5C0FB679C8E84774F22136E89915A534D973733410A96280A3207407235CA0D81A636A35B9DD628DEE9A64A12918D0DC6D4C600989168A163730FAB8C78E61A57970C16C813B791A0EE9F625C438CCD1A9429A93062C4AB38DA5890188829AD116A6F1564A43A2E4F3BBA3712207B65E701995C99B29D691C86BD9844AF2471EB5CECD934F764629DC25839C809432E395FD8582CDA980359246EEF0637B9771FA5853099007F173C8598164DA69C8E67A910A50B9940B213547815E0589326B02FF21B89BC4200219652DEA6CCD59883E29127E2ABE3787738B124D839A67E02195D64989520737E3AA99C6822F2C32249256C45455CBD931A5A1FB27CD56A21E22B51C03217AA387E151631CFA445B2B77EC90AE01828601961ADA8A8E6192104F02BA5064C4EFC27CF2DC3353FC98F34BB947B21EC5235FBA6CAFFB6BC6B1C09A783AB8EF14C4921A28A3896BAC07AE8BA98C117B3624E01ED0496A8C649A38A33FB679BB535A7D1960028CA6C8BA825178E74F0E50B5D74C2A9119B595B863D0375A3DA173C63A03D8C60A8D613CC08064588890E3894A9BF4580704038841526AB84E27CABC8FA4CAD6DBBDE9B53017F100778478B86138FBD6BE713A7E695358538BC4CB5A4FFF531BFF178BB16ACE5A295CA0340985F34267A3A931998B29A36935D3B13AF0631CD37777689CA0B43B9208AFBAB88EF886A8672B331224C66C6086B8B15A8EB86107FC0AE260BF08F970CDEC98ECE9A197751B6996258FFB6DCE05306380770DC63498E9B5D65ACAC5A179D8946B27630525B39C3755C070A120C9F468AB3AA8B1A48848081B888BAAA1156BD600733BE887ABF962C46107C432C34EDCA8E549977D9A6F7EB77EB9974BB353896E8261502820F599257CD9C2852328B0FBC5C2B98658D67E4A636575A46E074A1EFDA2CFA50A0594B0A421661D81D95A9AE0CA1C037532BA7EEAD089961C29765C443D428BF20767D1F08615E85D0C08B0FA5076E297143249283C13486F61A4D9D39780624055D6043120A510D4A686F9B490C74F2DA782AB42157A00991BE019E093A509C0C00B7C1E6AB611DFC4373C640A2F488E7632BE1289666206CBA2B096A479B2140C6AA301BC448B13B6839447C4675AA1BE46EB6ECFCB4DDF2569B2D79ABE93FCEAFF0F0FF88688C870D19759A41D3D361A0CEC73CC908F52BAD8 +sk = 34C91F6EC981B1830501D8969F8847B2C6BD5D5C43DFA044C43B551E610D5675BB7E7C9E393B411E69575301BF4EF4C7FD0B4B59E213905A254EB5540ACA856C370DD28899541B725091C23907C04390AD32A56385075F42A7545672544FE177B74C7ED99507E4D95DEF7C4A9F84C9687B9BC318A23EB452FB7635D5201165A47391D21A7CA732FE9B3455C44EE4E54FC3A6518D51402CD5A2D49429B9C8815CD4B1A22C59ED368ED6C7A9DF83B958CC83C4654C5CD040245543431C0D2C9091376611CFDC2EB9181B21C8417E3931AA2B1141C1051CB82ACA4BBBE6DABDA3356BBF4962C3F883D0578580477AC56353AC7524F3855DE2B00967B7BEE0668112D51CCBC139FA73374DF2685A3CC06838B150F92A64C17772053DE2B05CC4D51832B8A2B8428436D99E1F2484B127CE0D861DC8A11AB0B0019E0B3439733B36A7A600F4638D820BA5624B445349A86465E1B25DE787207DDA0B629CB472D415A42A8BA191B76B5829D4D987A2B0C235521C187A0BADDB603D755EB37396CDD57FF76276CCCA997B00CD481587CB8728830021DCBB8478A267B744A5BFD08B4ACB2C1E726121996E55B60D40F6975637831C392845D6823D4B9092151149992794F4AB29D4164A44239F07C365A87ED9786AF7A57AC0BC0D491018007B6BF7705A21B082D1E040A4F4C25E329EF9A8518956044E7683AF94728487A4F95305D4E15AAD45C040F1CF9C442C519B2AA47A4DFC29063243C21F8B838171701B4B73516944EFC4B61FB5BCA63C3ED12A123F55B832E6C312E8BC48F145D62953F5901F7530068F2C9C9F51CA8FCB342852936D414FDDC2C04F551C827071F99C7C24C991F9C97E10E051694C86789A9442D79092B6547D67AF70D8C8B074CDBF854718A882DAACA3B8EAAD0BB1C2D3E859D3EB03C0A23B290518EF88CE1BB02FE71399EF71B380EC1AEC4C7C6BF3830C1B15F7718D0E471D10234393D94FBD3305ABD09CDF070A0ABC09D7497D2F9B939794B923EB3F28B40904A53A05216A526132D9F3CC64606B40F26434142645D79481A8316E8CB0A9321A4C530A0AD139ED5953168A4AC864C726874E1366AB09A249F251CE5B1A7F5CA60AD66375BFDBCFA3D7AD23A13649C03327D409FDA64581CB00A696557945C58E96C1C889BE648C4885958ADEA79AB212A0BB15506BF5635E437ECEE47B60032B4273B8C96806639C87031B6E23B71996B4576626124281AE4CA0A8FC081E1C91667967B25F76C4F72624CB29BD0A865FD67A4DBF14ACC7A09871BC7ADEAAB37B298F12B60B6372B741681627E4C8346C0D34392716EC173B1B711B1C0A1D010DCA486BD5167223658A5C55BCD0739DCFE30DFCF9BD8AA45B3CA0B5A90243547767A1843E4C87922031819EF9249800C6DB8B0270F9CB8F2624ADF4199741870B0630E1BB1B325768C79984D5E33283A991BB3C98B6BB8BE0EBAAC47C4310C51EB565BABA36BE54F6A3151A104911C38EF78E61F1654EF35B2C836C2321A52FAC710D6B03811444DE5B8403569C8CE0444EF615DAD54AE5649E68AB437C00A2C9EA9B18F59346D8B2A5C6582D763730BBC7F24A7EE7C23607C0683A2826FBB4BAD4A58FF6E3BB3122BC8E892A62437CE84445F2E82B495C9730FAB393DC6F3B36BB2A63759A79AE27B162250076A608522440AC1E04630BA766B4C256341C6AC967B36E6934DC58CDA15621827B9558076361192E89708ED88A71826A20E8EC948B9C7915566C70A7C15A72C36ECC7A3CC644EAE696022657C53500A0F13A8AE50FDFA432D8D2530999275E5B9C1D341FB34B8A5A7421B7D290CBC3218486B555C92572BAC8F1085F058A87FD48796824844553261CA11F06978A03F3A8D68657C22064AF83166280AF52270E004731D20B18982283E51CA3DB7A2679DA6FB0AABA1E75A2D283ADD699A797E1BE93502C6823007BA5B9760A338768615B671BAEDC6A6A6937B9E1C35575776A4A791FEC7751079C6683BA29EA28BAD199175B9629C44BBF219CD88A19F1089AA551946E58032A9C9DFD29BC4CA3B654F494990CC02BBB8E1280B54BA3920EF98903F171C27A5C0FB679C8E84774F22136E89915A534D973733410A96280A3207407235CA0D81A636A35B9DD628DEE9A64A12918D0DC6D4C600989168A163730FAB8C78E61A57970C16C813B791A0EE9F625C438CCD1A9429A93062C4AB38DA5890188829AD116A6F1564A43A2E4F3BBA3712207B65E701995C99B29D691C86BD9844AF2471EB5CECD934F764629DC25839C809432E395FD8582CDA980359246EEF0637B9771FA5853099007F173C8598164DA69C8E67A910A50B9940B213547815E0589326B02FF21B89BC4200219652DEA6CCD59883E29127E2ABE3787738B124D839A67E02195D64989520737E3AA99C6822F2C32249256C45455CBD931A5A1FB27CD56A21E22B51C03217AA387E151631CFA445B2B77EC90AE01828601961ADA8A8E6192104F02BA5064C4EFC27CF2DC3353FC98F34BB947B21EC5235FBA6CAFFB6BC6B1C09A783AB8EF14C4921A28A3896BAC07AE8BA98C117B3624E01ED0496A8C649A38A33FB679BB535A7D1960028CA6C8BA825178E74F0E50B5D74C2A9119B595B863D0375A3DA173C63A03D8C60A8D613CC08064588890E3894A9BF4580704038841526AB84E27CABC8FA4CAD6DBBDE9B53017F100778478B86138FBD6BE713A7E695358538BC4CB5A4FFF531BFF178BB16ACE5A295CA0340985F34267A3A931998B29A36935D3B13AF0631CD37777689CA0B43B9208AFBAB88EF886A8672B331224C66C6086B8B15A8EB86107FC0AE260BF08F970CDEC98ECE9A197751B6996258FFB6DCE05306380770DC63498E9B5D65ACAC5A179D8946B27630525B39C3755C070A120C9F468AB3AA8B1A48848081B888BAAA1156BD600733BE887ABF962C46107C432C34EDCA8E549977D9A6F7EB77EB9974BB353896E8261502820F599257CD9C2852328B0FBC5C2B98658D67E4A636575A46E074A1EFDA2CFA50A0594B0A421661D81D95A9AE0CA1C037532BA7EEAD089961C29765C443D428BF20767D1F08615E85D0C08B0FA5076E297143249283C13486F61A4D9D39780624055D6043120A510D4A686F9B490C74F2DA782AB42157A00991BE019E093A509C0C00B7C1E6AB611DFC4373C640A2F488E7632BE1289666206CBA2B096A479B2140C6AA301BC448B13B6839447C4675AA1BE46EB6ECFCB4DDF2569B2D79ABE93FCEAFF0F0FF88688C870D19759A41D3D361A0CEC73CC908F52BAD865F03ADD3941D22C80D50659F501F8CCA1B448D84462CCB93D5F065889484BC0EAC9D531A532770837A854B4F5531F6E0C8D6C10183B30D3435498C2DD142951 +ct = A37E48A5F89B418765EE73D585AAADF3AB787504364574B84C2ECB3373AF7DCA5582D287A60588C9514086C3A56486D832F0BB56499F22BD19F437505760C1948B04E6DC667881565B63EEDE3D6432F073C7F9F3569CAF3E9E62A6EA7E6B2C2D290ACF3502C87C9702681FE4C6A5CCB0AC957EA2ACC8DD68E574E64508B5C3F8823E8E23ECDE3A8CDA95136D4784F2A17FF9E0E4132A48F1FABF69AD502EFC4DC4A2EB5C05F56FDA2B8243FDEF423D1DA695966F6BCE461B2468F5603B78B1BCC9E8DE0DA3D5CEBDF71A4A2DBCBD653929742EF45E550B34A4B55CF6832347BD9BC0CC56F1CC72F2D92C37689FB2CF08B37D3EC7782941DFDA884F43D58E3CF9DD73F359091DD89D2AEA83C0E5D163775841D41CB6B7E1CD1DAB4C8396F507613E2F842059F5CD8F8D5EB60DEC519AD7D3473A61A1EE79B6EE2D2011F72CE44FC72294C1A8147A6C2C6916D1A88A2BEAB3E886E0B11B815C4C9AA57A253270DD14FE11590ABCBA02E750FB3190C486FD754247FCB0219634A74ACD1F53FBD3A193E6F36049BF3C920D2F0AE28E6F3F70C414BC5EA3660E8D192C1DA4AA6834CCBF2CE4F7A943FF6B32F0246401F6EF6914F5584551290DAE6C3A97F346551A481151796A507654E99819950DA5CE8381F142B3F6AC31B0E6F8B34315FDCE5A024928EF205C2A6A989266D0A4123A5A98CDD9002C29D19D497FDC6F0C77F3B4B1BF569B89DDB22A73D0A59C518B91321277064EE8C5C9765E54C99B60BB9ED63E2D43D9EA7246CB6F8CAD230FF95B622F64748E5E2FCAD034754069997DD003A5FBA93B8D29476C91FBAB4FF0B90C180ACD747EBAB9CD7066F995FDF389874B926478E4A10EB749455DA26CF1D7E78D119E34F0AF246FD5D7DCBAD8479E85C51E59941A0B0B0DEDEED9508DF28198DDCB34624DDB45A50519809A2931594AB8292E96C54D5EB7342355083C2B6206479B50ED7FBD1C35958A94017D40E9E86A5C442E9EF5780357E47AE64631B2F803427F90BC408D3AB639C065F75183249229D8C27716E137891BFF8EE4EE1467B61708E385ED429624EBA3E53440F3248E0C32DA91DED4F934CEC4F872B78283B8E701FA635C941569E113F87A92373091A78DAC58B4AD5521C8472C9F145196D0B594C73126C226B7625D6B7FDE4BDF56E3B32E88ACB3575DCE80AAB36A1A09F9B646AA12D60637EABE185FCB81F45D54C952FD721FC74D761BBD405D50730CB81FE7A6D45B3551B8DC57A78491BC41A310F2478AFD09A539B2AC1545C4796B11DEAD5C4CF2D7342A13B7AA8CA9BBB86BBBAF965DE4D3513EE114F53FB1FDB4C52BB638B2A06C9A93FC93C50458B4D3AF86274258B43A7323281C4E7F2AFF58B43A414708DEC53F4BF23AB3EBE2BF3D51547472F4857F84A697A339AA184FF98A0E980438CEF69EE243B112D5F182F071C4F7BD78410867E3A07D274A7E4A15BD04BD6801D19A3CCA7F50EC6C03D5EA9C495737D71AD9D3A019CBC2C6FD5954680CC6D63722C4AB581BA095A39C29270DBA +ss = 3A14474E05DF3FF59C6105B1F2AF004A8B8164DD049EB6929B9C9881A873AB08 + +count = 64 +seed = 5929F02A271725CB40200DE32D9D03D8BEA53B53AC83186C42C7F565CCB1CA508305D470850CF86E9B2C61A5B8CA1C93 +pk = 61101724795296A2499158C8E1B50E4C900D65C8AE65503932DCA40E058E8192CEC2A997CF12C8A1227567B12A1B21BB31D3198C85C4878C6EA1967668E3952D04B4123CBB9CD8C77F3A7397A9133D99654E6C56E7465D9B98BDBD624C12E36C62B60B6A32C9086A8EEB9B8919706F4573A33C393F74BB51D5609231F1707E152F23F36F6C6830EF28253C8CB81EC5C27ADB02FBDA5302212826F0B88AA4B4D72A509E29CB1BFC8177C019C60598E693BCE999AABC4621123415235208E7869F62AA7B50A51724C13DA2DB59D5BA5302C772F2C1820FB0882EF32F73321C17F40D019CAD39C3B12C57C3519CA0B38366AC4353B133C39262BE6EE47ECF660286F6CA8EB7090418ABA0D9833E22B46B761FA2872FB80972B551809C02775BE07C796636A2C619FC748B90D28E1E702FFB0653E250C8C3759178C39E42411327A81C7E7887B21915A5CC032C37A11382C4D9186221B1C66AFCAE8184559910201C8BAAACEC62BAB984E080433B9465E64A2D987028E9D9090CB2C41753742CD77F0998C672441E83D45F2D06C22899C2136362271B731F6BA3965B32E2517463E627AECA0AE5644BB8602F7FC599ABC120AA111E2E549A276A18D2A92C39502F6F9519CE76C0BCB514E8084C7122A321479338F59ECE08A0ACD30F0AD68F2091855D5980219083398A6C0A63C70D3743678A1C0202A69DC526DDB77E30B779C36AC2575704EAD94DDF1661A38B2624E733F2E2AE18467CE2C3083B75017411390314AB06ABB4D0FB58BFF99DC3949E92994703E85FB6B863AE1C29BDD6656CD75D9BA453AA115A32745F2DC1829881A9F4D5CC2CC053AB79B89D107E6054C69DC93F5AA9C8CA6CC1A7583F2E2739B102378D93990CB8280B21A5D5BA8415C48EC17288044623A9631577C16639922978258CEE0B6C51BBCFE3F70BE07CBAFB7C58111CC7F2F922AA023D5AD01D2D31A57E0469AC428B6FB88A97D957AE22BEB768C3CB7C9F02F583FA2513DB7C580D2986984314E8B346A06501D8972E31AB8EF5B983E9A15E8FFC624D0041FD523570960E09E57D616A06297BB3F9D938F5655628B06C4F6C4FA5F8136F8CC05DFAB7389237EA75AEF46117BF1B67AA978BA622491260128E743F28F95F533B708F3C59230B23FABA96FFB5C239B32B30A65B36FC5A0A76B76F04A60C9C7D5EB78EBE44B736EB56A0812F59D9B5812916246228F2523175242CD1F432F9FB054A8B52D824349DC0756091B2F7C21E2A899362157BF9F631287B90D6C80FB55B1469273F79892435D031B62982C49A1464E2274F815F56F3B6F8C949BE11388DF1151E7077F603AE592623E4259853A2B90159344B041AA29C8AFC5074BEE81959102E0C57A761F1B1AA65B1DCB66A18BBBBE12B2B2942A37D13C77C77B2BDE758EB1901F74C7D57D373A47737D6E23998E35DCEE70983359B4162C7135126E90A807604034D52ADD3530456B66F0DA64453150AFBB67D67D9B359137C2420250C279A1C537AB06952E4823F09372198C253D5B71A7E70A1C48B1DCAC3A85FEAAC35A11E670B2840A57F2A7C77B6A00CC80A282F0A1C8160080C702D619A6B6D68C757306C93A5B21BA8185B1A46C79B03C35880A7B265A3E05B2DB868482FCDBA0367177BBBCAD04F3A50ADEB85DED90BD59DAB +sk = AB4545850434076342EAE8409FE0590C34955E860267305FCA05C347BB3E53BC714E3134A6E9B338674A9AABB02F021D1A09A190757F03D573C27687F7E35F2D77294D10CDED732218395B344523F1B704B27689DCC286B5C98217F239C159AE5D655436F00517A50C6DC6B7F4F111E7F37A0F319BF6ACC7B0E3345C9367B2A2B8D9D644936220C0A817FBB38CEB3469CD55C661E1C58D06807504443448C4E53204DC59C60A5153494478EB4056C9A85967A42EBBC287AFDA51FDD6B84B285523D41D80A56F7A68A168A4527D902311B18D5E381CFDD578BB7924FE687D3AEA5607906815181171A727E4DBCE1B678762A8B03C2A2BFF1635CA85332AE90F14B880C5EC4E5389B7816AB885C44A8D83C5EF0C4C754C7B6E673D984938D3CA4EB0F5B83B90BEC27172AC85154EF27B91623841E188D76B040F958C38C8A112C05B54103E55A159DE0954F2477E798A573339508B7C2AC3872A623429777BA3179060135C083E2198D1E0AA01967C39C27372A1A36A92BAC3BB13EE3C94B1F0391E2702C50253DD497F16F39BDCB9C68CCAAB6312084884B113E70F38555422767F4E613B2E87AFFC01395FCA37DF0A1AEF74263C1001392732D9D1047CC7C6FB910AE6136C33094526876A113514F2918909532A759617DBE2C97E72176490995DC82B663655DF65324B1996A42150BE41B2A1C90F03B2A6F04174DA1B1CC7FBB024C3C972B9714300C683C28A90F48B01C28607922C3ED25601A609673481B365544B7C36A9550EF20C37005B0E395A268E90CE1A5271E1421B46303B80CBCC81E2894D7569E82C2F5D8C6996C766BC505976628CADD84A3F468C67C209117C8254BBAA1BA584DC2661728A69E959949ED6C9F1B42F01EC8E55614AEB7168CFBB5E16504EB9F585C7789C48E59C17B5975C444BD6E32A6654BCE298A605043BD367400C14B1D8E1A592A034543C04A44C85711AA66C807FB07378FB525600C19D9A4A9A8C920BA7DB0B1D912A45F2B6D518B469E9121D25CF40499196376D3D92827E1B96AE255AFF288037793C7DB07E1D15533C07162AACAE3255C0CC368E2FBA3FEF09540952910EAC0FB2F3AE376AA666FC97A3E122570CCF797C79EC575835E0BE6E808B3CB1B72D8241C3679BF15020B6A63BE65B95A2C9147EB98C6553C71C550E37603E6B73C877C94E7B603A22ECA456C1409D5AA049673D0EA17C123B1835692253FCB589186BAA498F39481C3D0640A4D34931033B30F26EBED6CA9C49BA6FB219D6DC8461937284235A6417CC9C0CA0AD385B04B01C81D5A7B97A34977250E3679AC55C3D76D83B1F7B99DBA039DC179147223B5D6C11FC9109DC062A1E4B7C88C710C449320949BB4405B28EA2C04D48C58AABB46EDAA58E442F3AB6C9810B6D702855F7CA91AF71B0E574BAC1040DBE864DDAA76827874839414CF3418D1702C6F368A10714CB25E208C8A5779F639837A07E348841A11714F41399DA175C49678307D3634D6B9921880FD43CCB8D7842E5F34CE44A4923E7CE6B671C7A989AA748604D147CE7AC25A1533E80AB321B7AACB8D523A3A6298BEB0CFDA435D77714993173D080827FB07B7855769EBA987696AFDF58231F361D61101724795296A2499158C8E1B50E4C900D65C8AE65503932DCA40E058E8192CEC2A997CF12C8A1227567B12A1B21BB31D3198C85C4878C6EA1967668E3952D04B4123CBB9CD8C77F3A7397A9133D99654E6C56E7465D9B98BDBD624C12E36C62B60B6A32C9086A8EEB9B8919706F4573A33C393F74BB51D5609231F1707E152F23F36F6C6830EF28253C8CB81EC5C27ADB02FBDA5302212826F0B88AA4B4D72A509E29CB1BFC8177C019C60598E693BCE999AABC4621123415235208E7869F62AA7B50A51724C13DA2DB59D5BA5302C772F2C1820FB0882EF32F73321C17F40D019CAD39C3B12C57C3519CA0B38366AC4353B133C39262BE6EE47ECF660286F6CA8EB7090418ABA0D9833E22B46B761FA2872FB80972B551809C02775BE07C796636A2C619FC748B90D28E1E702FFB0653E250C8C3759178C39E42411327A81C7E7887B21915A5CC032C37A11382C4D9186221B1C66AFCAE8184559910201C8BAAACEC62BAB984E080433B9465E64A2D987028E9D9090CB2C41753742CD77F0998C672441E83D45F2D06C22899C2136362271B731F6BA3965B32E2517463E627AECA0AE5644BB8602F7FC599ABC120AA111E2E549A276A18D2A92C39502F6F9519CE76C0BCB514E8084C7122A321479338F59ECE08A0ACD30F0AD68F2091855D5980219083398A6C0A63C70D3743678A1C0202A69DC526DDB77E30B779C36AC2575704EAD94DDF1661A38B2624E733F2E2AE18467CE2C3083B75017411390314AB06ABB4D0FB58BFF99DC3949E92994703E85FB6B863AE1C29BDD6656CD75D9BA453AA115A32745F2DC1829881A9F4D5CC2CC053AB79B89D107E6054C69DC93F5AA9C8CA6CC1A7583F2E2739B102378D93990CB8280B21A5D5BA8415C48EC17288044623A9631577C16639922978258CEE0B6C51BBCFE3F70BE07CBAFB7C58111CC7F2F922AA023D5AD01D2D31A57E0469AC428B6FB88A97D957AE22BEB768C3CB7C9F02F583FA2513DB7C580D2986984314E8B346A06501D8972E31AB8EF5B983E9A15E8FFC624D0041FD523570960E09E57D616A06297BB3F9D938F5655628B06C4F6C4FA5F8136F8CC05DFAB7389237EA75AEF46117BF1B67AA978BA622491260128E743F28F95F533B708F3C59230B23FABA96FFB5C239B32B30A65B36FC5A0A76B76F04A60C9C7D5EB78EBE44B736EB56A0812F59D9B5812916246228F2523175242CD1F432F9FB054A8B52D824349DC0756091B2F7C21E2A899362157BF9F631287B90D6C80FB55B1469273F79892435D031B62982C49A1464E2274F815F56F3B6F8C949BE11388DF1151E7077F603AE592623E4259853A2B90159344B041AA29C8AFC5074BEE81959102E0C57A761F1B1AA65B1DCB66A18BBBBE12B2B2942A37D13C77C77B2BDE758EB1901F74C7D57D373A47737D6E23998E35DCEE70983359B4162C7135126E90A807604034D52ADD3530456B66F0DA64453150AFBB67D67D9B359137C2420250C279A1C537AB06952E4823F09372198C253D5B71A7E70A1C48B1DCAC3A85FEAAC35A11E670B2840A57F2A7C77B6A00CC80A282F0A1C8160080C702D619A6B6D68C757306C93A5B21BA8185B1A46C79B03C35880A7B265A3E05B2DB868482FCDBA0367177BBBCAD04F3A50ADEB85DED90BD59DABB8A3B8CF4709204A2FDB19889B0022EA655DFD58FF27E17D530510E1EEF457933FC3D8392CB53F36ED647364A04E37278A0E0A45B720F4A75C580C9920EBA98D +ct = 25E080415EF5CCB5D8C322634C5DB0F0ED10C73D5A0BAD7B2C5B899D74E6EDEF6B2A8EB9DF8D415BD41DDB01F670B8939D464561ED8C37A2B2217A49D4A0C7B5BC13D4A481FC383BACFC6CB979901098929B9FF7B5ECEB2BC21BCB830B4556C36151A386E2479297066521935A10D3F16222B9246C2885FAEFC2F8597D4AF4F13EBA79C30499435D93420E9F2E46BA2D7C54244A3EB47165ECE9255511DC524D697D13EFEFA8B62B6E61461FEA69830593D894016E83264103A876920663383E13BDADCE37A85D29744751EEEAC229CF89C282A56EE0959E46106E12BD94F4ADDC061442DFF73D7DE2D6AFC2AAE8230A88E53E7E4978B6B897AA6AB040261F9A5BB22F578BC03B0E81D2CE5A05A235EEF3A6177D4064443E20D9603EFC34816E688F515E5A48AF57A98DE730B0F5747D9F3F691F6BBC5F88A7B137E9244EAFBD539F9FB4F2989AE16881DF8036B3ABAE959A2FFF2313EBB7D044EC566A8DDFEFF1114029A30E44ADA4DBFA56CC1EF04774721A507795C10DE58E35F3BB1B1DC4D62095FDE786821BB410EF6AB4972B0A681DDD1A7FE8CA50828DAA7D5D19865644528C2A5A4C475A6B9BD3897E8DCBA0499E6DD75595ABEA0A485F7E41A727353DBD7D45ECB0AA82E39FE03B177710F6180421A465C1930EC9CEF35797E708227BD67451F8810267016EB07116BE1B4327902F538C5512902E6E64364B9AB0392A43892D4396549DB5EFF4EA7DF6754E34125E303311FD6F1CAA7F90D7361F201AF5B4D2632FC7815FE27B93E5B4251A4B1FB4717726E0182EFC9E9A07568871F9552DDD1C986FFB24B88F9EA5E591B07CB8A3E207053D3547950A5DC042B44341F6D178975A9BEDC001451BF7FB6CC4BFAB92972CB5E4217E28A21B8664C6C405C642A6E6400973ECF0F3FA7430936BB58F7D62EAA15F469577CCF957459687ED56713450913641DF199A0747C840FAB4E2B5F7323AE1E736BA0DCE06105327168A457EB1CF4F4B6C5E89D95DE5D9C65A6DF684812D00A22E4890F18EDED894472EF37DC078ACB3BE6997E0E4B34A6D3475056322E3B19930CC5C3482051DD8E9EFB5FE1A288EE3D9CCD181B57D41C7C66BA732707902CE5B9806F63621FD064F387FF413031F04502B482BBFF950BBBE9E854F8E58770A55CCEE324FDBB830FDF4CB47CC579FB49CC092614CB5789239C96D281BF065326B8F58F006BBAB07602C0657A616300286D89C5FDC2CF0D2E4A43152198755AD777C23A6DD8A9A8E64832119D0818CDBFE3CBE8B7EA5E2739E54790E0685203B2CFDF8831E339968B4770EAE40CA9A0723BB1CC9BE0FC4CBCB91A29514418FC04CEE2CD852A222A131927059AB5233FA77E8520211F42BC91FFF9646EA95434A2E867F8C0D4B43FA2E7B72B6C0E2AB72CBEDA1F8538E20FCE37FE6E0B9C4E03A9091A1D7F7B081B2B220BCD0C686729E2CADF8DC00612DF4A8AEA565CAA001EAA4F4309093ECC4FB9FDA290EAFFA313C3796C72F57EABC1CD4FD58E272C9B1471A3806212385A4C4 +ss = 2D26F4DA925E01CAAEAF4A89F5CE81148A000F7A36DFEE74E059A933D973DDBB + +count = 65 +seed = 905074033D7B75DEB2D06A2F29144EB377B452534C5710632989F02D45312D156557E96D4486020826DB200153BC4A8B +pk = 657B941F466659FCC971C1174AA4459551848E7A116B751E5E4022C8F2A4B3152A1B26A3096539C9B0BD6A435EA1E33413AC4D5F401F5DE8570CC11CD4BB9FAC473328D55501702743E2C8D1B97CEDC8AD3D55B67D284158EA8BF1A4A8A17A9DE6D5669E8B9571200B05300CB30BCEC4A58B06F70830C2B32D28992B70427781854456129CBAB53A7C72FF557193D3A221D06177D002095BC04E993B8606245416C3B998B01716AF3B43A535F7A6BEA71270B34EC808CA00E9453AE660B732963BA634F14378B1691A90E3708125CDE31BAE3D10451A5643F526CB790A8D6E091A725681FB539E9B05BDA7B04C48A31B39DA6E39E6BE624663B6284DE9F958C50149CE4090E6A486B68511AE90A0F093297BF090DB3C81D34400A40CBE11D74271E23BBB7A49EA875EA7F7CC25516A899198362ACC52C8A8CA14BEE12BBCEA9A6E3509B6887A3D1D4C3B2B4314C4C44F44C96F48B29A8E7B85339037ACF131F2692B7E7A49282237C8F37267C835C24883D1A189D4DCCB7C6BB1FE622FC31301A6D3612A448084E0A210449B7E15A4FD84A9A538B2D5844DC170C911FC1282BC513E8C18C469A01A548D1CE4853128A03A8B1D369B353C3003B0A29D210AB6AF23ACD010AE3671493C774EFAD8B3746180746401D0E5862A3265E7969F247C954955B4AFC13FC420143C10263EB1C6DABBBF5A8857A7F3BEE7658C8399503C21A9A38BA554132344E214CD2036C2B30D0770CC5DD87ED9B246E7F955EA926965748CB9E58351A938F7E4AC249CA5C970CFDE48C0ADE051BA873D36A581E0FC50D9583109A79549FC5B32BA432444046AC0A66F3C64AE1498F43B1B36D8082442B5AAA7BBCFF2C4CDA8C0C4D2C62CF9135A75709CEB5B82BA4EF5716C4986A36BD7B4AD5C3A505869FD34AEC2D7CABA492F4BC30D232382B2651D5923242BB50DF87092ACE5566BC5A18FB2925CAB467B641DF7B5B91142318D120456245F2F0887FF13516D23216637393C469CE1F776CF2426C6577844CB3D4E0A92ABA85FFB59979A7C33EAF51EA2BAC9862160BF8A85553A3D4EDC05DA102106F632C91B8D1DF2A9B2734185283941EBCDFD788107B307738786D6C0A0E7D4957DFB17488C5D6CC11B83E3504EF2923034A06270563E18A18BB29F48C36A64C132AA626DCFC5A615E4416DF76746673E500186A117A27C5007A4B04867213C33739E27058ADB23C0DE35CE6158C99E59B88B147E2AC05F09F7C0A414C3240ABAF65C24CFDB6857ECA66BFC58E52472861BAB1E03CE70D2115480B443A9BF799379AF9AC978D0072F75BC7923816A189DA5974ED948B8A709A8191CC9BE60AC2A383A7E27CC62543A2A0CA9EA6897D284AE79B595D0893514F75DB35C9254B7AC47260785C1B86A98A5DD733D3DC2B947D148F698C5A117821847604151068412268169C86D50BE92D77683386025704575177AAC0B9D3D3196A610985E860E2F799F480B1331BA346DB0C379CB1833223836D88FD4E11DBF2985825C78330658B9A189233BC76B172127BC7A98E6C644D28DA7B0857F67157AE2C27659297C32A7EB653697A295097A32AC235A11887388265ECB3B46A75C865C239395300D0F8152CBCBA77B4D655C9F1EA4B448FBE32C4996FC298D26CAE25D276BCF6E66BA65E3E97791 +sk = D7E3338B3CA1D6118B7485BF85AB9E8F6C36E158B67D2C3530B0A544B8AFAA0A8604710987429D0D1B1EAABA8F06422E992C475DC4CF909061EFE673A3547575E8B00BA47D5A158C22E6B2C280B3152165A5A01A43D801E96791B6D99C92C0B0602C94C0B13F2672146A7044E4372C5FA8843FA7974692B0F292AF9FC3B5793092C705421E6AA39B7B3EEC76694F5555985A94879ABF737949BC33CFD1F8563565B2F345B6B3389FE061509BE046B3A048A73599AC20466F0707E9B46045352F94507659BA428CC6994EE3375B07D09AD3BE1872C15692C7394626CFC01BF5435D7922BF9199533A22CC4FF021A97C571DB311485B36E2A3344EB880C67819AEA18B09919FBC57CBC11CB228F8C24F38A445C512245C3A5CBC65D20269EE849BC268899981B9F334704499B60A891139D9470A1A147F38470752C4EAEC5B14D51817FCCA22E7BC1C585CD2189131960A9E9284AC7940B2949707EC7A67F22DB280775D8163394A3A9557BD48F50C26F177FFE83030A3455DE1196A763F8AF156DF73CE3BD07AC70447573A79DD04A59E8B40E39C6FEA736E14F1B1B67B5CF556C3ADB29FACFCA4E6D8B759D37737863DA2A7AC4A645A8F202AD61C17068385C21415F7E14146D896020B89CC73AAD60135D5A3B94879184E086F1066A9F56041B6029D1F538FB5B18A7A741E04E2C158B69927A1A7708BCC411988C0C315D0D1BC3A31B0CD473FCD3ABACB1BB3EB23224379B5350081EFCB8C45584D3B845E2500420453718AD83194130983A355B1388BF246B9FE7400443C52629812FC1125C3800C3F824C0FF95BC24A2E8B306D5E3278FFFC585843BBFCD06D2EC3482295717A5111AA7B6475040083106A01491CF981197EEB77D9B01C2BE476F07C59CBEB5C4D19A2000D61546A9CC149A149BA8E57CB0ECB3105D94715C7B1BA7800785EDBA95A7352583354B93CBEF98C78BFA946A7431813EC36AC45488B170859C098B7C6813CAB2FFB519814C3A9DE3C254ED7A144FB6D15B183CB48A9021972233382FC8C388511ADD6A86837801F4BEA0DF0103B3A152648BBCDA68499352691BE0C3E5218A7C22C8CE49790AF1BCD4F6717EAA18CB489B446D24F5CE239C79A6E34215E87BCB8461B5B509C895EC22F94C17C3BCC5904D968C469B200D3322B423761E3749556476D925A915971A62A5A330ACBD106AD77DA7897815CFA31CD44310D44915D762164B6170B2916B5427C694FF3340FB16B73500E92833ECC35BB25DB6E652701D85AB215B366A173604C2797C2A9C420E069E7E4B3D1120DBD1C196D105211134478D23CC4428F8F56182FF3A51C7B84F01A08BA157E86B9374FB7C2E7ECA3D4B65F4A73472E38C6F7C06883C99C4CE934F9B04436D250EF262C42D4862B90C11F4924087469210A25CF4CB29D139D85D9C904004CB246348C60736D707B2B9B111C91ACD3937D9E8934032746AA5025BCEC8BF637936448A0DD67A27DB2A74B60BBA82BCC87D73D4A9033C427A85883613EDA43829C7CA3C7A8F24364633610D8199A5EC8038D0B6686ABBD47692ADA94282C40799ED4BF8ECB65EE7C8B2047C41EB255318C139B89CE909831FE3024BAC10B4110CA34F1BD657B941F466659FCC971C1174AA4459551848E7A116B751E5E4022C8F2A4B3152A1B26A3096539C9B0BD6A435EA1E33413AC4D5F401F5DE8570CC11CD4BB9FAC473328D55501702743E2C8D1B97CEDC8AD3D55B67D284158EA8BF1A4A8A17A9DE6D5669E8B9571200B05300CB30BCEC4A58B06F70830C2B32D28992B70427781854456129CBAB53A7C72FF557193D3A221D06177D002095BC04E993B8606245416C3B998B01716AF3B43A535F7A6BEA71270B34EC808CA00E9453AE660B732963BA634F14378B1691A90E3708125CDE31BAE3D10451A5643F526CB790A8D6E091A725681FB539E9B05BDA7B04C48A31B39DA6E39E6BE624663B6284DE9F958C50149CE4090E6A486B68511AE90A0F093297BF090DB3C81D34400A40CBE11D74271E23BBB7A49EA875EA7F7CC25516A899198362ACC52C8A8CA14BEE12BBCEA9A6E3509B6887A3D1D4C3B2B4314C4C44F44C96F48B29A8E7B85339037ACF131F2692B7E7A49282237C8F37267C835C24883D1A189D4DCCB7C6BB1FE622FC31301A6D3612A448084E0A210449B7E15A4FD84A9A538B2D5844DC170C911FC1282BC513E8C18C469A01A548D1CE4853128A03A8B1D369B353C3003B0A29D210AB6AF23ACD010AE3671493C774EFAD8B3746180746401D0E5862A3265E7969F247C954955B4AFC13FC420143C10263EB1C6DABBBF5A8857A7F3BEE7658C8399503C21A9A38BA554132344E214CD2036C2B30D0770CC5DD87ED9B246E7F955EA926965748CB9E58351A938F7E4AC249CA5C970CFDE48C0ADE051BA873D36A581E0FC50D9583109A79549FC5B32BA432444046AC0A66F3C64AE1498F43B1B36D8082442B5AAA7BBCFF2C4CDA8C0C4D2C62CF9135A75709CEB5B82BA4EF5716C4986A36BD7B4AD5C3A505869FD34AEC2D7CABA492F4BC30D232382B2651D5923242BB50DF87092ACE5566BC5A18FB2925CAB467B641DF7B5B91142318D120456245F2F0887FF13516D23216637393C469CE1F776CF2426C6577844CB3D4E0A92ABA85FFB59979A7C33EAF51EA2BAC9862160BF8A85553A3D4EDC05DA102106F632C91B8D1DF2A9B2734185283941EBCDFD788107B307738786D6C0A0E7D4957DFB17488C5D6CC11B83E3504EF2923034A06270563E18A18BB29F48C36A64C132AA626DCFC5A615E4416DF76746673E500186A117A27C5007A4B04867213C33739E27058ADB23C0DE35CE6158C99E59B88B147E2AC05F09F7C0A414C3240ABAF65C24CFDB6857ECA66BFC58E52472861BAB1E03CE70D2115480B443A9BF799379AF9AC978D0072F75BC7923816A189DA5974ED948B8A709A8191CC9BE60AC2A383A7E27CC62543A2A0CA9EA6897D284AE79B595D0893514F75DB35C9254B7AC47260785C1B86A98A5DD733D3DC2B947D148F698C5A117821847604151068412268169C86D50BE92D77683386025704575177AAC0B9D3D3196A610985E860E2F799F480B1331BA346DB0C379CB1833223836D88FD4E11DBF2985825C78330658B9A189233BC76B172127BC7A98E6C644D28DA7B0857F67157AE2C27659297C32A7EB653697A295097A32AC235A11887388265ECB3B46A75C865C239395300D0F8152CBCBA77B4D655C9F1EA4B448FBE32C4996FC298D26CAE25D276BCF6E66BA65E3E9779146FE6C37136273736CCB11DF5B6D55DEBBC087DE802404B72A003C5E8C809719D7E4B5D8021C486B9C3114D7CBBEB7CD49EBA8A61BC2BCAE1F1BEF30A1DAF76D +ct = 1D597DA26AFA055E20E20CB3DCCC730B73075CC9B0C01499A4856D0218E744654023B54734E6428408884C182AD6AF6B2FD3CA2F245037F7F540706C5EF18CC520FFBD5CEA84D308A4BBD9999EFE0B95B1F599A141C383DF89D2BEB33077CABB7B10F332526B1AC199576799444B86377AED9A18D6CE0C94B157DB14DF2BBB515464A622E32661CADBC9E6ECFA9733635F3847F2363E58F7E994563375D4E4C0B3174A84AC0CD4408041C4A11563AC5195C1DA47C86D7B88E7323B5ED66D3850A04A348C46BBC627F497B49E3E1D7BD8E23162AD8C232F750D3FBF55C267DB2D9FDF0854972E8EAA6898BCB21CEDEEC79B6BCF494FAE1D6B174779C3F70C27B64E196EC8E8A7C861CF75A5C62AA8A71A7677B995F16A8727BD5E1BC0FB2638BCC864CB1AFA8F793462ED0AA445592E1142CA2FED5792CFCAB5F6FF8E7B7A335043AF926C7C0175C92899EC0E3D2B5BB945334A4379A3533FA1607F6406869191B2F4472F9742AAA9C66BF9A843AA4DDD8F32F4113412CAFFE113DD80C55ADA924D5EF5F5D8E2A7DF5C764F53062730764368589B76B5C6399A8674AF24C02337EEE30E1FB44C8C9AA85F72BF07A61246043B21032FBA0E675A1D1B0C4284228E1EA990FF7803A1992C53D0BD85FD3A4D753DC1F9E1B873D64D5898B78C7DA9F72969D48A433F5AB9766915BD24E9BA07170338EE670B77F68C204A68AF32E3B6DE3580A973872BC756B5EC976A393966AA452F5757745660A15E4E2D4D3E549E99F309E18774CD74F73D5D4572C3A0C49FAFCE2342F1BDAC88D35D22E8663E27470F5691C150344508214F0B0F9F57755AFC52F5590615C64C06D4D611F6920CE7D0F51178DBBC906D71947C1DBBE1D98A7433860D3D21C2E83C4C3EFED6A738CFB48304746E5A7CB7E32CDB8AF44AB7F09E98EBD18B8B4606EFA2C646E37C6123B4FBB37E3DB5C3AAF550A536B1B86B47AB17865E6AF273628F3881937043A56FE323B5368B021F3723ACA9A3937EBA3828ADFB9873A3F2D027C9264B56FDF4CB608F5451EBA1FB1EE4734FB5B1D4ACAAF29ADC1F376D23E45D188D4086F4DC4942531DB72E586AD70350B04036D63EAFE4234FE90DBD68D83E91CBB0F43CD87A8BD3CD5E6A6C81A0706CE2EDB2C9C00ECE4F86D9B82157B4E82BE4C6D655F2BD1376DE64410D0D77CDBE737D8DF1C3751B0B33D1503B1354E70B5A6B3BF5E21435FC575FDDC26F9B261B19DA5CD045FE041FC6C35EA7A4C1C24307D2F4DF6DD6C5D4B211F0C5A98093F7E05815496F0B3B7A80E0079F0E60C5393A6E9079145137B2E89093EA7DF4336B40DE06CFEE5FDEEF322770B114729342B1A24892B0C759147B08275FFA24B5BCF679A5B404B292C818DA88631919A403110959A560D81AAAB2BEBC33F796E2F179CA5F25D3EA7C7DE3A310ACED8DCAB766E02E22AE9130D963DBB3EED2D0316D26F25AF53FF23974CAFCD2543B97F8B13ADF08FFB687926A51403F811BF3606C1C73ECE86E0A724B9A15325278D6F2C6481EDE68FB +ss = 5012217B85A1E5DBA62A2476D7A441411D8ECDDBE2D3A291F658B7DC1D1197E9 + +count = 66 +seed = A3E2E511AFA7BB560446BDADF67D2EE2E16FFC7BAEAE7EFB8C5455068BBD4E91BF9BE9D98B280072FABA7712C75B26D4 +pk = EB9B77F8C16DCE72611902A8CCB81E8CD4C5A2FB1D8FC30CE226BB45779F41073FF3EC0362BA152102CF45D3A95874A551C14C8A621436E248FFBBC4CA3B4033D50EFA392DBAD9C339745803F845736C30BF309546229EF52788AB223758C03491F62913FB4CA4307DC6B4C7FD9503A701AD21671387CB2CBC728ECFF4641E312779C7034CE720554A948A021751D4628890CA7367611D4B9F269C5CCB2381F1F6A01B0634D9C5C954FBB934E4144922CCFA2035892C4CC2A8457300946ABA4FFE77868D34C7A90507BE43748A366C49D0A927E66610A08CD0152A2C1BADA92A05694B6E3D2610ACD4579D5634FD2675F2101290E2BA1855252B57A438B50FCB854EA7B6A89B109EA9857C23AA38333428B94CA5A524977D72077B56978328C18980382EBC967DD37E6136360A958D5F00C3B9996DE3B97B6468B9F98C3C50F37A9E73AC8E8364288347D9B018D437B3B065C120D26E9033078B5838DFC7CE68F244B32C5B4AC04DEF068F58FA733E99A418176575EC2BA0F78D4C402D67176DB5717023B57F8D26C636A11F49B926D20B277D2613941C3E786B1A9A3C1135993BCE22A1DE16434A5902C0F101993B65777399828BA52330A2F356203521A3C59B6007C3AA41D198A8232D27C05F8E0280C9076D54D5AEBDFBC95C7C06BCE24507892641F90D2B774A2D98764C42BCF009799432B706DA59BD84CDE4892427C0586929C99850C7D769AD9A221C85A4062A62B2A1847454554224C4CC47898574FA66D147C4AEDC59FF612F49285DB54170508C89E6787A8CE6515CEC673D4545970CA8EC486802933E319800FBE46D5CC14C8363656DAC0600D895FE383FCBC3614FE334CAC0A94C185B73DB30CB5A56A8D04CB271B13859862F164F980625D78AC35ED120605CBD69E6410EB05168819440816EEBF8CC9AD153CDA5BC2EFBB00A7563A55856711231CD12873A9A56996C174AE43B5C172A1445BB40CB3DEEF9051035B33214A61E26852EF3BCB3FB319E1B4D6BD832D6B9BB54B6021D180881D59D2458564ACBA148B0AC36CB501CC8242919064EE24343F26A87A0696000533A20943445C72B9260B4C8A46A1C921C582600D978C5370B400B2412F73541A13BA0349E66FA4025735CAB6402AAC51E08A019B48115C49C665F415244FA91C208C6B1F2BB02BC18C47A5AEE366EDBE3BAE1E41A8B405DDEAA22A2FB254A6B70DC5A16C0217E4DFB933A127039B788E6C035DF8993FF86923500BA466A81D34A0ADA271DA4262F33123A1B81A13621211845A167449D93370BD95A89725A56A8452B510A7FD2642AF41A4A7856ABD9688DD7C85433A868103679A8EB2BDFAA0CB52CC141267E91E2C1E57162C6B4897C9004A3D375C1C8BB87C5AE2CC80C2A107E0F904E5BF8065AC96C9152AEB07322FA181A83A9CBA0224C9FAA0F06CB67E2787EBA832D3F53AC60B7B014D28945361759689C3EC65F8B885EDA081443A2AFD2A735B1C57C201AA4D273B1302267E5A63ABEFBCAE8E1B2D3883439E2BE2436382EB9BD62146DE0E446B6E2BAF8300575091DB145A646C733BF352989938FDD8003218A607739C60DA6758BF448BF18A22630B08AC40635382E3BF86D16625C45E12EBEEF4308B229C948D425016D674119C0AADEFEB21338BA6CEDBF7DF723 +sk = D338B8576C1FD9168551A681F9C590095B6B8D8474F571226A4B68EE81A83738BB964356EDB663D925960388C92896029A201EC7F046CDE497E3384F613A444634AA3C41656C6031D5233720241603612BEC1032AFA7B3D41242CE374C8B118CF6219FB5E645002530781CB4660403F88287D115BAAA07CE95496A7232862282A653367FBBCA1E337155A3C8905E368C1974418E735F93B6965FEC11CE7B43D81710D727A4C4B434003B9110D013568B7BBFB341212543031C862FAC505944B86394554772047B2A864A6675ED984583269362759CBB464E7E248A48C3554B8054ED9342AEDC8E221439F812697B691BD5C89B7FB11EC716BFF96C97DD73C45B00980BC6B1F69117C2329386518058E97B26626D98196025724BAF0C5729109399E035ACE9A630CB6D7CA9CBC16AB560DA5C01E37601BC0DCA7A3AF891B80418C0056145C7AC8C176605411A39BFE843CAFB4FA61463B20A504E984308F2B82CA7081A97951D0961B2664E2D7B41DF902571D02C1FE24EC0EA998609248CF51CF2F81D96A983DBD29BB37B9A7D559C72FC0BAAE894583A842FCAC92D910C7D682DDE70A4A7B26E3259B290A182392CBE36B68D2E321708E9C00D8C06DCA5043C1A461E76438B7801E8FACA17045B272B16999471F8FB42F53A43294124C3B2B7F7A13EEE8B195A01871909A70E41A0CEDB37F3F733EE259F40C1CD12C79DAF90788D78CEAAAB9E1D20B7FF8800A17AC28953A4E90B257D099DA195B6701A695195BC730389A84A499AB784762631935A5A974398C6988A59822BC6382B9CDC6072F0A6CF65C9DFF2309D1A433AC52E6CBAB472E788F76558D57986BAC5C79B921F06E509DB18C70EE88AF044B527E221E5A5105A19610F059FBF6009B985190AC81640607CC4FB69D4892B5D9AC12BAC26765AAD5C874FE3080BEFF77961CB9E747A8E4B4ACAF3F3B81D51A4A755AE8EF2994E8A722DCB5B8014C1CCDC6A79046664C3B75C02B91E0B4C5C250B8EDA5D67E9A0984A6052053D22266B2413B98D841E8AA686F4E0AEB8D5B2ED2C8BBDDB0374D0AD8CD47A0E6945F0AC352307AC0DB224EBA29BC09397F05B1308828CD42B85C556BF0A938959FA7CDE083D3D0163C21B016133145AE0C47EF73604999E76F9AD19432F82E762BA8174F89A23D09333F7E677F33BC15BF996AE6999ADA8747BB0C454412C2B651D2A90382937427EA555B3856D0250AB1E3663B8D78F3D96CF9EB90B5A501129715DF5DB38086076C4B351305A9718903ABF12609FB1BC8A59162E2152F8E0C62241CA5DEB5260D71AE162B7EA827A342584576B00DC674A5BE149C7744D7FF43A5B04A3EBD38C110630FF656F2FF042EB603403D14F18EB17CF675C995C2790E936CF8B60E758484BC04314E50105B28346829077AAACA72ACB46D331E9127B17DCAE5E639D2B33B9F3CCA468F731BF0B332BA41D196AB77B3C436702078730369CF59144540EA08B5025A4C880C1530F40A852E35F96519C91EAA680D90D25A4256FEB1878B48E39143CE43378EB3335D3E03F2A358782E0B54AB56860148DC0FA5CFD149CF26A7260639A347AA72B977B6F38BF29E1472C26B4D7F80E4BB3192DE06EC05A6AEB9B77F8C16DCE72611902A8CCB81E8CD4C5A2FB1D8FC30CE226BB45779F41073FF3EC0362BA152102CF45D3A95874A551C14C8A621436E248FFBBC4CA3B4033D50EFA392DBAD9C339745803F845736C30BF309546229EF52788AB223758C03491F62913FB4CA4307DC6B4C7FD9503A701AD21671387CB2CBC728ECFF4641E312779C7034CE720554A948A021751D4628890CA7367611D4B9F269C5CCB2381F1F6A01B0634D9C5C954FBB934E4144922CCFA2035892C4CC2A8457300946ABA4FFE77868D34C7A90507BE43748A366C49D0A927E66610A08CD0152A2C1BADA92A05694B6E3D2610ACD4579D5634FD2675F2101290E2BA1855252B57A438B50FCB854EA7B6A89B109EA9857C23AA38333428B94CA5A524977D72077B56978328C18980382EBC967DD37E6136360A958D5F00C3B9996DE3B97B6468B9F98C3C50F37A9E73AC8E8364288347D9B018D437B3B065C120D26E9033078B5838DFC7CE68F244B32C5B4AC04DEF068F58FA733E99A418176575EC2BA0F78D4C402D67176DB5717023B57F8D26C636A11F49B926D20B277D2613941C3E786B1A9A3C1135993BCE22A1DE16434A5902C0F101993B65777399828BA52330A2F356203521A3C59B6007C3AA41D198A8232D27C05F8E0280C9076D54D5AEBDFBC95C7C06BCE24507892641F90D2B774A2D98764C42BCF009799432B706DA59BD84CDE4892427C0586929C99850C7D769AD9A221C85A4062A62B2A1847454554224C4CC47898574FA66D147C4AEDC59FF612F49285DB54170508C89E6787A8CE6515CEC673D4545970CA8EC486802933E319800FBE46D5CC14C8363656DAC0600D895FE383FCBC3614FE334CAC0A94C185B73DB30CB5A56A8D04CB271B13859862F164F980625D78AC35ED120605CBD69E6410EB05168819440816EEBF8CC9AD153CDA5BC2EFBB00A7563A55856711231CD12873A9A56996C174AE43B5C172A1445BB40CB3DEEF9051035B33214A61E26852EF3BCB3FB319E1B4D6BD832D6B9BB54B6021D180881D59D2458564ACBA148B0AC36CB501CC8242919064EE24343F26A87A0696000533A20943445C72B9260B4C8A46A1C921C582600D978C5370B400B2412F73541A13BA0349E66FA4025735CAB6402AAC51E08A019B48115C49C665F415244FA91C208C6B1F2BB02BC18C47A5AEE366EDBE3BAE1E41A8B405DDEAA22A2FB254A6B70DC5A16C0217E4DFB933A127039B788E6C035DF8993FF86923500BA466A81D34A0ADA271DA4262F33123A1B81A13621211845A167449D93370BD95A89725A56A8452B510A7FD2642AF41A4A7856ABD9688DD7C85433A868103679A8EB2BDFAA0CB52CC141267E91E2C1E57162C6B4897C9004A3D375C1C8BB87C5AE2CC80C2A107E0F904E5BF8065AC96C9152AEB07322FA181A83A9CBA0224C9FAA0F06CB67E2787EBA832D3F53AC60B7B014D28945361759689C3EC65F8B885EDA081443A2AFD2A735B1C57C201AA4D273B1302267E5A63ABEFBCAE8E1B2D3883439E2BE2436382EB9BD62146DE0E446B6E2BAF8300575091DB145A646C733BF352989938FDD8003218A607739C60DA6758BF448BF18A22630B08AC40635382E3BF86D16625C45E12EBEEF4308B229C948D425016D674119C0AADEFEB21338BA6CEDBF7DF723A074ED1F76E97D68434BA4AF2AF0E549204222679E9E643580C35AF3CDD247CEB2DCA81E3F5F748D23C9D356A2209F6B2D60247B2E45C9808DE497F64F124643 +ct = 62A20A2BA68C9FBC4E9AB487FC36DE9C902FB6E2B9D42A040328B8798E9C8115A0C4CF5F39B0238FE74442936D0891172D6B97C219B4AAA3C628AFE98C56A33070859D5BCA5AD6338CF9491FE2DBBE4F2993F773D5A19C9CC70CE7364BBCAC0CCBD1723B4234265F4C643E425411F3665B7A2047E1C8E07C28B8CBC548BC4740903DFC6A7263B6800DF39DF6519720A9D1D0F7C9B239EEC124FF99F5CAAB64715E595CA1BA9F6A81583F4825FF9E32711AD3F741108A6888905B79DD7342B903488CBCCDBAA690ABC5E49A2534C8CA791B729E116C4304E55BB636C0331BC9C1520A1667356C4698D7D5CD8DB4B8C0CCCCF770405C056FA881558A2E6E1932793252A3CB7C1AE07E7135597E0B8BB173E7544CDF583EE8B33E24756EAE89628AD34C31C5C66590FD2D037512D309A2DE438FA13098A64AA0955A4F5460A8F19E3F1DA1E8EB7BF3B56F3E685E685906818F030B7FBDAA9EAD26F2AD8EDAE76006835BE6A5F07219451ADB37D8ADB356C4B3FD07DDA85579369071FDD5214EBE2CCE89819C316B0F43071367C6EB871947DAB8A2FCD14E656DC27F7A9E8E2596E6479440348A661E31F5A1AFF7347CD890DC3B9728762375E562788BE050748E6E00343E88FA11B165FFFBAB52D2C9004F63526B818DD4128AB69797A661731AB37534E0FE4306F865A353FAFD10B18A7E9438B41D9A9105A52292AB0488F2417C2B2D9A0B74D688F2BA3AB686CF4B08DCEC84C603AD326302684E2768AAFBD1BD7D2FDA5AE14664E287A1F55734A761BC363B91E31F5D5430992F4A6A377930623329FF9169A03736DFD875623A034D7BD4178CD01DC84F6384D6D001BFD22A543E1E9DFC2AC0AAB237FCF8DC7D4D7B3DCA4C00EBB191DD5C24B64B7730F7F4865E8DBD9739C8A374FBCA4DF0A99E8BF3EB0B7ABFD123CDA4DB5994AF01F3FC416A860C3F012C2BC6038D8AC9186ACC89E61F9B820F226CC26B5EBFC6DA09FA5141A1C8B2C2BA3C9C7F8975E73E825155B70FAB089103BFE2D3DEA873FB566E7C70E78CDDA058FC8EE87A58C98986957F5B5C6D25E33C856CE0E5A79F4A9592E223998C34B8459562D0712B7762699A382B470BAA29B4A7186F89F603F3AC17DF82BC52FA30D533DB99E1884B5D58DB45F0B5BE099DF8F27B7CFF57DD5F1F38F58345B43268A24D2B97F8F05334D0DCA0FB01F6F0E271AE002657887A7BC26A140D8761765909253D625CF8D5C3B16F27A9D055E5E4A055DB9E0F5817B9F64B7122D14EB54D3B2881F70D89C07D5D3150F8273731B245A99689B2FD31D089B3D7925645732C890BCF6058EE829A7DB67C34D8B6E0CBFCEDD73FDC7B83A038B5A044C6D9FE947C2608A9200EB21438BF942E66E0E3786ADF6B624FEA3F86185D84C0BAC24FDFB8956FCE2DC60E62721F89F25385031CC0948247E5EE3E6DD849474F4128409363C99BF4035CC43976B9B0EAF70E464833E99701D6708502037E5967490CF5D94F05E62844A329A36F819EB4ED5F93769C99EA65B57CF7F542E36B +ss = 0DCECAC51C5261E34023D2E04146CCEA10A0B39AE7EDC50736127184FECFC8D8 + +count = 67 +seed = 074AB1A37BA5A0403D8F68D26FB787BC2C90F5EF88F2A6D286C3E6B168ABD85D393D8225618608B8EEB301D26AF53BC0 +pk = 9BD11C902A159F41CB5395BE189B1B7E98CC23658DCCC7BF9A843A77B2A6BFA27BC941B04F391950D998C607A59B49330811200B38B243060B55E381C078100DA84975091F3A0ACB06F22AE3FB1B7D756D36F54200A367C109B13CF40F3671231D5B0CE9E5908776768767209F4726C54277D0F8B0E05BB4CD50BB5547A01051C89ABC4A352745316C8D85A3187D68382EF05DC96294446972F4C76C7B9B91A4BABE06FC634E76AE4B778F939C308F22B8C816BC3FD6B48E168F5DFBC19FD8CB7E4686BF2325CB060638C723364B27C8E3123FE26CF9862F247CC31C844AE77754206B03B497BB3283CC7E38664B23771F709E1D308CFAF5086F25ACBD04CBD9F1612ACC2712D129C9C195BC024CB057B0766AAE7B533E60F04D947947F920470BC37E5EB4AC4FA1C48066877B4456D4EA2A5EE089DE38A7FC7573FAE5480BEA823727132651A85D873378CB97D6F7BE1250A94621ABF5EABF0114952665CD2A5005AF338B36D19F6E4C8F77E2CFB6F24D3CB7A909315A026B5AAD50A9CD4BAF3308059A91323B1C226FFC76B3565CD9386592476B76057E3477C8B7CBB201CA91546A2354B59328D411A724CBD8B3689EFA335D879996FB0D1D2244EDB361BE4B2489E84086F4A995F20FFA9404082C4E66061D3EF668FC155BCE04916C92B8FA46B77A4A9FA82C8C0CA5A5A5245883D25FDED230E74B22394169464BC33FD51FB7F2AA9214B1ED546DCFD00AD554AEC80882EC170C6EC44794204170D738EF9341D6034920A7AEC3B68FAC00527B2812D88969C6207F9AA122464A4D76320EAD6271D2836E574155310A756CD4249FA7474B301CA978A0653935B7740A16C50DF1EB678C1BC3EB451CF6FA35BEB903CD89CDE0AA58A43BCE9CF591286792FB3B5E658B5A32196EA24A4252B093D2AB40884C39A4ABCBD19B108B81172E18A84A288AAC2982D113454335423148168BB6B9D97494179BBA1EC8760BE59D06251B94B4BAAF82A6481C4A8F33B0FC3164635452E6497F992308688352CBF44537C618000536F9C41A64361EE162236F9227219B8B84A3984C649EA82211207C974F6C7575027AEEF57E496A58CE2719096A58E2E31E82844F4D674A4CD9CFCADA79AFB0C63E634D2514BA4D8604CCC42B2EEB64691AAF23727C93C4ABE1423C27B3B7ABF0B649334760056E591C32FE812A753723F7C93EF5524C8E0267DB177E6E55620715688CD0AC70B2A90E133CAEC86945BC74D7EA1CB88479A37B45EAE4993BB7048E5316BF66B9715591148C9A20A35412C2404BB62C512B3800B9AE104453D95ACFFE000D3AE85B96D8092532796A03039BA2154F84AFA4A402ACB673B8799441BC505E836C3B558E1FE2057FA79153E1630D72AFD96AA4FE9C0ED4822AB33A559719B81D274EF0A2773E405761A036521278DF5AB3617CBD89D7543CFC7C6AD373B2D0B781DC78DD3B2AFA34B6565979231681FFFB8C62843DCD11686EA59406E23CDF96AED95554E47027C5B6976F5515BC40B0E3A31C556219F89B73C0871E1FF552CA04C33DAA4A363794CC7C0E05249B53D20460EAA8AD217787C8C9423A7EB71058B5A8081B82454DC91F77F8608D60CAFF30A7C42424542A1746F0F10FEB3F0FA52EAAD4F2D4C36E59CA0A5389566FAD53898992A17BBE0A0F +sk = 9BFC3A71FA83A4070DB5064ADA8410A770845E818C49B91E09A251E1925EDB226EE8AB153F94B2417560D88959113A6BBC854B0065748E6A7DB90977ADA0216F3C41CFF70E5202B306CC22FF8A138C360D75B9CB1BBA849C5BCC8C9B55E80647E513C9E3E15F66A144F013822DA24266765E3F1125F435BDA4C46EF57430EAE331E1D54C91960EEB363CA25387D0D441ABB930E4A7C329191C5FF7A87996A4B1AA74162611E67B303E284C7098A65069356B55304B11B8BBA66C5829647493C09BF62166017977A988333092EFE98D9C13A2BCE53F8EA2C81A0099B7D5C2B11704971366A5565CC14610DF796C604700680226CB165E9ACAA6AB507A923B4D472A4B6C9424E7F5A622F87F4F8A1083B4755067A93C285CC0748D241C7051971128CC5AF4DB5C1F7C144F98B6BF9703F5338628CA22DF4B84D10312EDDA9DF71442464A24491A62687928C22455DCC23ECA964E9248543520790D813924CB58A0C156AAFBCF63906EC5FA891936C7E16B5FAFD98026D64EA2012BD75B6C5F376EEB74AE9B29CFF7041C650B91A2B852C021562BA33B66EBACF787BE40810F22AA43F4174571C77710F775D1719968A5523780B613262F94BC36B611B63F460DC6E02CC588AF99F164302276B0386E697469C55928C0E62438C25AF90577DE0883CF45819262905ED30D9A1A7918B82F9B4A28CA5B8DD1D9AD4326ADC7BA69C087765CC6511668CC0BE83D510245F8834E890662E06774F389C0C623BE3212AAE5ACCEDB101C43463B68889EA9A2C21AA0ACB5329FF80A336F8914FBC602E2B9AE452647777651CCC4BEF70AC06423B66EC5982C861AD9723DFBC834CA6A6433174C1D6C1AB9569265A96AB5D48495D72122763B3A7275B297713F1A729BDC48329B64FFF9C45955C6091375D4D77FBAC540DACB140666610EC7A15FF18BC741AA69425508D5CF682BAFB6D3C9DFE02D80349597F56FBEBB7EC8031FE71B6D6C065C4E6B5E5D17ABF3B412DED81EFCC8B6B1935FB37B467A5CC61F318AED20678800726509BAA73BBA244030500050D4B23E4AD71349CB0877566AD100BA77F8B409BC8F0EF8CFBCFA3CD1BAA1935C9ABCA798FF6965EC7B53141B6709597BC4F9983766403ED80DF4095D59AB482FAB7FCA432EF5E76AFFC77F74F4CDA522A0085A4917D04167A00B09863850D6CAA0621C2D473DE0763B7D3168B6147BDB009EB260901FA82013C8C0A3F6C39DE3CC49A773D08B357EF932077B5BAB86391239B3C366C43010AD15EA2EB1E05267029E5AD8139728A907B98761B65DD6DAB895363159B48875FB6AA80882256A04460B2977280688745C5914C089B37BFC949A8F9864AFEC2E4DC13F6092070EB561D09B530EBA2CCD66B87B0986ADEA1933448066521E28AC2ED9C57EDE492799B401CDBA8377D593DAFC1A0D233004E25877242C30070779D8BC5BB488DD3988004B5A8554861B560EBAA5BFFF7C89DED193EA077F421C216996C1445B165B912901B217315636A168C0216AC026FBBD4239858837B02DAB5A39D1BE6B072468A264661C5E34F42380C66526377C990092434BCB551A744227445C5108FCFC3CB4526D0B711DBD4539CEA05A08A78FBA723F9BD11C902A159F41CB5395BE189B1B7E98CC23658DCCC7BF9A843A77B2A6BFA27BC941B04F391950D998C607A59B49330811200B38B243060B55E381C078100DA84975091F3A0ACB06F22AE3FB1B7D756D36F54200A367C109B13CF40F3671231D5B0CE9E5908776768767209F4726C54277D0F8B0E05BB4CD50BB5547A01051C89ABC4A352745316C8D85A3187D68382EF05DC96294446972F4C76C7B9B91A4BABE06FC634E76AE4B778F939C308F22B8C816BC3FD6B48E168F5DFBC19FD8CB7E4686BF2325CB060638C723364B27C8E3123FE26CF9862F247CC31C844AE77754206B03B497BB3283CC7E38664B23771F709E1D308CFAF5086F25ACBD04CBD9F1612ACC2712D129C9C195BC024CB057B0766AAE7B533E60F04D947947F920470BC37E5EB4AC4FA1C48066877B4456D4EA2A5EE089DE38A7FC7573FAE5480BEA823727132651A85D873378CB97D6F7BE1250A94621ABF5EABF0114952665CD2A5005AF338B36D19F6E4C8F77E2CFB6F24D3CB7A909315A026B5AAD50A9CD4BAF3308059A91323B1C226FFC76B3565CD9386592476B76057E3477C8B7CBB201CA91546A2354B59328D411A724CBD8B3689EFA335D879996FB0D1D2244EDB361BE4B2489E84086F4A995F20FFA9404082C4E66061D3EF668FC155BCE04916C92B8FA46B77A4A9FA82C8C0CA5A5A5245883D25FDED230E74B22394169464BC33FD51FB7F2AA9214B1ED546DCFD00AD554AEC80882EC170C6EC44794204170D738EF9341D6034920A7AEC3B68FAC00527B2812D88969C6207F9AA122464A4D76320EAD6271D2836E574155310A756CD4249FA7474B301CA978A0653935B7740A16C50DF1EB678C1BC3EB451CF6FA35BEB903CD89CDE0AA58A43BCE9CF591286792FB3B5E658B5A32196EA24A4252B093D2AB40884C39A4ABCBD19B108B81172E18A84A288AAC2982D113454335423148168BB6B9D97494179BBA1EC8760BE59D06251B94B4BAAF82A6481C4A8F33B0FC3164635452E6497F992308688352CBF44537C618000536F9C41A64361EE162236F9227219B8B84A3984C649EA82211207C974F6C7575027AEEF57E496A58CE2719096A58E2E31E82844F4D674A4CD9CFCADA79AFB0C63E634D2514BA4D8604CCC42B2EEB64691AAF23727C93C4ABE1423C27B3B7ABF0B649334760056E591C32FE812A753723F7C93EF5524C8E0267DB177E6E55620715688CD0AC70B2A90E133CAEC86945BC74D7EA1CB88479A37B45EAE4993BB7048E5316BF66B9715591148C9A20A35412C2404BB62C512B3800B9AE104453D95ACFFE000D3AE85B96D8092532796A03039BA2154F84AFA4A402ACB673B8799441BC505E836C3B558E1FE2057FA79153E1630D72AFD96AA4FE9C0ED4822AB33A559719B81D274EF0A2773E405761A036521278DF5AB3617CBD89D7543CFC7C6AD373B2D0B781DC78DD3B2AFA34B6565979231681FFFB8C62843DCD11686EA59406E23CDF96AED95554E47027C5B6976F5515BC40B0E3A31C556219F89B73C0871E1FF552CA04C33DAA4A363794CC7C0E05249B53D20460EAA8AD217787C8C9423A7EB71058B5A8081B82454DC91F77F8608D60CAFF30A7C42424542A1746F0F10FEB3F0FA52EAAD4F2D4C36E59CA0A5389566FAD53898992A17BBE0A0F26659F74FC9EC372FE18BE4ED6AA28B7CD84AD1C0F0115DAD011A11D20FDA9EDABA5068AF837BE962F439F233593D193CE5E08F7D66EFB3389885927B89D2523 +ct = 454EBF31D8AB7BE6F8615035FD4F13BD40EE3E6DFD58E307AC2496B25BBB30222661AA2F65A314902C74FD897EDF3230AE401EBC263393C017195ABCF2EE916BF5B8B0A5F5AD109A7F8C049EE62C8E907719593BD3B3D2D35B0EB548C4EEC3C8C11787591967D8EFFE9C9DDB995C98520B4A9CB0A3A3B00CB1EFDE9334671FCE0D5C3052E0FDC48DF0D844C2960419B23AC63BB013BE9761D621DC41BCDD661452EC7A2FEBEFFCCC63B203F26441A366CC8C94ECC89F85404999584FA1B27D66BAD84BD997847B04BF1A594D301ADEEF612BACD232010BB54A8F5C06601E1F95F2C976017D9DF439BBAA02DA479DA944A71FE08082186BF464F3EE043CAD702E5E1F38E76793F19D7ACF46B40EC3D1773183F083F85FB6B2D6DBFC42ED98E78720B11E8C524FEC0A6F86A2A407957FF6D5E4137D8E0D080080F0A9F23CAD84224F558DE68B5F88D05850B29914E9A25AF725C39299546181E7390BF26B1A058F65300E351277EA19AC971FDF2943B44F13D690956C4E864891E397A06BBC70282F229DA50403BC3E354D898F5A079F8CB1333B1F6B0186B83B5DCF264682FAD6281F94FE08C370B2C29BB7FB9F3BEE2BD3A0E408CD1A14A497AB300CB7B39A2C15737F29D3FD9566092FAB82A01839700373C836CA73805C072A9E940E7B7C8739957B7561E90F601B7C50D2A4387D89E1CBEDAA6605062CAD5AFCCE27339CBECBC1CC13B1D690892816B7EDEFDDB90116FC14C6BEEE6D991F72A749830E82E3159B1632921B776EB9B9EA222573BA96355E10140EF9A47695C9F551EF7E2ACB055E54E712F44852604A46057F84358F6C886F2440E55EC68C0ECDE354C99BF5A912C68EDD8F488468ECDB968BF15C9CB764E67315C1A5D585615CE989DA13C8BAA041C448182BEC6005F018437036C296475B83C887E87C5D560DE293C35C8E942BDBE271CED6DD26FBCA0CAC7D1600188F65F32A9B20BE73CED637FE59A24D43B7896A33E58A2858AABD699A4C273C6B2D3AEE18253238F7E44DFA959142ECB729F5011FB840CABC16C183487C18DF53386B81C2EE131DD8959E3894BF36D74B91EA2F117FCD3596BFDC34926D5598864F5FAF775D71B6F17B471AA5EE0FEDF7461324D125AEA4441A1433B908CA4D4693945235B9153A2F1B17B2EA2825CE21101521D52488AE9FBD69B6977A17DF0269AAD0F22F1670AD5D4B95FC4292DE7037BD4E90A2AB0C7356F39951F76A8746C6D16C94861A205DA3F09CD84ABD40C038038B77D61B90FE747E86E41F9CF1E4B745C88556D6DDF1C817D352AE7DEDD801AC158CF4D1C036E39EA1CD1E10A2E1BAB5115FBF61BD52CFB2ABD6F5E96CB7DF1442BFC32F0A3D011691FF429BFB73C5E978E7F349776886FED906480E945103F109FC7616EE73A2F8F0B027E87BF9F4C5D88D085751DC708E1B9E36A6DBBEADBF37A8D2C641AE45A4F31747EBFAD00EF64BD00BB5D1DB84E5F395A914979C62791607A9F9A9AB421A2243329B755DB72A6C26DAF6713711E4D65E287983 +ss = 0D403F00C22FAB72899D302CB536854B934446B62F9DA6D9D6CF1C0F7ABAC2E6 + +count = 68 +seed = CC0C86CC0ABF86FA21899BE1953913C00E7C46E6B5F730C4E88B3C034012763981D7F14459D3081638080378348856EA +pk = 8683354B3C3F035586B50B88C4140F346A05ADA7CE4BEAAA5F096614CC767AF89FFCCB95124B00E8379EFAF76CA381AE4886ABED9240BDA4710DAC62A71017059B07921C770DA1CA2D209338536C3A9B5238313BCE565FB861BF8AD3A78F030B3F646B34347F1D215E8EC1789D602D92A971FA3C2E892A09CFA68968F96F206A7535766ED7533497FB051C8036B0AA81C2C802FB7333CC6744EC830E4BE56EF1E4874371409486C477CC4EE90092D2919F585BA21F32BC973ACAEF42B4969746AB2618631B6536EC298B2828ABF41E24776BF288CA6A4A8094D63C7CEAC44854BA9E4837E44B3A7B269D6CCBB6D1712E9FFA937EC5194A3541E3FC9C685102F9A47FAA077FECD688D607996E5B60C1715E617994B842B46574B87086A061488BB2445B357A38934B612C16168E662112756BFD764A4FCC5F7B1634F6F28094464D600046EE03B4540C1049BB3D18F783FBA2AC5BD36ECDE662D9E08E2A89CB754B090DB7175277941E5973D010AE08A4B4C922AA99F47F657A49C3B81FCDB54C905A3010405ED544BDDA9942BC857B6D979F796C859E0627A5212543477ED791C2ADC95FDFAC9D21D19750B8B5DDB95F02D721A9304099BA6B2CD0A40C1A2F9DC1649B2318ACC93A5FBC52E3F4900BB44D20A7250142AE5F3B77C0720C77104B74C78EB821BD32E260051C499B5CCDD9D716521163557B5E4526ACAF09A2BEDA04994188A5065B4A975B215171EB288024581CFFA37D6289813773B29F1C0EF5587F9C98049F548D2A0C3A5C71C1693B5EC8C64CE0267FDF625485DCC4B5553C5736A0D0623CFE20596F984C014AAC0380BA9B58257A993B1BE3BD2CB9AC25912B36B2C085443074F093510A46CDE5441EE3CC88DC2CD636A5EF77310F91CB21ABB149DB2541407726582B54B50306CAB4B5356492C220C138C64B4AB293680E01C2AEB369BD611064FD8955B790222BD5997DD76BFBE50A2BD039C1F14F0469B623C53195A3B2FF068182D951DAB05FFCE9A6C8FAB42886987B7999043C12870965BD463980AA6B35E13B5BF9C25B64920D7788A291A98EBC30D3785783C27E53CA9AE809004F23706E3CC0B9AC0BD571084100299C932DB2933CD91566AAA367371B16069A706BE664E86107B33B1CF05360248C808EA250FCACAF9096715478463932A1C632CC9A185EEB08583A9309259C567743995AF013216B1086815B851655D0F14FCC43682720ACDFC36F35806894177EA2144F6E28837CC887E560874DDCAAF60A3580FCC7A5F1733180B1F1202A08182345370CC5C46CD28A507AD846D1D9415AF679D4B22EE560C6C1B2499D5B74AA2758DA090E62713343B3A8B14C68E415A3F196C2573C5E828A16CEA51443104F9CD899AD03C3B727774B48AE61DB98FEDA4C1E029B57F89D1735381166B70450215AF92120CA61A8A38E575ABF2CFAA54C613031A9BA60275D23178BA553A3ED7179AAC44FB3607E93C1C57C7BAD6854533844BF3D6A9B95A966F891612239CF6CC41DF1A859AFEA9C0CEC6D2679CD7C71C2CF251DC9759666C871853A1012294022FABDEB2269B430397F337B3F416E528748903CCB8B24C8FA28197244C0AC3A0345E699B247C863E9A58D8CAEE564224FAA36C70ECD281B67EB98908468420B38F3C24DA9290EA98B24 +sk = 5E484946337E3F4135D738B0862B69F7B247A5BB0812D56201300C53BB87B798B2B551CCEA75A87F002D7DE7878ED08E976A2CB62B4AA559BC36816E9690973F608B262612F89B5BC784365E33193FE9013C05818E0A7151297EA53C95089388BE203071D0335535436C799F6D3AA3260A9C8C9C9E36F79F13135C3DAB92914137C33773660AA15557C32B7A086A5A1CFD125DEA60183ECBA94DA22F0F3A18DD2131BC792C4013B7BF84A7840C976C53117653C4F947839D8CB35538BB97899418688A9E062F9FC17D77450D85261AAB01BD9EE77E917966BD26BD3D3990AABC8561CBADDC5A22F8C80D99453FA7350B2A022E4CA48DEA6C9C07309543611ABFC7CDA76AA03E51ACFDF0CC73921EF2D02F45990AEE50CA77B93F14E4BEF44576134391F7B67658E1CC7876713742267A556EA8F562BD858B24E04314B025CCB5BE0650642A23460C3C65E0D6CB68232CFF709204B7B7CAB0741807100A712686B982F632095D7730DD9385A7A26C23741474E12CD8FC259EF346B5F287EB01B046104EF8415372B47DA145AB0C5C1774626B5DEA7D72DB4C62FAB14C03CA51384420690A799194E8AA05BB914DB21956BEDC948299BAED7289C884AB9833C8669422ADF51D4E1A0466056EECA478F11AB55CE2CE34430ADDC889044A5601357EA6A5B097B54252B046FA83C0211C236953954C36840E390D2707848C0B879ABA2354EA200FCA56CBB86C0C2269A81C790B966893F782AAE9A4BD1B02FA85995A757FF2083FD26347C97711E07560AF77CB59C7CD64F7CDBC880AD26A7BD7FCB9B210710E581C49453A3200AC08554A641068E6879BA6665AE9F281FC14C8FBFCB0CAC0081C1A06DB017D80048B324248F699825A489D0726893E109127A0AE802CCA29AC56F6118D209A54CB842C9A8C539E43B9681CB868018C95D872C532A10A77BF52A796D33187FB8AA3FD780BD2C4B30FB7394DC64B0FE05B81128763A1325BD00EBA411247B1C22A1146FEBA1B255C51F74999DD29A9453151BD9869E3D548347B93C1B798FE92A053B88C80D7AFA5C561D31435D61251253B9A4C2B0F42830C81E990006DCEBDDB7002240EE8E276D4E31C2D249B84414F3997B9C4F5C0698CB2A24C48E3605F6D704E5DB734EAD12D62634DEDC68ED6A1248273BAD5ECAC0651978B098FFCC148667671D4B59EA6095B0B363C31299E5B90282F914BEBC66F6291338BB7600C8310B83963336952EC33854ED7C979B71F30188180B11BB66314C93242ECB890123C9F2AAA786ACBC7DBF560CFC1625D06C3828998ED51B79D28C583BB38719706D1D67B9BA5A556CB9EE1DC4FF2C53C33969F2F97BB93056729F65FD90AA2D7113EDF611C521761BE671FE37BAADA7A2B4A114DD458A19966A2A42914D61B47AEF5ABCCF8240C88AF752B51BCD0A3788C2AA38AAD8DC00D835476C8386DD3A8628B261F1D6B2B9F771842C97DA7BBC3D03696F60524BE6476430044F6A8AA48C22901F750DC55C1EA7813EC3518B26B3FD0657EA6FCB6BE94C026244A0401593664673FAA680F866E174143B0CC086FDACC1F7126C3E941F090332D8487D5E66061D5311C9B5C8EDC39BDFC34948400A9A3AFF3A85A8683354B3C3F035586B50B88C4140F346A05ADA7CE4BEAAA5F096614CC767AF89FFCCB95124B00E8379EFAF76CA381AE4886ABED9240BDA4710DAC62A71017059B07921C770DA1CA2D209338536C3A9B5238313BCE565FB861BF8AD3A78F030B3F646B34347F1D215E8EC1789D602D92A971FA3C2E892A09CFA68968F96F206A7535766ED7533497FB051C8036B0AA81C2C802FB7333CC6744EC830E4BE56EF1E4874371409486C477CC4EE90092D2919F585BA21F32BC973ACAEF42B4969746AB2618631B6536EC298B2828ABF41E24776BF288CA6A4A8094D63C7CEAC44854BA9E4837E44B3A7B269D6CCBB6D1712E9FFA937EC5194A3541E3FC9C685102F9A47FAA077FECD688D607996E5B60C1715E617994B842B46574B87086A061488BB2445B357A38934B612C16168E662112756BFD764A4FCC5F7B1634F6F28094464D600046EE03B4540C1049BB3D18F783FBA2AC5BD36ECDE662D9E08E2A89CB754B090DB7175277941E5973D010AE08A4B4C922AA99F47F657A49C3B81FCDB54C905A3010405ED544BDDA9942BC857B6D979F796C859E0627A5212543477ED791C2ADC95FDFAC9D21D19750B8B5DDB95F02D721A9304099BA6B2CD0A40C1A2F9DC1649B2318ACC93A5FBC52E3F4900BB44D20A7250142AE5F3B77C0720C77104B74C78EB821BD32E260051C499B5CCDD9D716521163557B5E4526ACAF09A2BEDA04994188A5065B4A975B215171EB288024581CFFA37D6289813773B29F1C0EF5587F9C98049F548D2A0C3A5C71C1693B5EC8C64CE0267FDF625485DCC4B5553C5736A0D0623CFE20596F984C014AAC0380BA9B58257A993B1BE3BD2CB9AC25912B36B2C085443074F093510A46CDE5441EE3CC88DC2CD636A5EF77310F91CB21ABB149DB2541407726582B54B50306CAB4B5356492C220C138C64B4AB293680E01C2AEB369BD611064FD8955B790222BD5997DD76BFBE50A2BD039C1F14F0469B623C53195A3B2FF068182D951DAB05FFCE9A6C8FAB42886987B7999043C12870965BD463980AA6B35E13B5BF9C25B64920D7788A291A98EBC30D3785783C27E53CA9AE809004F23706E3CC0B9AC0BD571084100299C932DB2933CD91566AAA367371B16069A706BE664E86107B33B1CF05360248C808EA250FCACAF9096715478463932A1C632CC9A185EEB08583A9309259C567743995AF013216B1086815B851655D0F14FCC43682720ACDFC36F35806894177EA2144F6E28837CC887E560874DDCAAF60A3580FCC7A5F1733180B1F1202A08182345370CC5C46CD28A507AD846D1D9415AF679D4B22EE560C6C1B2499D5B74AA2758DA090E62713343B3A8B14C68E415A3F196C2573C5E828A16CEA51443104F9CD899AD03C3B727774B48AE61DB98FEDA4C1E029B57F89D1735381166B70450215AF92120CA61A8A38E575ABF2CFAA54C613031A9BA60275D23178BA553A3ED7179AAC44FB3607E93C1C57C7BAD6854533844BF3D6A9B95A966F891612239CF6CC41DF1A859AFEA9C0CEC6D2679CD7C71C2CF251DC9759666C871853A1012294022FABDEB2269B430397F337B3F416E528748903CCB8B24C8FA28197244C0AC3A0345E699B247C863E9A58D8CAEE564224FAA36C70ECD281B67EB98908468420B38F3C24DA9290EA98B242CA3D8AD2DAB1DD8A2F4320658FE6EACABF70D907920593919119CF3745163360F4DFF8E56F68440836A072412A30D851ACE2C7C6F02D60E7A8420001A63E6C6 +ct = CC6EDBDAE7FAA07675568A32E556B25F34740418B3603A6ED17CF2943C1531B60542379810B7BDF525790222217880D92343AEDEEAE9D5F1FF7773C676B1894399F36037DDA6A1F2DF2D894FE157A64BBD04A0948DF19303CAF2A59188FB0415291246E115F0663C17DDF4259F2326C3E1C6ADA0A12E69A6DFAE45E3B6C6F8952B09D9C1721886076BDD8FF34878110ABF83EADFC84DFD1F9A426A533E1AC51D87AA50E3EF4F05DB558713D78ABCAEEFC2C98B9900D0A3BCCC818D5572E6F47F99CE87F687874CE23CB1ECFD88D3107D61C2862FC306BA30477BB7A0D121DC6E378D6C20A4F1C300FE69EBDC020F2585A539D972A3A935A2F1D49697F9696313D7AFBDEBA2E97A2107AE83E7D3CCC6ED795C77263D3B4C3632241E0F95028A2B3EB37385B847F67BC4E0F5BAF7EB89E293BBC95F77D609453023934B5C04D34C4AAF06CEBE6C122F76A3608C48FA264A59477B5F41C63936CFCC1E86CD443F9F8FDFC5741CE9CF25F4D4B7FEAF143237D6C03B684514D9C67CEE6BAEBF58A43F10383F72E9CF74B2FB8B865A450756764894640013F2C569E1DDA9DEF2DFE70A48A78510DA2EE18F17279688BFF62CB2F48F6EF0D72AFFE36CE9F656E723B692E418CF98E5A2A4D72E908F148788FD04D680497084CB01795FCAA77EEEBB0AC2C600351C84B4A3D1F6C537E9D9CCF373B2A26E7EECCA9B02183EF4AACBD24BAE4863A40B1A5F3C60F514D718B345A62C15B9F38880D00E50A01A18E7573B213A8DADFD54E2064C9A64CC6354DE8CE3E70C2F1457CC5F0F54055E5F0C05414C125CE82A398F025EBF224302429D818BA3838AE58F895C97130C1DC5CA577C05152FD543F7E6C1E292D8B7B6757023685D8F57A0F44BAEE68375F4D226973007275426EB9EC937835A2E26A1DB9F4DDD63F415E3225B6689210FB7FA323A479A59702F13C11425EE68C982F0106BBF4F6B01127F3BC7801D6B52F3B6226E73EC40659E1FD9A22B33F8614F514A20580C56859470FBA19AD5A558252F939614D1CAD9E3760EA33BEB784D311305EBB0A00CBD28C6DD9902F0C3CB5A88DBA565A4F494E1ED31C657A81685F706B1B0532E0DF6B8D9D90E3318125F1ABF6EF69E3044C04DD09599DBFCBF3E473C022F4B5A2DD2437AF91784767B2763FB99494BD13AF326B0403118DB6BA8271E34016548F56E4E5C75D2002CF237D5F5C26F5AE692444AFB5F6C51958B83B3ED983D248E0FFB8C0ABF455C34D17DF51A8F86C5B3044BE0660D7843033194A1DC4B84D475C089EC2AC1820A0B79C26B7CA3F888F24F784A54536FB852ABD51B0CEF758C855FE33FFA2155F4CB1C0F4AB9AB5B0D74B31067E2C6651460A151D16252F32CE4E037516978EECB123E23671B453B31893601D2D79F22ACE7EB3DDF6A22714C5AE97DF6BEF6EF3ACBA526AFD8920F2CABA016C10CDA20D0C39B32E78D0BFF0CC7A445753CBCAD615B55CE00851C70A92DA2421CC9105A85B6E642052F2692FB84CF642AAA44A9EB7572A6974FD3B767B4E0 +ss = 8C0346216CC65F95D2E0CAAEEC4BFFAACCC49132CBA2DEE8F2A6CE1F922E6DB4 + +count = 69 +seed = 6D5A7CC326ECF3983C4E7683F45263A37F692F3BCD2D920E1FD9584350119E74F9A3F905F70D3E20318C1413DE2A0DEA +pk = B147B4694B12C461130F3126F8F71673E4643B2147DED2A7270AB360F6303DC05B03A314BB776C488318686069C3A4C91CC62435E829A6A8621EF5CF838311A4278D7F453EA5484D32F94C2E9628F5532FF93771DAE106C8AC9CC80AD07D306B1DA78463A08226657680E5ACABA6819543CD96194AA5973D4F7B8682B13A07E7A5194C91EC95A2D671A2627710A4C78AA107B3707942D0C78F3EB2B3A58B7833FCB0FD7785E349A2F0027AFF079B62A68E3F425122F7BC0A0B4C053A6696F90A67088F139B2A39F542D6439091E4C1A0824734D8B6E5E6483F48CA738C39A5BC2016C0746CFA9C1889297F5377D614ACFF2833CED20ABED0AA6C7024221B73D53610575C6D91A262A5E834ABB63CF74207437B31B1E989ECD7416B2C4E7BF807B5F8973006877E204A42774C93A1B394E885CF727B7FD286DEF2B4C8D5684460219C31B1B225AA08AC2EE1DA3922E935E981B3B5E2C3D044A784BC965A580D3052AC48000EF6183B94B0A870E65207BA8029C0BD34A10443E5706792207FE2224DA533D307C3E3077E6E1CBAD064B0399ABC6F445B651864F18B42E1A518FEA187BDD08072E47588527C3B9A5EB244AE9E910F93C92B69FAA7250BCF38E68E9C3A2B2B733B18032F37673907097A4CD65A9B396DB4859312D59113E07B39746C52126EA697A69929B1B625B5AE1B809CE9A811D13CCA70971AE8BD6AD223206691AF6897F136CB451699E0A19739D52D60CC89DFD654A320A79B2C7CD55116843239D6847B8BDC1EFA29CDC0A979F0E3A8F225A16FCB7996FC8CA3E79FAB55B93DC2A395117426A17AF4D404151814CEC80E856B777EB35085F1AD14285078803C2D76AC1D25C3F8609AEEEC4ADBCB64136516A2077CFF4C13748C5D1FE6386782688D944E0027A2F8C9AF77B79352EA5523767CBDE4577877AF1F8017E4DB244E833E99DABD0FC70824BC3C50A38275040446A5C74406873BA0B5BFC2570A406570B424727379E5C1C39EC194A29A8AA249844BEA2A078C1C0F25A400D6BADA80731A00B87BB5A19325B4E79B78AF0BBB2C52C3DB38AE552CA972C3927291145438115A952BF2A85E78F6141E1CAE8516B056E614B7015017E71D54268AB9919B7EBA09D196768D99651D60A334FC443C8CCD9064A420263A68531F0E86CDC48776A3D44B4726916273A0D3002DE095526257BC5E6246DCC10814D1907885207A53241A184AB7E40D87148A336A33262A4BB0826B417ABCDF957F68737ADEE682194115348AC58814661765BB321254A874C4A3C6745CF984528C2B9726AC35441015233219E169D0EA761425C06513720881B330185B48BC271B275DC024419D8761EB23801EB704F6326F162656713ACC2915A1A6F877A583C8372CC391EBCF2CB22873C5BD22C58C80640CCE759B2C09B368AB4AB504C613493479B7725A18811837213F9237734577AF09C4BE0B3FE07AB78B712B0683060BE76920CC5FC56993E56C7B46A543AD675B2D13357C008911320E0D292268768B8370C66CE757AF191BB703CB5732113ACB8F02618EAC98693224ABCCEA04E7B3157C03B27A3CC4F0B880DC4877AC35077C1C2D5584B971261D2C4BB767C75907827AD7370F4074721445E155A3A1624CB4ACA373DE6947F148CA7E2B3C93605E706EDDD992 +sk = DE4627135B3976B8AC07C0059BB28D09E98E3428228C1786C2E8A1D6029D93CB9EED217D09B03E9A7561AF7441E4271C7B6C8C862C5A93E955A05A87B01A63D9E8A334B26E1FC0346051BF31D078860A9AFE939F4A90C2A395B2B6C205475164E36A0C2930CD26E26420470B0D068E36971A978B17BE984A418A3CC5C6B62AB00D6DCA5657F71E08B215EDFB88A5B6751EAA525DEA4B0BD41430388E0CFB445DA3347EAA375B86858F19C81B73A4BF88C2F807638D808F78535B9FC6C6BC0C1402E16F0B784F9A22A30E5C6C1932C2063BC558A7B2636C76D5C0CB77E6C5518B3B31D920A23B2BFFF3AB93FB03B3386F670B07655989C5185D5D393631E9ACEE701DAD333379A63EFBCC636BF2B4FA05B84A375559079C5909651E481DA96B01A771BEFC7BC407DB7D9F94B819A468D443A7AA8C9B4741266875268602336C1B1160A4CE5D41C57FB915335C87A72A7345316373D921A6D0CA09606154199C4F06C244A7C568BC5D82449149F92AD3350B51D3C474E77A3A1053160570C876132434AEDD92C8961B95588910102C62AE1A75479175CDD666AB85478EBB6133920E9154441F1383B0F147137614DADC823F1848FA478B1F301D3F745C647C216C741DFD3B3195483F24F1A5313CB458273FFEB559689004CD534EC1369B0C68A873651F7413037118C6F98C538DAB9C1EC649FF2301A03A650CC0C138E79D15F9079A639737E840A7DC720B173BB329A34CF65418495E4DF2805A491A4C96B47D452725850CA8EB3944399F9D14157FA46B76F0891525461113766DC025EE1C2E735198C3DB253A2B8A566CACB81B65A1C9473C6C6DA9743D780685CF83CEBB441CDFDC9FBA20A9CE2943759C4D08C57A0E74BB0E1888E94723169437AEC19AEC1A2A46C81AE4645DE32BB18F3527F4DCB8221A0F7BE74F3F5A8CAB0609BE216465819FB858232B008A855C9E6B54439A67AAFFD9701967BC46A274D1D6AC1D45CEE7C54CF49669E89A44FFD7B73B2A12327A85BF5938E6975B949C03EF3A1D824CCDE033CB175A3356C8A998E4C69D94630A896606FC1979DCB5C172A54EEA2E99D5AE331BC64D708FAE45C514A2544843CA59C3C122947BC3660DA7357AC0E33F55485E79EB3117D14C42EC5C56653E0DD1A4E8205FE571823098AD8D9844A25B92238063A92040C500CC0BC2B25B493E4CF69DE95C87B03B773A796D13F42014847727345888EB06D9251AEDE24D03E292CB452A3A38A0A461C8B4F9CD9F87B09BC0CA98E62E5027595C24792F818865777A346004FE3B5B587452648263AAF688154526D591ACADB74520F3627D7395EC7B71DC3C6E8414985D591A05C88B6455870C48B12C576D7B328B88795295C051CA6293B0FB4DC61AB8AD34CFB114A4C7E44AB4667D4B1948C83C28BAA424B19370AFE997D8B08E447A2EFF376024F5CA54DC8EC0972B96F057ACF5A6B0D32869FAB3E1797EE2571B1620A076082C4BA6799C27B07FB073092A7A2F7AA110635CB94900E487A6664B318F54956039C57CE509EDE489FAABAC96CB11F58C87708A8ED3408A526701BFB8507D67415FE64E7D41081AC12C21F3092AF02810C604F02C4064E348B4F98F6BE65D87650EB147B4694B12C461130F3126F8F71673E4643B2147DED2A7270AB360F6303DC05B03A314BB776C488318686069C3A4C91CC62435E829A6A8621EF5CF838311A4278D7F453EA5484D32F94C2E9628F5532FF93771DAE106C8AC9CC80AD07D306B1DA78463A08226657680E5ACABA6819543CD96194AA5973D4F7B8682B13A07E7A5194C91EC95A2D671A2627710A4C78AA107B3707942D0C78F3EB2B3A58B7833FCB0FD7785E349A2F0027AFF079B62A68E3F425122F7BC0A0B4C053A6696F90A67088F139B2A39F542D6439091E4C1A0824734D8B6E5E6483F48CA738C39A5BC2016C0746CFA9C1889297F5377D614ACFF2833CED20ABED0AA6C7024221B73D53610575C6D91A262A5E834ABB63CF74207437B31B1E989ECD7416B2C4E7BF807B5F8973006877E204A42774C93A1B394E885CF727B7FD286DEF2B4C8D5684460219C31B1B225AA08AC2EE1DA3922E935E981B3B5E2C3D044A784BC965A580D3052AC48000EF6183B94B0A870E65207BA8029C0BD34A10443E5706792207FE2224DA533D307C3E3077E6E1CBAD064B0399ABC6F445B651864F18B42E1A518FEA187BDD08072E47588527C3B9A5EB244AE9E910F93C92B69FAA7250BCF38E68E9C3A2B2B733B18032F37673907097A4CD65A9B396DB4859312D59113E07B39746C52126EA697A69929B1B625B5AE1B809CE9A811D13CCA70971AE8BD6AD223206691AF6897F136CB451699E0A19739D52D60CC89DFD654A320A79B2C7CD55116843239D6847B8BDC1EFA29CDC0A979F0E3A8F225A16FCB7996FC8CA3E79FAB55B93DC2A395117426A17AF4D404151814CEC80E856B777EB35085F1AD14285078803C2D76AC1D25C3F8609AEEEC4ADBCB64136516A2077CFF4C13748C5D1FE6386782688D944E0027A2F8C9AF77B79352EA5523767CBDE4577877AF1F8017E4DB244E833E99DABD0FC70824BC3C50A38275040446A5C74406873BA0B5BFC2570A406570B424727379E5C1C39EC194A29A8AA249844BEA2A078C1C0F25A400D6BADA80731A00B87BB5A19325B4E79B78AF0BBB2C52C3DB38AE552CA972C3927291145438115A952BF2A85E78F6141E1CAE8516B056E614B7015017E71D54268AB9919B7EBA09D196768D99651D60A334FC443C8CCD9064A420263A68531F0E86CDC48776A3D44B4726916273A0D3002DE095526257BC5E6246DCC10814D1907885207A53241A184AB7E40D87148A336A33262A4BB0826B417ABCDF957F68737ADEE682194115348AC58814661765BB321254A874C4A3C6745CF984528C2B9726AC35441015233219E169D0EA761425C06513720881B330185B48BC271B275DC024419D8761EB23801EB704F6326F162656713ACC2915A1A6F877A583C8372CC391EBCF2CB22873C5BD22C58C80640CCE759B2C09B368AB4AB504C613493479B7725A18811837213F9237734577AF09C4BE0B3FE07AB78B712B0683060BE76920CC5FC56993E56C7B46A543AD675B2D13357C008911320E0D292268768B8370C66CE757AF191BB703CB5732113ACB8F02618EAC98693224ABCCEA04E7B3157C03B27A3CC4F0B880DC4877AC35077C1C2D5584B971261D2C4BB767C75907827AD7370F4074721445E155A3A1624CB4ACA373DE6947F148CA7E2B3C93605E706EDDD992DE62EFF56F6B49A156D065D85EAF0AA21CA229A20FA4E1372A410AB1C4AB6E7EB28F7E7A15A005F92400CE33DB073D49B53871594A88FC45E0F94207B5F0F2DC +ct = C543D4032D1E98D70EE56B5B7AA1AA456F157F9405CE77EBA7F9C61C8D4634834B2A3DD128ED8022D30D6300EC237AA27B302302932082D9974B04DA94EDB0288EB04855E224669CEB3814CB91854F47FA0BFDFD376B0620DEB5A230C1705555C8D45BFD2751F57E2CF296276AE1A4078DFC4A98DDD7E5CB419B0F0AE1C3CEC1FF4FF1DE6D316CEF569D428C89B9C08EECF992B80CC2C4E5432C1DBC505E3A361F8570E71104591049F72B2C9B17869DB01F14AB30630726A7AD7B6AABE63270B81C033FFF7BDEE9E4189FB9D53BC910DFB3FB5773B8EEB63FD38B32DE2AD0EBB24FD3C7E0AF6BE8970602A270107C0B227A3D35677694CDA2128DF7EF7BA60E5F3D5255C04B817B3B01316D6B6E3D1159693FC7B27C3D5BC8ECB1C82403C7B736CC0844089DA19D5945FAAC08B074605D14B7B3A51DDC7ED207D84820465E44AFF42E9C5871E0FBD1DC147C79868D65911E5966D3480ECF644BEFE22A120C8D069E867D3132F44AE3482A1EA00A1EE14A5240C8412E0E07637BB2859A9C6A6F5B5CE2D7C810B9281A949992FF7A6CD4A7E3474625013E86F6F2713932D2C33C5D65AE15F26E7E45A5A24B9205574282900580338A26D07A2066C050FC5C44972ACD5DC2C2A0FD1D8634B34A4D839B5809D3AB4C14800722DB9F8A94D0239AF0A5C756AA815B1F733999C6F2DBF7E144BF2E2B8C6999394817A1875F4EC794680A4C509046FFC64C4D84D8606A19EA5EC8CDBEE7F5199037A8BBBF9F69BC4159A505B68BDA0E450695977A586D9917E843098E3C7F97A80DF5D092172E89364B1EDC37E8A1738E21FFF20170B157775B4F8F6B9DDD5D0202E735FCD380649C0F0EA7E7C708ACA92A3DA4AB0727907646C78203C81B9816ECFBE1D2B00C85ABFE0EE7BF92B9F9381EF3684400F5ED6625599D472D859D9A21060CCA7D37174945048EC244550EEABD26747F8D2F6C2D0293FFCD68046E5A83E651D65357CF82CF59A6183158F11C114934DC98E9E74CD9AB8CFB4C0811DE80B44ED75E37D1459B614801A548410909E2B9763AC2CDBC1B31F11C5DA7025E909C76465A1BD2E7F0813FFB2E75BFBCBC79B92F0F5220103F2AE62D957B9D69787491A556F45CCFBB7CCB005D5106817EB97ADBE2B83180D242190A54B88BA1FED0FA8B5BE2B264B1D9541A28DC321F0F3DAE9EE41723840EC7B703F41B6635AFA3E683B42364D69F5C5ADD12B20F60F5B3D1E19FFEAA3A98F4D61B3BF1F5FEB947DC586E5D13805C710EC734CD680EB89FFD9CBC1DB5AB3B2E01DB928C7AEAF6F91EC3AE0B48C3E133CE87B6561175C65F9A1417D048F8E9636F5751C62DCFD7EE7BEE93FC5CEF56E0D005AD82CBE3B93BF7E07DF37A8958FD74113F6765BA3614D89DF1A27C49998C88B65A2087118264FB5851581393100EDFF4A3FA54E807B042E62981866ECFE07D4C1E5DE3D49283E18E306074A332ED1E090DA35912DDE3C10416FF0A5E056C0F3BA4734668404E02EE2476C3400A51D7D9EECB09074F23CAC5FF87603BB4 +ss = 35151C059E5220D4ABAB9380FB0EBFA061148E6096D8F5678E4308CBA0226261 + +count = 70 +seed = F68FC0314DEA88F66AFAA76E6C9B6804B13D4876924410D1F526FAC59A62E26C560B125B1D0F8B461F1FC2E351EFFB4F +pk = C0C8122855031D7BB0CA735042BB43B8EC6EE13061046ACAB9B873B13519C22678ACE2B59F92AA4E8269844B1DE5E3426D66C0451A8D78CC07E719033A536C2BF4C7397C64C6478BE5F42A06413B8B44111AD9742B8B020711446D63CDD64490C0917557B884EB429B05DBC0DF7ACEC032ADBBA55D3E104F7BF391CBA28B903A07712A8DA3A1A92F5682CD650A628573844032A307704FE77AF738696E974181A85C5CA1C14F7546F8713701115883480BE2CC686625A37B62292367B5E1546F4189592639CDA4CC20974C6A87C0377D15B8EC5C84B70233B64800B79C62E536553B43263532C6BC2B726970CC58BB20F0C0BD35B317D9B66B327BBEB5175D9611985AD799EBB19AD0587AEB856C288464D983256649827DE9AF0FC79AFA1AA5817C06D3447A25AB3EB8248167BA60A4462ED47C007107B1EECB630AC4707B837F24D26DA46BCDA77C4B6ED5B4118B79294744788B9A9C21B168565D9398B41EDB91517493F5FB48AE5CC04FB95BB13A8FCDB8615262408AE25C2985189BA8AB99643624B70557A984011474586C357F1C7551F0BB069336FE85BB903040F48C4A111113507055F2716D37EA6A6FFA48F40584914C4738397430D65756F298AAD345671077DA8A4173728364A493BDCA944B1879B114166CC3B8293937221257C2E78F8F1C7794ECCBF0368CE34921A2EBB01E32A92255A676E77C39564B575AA5D1F9C7D1388226D636F4F12C5636B2E2F712C59CA583A811BDFA56448C013CC820F21A36C3351AEC3C2C6F01243FF47BF17181ECAC752108C43A97729C6B9472270FCEF5A7C08665F7AA9FAA55B152163E8446C1BEE5082192B5ECEAB269EC13E7879DA3768BBEDC0A104C5E9496C63E9507881A4C8E758211076653F369E58B59BD7CAE5B9A64772C2A84329E43F492FECABBB56514CBE70970F361E6D3C6595065F6CC668C64BAE7D587FA8BBAD129136D5C9B6F757A51E653D2754AA0E35307845A55B80086D5A0E86302D306B9EE1550419B495D424F701A098220897FC47333D5A1E994C8584A00D79804E4989A1CF02DCF9A0AC2AC52BE1090BB149778235FF6091075A5360CE095CB705C81E3BE126984F51AA471F90FF98C21D3989FD936502A8A2B38C4A2320A618DF751C7099D1063495A6A5936C744A094CC1FF1B04BA8B56B0464E852BBE06176034CBF5239CD2C687FACC2CD37329ADBEC3A77B4842AEC40BE902E8AF72FA5805345668408CC7B6073097391921E765E4D76025FD5C78E246DA268A4DB21446F2CC3273861D2081DAACC2CC775631927B709DC1FA8993B1E92619590C08940342219682AF351495B2E0AAC74786C897FAB196ABB609E216997C2C7B283BFEFCA4B1F2B1B6E98991BB32424321AB7D61E4D13C44DC93295A75F6145BF2D4B8F1A03109BD7038EF4B16FC15F44CA6EA3411B68400EB20C46C11CBB98201D705A6CF4F4B792AAAE80D97A6AB830576AA651142793FA7DA0B8BEDD877217D54897375EC285849A79268BABACE85176842C601EF8C740A21C2C5321436A21CB968ECB5410E811912CB0962F713322021516535907914B86E9411D27CF164B580528768AD37B57300DC201557BB0A142D9416ED7AFEF52D284175DEC18F24979EF5BA8EDDF7CAA3880AEC7B42A147E75F0DD62B3D0 +sk = 84D7070EE80107976BFD1B0DB6CC33F3C98178817D8460B63DC012311638AA43B253A705BC994931BAB38A62C5D1DBA793B8437BD600A8725D36AA898E353D6B955B80F8578F855BCEE194CE2C6E4C6179ADE8176E34578FB24B6D60C395B674A7A8A4C72550F83A09D24582F94125690428A4E76972B77A53E852FF3718A440B67D6521CA699E5A8C434DC47A38032129BB76BCB4C810028938FC94F1741A1FB26EC95252E259B8F9176BBAD8763CB63DA6F295B460CDE1479BE8D6B9E3C49AB77845C21C8F3F88741759461E339F76376AB81B4F07E7BF0DB861A4AC5B24E09D4144AC900B43CEC07F1DD2CC4F7C976EB0BAA4D8637BCAA70946391109981E978CA023313B200092D26CCC823EBBAA85B8BA1680636D0BE656F01769555B058AF7825FA00D10A38B0A2B127A773CAB406C1D4310A0882889759F20B44AECF68DD24416D9491CB523A1AFB1A1ED87B28E5589F4059132603E228B185D426F49031AF8FA21B11CB0F37C4557F94B2F158340921F95091128C5616F54105D47253F150FF335081D231F5B308A526B9506B03E0B5C6A88394F0C9C6E7C2B475C7508A3A8B1E0D571D1C364784CC8A7CA7AE6C2B24366A0D2865658D42A8495B24A16C9A9D8B1EA77332A1058DC292EC02C4723FA7204E93EEFC24F10C4877425975CBB6142026A2AA649FC6C77E8C72DD3E5B0D9E9495A02C251B12B7AB51F6A9853BFD151A4873CAB4102DB62676496A8B38C8038E4C6D988880A6B2774875A5FE69693D9726AF64A51D77A03E523BAD8B2A6DBCEA137A051D19E81059D07437E38DB7891956C5B2C8ABE282B5A02A5530C56A7B4B46DAAB256588B04344365313A3AD94A2D7ACA4BA7072CB9259E2676A5C86215B24FAA159BC18BCE05451C69D2699A056ED3F6A7F2BC7676F11BB06CB72DC53D7EA6BAFEE89797B57445F3AE11262543A2882B863CDB455D5EA03EBA56946DC61D798A76BDBC4CA7F2A102C518224A2091211EC4D251CCFB08AA2598065A79B8B61A56E925031A579AC5BDEEF1A6E0B1381FE180DB008F19E775E030052A624B91D1550FE5365260150CCAAF228ACB8FE471D2C8B4B27BB57D62AE9AD9CE15A0B72ED98B8A619CFDD3A17ADA37CC455D77640EA327088E9C33D4281B65DC9A27C68D27088B1F2A5FC586BB0993753E62A67BC3886048274AC267A95B42AAAC3E60C2699321A79301ACD350B92899A2C0CCC4703B243660A39C5901E3B6BB146C588DD3431C4A5BEAD8AA29E04F8FDC0D04783751707CC25AC359952ABE7384F839B42D9C9982DC66A21C7FB5CB7316748423E25005D389BCD56FC498080F88CD75EC974CA9CE9F2BA995B50ECA85CF09612FCBDC492CCC6D0662A59F8CC0FF3355F17424ABB6C774A377B81C12B9982F60777926BA0B860123434CAE8F926E902A5E633019E3C62087A1BDDDF2186768BAF91656D903C4F1CA88163B8DCA041823BB6EE525583816CDFAFCCBCFE63DCAE0B93C46A14FB72114194CD084C208921925E7C55EC807EE6C0A8DDB71C4AB3BD5836B7FA160009DABD1E5498D005718548324B0339EC71AC4A75C81F522DFD92B64E3676B337758490E068C3CC747BC004DA30CECAB9C542FFCE826C0C8122855031D7BB0CA735042BB43B8EC6EE13061046ACAB9B873B13519C22678ACE2B59F92AA4E8269844B1DE5E3426D66C0451A8D78CC07E719033A536C2BF4C7397C64C6478BE5F42A06413B8B44111AD9742B8B020711446D63CDD64490C0917557B884EB429B05DBC0DF7ACEC032ADBBA55D3E104F7BF391CBA28B903A07712A8DA3A1A92F5682CD650A628573844032A307704FE77AF738696E974181A85C5CA1C14F7546F8713701115883480BE2CC686625A37B62292367B5E1546F4189592639CDA4CC20974C6A87C0377D15B8EC5C84B70233B64800B79C62E536553B43263532C6BC2B726970CC58BB20F0C0BD35B317D9B66B327BBEB5175D9611985AD799EBB19AD0587AEB856C288464D983256649827DE9AF0FC79AFA1AA5817C06D3447A25AB3EB8248167BA60A4462ED47C007107B1EECB630AC4707B837F24D26DA46BCDA77C4B6ED5B4118B79294744788B9A9C21B168565D9398B41EDB91517493F5FB48AE5CC04FB95BB13A8FCDB8615262408AE25C2985189BA8AB99643624B70557A984011474586C357F1C7551F0BB069336FE85BB903040F48C4A111113507055F2716D37EA6A6FFA48F40584914C4738397430D65756F298AAD345671077DA8A4173728364A493BDCA944B1879B114166CC3B8293937221257C2E78F8F1C7794ECCBF0368CE34921A2EBB01E32A92255A676E77C39564B575AA5D1F9C7D1388226D636F4F12C5636B2E2F712C59CA583A811BDFA56448C013CC820F21A36C3351AEC3C2C6F01243FF47BF17181ECAC752108C43A97729C6B9472270FCEF5A7C08665F7AA9FAA55B152163E8446C1BEE5082192B5ECEAB269EC13E7879DA3768BBEDC0A104C5E9496C63E9507881A4C8E758211076653F369E58B59BD7CAE5B9A64772C2A84329E43F492FECABBB56514CBE70970F361E6D3C6595065F6CC668C64BAE7D587FA8BBAD129136D5C9B6F757A51E653D2754AA0E35307845A55B80086D5A0E86302D306B9EE1550419B495D424F701A098220897FC47333D5A1E994C8584A00D79804E4989A1CF02DCF9A0AC2AC52BE1090BB149778235FF6091075A5360CE095CB705C81E3BE126984F51AA471F90FF98C21D3989FD936502A8A2B38C4A2320A618DF751C7099D1063495A6A5936C744A094CC1FF1B04BA8B56B0464E852BBE06176034CBF5239CD2C687FACC2CD37329ADBEC3A77B4842AEC40BE902E8AF72FA5805345668408CC7B6073097391921E765E4D76025FD5C78E246DA268A4DB21446F2CC3273861D2081DAACC2CC775631927B709DC1FA8993B1E92619590C08940342219682AF351495B2E0AAC74786C897FAB196ABB609E216997C2C7B283BFEFCA4B1F2B1B6E98991BB32424321AB7D61E4D13C44DC93295A75F6145BF2D4B8F1A03109BD7038EF4B16FC15F44CA6EA3411B68400EB20C46C11CBB98201D705A6CF4F4B792AAAE80D97A6AB830576AA651142793FA7DA0B8BEDD877217D54897375EC285849A79268BABACE85176842C601EF8C740A21C2C5321436A21CB968ECB5410E811912CB0962F713322021516535907914B86E9411D27CF164B580528768AD37B57300DC201557BB0A142D9416ED7AFEF52D284175DEC18F24979EF5BA8EDDF7CAA3880AEC7B42A147E75F0DD62B3D066F161D27DC34E1A2F4B98B14A2B221D7EAE26A593BFE432487D9994CB480656D8128601C28B1DEF8D393A0DB283229F7C7383152A814E7CEFE8EF9D9768C473 +ct = DA35DF2985BCD9A10982F3A0A88AF1EE00F083E6A7CF8C64D49E72AD03269EED600E6FEEDBB202CC5FBB12D0F35020B77FDCA235243A2252C82EA4E1D6120262A8CE8A668087D8AD506212240371E5BBE49CF86FCF157E7E284877BBA3FDDD12D2B0BD809C0C29202F07914683F5A248EB748FBFE64C8186CF4B14ACF2F5DE8755E35FA7AB5CE21221576EB118D2D2F9CF5AA0C1D5F8E6ECFBBC5B58D58B6EC340D703685933136B0544016F4974FA814B4AE34688E8FEDF457FD28DAF52784EFA7667041D272275264542B3E04279FE41B74F463E1D77918A5A4D6E1735771CBA792F7B9B014113A96E7A37D318E5A0137770A8F8535D8E54AB1E1CC4F879DC0FC5EBABE4711D940FAC307DA1D1152EADD5BB2883D47F4004EEB4AACA12991CAF663986B4D02CFF065C653B6689FB17F219808B5338319A357D4CDF9D293DC4C4391E88C481B1F7954BC875D6B0959AB89E540291968346632FF24D722A8AFE0E085ABFCD28BE0524578A97DDE657EB9B448DBA91AD1CB58F86FE7626148EAA1962061819821F95D221E7469FDDEEE982B47F3DB8E1B330F84DE756673EDCBC484C645199D92F637173E853E02A805D3E2D9E311E5ADC58E762E8F8D5B64A4CE0EBAC2BB9CC7D738C018FE43FAFDE7C8A1174C2A81C1737901DB8B1F230EECD6FC269EC01396E6893F23BCA652A1A6E3C501FCF016E4592AA5419149BEAF877B8DDBD2B5F9073D5BF532CD1C65161026E0D0CE1969B3B0F208FE23611F8052D54D35ED967E327613B6EEF23A473EFB91D9D23A0B429593F68C61DF78035642DEF971298B70820A43920FE8CF29BC3EEBFECA730DF4E9BA41BFDD3A00E494451F3F19498F3DE4398AE829E5DA0EAA288F9757E7DBA0CE162DBED3B8D7FA9D22D5912B147BD8B88613BB9ED81A9EE73B8FABF3456537F8AAD9B9565C8A638F96F05C9E83B8F147CF1FA829489352AA273172A577FE238A231EDBFFEB6953AB06D5AE7DC63F46B0340F78BF836EB2BD5DC4D72A31260188A888882AB30556EDDC2283879E6481A31EC28A8F3CA1A8DE59E1909B5A0B5A49E4F530E9A0FB285E970A8314F4EF7E8FEE8826A84B062D6DB950D3F15F6ED870678317CA86515485F5922F51B6921D5405F434AC153DBD18E153CDBCCAF0938CEBBE40ABA7795726233FF439D09B03A47F4E9EE894188E5629F8121366222836E8E382C7BABF7A7924991B7F810BA3FCBBF9B286929D67134B55BE9452F54B844BB2D7C8AA76EB76B11C7062A69FD5F2C4A477BBB1826FD5062905B4E89403DBC582125DA4149AD5891A79D6191C95AE2B3041C603F8DBD339FD855FDF7658974878F5369501C8E69C5A561CC2620140F01294E86B2CBEBB393637B8580934C0DEE84A765797BEB43C730C758F83DEA6C5F7BE36EA53C70D33FA62C808BA9A81EFE57F8EF9017FE1EB19CBFAC3556BDCD2FD77E9B39CF7B033F88F43D974923C04DCE51E215BD10667EB54CFC5ACC416EB447E3FC2A4EB309439FCDD2AB4470F660630BA09604626C0C +ss = FA4C0C7C5BBB803ACD4AE91E49CB8CC659A94490E8B786CABFD9B92E949FBB0B + +count = 71 +seed = A229218B0D51F58D915DF549901548FB0722F352C7470900E7E4D8399205764A319BBDDBD06C00E8C5932722EE5A404D +pk = 80B3B92647A1DBEC6BB883A4B2160E4DCC84C89C6ADBD955CC055933D3238E325FA826ACEF899A555873A5B9C189117844202C65E40EABA07D9FA94D421BAFE8F3A5E3346B6B93CEF8B75628E4418E2885660B1D3DF32D1BD50CC50757C5227928B32E0C567872E66BCB58128B15C8696710A7B33BFDA469128996F6979F896B93D22910383C90D0D877A56B4B7C77C53C99128719C2995497DD36877276A25FA8B74A4947E223215A314A075585DA457DAAF17C41711363950EF9013A8AD95F9E07635546485A3568AA502D608321061A6999057E705C46B6691183874FA9EA38BC392F718C99DDBBA59A1865A135207A00058A408B6C61772CE777456C92B28A51CE823F7524A26639AC64AA49D6903CC2B2B5B60B59643BC950230362CABA6ABB5BA4F6964331B1F62099CF385BE3F5B43C2B8402006BB3386F5A16354E45118F0B759C3363AB4069EC2C4C15CAC4E07A24FAB0C682548337D157E6BA213C7801DC5A0A7045A442B4939D611469746E9DA665E2E910B51C56B77A035900B25490216C0BB53E04173B3BC454A7A17D77283EE278E7D30496301480C8C1AF6B3E1DCA213B174F968C8A45A3BA2044BDDB1492BEF2AF610B4ED2481AE0823DF53282BA7750FBC7A764DB58E3789CCAEA778083C27ED101E3C75BE5486249F9818A08047F97447773C7DEC3BA7C59AECB5778A09CB7F1182B2E0A01C182A1BD13AB7D72AF97F96F564607A9A970B35A6ADFF275C35C22C2444AD6E997D821C065EA49080900E766C0079B7ACAE7BC7CB3B31301656FD39591E0BFEC2C33F05A0DD633BBA463781F1C519D902342BC12BD16C1AC8305EA9769E489073297784EE45F99B248670749C728385F601FC84C1FFB298BCC447537785226BB5DE712B7BDD04A0CE39226919105F06ECF6BCDDB0CB5EC3B5505B5A169B05480B2587CE4934D2B232A44A6683920A81A6038C59497C9B47FAA62F4F2120B15C360616E6573BCC5A23A88887B50D1A7DBAA429BB00A9F87B63829B1B641922425016C979DB571BA0F1A139267BB362C68F47689715CAD6636402049C2B5C616C321CBA6E43C1C1A48A0E141CF3A71C0099BD183A5C0E59BCA9A2FB637C1B534CB6687493EAC495ACC7C5FCC4898A52E44094FB1B7014A15C88E11A9E7244EE53C2D5B16708C233ED37859268501630A296D63C094F563F0E559C59453ABF05A93722AED5AC0C3CC6A0BE7890F8C3191677C21F70C8153CED3E2BD96A4BFDCE27F86B809D8AB04DFAA837FE030F420B845D23C78CC82A2D7C440897C91C3B726B4622445899DE72BFA263B93C3CCEAA8500B4B0C240046387B25BD98B5901AA670180A2A8B27DE424F4D804A68DCA2E044430D701B67E9B4AF33C60FC54BB3A94A8B8604FA5882A401A5647B8DFBB20878E4B4094136BD4B5BC14288463C2E87F0CDF6D9497FDB5F42F26D2F9CA2E048A757A59B440C2C5642232E714D11FBA959AB9AC52126BF689864AC98CBD1A633BAA3ECF75C09C4C6878994CDCB3E882798EA02AEAF39915DCBCEBFE2BA14E620F53B3D83AB58BBF99509033DB99B0ACBAC29FB4674C95CB94982AC398C2771A8AB6DA1CE9B0771E3D5C2E7655B4BB99EBBB57ADBC7A540F228114639B811C5C1D3B614DAF84266BC4C312FA43C4109DAFDE79000AB39 +sk = 47318B2CC6A9D8BC6EBE7C12489017C03214325B61A2A8541FB783C448C3A31C1D82BA7906B09E3512AF8D00D0706A3D391281F0315044C9C4F92B0AD72C60E18637577B942A442589CBB466AC344438750B86CC86B97D16339A9DB0365E6696B183041543B031C9220E82BFB89C21A5B0A0D301109568B1C00B2B878C9284375949C88394F141ABC188EF7607CB8151BAE654A7B7BFD785B44BBBB5C5A68CA5F96BFE5ABF179CB83A58AEE518202C9119C80081BEB38CAFF81F5EA51811F13BE9491F431B127783227BF9B691031145D6A144213FB4F1C89C38C00C81ABF075C4415586BDF28B946380C948B94D7A0C3A793100842230663F4EDA9174DC7214884E0F552A50D16DFD0A5DDFA7920B0AA50437BFC735A546F5B0F4BB22E174B061BC80E91428547576B6205490CA3934C9B15FCB69611A1639974478800B2CBA3D5243A0E2762BE2F87035295FFF40B56BE37DDC71915434C4AF6472C1E5C519506E691703C49C715B50B360A5C2FCDB79F59C7ADE27380F9905EB7AA6F5042C6A32BAE657C699EB85A53395C0303E87E89800131F96969BF45B3F574A40ED813268603A24F1C3180607814914775350B88A1FA7E1034C9CB155879668950AD5950803ABC0CC58BDFC408FC1F2BF7D3A2972AA66B58844C048150C0B8C89ACA3BD3269474875BF10A94D2B9EA3687AB9547EA59731B73A8849AC7B7C4B946D70B8B87C56B81B77024503BA87485BA3655F669770410E89FC84925B87C008C3CC13C7B9447D82FC2932A1C641230725A422B6219D9BDB5CEEF17E121132E6615075E0B26CF71E91A1593210A09507214716A3405B2503CA5F29D4479914CD10B3457AA62A6BB71BD08736E1519E69F709B8C8439B4441BBAB5D0911BC6737CA742747CA592E5ED734A8AA1B77450A9D4188E05422BD9240E285865D530E718C6F1A816153CC27414446BBA8129A1716171AA60AE086AD09951C2B9AA2744E0153CBD4EC9D1736908CD78E7CD75D0333434715C517633EE6603F7993083724A596069F3270C071B6BAB955844A081A896096F76059B9738D819CA3B6588D5F578058D28D2D0710B2BB2E307A5F9E18533713C41E172A99614A97C00AC0A83A25526C399CC9FA9B74CC4774830C8E754231B04274C90C526DEA7FE3D203688114E7A90D3AC02AE69A139649B754581BB56825A215C3BA282A26C036E5D5785C07C62956B612FC37FB73A7C6EBB506B998D54979FF29781CD09CCB64993299745B34B6D7F897C0E05E1A6966E6757DBEE29AF2EACBBB7701DBC39294DB584C7C3A7841112258951D88145CF73404A17ADB8CC4D11788225557A83B652F95053E8507093B2A8B00CE77E7BBBE83233DC18880F2274472C05E646B90952FE92440D164092A058D69C96869D8A83377A2DA92C2D668607DEC3CBEFC6242B49A9DA97C19C2067722C8D309CB898593B08B5D8138BF2FD1C59081614F764ACB392D7FEB205A85270DFC1129929CF7B53D41031C92944972B8BC9A9C494AB384996647E177A87A101C45C747660AA4A38088A5F7919CA46DAD338576463A1C1425A6C4409E2BA8217827AE83BED4E6C80AB528A6BBC1AD58C868B995D9F72C77E84173C9CA80B3B92647A1DBEC6BB883A4B2160E4DCC84C89C6ADBD955CC055933D3238E325FA826ACEF899A555873A5B9C189117844202C65E40EABA07D9FA94D421BAFE8F3A5E3346B6B93CEF8B75628E4418E2885660B1D3DF32D1BD50CC50757C5227928B32E0C567872E66BCB58128B15C8696710A7B33BFDA469128996F6979F896B93D22910383C90D0D877A56B4B7C77C53C99128719C2995497DD36877276A25FA8B74A4947E223215A314A075585DA457DAAF17C41711363950EF9013A8AD95F9E07635546485A3568AA502D608321061A6999057E705C46B6691183874FA9EA38BC392F718C99DDBBA59A1865A135207A00058A408B6C61772CE777456C92B28A51CE823F7524A26639AC64AA49D6903CC2B2B5B60B59643BC950230362CABA6ABB5BA4F6964331B1F62099CF385BE3F5B43C2B8402006BB3386F5A16354E45118F0B759C3363AB4069EC2C4C15CAC4E07A24FAB0C682548337D157E6BA213C7801DC5A0A7045A442B4939D611469746E9DA665E2E910B51C56B77A035900B25490216C0BB53E04173B3BC454A7A17D77283EE278E7D30496301480C8C1AF6B3E1DCA213B174F968C8A45A3BA2044BDDB1492BEF2AF610B4ED2481AE0823DF53282BA7750FBC7A764DB58E3789CCAEA778083C27ED101E3C75BE5486249F9818A08047F97447773C7DEC3BA7C59AECB5778A09CB7F1182B2E0A01C182A1BD13AB7D72AF97F96F564607A9A970B35A6ADFF275C35C22C2444AD6E997D821C065EA49080900E766C0079B7ACAE7BC7CB3B31301656FD39591E0BFEC2C33F05A0DD633BBA463781F1C519D902342BC12BD16C1AC8305EA9769E489073297784EE45F99B248670749C728385F601FC84C1FFB298BCC447537785226BB5DE712B7BDD04A0CE39226919105F06ECF6BCDDB0CB5EC3B5505B5A169B05480B2587CE4934D2B232A44A6683920A81A6038C59497C9B47FAA62F4F2120B15C360616E6573BCC5A23A88887B50D1A7DBAA429BB00A9F87B63829B1B641922425016C979DB571BA0F1A139267BB362C68F47689715CAD6636402049C2B5C616C321CBA6E43C1C1A48A0E141CF3A71C0099BD183A5C0E59BCA9A2FB637C1B534CB6687493EAC495ACC7C5FCC4898A52E44094FB1B7014A15C88E11A9E7244EE53C2D5B16708C233ED37859268501630A296D63C094F563F0E559C59453ABF05A93722AED5AC0C3CC6A0BE7890F8C3191677C21F70C8153CED3E2BD96A4BFDCE27F86B809D8AB04DFAA837FE030F420B845D23C78CC82A2D7C440897C91C3B726B4622445899DE72BFA263B93C3CCEAA8500B4B0C240046387B25BD98B5901AA670180A2A8B27DE424F4D804A68DCA2E044430D701B67E9B4AF33C60FC54BB3A94A8B8604FA5882A401A5647B8DFBB20878E4B4094136BD4B5BC14288463C2E87F0CDF6D9497FDB5F42F26D2F9CA2E048A757A59B440C2C5642232E714D11FBA959AB9AC52126BF689864AC98CBD1A633BAA3ECF75C09C4C6878994CDCB3E882798EA02AEAF39915DCBCEBFE2BA14E620F53B3D83AB58BBF99509033DB99B0ACBAC29FB4674C95CB94982AC398C2771A8AB6DA1CE9B0771E3D5C2E7655B4BB99EBBB57ADBC7A540F228114639B811C5C1D3B614DAF84266BC4C312FA43C4109DAFDE79000AB397537E68CCF14E8B7E57090D8F648529DC461CA3950288879E88116ACAF57B4A2B6D75EAC6C76CED1B0A025B40A55440712AD8424672E761E9BC400D63812006F +ct = 2AE65FF9BB3921463D5A4FA59032DE79451B71137E7019EBCAC2234F3478E1E4C4172B97515BEAA552B9580D76BAB278B304B83B05390BC98EC094559F3D21FAAEA79E5D0CF3F9892155BF0E4E989D3C85350C66A94DB3D006530119E4E44BE9B2312EFF20F06D762D4CE489BDDEBF30BCC765A1553AA5A3B5F620DE634F64DE66F1E56D288266195795794441353674E93C69B7D86D829695EC15353186460C20ED184D5AC56917276008772AB381EDFEBAA45A36B8294D9B84C4E5518163E98DA4B5D7461D28493039AC8F378A154152CACDD3D3AAF66EF966C0FB298978D9C293979D0582BD8271C79F5922769D8210F4C7F198B73CD0249330F5B25ED55964F2300694FD1C1D438E7BA0FA0A6AD12F66220A390ED79CE1C40A7A6F50C64435BF538A3A2A1BC859118C35477AF3AF986CCE9BE6FE75BCAA59ACF3FF7FDB1C873AFB6CC5B69621F6B49715A0F362CE441961C452CBF81C128A2B81C1A1B667017026C09DD36AF0DBB856F0D7A4B21CD44003A878243955A12E62F41737D81C16180BD83297AC9990976E506684A24E4F97737E463823B025BA95873954C153BD42DDB06209ACF5BD7E9C9CA404D57202F7236FBD5949004F73828A59FFCAD810E038C741534F044A4BD4FCC0668DF733A7609E493D753FCABC6359B959582A5DC66CDF50A8C88A97B9738F2CDAB363F01124526CA23FB047432789D6C1E430974329411F8C1C63936CDF937540F66C2CC9B76BAC4D9A44055386918370D8051CB79C8C703CD37D3B6C1D53675EA2BFC7976D40ECE547FBE3B969804341FF267CDA5F583A95D0169BB2359ABA56378F319F8587E602459AF732CB1559D684CC4F776E1766F1CEB1483A4D1983E8698B56B37940EA9A7FDA8C8CF9C9E0DC724CA1D60E0C572894D2B9835AA9E82C058FB28271A5979E397AE0C2E72629BD5A56B995F2E3D9DE0C7FCD608E4DDF8A4B0638B1810B70D2B3FDC358CCF45DA5A22C000E4BB70F4067884BFFD9E419C7825145BC80491B417A26567A6B91ED7D89E8E9E9F47B24B0FE1C3DACED4EABB3D1571DBCEFB3E3AA7AE52DCC66AD97BC87B629875165FFA709588B4725E64B07781420D6F6CFC2B485BFDB7CA3D47314452A862050555FD324C5A56BAC047F43A3073F07B05BCF14F505CE528BEF347A2CC2C846675E4EA9417B7E741B776DE1D767A4F3573E78E7D5976E73C8F7CD24AEE462294B4E652460C66E6A4A5F1591446FFEE52A0A61526D16392AA40A4111D4715709FC70AED98E128342F7DA9EA80412C749C80DB3D64C5DBBDE06244C18DE5EDE7F550A8E086F21654994628413E9EA53644B2CCCB530CD1B2288BB9E51F529271E9A9EB795FCE68A74DFDD2CBCBBF98407D68E691C11A979463322B1402629C2338CFB2B14A7BB2CF9AC8073E6E5543E3E989B60DA52F1E07859F591DB172A877483FFD523633E1B8DA9E68BA748F2FFEAD7F9D3882E9FC56D4B4329E1A22CE06E11D0F674C568A2B1218BD4A16A60AAC59DC30FD6B8B76C06A230C39393BD +ss = B7A8E7B3C6D244B6B0DCC45947DC91F795ED21A5B5AD545205CD5B210DF37325 + +count = 72 +seed = 6960F21C7350DCF41B4770C551DC8692D8BA2C0B6E162C589166FF22E7A1AC0F94C2F48504A5F7EB0DA094DF427BC98A +pk = 03A20A0337040ADAB8BD449E0BEAA93B07512485BA33F291AF1A44540BD04AF4A3DD2A09F6454D7304D0944674A580551061BA5F88217AA57C10640DC1A97396F138C1A32CF40B0BD9286F88C4087F9084A9012D248C63EFEC072D77AB0E736719A23A913B7B8B62AAA5BB40BE97CBBC1C29EDB283C776AEB9B032E2C2691AEC9CE89617B84B09712B40E2B713E566C714E0BAA75957D6BA5062BA76471357252B72AC66BA97E10921CA2313A232A6BA908DEA13645B5617938381FBCD748A11F61CBCB615C458D056F0D55A449C4F544C6673322EF106010CF139D1C586AED5A5DC210FFF7A60F3138C34A4244398B692C567ADE5BEB55C1EDCFCBD93183E1ED0C2AFF5BDAB67B51E39A58BDB8388D67CC1EC0D7313B7EC8A56CF3C9B73214C4ADA14592794749B6834E9B81A2BA47DE929E9AC7856B56549F40F38F0784BA0CDFC195952D3155222BCEABA0E3C233FF7E19A65822437217A42721F9C060AC2CBB9C4E6BFA9FC3014D8ADD7B4BDF78291423511F9874A07E06A82B6369FE349E08333C7F56B7B7B808A0B4E888A95799A2DF4873944CC43EB958B1508C66E571268E79A69178793E7A4D430507E1259D01C86F999C16772CFB7B4B330114FF55A51EE5407BCE95A6D27875A91773420C24F8734B3023E9DB777819CA2163C431DE46F22F38398D46EE352B815B6B07E1A242B01A4230B59EA8C7B0C3C3DBE2B7C77B4C860660DAA04C452E391C710722C67BC0632C072FC1E5296A2E70932D4D38EFBB96BD636BB41260A7BF27CF5E71CE3708E6884CF0B8584ADC3CD3B5C5EE1003A13731704472A203C8F9B49534309BF2B60CC3E2448E02B5A46D889FFD78FBE722A709A2D5B5C8A7D805BCFF44052C553CB990AD016079BD87DB7573EB1D431D1E549EDC8AB56A0BF52999F32555E8EF2B03182BD8D812CCA638055A73B548C8B432A2A7D4A6A074AA212D50362D1382747CA8DBB95E03945D95B995D6346D7DB47B24B86E4F774F3767DB7996335B789733CB251F9B1EDD04F8F8CB7AF4C947AF224DFE0AF6A42C7B65120B9C18ABE9161D88CC5C4780FD74403CD177F7160281884A11CF686F0F523F39CB7AD39B780F13A8EE83C0D646F9D85BABEB306D53A7DF53AB00B5A1AA8C215914A48222940FEE10D1939BA5C93617690CAE113A59DE071C969436B3771FC50B2F4AA641A4C852922380A420FCDFCCB81816F4B474A2AB293A4D97B2B280CEF031148EA7E4C9C0DB7E7CD0E50B203A6B7519C3CBC8062C9B60B8B81CD956463B8180C67F34BE4868E3BA94B9F0226D9F010D9EC5EF0BB62C865C807184B96526D94170AF9474BBC100530F7C77E46B98C2AA41F92A48D8027C855C7F84684389BCC8E7C67164A204BC5C0C90828FAA439FBA235B6F20785CC8EF4C090A708BFBBE26E1933886CC96AD9B4562A119D4C66589C85BF0E55606886206734142D432C1B032E0AA93EE3731F069A8CC069A03B95A8AB873B447A04EAD3A32BE3054AF834882BCC581712BE18539B805577E50FF5D982C98C0B0DFCCC96A4C6429281068C8429997DC17A6600F0736B8453E3D77636FAA8D0CA89F9193BB34819CA1117EA368EA23198EE11345C613993EC052992954099BB9A086057DF0C5465326E1932AA50DA74AA8435D9294FD6B7C05A153F30 +sk = CD28AA8C74142A0508C2534D5ADC64284806BB2C653BB9783ADC640E9945C253AF86F57C19B42C6697AC85D1BFA46B5231559C11F5A0DA9B2BF43C40001D4E6C00B81237343E15A41DA190CF8940B641A4B42B72D9CC8BAC681369DC07D80AA62F135B0F956355A4A68E575F34393C42BCCEA68A7A63C269A5821557299FF63B9F0161368F6084132C8B56984F4D1626D7436DAE2596E1B24A86562374B066D2483A1B354FFF9766845480FF396F6AD089B724B0F15A34C2288DEB05A8418909803CBFE2F3C63C30056F358FAB798F4E385EB0E35ED0C38ADE7382787A2502D117AD0BC6CC0A4746AAAD23345F10074B21970C18EACC898472766B2313472DD3348C82F69B7D961CD35A8C61984E7CA20AE6382F04A977A72B532A1395707CBB7CD595E0DA0202498058E59F22E0C340C438851674E3AB1E0D872FDA3BAA7F87B67F449E6BB461BDF1CD771475D5B59FACC30181599DDAC8CE68DC2DE5741B21422FDD512B39D9633ADB202AF3941E323C9326297CB58086C3282F722C4D50B94B32153FF30B91F07A811A9D9E07B7667846806B6F7071AE29323156B668F831A9F79AB7949CB363DCC8D151349DB4B5EC1266E7F5AF98105C95C0A4D47648AEEB01FBE1113948B407FCBE199BC2CDBA40257745D765C6A0766012F19DF41A770E96CC95D3CBC70549F7E61914A73DC71062F2A3A377EC26DED59E0CC85B11A74F43C3237C7561CB7046C0E660B5BB0BA0634FF2B211438A9B9B906F241B04B2439F29A3CF0AD9128D683F0C2C26CA050978CC179872B1664A751458C072106FDFA07D97105188278268B0481018782F361D08555FE5799A0654398285B378F7A9F143CE20673184C75E8B662085899812912FB8A60485921B2F7B3FEAB95CB7AA327D8B9DBCF7C7256A131270B731E33F8F555CF4F8B7A1E6AABB4C83D2938B7B21BEB1C3B3CB3BC08BF52FC1F5715FA89EF8E205D85862F6A2CF420592AA24568FA0B8DCBB90D0B654C7C82C7411B6C3E219F46C352AA034C4FA0AA4FC47DAAC204B351497727B96714359A66466F6C4CC2B83BF6B87785367C7116489D6C5FEB975E41C4BBB2A3D8FDA920021C523227A438374D96032F62C41B17422584AB5880475CDDA8B7F4844E5420C25D97235B0ACF71012ADAB59298BC80052AAF1807E8015695D92184741BAD318BA9AE27C306A2E42C80512534963B70B9D0B7F5AE70326C33E7D43249E8C9CE386947C167C8F33C88947244989C45B4858203249FA5A136734153CD94F1AD467B5043F7ED77F58D34490D1B5F9E323F3E2146011921B8A9F94E419BB85AD965443E7F4A73534457BE43EE5F677A63A7738762B799600FA0B9CD328AE4CF507C1D9845EDA77C30BB7C39C618AFB402CD9B016F0092CB61E8BE13A18925CA122A142409B8DC637A364093CD76925A194AEDA21C61709255BA2DE330693B888A6C2C6F0C39FA5B4C7FCFBCC198B3253C0ABC5AB5EDFB438ED3A82B72B5F54A39D21C37879480C4A648F182A94EA566C598BA4CF697140A20FDF4CABBC540B80E8664216A6E880553899964A7B239D00C68E720706512CD2A58B9C49BC0ACB90283B506CA196F7855ED69AB21F059A11FA3FC4670D03A20A0337040ADAB8BD449E0BEAA93B07512485BA33F291AF1A44540BD04AF4A3DD2A09F6454D7304D0944674A580551061BA5F88217AA57C10640DC1A97396F138C1A32CF40B0BD9286F88C4087F9084A9012D248C63EFEC072D77AB0E736719A23A913B7B8B62AAA5BB40BE97CBBC1C29EDB283C776AEB9B032E2C2691AEC9CE89617B84B09712B40E2B713E566C714E0BAA75957D6BA5062BA76471357252B72AC66BA97E10921CA2313A232A6BA908DEA13645B5617938381FBCD748A11F61CBCB615C458D056F0D55A449C4F544C6673322EF106010CF139D1C586AED5A5DC210FFF7A60F3138C34A4244398B692C567ADE5BEB55C1EDCFCBD93183E1ED0C2AFF5BDAB67B51E39A58BDB8388D67CC1EC0D7313B7EC8A56CF3C9B73214C4ADA14592794749B6834E9B81A2BA47DE929E9AC7856B56549F40F38F0784BA0CDFC195952D3155222BCEABA0E3C233FF7E19A65822437217A42721F9C060AC2CBB9C4E6BFA9FC3014D8ADD7B4BDF78291423511F9874A07E06A82B6369FE349E08333C7F56B7B7B808A0B4E888A95799A2DF4873944CC43EB958B1508C66E571268E79A69178793E7A4D430507E1259D01C86F999C16772CFB7B4B330114FF55A51EE5407BCE95A6D27875A91773420C24F8734B3023E9DB777819CA2163C431DE46F22F38398D46EE352B815B6B07E1A242B01A4230B59EA8C7B0C3C3DBE2B7C77B4C860660DAA04C452E391C710722C67BC0632C072FC1E5296A2E70932D4D38EFBB96BD636BB41260A7BF27CF5E71CE3708E6884CF0B8584ADC3CD3B5C5EE1003A13731704472A203C8F9B49534309BF2B60CC3E2448E02B5A46D889FFD78FBE722A709A2D5B5C8A7D805BCFF44052C553CB990AD016079BD87DB7573EB1D431D1E549EDC8AB56A0BF52999F32555E8EF2B03182BD8D812CCA638055A73B548C8B432A2A7D4A6A074AA212D50362D1382747CA8DBB95E03945D95B995D6346D7DB47B24B86E4F774F3767DB7996335B789733CB251F9B1EDD04F8F8CB7AF4C947AF224DFE0AF6A42C7B65120B9C18ABE9161D88CC5C4780FD74403CD177F7160281884A11CF686F0F523F39CB7AD39B780F13A8EE83C0D646F9D85BABEB306D53A7DF53AB00B5A1AA8C215914A48222940FEE10D1939BA5C93617690CAE113A59DE071C969436B3771FC50B2F4AA641A4C852922380A420FCDFCCB81816F4B474A2AB293A4D97B2B280CEF031148EA7E4C9C0DB7E7CD0E50B203A6B7519C3CBC8062C9B60B8B81CD956463B8180C67F34BE4868E3BA94B9F0226D9F010D9EC5EF0BB62C865C807184B96526D94170AF9474BBC100530F7C77E46B98C2AA41F92A48D8027C855C7F84684389BCC8E7C67164A204BC5C0C90828FAA439FBA235B6F20785CC8EF4C090A708BFBBE26E1933886CC96AD9B4562A119D4C66589C85BF0E55606886206734142D432C1B032E0AA93EE3731F069A8CC069A03B95A8AB873B447A04EAD3A32BE3054AF834882BCC581712BE18539B805577E50FF5D982C98C0B0DFCCC96A4C6429281068C8429997DC17A6600F0736B8453E3D77636FAA8D0CA89F9193BB34819CA1117EA368EA23198EE11345C613993EC052992954099BB9A086057DF0C5465326E1932AA50DA74AA8435D9294FD6B7C05A153F3082F68B15681CCA5C2852C18D6E88BCB102A059C1D21936582ADB71790CC0A335273B38BDDC18488024EC90E62A4110129A42A16D2A93C45439888E76008604C6 +ct = E7657F1E554DDBF021C005B3B9453285A16D4D8CFBA2358A97FD2AAE89F83DBECD0447BDBE9589DED04BAADA5114F3BB1B4B775C8BA614008BA2D5929EDD4D3DAE28253164D131CDA2FCA2B1D4588E176892764848B62172F56AC74C2D9052347F857286781015FC8CC1888A3FFB77837B1C79128D15A405DCF2A68E47DC7FF1131C89E5268033C9304088E6924C59AC82B424122E5B85A55059198598E2BDB173EB0FE9E407B46228A4B16690097BC82941A66404EA7EFD014807CB4CE9D8EA9F4CD3B3A7643A5FAC11D493197DBAAA40BEA54ECB8E0FFBBD887B2501985C019D252D3D663EAC74466008FF6749AC901F3470E755269BBC1D77690F4880B0BF0FD8F0115C2B90BA408D3E1FE46A845A47DCBB404E4B12A296E304920C3828191CBD9B9C81A8BB02EEC087FC9F018EF936297D7A52339DF66396129E4A1C18820CB1BA69B26C9BF1B68C886F8ED7C4F61EBF2AF19402AE037D990C77FC2699D4D22683F4BD46A105459055C5C713E8C1DB1DDA5CE6A658184D26ECD10E5B1D523241E494396A99DD172372737129C29F8C74BC30858076FA33034C44997D084A6C5BC791C4E8C9869B1520AE29D7901B743ED50E9AD108B37132F34FD1D05FD4B5AE9634AE0B1B1C1C46FC1FA1B73A794DA19FBA6FE28A299E6EA7B738E45FD1FC0628968F32906D9486E3AAC29B488A17A7D6437A9F139DB14C0B6F387DFF426E107D2BCB3FB9EC5658B4351A20487C31AA367858355AFCF508F4B6740D912F726C45DE57359683FD9CB65F7F0BA8AB8A319830E6E586C293E953539F85A5C264C30721137128D0E0217D69CC195772FE97D536B8B47643B1A67B90E198D320652833C03F0C382A45F86522966303E3365C6F5B743C53B4F7CDB931BFC894211F71097EBEF6ACA00074DA9465528A82D24718D54473E333C9070EDAA7EB6DB2CDDC806F5AB277EA8EB3DD1C93EB6F433CFF71694EC6560D2F664EA4113CA1FEC25F37BA7083780A2D91EA6F679F3A40172154A053983099F83D48F3BF50C795A832C9F70C88407439607844BB27EBE20F602E0A88781B767D6C2002960B2BB98754A4618301D9973E3FFE8513615F8B0F13175376AE222FBFE36C8125A570719F62152C2945BA648F534B85CA8270CB7DD5B955E25961116DEAD8915466ED19AC772D256B7DE7B10A597E44FFCBB0032C85FC9E5A8F609E2C1C9BD888ABA0F0708B579729E6B7E5377641DDF0649D1B506677D316076E482A8F166CE186448E504B4B9607CF5F3AF8F7B5389049A79E15473F130904C3BD8DA512EBC26951134E767D6D5BAFEE7C6326FBD96DE4239B7229D69331E76EF0D165276E5A2D229D49E3215803E0B82A63E0B20231271DF111F1C27F9F1632E4F86E90DB18A4254521939F6CA60AF9BD7AF584B2109DB991D9E2B9223E0ADD7D5D92B597D0AE7657629B256B5ACEFA958422606C84EBA6C136925815007D126322E9854497907DDE52CB68F65AF75370CAF56467DD1D6E9DA860D26DD4F1E33006A6F41CF3423E58 +ss = 70CF00481198A97F14E0870C268CA55B6EF787D130A4C32314EB7C0A531CD188 + +count = 73 +seed = 53DF46012CAD4A745B7A3C06E18CA95E0B839FD8161E3025749A0887549EB0ED6A44EEEA08BD6060D6509DBF7E9DC864 +pk = 611BA36D3A65C0D17CB22B7F3A682B593595B1C682D521A16DD621A05A7D22C9B2D29C9BB75CC5A8567ED3A545BAD39E2C85CEC0F83F37C6AAF101BEC273BCA5D606A5E76FDC183175A233C93373E956580A522BADD22D97D71199C1A7B4149E652686EDA541E69187A2ABB68F89AE9492443547CFDE7B5D609B4835911D154C33E49248C4CBB244ACBF03E93E52E71ED87A75CBC43C3F505422C1AC31C014E82009D4B13BF2CB7DAB16896A320FE6C0476F37767CCCCD80850DC94B410B983FBBCB484DD09B44A817FD95686106C710D983CD2BBC11DC4AE59091A401A6941BC704142C792C407F7524EDE1A71A726E2F921B0626768307C31DAB514A783FEBD67B50E93479D2C7D1787142F591607B7A5626A718D502B37A6F5B8766E8175C6EF276934A12AC1107AA3362840513D3F5C02042AE681181DCAB30F6810389DB07C3FA1790345E786031E3196BCC01C22BD064B2F9C439D7B7A7B7633232AAA4D88E0288CDB791049B8A8C64883637098DEF7C88FBCB974554AF0F3C51C70A758176215871227869766452871602093D6949E1D078691537D9D7030B36926147AFF8151CFBA202C0364795122D1D748A18289CDB33982900B38EF9AAA5D10D146985C757CE5CF82AE0A2489E0C00C83550D455A03FC885DC7A5EBCD71529ECB0CA13CE1259186F9B0CEB4B90789ACA0762C8BEE063780801CE365540F440B0AA0128103AE0F5B4A5D9B98FF3AEC5793E8FD046A7E15B517C5C4164105E87C593DB19B85792B6C705E615C4D95C38BC4BAB4F30737A20241A3189EB38865C6B60F6341DFB931626E729CE39313E122687862BCED934CCF88411730FD066BE831542ABC5B15A1CB2D3F0AEACE904CB419754D9A5CFA35D72E570C8D3B0BDE5A5B18201F14CCA3E3564C16769757A2DAA89B03DD993EC8B7C9FCC63098478AF1890346A8824A4B142F88759F382292AC404F436BD21282D6A3242417B36211C84B75F388151F087186CFC01E59383E8218039DB15DA50120AA1C5489743BC42335A774F8494A4244ACB6677B22A46224DF7BDD8A9292AE58E07F3068CD975ABB51E44631172535E52C910B48748A190C50D877903A4C7B9F4B18993669D254EF566058528A157428111D43D360AB54343ADEBC2A3636720F1E0C8CCFCB0FC3B71B55353C2682946408CAD171FB711CF0B3AB561BA6722647ACEE4B8DAF0AEE2C43352609DC617549841ADAC54ADFD3319EFC715DD917AB2B887DFEB49CBB6323ACB566E43638A5C9B6F865DA4157CC3F866066A551230A335510F55733CA4F3A6329AA0830894E06A05EE578C45B3117FD07D62718A9842CED5F49710F7B15741BA5B06298C550B96BC6FDB0561926240FAF09012E2CB49C66868E27EA318AAAC50BF882C5BB8E674381A96645B7A7DFA936201933C31955E24912E436528027B39F74A909AA5EF4653CC23C5E448BE6F81088FD322FBB1779BE52AD60005C2F57241932EA3B435C47A39E6E0477B989C00BD5EA71BA671D8A37DC64D36216CCEBB14E6DC7420C362926B555598B92F6A78061423A4CC8961D57733982FB8C78573C35584185FED801EA674A7FDA06008517B42D1A45FCC50416883D0963D3B744EDB5E8548C3B3DC474F7843C49A8DBFC939C41AF7F8EC6C8354AEB0C67E05EAE0 +sk = 8DC4A33D0A013D102A7ED6A5303693669033816BCE0C8A83594695531999647A48F6708C65220BE4D9A60F013201A36EE053796356B26E3617126C3D0A354D2FBB82312A372FFA37B939A7BAC8AD0E127F18EABC771462FC57B542A73BB7067FDE6BCFFE4982E6DB3394264D34DAB222318856BA8B6919C5A0A667866C0D2166B69AE04432C044F289BFD7255542CC7946B82C2DB388C8B656F234A3B607C2F6611ACC3A5A12C8111E42138ABCA9B8DBA79921A177682C2AD1138B133636951F5AA77A52B7554943AF52F7B53D0B84ECF44FD77018F7062E564C5E58753994724242D6B3A8F8A66DF518F7E13A0A5C1C4B253DCE12AE197342F5D72C296498BC9888EC347F528958AA689C8DDB81870184C9E2254F918B7465354826870300790044165216C8BC279AE93854381C28CB438BCE444B2258AFC3A84CD4F91DE8373F877B30137C4CE4664E4D330BF763B344489604E97F4C9C24FFC226D07C5824CCABE38CAE22487EA2EA0E89920F304BB911B401F45735089512DCA2298EA1A57F643CD7524A3D6C9F055B25EAA62FBDA318A7B8C8DC9C5CEA953AD5170C0452A7BC04469987712D0522256A1EC52961561175C32ABE93DC5ED37289B9D4CBD3966911FAB85FE47B3C68692CF5A845286BAEF91493E15C6D23437BF7517EC5CF609C8628D82FF7CACB54D4A5EAD25C85F59AB51151F9350247782459B598A2089A85F2C9BF66797E863A4CA0732268A4E40C57009D0C7D1AB1FF46B78E350DBFC19FCAE823BCC040183A27182ABDE00A966A6075E68C011AA62EEF913024CCC85B460098FACC9C4C81D17C577BC009B8F9416D225D156C4E75B84691A90948D31883B1B2AB3635DC357AE867B2496983CF9595423C541E3C17947042B3D141EF825C99862302BA911C67619434B3F9CC489E8C8ABAE92AF1EC3045C895EDB41F745AA1F3D1A625E47EABB49432129A5608571431C4890C8FA5769563B8B1F9BA3C1B77B034F568038865C90304A4F79F65F74C17FAB9E6B52236CB636EF5B686271F955A9E889B7A1EA1A010828AEA1A838DE1723F0149CF172F48890161C34039E99B36185F068B5707FA476D650BF149479B8C928F93089A4B941047B5B528135685797E0B9E65F595D9016A614393CFD630C6A217D0A03091853F606B238EE13C92C2B5D9E19B2C57638CE82A3D767639E115838B8EEAA5A47B7B686EA05CC088ABD47A10AE593AE39A07F55CB4C1347ACAF7CF59422182749E6AEC39D62CCB876094BA3CC0B871C57A03A00AD67C5C1C6EF911C6DC36B13CAB713BE1A6610CAA46DB4EBB86B76572A0BD60ADF163B325C89B506C33CC343C37A2BCA7CACABD90494F044B550778677C2EBEE76E03622705556B509C204087B5C5E5936C0153857691C3149521B800B76C43195897067529A4A87D68E974ED57178B7980EEE227E4150AF1234025757EAA3B645064202D632EAEA3943B40CB10922BF569AB2C44867C411BC8240D110134D78143D3D44B450056BE166B57921FE64A44F80968A1941D91A971E10C347ABA369702B1ED542984F28B6254BF61D94B69F015B0E32B05E8897502238FD21D87978EAAD45BF5997654B40A903319CA64095C9297611BA36D3A65C0D17CB22B7F3A682B593595B1C682D521A16DD621A05A7D22C9B2D29C9BB75CC5A8567ED3A545BAD39E2C85CEC0F83F37C6AAF101BEC273BCA5D606A5E76FDC183175A233C93373E956580A522BADD22D97D71199C1A7B4149E652686EDA541E69187A2ABB68F89AE9492443547CFDE7B5D609B4835911D154C33E49248C4CBB244ACBF03E93E52E71ED87A75CBC43C3F505422C1AC31C014E82009D4B13BF2CB7DAB16896A320FE6C0476F37767CCCCD80850DC94B410B983FBBCB484DD09B44A817FD95686106C710D983CD2BBC11DC4AE59091A401A6941BC704142C792C407F7524EDE1A71A726E2F921B0626768307C31DAB514A783FEBD67B50E93479D2C7D1787142F591607B7A5626A718D502B37A6F5B8766E8175C6EF276934A12AC1107AA3362840513D3F5C02042AE681181DCAB30F6810389DB07C3FA1790345E786031E3196BCC01C22BD064B2F9C439D7B7A7B7633232AAA4D88E0288CDB791049B8A8C64883637098DEF7C88FBCB974554AF0F3C51C70A758176215871227869766452871602093D6949E1D078691537D9D7030B36926147AFF8151CFBA202C0364795122D1D748A18289CDB33982900B38EF9AAA5D10D146985C757CE5CF82AE0A2489E0C00C83550D455A03FC885DC7A5EBCD71529ECB0CA13CE1259186F9B0CEB4B90789ACA0762C8BEE063780801CE365540F440B0AA0128103AE0F5B4A5D9B98FF3AEC5793E8FD046A7E15B517C5C4164105E87C593DB19B85792B6C705E615C4D95C38BC4BAB4F30737A20241A3189EB38865C6B60F6341DFB931626E729CE39313E122687862BCED934CCF88411730FD066BE831542ABC5B15A1CB2D3F0AEACE904CB419754D9A5CFA35D72E570C8D3B0BDE5A5B18201F14CCA3E3564C16769757A2DAA89B03DD993EC8B7C9FCC63098478AF1890346A8824A4B142F88759F382292AC404F436BD21282D6A3242417B36211C84B75F388151F087186CFC01E59383E8218039DB15DA50120AA1C5489743BC42335A774F8494A4244ACB6677B22A46224DF7BDD8A9292AE58E07F3068CD975ABB51E44631172535E52C910B48748A190C50D877903A4C7B9F4B18993669D254EF566058528A157428111D43D360AB54343ADEBC2A3636720F1E0C8CCFCB0FC3B71B55353C2682946408CAD171FB711CF0B3AB561BA6722647ACEE4B8DAF0AEE2C43352609DC617549841ADAC54ADFD3319EFC715DD917AB2B887DFEB49CBB6323ACB566E43638A5C9B6F865DA4157CC3F866066A551230A335510F55733CA4F3A6329AA0830894E06A05EE578C45B3117FD07D62718A9842CED5F49710F7B15741BA5B06298C550B96BC6FDB0561926240FAF09012E2CB49C66868E27EA318AAAC50BF882C5BB8E674381A96645B7A7DFA936201933C31955E24912E436528027B39F74A909AA5EF4653CC23C5E448BE6F81088FD322FBB1779BE52AD60005C2F57241932EA3B435C47A39E6E0477B989C00BD5EA71BA671D8A37DC64D36216CCEBB14E6DC7420C362926B555598B92F6A78061423A4CC8961D57733982FB8C78573C35584185FED801EA674A7FDA06008517B42D1A45FCC50416883D0963D3B744EDB5E8548C3B3DC474F7843C49A8DBFC939C41AF7F8EC6C8354AEB0C67E05EAE0104FBF09445794C0EA0654F5CAF70EE09D51C8386D4E1F467B10633C710AC2A4A3729672816F3EBA84C9638A79676EEAC0F22C8A48E0C5D50A26FF0844C66B99 +ct = 8B40CF1A2D7E21F68E130A85C5A680C65DF56B5CC055D26AD8E6A7E6E75BF88FCC88B5212F2B78521DF1A8F3B1A1D3091CB9270D1AA7865FD1E3AA8BAF208FC1A8B80CDB1D0F229489C15FB02D60F44E09E942D9E36ACEE57013F2F40C17477DC8D2BCEB137E92C140314E8D6F38328056119C757493633D2CDECA9C0E1E727F47406BDDBB7A9B056EF6E4D149498CECC738D835D0D99A5703B0B9BFF04883FB064009F6961363323B7C47E35983F04ABFC00F74A63923DA69CFE3784F8999F6E4ACDC9B9E06E743C03B4C0CC2A404DDB7654888DAF0FDE21FFB1A96D81D95EAB5EEA064938BC105439E287EAB89AED0824DFD4CE65ED0B8A8FFB674AE38BA39A1FA3A8DCF36CBA494A5855ACE0B4F8145AB9C636F1A4D6AF147FF23F94C021E2DA8D0D05564D6C85E502E753B8EE49898B66B6F078A99675435FCAB58BA8C9979761906986DFA4BE67314A3515AA24A0C2757A95509498E08EEB103AD02BA5711E2C84F25E651A611C5C5E48DE5BA54F9C2E6D9930D7F861D14F5CFEF3D297593ABB5E77CEC126846E15238FA7984D05E86DBDB12CB1D44445F9538F89FEE20F677F05437BC27068C61D4D095CC68327ECA3764972B494FD2838400FC3A6F6C64D4B17683A7E778C3807C6F1C1C6A4D92AFD6CAD80DE8C57F06BA5919B10AABA0605F19F61ED80AA119035F37D3F6D8A01E2D72E6C53E47489B5DC876CB99FA742618C9E5016EDCF26D78174AC028C832A1C1AE30514ABF95C35A35F9387D3A30946AECDB5642C0B84150FB8F0ED1DD06F59FE575330EE2D9D5675AE705986D1308923506D47EA2B2FFA7B92FC2C7B2745A07F6D331BA484145C98EF78736A77AECD75C56D719EF112646F57F6166986FA33655D8DB7D2171704C5D69AB50A9588EFAB7ED1B834D8903F2770CFACB204A4B143262AFA85E20DA03D94C22A39A9145B9143E4952722C2CC6DA0723566BB2EB9E1F2C30814A9B80DB5192A673D3A8E8003D30C910B9D31191941E824563B41DAB9FA47C6725986D5EC406B8E43915057D1EB15F68EAE588289D5C4D5AFC0BA4FE38D765786C4F4820415678F79330138D2FEE5E060DF6FAE9B1CAC289FE2D20B298100D0FF4EE76B59EE7DBCA227F4579BC507EB05AF390A2A445BDFE1885D8659A776F3DC6BBB760F93598DBF29F80108A2F007C901F158EE5328BEA6893550FF0E2B2C51FD5FE1269177149B89CE127A7097832003DF2A420FE8D674EBB2CFAF2385C13643ACF832E2D27309A6246FDB1CEC405F1C39AA2986BE172A48F8054989DF59EADF564D99E075CF9053574FBE0B5FBDB1E4E173D4336A8ABF77A6348CCCB49B5B1DC1D75ADC8647792D3A6C4AAB50FF8C0BED7E3A094D0A6882F4547317275837DC7BF460FD37A396E6A4F3E13C404239C58C9EC850FD89C7359F9BB2751FB60A932EEEBCDFBD21C8E3527E4455352AE13D402D45CA7948E6211CE31ED48FAB0ECDAD75D0FE5CF564D521FD2EC76BF52829606EEA3170BD44545B710F2D731A18BBA457B4530EF9BAC +ss = 2E8FF9C053137CA6B6C31CE8BA7F14135A7E102C211E68EB99DE12B94273F9E2 + +count = 74 +seed = DEB963F8B1D8FBDF499D564BA8D2D47915BB402DA02F17031B37B4039A842AFB9B7E48F37200605992BD2429427A7A4E +pk = DB0A138C9442FD3A7580E68EEC01077D31525465BABEF901806363A2D664EF8C1908A30491E336E27B0F8690AC71C30ADB145805A15FC654AB8982565EAA96FECB93A2EC7EBB697652965FC5AB837F6B7A20E224E4361977B71C694A88E5252F608CAC97E97DD7C80A5AD10D62681B57162269F7B8D812AF039226CE2A7930E43007C0B3EC6A4CDB3897EE85796D051CB053881E1B9706A572CCC75D0EF32F92610C40DB4553824F1A352FEFD979A310124B9456A9106367EC6A50DB6FE0B057FDBB00A46028C0D6A638BB7F2139CA6DF68F014C4E1E0B79670869353912B5D67EDD4B77C70C067AA76D174CCED6C7A901C65737082276188CFFE28BCFAA2604447E68D490C0F11CD22B8C351C2D63E7A01EE460BC408E174BC4A6CB023492C6EED42F5D85244EC883B1B49B8E3584F27835F21B6B2E6060E0671F289771D124168E196EDACC1ABA26CEC9E09FE7367F46893C2EA3677CAA3005E34E722608A3B64A3B987289952DD695A82DE89B9034390355C5E33546EB833F602CB9324C095BB4CF66C05FA0AB98D69BBDCFF155C3169F3DF2A575901724B678FB080B67F32240AB8F0198CB43176F6FFC93FA602748D591F0B2ACB9AA67A8D8B15C27140C320B0EE040E737077A8C9FD6A20DCB865FF51C41808757B0CA750C502A356B1C7D821F1BF804AE2B337819C5EA89542E079045C887BA6550E4F05693F5C7012424D37A17E2294669C0538CE69A1F1C1F121784E3C3537424BBC4D73CF1A685F03A24C4BA8FD603B328D2A07FA2B714DC1EED17693727732EC7BE2B02C0614CAF3D42B222061DDCD758A0674133E6CFC5362F855B717695ACDB971AAF16320690606C1C42238856D757B5D610BD64427F04C97ABE1BC6B0185116CBBB2DCA28B5D7A9AEE205DBD37E92BB36311C8936D958AA1744CA67332A600D8C719377273C7FB0029F27C75817746E1058DD196DE71B0E4302682DA21B4EC1BECA3CBDF690509573959D816CF5FA034CE01D6A4AC477E3BFEA75732678AEA6C0A5401C623DC225C7A9A7AE6A572F738387181913CC71B9379A5A2BBDC45773C6A1167FE756E13731F47226BC678331312B99428B07B2122B2B9DC86B01C5F090FF632FA83B598863C0B42623549CA831F66BDBBBB1D4747D56A97DCEF9C81766A3D90043C1A99CE5E81105E9113043342A539DE446A7C5F9C4B46A8CADEC388FBB8BCA527D90A56C649200CB2A7F968611934014F9A7B6FAF3015BF6494EF72FBA0C7BA40C499357ACC96562C65B9CA7C53231045E35771947172118EAA02CD95F7137C93E2159D9389607C3011A76363560A97DF950B0329258B0126C7BC10E4081CE46B7C7B0AF0752B038386E9AFA2D0A7543D85AB909376B618C0A2D33875D264B76941430E81C48832F43270160176ED5938492A06CC08392237CAA8487ABD3C83019000BB6671784109C7BC4C2A0362A5B5122E620ABA511C49CA42D75091B3B1ABAAD9B8162BC27F182AE310872E789CF05F6C949598C41C3B73A1A9CC0808E68F95C8AD8392F021F77C79618685DB2FB1D04A9A8ACB8441CCC764AA3B191736F5A24AE31C23428390C1C22C6A6052664DB63B94960A433584036C05E031A07823A03CA153015FB2665C77D8FCC529F21AFDE0D4F32CBFA399F2973D812F516C86B +sk = 38BBB649E7520A59AC57783E32A5022489365713CCE30171AB46AB219B7E81369AF44BAB6F5BADCF613E963938A0829ACE625BD8594ED3C0981C5963F68874AA87685599041C4C296B4CC181E57667D499B2F961F44773CA958193E97988D816D702078C0147E41390F503921F139384D75EFC91CD08544536B4C9C09BCC2914A807E090D98B5C07C1A4A0C16FF0EAB557E5CCC1871BA1A36FF66B1ACD113FACD6BD16053F22CC85634A3D56E564E30862AA1409D48AAF92643B62009F8E206C2C8BB7F357B9432A8474349C3E1679F1D154CFD4A373665A86C481B9C3163308CF3A1A265A6313D0068BA2181AE5E5A1114995005C8FB574C4A7DA80562953348A80BC23CD90C37A2D166EE4E895F2A429AFF3C9EEEB869EC9982D367C5809396987A2EFE93DFDA2CF45E774CC3541BFE655A7280AF9B7601FA5183AB62682465FDB273AB435355B84563047BC4C6204AEC310D4B91E8B849182C16A57605A6F5690D3804D8857379E11B324977F30B461954A17CB16C4DD93761224A47F4C680373C51DE251CB69A2C737CBB1F76D7278033AE86480C7776CC7CA02393F333B6CC00C200AE58922756D3664A30D7B262302672C27A7496746F8F56797726340C734473522FA880819D76A004A480F48B74F7C6EE1998741D39FEC12759670B4E8057AEDC67950B929E200526BA5A27E0BBB67570BAE100B77D525AF70B7B6143A7419A35273C14B492E1E42C5B5918A62F3C829A50C1FD8715B030CEC454C90C72E6509AB1936AE7490C6B62A6720A840AA714F7B6B0134335C75C44A421598B790631E2CA497E256BE08910B69C01997BCD20591D1967EF5EC5C035B0C1F19A01BC0103DE6CAFDA45DB70950CF551DA2442741EB7233B36396C124C6365A83B66D9CC896FF448F54194FA05267B8154895173075039143DCC58062CBBB1946A917ABB184788052920D1428C856BAFB3461A463627EC7430671CE75BC2ADC95622EB2925A582A15E487787389BCF14DFD84801A37BC39136CC1A49CAB7CB924772606D48D3941BCCD3221EB418B12A6342AB6C357F273795339BBC720439AA9CD5A478122B8B01769EDB013686C8E872A4E2C049A755A8F954614665C61D5D9AEC7D67CDDB779512A308BA3CFFD5C4BC642C091226667C40957C17B3C92BEA102143DEC663B6155464AC7A9559C533A647C5A106C38972A26BEAB45C2F04C974C9BB860BCA64615B6F0782305C81862ABC973D280088BAC791876D3172D4E340F26452F60009A49989BEC107B680B62CDC12751F9079ED07C28143A405A600A974230B20719B0953DA3C2DA574CE2C31786C77600646E25B3C305F6507D91084A836366C273D62C526E0630F9B483CAF335D6BBB5BCF4ADEB4143443A07055349CFB690948487F7795B67DC2E45430E7A5C9564CC84CAC0AD0832480AA844417446B9B086A493B7AA163B76A50F35B7384BD054147A8621674843C3040CE06EAEC68B6CE8A2C5B42390C76350E10DDDB35C9F4C4A1CC148BA08601F92B2FB12C9088922C3463139239A62E878E4DB61A3529A8FA7905A7A1AAF90216DAB5026469B27D4122AF5561BB91D111A721A78587EEA259A4C7F6B743574398E30A119DB0A138C9442FD3A7580E68EEC01077D31525465BABEF901806363A2D664EF8C1908A30491E336E27B0F8690AC71C30ADB145805A15FC654AB8982565EAA96FECB93A2EC7EBB697652965FC5AB837F6B7A20E224E4361977B71C694A88E5252F608CAC97E97DD7C80A5AD10D62681B57162269F7B8D812AF039226CE2A7930E43007C0B3EC6A4CDB3897EE85796D051CB053881E1B9706A572CCC75D0EF32F92610C40DB4553824F1A352FEFD979A310124B9456A9106367EC6A50DB6FE0B057FDBB00A46028C0D6A638BB7F2139CA6DF68F014C4E1E0B79670869353912B5D67EDD4B77C70C067AA76D174CCED6C7A901C65737082276188CFFE28BCFAA2604447E68D490C0F11CD22B8C351C2D63E7A01EE460BC408E174BC4A6CB023492C6EED42F5D85244EC883B1B49B8E3584F27835F21B6B2E6060E0671F289771D124168E196EDACC1ABA26CEC9E09FE7367F46893C2EA3677CAA3005E34E722608A3B64A3B987289952DD695A82DE89B9034390355C5E33546EB833F602CB9324C095BB4CF66C05FA0AB98D69BBDCFF155C3169F3DF2A575901724B678FB080B67F32240AB8F0198CB43176F6FFC93FA602748D591F0B2ACB9AA67A8D8B15C27140C320B0EE040E737077A8C9FD6A20DCB865FF51C41808757B0CA750C502A356B1C7D821F1BF804AE2B337819C5EA89542E079045C887BA6550E4F05693F5C7012424D37A17E2294669C0538CE69A1F1C1F121784E3C3537424BBC4D73CF1A685F03A24C4BA8FD603B328D2A07FA2B714DC1EED17693727732EC7BE2B02C0614CAF3D42B222061DDCD758A0674133E6CFC5362F855B717695ACDB971AAF16320690606C1C42238856D757B5D610BD64427F04C97ABE1BC6B0185116CBBB2DCA28B5D7A9AEE205DBD37E92BB36311C8936D958AA1744CA67332A600D8C719377273C7FB0029F27C75817746E1058DD196DE71B0E4302682DA21B4EC1BECA3CBDF690509573959D816CF5FA034CE01D6A4AC477E3BFEA75732678AEA6C0A5401C623DC225C7A9A7AE6A572F738387181913CC71B9379A5A2BBDC45773C6A1167FE756E13731F47226BC678331312B99428B07B2122B2B9DC86B01C5F090FF632FA83B598863C0B42623549CA831F66BDBBBB1D4747D56A97DCEF9C81766A3D90043C1A99CE5E81105E9113043342A539DE446A7C5F9C4B46A8CADEC388FBB8BCA527D90A56C649200CB2A7F968611934014F9A7B6FAF3015BF6494EF72FBA0C7BA40C499357ACC96562C65B9CA7C53231045E35771947172118EAA02CD95F7137C93E2159D9389607C3011A76363560A97DF950B0329258B0126C7BC10E4081CE46B7C7B0AF0752B038386E9AFA2D0A7543D85AB909376B618C0A2D33875D264B76941430E81C48832F43270160176ED5938492A06CC08392237CAA8487ABD3C83019000BB6671784109C7BC4C2A0362A5B5122E620ABA511C49CA42D75091B3B1ABAAD9B8162BC27F182AE310872E789CF05F6C949598C41C3B73A1A9CC0808E68F95C8AD8392F021F77C79618685DB2FB1D04A9A8ACB8441CCC764AA3B191736F5A24AE31C23428390C1C22C6A6052664DB63B94960A433584036C05E031A07823A03CA153015FB2665C77D8FCC529F21AFDE0D4F32CBFA399F2973D812F516C86B0F353D6A29813D354471EB8B4C38DF93939EB3B1DB80DDD1CDD6558A9F2687A3E03FF73E02A217659F53D8C47556BF3D8C94040F630D63605E2D0F923579370C +ct = 087B75B8A26B2B4E3C850D95F4504A5CE2D9F2400F84645F51D95F572DAD4AAFD3C99F5A8ACD682F7655E23765502705A4AF1574AB38705D4EAC749C78EFE1532F45646BC3358DC2188DDB8A271E8CAA490F81078A9DC3602948F68D392A22E62D584881DEA33F273F1B400C41AD60ED97C67AF9594F44340A49FA8EC7FFE1857CA2785AF21B5346F275D5303BBA6F0D4A0D5A105428B444FDAF0990931E49228C18F90B81A9A8B1B85466986080D0F8D5ECF6256484CA2222F075A718371D15C4AE79FFC2480496C93E2D9909A61AEDC1D29F583CFEE4CEBE3EF54A0A2727E00D5D0525679AABBDD574856CADA9A7A112DF04F7395910D9BEDC5D8B3A373CBD2603012AC33D3523D55C0BB4AE0472BC04C5ED974F6954CB4A7C0D9672BAC55840DBAE2323258746DF9810F0A3CF4C4155C943EB2FED097E481199BA5BD6D853EC00336C751D5E0E853A271FF1F735E4C431B3B349A0874A49592D416554C65D18F7C489DF1F8C633DF432EDBFBE05769FB6FBD780D89451FAF60EB9230F1DE745FA3A68E200FE2DFBACC5C530E6DBACF9022872C84A84390ECA3763402518857C111151F68FA31954892C4F52CB2506B4EC11E466C43225C146530C39387D065A3481DBA695EC9F3EC7FA0859DED1AAF74961A03330F47F213F68F2053840D488B09D72466EF48E3CC7AC30415B574DA8F45C636E19AE109693579D9D66AEFC5CEFD59DC4BBD71DD16F8A2243B113D04B0366B00799A8B4167CDEB34D3CA6ADD02F91578A31B97A4ECF993A34D40E69DB8FB294DFB3EF35E3FBDA0575CED7B1DD09F3C05D645A1D67B73AD22AF881C658D5BC0FDF5E03CD57C77996F22F6E55115D962AB57068CB6A83A96ADF997742DAC616F40BBC391BCE131A18B41FA51D3373E1A70BCB8E40E333BD13BB27C8B60669C610FABF07B83E5A7B908B116233DDEAACBD9511ABF1BAB725C1C15BE87F16C7C82237D37B3916D6A91C55B668801EB4C37E5BCBCB27CD25DA2D218C6FCA8D0AE1EFDDF6C31C1EF2F1BCC6AF451122FB9BF9E7F75DBB5DA4CDB5F55DFA3E56C099C34F624C83939A38EB99D3B734E9EC0959AFA21DE5C2C4BAAC40571218F0CE0193CD912788CA2794F9F48B7C23800FD0F312795A58F723CF1B3DFA86A5D9A1EC9D036F29D6DB54C3DFFF3731E1A0827912C0580DBE616D12B2904212189ECDF5DCFE363A07DD51C0CAAD17CF60AE567C4A2663273D3A639483665AF1A0FD17AC29B9487CF883F1F6726F49918E161419399ABBA4C60FA27471C61B46392940E83B447B1D56D98A2B64B907DE903FBFB88F9EB02E89C46CA3F7B963873F607BC7FBF4B1561DB504DFCF2CD78E4C5F859F49793AAE1427CA2D2FA70FC0E7067F7E5AED5DA6372E95F54186F72971FDED9DE28F7405AC23463A4478B1CC9721EC7D2D07A302DE94AD42E990699D71C7A5290CF3B65E316E3AE2CA9CD349A0A7F7483970B0179352AB93D4A4B110279C9E5D4B0554D904FBA60A710FCCEB98423BA7FCF5F6C73165B8D29D74058FBC +ss = FFE9448FE824EC92022890969F1FA8E2FA87E5B3E95A9A155839177CD3C8E359 + +count = 75 +seed = 8E2995F1B3E43853B18916BB1212ACEB05898E2B177A87ABEB928AD7184E59695C56B2CCCF5DB80853C28A525E327D13 +pk = 35A0C8EA287462D8CF8841CDC9016796500E61E89EFF672E87C667F453C8CCD148B94C9A9A3765649CCC6E1C05E5350218D091783B6C7E4958A0807E73E9839992C8C36A87891B7CE5D7122E38B5CDD745FEB1058FC2827B882DF77CB564323746855392247B054527EE862ABC91A557C431E55B81D23B1C1A94992EF540E07338FA944D24B17ED4E693EEB8224A0C5307202457C8033AA4651B2B30F85A9BD8070D1B11675FE240A1009DACFAB21D50036426A6DC9C3DFC05CD1612BA91DA51BD5A0F7EF9B235F1B3B2641747AB8A380B42C060357BF259548CB80788CB41DA4C7D3C4B9401925588920DF255167240F6B092C1329799F0039B74CBD549B2C053A71D4641071A3A95A460B2B3A8ADA727193267DE555E6CE87986AC06E647C4B7967CDBE5083C4B99A1B44B5DF58959C48BEABA0818608FD4046EA0C09A28416C6A97A1066C0650CA619D14A056252D38539F1C2676B69CC53502487389648FE596783BAAD0D7627CC6AB2DA5B6788410B67285841A323E04D037F25E103B38B07672248186C969B04661AC6B2753C5429EEDA389599B78E84608DEA89556A9510627B29E13B1713A1442158561DB8F435BBD6234A420618985DC4F71F0A5F15762FA16084F178E0E76BFC9EC5C35FB52E52301E6809CBB287D42B7591828AFE605CFCC93C337BAB78B55237B075A8BF08C48C15087E82600655234FA99F6987DA7904EF50A1599867D56760AE1D70006925ADE67157508289F137DEF9B9714F4CB72A017EE6A6325F9418F3A0EA3A8762C55987AB406DD9A6D248A33EAF264774AAFF6F00607F37BC20041D3A170E07407792A43C5407FB3622CCB065B74BC1A54F86AF9F7246D288FEE725A6FD85E82477483F778D5388728C4565467A9BA3216D92089BC1C742A20B03BB526B73573CDC91AA8E085F1ECCD1866280E791BD1E43D4843A440E050E2967DAAE26686CC2D32F512332CAC82095AB0005133023E75C9C92B0388BC8B2822A82F93FC3520972E2E0A062A388931092BFA8758F251895C641186D1B40F6A332DF3088BB24381DA133CE40D3461A7D87A93E702472E49AD91CC013C936B02A96C4CE14C2B23AC79869C6D139C8D85B58DA27C6EB4C4250BC3DDAA56DBBBBFFAF452C09074E013A3C7599CD5B8A876076523C6B0AEFC6A503BCEE0FA76407B779DB92453F7AAA4E58401CBC6F3718A3352013E1383B4222572118878C99289B91B02D929DBA06C6DEB6F4C2B0459F86D04FC8D287B6A676B17E45997027568BF7BCCA05C3D394C1557873711174242CA50CFA30BB3D715D1400807CC5FF1049CE720BE3C360FEBCCB61DD7244F4352B655A517485AB13B413983CC089749AC7144312966B2C67AD50096BC176142858881F09E3A075F8FA6BF638A13AF572BA026A172B23317A01A999C8C1EF478422CBFA9802F98F2856BD6A11F8584C532807771C19C411A2900C5A57C9B8E44B4C07B3BE3477BAA738AB2C407653A309D7A82CFC6B86A1B59AD1251E008598E453E04E3306C1877DC703869DA25A9B91FEC80AAF4F30B4D0A83E2DAAAC73990F05A9002D6ADA0409450454291E37112A9AD97147CC89999DC89A30C809757933C5D0356F329BFA3823D34197B7D9E60E307BBABD9B3E8272A0EF1B3333269A7AF6A5BB8740BFA +sk = AF361347809757C2AE0C4A60393C90222C394CF136E95517552721FF136DCC234D64715A1AB43D15708187F89A6830791E0062CD43253EE486AC54179D320FA6A8BAC4D0C07B7158A1ECCFE52C4847403849982D73288877D04EAAD37D392AA487597F80F19AF7444E5A82CFBE51609AE515C1B320B6C75AEFC121D5E2904A0185654A418E5C7A379B41838ACE149B45C5A4040DD239ADA846102A6BBC811EBED4710B2393ECC4BB8C6254DC815D2667831F962887A74EB883A5A8642E0B427450D01321246A8797B7BE1211EAF64B0C706EEDFA17CBA2B010626112AB6B2B2B928DF38CCBD9B639B9C6AD090E92DA98B5C9914549BEB6A9B5505579A56943D210722BF590D63C1ED56534A96552005226C34CC1AC32572D2AC0823BCE348086096525188088DF229536BAC34A1C95083309A0971F31D975DE0598E4E009D24661B2A79DFAE85343B94FB1BC171493AD77D767E0814837348616205652EB4F98838CE536691DE8C3AF0A4970EB0C3600B4605841BCB0884E08BCA3198B04B2AFA6F575229C56462B9516026D32D2CE33A4B1ADD3B411371EA6516765F457613CCB50F94AB9395F6FBC94395A6C9C104CE3B79171A83A49B22ADD3A915086B804C3B42301BC1F14630EE3217F059AEF485C019A4248B4A78A516D75919EB2B15BB1E5A34CB6B470CA7A797BA1B5193CB4565497F98BFE30A7578044867897C332687D925C8BAB05D0C35693F557F541B571D6AB7E4A752B80267B0329D7558FE4BBC54C8612AA95C03F81641A129B1793160DBA78C4E0269E9361087328A73C67C0044217A25C2E05B64A1B8EBEC972606BC220B1A456D8BA86A76AC4A3C06429CFB6035EA50549DB887A5F6170EA282BCC295A2EF000F571038FA97B6BD98FE0399ECE3755D4B55E16261F7FAB678C394C83676CB9F080BCC915C8B1C67DC998D7097074249585E31C5B30BD0250ABC570531DB43F546C2E05983A7B5219127809987343CF722FC38525B2ECAAD2CA703679CBB7500420F83960D7505BB7B7B59A8B6F0C876C7A53D893A10468A516FA7A6A08C04D3259AD003DB768559E173DF06A08793B10E5A1A46145B6F0FBB230CA504424B4E9617CB3F509993567B4CB94CB2CB39811BC1EAB31B5F5691FF4108E5A6EAA9B15DC2AA45FC4AD26B9CA007A7C2A680ACEFA88F12790ABEC7E3DA1C13A355C1C669117070A7E1976F6859921E273F53632B4144B58E0A74207100D2CADE0C8A0410814D40A4234843A44978D0D4A173BE52434760423235F5D7C8E1F56C8181487BBA930CC9272ACD524EB6C9D71D753FE62B0E9BA33A478B7E82B36D9690607550ACA261085A08725281B02E531432B35398B7ED1355B8172776926BFE41880DF90AF6951A58981C708724DEBA6B6C2BB8AF1C0009C71A0B82AC0D14CB0910A8EC3988251DC9E93F17E067608115C85BB6C47D33A2A9359A35BEB47C3A04AB65537F59BC1EBACBED4B97855F753A954929B6449A4DB7D2098CDFC04008873004BC535BD5C74DD49247419601513C4E8125731307BC858845896A67D33902AFA4B58B50BE969B947851BBD791D66887CC6E92E19A2B92BA6BCC2825C4239AB2894B2467547FF3A63BEF65E35A0C8EA287462D8CF8841CDC9016796500E61E89EFF672E87C667F453C8CCD148B94C9A9A3765649CCC6E1C05E5350218D091783B6C7E4958A0807E73E9839992C8C36A87891B7CE5D7122E38B5CDD745FEB1058FC2827B882DF77CB564323746855392247B054527EE862ABC91A557C431E55B81D23B1C1A94992EF540E07338FA944D24B17ED4E693EEB8224A0C5307202457C8033AA4651B2B30F85A9BD8070D1B11675FE240A1009DACFAB21D50036426A6DC9C3DFC05CD1612BA91DA51BD5A0F7EF9B235F1B3B2641747AB8A380B42C060357BF259548CB80788CB41DA4C7D3C4B9401925588920DF255167240F6B092C1329799F0039B74CBD549B2C053A71D4641071A3A95A460B2B3A8ADA727193267DE555E6CE87986AC06E647C4B7967CDBE5083C4B99A1B44B5DF58959C48BEABA0818608FD4046EA0C09A28416C6A97A1066C0650CA619D14A056252D38539F1C2676B69CC53502487389648FE596783BAAD0D7627CC6AB2DA5B6788410B67285841A323E04D037F25E103B38B07672248186C969B04661AC6B2753C5429EEDA389599B78E84608DEA89556A9510627B29E13B1713A1442158561DB8F435BBD6234A420618985DC4F71F0A5F15762FA16084F178E0E76BFC9EC5C35FB52E52301E6809CBB287D42B7591828AFE605CFCC93C337BAB78B55237B075A8BF08C48C15087E82600655234FA99F6987DA7904EF50A1599867D56760AE1D70006925ADE67157508289F137DEF9B9714F4CB72A017EE6A6325F9418F3A0EA3A8762C55987AB406DD9A6D248A33EAF264774AAFF6F00607F37BC20041D3A170E07407792A43C5407FB3622CCB065B74BC1A54F86AF9F7246D288FEE725A6FD85E82477483F778D5388728C4565467A9BA3216D92089BC1C742A20B03BB526B73573CDC91AA8E085F1ECCD1866280E791BD1E43D4843A440E050E2967DAAE26686CC2D32F512332CAC82095AB0005133023E75C9C92B0388BC8B2822A82F93FC3520972E2E0A062A388931092BFA8758F251895C641186D1B40F6A332DF3088BB24381DA133CE40D3461A7D87A93E702472E49AD91CC013C936B02A96C4CE14C2B23AC79869C6D139C8D85B58DA27C6EB4C4250BC3DDAA56DBBBBFFAF452C09074E013A3C7599CD5B8A876076523C6B0AEFC6A503BCEE0FA76407B779DB92453F7AAA4E58401CBC6F3718A3352013E1383B4222572118878C99289B91B02D929DBA06C6DEB6F4C2B0459F86D04FC8D287B6A676B17E45997027568BF7BCCA05C3D394C1557873711174242CA50CFA30BB3D715D1400807CC5FF1049CE720BE3C360FEBCCB61DD7244F4352B655A517485AB13B413983CC089749AC7144312966B2C67AD50096BC176142858881F09E3A075F8FA6BF638A13AF572BA026A172B23317A01A999C8C1EF478422CBFA9802F98F2856BD6A11F8584C532807771C19C411A2900C5A57C9B8E44B4C07B3BE3477BAA738AB2C407653A309D7A82CFC6B86A1B59AD1251E008598E453E04E3306C1877DC703869DA25A9B91FEC80AAF4F30B4D0A83E2DAAAC73990F05A9002D6ADA0409450454291E37112A9AD97147CC89999DC89A30C809757933C5D0356F329BFA3823D34197B7D9E60E307BBABD9B3E8272A0EF1B3333269A7AF6A5BB8740BFA12E89C47142418C26396EF0174C02F69DC00022D56494D31AF935490EDEE63859F684FB055ECE19459EB464E91E126A7A6E3ED11CCEE0046DA234D964C985110 +ct = 1F2D0A172AF9DFCA569878612151E46E0784B0F2DF0F81A2DD709CB8ABF57585E9AE0E68B50D48B506C84A8710F42826A0CAA795495203ACCF99E76AC2A06B184C9C3F011367F9431A4EBFDD0F57CF8B3B5F0BE55FD0A1EC018E1A2D898D1F126980CEBCB135CBCD5A23E9468261C46592082D9712DEFA7913999386CFD2F69F7907D28BAD9E0C1DB983DBB9645BA4CFD15FBA1AEFD667CCBB497AC67B77C382DC498E5E4407B5E3805FD1680A723B6CD64FCA2A962ED8117BDAEB3ACEEFBB7B1D943B91AF4CE217842EBD7B67BE89774258C2639EF840CCFF2E1C0B0F1B03FD536366B99200B48F110E9ADB48A9AC3D77AB8BE563F5B89C50309180C4233416CA2B0606B7AEB390BE541A468B878E49C79AED0E5472539762C859E1B04CA23BE4D12ACE5C9511B9AC563272944577CDAF9495F95B55CF91BB2D4FBDCC513452C32F080B11FB49ED6866FDD443C3BA3581B9DBF550CEF4B4C18E7A8E2DB5E442DEA3C09AD5A3995E5D4691D13EC4710C1ACFC2CA3CFEABE621D54AA1E13DBF3FFFEC5189E2DFA14C382F21D17EDD9CFFDEDF5AA835301428110333A723EC6A8BCCECC0B93C62A763105F1E32F6F6F15B31DDCE5F6F95052A50CADB5143D195C47B317E7633D37BF11DDA9F0698299BCD25CF53DF532C2684EFD4B6166BF5F5EEA80CEDBA05B8703513767F158EF78D1E19DBFE7B6F38686E8538B6924A0EC78A5D9E4E2A12D4F3EA7CB55FC334486AE00F7A9289694FA7B59C64C2DFA003015C9785DEE363E7825CDD21815521E4438DF858EBA176E1849305D87E0D128CE5281EA24B6DBF821025DE118C52DDC6B60ECF5E527486FFA58DE8A1EE1C4F3314400A0C72687617A03E0FCD606D4B6A4A36B777FB333661DA0BCE06E96A497B5A2B915FCBA5FC8E652B486E5641BF62FBF01278D62C73884EC4BFF145674FB8220E69D7EC8ABDF220AA8F44C90EDE9B1EF5A026817E6BD389C365FDCE6DA3F268F3D4B1C98C9321098D76FAE308278FE8877F7E3A9EEEAEB57DB7B5D9CF671B969AB9998B048E4B37787ABBF9D6B384EE41756EFA4B2235C070A7017475BC808FEBD77A6EE3FFAD7A686BEBE6E84BB3B0C8537399EB39292FCC986D8FDDA05DC3E358E5CA02FDFEBDD84AADD7F78E77E2C8FDDC372E00AB5332683D6FD2BC00FE3758C616CA954CEEF955498699D653F3E35A22B5B8A385588EBCDA436A9DB907A5B069BD8CB0AA5852EE037C31D9C3C7A6AEB30624600D33625DE5DFC69CCB4DFAF0876F9A85536AEA7F67ADA95CE0C3426B9F3F2C51352D721B2EC3862A9B57B4CBB3495CF41883FFB772307166227759F745C9904AB2ACB946E5D38CE5346B9EC712E623F9D4F9DE43E5BA41159BA3D6C18F515CEB0775A38A2DF97A042A6673FAE30F1C957CB6B6E1A1E9C90992E03CDF0D2D79B9EF3D00639EA26BD33E8495958D8696FDFF69893B956E61024137C207FF6B46C2E00C1CE77BE0F3AF4DAA3743E420C2521640A159891CB26C539E1BBF35F6833D64E62FA1DB57904D88681F +ss = E3F110E7D74400CB476B0E34141A107D874986A3732ECC103D9BDFE76BD492F1 + +count = 76 +seed = 9218943C51FD2DE47E509AAC67EFF176795102F37D7A2017E3AFD768FCDA7877AF38739B00FCDF227C2FD62EB635942C +pk = E4749BCD8577D50A102352B869402EFDE59F5FB54BBEE919E7D4A8BB8CC40FB8C7240401113152BA727CECFC8E4B817C5D537DF050902BD03DF866317006A2AEF59CAC269813A47FD337A0C5B694F4B080F100089255614634A2B0BB1ECBCC3F1D84CDFB3054FA749736E531C2E673716079CF45C89B444B7D821D892C7EC39A74D39B815C2B9981CA47F5E56840341FF9D23FC877285F9B90FC78BEA1B9C5C647AC52D066AD7B8CA2AA01E0729FA22C39D9C3C6CD833C6AAC061AAB1C1EE6819D2A245997B8580A9E1630112CC6B62C4952215A3281111675F25A10CA0C32BC68C7BC920BFBC7BCD82EDFE130B0434AFA29B2B9D90AC3F1143B5664E5E51984B52D976439794507D92CB256A1520078972B843FF3DBC6736602F68B289E0850EE845E49586C889CCDC104CBF13470F6F6C0E6766007E5C3A1348166933A45A1A62E0B749EE14A38E11A094BAE60A38C84079D81AA655782138671A0FA186A727457D351A8A45B6FE05369F7B158DE844E31117DDC47AF9FE52075C6ACD5F93A31C38EC7F608FF9096C8562E0271A35FA7265A56B24BF31C6A727376D1AB3F600573342E60884F41D355B2336E464B94554B7C108614C3394FBD561A2E74BA7045C0D74032877901E4F8A95C41CE9FC72013C51FA93B5C0B3C3B0A8C90CE0960F510A9F6A453B8B0012F7C2430350B8A4B6143AB5ADC7AAA6F3533E230C3062B7CAA33B1E9A3BFDA7BBFFEF8341AD0A33AB272BADA717A4790F4C99CF430BF114B62854810EAB7AF582A2EA327A599C490E25795CC5C42219771391B33DF4C7FC01524C4C520EB4559C2EA8C38AB5CFE27035C756248662C1E969EF478A2D2419ED9DA7125EC32B0557EDB5B77E0DAB221544E5F7A57A2941B89B803ED1C7D8DE65F64A29D8E7BC2020B723D391987F83DB0BC35E96AAE7B2772B37159A3257EAD277532119CF55959FBEC482169C5391A9409877C79255CBD1C8D2B8352CBA074BC4714DEB09F9CD81624D2782DE91EFBC30882C45631E96E35C9B53F77CC0D268722BA5EB858A1DE719A88EC240DA229CD7766B9A237641C1277C006A6672BF61AB5DAB4C223B7381FD3C16704CF7920B2F11210C969B6B46A152B72598DE4AAC1665D72A45BF51370DE61559F83081DCB6AA49339E489968C80498550AFC467C8AAF0C6C1B9085699B801C75EACC3142BE38DE6F6A64AD6708C426EACC13B09D8BEA819BDC200258D31A8D1F308D0A7470DD35161379191576A03B81D70EC58565CA7C4A6BB333338D8113D70F5BEF45B6835917E17C2945A06CBB7F2225675252F351593B06A6DB504B6E67C6E88763FB06879187C5053029724B3477281CC5C5294B36B64F12A08084EEA098489D5CAD338A0CFA61231268BB866C2C524C71BD6A467C845AC7A4EAC579049734970859A2EA753C6B93EF01532B130A103C6244A17870B75023E0014E6D8433AE5CD2B145BFE253A8BBA300B6465FCE277E2FABE36D6C8112887CB0A6DAEA4A54E258CF89071E407594DE1BF1F4AA2BEB50263DC5D5FC729B632957375B5CE6373D9B93211A66A29736A6ED616EF8538E95C45BF595B2EB743D79436D6385BAB74C80D88C1A1F4022E6C3BB3D2294C474C2C554F3BE4D7FAE86455763B97EC8FDBE9640219B35FC36033966A3525D485F1 +sk = 31CB44A14C3FF840758055BF2AFABAD14A723C048D4D20C5908BB781844D574A96A0807C59D5192548A0089396A78B953AA52677B9A111CB012954B674571C5D0C7C5E6488D498290F7665F4F32DBA7228ADE2A724413798EC32619901215663B2C26360612558070BD06261BBAB86B4F96056A498BF37B1B84238C5099EC8F1AF4251C0862B861F334EEE85AF8D364A54F6BAD0E44A23A0577933CA8482889A955086EA3A2C94B057C1C20D540CD6D2976126854AC123CD386A855CAA385927318825494861079AC84606AC0F1810EB78A8398740BE69CFA1777C61A5CC1D758AE28C072D6087C379A567648558AC8A1883734C64361DB33CDD156FD371A2ABE534B162C6E336143B944DC2309AAC106525D6586793A2B3420358185FC787C2CEE3875E3425BE5627C1D49313413EE498B17E8C295908B718B3C4A6E03024D77F1EC37EAEB7462E09C683CB9B272431EF0ABBD0422AE2569FC37902AB90BD2C236F4DA66D78301A61765A77E43ACE81102C7355749C1463B55F10E26727086D73A1800924C6B0EAB6EC905D5B01ADC538C9EEC7A25989B85F24B1F68B9A22637613E9ACF609A67CB20B38BAB1A8D81CBD22A5EA8C7587A13BF8EB8A37E5949084C26B4433741A31C502A4C412535FC6A1C5000057C65103027F78F81DDFC4A8843C59F8563BEBDA15DA543BE2146A3EB7B521700958BB2A5064923236193D981BD1E2920D00B1CFC504E32495DBB116C5BB7AA21B6CEC5C9FC0B1AB73330544E7AF5BB1CEB7C159E3509938D0332CF51ADD245606617DCEC688F117BFEDC27DC5B8B4884446861B592B720B53FB23CF08513F66C3B51833E51B9A63E297054A8C03F8BAA257C64C2C8A265A8A92052C41146BDB3A32CE0B7196AA33564806DAC33AC05A20178C2A0CB04000D484F0325C9D16956DA0AF88F68BB72B7BC6B122A486CC1EB01BD3027AA316C6D7C1AE7D8B9A747443C5D7237989A93ED939D905832E76AFAE4172D5F70589E54F7B5CBABB536E5F316B3D38911513B400AD83F7B2A3C72A6C09EA3B4F68129ED285FB99442FE61237D61756A2AD78B7790EE69748B79E42EBBBD6B9B0D803A3EB77477609AB2CEA5920128356C369878855126C22F1AB66A3A4C202892C8863B609F7926175CF1E3967EA93B7ADE7A8E6779672023DD5D81BD4D9345AF36A38DB17E96B8D85B7C0BEB586AEFC9FD9EBC585F071C1B9C34FA2283A60884A0CC5EA210887AA677D24192DB582F05117FA189C868A3CFFE8B2FB584686EB3D009733E1D86C07D6A9893C7E9410B4CA99A4A880B48053878A45340D0056031068A63113BE4B51A630016875541E099935EA92B2668AE84C5A183CBBFED619691038973CC07B72ADB803CBE26986C827AC75428CF183CD5FE7C9C719378438058F470B62FA977DD658F219983F97B517BB1AED01A478A18DBB89AC1B916419A3B25F388C276C190B866356EC84C33B29022286C08A34D26948C59341A789CFA168ADC0C7A73DB36A72EC6C2C688C06AA3EB1FBB25B7B828CC3719C7B2473719F4E2B5C4AB8A4FC172A132439E0E3AF22A1BEAE17BA4CF39A155925C62A4C9CA76436496646906630B9349A335A4852C01B018F77DA15E4749BCD8577D50A102352B869402EFDE59F5FB54BBEE919E7D4A8BB8CC40FB8C7240401113152BA727CECFC8E4B817C5D537DF050902BD03DF866317006A2AEF59CAC269813A47FD337A0C5B694F4B080F100089255614634A2B0BB1ECBCC3F1D84CDFB3054FA749736E531C2E673716079CF45C89B444B7D821D892C7EC39A74D39B815C2B9981CA47F5E56840341FF9D23FC877285F9B90FC78BEA1B9C5C647AC52D066AD7B8CA2AA01E0729FA22C39D9C3C6CD833C6AAC061AAB1C1EE6819D2A245997B8580A9E1630112CC6B62C4952215A3281111675F25A10CA0C32BC68C7BC920BFBC7BCD82EDFE130B0434AFA29B2B9D90AC3F1143B5664E5E51984B52D976439794507D92CB256A1520078972B843FF3DBC6736602F68B289E0850EE845E49586C889CCDC104CBF13470F6F6C0E6766007E5C3A1348166933A45A1A62E0B749EE14A38E11A094BAE60A38C84079D81AA655782138671A0FA186A727457D351A8A45B6FE05369F7B158DE844E31117DDC47AF9FE52075C6ACD5F93A31C38EC7F608FF9096C8562E0271A35FA7265A56B24BF31C6A727376D1AB3F600573342E60884F41D355B2336E464B94554B7C108614C3394FBD561A2E74BA7045C0D74032877901E4F8A95C41CE9FC72013C51FA93B5C0B3C3B0A8C90CE0960F510A9F6A453B8B0012F7C2430350B8A4B6143AB5ADC7AAA6F3533E230C3062B7CAA33B1E9A3BFDA7BBFFEF8341AD0A33AB272BADA717A4790F4C99CF430BF114B62854810EAB7AF582A2EA327A599C490E25795CC5C42219771391B33DF4C7FC01524C4C520EB4559C2EA8C38AB5CFE27035C756248662C1E969EF478A2D2419ED9DA7125EC32B0557EDB5B77E0DAB221544E5F7A57A2941B89B803ED1C7D8DE65F64A29D8E7BC2020B723D391987F83DB0BC35E96AAE7B2772B37159A3257EAD277532119CF55959FBEC482169C5391A9409877C79255CBD1C8D2B8352CBA074BC4714DEB09F9CD81624D2782DE91EFBC30882C45631E96E35C9B53F77CC0D268722BA5EB858A1DE719A88EC240DA229CD7766B9A237641C1277C006A6672BF61AB5DAB4C223B7381FD3C16704CF7920B2F11210C969B6B46A152B72598DE4AAC1665D72A45BF51370DE61559F83081DCB6AA49339E489968C80498550AFC467C8AAF0C6C1B9085699B801C75EACC3142BE38DE6F6A64AD6708C426EACC13B09D8BEA819BDC200258D31A8D1F308D0A7470DD35161379191576A03B81D70EC58565CA7C4A6BB333338D8113D70F5BEF45B6835917E17C2945A06CBB7F2225675252F351593B06A6DB504B6E67C6E88763FB06879187C5053029724B3477281CC5C5294B36B64F12A08084EEA098489D5CAD338A0CFA61231268BB866C2C524C71BD6A467C845AC7A4EAC579049734970859A2EA753C6B93EF01532B130A103C6244A17870B75023E0014E6D8433AE5CD2B145BFE253A8BBA300B6465FCE277E2FABE36D6C8112887CB0A6DAEA4A54E258CF89071E407594DE1BF1F4AA2BEB50263DC5D5FC729B632957375B5CE6373D9B93211A66A29736A6ED616EF8538E95C45BF595B2EB743D79436D6385BAB74C80D88C1A1F4022E6C3BB3D2294C474C2C554F3BE4D7FAE86455763B97EC8FDBE9640219B35FC36033966A3525D485F12FAC52CA60594E514333EAD02CB1BFA5CD1D9ECDA4A0B25CCDFC47AD3F632A85F03A8ABB0A5010F400AE5722A75BDF5A2F6D5B546B34D73857CB1BFC7E587AA7 +ct = 2C0B8450785EDE64FBF91E190C6B063F50B0AA80BD41C9AD969679FEFC58C69E1354C123AB70C1AF7E44AC63C8A8062E5BAD5313EA0565966301BB0556FB4B7C490463B6CD940AE2D9651A274323F799E25F1888853853C5EC2A4FD34F8AFF4159194E3FBA5FAD3C799CE439C84094C028EF6FC333FBDF19CB40BA8D1228B97CF602A0F7FDE3D15BF5382EDE4AF8A4C6BDC6732AD363735A28ADDCA063AB702F1BF656B474985D31DD68B51DD92E773D3359FF8A02BA792A06689C37EEB3815DCCA7FEB88BD5ECC79E5404ACA3621B3F81AB7BD55BBB293058F61BA5A93A7FEB9A90617EAC208DEF7C6737B353B4C3155B59726CB97A211E1DB42CF2F6805DEE40A68A966BE225A4D94542E9B972D3CF07F3D81EA54535E25AA7F56B8160ACDFA6097EE7FCC81A6F9FB05FB975BBD18315D68740FBACCCB17ACC9132B6622FF91EA8A2AB02CAE313D67A11DB654440A9B63A819A9A51AAA593FE1AA99D70A6ED17C99A25CE4A424DCA9EF9E6DF285818ECE4D4D596505FEC0DE68DB54F7EF7AEED7542908A8A47E07BC69DC4AD657C66FC97C2F3E79009C14A1E115E77D17948D9D599EB85D91F3B07EABE2BED6C549672A751FC75ED2FF131210A14C03987F09B61E24B144C4F7A64D8E0BE83642777A8CC9897379649DF060E5173F5C09BCD2C630DD7CDD51BF995A053DA7590DA319BAA2F8AA4904443AB1E9C5560F3F3624A744A20EFC8F2F7401DF81A228003CFA0F0196F6D57D0AAF7BF962994A60857EB5949BA5ECA8683324CEDAE9BDAA636B1EBE97F43C31A5AF9C51E78C6745231A3E5ED0C0B1E637FDA928F02A3C04B6BCE519EC653971F74E07544EBF78F0F71F58081EFB797F08EF9698A6665889DD1774C551B30158F4FFAF9B6C3E2E3A34213E4147A8437B118C12F5DE786D0EBCA5BB74AAAF88885EDBFCD96A3CE37864D522F7FFB5A1516E447EA2185451B408CB880721B09BC17F33A75C1B1DDD2A33D74D5F24E0F658E4DE0B049074992FF844F90B6E0D444F3612E7C53502643266FC97CD6D94899E5C131EC29F472C991BCC618C8E8786F83952FF53570D32A46FA9CE0A88CC4F4C2A84F185DE78F7CB1B428254886916000E4F030859556E2C5C172A7B73CE74999A58DB2C48CF23E55C43AF92557484DE624ACE9C4930B7A9E0BE561788D645BF8CB2EF2DA50CB04BF3889F39801686B8ED02D94B7C8A0DD936820791267AA3443AB4EB85CF794A80E96C2BBA992FCCFC655FB130569F9A2C47B54A0EA5EAA76C78A56729A516ACB6FC67067467518D79BA9CED47DF8E13113B12BBC467536994E1ECB8628D86AF891B30F4545EE20876340141B8043C0022031070691FDB2EE4F9A043F2AE05693E62434581900DE61A659769FB901460A495D90EEE56948FE26C517EAA0905CA92CBC47BF9CE4FABB881A6AF68EC1EA10AF30933BE24B791A0102F29733D9C1251B679F1CE2F08AEC8B19C75C010822A8439A704D51AEB55B63C958DB26CB0F839756FFFA5D1465E7F3F40661ED966229C193 +ss = E26737292D1A1FC6772D9C14F9D74F0F4E830C0BA04253AEEA21E69830A3A360 + +count = 77 +seed = 542E20078ADD5296050AF150360F057F6B9AB3BA835589DD56987DE805F900B906505B5390A0D86CBA28038992DFC59A +pk = E26411E0CB6648D36C6236468793848AA4B7F4510377E0A24BDCCB712BC98CB21CEABC08101328D3D032CFE9C82D21372924C69AB5A402E9B3D88C87E9BC5C90335E5AC231A1B87EA3C2527B82445D7C8596B10A609616E4DA431C9593B91A1AA21A2E436A359A7A5901902A6B516D562363BF95890501AF4C5946626ACE3F276AF8966709CBB9B666B9842102F3077978E4872307AC65EA11002CBE4DD0BB83677419B89C9E0C9847FA6441C86B8B601663E40357831D1B3C21B4A8985ED50E546C2917F332D4ACB59BD64D9BE88EFB981362458B8D868DA7EC516EA9C807A29C5D51385781302072C1F3295DA2559003D4265CB330F43AC5B774562C182BE83636FA034BDBC3CB25AB6C8C21C69B873329321533A788287A40C1659F457C5E6E15456DA54A7FDB18C8BA246447606F2AA340A48B4FC667D7E67EFEC47910E05C3DA4463B75359668821711530835357B6A8EC62A3E7817C508C79754063F7110362BE73416A46533341CDE577C17A75B3316AC59575EB1A1575EC0104EE77F70941E91786AD457832E1493466A3FAAA55911E9BACEF8CE49F579F1753B5138797EF827F0BB0821EA69BD9C43ABF2181D0775FB64B8694C74F0323600FD3E5F1BC5CBDACDB2329928247E4759747C02CDD924CF1C93BAE5C37BE8C3B9C7E09B4660C3B9901EE33B62350A695D799B52743D5158C015CC609E891C87F9BA02616ED2D3A1C14AABEF101B4B42AD5C47916481BEF01B11B9496819AB76A428C0F5B8A69EBB24FB5B3407E1C22E2020341575C7098E63379406C9B60B6A1733C171682B1776719DB5ACBD2AC6AC4B97AA0A3C8C168A5AB389010A01B4DD01829EE4A402E54E633A229A94CF96E01F72EC4054C13335B89BD6E91E965BC324924C028B433074C9705AC4CA2682FB1B385F058D574515319397754CAC9F68CB70022882A24242D1C3F1242CABDAA4D68A91DDC8A22C939BDF1539645A912A33C1D11A5849211D831ABC2C86834BE35BC3500CC44522BF9ACA86988AAF580BF45A5FF7F8192E110E163356B8A52486F772204BBBBC19BEFC631433F081E8556579D288B3B27C1A8209ECFBAA30A82B34EB722FE2BE60534E2F625C0AE477826A9E75B7C5AED2398525358BF0AD127C15915133A32A9ADD47A72270A98F942807FC59F2420E14365A758C534F289160A65CFB34619C7C9B2992083CC699F554BD64586DCF379605581711D607235C944820CC28416AC761498D8B54193A8CAC8B815D7B19A21B02A6D5A737C4984F3A888C0B9E3F51B95ED9430327642A082787132E94D6C26B298B77554E7F2237AC286F419266580697FC9316EC1176C4D763B194C52D79B25604974C1BC899560B72094701709797C5183391A268853B9FF3AA277C707906BE0B078FD6619050E14B48BC73F877BEE69A3EBDABBB8B2198CF51B14B2CC9ABE673CAA803B419BE1C34B6341C2E83D2013152B557A87AC4FB55C5C86CCBBA995492CF960479B044B3D6233317677C78A453D4E247ECDAB3FB200C3D2A0564C4100A995C4F70597E498CF0897B507AB35E4587E2B875030303DC2CA8CEB41AE2A9725085C12040C8D0CB20ACE46F1936725BCABD60D0B880F7AABC887090195D95FB6EC060B5257AC37481FAA2ECCAEF99C0DA37285D53BAEB0E25BDB9 +sk = DE9A3F4DC6A54E98C850E3AF0F7ABC5CB5B363BC668F2C10C6E197927C89E57088C4960C46B767E27129FE78C7CAE38717E6A2A7FC16DBC1582AC697E8915C90281A0A784C4B75345A13161BC6A586166D4385B507748D3B9516B10550F05782125C10F3761AEA2C631AFA83870C003950B891D96AE721317B192F21A50F2B2CAF49F81177790C29C02216759B005692CCAB4281927A46739FF7A9583E9A5EB9A62314E4967F5BB375FB627E5A45B918C801B4B1DAC24D55C13AA7FC5CFC104647295650B5CADCAC2C74AAAC28B82233F64C1C01AB50F16213154D0312C5ADD25AF449CFDDF494045000A01C449D1084C876163C83C13321B1F6F87757DC186D4C30CE916240E538F196936AB9BB419093FD593409F3A308827AD9002E5A621FB1387AC06B442970CDA9C720AC9049CFF1C307806E9FF9209FD0CC52B9517C685C36C45801875DBCE490163C91C707755CC8701AF04DEB9AA0CE460F24C72E5D811C4ECC297ABCC4C9BA304C75812196409C19BE10C494A8B138A6F05FB5558E7F2CBF6F1694E7D417F73781205B941EAA3ECDF91C71E998F9A8B6B72400A048A77CE4AD17EB265313303CC86150D477E42A39CB4B8C5A3723D03550F4B76D5FB7B524EC2658D374A8C955B0FB3FE878072EBC0201B2328B737F9F19BCA8411F35980890D71E7BD9707C917545AA6A659C3C70877134BBB0A1E970E7035021168C4A493CE1C9950456A76CDC05FEF147FDD625D2B4BC51B39F3B9BC73A35A06A7485306457544B88C168B22E81CBE9BB0174A2B526B6BA0641456A3CC941569124557D3BC652DC8259AC66552DB0AE06CBAEDD091C268C2C6F4BC7E948329778CF48C3B37F9A3ED714C5C8E0099036514D9A052631B256FB7E7F7C91EA0311B8DB8721D5001AE90991111C5873499BBA20A9D08A135ABEAA544706DABF7338497C578084E1BDCE9155F87417B29313DD39505CC90C45C12C324B5D5AF01EB2656D58607724725485465E33A6A64DA220421C038F0A625254AD127AC941EB23362649D2049F8AE8C057321AEEAA31E0E98FE3DA74D53938F4F900B6A33F1305A383CC12B35894AD498293957950010CF7912174373967C294BB89A90331C828048E3FA862FADC95283025E2F66DCA10104BE8B9F286C198B8C9F0F24C79A454E8DC0742283CBBA84B95B388D8F6912F4B74198AA52AB561CE59508CA6CC09251FA2780EC0DA59D8B12B17179320D23B822A3395466DAC34384A364D06882592734F72AB0D2DD7131196AFD4DA54FC5801D85928CF61BB257274C98479EE0C2F65FB985F6C669D948FAC153158530849311F0BC51AE72BB8C23AB5FED55E793A4E8489B423044A1B017273A4BE35A305E19934B99B45DD2734AD4CB4C5B368C7A32650F306B7148C199A44BCC3A297429CCA6015E906204C827CFF8C9DCD48BF1B638091F732DFDC570CE6618DFC839B4A4648A52BB8302E32098C26E9A51A6571C9C290005265B6359F07598B10C7674F5356B0365CEACBB55B1A1822811C92C44F0E4BBDA4A13364749C5384CA7670ACCE69BC48B6A0B0B2BAE8AC5CC40ACA6CE24957167CC0F24DD0CAA3A0228C13934FBBB0C205F53D713AA441F5B0FEB01FE26411E0CB6648D36C6236468793848AA4B7F4510377E0A24BDCCB712BC98CB21CEABC08101328D3D032CFE9C82D21372924C69AB5A402E9B3D88C87E9BC5C90335E5AC231A1B87EA3C2527B82445D7C8596B10A609616E4DA431C9593B91A1AA21A2E436A359A7A5901902A6B516D562363BF95890501AF4C5946626ACE3F276AF8966709CBB9B666B9842102F3077978E4872307AC65EA11002CBE4DD0BB83677419B89C9E0C9847FA6441C86B8B601663E40357831D1B3C21B4A8985ED50E546C2917F332D4ACB59BD64D9BE88EFB981362458B8D868DA7EC516EA9C807A29C5D51385781302072C1F3295DA2559003D4265CB330F43AC5B774562C182BE83636FA034BDBC3CB25AB6C8C21C69B873329321533A788287A40C1659F457C5E6E15456DA54A7FDB18C8BA246447606F2AA340A48B4FC667D7E67EFEC47910E05C3DA4463B75359668821711530835357B6A8EC62A3E7817C508C79754063F7110362BE73416A46533341CDE577C17A75B3316AC59575EB1A1575EC0104EE77F70941E91786AD457832E1493466A3FAAA55911E9BACEF8CE49F579F1753B5138797EF827F0BB0821EA69BD9C43ABF2181D0775FB64B8694C74F0323600FD3E5F1BC5CBDACDB2329928247E4759747C02CDD924CF1C93BAE5C37BE8C3B9C7E09B4660C3B9901EE33B62350A695D799B52743D5158C015CC609E891C87F9BA02616ED2D3A1C14AABEF101B4B42AD5C47916481BEF01B11B9496819AB76A428C0F5B8A69EBB24FB5B3407E1C22E2020341575C7098E63379406C9B60B6A1733C171682B1776719DB5ACBD2AC6AC4B97AA0A3C8C168A5AB389010A01B4DD01829EE4A402E54E633A229A94CF96E01F72EC4054C13335B89BD6E91E965BC324924C028B433074C9705AC4CA2682FB1B385F058D574515319397754CAC9F68CB70022882A24242D1C3F1242CABDAA4D68A91DDC8A22C939BDF1539645A912A33C1D11A5849211D831ABC2C86834BE35BC3500CC44522BF9ACA86988AAF580BF45A5FF7F8192E110E163356B8A52486F772204BBBBC19BEFC631433F081E8556579D288B3B27C1A8209ECFBAA30A82B34EB722FE2BE60534E2F625C0AE477826A9E75B7C5AED2398525358BF0AD127C15915133A32A9ADD47A72270A98F942807FC59F2420E14365A758C534F289160A65CFB34619C7C9B2992083CC699F554BD64586DCF379605581711D607235C944820CC28416AC761498D8B54193A8CAC8B815D7B19A21B02A6D5A737C4984F3A888C0B9E3F51B95ED9430327642A082787132E94D6C26B298B77554E7F2237AC286F419266580697FC9316EC1176C4D763B194C52D79B25604974C1BC899560B72094701709797C5183391A268853B9FF3AA277C707906BE0B078FD6619050E14B48BC73F877BEE69A3EBDABBB8B2198CF51B14B2CC9ABE673CAA803B419BE1C34B6341C2E83D2013152B557A87AC4FB55C5C86CCBBA995492CF960479B044B3D6233317677C78A453D4E247ECDAB3FB200C3D2A0564C4100A995C4F70597E498CF0897B507AB35E4587E2B875030303DC2CA8CEB41AE2A9725085C12040C8D0CB20ACE46F1936725BCABD60D0B880F7AABC887090195D95FB6EC060B5257AC37481FAA2ECCAEF99C0DA37285D53BAEB0E25BDB93EB856043B822DF9D60B55FCCB537AFA3CACCA9EF50433BDE1DD9831E534D192A59B3BD23B49A95BC1FAD20070FEC930B6060BD827D742B077092E422268E15D +ct = A86CEF6CBEC42D8AEA488688BCD2F5A1DCF7716149399BEB3EB373810B7976F4D76A37CFBBEE50167F2F38B3E1CB60EE8C74CB60B7FA62E412A341794891A7FF3603E926FB870B876B94AA0F52909824A8EDF9699C5F5A3D309E29097F48B5354987DEA5BEAE36BF29DF79B0733622F1C67623A006D79A9909839CD70DF5A1C0BB1B18FA1602FC2D30C965DBB7433F972E73CB3DD31C6F9BE7C5F19C0E74C8F653CDC115725C7E77099F90B2FA2914FD713775FA619AC87F129CD9BD9A35393281BFBD18C56A0164C0C470C3AB1E4B4CE754E1466EE17DABB944A5953849E2DE8A5E69C4CC1B46D6704A03BA021EF55B240210148AB0380970440CC686D8F50E26DB02EA4281AA99BE5A35618576A1CE9CA39D7E4BE2F3D7ACEBB603F602030A995AF41F3441DD939AB30C19CA6D262438424EDF43375D28642F88AB6EC7BC75247E17399942EADE8F8A9DD2E9DE6ACA95256839EC4CBB280B6F7B86ED4016B95AE567BBB8AE138DC77763ED5BD71EFD669FEF71E37BB02EDFE11B3FCA0404C46B4B300476A020ED6BA561E231E731478D47154F35D5D9EE02D52D82482C490A32CED521C81B8BFBC18AEE4375B1C8A31C58ED19F7ED744D8C7EDC471082480CBA60E0B36CAF6B7B95404F427CD47FC93D548E8B5FD014BB045288BDBC2C8AA4164554535F5A3B36F7871EE965965B741F57386D15AA545BFC0E405831166A9D8496FB49894D3F2B3E7635E6C7EA7BBE009489736D506C808DFDF20103A340AF5206B227C9D913522608BF5593C6D08F596DC0341925497765BB68D3C9C9D34B6AB026CDE93CEB535BDB577220F59B87B7272733E9106856CD2E9C6A225F94011CB54E65670855C910251649616D9782A34CD4DE063CFDE8E1C3144B910EC2F83EE3D5A1D0C7B282214F467B3534945723130CEF32B8D8F56C74FAB9DD7750B4858DE350FF1D3B2674BF78076F0282BA0CB74244A4D6887F188BB8DF9ED1663B53543E8A64CA604A4189F0FFF339B8AAD602D39C9877BD96513439C258455F9FF7BD0B05293E8637F8A56F3A96D5B47E122B1367AE7D8F8C65FA4EE444BB8ECAD8D96BA05D060BB03BAC1B63D1A257576E672D77286402B3832297949400E4E799BF2DC14DD2FE364B9EE06F528DB197A9DDD93B9DA9426F7D8DDEBB8F809C6ADF1602F4812C01B002A75728325E3A9A148E0C85CABD9415BAD35C9347E45AD4D01D5D1DA29A6A13CB0949B75BD07A942F26F2851946AE9DEFBAB4094293EB2FF4765F99068DE9328C8E0061C7A6C858EFD839D9725061E9A04DDCEFC0A2D614FAE5D0BBE0F8ADBE61B1AF37CE882ED75397FB228AE317FB91CA45C498AD05B5F9CE1E81D73E94F4ECDD0208F58A363366625E0408136637514A194F79501209C7FD5D798764AC5AD5A88FCDAA776B7D2D134A00759497B469E7B91ABEE9734961CF5A8EAFB4B8DCDE96BE81405A7C06C541FBD8881AA352FDB3B5AF4D00194274E86CA1D8E5E76A60A12E4DF51884E7F8F9EC171383177E7D7280D36623101A +ss = 1D8DB19740E2F6BA7C8C04216CF2398FE9221B2404ADDFEF8996A03EC72EAD37 + +count = 78 +seed = 6A85A61DD08C0733FCBC158ABB49FE0B0D96A50DCCA140A2E9F5A254F1901985844613B1C656C0CB0112620591B88AD0 +pk = FB262AA9A031E49084A6127B8410A5A46CBCABE6B18F607C97D4AF6C6A598A089BB40C1998D16CD307895035B15DF2C34BFC05F634813EEC780C96B83FAB557075CDE3B64EAE6BA98B65106E729B81D11C926404E99164BAC5B546997D2A842F6AA9CE1F6BB7AB7551A06A3649E1CAF7872AC675CB8981A124CA05A318BFF9A234853821A3036A86404B0F056491A5B20AE09DEDB123DF8B4E9EB612A00207C6CCBC580373B0921FE2831F50610340865232C60660655184D8A0867A47811B88BCDC4E6DEC5874839919188F63740588BA97405BB1FF2925C1553188C0137336948F7809DBB96D2F910A9C0AA95D49267E543057976E3DC7346CDC7560E68911B8829D37BD0EB20DD5E2B0EB1538A98A76A68798B5469F9DCA82A08648A2DA13BDC1A9B52A7B6F345626BB691AECCD14EC20F1C252B4FB2595474B2DEA0EDDA47B87CB51F020072D489A2E79CFCF9A12B52BB4F626C35BA4C0888C7939F38E6126484A7932F5D6A029E1CA5CEA27D729065D7137BB518C1885A299B58E1F6446FDD8449E58A21453CDE7AB683BEC6D84876CEE590D1AD93852885DB721B85D4061DCA1327179ACDBFC329416B23234572901B3F63A2CDA36AA65B17035F449AF2B404691957C30028F053989C501D8C2CF8A8CC0C04AA59F3B19A98777F814A18A0753A7180264E59F2BE7C9F0266B8DC481CAB4833BE8B3B599818AA930571748D41657256015F68A8C887C23205A6655F30C51084925167BB75C98B8A25B7579BDF40A912365164814794BDB0B78824FE9066CC63473496AB9CEA06248D883D1846FC8084D59F05277AA3EEC0C3186D68BDCEB6C240CD0128A6BC1361467B861AB025309C82183233C37B35E8AF1B464331CBE7CC3974A48A8E015A491677567472F263E31188966EB556151819CF52772053936ABB0D0A48E99357E558301DC8157A8A7853212828269786919A8F9032E17F9B692BA8EFAEBB602E83BD4B75160541500779D1907B1159170DEA870E6F57F5229222E85B178DAB32F897BF45510EAD084887566942656357B7896570756AB1614994F982841A525C8EC63CCC8E4575DF03BE2F5CF96505ADE252FA4E80FCFF664F6FA8C337980251904A9135ABCC509DB15A49FE4C6D57B41BB6383B3483CA5F5CE11641F9EAA423C0C3254A508D4319DFE72168070CC8C771ED3E06CE74C93240947A8DAB87D889F9AD894F37243B25259153324E103B73C708371400EBF007BB5459EE084BE938A18D055AF7CC7AA98FBB88A156849765936E7273BC385A1BCA94A74368168CF26D8806C7901EEE2359C8694B5439F1E82C0A6892E4A68C4858A9A00B1496E177D1EFB57EB9C0AE382B56626595673230903CC19C79714364CC4B10891823535E21CBCD45C90D471E684AF1FE243E925C848565A1989637F7614C900AF1BEA9049B78E07F00950AC800EF72860E209C192A4AA0B901090987BF15A2DB6165516AD0238A40B0BB233A365BBF2BAB2F60EEB8A54771A8D8E5279E2740298563AA2868E2DF1BE582897C7A9A0547ACC2D8933ABA9CBD5D937073455489A30E8CC3659C03D37240BFF084D77F09DEE76B60952221ED2C1AA73B772CBCEA4D7A1FD64561E88BB90327B7C13C809696C0E4711CE152577517BE0A2FB3D597FA5804E0C106A4C10 +sk = C65B5692B9737BD5BCEF94376A685FE08CB59C2B94884B47BB6A4B292C4EF8DBCFD1D9392BA3C464442CBE0879FAC60CB733496FFA7116011CADA07377EAC759172DB45C9035532A5A48C18F3343E7FB3A0A7A1DA9C75F647648A822BB8FCC59A2E0476FE958CDF968433B46EA296056A8460EDC0B7D4430252B227CC38C8DFA639A72759DE9325D3BBBDB1A5305E546580127B11332BB666236924FF1F13105176B81A777EBC946BD4B962E8050C0F80BE026A513F7C9C74308F8336A9BC73BCABC8353AA10AFB69AA502B3B6E9A53AC67F8CD8784BE4519AB3C6E8E47212BB59EC3958BE442BF2162DDA987C602030770555C0BC62B1422367B95A91399642155CD0B17DBB848B642C765FDA2400358040D4CD154A68DB36265BB525FC90988FD0C04BF0B66CE052BB216D6183B444CC385BB8AE17388D5E8024AA41563653B5F72899CC16B37D642F6FF7385F557C941571A1C73BD9425FEF3C343ED9B88BD02A9BE5652736AE69949E43B5C9719C4B8E42C9071C10E3D454B3C90D315C93579CB106A3B16BAB7163983F5C514B818516BBA802B7FB1166679EE03C4C41EBCFFC6322DB61A7988927DD83B48C24BFE82A4FB1901F70E2C39C411FA65C43D56C02C79849E7745BEE15B70E405939B055C2A76FE1021E094B4671A290F5D708EBF0B1155B94FEE9B34CD9858D3A8DD4BC27F5FC0627F2A80D6681C11324ECB74639540B72A23083C3758CB29AD40C979B42679E1436FC56B3A7D1115137015E2A2AF9A8BEF038B6905C8847C16558BA2BC6EA92AD90B026228695D664720C15E6708B0934064760A745EA4A5587BA211312C7203005F838A2D5B7BB09B8DC7AA39D4956D494472F71A268991CA907AACF8048FC98C095798D0EA043C42C437F6762ED3678B6D701560016F405CAD66117C786B56B3A88FB5968C26869F73A2227B129553B220F67CAE75B5433B29259553AB4375A0AA6766B2AA0AD480B6969201ED21CCDA0A39F8B8F565112565065D8D26DBC1A57425A29FE0A606BA826FFE45A69493B08B11712E88A2B4B0371DB5C0EC0125E2659ED08275D18277B9C0CA51797D46CAFE91951737868483A418427733EE2637B4AA9496C30FECAB67B0B7278A76DA2DA201874711E6928B7A40E7859378C867B9BA81529656200584EA9A5881B657B68980EF8CB201338AC1B856C4EC5B0C48A80BCD6676C0CA624F05296E59155D5587C2C20BFA1BEF1005BBE9840DB205D9658935A67614595BB3FE48E52877FC5BA639D023F54D534C58CB90A0A98BD1C2E9E940FDC61193D4753D17463D7EB8C9C6575E0F6845B5C0A5BC69C5F90128D3078960671394B75C5C72EAFFC1E8EF4AFDB395FFD40A2F6BC75FB9B79E1D8756705B710B0BAC1DBB4AC312FFF30745590739C08BB25CC9EC62CAF1226176C161ECE62AEDEC392A3591EC2AC80E92571C1417BE7D82B2F9A1990D50DAB78C1DEE631304AB5AC57274846A8FDC6547B224C72E0781B233FF8A6C876ECA3A3E060A00B560F661042E85340C4A8257660C0592A429C7B81B5137D410B5492864E156DAD292DABF59035FB0E02247E6C6847CFD86B6958C74209A8F389041E5389EBF5B9B633B7FCC08CFE14BAFB262AA9A031E49084A6127B8410A5A46CBCABE6B18F607C97D4AF6C6A598A089BB40C1998D16CD307895035B15DF2C34BFC05F634813EEC780C96B83FAB557075CDE3B64EAE6BA98B65106E729B81D11C926404E99164BAC5B546997D2A842F6AA9CE1F6BB7AB7551A06A3649E1CAF7872AC675CB8981A124CA05A318BFF9A234853821A3036A86404B0F056491A5B20AE09DEDB123DF8B4E9EB612A00207C6CCBC580373B0921FE2831F50610340865232C60660655184D8A0867A47811B88BCDC4E6DEC5874839919188F63740588BA97405BB1FF2925C1553188C0137336948F7809DBB96D2F910A9C0AA95D49267E543057976E3DC7346CDC7560E68911B8829D37BD0EB20DD5E2B0EB1538A98A76A68798B5469F9DCA82A08648A2DA13BDC1A9B52A7B6F345626BB691AECCD14EC20F1C252B4FB2595474B2DEA0EDDA47B87CB51F020072D489A2E79CFCF9A12B52BB4F626C35BA4C0888C7939F38E6126484A7932F5D6A029E1CA5CEA27D729065D7137BB518C1885A299B58E1F6446FDD8449E58A21453CDE7AB683BEC6D84876CEE590D1AD93852885DB721B85D4061DCA1327179ACDBFC329416B23234572901B3F63A2CDA36AA65B17035F449AF2B404691957C30028F053989C501D8C2CF8A8CC0C04AA59F3B19A98777F814A18A0753A7180264E59F2BE7C9F0266B8DC481CAB4833BE8B3B599818AA930571748D41657256015F68A8C887C23205A6655F30C51084925167BB75C98B8A25B7579BDF40A912365164814794BDB0B78824FE9066CC63473496AB9CEA06248D883D1846FC8084D59F05277AA3EEC0C3186D68BDCEB6C240CD0128A6BC1361467B861AB025309C82183233C37B35E8AF1B464331CBE7CC3974A48A8E015A491677567472F263E31188966EB556151819CF52772053936ABB0D0A48E99357E558301DC8157A8A7853212828269786919A8F9032E17F9B692BA8EFAEBB602E83BD4B75160541500779D1907B1159170DEA870E6F57F5229222E85B178DAB32F897BF45510EAD084887566942656357B7896570756AB1614994F982841A525C8EC63CCC8E4575DF03BE2F5CF96505ADE252FA4E80FCFF664F6FA8C337980251904A9135ABCC509DB15A49FE4C6D57B41BB6383B3483CA5F5CE11641F9EAA423C0C3254A508D4319DFE72168070CC8C771ED3E06CE74C93240947A8DAB87D889F9AD894F37243B25259153324E103B73C708371400EBF007BB5459EE084BE938A18D055AF7CC7AA98FBB88A156849765936E7273BC385A1BCA94A74368168CF26D8806C7901EEE2359C8694B5439F1E82C0A6892E4A68C4858A9A00B1496E177D1EFB57EB9C0AE382B56626595673230903CC19C79714364CC4B10891823535E21CBCD45C90D471E684AF1FE243E925C848565A1989637F7614C900AF1BEA9049B78E07F00950AC800EF72860E209C192A4AA0B901090987BF15A2DB6165516AD0238A40B0BB233A365BBF2BAB2F60EEB8A54771A8D8E5279E2740298563AA2868E2DF1BE582897C7A9A0547ACC2D8933ABA9CBD5D937073455489A30E8CC3659C03D37240BFF084D77F09DEE76B60952221ED2C1AA73B772CBCEA4D7A1FD64561E88BB90327B7C13C809696C0E4711CE152577517BE0A2FB3D597FA5804E0C106A4C10306AED2A804A1C9BAD4AB9E59F6126AD7C8633CDD0C2DD9D4C6F639D312ED47BE99C0E7B82BE89BC3C1EAEE6680AA4EFD394E40C2B3F30523C8117F7C26A8969 +ct = 23664DABDDC72005181DEDD4683615FEBB4936288AA5E632624426F07B51A793B5E7A469F91895314F08278C98C5D6B8A184830209A05F7D9C38BCF5F84CD7DA273D7C64615C78FCA0FE08910A506CBF7DFB28B4F9AA5C0CD4CDA71C9CACA34BF27B15CA2E603FF4CDDB14A639277C1DCAC2242B534737922863E1551307071394ACBC98AF20BEDC07163FA84B6C63B08A1380A3D4157FD2006306C95A0D488A83D9B22C3E1B492A97F4921D5099509FEA1D08AE5EB44117B1C7E9417B9A3E6FAC0D519B56380A8B5C5207F454779FD839426E0988BA8936FF50545BCF0E9DDAA818AC0EF08BD2D5A3FAB95BD157C13EF512267278C2F94512A8D5642AC6323F668F1002230DF845D6D5CB5EB02FB4C31B8EE5A820C30A53B74A87E0AB2AF7C51E0546CF5E41CC72B634ACBC96ACE5257B1C221019B4FD70CD0D958E5200927BA66B154613191A0E139CBAE734F2F78F7878373E4C4178E2E3C3E2A7A11E06BDC24D151B475611FB1DF5F39FB5D0FAD043211E16066210EBCE0F31503BF8E62431C863ACF928DA8EEF07FFB5F60E01A6DCAE1C558BC282B3090759F7239A20EC0F5A37CB48B351432CCB3344E25EDD5965422F559C6493FB8C5DFC297DF280536C37CCB41D2625F455BEFC77B71E7D84DC06DC50D32025609D0928EC8BD6B1F78F1784A72FDDB987B5999D1F289D29740ECD423193B9651BE956750D31406FC31A8BE3465F8C06B5742F66F4609E120AF2EA64F6C99895BAB22EF2F19D9F3CB6D7BC27B5550F34F6EBB51B02AFFBE626F051FDCA7C47C57123EEB2EE8865A91AAEE9BEA87F5B5BA63B86696863A9CC67F765C4C0E8DD90D59942710288F0F8C446533EB4E74D22B5F89CF1C714C139E487FB0DDFAE6D900E3B6FB7E568AB7116BB92E04754415C74BEFF6BB6C5D814FFB7A198C5771845BE3B0E2F2D397BE8083E1CB0F87A965D78768E3EDDBE3F234124CD92EF5C55F28A76357413EB2C4E26E7FEB772770733AF930B5C7251B2F0FAA388EFB08D45900738A7D1FEDAE2217914CB18FC3B0C1AEEA2B2C93C72F1811F7BFFB281EBD38020D006E286E0132C5C4875F8657C3E5B141294A69AA98AC26748DAFC3172222314F9B5B9EF0DA13BA75B7B2D8EAF62D50D7442258F6EE56E399964514290CA006095E125AB63E178DCDDE424F03BF59EAA68393FB7D6C36E1091FFE079BFC9BE2FF099722E1BD33F9FA47DC0766C76EA6FDD660DC2D6FAA41CE8B268136C6B050D449A47FA4051817831AA555CCDBDAB8853B377CAFCCCE731849F64539BDCE72785ED15C0AC3E4ED94AE3D4630D7E6AD08AB5B48C018CBD943FC968AD687C5F4117BCE83A663D622A6FFE5A47D44A409EE9D47D32BA9EF5A6453FBCD81CD92C27F9C033E32E83E1A2E7B32F4ED094A79A387F90A6F7F45AAFBEDA7FF11B35BD732BC8F3B75CD84682929D20419BA2FD2640DB63867532639DD4D1CC1042AAAE6821011446EA8E7D2B0BED9B7AAA6C17BED3955DDC566685D7E124A9A01D460DFAEFF51A32405D74ED +ss = CB0026C186440C0744C1C1C708D8FBF2B7AA1126792A7363576BCB2E64384117 + +count = 79 +seed = 7F4A56EDA151E7B097CFB8EF980440FFF707AFFBA91867C89522CED6C5FF3BD7F5F00BB49DDD615D9361A7E4EFA42851 +pk = 5226AA8EDABD5A4A5A7CF6633A394B756AB38BC652EBC1BDB728C74EC316D039AC982B118F1AAEFEC04E48448D45F72B319289691A93A20283C3CB1FEC992364CA83226332107704D3390F71E1883B46BC2F31B4242744E0847E72D5645586AD0B8C0FE48AC04A003045AC2D2101B52C7C1D494673BEA69766A5ADCB38CE3A978209471B5D7095A720A4C1971D94970884F11FA90C5C8B7009E2E1769B382004C93A2D9187B23929D941468444CDDE233DB3791656C860705B714E3AAF076921458B8DDDD61E09AC461E96A1B1E9AF19AC6984129B6C8CA9D4E39D70277B5D9A6A4B605F5E0454AC05729C2691E87A8D79353289678490A822C41C52A2F56B91A35F89918AEE8935EF2BBC48485BD747CC5C59066B7577739B669AD21A5561018F021663F5CF48E08F39881D221552C846AD789810030326C8530DBB369681C69CC00C2390FA857A37AD81623EED4262DB69929353118A0886E6C1CA3D36C65898968EB7C187B7B866F18A8BB369AEC780E0033EBF1B0DF846CD60633A461C569683598C7744FBECC54282725E337CEC503D12A87F9CF5BA6587BAF31B852BD45A871ABB81E88C8B8A56D324C87A777BEAF543BA153A222418BBC57D7E1325FC2A075608988BDC44E276AF10CA2D7E52B045514080597A0FF73732789D0F955F93BA77E8034900251416B43E291984CAD36C53C947CC954A8320C11424BE43283A6DC586A9FB39B2927867B79772DC1CAA16234233ADB5AC819F1A172DA5194EDB997F924A827A85FC7C7A8281C98F7A9CEE443F68A2AEA6001DE7C7475B46B55EE8991DCCC6527B5FA1393C9107C4D35A073CE29A7EA205A9279B62F5CE21F3AAB0838B42E6679000CC4C182504A2A4E81757B7F6A183428786F09C76C69E2D7598F1E5049CB57738DAAB6972ABF6D8BFD2AC7137493BD2B8B5F997519B2026EF38623294B91999A5419356BFE03E338194E471926FE5842E79740F416ADAE2A24F441BA4A0C08ACC175F347EE3B614664496A5E51C01A55B1D2A3E8486CEC4C3BA461970868502A0F9553D776514857BB8A872C7F736CCB432B1392E99568B51B9C9A56C441AC0CCBE785693722F90D63A0F78C8EE777236EA43DE2583D0E093EC8BCAB7C8C6DDD8254258B7A5732939D953E491A6BF310449083986B2A0F236C5B9A300DB22299146B9A0943115845F3FE98045CA844BCB1132E0BC98CB54746937B1479DADAC5A4F9320DC572BA81CB250F13869D132FA259604A76A5DD56A7543B96C3096D3046389A917DCE53CBDD9AB04A65B31C6C5CFA23A2AD53FAEA3BFF3985FDFF9CA3E3965989C072F4659EE8914DDDA0ACF30A64A1A823B78561D5A9304950EA3056F50B82915C71AE0B6883EF319D061464D8050F37C24C62C7693F204DD4B4D74B66DD7526FDBD707A3490769764ADBEA61C09A2D7F464D7E932705212D6A9151B46C2ED93A7B99C1148F679D622419A4574310AC20941B3E51591CA5D53CFF51A6ED2C081EE7B4BC23C8BA8B1AA2924406618715731B1CC404929A38911020FAC6647C24306E349F1ECB4E2F530E8F200EB9C0A315606A3E130498F96AD5865EBB4CBB55265E69316A3BC96E51745B02F4A593B796B5951F48DDD5D61BCB3F79106FB3F881087B21E528BDC627A8A1FDBB3B1FF5D83954F7 +sk = 52D431D74363BA07B7EC47C2A5B98157F616B8C7B7D3E68CE3F2A31365BF4E21747203C5EDD758000A8C09D38A83457FB7B015BDB187E842B46CB9BFAB29A917435431184219339DF7CB81018A81B283814FF8B15E3A526AC35185BB45C7A865C45AB0CA1C7C5CAC9E35F753D378556A62C8AAC92F0FF59651C1ABB789970A32C69D153B14A687FC2A56B9E0C382BA4F907A0BEF79BDDFF781776ABD042044A1C84C4C80AB9CE9A76BFA6374E9CEE06081E3661A09CC3272331936CC85D6B2319CC7873227303191C36842B61013C0A41082B82034A2E1BFC8C47916859EDA53033D5427741510E842265AE36D530A19E5D7365127BCAB5B506321ABE2B69DE823B660B4699F8859DE76899098159C211CFFE51C7198CF1025BF9EE69236C913B16AAD84AA4C381A577B6C7A3403627B323F11EBC1F304747F47407DB9A8C9E4B866082597F28B6EC272AD2140A43A52188B061650BFFAE19761BA99CA724B71191B6DC5B16450CAC50B247415370D5B207701AAEC3A13CB477983F180388050175658CCB4714ACB603B6B3AEC340DC6C164FCB81331EC194C382FED024E0D962B056627A5B05A00B5511D78BADAA489F8BB3F3C5B484F9C1450708B89828EF24B815EB43A6B8B127BFA49ACACAFC46434987BCAF5F91A926140BD56504FB4525EE1921B63733DB2986DC133078CAA44518871BA12894A553BD024FB731A0AC44AB80199394A2385BC440515877CB69B73B0C847E40ADF238847608908C20BF7E1B86FA84781371D4CB52FCF2CC30306C8D98C679D4CB41EAA0EA8B395C08CAC6DF2348474A9504592ECD34A93B3262C9751E42193719B617355C59A25679D909A5E756C8DB03E3B174E1A063EDC733B9350B4F738618648BAEAEC5B76376D05329BE6E706E632BD61292755F361096CC4565573562053B4402C42C85B5299B1CCA0B9CFEC4605D63665F24561D8C1DCFA896D1C6D8918A3E6F2A8D4224FF97503D1EBCC8D5395F0A64D1454623890BB7AC6B87B29333096535118CD243C52E49CBC0945385E38781B9BCB6B220A66D96D426B9A1F4C4C4D0349CE2BC790732247EC5D98E43BCD37CD94B652BFCA7B988B063BB102EA0772DF0AAEC74C228261B4FA7A49F3B329F2C7C6D04C859C9816D5BA2AABB85E52DCAE066B9AF4D9951766041CC783DC672DDE42558F50473BB43BC1F93BC6EA7D33F46AC4999CD33698EEA603C7DA265AD713E48691C8B048B21134C9998DA19060CFB6AE31CB5A3B7387F2257FE94BB3EA4C963D01849FB021741395F1862085F031B6B05A7834551A6C8F0EF91397A29E12DB6D776B05C7F12C8B260CF128C02E48A9F403A487AC3A6C0888C5299414AAB1D7283252F62F465867A851BE9A82C9A79A25CFA727C632727C765D4C496D466942147A8A7B65AEC4BA84E4E2745671BCB207654B087A26F93AC77C82CF34A7C2F86FE8F48FF9A0B663D79BBA6B2B8908B32FC145E4F65C6A8A379A99C9E68A10C278130A1969E0CB708D0CA6FF1669D8756D1D530ADE051ABA3A07903B5D801456315057187758351588BED222785C9FE83A0FB4C59245CC2A72B309767348EEDB7C2097B457BBAC8AA96A67D785803744E149B3F131A85226AA8EDABD5A4A5A7CF6633A394B756AB38BC652EBC1BDB728C74EC316D039AC982B118F1AAEFEC04E48448D45F72B319289691A93A20283C3CB1FEC992364CA83226332107704D3390F71E1883B46BC2F31B4242744E0847E72D5645586AD0B8C0FE48AC04A003045AC2D2101B52C7C1D494673BEA69766A5ADCB38CE3A978209471B5D7095A720A4C1971D94970884F11FA90C5C8B7009E2E1769B382004C93A2D9187B23929D941468444CDDE233DB3791656C860705B714E3AAF076921458B8DDDD61E09AC461E96A1B1E9AF19AC6984129B6C8CA9D4E39D70277B5D9A6A4B605F5E0454AC05729C2691E87A8D79353289678490A822C41C52A2F56B91A35F89918AEE8935EF2BBC48485BD747CC5C59066B7577739B669AD21A5561018F021663F5CF48E08F39881D221552C846AD789810030326C8530DBB369681C69CC00C2390FA857A37AD81623EED4262DB69929353118A0886E6C1CA3D36C65898968EB7C187B7B866F18A8BB369AEC780E0033EBF1B0DF846CD60633A461C569683598C7744FBECC54282725E337CEC503D12A87F9CF5BA6587BAF31B852BD45A871ABB81E88C8B8A56D324C87A777BEAF543BA153A222418BBC57D7E1325FC2A075608988BDC44E276AF10CA2D7E52B045514080597A0FF73732789D0F955F93BA77E8034900251416B43E291984CAD36C53C947CC954A8320C11424BE43283A6DC586A9FB39B2927867B79772DC1CAA16234233ADB5AC819F1A172DA5194EDB997F924A827A85FC7C7A8281C98F7A9CEE443F68A2AEA6001DE7C7475B46B55EE8991DCCC6527B5FA1393C9107C4D35A073CE29A7EA205A9279B62F5CE21F3AAB0838B42E6679000CC4C182504A2A4E81757B7F6A183428786F09C76C69E2D7598F1E5049CB57738DAAB6972ABF6D8BFD2AC7137493BD2B8B5F997519B2026EF38623294B91999A5419356BFE03E338194E471926FE5842E79740F416ADAE2A24F441BA4A0C08ACC175F347EE3B614664496A5E51C01A55B1D2A3E8486CEC4C3BA461970868502A0F9553D776514857BB8A872C7F736CCB432B1392E99568B51B9C9A56C441AC0CCBE785693722F90D63A0F78C8EE777236EA43DE2583D0E093EC8BCAB7C8C6DDD8254258B7A5732939D953E491A6BF310449083986B2A0F236C5B9A300DB22299146B9A0943115845F3FE98045CA844BCB1132E0BC98CB54746937B1479DADAC5A4F9320DC572BA81CB250F13869D132FA259604A76A5DD56A7543B96C3096D3046389A917DCE53CBDD9AB04A65B31C6C5CFA23A2AD53FAEA3BFF3985FDFF9CA3E3965989C072F4659EE8914DDDA0ACF30A64A1A823B78561D5A9304950EA3056F50B82915C71AE0B6883EF319D061464D8050F37C24C62C7693F204DD4B4D74B66DD7526FDBD707A3490769764ADBEA61C09A2D7F464D7E932705212D6A9151B46C2ED93A7B99C1148F679D622419A4574310AC20941B3E51591CA5D53CFF51A6ED2C081EE7B4BC23C8BA8B1AA2924406618715731B1CC404929A38911020FAC6647C24306E349F1ECB4E2F530E8F200EB9C0A315606A3E130498F96AD5865EBB4CBB55265E69316A3BC96E51745B02F4A593B796B5951F48DDD5D61BCB3F79106FB3F881087B21E528BDC627A8A1FDBB3B1FF5D83954F79BB3963CC1C5CF2B2D1C6CA76226328AB765A79999CCC71FE98D5BF3B34F51B19C35D165453E5FCDC6F9DF64526D9DE698F2BD3E6BAC6C7FDD86601B9BA5F4A5 +ct = A7D918C3251367B43A2CAF232D30CC44BC8313689F61C174CD6055E0939DAFAB9EE9C4CC5C451F6836D2D9FE0B6F1B737BA4B6020737487095AECC3C972201925C7A3E4C6BADDDA7441B89B2A35F8D2E4878D316E5B92E5B6F28EAB2E2D1A98843853324D35A023741F11C426442FB3A8D50A0F9BF5209059AC1E47BBFA11724F49488111C551F11DE6BA8C28E576758F2C30B219AE6BC3C79D73E5DA64F03E0ACEF5BBAEDB7DB863B7E8255F76E5C7FF26E42DF8F82A5435F5BBF861283710FA7DE3AFAE930013F1B6B7DDAA122121C83E0DF00F231020324312B077CA26E4E9C2BD815F93824CA59FA9F4E3AAD70E4D55A853187A4E3CA642710EA0109C00750820AAAFD98BE4A25BB7E1D18164F9A4D439F3FF7169696A108F7274E2D50F269F93967DC2371BE9AAC3716DBC499C9CF6639D02EE86438E2DA002CFF11D70C5F025E4A9A446D0FA9314C1E6B445AEC37771E579182D494FB5C448354B1ABE91FEBF5512C11CA7D2DBD0DCFDC37C91F67613C64B76836A5D91F57FC3678B12707D8451277F776EFF18EF083A00FD39332DDED503819BF343A5ED505059D15BF011766BC392188E8483E64B1438A1B2C270DBB1ED0521212B0BEAA0545FA703CE2FE495113FAE988C7F23282F536EFA269B81A75921A56888BAED7F23FA82195A78225AE72534D28650394AD9681278BCEAAD1A8A1C1E6AA0D51EA85717BA3CF304C67269E0562E90E8281D5C96645B8DDA08D3508DA723554B1CFB0E0B96C3367B49AB0D74793A772E6468B79AF1EB6FF720521361A2D2D70ACEEAADBE408A0CB8349F5083E899B6FE37E381D28B5CBA394BB9B7D943DF0167E1CFA7B263E942BE68F1BE1050AC3B51D5772C5EC02E7BF5A4D585B6031EEE47C35CAFB5D74DB20D643E39F382B8E69054F397CA6FDF47384328FBDAD37BCB29AFF15F2ECA75E7F9D8E8F5C24026EF6E4695345E07AEAB117B347B322B44F150E1B66286E24A31C5714E3D4191283D0AC8D8DB9DE4454710439758381D7C1392219168B8302CECE11F26D6B04A77F8A5DA32B22909498E154486AA5B4425700E1D08EE9DDB319217F7A9E5932C5BFC021EDD7E46FCD67638248C79A6C6C130EED0E8E634F332CD5ECB25FA65CE4B6FEE1CE618CCA6DF05EB9187D0B3D0B200B454753D7B16C7606470760B9CABEB4C3F13D4CBC63A96D2B97A403CE1E85075A7BEADB8C34E94508E87736B563848C1AE9CD34DA56D06DEA69811ADDA02507FFD9C3F10F6850BBE5585A507FCF0F79BE02B677EFD4FF3E4945EC800C6AAD1ECC53B9EA6A2C35B74FF196EE7A25938E267FDB83ECD8E5691E5644905FEC3FFBE86676DC30411C12EA05BFEEE31FCD4A804EC59D73BB15C931D031E8DBD36AFE294985AB20D87E8E338733EC6A6B7B4BFA1E0AD6A9905EBC7D4B5B23CF36C5B589A04357F792BA8D3B9F3270F3EE491DC0683E16DED773A9A6595D43FCF9EFE8C0917A71637C4A03598EEAB0CBF1F0DB3E33B1DA48987C00D85B207B7E960E866469CF67A05BCA16 +ss = F855334CDE90E9E858863DBAED7BF4C45BF189861750EAA59355A3648B1CA1CB + +count = 80 +seed = 09FC004519BCF85B20D25D314A0DFC79E00CB6262A7DDDF9C52473641AFB8CFA0F5DD5F53558184CAAE9EC34B459E98E +pk = 724ABFCD15255F0A5EFB7783D909031ED02C52A203DE570873C7A7C556202D53A6C086899802BDC877BC6A813AB59B781BB95F4FCA9EE76028AECB9142A992DD7180BC1C15DBEBB66765C5ABBCC5EBF764D5234D89A378D5925FBAF63A00E35D568804B973450A045E55C7C5F4907FEE390FE6877963E386BC20CBE929C3D247611E346EAE401ACB972843DC204EEABB043644EEA29BA2C1A160B98F0D28CAF0677AB2ABA362B7BFADACA4E1197F54F03AC8033814A71E1CF407972B3F1D9A986637A972B46D3AC46509C053EFBCB9A475BC4055265961C79E1374C2159BD2409A84F22755A1B32E4B604783BCB2AC49A27A5B0B07AE346AC38F54A2943559F02270BBB19508E903888ACA4BAB72E332285837B9EBB466E5CBA74D5AB6BB3B2A0FA26209A97F959C905BB4B058BA8ABF30A5A6C190A018A9803AC29D84BA710B30DA9A0844CC1A1478C289C32737144812355E0D7589B9AB765CA3B23353A350876F05081F3E4B14D8F66C998B81F458A394CC68C3B7BFD37366EC93113DB928E5F9BF0E9AAAEAFC619E332A7EF3898A66020DFC64F671879691C023409B53686770F8148A2B6F7B62B6AA42981EA0CEA7753599585034B9AD99C9AC8B12872B1A47A088BD8AFCA2D42093928A4FB770198C4CC50B0214C4C94FC7B62B5E636423C6ADB553B138591F6372CA6D53343FF7C70782A2DDC4801B262F220A539181C13F3C3E8E0A0D7191A43A54AB008D326DF803FD8757F88AC9BDC8BC75CB83517AC71FF8613B3BA713377FDAD2199BFA332B8C22C136350ADB9553E3643D0C45413782F3BC9E941965DC051DF98738CF50113AB422E4A22759CA016BEA6FCBA390ED64540112842F5B1373A2847107A43403B4AA5CCAE154B9C54831E3911239B79F1FE997BAE30A542560FE6647A2E7C4916097FD484C3D040456EA2BF8B63DBCDCC8577B7AED99C05FA28D468272876B614045095E918600F7C94BB0944F62235C169B58789AE8BC3E6F677CA8D238602399E307553E235D11836BE120B3BAC41B0A668E0841AB11F49E27AABDFC27AFCAABBF542911B6A220CDD626D819C44C72556A3946DF86C43D1B8693944D399A3B5B1309B9780E34330CA387CDE8E4C9B2D0775A962F447828D6295873CC1629777FD93C062098B6149A3E7C383E2C33CC3FE7730537416FC1ADB6C09F4CAA736E4C796D2A97FA3807C9EAB72993B4B876136B856C7BC75AD054288EF491EFFA872247A99AA39A9C2B7602027D65A169317CAFCBB77C37D89ED32489E3C2557998A06689B06AB96615BB5752D439DA446354CB0640686AA794444A806C31D721B8C6B820810A5AFC00932A885107B5F968B5C8EC98207293D8851892A01DFAE4A99832326E3863BCDA75190C4A487B46E3914B702017B1B520CCC30A5C475FB2DA94EA217F76556BFEE825076533973BAD3AC7305B5C764CD040D723617090AF4A7811E9AB206C6A331A647D9385A5E7D8BAD6C89B390B617018C4A0691D262429BBA173598B37D7C245452853506437E756A399670AD8E292B0D820E3567047C82870E82236389D99D678CD9B49526AAC30D1B830B12F4E62407A59C8F88B7B5D088A2D08B9F114C3F158650F32C682EA6A76CB62D3AD7357CC617D597A3DBBDF515F6852D71220768859D599BBAA +sk = 28BA2F24DB8E2A5B21092964F1871E97E10F2727C8B27916A5068EDD27670D26B91A93332157AC686205E23616EB0271B081B51923C5996743CC114F3AD310CD6791AEB05F77960991513EC655533921A8D14CB2589399EBF18F7BA89BB7D6CD2D7336ECE1B7B63B98F26A49D356578CE7275EE67677D1482E1BB3D85B88325BAE0A00CFD1288C34078D73965442B7B140705F0FB76EE3D0921112C400C7A4D1337D6A3A8CDFF9AF05C64C079C64DD143F1FD56C28096313E82D51836A2DC1B0F37A2E00545F802B417A9406E55420B4D71FBC2210D05A771CDC164AD50932EA40A876051828236153B4E1715EDB1453045721E89A60ACD0066227704B8AB991E8A06812226BC59943C0814C847A1865C19DF4B7FA13BA3EF95543E724EF854CCB28BC1DB49B75C1ACA3649F848BC6F32C139AA79197543C628238ADB755F4DA6BD67130772B4790B28C9F1544A4E9860E875E68C1CDD9CC0CF17451434C7C53F3A9BE39849720B1B80A836BA4C531D49BAD16077E90203C9120C23239CEA972454B08A5F10812443CA75B913DF98DBE29C3312157E156311F67354D414AA041833F8454ACA5B3898B3572E819FB2C4CADA43C9C5191D6F7AED8F310CF77CCAF0C478686952E71A8A8173D0C223B04462B96C04EA7B218A13519B90CBE3BE8C32B276F90D349ACBB6362706DCD54AAD0497A058AB0138A8E57D514D5D431043184BD1A07B77C3299BA6C7205938ECA8403F31A1C605A942B73775A1AC11C40D81988E69C15079719AA769B5F618052D5290D84714CA57418366C15B74DA4E98DF96ABDD19884EC1703F7978C4DD72B48528789D7148F16C23EF8BCD1F353CC4A76E7C238AEB1035424300F529ACD46926874190556133021A6A9283DDFE02EDADB7DE23A4D141B0787539B68110B4882A51F95403865BECEA06E2D7A1C1F534FA3366BC1AB387EB867477B92F00C0D09615BFCC1138137CEDE4098AD57894FF74982D71BA2ECA6A0F502CDC9C89BC6A44BD84FD8B62BB5D84332FAA830E2A732259945028D2830A8AA866F92C24E46D164C4F4658791C11F0703D906A82546C75F81285C24597BBA4B1BE3972F069D6B383D61CC32B9B66604B7CDC4BB39058C74CE770F04F758E6124543E13D2365A915802F75E90997B10B15E650AEE33A291C87030517B6C29CF10670D2DC5C8889AAB7518B4DC86D86E25C52ACC4DB175A5957118F983C3A4443B33803A3161AB24004B7A789778C8414A8AA8C819468EBC28B68AFE5333F7E666D44B5A961533280B0021BD3B24E2AA51BA58F2F45767A5722E918B1204656A2B44CE628A3A84125F918999A6311CB3569431C7B0D6B58ADAB6A30F9473B3747E33C7A2A9BAF87B709353A77743949277147928273F112B5E618167A5715157B49CED69A2492203A08730ED07B7AA14BAD136CFA969DFA68C28AF40B9763872ED1B05D4161489BCE1F473D4CC067A86258F6B664D2436D4856166CC60467887F9B97439F607D336114E46B2A2964C228A18EB532CC4C6813DFB841E60C3BAA59978234A06FC95AAAEABEC0123230AC33BDC48A4452403842BD6158C668F28F20BB5501984C5D3992594A9238E03798D178702B86973350724ABFCD15255F0A5EFB7783D909031ED02C52A203DE570873C7A7C556202D53A6C086899802BDC877BC6A813AB59B781BB95F4FCA9EE76028AECB9142A992DD7180BC1C15DBEBB66765C5ABBCC5EBF764D5234D89A378D5925FBAF63A00E35D568804B973450A045E55C7C5F4907FEE390FE6877963E386BC20CBE929C3D247611E346EAE401ACB972843DC204EEABB043644EEA29BA2C1A160B98F0D28CAF0677AB2ABA362B7BFADACA4E1197F54F03AC8033814A71E1CF407972B3F1D9A986637A972B46D3AC46509C053EFBCB9A475BC4055265961C79E1374C2159BD2409A84F22755A1B32E4B604783BCB2AC49A27A5B0B07AE346AC38F54A2943559F02270BBB19508E903888ACA4BAB72E332285837B9EBB466E5CBA74D5AB6BB3B2A0FA26209A97F959C905BB4B058BA8ABF30A5A6C190A018A9803AC29D84BA710B30DA9A0844CC1A1478C289C32737144812355E0D7589B9AB765CA3B23353A350876F05081F3E4B14D8F66C998B81F458A394CC68C3B7BFD37366EC93113DB928E5F9BF0E9AAAEAFC619E332A7EF3898A66020DFC64F671879691C023409B53686770F8148A2B6F7B62B6AA42981EA0CEA7753599585034B9AD99C9AC8B12872B1A47A088BD8AFCA2D42093928A4FB770198C4CC50B0214C4C94FC7B62B5E636423C6ADB553B138591F6372CA6D53343FF7C70782A2DDC4801B262F220A539181C13F3C3E8E0A0D7191A43A54AB008D326DF803FD8757F88AC9BDC8BC75CB83517AC71FF8613B3BA713377FDAD2199BFA332B8C22C136350ADB9553E3643D0C45413782F3BC9E941965DC051DF98738CF50113AB422E4A22759CA016BEA6FCBA390ED64540112842F5B1373A2847107A43403B4AA5CCAE154B9C54831E3911239B79F1FE997BAE30A542560FE6647A2E7C4916097FD484C3D040456EA2BF8B63DBCDCC8577B7AED99C05FA28D468272876B614045095E918600F7C94BB0944F62235C169B58789AE8BC3E6F677CA8D238602399E307553E235D11836BE120B3BAC41B0A668E0841AB11F49E27AABDFC27AFCAABBF542911B6A220CDD626D819C44C72556A3946DF86C43D1B8693944D399A3B5B1309B9780E34330CA387CDE8E4C9B2D0775A962F447828D6295873CC1629777FD93C062098B6149A3E7C383E2C33CC3FE7730537416FC1ADB6C09F4CAA736E4C796D2A97FA3807C9EAB72993B4B876136B856C7BC75AD054288EF491EFFA872247A99AA39A9C2B7602027D65A169317CAFCBB77C37D89ED32489E3C2557998A06689B06AB96615BB5752D439DA446354CB0640686AA794444A806C31D721B8C6B820810A5AFC00932A885107B5F968B5C8EC98207293D8851892A01DFAE4A99832326E3863BCDA75190C4A487B46E3914B702017B1B520CCC30A5C475FB2DA94EA217F76556BFEE825076533973BAD3AC7305B5C764CD040D723617090AF4A7811E9AB206C6A331A647D9385A5E7D8BAD6C89B390B617018C4A0691D262429BBA173598B37D7C245452853506437E756A399670AD8E292B0D820E3567047C82870E82236389D99D678CD9B49526AAC30D1B830B12F4E62407A59C8F88B7B5D088A2D08B9F114C3F158650F32C682EA6A76CB62D3AD7357CC617D597A3DBBDF515F6852D71220768859D599BBAA6D029BB2121C788B5B6EAD7226DF664490DAE362C4BEFB615717D81C656B32735FE6141A25F7AB9F875F79E0A82D6EA5CDE5A017AB637D5FDB7C42646A1D71DF +ct = 72A78ED97EC6F0DAFF51A9BAE85D1873B68DCFAA8EB163FBA6FB07A90DFDE6AAC88F65FB4BC7E7EFE6EE951364905859A26AEA558ADDA81619A3D073190F9DF2D0B68016BFC247BD2C3A1CEEC29912EF21B27EB77C7D5FC0CD9B774B75E3E2C584D8116FD0417BFAE6D2E4DE494841E45A217C2A10ED1BD3F158589DAC32DEDE68EBFC3707C473ACA1C9D44B1EAE40339106531779EA144367C767729D4991E7FB0BF3173E3DE8937FD489D09EA263AEE0DA2561E43BE35FCCC2D58EB25DC424E528B9C5575C5E1C53D0581BCF9D5148013A8CFBB5F4C2683AC792F2BE1D4DA00B136262300D51497CA16A2E6CBCDCA91A006F3CE6231D31AD90ADFCC92CF09420A789FCCE4F6254A6BBF1385CA5985C9DC9D8CD57F98EBB445DE0BAFCDD98B8B3FEC85743D9BC78E2CA193B3774E3C5DCA74EA7A8AA51A468AB4587F6C97596F7E66121BB61EAE71A9965BCBBC415D52C826016E84B204199FF893AA7A9212785E456B86775EAE7479B9E109959E4BB26F4E1ECA3181E9FF9E26708616316D5CAFD25F6169CC291B65F555590942871F3E4B62D4A41D9D9C75E8B215006A4371D8AE773333043FA33C0F293119B94E9D0E5E43EE298B7998FD6CDD1A9752BBB3DC19933A3BB232C37D4E5BFC279FA1405B7030D3C3AC2D47C999EF5FD2948DFF6A21855398D0186175923FB9C0A5D9018C74693C6123C52268A28A5B42550B965BC9DA6B3DB2F86613DAE9565646A4CB39A3D3F47C1583CBCA427F7F0B53FC60B31D474C810FDD85C8996189BE93FA1DC6935AC3A9BA2E62CC45C32F74D7C0490EB6E1AAA4F821ACCC848003D83C3B715D43ADB0C7D1D9B7FE54BDDD6A34FDB5A99158C8EE4AB3B9D1B4D4DB6F1518477E3931A56C014E3981AE2B406FD12CB1C6F275CFA4B3AF67457BD10D70D681C00ECB97D5D99EFAC58213FE364E2CB532C198F51A8B5773297CEC7CAC4342189FBDA4C2902A8687E8DFBC0DB4984FDBB9ACC6CF1E7C93B2AD02E7D346D22F3D36187A398F2D28BEBB8AAF98347130835EC07AE255B8BC6D4E50271C6C9CFE29D099DB6C8547A6526B5AA8F30B1E655F82E85ED78DF36215E2FCC5E127BD3670ABA5A368A4D16B8020634590DD1C6FAF3AC0DCBB74B006195F24F503F3EF13B5AE09B0730F9C140AF4B3481A0F50C3C65B90CADB05DFA01EF6494D8FC06A3D2A30B15D4324118CDC330AE4581B2DFFE0D8E7570B5082A9DF811B492F4F9F5C607990056B8CC03F74203F9BCC38E5BA90734142E7DACF63D2EBB1AA4F4A4EA4E29B0849054B57D8AF63F028AC835C50735808039EB602545BC1494592F30BFFB0C1ECE40726F335FBD052FA5CB6CD3FCACBA194850A05BD81C7838624AC8350E64AC910AC805DFE584A680CF9E43D6DF0F654540913DAA58CB0D14C208117E198271DB03E978436C193688B8809DEC85E7E4BEF4F2BEB731AB4220738477764DBFA8DBEE0B1A969BCF0D0BB1468DCF14C20C25D4A02746D0932554FD8501967F2DECE5FD18925C30C0B81AB2EACE088819 +ss = 3030433313514EA95B5D6A2FDFB64D4225FC84EB70336323507AED63C5755481 + +count = 81 +seed = E3C41CCA6F04CFE7732FD54DE30CC5CAAC93E2F80E76AED7D24A962A3969C1B6A311459A3EC3E510E3E9B1E4291D4D7D +pk = 30E92DBF312758B73BEB83625DF3B8D5C47A7A334D4E140915CA1401D461D7052E9FF05F73A1598DC9622C324C1C8B5DE9B0386EA3CD95B86D80085588AC69AE310BE6B5B5379202F4F14878FBB5508907B99490E4191B1E13A6890A9209F0A12910A3E096747EBA94A337AF9E609DA4E8A9F8003633EC099983B8E778CA3D72BCA1C19B4FB4A0FAA4459EA06782367580B7AA49AB74B60C4CEF7AB3BB9BA081227A7E1AC2F5400F8F7395F96567403B2401A2ABB0B70E92E6CA2102C597F496CC8881D7B688861C7988363112155B5B88271072A7A7D68B76036059CA5E402532CE8763C52CA237A334832832F2A49BE3907D15852FCED4675547796D3046535390D44580C24BCC3D67A50CFA2AD8936D46121A7F60179BE7AAD0746E8A2C8CAE124D27181A374493DA6A68D47387A44460B39A45B2619F1D29B08BA4495230470B87BB926279EB760B9041632317C4D7A19E7753458DAC07EB73331D808CE318555E1A2828DA2F1D101CDC9B8363990B85064F63226C36C71061444E17A28C3B56332BAB4BEC2602F5C31394C870DD21030997564DE52602C2628C41CB7AC2388EF35371F870A21675AC522660268A1802A2E4CA4C7152A9776410910175FD08C5E0307F4C2A61C877ABBD2185CE58738FDA15335ABA2C77A804F94077A777FB49854C7A78462263E435A1D7B4A5205AB879438A91EB60397704CD937E66C7310625A6276182D86894EF9750F1817D85709BC578092D3B65F5C84514361264909DC2147AE6F3A577097E64BBB2C679C845D827B1AC393497575E385BB39563E125C3A3925A21160201897072F03F45D6BA85DB7EB1D5B8EC7111DD785EBDE07056653507E967385945389493B95C0A95827583F01DCD473FD3138887D3472E18B24C1B7E2C837668FC6917175471F3CAA1323A34432B72C7B68F658868A2AE87306109B1053ED2BCEDCB7037AB72D8C2BF48D29A0822575CC91CA1E5698286C9B19A7471A5B652F6A900659DF9183C76417F0FC89D743AA635791D588CAE6F650F3D314D65A6AE81A935F38B964F290BE7A1A75F256776F17383F9BB9F9203415622B60B2A152A7CE3420CB49C3592AB8AAEC009A237A12C2C04ABAA08A382622DC84A053C94881664A97381AB88CA41846E82C02E00C6033B4721DB29B71FD29069297A2CC387F2AA5336816C66E75B594BCD144171C3F7AC6DF8A9A10A71F35B39A3DA7D53571CB33860315288C2F7843E855D27DB6F27B38940F973B2B063EBA12B3A8B73D46C6781AC87F44C91E982CB27E534161212B367AB74A318B0F41E7A060823F17814F9A6E4F5A9093A6379FB0291D99916B15ABC596550F152BC79703F1B0393B720CB85A510D4C9557ACF3E620CF994C0BF8C06C2606041E7C3CE6044879A7612C3A2FA587B1B7676B956291A7BA5A78527A163AE08696C7C881076189BC1623C8D360C8D85C287A9C0C6965D0FA315E2037EED604084416FE31B2F01C7678311ADA765ACD7F70DE59A9A85A8249205C78CAC786AAC9A0A0A7352B18F9CF936165A9C39D99AAC7C175A5025F1C66D04354480175FC3249930E66C9D06AA50E7ADFEFAB6AA9C205C1507A8F40512A45CEBFB2B39F3330A962ED717408E0934FDE42A5E1CBF04C80F37D7DFC7EB53A785194C4A1232E61C37A5 +sk = 2F766AD78A0112B8CD4BF28DD0F589873553BF114F19C2719F61A32CBC85C71975B911237BC6AA6ACB32B613CAC9DC80C85493FAF63C3E337C274542AB4729D02ABC5DC07309032C7112540522575D663C89714AA7A456410144D7C2BC1041C03D5A56E08CC7E5663C01F52E5077288BB8CBFBA21B4A8A19C055691E05C22F94C62C3CC2B6A9C155E2A4EB2BB9D95B8C9D5A6394D05AF87B038C210D9FAA266CF07088B3CC7AB56FF3366FBD595B3C790B5497B34B94A72D8153FA13B40BE96B51315CA4D22BE3828C3556843545C47B0254266A802A44BEE6E5A19A446472322C6AAA4CF47218EE3C99247564C552C93ED589EA8BB2C637BCF7277D5B5058DD80342815B2E8864B4C330920A82EC76B4A7BB893E0D18278F47F84743223A67F2983AC8C4A1845A61259670B02D6053CA181BA4C1BCCA05B7AF2A27C59C1E4E38DA723B787AA2F36C71E3BE05039183BFFEA6AB3BC779DE2273326B327D42517B6C6ED8C7F96C6330D4C39E3D2A7B81A538693329ABBBB5947B068C3CF7B45C173C1BA9964C86ED91D0BF64E209C1910C218434311A50A2128D52754148159891E00475654AB30B9693AD507B2E19ACB7FE6B14F27C09C6B2570B861926683A285014631C2D7CB8C0C10A25D073D3C067AB819B9DC27971825AE21CC2E50D377E3396F0266A5BA598BBE9A868B0B6CAD2CA3A8CB503778967BB930D90795719B237238C1F831007C690186949C600C6F587AC0D81C8334C57FE0C59DB3E2815D63C26C620FDD75836261644D99327A334EA5A40571F0CDA39CA716D2BB894A50BC4CC84D6621B60509DAC77ECAA39B9779A3696749CE83933EB70C1E85BB2DC3421AE9A0EF40AC2D83A1FAC16C6DCCB0AA16AFF9A94BB6D125665C3001B845E7F20E7C90A3DB636950B0836BA008DA33500FE47FD4A81DF0E268C62974BAD02A6D3B2267F917E2046DF3C1883187683F030A28A129902083CE26730438B0DC0042998C9472F5A7FDBA371D74481DBCB9BC4CB281E7CC1DC4455823AE1AB8B233E83324544913DC261B6274464B656BCB645F87B0CF4512AF443959E67C47D679020C2905D45E21DA586EE8291085A8A432AC6AFAAC594081EC298DC13175779B8635FC8EAE58982258759999A57B704A5B040245D282A9B6C9CBCA838399523F26695F60389AD42F6512783AE65A0C25B7258674398839AF28866671329109A58E579C026549F0B7041DBB6623665FBC9A2EDE41C0436635325912366AB1364B5A3162C4B8C2A14480AA6BF165588B8D26EA968291CABF66A4E26722F87977DAB7807A2C65A26A9CBD339BAC0B24E6B46E0A8082BE95BB7A41B1B8B670ED3105EAF994A06A6414E9ABE2A1B608C29C94B846012A0FCBD6959ED411D8D0C70A32559C68C74D94B2A9707B9D9755E3C69AC40782E97A1F904A32DA824C7459B59B174A9FBB6B41947F47B3361D5558D831B2B444818FFA4C17F4BFCF8B9C7CE451F4CA99884C13F85C24D3CC4740D2567A54AB0583A175759FD7E197F3000A39717BFD9C768248518D50791CD84DBA795E85388DCA21507BC669FF0B906BF515F38C04DC838D0D1357377B1601887AE1B0A0C4490D38A871910C695C50008E5A5A30E92DBF312758B73BEB83625DF3B8D5C47A7A334D4E140915CA1401D461D7052E9FF05F73A1598DC9622C324C1C8B5DE9B0386EA3CD95B86D80085588AC69AE310BE6B5B5379202F4F14878FBB5508907B99490E4191B1E13A6890A9209F0A12910A3E096747EBA94A337AF9E609DA4E8A9F8003633EC099983B8E778CA3D72BCA1C19B4FB4A0FAA4459EA06782367580B7AA49AB74B60C4CEF7AB3BB9BA081227A7E1AC2F5400F8F7395F96567403B2401A2ABB0B70E92E6CA2102C597F496CC8881D7B688861C7988363112155B5B88271072A7A7D68B76036059CA5E402532CE8763C52CA237A334832832F2A49BE3907D15852FCED4675547796D3046535390D44580C24BCC3D67A50CFA2AD8936D46121A7F60179BE7AAD0746E8A2C8CAE124D27181A374493DA6A68D47387A44460B39A45B2619F1D29B08BA4495230470B87BB926279EB760B9041632317C4D7A19E7753458DAC07EB73331D808CE318555E1A2828DA2F1D101CDC9B8363990B85064F63226C36C71061444E17A28C3B56332BAB4BEC2602F5C31394C870DD21030997564DE52602C2628C41CB7AC2388EF35371F870A21675AC522660268A1802A2E4CA4C7152A9776410910175FD08C5E0307F4C2A61C877ABBD2185CE58738FDA15335ABA2C77A804F94077A777FB49854C7A78462263E435A1D7B4A5205AB879438A91EB60397704CD937E66C7310625A6276182D86894EF9750F1817D85709BC578092D3B65F5C84514361264909DC2147AE6F3A577097E64BBB2C679C845D827B1AC393497575E385BB39563E125C3A3925A21160201897072F03F45D6BA85DB7EB1D5B8EC7111DD785EBDE07056653507E967385945389493B95C0A95827583F01DCD473FD3138887D3472E18B24C1B7E2C837668FC6917175471F3CAA1323A34432B72C7B68F658868A2AE87306109B1053ED2BCEDCB7037AB72D8C2BF48D29A0822575CC91CA1E5698286C9B19A7471A5B652F6A900659DF9183C76417F0FC89D743AA635791D588CAE6F650F3D314D65A6AE81A935F38B964F290BE7A1A75F256776F17383F9BB9F9203415622B60B2A152A7CE3420CB49C3592AB8AAEC009A237A12C2C04ABAA08A382622DC84A053C94881664A97381AB88CA41846E82C02E00C6033B4721DB29B71FD29069297A2CC387F2AA5336816C66E75B594BCD144171C3F7AC6DF8A9A10A71F35B39A3DA7D53571CB33860315288C2F7843E855D27DB6F27B38940F973B2B063EBA12B3A8B73D46C6781AC87F44C91E982CB27E534161212B367AB74A318B0F41E7A060823F17814F9A6E4F5A9093A6379FB0291D99916B15ABC596550F152BC79703F1B0393B720CB85A510D4C9557ACF3E620CF994C0BF8C06C2606041E7C3CE6044879A7612C3A2FA587B1B7676B956291A7BA5A78527A163AE08696C7C881076189BC1623C8D360C8D85C287A9C0C6965D0FA315E2037EED604084416FE31B2F01C7678311ADA765ACD7F70DE59A9A85A8249205C78CAC786AAC9A0A0A7352B18F9CF936165A9C39D99AAC7C175A5025F1C66D04354480175FC3249930E66C9D06AA50E7ADFEFAB6AA9C205C1507A8F40512A45CEBFB2B39F3330A962ED717408E0934FDE42A5E1CBF04C80F37D7DFC7EB53A785194C4A1232E61C37A564C819D9BF66855F6AE70627F04DA8378547E5867E2EB9759FE0971EFD601C4A11EAFECA9E810796C34E8CFCE9D59342884456007B01DDD12EDCE6D10ED87E4C +ct = 98322D7A13921EF76042F6DF285A8BD2D0618D843820CD3FC35706C97D92720BAECED43615976F33A50EB4F4871B2CAF187088AC58BF63793322CCBE9A510CFF90786A7C3F28CEC3BA32C2D90D280A6411BEDC9046AE4A13A59FBC3FE2330C34D78C6743009EFDC3554392C4139CBB5855659A8A4C814F89BEA551FD3E8C219DACA38F46F8C6FF101E07A31F0A07B8BE8EE2656C189B30C9C6BC69DB6B6F14799A239B0D8677E2A76F31E081182BFC44371F8592B1A4A8A01DC524BEBCDD43F8E48A77550628253B5B78688E6C73CE990E967C6D67383EA3E66B9D8349FCE9EEC43DC2C2301A4AF7A9BEB52AA99DF13C8F578210647E8935871546416B46BF2ADE02A6AAE8B36DD9F0722DDBB5A06FE93E496427EDE60CCB84CD6B29539AD2D7F608D825D6B10AF253852912E2C959EBA801E3D895CEB04319D3791C31855E40D112B93B5444DA843439805F9C154BC0436859A4009354D0497334739EFF86318AD7ADCB4F64B4E67775D8294F92B8501A88FDB13462D82A568CE39FCEF1598A56E3E0188FE62AC5E456F6D87D37CE482D59509CDBE28D909D452A5D7E2A8D8CF90043E23C330026811BABBD9CACFE298C77B487A9814356133CBFBC0C1BCC9FA503012AD5536432313B3A88596D44D16E2B7339B50456EBDCA6345D95FF6E36CCA50B0036A79A86C8500B532AD3159444455DE6EBE469820EC9B9FD8C956134E99A85D4BB83B02F1AD116DE1249750391D9D9B860F9B75817BB09C688FA9BECAF9A5776A8CB6EE94A4540EC7B9B790A7E787B746BA8343CCDD9C73AC6B2F19CE9A2106EE0E2FBC2399DE6B4250B963E6BF5FCB0FB58F4F182A4375077848C09A1F358B2CCAFA3BD7784DF29B099171E74DCE17558934198C0FD3FA998245AB3BCD782B32B810953C845685408AF76D6C6CC252DF2A339247A5C97409B7E59E652C3C70B4D7B10BC4AD9D1DC5B5572ABC7DF75B0D335ED85C98AA6EC2B9A1EB49533B258BD1BB353339D3BCF303232CA1742F7B3BC69C959CF9A540BF7A5B08564D997F467EF6FBB69747B56C4BC07E7E3D6B4738AF1BACA39417DE8C34D72798336D2934162B6EBFA6BF46EBA85B1CD94BF04CC7B5E36A1EF66A9BF687477114295F8EA84C80267C64BD617722D6F7DE3601216059D7E82BDC18728C2F2CFD63EA1029CAE451B15AABF7BE2D13D7191D1EFFEBA909B05A419B820424CB464E7DDBD0D272BC464E689263FD501650B7AD691565625941DEE3D6DDF9195FEC5718DDFF43B067446A32E2B34D1482348446DCC8B92E0A8077C0DCD1E59F05C9B6A7B1FA867F878DCF731E5FA38ED9596F207DBA7BA0FCB3EBF2E1B0A8BCAFFAE5BBDCDBF62FA40F5AE8612B1E319671FBC71DA87F5297DFAE4BD161E02B7115E9C5C6F09A1C44540D5C8435C7E2CDA96B9BCF9414E8EF6F1D938ADE592AEF958996D908DF29D589857A422B620AE1710889B58CE7A59A4DC96AA46A7D194AE8E530DF9DA7BD319ABA09F94F2F02FE5C4DF2AFC59F77453742F35C08D943F59E6E3 +ss = B8B9F3AF55E8C616D07C7042CCC26BB4B83D20FD502BA5CC7B72310990EC50EC + +count = 82 +seed = 373FDDE922CFC416ED96B444E445BDD0962E8989F6C50ADF9912A89937C57217D3600B06C95440448E3F601AE69CA5BE +pk = BE0AAFF4D255D72C6E8424C2D5D23F0AA4C28094691AC4BF0F56A51EA4799810CFB024C151C35CC3C6CC90A41AB964370C2BC953A84A73C87A02813DE34B933F233DA28643A93388F944C033236372FA6E6ACA085B598123F27122A40074A4AF57684D46398E5D58B13A863B0B984E224A7AD52C1C4EB26909451DCF2A15DCB11AC4CA38D93CA350078138E0AE87F1390FC9045EEA420260C913C6B54DD93495F31AAC32350CD03500DA308FD8BA0777C999CB4982C91E569A1C52396EDC506AC7CC43264A05CC880191501860F1A32F7760AD3B17FF693508339FCFC05FAE095C6A96C1E6864BAF147186BC22DD882620E5A5F4516DF92B8B715394C5677D0DB913EFB25459D6C636442A8CE22899F8943957BB2B281A8ED14BB5D0CE6DE3086EA8B6165798619B2ECBFB22727CAFC6409E23088C6C940C23E86A603788C07BA89D6BADCEF07D79174ACF70C55B7B30C067BD8202A1A70998459C54384196F814515EC9C7F360061270090EF37AD32115242C2AADC0121E1A08623038B311982C669DE3DBB1C7789530191B07A947C9637BFA241ED35AA1D03C81F0D70F8B95112A3B1B08B25C34DC7E1D577FD30A808AC574DECBB51538C2A017287E62128F32AFB0F7A73EC8831E6B975007592B5C652FA636C7315BAA474F873A5DA2E82FD146268DC951689BA83E046C0F4820447C3B3E6C78CD240BC4D21E0A4660EB1C69402B617B83057874122E203BD6313D7874A987F2987599CD4D7946E50665F7D9A80651CC8DBBBC4DF605F48274FBA0640F8609B6554A7760856259C32DF00D3056AEF65436A285583CFC9D9A644F66E382D4907C6D78AA461A2B6BA8887C238F81D31E796A675EE8B7A598AFD5D79A0587965420A2E9F2782B71331737680A499AA759824D11ACF1A001F9A5865B6568ED8A1F4F4CC38F74C24E231965E9830232924526BAA377B2EE933A1FC4677EE74FD98A0881628315AA95085C7415A1A51A98406FA345A69802BA71CFC885816EA30FADEA0232B13EAFBC24B84347124BB41F8C663506665CE4C3801B09933C19675C1F9CE54C418207B69215C91B10451730DE65A4AAB6C97804AD33C50233F83599133510BB334D9C1F4B7970087700EF45500CCB31B7933FE74A346AEA4C9BD409BC5A186F00BDCA67CFA8D041DFEAA56547A71C35CEF1B664629AC9D4F431CFCCAF62A781A4BBB2ADCA7A7914627DA380873977E6E1A11FEC0938A3A886E9B328A8A539557F6C700285693266742F779BBE2E7A0603060673C7BE9591BE19A57A0CAC91CD1C61860A86356B90715886ACAC2306190CFF686883A61E56140F64BA76123C1B07614FF5C8A4B402CDBA738AB68B749C1151DA62C30DFAA3BF826D4848C4910C9EA20669735CCA4DF583E0C5412B610BCE816FD17AB9C203A7EA42081901C8CD78940F090EFB49718AC90AD6A101093580C13B5FFA0AC0D7B094D913A9DDFAB03F835F79173E966746C69A0228D06A2C363E94522EC68312CD312ECCDC688C4A88F6A5B7C3464CB7EC842FC1377359A162032C8C504105461936714F451481D8A4942D1715B6A65583999B96B0C47A914F2F721F5EC6315C91B009E714F6518BFDC75E828256F25740C91E7EFD93A5D7DB1850127DF85B8F086DFC57F1F62A86D6EE7E45AFF3F27BC1 +sk = 6C33B8AB2B4FEBAC9FF7DC3E4A689F468A4F08D5C87EF8A142B4766E24073DF336EFA5A0D6FC17B6BB2C615658EB04AA9035560FF7979E27C65A85CA6B1B9BFAAAB23D89C6A825CDF7E312F81066D516BE72680E5A665830F74E371BC411BA86F00704DCD3C40C8C1295D6B52ACA51AD41732032535AF95BEF907127EAB1EEB54899A36961793EC47B91D9725643664082C4375F4843B0031B815C8DFFCB7F25D4414191746D5AAD14093BF2C005DF655F69917BAA956721B4CB8B8B51531A4A6C0CA50F8AB21DFC7CD9F81D730157A59B971E4B4A0FBA8EF49754A7C2BE0325C8BC623FD2A94A6CC4226677260FFCB64D75167D63334E395DF5BA4505495CBC8C3A3E40AB68796D6C646775339C29683A21F921A7C6A79D39A95C876F782A27A6365908381D793B537D1A681CAB5599817E050CCCF7803BF9A90CCC4084743C96069183B08702979C9DCA2B9D9BC26E1DE849976AA1465B29EB260FFC64478C39945A9B402520172CD7861C5A0CC089A028C8200208B3E4D7B3A91CC8C209C5E1D201278B01CAB34126C701BFC2913DF501F6D73D9424CF1176B8616C04C10940EF9832957585EC350E9761505162AECB28884F659EA23125C382CF24F383F9B09FEEE8AACB981DF21A6BCEC26E2A67493B919FEA06170C18B79E5A01E6E89516707BCC7CA353727825514AA0D52504606013E53BA916BD133814C36B98FFF15F847B7383854F692450AAD28231F2BB4FD839D2B532066114DA65BE8CC5073F9992E03836CA3A623C301999A56FB00332D1BA8A26D599D0F5A97975814BE81FC9DBC536D1C165A131CA3C55D04A05D7A53FFF1299D3860CAFD8BC6E3B97E72A595D294303A12994510F74887FD1D7BB18DA70BFC5BDD58C1F6C1CB56F5994B7F2225CE0AB29E8CF3DC851F1AA5BF2BA255F7215CC71C5DA95115D6A98A2317224BC6DE1B2C79353BC5C3C046A7A0933A73419F7B117B88F3A53777143546CD29014E15E37C33770A8A9A11BC2F38777E400132A812A984908B3D2B87FC465B564045E79453C0666E3682A894C269551AFE25286FCDB681CB50B260B4327B46C2D0699BECA103965B0A218902EB4680C1B8C3ECB2011A396B0DCA97D56AAD231168FD9A7CF177B85B7729DE4A4BF035482AA7758ACA9E1F36BC9033EA34C6DFF91091E8B36FD2A2C6B1094A8338AD540C8F53CAB80D73E7DEC3977452915B616D0F0BF9E842663CC477CDB5DC94579D6222D1B647EF4D358C5435D3D0799242B66818A683E8C5651B0B26CE4909F8656FF35CD7FFA1C5988074FFA32DF093BCDA32AEE2003825593B545B44190787C4C8656D85CAC293F615811CCB35EB0413F44B1722E0A182F09481712AC68E3C9D31085EA77946A54BAA91C8AB8E814C5B94206070C0A6037BC02A292082018933A5AC32141180A6DC760C2C9ACEB3B1A1505464150A732664AA51B02A721B63759379A638BBFD07FF9A7A84E071FDA70200C61894A8891DACC375C120A35E0A4F296A02845477BC0484FB5BC539C3B8BEA3ED2511D480B1DBE76C640622B67A1A8E000B954057322CC005F88284D6290A5D720E32B5F6CB6B992BC182D66A73B5019572867640343F267133B060545D4B2BE0AAFF4D255D72C6E8424C2D5D23F0AA4C28094691AC4BF0F56A51EA4799810CFB024C151C35CC3C6CC90A41AB964370C2BC953A84A73C87A02813DE34B933F233DA28643A93388F944C033236372FA6E6ACA085B598123F27122A40074A4AF57684D46398E5D58B13A863B0B984E224A7AD52C1C4EB26909451DCF2A15DCB11AC4CA38D93CA350078138E0AE87F1390FC9045EEA420260C913C6B54DD93495F31AAC32350CD03500DA308FD8BA0777C999CB4982C91E569A1C52396EDC506AC7CC43264A05CC880191501860F1A32F7760AD3B17FF693508339FCFC05FAE095C6A96C1E6864BAF147186BC22DD882620E5A5F4516DF92B8B715394C5677D0DB913EFB25459D6C636442A8CE22899F8943957BB2B281A8ED14BB5D0CE6DE3086EA8B6165798619B2ECBFB22727CAFC6409E23088C6C940C23E86A603788C07BA89D6BADCEF07D79174ACF70C55B7B30C067BD8202A1A70998459C54384196F814515EC9C7F360061270090EF37AD32115242C2AADC0121E1A08623038B311982C669DE3DBB1C7789530191B07A947C9637BFA241ED35AA1D03C81F0D70F8B95112A3B1B08B25C34DC7E1D577FD30A808AC574DECBB51538C2A017287E62128F32AFB0F7A73EC8831E6B975007592B5C652FA636C7315BAA474F873A5DA2E82FD146268DC951689BA83E046C0F4820447C3B3E6C78CD240BC4D21E0A4660EB1C69402B617B83057874122E203BD6313D7874A987F2987599CD4D7946E50665F7D9A80651CC8DBBBC4DF605F48274FBA0640F8609B6554A7760856259C32DF00D3056AEF65436A285583CFC9D9A644F66E382D4907C6D78AA461A2B6BA8887C238F81D31E796A675EE8B7A598AFD5D79A0587965420A2E9F2782B71331737680A499AA759824D11ACF1A001F9A5865B6568ED8A1F4F4CC38F74C24E231965E9830232924526BAA377B2EE933A1FC4677EE74FD98A0881628315AA95085C7415A1A51A98406FA345A69802BA71CFC885816EA30FADEA0232B13EAFBC24B84347124BB41F8C663506665CE4C3801B09933C19675C1F9CE54C418207B69215C91B10451730DE65A4AAB6C97804AD33C50233F83599133510BB334D9C1F4B7970087700EF45500CCB31B7933FE74A346AEA4C9BD409BC5A186F00BDCA67CFA8D041DFEAA56547A71C35CEF1B664629AC9D4F431CFCCAF62A781A4BBB2ADCA7A7914627DA380873977E6E1A11FEC0938A3A886E9B328A8A539557F6C700285693266742F779BBE2E7A0603060673C7BE9591BE19A57A0CAC91CD1C61860A86356B90715886ACAC2306190CFF686883A61E56140F64BA76123C1B07614FF5C8A4B402CDBA738AB68B749C1151DA62C30DFAA3BF826D4848C4910C9EA20669735CCA4DF583E0C5412B610BCE816FD17AB9C203A7EA42081901C8CD78940F090EFB49718AC90AD6A101093580C13B5FFA0AC0D7B094D913A9DDFAB03F835F79173E966746C69A0228D06A2C363E94522EC68312CD312ECCDC688C4A88F6A5B7C3464CB7EC842FC1377359A162032C8C504105461936714F451481D8A4942D1715B6A65583999B96B0C47A914F2F721F5EC6315C91B009E714F6518BFDC75E828256F25740C91E7EFD93A5D7DB1850127DF85B8F086DFC57F1F62A86D6EE7E45AFF3F27BC1DB315CAFBAEC2F8A0142F45AFFFF65289E826C9244AB1CB03F9F65DF3E3CBCF711136E2681DF2EF881B51A092A9BADBE72C9772C169808521C47149578621E28 +ct = C324CF3A1900484410A1DE432AC56A735217564A14F75A75526E6C83672BE590AFFF601320226F0C0614068ABB30B7B0AA66D54B4FAA789F9D9E0E48DAAF7CB452F4897CBE76FAFD89BE2FE0C32F9D0D4ECD61E6AD891998D5C4B334CB9DD402C2284E0F03A85DF505C876D300DA586E398AC16331D8F8B8E84B7347EA13D50DD1A33B7116520638E8BD779793F6CBDB1ED82D8ACE7F25E50F94EFFA23DE36BEC9210B1DCEBB1319A8AF22200A33A49C09B63998A18B4D438E1E4958F5DB78CCFE9E10FF0537F35931F05E629D8BA4A5B18E9C1EF194089DA0C96105BD287EAC7ADEBF758F4355B560404351C58646BA01A955644D1FCEA3A30F7AFC01641D360E74EA49BD27C1C3943092FA740075AF38EAD19E6376E4C91F9075BE124B4A43A0DBED278B3ABE532698E57B60D1DE574F31E159D98EE07896B6E9D88A4F2594BE1F0A0C73D7466FE92F8464191B7A7E54791981EB2A8D39A0B712F5D4507F8FAEDFC7E49EC6F31ACC77466494EF73277330AC837272D68CCAE0D05D75A235E353AB29216A2E8C7ACCA8123D24441CD51CDC6DFFF3AB4FC70800A427642C1E1795D41C9BA9FC87A3035E7F1CFE390F1EFBB9B955EC6A0918BC45411E8325FE8F4D6BD928D4029949508DFD4978395B6D021C92453B8599D8705951E2FECDA5F03476ADD8B6D7FD9B1336E70A57F42017CFBB329E925180E034A438A50623589871E47EA8994C1ECE7E35EA42384B1E66DEDBB3A111513B6DD7F25D95F5FF0236B717BADC740505777B2CBBCAAB063523C6A8D1EF6A9CC9F689DC6EB2759D5916C4AF16564E6C23F38A4C27DC1219094A023EBF5B56827EA897045DC881F0A89A853645942356EFF1A1A9BEA7F2C12C68B5EBCE0706FAF9CD72E453E0188071856C7FF37B952CCBB53CAD0CBF604DF59438C4022F6F26D71E9073CC1A45AC6BD3F6A71F3EB284FDE720416CCF1ABCBA0C9239144A6AA38AE655786A2C3820407C77F8378858F0877E6CEFCD5BCD8E5FAEDDECD68C1E2FCDF9BDA5EEF60FB7E8AE441CB8054FF7C94A8697BDE5001893ABF8140424583DF49796D1FD10F4DC493BDAF3C1C3B76FC1D34346CE5A5B7755A68F8C5490CE8827CB8AB61C3339F0DECB83F09230EAA58E6154BD8E1A77291654450A4949C3DAF8B4C05B001D94F21F0698C426A93D64B2D1005D1217BE6783588EDA458545CC1D677B2770B25491224D8D194285AD612F741ADAADEC5B2882D13334B9BECEBB39F9F0D4DE237FD36D7B4E114A079BEE6D7C2AFEE75C4961F81C75887A616F1E6497A4825C939128FDCA95DF452C5F4D27B1D516B33DE9336E394906547AB7FA5ED5A45CAFCBB56E324B606DAEBF25E705590EBE36AB32F5B4A4171AB7832DBB66177E9AE6C29E5E4F503AB861488D5AD246988D4CF8A41276F1048E4D778776D34577679069E4248CC09A5EC7F533685E137AC32C984E91E8830E1934F6B2F91B33A3605C53E51A8B7264D53B69AF57507F5B5AB6D4F1B1B09AA1E50CA13CBBAE62AE464E99C40C2072 +ss = 2E4139C499A24CAA334754E10C6BBDDC7A0830499CA65E941AF8D87EE022D483 + +count = 83 +seed = 16BEF67F7AC3A755C59C816478B75FCC16CE5844DB537791ACCD1EBD49D2824B105FD2E970F728C8F0CF16E439A9AE2F +pk = 690B34B6586039100E84215EDDB39AD2D40BA9F80165623122A2C5FAF3437AB0376894CE67397D32A67C3BFB9761850C1C68AD988348725C83A378143D504400F995157903B9D04EE43404AB2CC7C35B8E0E09CCE4559945F5640450703F81C35ED332746162F7B8328F78BFC3359E7C1B4FCF06155FC745C70245FFEC09ECA957C8475C62B05BFFF288A5E5A5C78206E48C3EF373658859C3D9636786980578C07B764641D6A87222224557D10436FC72B563883ECB0934E50B6EC89429D7792EC0BFCDA416FC2AC323A58DF3FBCDB6E023140478868055251B1C09FA023E240E109869C1D2967F598A529042D9859F97CCA2E85A635418707B3AA1835B77DF93AE4DC53F228083DE6A04BDF58655C59BF57B107987B88CBC001E010B9C2458BDF138288190F955B62C7013DD5784C809A7B1A29F8C3C33F0311A555306327392DDD44EC8F72FD5893F56F58BAF207F9EE98B7E31092F761C390763A8B57409C7C5C665A913E20C9B62A5E80646364AA8E3B95030FB2FB289991B8637EA57C7B324A25E0389CE979B5E816FF841456261BF042C85DAD84F80D788076B7C69CABB8E389A72657D7D63949657B934A468516C36674194DF1AC3F595A294C28D24C26E1B1B5AF5B542E025A182868E1555442E0B0D064865ED5CC1665074E55AAAD601779E591E1ED2AB07CC551437603D24CA743218FA846822B2857F871FA26834E0422746A6C7DAD256BC0B4BFFF21BD7309482D7669F8857543A0436140EC684C959D26F2F827A84B37534B7AA3BC0A08163689F01141B511E7D11A316D2AA7D73909E889DD000C20E38667DA048278B5EE87188607B4210642F5C38866FAC1549637C600C8BE8C60C11AA394E8344B6C6536E687EF6DABAC397ABF1CA7486F6AE87D8A3DC8070B5687F7C6A73225B9233685C6B703D33677998C24E40A72894193CCA1C5ACBE4A133D85A6912587AD4AD522214974CBB1F877E16164683021EA9C335D41B000CF52A3ED45B2D95B7E2D061B5213DB4C6BC36D76DF5DB9EE6984D31BCB1F6757DE7E51871F1AE7F388C5134956D3286A49BBA39967889C9A424772BF5DAB014C94893A4C8B74AB099687919243C7633CAF297B2B73AB15DF419F6EC22D15A95553831BE379ED0489749C495E3B6B8E190049A8065DBA8933FB21BA3A751CFF289A2E2772B06A4687338CA88C0EEF1488B848AFA1041F4F9607EB18BC0650055803041B728F2F1922CD984D228096FF29E71F097921423CB82254C40A615240A2482A3F5F095F5B399A8F9ADDEB6B726F43E3AF64D09038CAFEA26686CAA2CE2194CBA660EDBB083F92DC2A51142BBC922958C86C62CE7A4B3A4C95240D72244A912C3C193485208CDDC4514495B35863CFC6CB41FA721A78080FD7BA72669AC6B29ACCD3B832D35AD70F7584E197D695B78C832000C1C337FC019F0AAC04B2149A469420C15B2DAF5281DBA5DC3618E0135C043F139CC74B14E7451FC11328F06B73F124766403541131D94506628C30B7BA68564179FAED9C9D2A20F3B61793A33A65E92B699A47FDE974EECBACE22690273A757DA903A886778002D283A819CB1EA2D34B8462DCAB57C85653E363629D9270738434AB1BB46BB71890031FFECAF8FC027D2DFA2A4AD271DD702F055836F40CA137E5D0EF9 +sk = 2220BFA6A447DB5013ED5811B45742B6E95C723A35851518E04B1B619C5607944C341A1ACA4C0EB297BFE3990D514ABA3DE30867D646CD76A1EC1176F1E84EE60704B0E04366E27ED0F321BBF42322F5289F5167435B880851B48DE717E40A1B56387D4705815701BC2B80C55F33B3C20244E0E27FFCF43C457A3674000A4404B4157CBEFA05C54F50021684059939A3AA088DBBA13BE56047DF450AFE33C8742ABB0CF48E0B1C24E8719EECE41EC4A3254836B4E45B4EEBBB43D398A813BCCC0C42CC4E437050740C892B657765B252943896325E3F4C45887452847AA315BA8C811B39254A5C3EE64F65823FCF2A92E3198D2981289E021530AA4CBD210FABF51094392E25E755D778A02CA145FFF47165711AB9397A0F9B3DEF26BD0E5143C23A815C8582976521D63BC74D8B42B95280CDC77DE3528628862F44D475F49AC204C87D2647414A4A136A094B7FB923BFD3496B187592E81B8168BDFFD9522F60BC37052FC579CB3F7A398DD677BA14A3FCA1248057A59A58531B7A1F1773735A27612520B03121390CF624D46927CEC7C7D00AB13DC2BA6445236BC68642EC9659D7BBA40AA692C40794BC4BF5F13FBB617E711A54BD825329AC6A9AF2A88A54A600C0CD6754B4A3ACCADB397CABF2AF41463C00512D6D206D011BAF6D833E4ABB8DFBF736DF8036278A8125389C3B99940881760AC150967464483242DD52358A075271FB82D949AF57F345E5DC46845A94A37893613A76B6E7B4D0DB0EDDA213302677FB73C493A349704333278B201B6BAA8315731A348DED27283DBAA05E057C26C35D68A5252F1715337A1543895DFA4C395F9909B7B1283B450B71730292C32DCFFCA05221B14849AA5F94888E2A3FD33CAB3B380F8093742247AC27012E8D7A6B8702983DFBA43601677679568A8051925133FBF6550DC318E387C3E3176EC9C3CAD6A739C6BA5B72FA587F000CA8F06EEA003CD05970652B0F3F92B8BD4AA1570B02CAB21D2BD0A9937A499943CE285B32706589C11CB662461444629F5C755B4A09805DD5659127BDCF5466270A5CB6328FDD0583E701AA98D34095506284B63A6F7B39D0B31FEDC43E20E4BCB39B99D82515E041627FC5402290BE758A062822C26B750463141D9DE8793B385F556A3A3F74BD8AB61F69304AC4082E08F2CD05E5BEADE17D2C87B9535A084A6B0547389D08F548030B1DDA0137D170039E082C5583BC83695AFF0898F7E19E54204582989556B924DF35A00C518AB95CBB466B5BA0D8AEF007A8294294870902E74152832365FDB79508B69E45484139B4342DF8C391864B80E807B9DC8DDCD4463FD1A986986B81A62D79AA9565308AC1471F09D09A23F24E4EE5522B00265770674C61348FDB3BFDD539994B20FF22B210162961B56DBA538252610FA607372DB1317497B85307B61D890A62B90E4DD37246763DC6093AF5F4CD0DC20081BA4CE2D6BBDC969580607022C590A1687004B0730AF71C60590D1A6B2A5E51C742D2CBBAA826600055F4811287A062DA1696A22808507AAC327A9194C5C6D49C823557100C158E60B845AF953539A855D217C5A77599B1783F7488AA85F222DF73B837E4B8D1006A8FD6B5B06083690B34B6586039100E84215EDDB39AD2D40BA9F80165623122A2C5FAF3437AB0376894CE67397D32A67C3BFB9761850C1C68AD988348725C83A378143D504400F995157903B9D04EE43404AB2CC7C35B8E0E09CCE4559945F5640450703F81C35ED332746162F7B8328F78BFC3359E7C1B4FCF06155FC745C70245FFEC09ECA957C8475C62B05BFFF288A5E5A5C78206E48C3EF373658859C3D9636786980578C07B764641D6A87222224557D10436FC72B563883ECB0934E50B6EC89429D7792EC0BFCDA416FC2AC323A58DF3FBCDB6E023140478868055251B1C09FA023E240E109869C1D2967F598A529042D9859F97CCA2E85A635418707B3AA1835B77DF93AE4DC53F228083DE6A04BDF58655C59BF57B107987B88CBC001E010B9C2458BDF138288190F955B62C7013DD5784C809A7B1A29F8C3C33F0311A555306327392DDD44EC8F72FD5893F56F58BAF207F9EE98B7E31092F761C390763A8B57409C7C5C665A913E20C9B62A5E80646364AA8E3B95030FB2FB289991B8637EA57C7B324A25E0389CE979B5E816FF841456261BF042C85DAD84F80D788076B7C69CABB8E389A72657D7D63949657B934A468516C36674194DF1AC3F595A294C28D24C26E1B1B5AF5B542E025A182868E1555442E0B0D064865ED5CC1665074E55AAAD601779E591E1ED2AB07CC551437603D24CA743218FA846822B2857F871FA26834E0422746A6C7DAD256BC0B4BFFF21BD7309482D7669F8857543A0436140EC684C959D26F2F827A84B37534B7AA3BC0A08163689F01141B511E7D11A316D2AA7D73909E889DD000C20E38667DA048278B5EE87188607B4210642F5C38866FAC1549637C600C8BE8C60C11AA394E8344B6C6536E687EF6DABAC397ABF1CA7486F6AE87D8A3DC8070B5687F7C6A73225B9233685C6B703D33677998C24E40A72894193CCA1C5ACBE4A133D85A6912587AD4AD522214974CBB1F877E16164683021EA9C335D41B000CF52A3ED45B2D95B7E2D061B5213DB4C6BC36D76DF5DB9EE6984D31BCB1F6757DE7E51871F1AE7F388C5134956D3286A49BBA39967889C9A424772BF5DAB014C94893A4C8B74AB099687919243C7633CAF297B2B73AB15DF419F6EC22D15A95553831BE379ED0489749C495E3B6B8E190049A8065DBA8933FB21BA3A751CFF289A2E2772B06A4687338CA88C0EEF1488B848AFA1041F4F9607EB18BC0650055803041B728F2F1922CD984D228096FF29E71F097921423CB82254C40A615240A2482A3F5F095F5B399A8F9ADDEB6B726F43E3AF64D09038CAFEA26686CAA2CE2194CBA660EDBB083F92DC2A51142BBC922958C86C62CE7A4B3A4C95240D72244A912C3C193485208CDDC4514495B35863CFC6CB41FA721A78080FD7BA72669AC6B29ACCD3B832D35AD70F7584E197D695B78C832000C1C337FC019F0AAC04B2149A469420C15B2DAF5281DBA5DC3618E0135C043F139CC74B14E7451FC11328F06B73F124766403541131D94506628C30B7BA68564179FAED9C9D2A20F3B61793A33A65E92B699A47FDE974EECBACE22690273A757DA903A886778002D283A819CB1EA2D34B8462DCAB57C85653E363629D9270738434AB1BB46BB71890031FFECAF8FC027D2DFA2A4AD271DD702F055836F40CA137E5D0EF9C8D853E65B5B118E28B7CB6F0D5D6F282E0EA20FD72F3690A6B232B20A8A55EC6CEB14F7662BE0C42779459F69A145C0E2CE9F0BD9A0CD1BF32ED5694CC9AE32 +ct = 1F5D4D55EDE2DD05BE7F87C0FADDE30550A5D90923B7BA8E773B5EA78DD3770B9CAC323D98A6E08C19BD600C830E2C2FEFFCE4DAC32376EDA9248E0CBBA9FA0EF6656DD0CA9B3797992C92869164EFE226FED579384121C0FA2B417D5A9F1EEC78ADE19AD9942730593C9AD039EA26883991A02B93F7459EF9D461D5D4894EBCB31025F095F1B6BCC6153D5A998B50BEC88D447A8FF33224D2BA9E9A58D2299EC6D3735096CA81244B315CFD39DB3B85FC718AFF5954B017724B3C6BA3F6780D87E637B0EFCA63C4523099016F78F2DF9BFAF6B0DFAC64332F1C5CFA54A646000F00196FF0686F0BE1728F6407EEAADA48F9E7A6946815527972C9B661A7CE051E76F3B6767DBB186AC7B923BC7284F2840F7B321873B2E46206489771533324248CADD5ABED7AFBCCB43FE0AF06F2C6D6F867B189522261A2A7F042679E8C9E15AFF58FF305D6FA288B1471F46AC82F664012E1C1375DA9A100AC4FCD9D093F191FDF8B12088897B2D8E9E0CC9A986A458751717FEB6438DE9186CCA6B8D361A29D2FA7742DE825ED2FDE97A021087D2DEBA129EAFAF10F370C2833C80818B26E062DD34CB9A4B23377F79C20AAC87C9F93F7B7AB25F74AC0FE18F092E1BF6E43A82ED4C456682F11DD7CF5B41E94FBBAED42A1EC9432E36514214C6600B053A0C9DA4F99587267755E95C3B45BAAB7FBC3570A2749A2533E9DCC2BFD4AC1D477D585BDDBC1F44626E40A3B2678ECA64316CB6B9FCF232BB26D988B3EEA81E9568BA4868FF8DD72D457513552F6C25C5C5C605401922DE6DC878688CC6762B3904B7AB8F06BD64F239CC5103863A7D066570235F53D4811361AC876A15770755F9834B7D49C831D97C5602BFD14B9EA2B37DFCAA87E9FF0F7EFF68933C5CC9D8E5A5DBB5ABF8B7B7239D384DD2C3A500AE16C50511F3B464F07A1DE801EC034C3533E55FC94398DEB4E9E6099EB40A75548EB34DD62201D39057D2D3AF3EE71EBF3458267672DA7650CCCEC7D34F8D53B3B63C4BEC77DF151483331A461C724320F4B8C14F0BD96E0B932A39D41DFDC8D256F213DEB9DFA7A9C2B43FC15D807B3F4062D0C1C80FA96EBC28C0F4ADA8E47750AED8089AF233686E9AA2463DAF738CF0E754ED0CE169A1C7B99396BF71C61C81C924066045481A88A2995D0578786CF787ACC37287795CE12A14C7E128556ED72EBF3C25C60F8A4909233EFAC38BA1068E81CCFD3236372565985C41909CF5E40A8962569B361A026B2A5F5AD411E6AFB36A536920C977DB512AC027E1C240A0AA0A0176FC61334C5FDD25099164227D3D4755045EA9414D3D199A16A8C4D9E6DDB25B187928E7037E6E42F895AA598A9CC3F04B1BFD9E8122D1A6F4D8076ADE9F9C33EE2B9AAFC78B685FCBEB2C0B39B84C5B12D0AC4DDD3421F8D20FE77540A78816D364658B49B7161DF6B87D3D7D7F4FC26FA13EFE503C1A50D3EF67B9E367B4EACB81082E3A29C29E708F988D888A80FEDBC9ED2B2ECD1DA8378DA262113FE18A9EF88B8636862D9A92542 +ss = E412F3AAC1C0284D999D5A7F8344B4053D10965FCBE1638F7EF666EF29C521D2 + +count = 84 +seed = D0611F9AE5BE4DA5D7EADC9109944348E716CB3DAEE545721EEA8C892E7831CF2E54603146454CBFD92387739E9A78D8 +pk = 44BB530C48419ABC7578B33D6DB56C76179E9DA3808BA4C8D7C227BA5C64AFD5C87E01C1AD12A294758F45804719DC7369950E9E6398BFCB60A7819585A689462346AA5968DFA83BBB3B8A51BB59311C9D100A4A0C7586056201FFC3CBD92C3A42D6851EC064A89227B4D1551CA7AF6B5B3E892B4E44571669412E4240A08C42551DCC50086389F9E0C0290956B5AC58844A84BE308D0A5562B57B5CBC594CEAE87910A13167F27CE63B822F201AF5E9C33BCA746BA7C5E8541FFF17324228321C7A0EC976646A6B5615F80FB56351D319B31960AA8823426682A610652652994D4A78C25659B533F5B40E6236A6E704CD891502E9C2D1858CA64C94D3734AC0BBCAB2DB2F9E03450E721A38C82A4C26A487F006E1966FBF8063AB115E74F441837506559BA5B7266F62B17E4D959209B657193689A0354149880D08434FBC282713118D9DAA89C52186EA918CE2C170D8380E45A32E9F710CD6F89DAF91C9210B767D743F61655A9702051D7C8A46F17A681B136C0863CB62430D084D282099D1636C04D6B1EC212A74046D2D8108470123DD751DB685A1A1FB3A3B2C216F51302FA13AD73B919A439D424A4AD9E12994D1963B3C0E0316739CE50A1A7C23D65ACEA61423A5792321A84AD2E1B3F5B595F11637EACA77FC753260E04CEC9CCF55D70D4D567BB78749EFD005C9525F6E921F0630C25CB9A129781B9B864B7556272D5B4164E340D9464BF192979A073384F6A5E52AA0B6B74D43FAA5412C5914524974161AFCD91660705659DCA87BA482D67C8C1400B069E66A19905B331243701AC8261952C5B736B25290235669FBDCC254631294FA2E97C440D97A0211C35C2FF4B6009AA66E27CC09BC09307C7B3794A5D189892EA60B2B323E95057FF355114AB48613E2760E00BAEB82B0A763067E216AAB899E7CA06E195A5E92486CE8911BFD5C7D956318AC3B029436A9D88C56AAE2A3DC7B382F2C5E7265A037A827761447FC59A40A3C8693BC996CA786FA7AC1BBCC6AA404A1BFDB3D227C6ABE42CFC463C2F1542AE418CF4B38CC2C1595F9343D41B4A1967C7C94A7A0AE91CEC8235705805AF096CBEFD0CAD6DC0BB5130907D64E76E4BE957A117D121D66071598112EA7D02B9648CF53E57AF9E7CC3C9803AAB327D87C53E41CB9BBC42368D332E0A963C3385C18936AD7483A5F4292B625C844C2282F25AF0C86984DDC09371AB555D57DE146664FAAB59DFA514F8BB8D397A987BBC8DBE147EFC2A34DAAA712BAA1E36C9C5113A7F47BA8C4A83DB2DC79AE93688AF7C480DC8ADF0B12D7F5453E669BE2D805DD6961454BA8B40C6EFA961E53DA19EEA2243C998B504C8AB9EAA2DB11B2F9B591990040954A1567074E69154AD6E618D0830D3B554FE4C99F48B51CF6609952CC9693ACAB000C335B98126B4B45A9F317F80A6049558FE9D855A026AEFDC649D295387C530E075CCB32AAA202171C6F6907A4A2202A9C5FCF252D98328F12F927E31C596047140AF9B177E0352B120954D00529A07D6B2BCE5026A6D7CBA01231A85BA39B1692694788C9215B69FCD111FDC8934A1BA24CC7890EB479AEF01FF29161B0A7AD921BB72A8B495FFA74C62C880BF03F0BC175EB865A17ECB56E0AEA501BEF8E12D3025185BA4CF8EDD1B0F297471D58C26516 +sk = 7934A9FABC835BF9A77BB807332251DAA00876E5500D2C59F07485ED01BC934911A336ACDE5527DD166476CA1D1AA558CD88CD7BD17CE1791958E851991867C0525C9472A953C8B04A730E2E132C6C26811CB86F3234229F4CAA2AEACD2E3C840E97B8F1805B94D7317B08354BCAB64887A4E6A98FFD90A7544562CEABBCCE6489C6E8534119C9589C405D7A96DE3230094A459549B6F37078F2C01FC9080F049464B0A969EB742419147C8B39B8065A769D400A17BB25DE51A699B69D54BA460D33AC6A6965916829B7A578D0B24BFF786CEF9963BF961ADCC20F9A0CB1C159865A344A0E36879C67852DF50ACA08A46E72A4A70C027CE283DE5BCB219808F2635BD7540915C5485AB70358CB017882B12ACB4426B22B02605873F2BD0DA59A658075136CBE15418CCA0A11386AAD43A52E3C5AC97F36BC7F648808C260643C325CF456E6166EEEC74EE8476AD62C73D7D334AC279D84B66B6C8AAC217A813DBB3DC6007317A165E6A1657D0277C1E683BECCC956D973C7624E959724FF9275C1AA2BB5ACA75159721B8C6D7B299C7ACB4704C654335982E83AB3724CCAB3709D20601C2A943D5BFBB3D384A7E83A7793905301B1704CF49992077B19F0204F3394717C9AB9A173113004FD325EDB797A30155D0D2A1E4984644F245F5B495B56A98FDC487B29B4A5C6DC4E3047A8DA2C9325F1705613705628458BD525FB333087CB4B967A61A994CBEFC504D18C1B8A62898AF32BC454A57E264722897D5DC71E32C2495CA857E1A234AE61C77083BA9B780342D7CFDFF8B7EC1257B79CAD017113A3238510C5683C3A8C396986ED392B0122C16E34A7249691EA7A931C44087FA1731746C1F3855BC72414FE3484D85B5E2586B6231B4BCF27831EA7B57070A815795F43E90B2112B235F5959EA253DB76192BCB11D4E16399D40C5DC0A15D98C3B3B0289F07839F7738ABA3281D45AA0A9CA1D349A64E79246C2C7770227F1E1CC74DB8AB7EA7B0E60A9DC0E45443B30CA656CD6A8897AB105BDA51B02179936F04374554A52992710F2A70972479462A2859736C2FE4359A474939AC3531B2905F90BC38860B5615ABFB1A1327814C01048BB93C9725C7C3B0547921975766A97E29D529E4D8A090C36820DB0FEC33277CC679CD4A51F7CA05F204BFF20ACF63EC403AC7CCAB951A8EC166C545ABFCE8734833274F724E77E68137967DA75515E3C270CE79838839721BF3A14C952085071D6B3A555CE62D96E7736A583F44F726AEB921CAA340D4BB788D63645DEB2621629DFF8A2C51D23BFEE95CAA7756F1884A0CD263039C37F7415E83D4908507C1B17A7308CB329D829C86953422B8B2F1786A4B86B980751255339258572A02AB22AD845632F859EAC223E1245AC3533D359246316A3CC1AC58B4E6386592859547171CE05DD7A76BF8E93901EB7F40114175AC45E0B35109AC57BE844C52D31A7BA60A24F30EF0E45581242C02E020EC86AF106836B3DBA8071BB8E8574FDF208100982E55F4B0DCA72521440A2AEA68C57B2039D14B21A56274972ECCAC7EED41C4B26CBE2C973507F1CDF4E618077406CCD3C8C5118545178351522485730B1A1CA7971B01766B914E835244BB530C48419ABC7578B33D6DB56C76179E9DA3808BA4C8D7C227BA5C64AFD5C87E01C1AD12A294758F45804719DC7369950E9E6398BFCB60A7819585A689462346AA5968DFA83BBB3B8A51BB59311C9D100A4A0C7586056201FFC3CBD92C3A42D6851EC064A89227B4D1551CA7AF6B5B3E892B4E44571669412E4240A08C42551DCC50086389F9E0C0290956B5AC58844A84BE308D0A5562B57B5CBC594CEAE87910A13167F27CE63B822F201AF5E9C33BCA746BA7C5E8541FFF17324228321C7A0EC976646A6B5615F80FB56351D319B31960AA8823426682A610652652994D4A78C25659B533F5B40E6236A6E704CD891502E9C2D1858CA64C94D3734AC0BBCAB2DB2F9E03450E721A38C82A4C26A487F006E1966FBF8063AB115E74F441837506559BA5B7266F62B17E4D959209B657193689A0354149880D08434FBC282713118D9DAA89C52186EA918CE2C170D8380E45A32E9F710CD6F89DAF91C9210B767D743F61655A9702051D7C8A46F17A681B136C0863CB62430D084D282099D1636C04D6B1EC212A74046D2D8108470123DD751DB685A1A1FB3A3B2C216F51302FA13AD73B919A439D424A4AD9E12994D1963B3C0E0316739CE50A1A7C23D65ACEA61423A5792321A84AD2E1B3F5B595F11637EACA77FC753260E04CEC9CCF55D70D4D567BB78749EFD005C9525F6E921F0630C25CB9A129781B9B864B7556272D5B4164E340D9464BF192979A073384F6A5E52AA0B6B74D43FAA5412C5914524974161AFCD91660705659DCA87BA482D67C8C1400B069E66A19905B331243701AC8261952C5B736B25290235669FBDCC254631294FA2E97C440D97A0211C35C2FF4B6009AA66E27CC09BC09307C7B3794A5D189892EA60B2B323E95057FF355114AB48613E2760E00BAEB82B0A763067E216AAB899E7CA06E195A5E92486CE8911BFD5C7D956318AC3B029436A9D88C56AAE2A3DC7B382F2C5E7265A037A827761447FC59A40A3C8693BC996CA786FA7AC1BBCC6AA404A1BFDB3D227C6ABE42CFC463C2F1542AE418CF4B38CC2C1595F9343D41B4A1967C7C94A7A0AE91CEC8235705805AF096CBEFD0CAD6DC0BB5130907D64E76E4BE957A117D121D66071598112EA7D02B9648CF53E57AF9E7CC3C9803AAB327D87C53E41CB9BBC42368D332E0A963C3385C18936AD7483A5F4292B625C844C2282F25AF0C86984DDC09371AB555D57DE146664FAAB59DFA514F8BB8D397A987BBC8DBE147EFC2A34DAAA712BAA1E36C9C5113A7F47BA8C4A83DB2DC79AE93688AF7C480DC8ADF0B12D7F5453E669BE2D805DD6961454BA8B40C6EFA961E53DA19EEA2243C998B504C8AB9EAA2DB11B2F9B591990040954A1567074E69154AD6E618D0830D3B554FE4C99F48B51CF6609952CC9693ACAB000C335B98126B4B45A9F317F80A6049558FE9D855A026AEFDC649D295387C530E075CCB32AAA202171C6F6907A4A2202A9C5FCF252D98328F12F927E31C596047140AF9B177E0352B120954D00529A07D6B2BCE5026A6D7CBA01231A85BA39B1692694788C9215B69FCD111FDC8934A1BA24CC7890EB479AEF01FF29161B0A7AD921BB72A8B495FFA74C62C880BF03F0BC175EB865A17ECB56E0AEA501BEF8E12D3025185BA4CF8EDD1B0F297471D58C26516F69BD52CB1D071F1CC7720F949D44F66F40C917EB30F3A4B0EB519ECAD2D03DCFAEB2EF44D2F608621E831187CE79B2D2F4A20F1568BBE76B0D3D5AF36111714 +ct = 55B89334DD971C479417D6D70BAA960E1BDF4ADF3DA2D9D2AB18113F740E0558502F016B99254163B21199E2BDFFC897FB3B1022B53B9BFA61C200C0F071BB74507BD0BECB61EA9E4D9F860D376F3D9D23D3EEA50FE0BE1CE6C40B27323C17EE5E9A9DDA5BDEA6021070927A035D822B44A6D457BC9227E162CB2C27CE543BC19A9B3437613C037AE5103B5082F7BA35EDAE372FA5965D00EF8E6CAF2E856B4F0F57995512328203D9524BA18E1912EEEA55DB3E1CA0B8F0AD957E04D009E71CED4F0767BCA4CC3673C33BB0A06AD8C0536EA5B6DD0C093339A0324623F5D4C007F23F0562D505B2737F9482D41B2C293D31B2E9BC5EC86FA8A140E2D1FEAE33FA5E7636C94783F61CB0068CB7AC71DBD06FE2BB6A58010A391B1DEDBEBD34093F6F8DFB6977B1B709C895BD0F2A8D8A39AA9DC3CFC8E8D522BB9EDB8555F06CC418E68F4BFE6E449B069573AE3506D8D8E8167F0B25AFCD48F018E03762AA85B2474C6AEE304ACF649EED0E9688D6C62ABD8638590C74E0359881CD0ED9204777955B6135DE3A777074BE90669DCB9400AC25D55E022A9362224BFB9A830E237113ED56B89898957854161EF6771E58B6A1A7947A381216CE20A97451555D3D2CB902E69BC762651412EF5852C823B1A8DC477426DB5A9DBA4818B76B40E59C8267CC26CB28E2E050502D8506E9511FF57A5A732082170FB25907B272136485D4EB8F2767332E1156B4C7A54F567957CBF0530F7293F61736F44A31FA94B1B6EBF7D79E2A87493C2B5FFDF03DEADE92C1983DF596E16439B6B0DEC17CD95D600748EE2074A219E43F06FF7B93124DAEB91A2ECE0D684559D8A820B4FB35C1B647065EFC0C98EF4A38DE1927C499178F4DE44F74F1849D057FF153571D5ADE12845E0C61E35171DB6C63EBCD9C8269458A3A1C5CB26C20EFB664E79306C841DCCD240A2ECC86F69C00FAC5332CFA28D874847E1A8A3AB531324BF13377D7ACE16DF5B960B1EBEA092A40F5E1B09BA3BF56807FF9037A1BA0C903A7A1BE491D7B27A78A10FEB3A3030280766EC0A75FAE99BD4CF2CA5BE940D45064B0215628C09E4D6FFCFCF7B1B69B1C05A82838FF64C414E66FE6F2816DDCB90887EA23A9F0DE07F7509F005800E2202C63C1B241DD470B48AC484786AEA204AAB301B15F0B647A5776491A7857AF5DE8EE4D77E6B84C1697663A72F28934F5ED40EE72419E7700E18DE42C0365BA0D5F55FD644A874ED0C047D198D379AAC2D60B233A3D8F97F336A7685371DCD1849996157FD921DC42D2A63755B82F4B776912C27837E2AC17C24485E08F7BAC7FEBE512FF7A92F8ABFB262BD53F887D54E77861ECAC9E14D68E27E211EC53DFF507295A0D82B58E2E8E00CE698FB0199D5D7F9F200D876090613D6ADC34A08ED46B55303917373464E5C7DA621E73738DAA1D3CE09DA22B98B48ECF37F8A0D4A44A3E8B086B2F7FA078CC5714F3CD296508DAAEBDBFA565D3ED8010816F4DE58FB4B25DA0A25161A91A38CC42287DEBBF8C30F28B288C +ss = 4F9DE6E4CBD9948D2DE9250654D5DB97FFE24CF222F68BA51D6261F02F4DC5E7 + +count = 85 +seed = FBC38D7614D7718E931EDB850D2C6F0C5EEA9EE889B3E25BD69AC255D5B91E885D93E808E66BF9C88C655DC594DA5792 +pk = 9EB92FFF176A27197EB4AB0171211DC7FA954C652698C50105B5C2E9F7A2A887BFB40880F8624E1FC67B1B43A51139AC6025B9EEB60925D424BB82C58B4B617618C43C99B07FB14E5B86538D29700E1CCB4F53A52BDA2EF566B20D8CCE1D7616DC81398D14ABD03964940C794E6100DA994D5BC0BCF28B04A8971214E7AB9285515EF09A7B486ECAE5C84655C9EE15255B715C3B784D9C243993171C604A3E29450728396E7572228610BB9AC04B06577B3636C137A24E2139B48DB005553152C6B040CF0B2408248675EB90AFB66D6105537A316C7C989746F43C3B284342E2CDB5F2183A16CE71AB39C67797112B0B907C00F6A47F17DB08D924826D526CF88234A25676D82449F93B2859076978860E499A0DE134A936E35F06A7802456008C23970818318AA2B55A1762A9394DDA7A49EBB4B38469410F5945DBA2801AC25BA39A2DF819B0DB194B53C4247FA5065FF99F73E71D51C22F51FC262DD2809EBCC6879B0D90004DA5BA7CC9462F6C822AC8FAC8AB95B769A465CD743BA2BABB26958AB9C3494D329A0C736C28A9CF84F5C90C5A0594485A9B339212D01BF6910105D44109B09BD063B4F2F3B903C94DC650812AE5CC87527754D476FFA82F34F39B5462006029875712CFB1DA648DABACE5AA1590B5CCEA82C20E74795C71BB70826EF4D0BBA580A447693A42D8AF3256C64CE327B370CE576B6343F2BF8FECC76E1434D5E448AA8A3B326584DDC56496704BE54108F8572170C2BC39680598017641422BB81645959B8092E82A54C68AFF60B78BE78107E7BCACB241B09913461579B52AAC5C6C8627CC033BE2273580A523D4CB7979CB65D7056643856BE187DDAC112799559A87168AA96A18089A6C547E87DA949C62B8EA876AA0192AF409BFBC354F05DC08FED46904A2688FBA59FB71B83031A19BC8A6350BBA93552BE0C01B73C89964563FE588A5B76971DACBA69868B588BB2F9076532D6A8FB4316DDA4C85C2945A2A29B6EAD3900E50ABEF2B44375AC36BCB0E028A20CCE58353C827F1D53A9A0510E3827CBD1383A6D18C0D22C374E2B6061C2197A6CB094CA9DCB42F0418C24A9CB893C45423447CD5EABB0B9B410C9144013543E5C3BAD525377CE8073D4A5F4A22BB24874B7E21523CCA731265572B487E3B42AE581A617437348C290F00AD09460AA0C7B6A1A53128E4E01B3C406A296CB35CA0BD0D1917DFF42A4848AB3BC28A2A28044C719CCAAC45C513CA007653BC854DBDB79181157AA17220153CA3563B21BE77ACEAE06BCD02531FF5B7F5453DB0119364DC4E97AC7A495287815B5EB512129643AAC4F42B3AF35AFC1207DB0A3194302FEF097BAE37BF382C154E78154B3407BBD90BB2143BC285AF1EA0B1B4FBCD3EA373A077C6107AC2800C89F20544CB7A83BAF26EF19367724B1C989C39BCB4337DEABF7D531FE2B3327F4AB0F6457C5F3869590C49664923993CB2B0103B8E8A41CC5793ACD192A047972978A2EA1B9E354CB135F2AD8928574B2C14FBC1A4C02715292C9052B69AB2A8329C02938BFA0994C209F816A24EB13F4365AF2D20240EF66F9BF6B39D54AB5D350C7CB3CD6F645379815AA3028232BC89BB89BFA2C62E351A3C6401B7B384EC61A83F9056F3665E523A0C28D48E778B0314C1EC2A83EE9805D0 +sk = 46F47850E2B9AA4A6D209125BE58806002C278A6295DA7A4FFE85551529F17D83B358B243F2A622F353EB6138CC6380F8AD3340D7575E865A6CFD34BF473A3DA8B9FC961CD921452D09B3209D041D6612576C573B08422715160B891A3370268468078F5464D7E5B84B3A3793F0C7CB2A0A13DF37B9763CFBF054C768B1E65A00E8366B406251F812C5D428853D0E00F7BD58A8E348275461C1336C2AC6A39783A35D849AA9A847F37F50BE0B95F617BC7ADB28C0506C16EA3CE89AAA28A9252F0E228D0FCA732289D05D9395133A82D8CB76DB2023924273B39CB52B5A846F338B96C5B6F3ACB41C7265A0C5B13094231F05943D58875BA7C2A6889F16107D325AD1B810A0B3C9E8928169D440194BBB90F771796856F9878158A432EFF742FBFD5ACAF59521E361F448C0BEBD805A1B4435D0761D0448D83E1201A506A0B0A4980172D05E88D7D87B42054680CDA74A386027AA4C3C5193FB1A893BEC2722D55AB9B840D99CC81408153B383345192649EB99825BB4B1957326C4791A2722951C0AB67472F4841C20C23926C3C331F24C360E81977C2791FF3171C2C489B68C923B65D8EE6BD2D510E6AE97FB771BAB401BC1A42935F38A0FD43AE2F8A24D8FC3F6E15C2C6BC800B73CCD8E91C592452484B44E6B2A624881064526182950349C78C7D58180B1676B5191EB6065C50596232B9566E4B8F0635A7D71927F8EB8572E62D57996DDF66CFED2147DC3451E95C034D6B9145BC0D30C915D66B1CCE367406212F8BB40755091C9CB0306A490EF5336E21F82C1B7B6CCC8980DA28A348815112F00C57362EB163A36E016D60F020BD12B6796C9A88A8AF4E833FC4585652E76F2FF77DEED799757C7F64E07EE6E6A300DD1CBBC840AF561746D279BEAA71DEA5318AA3CB3C4C63C4A91E0FB60D6DD6ABF1FB24D1B078DE9413F1B0BFD8916577C4CC9E0B0C332625A5FB705E94BABBE0659E022234586529A194012A6E9E7650C504C380436E1DF83E5C5C9E22F79F394BC0F22A0ACF114B90829B43112FDD617089C8B9D872B70D7027D74402B65058347B56074BA33FB91998E5A559D46622F5423808C8236317767A32E4772AE66CA472EC7828D682D045835EBC5E0089B0FF955DCFB9605214A3E5087F7EE57D5369ABCFF1BE00C7BBC5B5B25A0C1D853424123C98FB330318432D324BBC7330342224BAFF909849D65E1D08A77E07D07CF16CE6F64FC71374EEFB66BF9C742E518F2E30C480F82652B81C4CE7BF42593B990980D94062F96A7178258F31E2B90E86241C04B7B44057BF4700A040B6C0B08E4E8A6BF1CB1EEF738F51CA9BEB9C19B94B1CC623704A6C2455009F48B4CDD0F4A5D7F06320457670DB92C7A4371743593600022DA4600C56296D336A52E98888818CA10282D4767010A7ABDF81BB6752048B5B163DA385D7C5CB134108ECB03398500C1612A1BD563B21A0BC7B94C9719A75BF3B3E02143BF04A7E3D9B0070C4B449CB9594A1A8BBF871E595178BBCB611B466A8677905443ABFA1601A9664C5F54F36DCC1DDF35381F586B4AA4566C02BE610186DF8493A30479F4C72AAF049A6666E806B13FD77C3B738721F81218B48984EF374BABC0156F94E9EB92FFF176A27197EB4AB0171211DC7FA954C652698C50105B5C2E9F7A2A887BFB40880F8624E1FC67B1B43A51139AC6025B9EEB60925D424BB82C58B4B617618C43C99B07FB14E5B86538D29700E1CCB4F53A52BDA2EF566B20D8CCE1D7616DC81398D14ABD03964940C794E6100DA994D5BC0BCF28B04A8971214E7AB9285515EF09A7B486ECAE5C84655C9EE15255B715C3B784D9C243993171C604A3E29450728396E7572228610BB9AC04B06577B3636C137A24E2139B48DB005553152C6B040CF0B2408248675EB90AFB66D6105537A316C7C989746F43C3B284342E2CDB5F2183A16CE71AB39C67797112B0B907C00F6A47F17DB08D924826D526CF88234A25676D82449F93B2859076978860E499A0DE134A936E35F06A7802456008C23970818318AA2B55A1762A9394DDA7A49EBB4B38469410F5945DBA2801AC25BA39A2DF819B0DB194B53C4247FA5065FF99F73E71D51C22F51FC262DD2809EBCC6879B0D90004DA5BA7CC9462F6C822AC8FAC8AB95B769A465CD743BA2BABB26958AB9C3494D329A0C736C28A9CF84F5C90C5A0594485A9B339212D01BF6910105D44109B09BD063B4F2F3B903C94DC650812AE5CC87527754D476FFA82F34F39B5462006029875712CFB1DA648DABACE5AA1590B5CCEA82C20E74795C71BB70826EF4D0BBA580A447693A42D8AF3256C64CE327B370CE576B6343F2BF8FECC76E1434D5E448AA8A3B326584DDC56496704BE54108F8572170C2BC39680598017641422BB81645959B8092E82A54C68AFF60B78BE78107E7BCACB241B09913461579B52AAC5C6C8627CC033BE2273580A523D4CB7979CB65D7056643856BE187DDAC112799559A87168AA96A18089A6C547E87DA949C62B8EA876AA0192AF409BFBC354F05DC08FED46904A2688FBA59FB71B83031A19BC8A6350BBA93552BE0C01B73C89964563FE588A5B76971DACBA69868B588BB2F9076532D6A8FB4316DDA4C85C2945A2A29B6EAD3900E50ABEF2B44375AC36BCB0E028A20CCE58353C827F1D53A9A0510E3827CBD1383A6D18C0D22C374E2B6061C2197A6CB094CA9DCB42F0418C24A9CB893C45423447CD5EABB0B9B410C9144013543E5C3BAD525377CE8073D4A5F4A22BB24874B7E21523CCA731265572B487E3B42AE581A617437348C290F00AD09460AA0C7B6A1A53128E4E01B3C406A296CB35CA0BD0D1917DFF42A4848AB3BC28A2A28044C719CCAAC45C513CA007653BC854DBDB79181157AA17220153CA3563B21BE77ACEAE06BCD02531FF5B7F5453DB0119364DC4E97AC7A495287815B5EB512129643AAC4F42B3AF35AFC1207DB0A3194302FEF097BAE37BF382C154E78154B3407BBD90BB2143BC285AF1EA0B1B4FBCD3EA373A077C6107AC2800C89F20544CB7A83BAF26EF19367724B1C989C39BCB4337DEABF7D531FE2B3327F4AB0F6457C5F3869590C49664923993CB2B0103B8E8A41CC5793ACD192A047972978A2EA1B9E354CB135F2AD8928574B2C14FBC1A4C02715292C9052B69AB2A8329C02938BFA0994C209F816A24EB13F4365AF2D20240EF66F9BF6B39D54AB5D350C7CB3CD6F645379815AA3028232BC89BB89BFA2C62E351A3C6401B7B384EC61A83F9056F3665E523A0C28D48E778B0314C1EC2A83EE9805D010E01965F9C196D2F5F90CE3CE8F552F8A0D76BA8F5345365392FEBC50560012A2985C1C4D203778597947D710DEC806E36B0CD949FE460EF141213BFC525E5B +ct = A94180C718B23E998B15D6104564B5E20E1D102DA4EFAD7A9740C473EF19F3DB7B226847DE6CB72BE56BEEE3E1BD44D0AFE0A4B55498B4475D8D936D441566CC182E0264F93A6024CF478E3658CD02DAC2C21CB6DE61F8EE7983FB6D79CEE0CC5B134E6887B4C4F79C635533A19BC8819BA2A56715825BA29836CBFC51479CB2C2EF8B0B50332DDB523008F6AD3B5EBA02C767ADAAB5D930760EB496D4C3EDD90BBB24B9CE0DC76013791565D368641F2B8F25A8660810F48E3A12F65BDAD160F3605E2D573844432509E598B3FEE53FDD4A9B83C1B187B66F5E9F2111062E74A3A7E006D638E3DD4990947E0AD370B0F29E183A7FE376C00D8A0713B02D7E1CD8132B7AFAA3FADBF7CEA991B3D9A96EF80A75010C40FA3A31153F15E23446A9491304170E2432112B84F86714A9CAC0F8B60391734EE6A94EF6DEFD30A02079DCD29D938387669A0A3893597AE4F036E1D7020F132B1AF3C8F135033D224CAA5F2791D9943C067257389DCBDFE8544981D6C1C3D5DAD7FD953372FC8910A16BCE4865DEFBDB413CEB80F13374C9D83B54B201C7F4345C97B51D22B33DBFAE34535D9F7F2AECA05D2066B2E9CA9F3C4F7D3DF5FCD1B1153B35418B7C7BC318A9E0810E2328065317F50D5239088AB28724642428CFDDD933032A72D95CAAB610AFA65C968E5381BDF0C7892D3E0696CB75BF1ABE5A14ACEE27CB73CABC5BB23A1AD12EF4D4E917EC4E13B736D1DD50C68B7AB98D8CB2E1EF75E3C1AD1DB7355B484B6AE44B5B7F963B772ABBC5B0ACF47D158853F65CEB9C8829B70481F6D531F59703F7233205806A91061E45FDF6B9EE5546CEBF701CF54BC0805FECDF48804E95956AB9041898AA623FF5C6D3D6F45EC370680F43F138FB6E36018B5D92858A29A17621D9B844F513AF8C021CAFE10687B180D7CBD9FE1B0880B6857947C55C40488F3046E76FC8A00BC4F9DA531A036AB71174AFEF52B3FB4686FA471C34DDFA2F1740A88BE223B536C4325B9CAE46E0B0479CD4CDFA0FBF05F0718052AE62486461D423E4AB819114110FC48A676BB83F3CBEEAAA474C4066CA54DE523DBABBB29DDC39BE50898077649925042F28D15C4C95BB6E745E5367242DC7650E45DD9AD2A5769930099BA2C0F20994D304EEACF8FB3C86EFBA0036D82C8E9ABB01C1F3260EF78D7AFE632261B0012EB612F8A98950018FB12AF3AA0524FAA597DB80873D2FBFED5637098CECD7B2CE5C32A51AC967F277470FEC875E7C00B895AF511D17731519439498A51940733A891E8A2DB137B06E425BB07D0D9D84A6FA70E26F09D61C8800AB74357AECA7BB223F324B9E18A2EB4C0AA1D996543AACE1882726BE7283C0220DC74EC51B6CB82755FA14AA487563053C773A6BAB1547265FDBF4DD4C5738271B410031128A23D2E25289758F4F1C0AEA20C2D30AD81DAAA919B30E268B1A44072A66B0846A436B72BB9FB2A8ED78B551257030DFE5C13B116B8EB577804CC0375872FD0622D96C6EEFB72BAF82B6429C8D7BB0D0098C6D +ss = DA6373247F33971B39D955418425EF1D1A233FAE7FB1985C0126F541AB8D58D7 + +count = 86 +seed = 1722219CB5DB47374EB0AF0232C856A57F026F1CB09E5A5799F4C333DD422FF6A0A67C4DA502FAAE727FB2D45DAFCF35 +pk = 5C405485D51FB10CB0F150B9DB466C53E070F5849049D225047BC47AA15F630A6D62C5B179906EE6C067FA3384A4C22748F984EB31AB4CD69083DA31A5B45F586560371BC99113C44D05828FA7687AA649B261BEB0EB4EEBCB8548139BBD6A0A844CA1E4E59F3D7C4372EA8632B278A7E68B59032012C5518A8021BD5367557077C9C1B4A50944EA1A834BB61004B2CBA7F6401A57839A3CB85B326449A25457851B4A2BBA2E2187F040745FB608079C8B59D2B191813D51C5C3F329B1F5E40771E1B33F63CA400555CE5351CFFCA2DDD268D7855151618587C8B037E7CA290467E4A7C2C38290B84AB8DC4A839F57102DD559114092165B13B130B41BEA2F857C84AE45C1734375A3EA91021014D29AC58F12BD5A44B91CE986E094A66089479DCAC23A6275B864195DF24F2D4A97F1B26B508C3A5BB89B9F0A913867C1294C252D5022D9FC60FFEB3FF3C29B2DD1AA97F22271C5C8E749CACEA39F2C637FF4A235882747CECA1D95E093966462AD401510EC112026BF0FBC106270988B2C35CC7269DA693A7D67052F9156D30C916AD6552EACAA3AC2396BC56668686EA8A1578E46658A71B4B7365AE56A263C783973C1B63100B1AFF4C3FEB64856A781334C6E83519E541511B4D581914C697FF31239DAC56662A145316AC4D14E522480782C4EC52B1A2B8A85F657217ED11426A2A606C01C17171FD10824C07042B189225D40919AAC5CBE05B031689B1EA61041F6091D961A8910A205E62FF21909C6B4095B270D87C9727A2B611118C84AAC033EA9CAB5F40EFAD6117F2160A56505FD775D3F415AAE9271A9B2B1FD1964EDFB772A9C4875F06826A49C26E93F0B1846E006468DE71B98AC6FC0F81AB146236739C9A7B6C13952089D621936E8B265B50DD4016547A2ABD52339DAA0B459D265558A1D9B61C73E49346396B6155195C9C3A437614E68E23143F09FD28857AAEA50AA808600F5C5CA33C5963CC00C4B1C1CE2609486AC4F1B2DDB7B06ACB62398A32320F315DABCAF5D4A833E2A01A6E7C971CA15E40C459EF18DB8452AABE1584412B4C4DC52E6004CA56B5F48555041CC828A7A6DA77C435F05574E5C25EFC3C6057443EB77993C987CAC2363C3030D88E288F4D08966E624794078A39C53ECF273DF178CB022A5FB025A2687409A785CD6C019F5761B0A3087AE91844A69C2A89C1A00B1CAEC7C1F7A67425B87BE02D80B67CA6C7DC3B45BF425DFD33DC5A13E7531907ED6329593C333466D9628668B98422C985182F8C0952CBF5052225363398E516D23678B5320A9CCA38E21C6BE86822C4FCBB9094277BCE80992858C5498C6BCC57DB982C196B1A78C317975544FFDF33E57A30DD29A5CA4A22A918746FD9A84EE1008DB920432E39B6FF182C930243CF350C6F486832A807A36C8A9242A5C39140EAA7A45BACE0086A86FE36BE28ACEC756B5E9A47225638659B250C52B564751CE8C42C39BD1046D2B6CDA70B7951707B63073F0EB5EA3FC5229F816EBF4007CE97307C6607B4CA17CA30330570D4F39BF76998147060CC04B33D4B91294F85F4A717EF9C288E3741F70FA5823AB8329F56D9D0B05C996701A050A387362DB09427D5587E7751131953146EA3591818F0DDE74E33983C010419218B08822DA9C3C62EAE1F2284801B3E4 +sk = 8747252C693A0D6C06AB66071B13517E1C45ABB370D26ABA3FB31641A170B365C5F6235D1FD688D81C72716A3921420D228A7BD5A1C48FF445C47489B8116B7CA14D3EA78B20A7B5E579C5681187A2AA8FC900557501003FB9BEAD185BA9E7939F247BF1757EA66A4392095EA90239A3C67A8CA70186047D9A6B06B8887FAE01BA8E556319A003934C88DDEB05F9F3B4964A6545E8443F57383A2BCDAFD96C794B399296615BCB9C59F8703595709724B6A4BCAD06E116F4542C4322072E3C6713015B1339512419B4DAA8C87F5A8BFF481964A8AB8A101943230F9527A10A604DF6275E1EF18FE54A57D7544402134AB77802333897D4769AC23093F9B951D735B5623452C90270A0896ED3A81BF1191E451A4A67A4542556AF78F1690982360FF1BFCFF66386827DF93BCD894AC8C996BE6E0A29DE70CCD459B9DE46ACC9E8043BB82D01C40E5785845FF4B0DDB8184AFC5E52A72E899093669A9EB110A100A1159241BDD40612A9B1955B1752810764E7B68D89704A61442ADF68108AA229E406CD10B6527A39A6B46068685B5E802CC25614492DBB6E06BA2160E930733956E7B29AB9981D4B477CD4EAB880E56EB711B278F540AC204A996B32FD06B8BFCB7729660CF5125FE1626199F6285DA628FAF491DCE2CA3BF285902350D52C0649339F31EA3AB764B90701BD647194FB27383681C13470B8D5CCB61DD74C5F666FFEA7B0714C469C4803107235599C998349B5BE7AB9E9DC6F01E928593939270411EE2490F16C54BA672EE03B710978760B962319BAB3C2FC67CD9C2E9D4C153A8717826BC4C3D6C7444C051A61A06A2C87A1207A20754E9D7725B91077766871509CCC93F5A1FC1C20680263082801F6B81E8F319B92110F2DA22F0D8C251EE4531B127C44B378DA6A0D26F55DE3285190BA1357012E42521CD1855252147D1ABCB1582422F55091B5EAADE93194CFA0BE536343A282C4A948C355984CD20A7CA454BA034AC7355B02730107A71B3986FA01FAA38D17E07494FB510E5526F690BFB27294FBB963A0606E140A182A9A247029ABDFF6BD8E876EC92207312432CC2700EC4C6A4A7037C5B612EEB2099D54872A5884E28981D794C7855590F1F1464017C8724BC92E0B644DE92B5B80A573F641E4E65BD6F0396184086D6A5A50662F9CC6241FB7241D194B6D23AE6FA3C59FE60C81309FF7E39F93F72BCB0696EDC771A80CC5FFC74138AC9D01B95DEFE7258BC555E3E28CAB6A73372337EFA0B4AA0C7D13B312A7313F8B63426C6677407903822AA1ACF4ACF4A130C4C68DD4DC47DD061ED0A4969E5AB630BAA11FA0AA51133C6509C83E603425A385730AA0E07A2BAC0754358C812F483F5CA6BEF3105CCE4CC33532116C6493F19880F693581E08999BE24DB44B84970C8FA4F6784D50614CDC9E626A31966ACF81309EA6A730EB42011663CF10A90A9EC12F3FE133A7D02CFB95CECC6B52CC08571BD03E8315532B7C76C2040B60E9021A24734854B6A3D77CBFD087015410B7322AD5D9B04F651F895AB5BFC25F8CC9703BC67DC5EB5AEDE41682A17FEB1B4339335EFAA44A64E8B4EB0BBE17FB00875A06318C1E68C42E6CE0946A59C61700A72779765C405485D51FB10CB0F150B9DB466C53E070F5849049D225047BC47AA15F630A6D62C5B179906EE6C067FA3384A4C22748F984EB31AB4CD69083DA31A5B45F586560371BC99113C44D05828FA7687AA649B261BEB0EB4EEBCB8548139BBD6A0A844CA1E4E59F3D7C4372EA8632B278A7E68B59032012C5518A8021BD5367557077C9C1B4A50944EA1A834BB61004B2CBA7F6401A57839A3CB85B326449A25457851B4A2BBA2E2187F040745FB608079C8B59D2B191813D51C5C3F329B1F5E40771E1B33F63CA400555CE5351CFFCA2DDD268D7855151618587C8B037E7CA290467E4A7C2C38290B84AB8DC4A839F57102DD559114092165B13B130B41BEA2F857C84AE45C1734375A3EA91021014D29AC58F12BD5A44B91CE986E094A66089479DCAC23A6275B864195DF24F2D4A97F1B26B508C3A5BB89B9F0A913867C1294C252D5022D9FC60FFEB3FF3C29B2DD1AA97F22271C5C8E749CACEA39F2C637FF4A235882747CECA1D95E093966462AD401510EC112026BF0FBC106270988B2C35CC7269DA693A7D67052F9156D30C916AD6552EACAA3AC2396BC56668686EA8A1578E46658A71B4B7365AE56A263C783973C1B63100B1AFF4C3FEB64856A781334C6E83519E541511B4D581914C697FF31239DAC56662A145316AC4D14E522480782C4EC52B1A2B8A85F657217ED11426A2A606C01C17171FD10824C07042B189225D40919AAC5CBE05B031689B1EA61041F6091D961A8910A205E62FF21909C6B4095B270D87C9727A2B611118C84AAC033EA9CAB5F40EFAD6117F2160A56505FD775D3F415AAE9271A9B2B1FD1964EDFB772A9C4875F06826A49C26E93F0B1846E006468DE71B98AC6FC0F81AB146236739C9A7B6C13952089D621936E8B265B50DD4016547A2ABD52339DAA0B459D265558A1D9B61C73E49346396B6155195C9C3A437614E68E23143F09FD28857AAEA50AA808600F5C5CA33C5963CC00C4B1C1CE2609486AC4F1B2DDB7B06ACB62398A32320F315DABCAF5D4A833E2A01A6E7C971CA15E40C459EF18DB8452AABE1584412B4C4DC52E6004CA56B5F48555041CC828A7A6DA77C435F05574E5C25EFC3C6057443EB77993C987CAC2363C3030D88E288F4D08966E624794078A39C53ECF273DF178CB022A5FB025A2687409A785CD6C019F5761B0A3087AE91844A69C2A89C1A00B1CAEC7C1F7A67425B87BE02D80B67CA6C7DC3B45BF425DFD33DC5A13E7531907ED6329593C333466D9628668B98422C985182F8C0952CBF5052225363398E516D23678B5320A9CCA38E21C6BE86822C4FCBB9094277BCE80992858C5498C6BCC57DB982C196B1A78C317975544FFDF33E57A30DD29A5CA4A22A918746FD9A84EE1008DB920432E39B6FF182C930243CF350C6F486832A807A36C8A9242A5C39140EAA7A45BACE0086A86FE36BE28ACEC756B5E9A47225638659B250C52B564751CE8C42C39BD1046D2B6CDA70B7951707B63073F0EB5EA3FC5229F816EBF4007CE97307C6607B4CA17CA30330570D4F39BF76998147060CC04B33D4B91294F85F4A717EF9C288E3741F70FA5823AB8329F56D9D0B05C996701A050A387362DB09427D5587E7751131953146EA3591818F0DDE74E33983C010419218B08822DA9C3C62EAE1F2284801B3E47C3991FA7983D0DD6E7157CFB152538466E9D5C3998A2B8ED862162B91CA851CCE7683F8A03D3CF04E46970FF7D6A12494AE12558346DFC8FD9370BF944A0102 +ct = A4DB79E6DA55191F585544DD32928AC432171953F3A57EAF2FD786BF1641EF364CD03DCC519FE94C40AD5D3851A820B90C43EF631F15A48FEF9191281DDA67EF23C6AA3093B26C36A7B6F69A86DC1828498540AE4F6C1FB170387D62EAE9B73313D39D07E94A903BAF6DD09ED3BAF005A9E35C7C87CC6724B37BB80FA2153F150F9C811079D3D545BEF636476FDFCE30DC32561F41FDBA2EF7B4F21C58E1EBC033F5C457FDA302AE3D32FA0BCC4F3CB0897AF041C562D48AF1DA6C9EF4CCB651335A825394544BAF7D8914F0CE818E68D711CCF45B9873E108C48AD3876AE59DB02B553B6581B9A5BE72D31CA4033E4CBB767C1ED34D3356541A113D2CF60ED6BEBE3134F8C0A9BFE30C17E2F18FA8E308BBA726429282C7286D0904BF78925B09CD47973566DFCAAD7DB814A3500181EB93D438159358C075F4CDC270E14D74CBAD91A493F05AFD4C8AD851694676103FA00C156E5EE3CC4B9F3C6762E3E5D5AA4E245568BB730DE5C2E0E32EED4310D9FDFD30C68A67ACA0BB692BD5453BAF3056BB10E031CA15B342E6DA3D891FE40DC17CB6ADCF6B3B72943ADDE54D7B01A5BF3A129DE2846817D7C2D9054158D08117A69D5A7A0DB6ABA4286DA7D76E85AABEFD343BFEE54395B046AA35E3F7F5648C84B5C1B6610406FCEBBC01CE448BC8D533198BED851792582FB421C55C5FBC989983D978AA163CC88E01C12437CE22C58A6B5186DD0652417775500146236E12420DDB24054E607E11180A22687744226CEF0CC55D2CEB94E1C0675CE338F2537A3E60C126A91A81702DD3FE1FB7C2FB310571FA3DADC83DDC4B18B1AA5707E907142311FE4988196EC6B48814AD55A0EE7724BEAC278C7D68229B3F63357D81EF5FC16F2C7EE9E8A8E7FBF7FFF7B958F0592C5E1246C6AB95474DB7183FFD15CCD227DA5DD1A3DB842814AB5D4B515546BBEDACD42E4E9ABBEFA9416AD009BB072B5D691C1ADE296BE26F87FBCD82EDA2C93AE73AD7171D1EF1840F26014D8F152A720C47E24F15209E2A478DD7DB0EDDE040403A0655804720F8643B86F37776A2F7DC6B478D77A87EAC0194693787B6439F4B045732866237A8A2EBF9934070737B89DD2AF08C59BA182EB239FCDC476495AC756FAA7451C719156C1DBE099FA7BAA32C16156F4209C9F2C66544CC54DB33BBE0EDAD660CBC13E69F4D808BA98A7854CEFFBB2CD50A5B727762038A216B8B5E85DD01E138EDF154DCE1DE6E832374F0A0614390F76D1E658277FB909C1E95B4E81A9D6852DAA5368281AB21799C6898C07992BF5F7EED402522449461394C87AF555FADF1932DAB0CAB6CC80AEA73340181E91FD99EEB65A013B42F577D9436C75A7166BBF845EDE506AF88E6B1F915EF43043627CA208435E805D5588F4265346A7DAA1C9EFA72592FC999E84E49E6E0872AEBACAE9ED89BCF98CB40466AD61FEEC016E629527923430C13E8CA8C009EBA5D307D29BFAA6E1E6F56DED592573B75FEFDA3955317126A9B2869608C32701FF0F62447D1369765 +ss = 037452D74A46B60F415DAD3498ADBAC608DCABE4EDC7070A358E7325C72CE76F + +count = 87 +seed = AC139B78FD16CA0F26D6D7F9E15345C888D857B1910CF38D883339B37EAD2DCAC30F7CF10176F23FF34B4488EB79437C +pk = 7E395F02D56D41B5C5889BB6B2F149425A2AC8AA06FF23A82841887DE199B56C91846392A026B50E87453F44588EE6AD4A443F54D25ECAE39AAF286EFB47A760DA01B6C13FA178811C47A0DFB14110FC6482543E8A3A52ABEC3A8D7176AA2868B2D46CF68538C27514222A34371C25FE832184206E5ABB699D61426027A942581D0BAB075A367793C81B7FDC11E2F6772C8040D271BE5D07D00B330A6C874B46D26F51DB8F43F22DFCD72613F8C22D15C28A2B384051142C148B07F7362EEA4771959B635A215B1351F650342D2A071ACB16DD8AB50539096F295E44173BCAC20F3CB271A8041E3008A742057EF2FB2D78F8A3A3C252F6D38D8E85BD57A75D45AB4DC21B8033992CAA623866E8989F98560DE33004D3409F233020899340B2591E1A4A0223A79E20B4B85C632CE7609C0C45A0246251468C1B6C20716315A54520C5718F4C5C7066331FC7E953ED91AA5F3B92E69617B29C256657124242AE8305780CC0CAF00C92896929A1648BE9B47F86F144A3B12D9DD51F347875E6DA935F0BD043ABBFDC7B85066A7836D442872C56FDD41D9A3A01D9AC6A12531079F74B273CA129F36A7AE463F6464436E50FA70CBC2756BD25234893B50A2898345E588B819C0955E9C50072517D58B0A3E4BFC9832B727C7F2FA924AC672D4D104A8F3AB81200A624C61EB6AA7B4553AEB2084360F1C03E443AB99ACB63AC699443A638BA9B8013C7ACA95ACEBC9ED6B12E8BE5A6CCC74EFEA7CEFC7A0F5EE18857250D08F03CD94CB4C455141D7AA2FBFCBE3EB896C2404BFA3580BC63B73265581D87618B206CAA9468C65BB1863B18F560413D1B1D392259F37C00F7D89124C56913483513006FEFF89092F218FDCBB8B118B206B64F2DE52BE0B553665C32831BB4CBA3762991716BE65E6A222B30A0A5CB246207352732BC3C8AD7A2C3243C62424AF222A922787F7FE44DF05299DA1105F9EBB0C5AA18B6C6C73F43390AF9C2454442110AAB4AA629C8F300DD38318C43A25D269885F970DDD8AC1E5918E59A3D53DC8A44873EEA97C31F34108B893B634284D69153779230C28B2A1636B6B839A4D91B7E23F0414B111F2E7C1B3ED58613120FEC37C78308587494233313950D82CE946778E044C3D245A19C29B09A80C3B55416A811AF33032A0068C7A4767F05E9AAC3E8B99B967F88D5281A38B072B8C4E194794C40BCD5366714525E846048E55C008CB48B5EA0C61655B8819B08FBB88337E20D63003F2453462598CA66181ACE033C707C1AE9760CED165596B2B163E54934540C4F7097BDF14D29EA850B95BE6FD42973436144270549A81B5F73192C2C6AC2474686A9A3EE556B6F26A9039866176026E25A60B5864E963850CDC8219D21859B5C5C3714434EA53BB16786DDE8036F317C430B3BDB025E6B62C097340F1E961B90E0C5182183DE05B293A05B58DCC251D8A2911C6E71A635F5179D06D93D33D8CB332C8B835C0E2973261BDAA43E414153118B66C641F834C949E77FCDBCB59DC27089138A2E07A5B40C7666794FD8E6B97685BC4A3C2A65912C35F50A278BBAD765C8C775BACF28181D61530E54AE7FDCAA2681A01BF51C0D7A033D6B005893B98DA86005381F1C6E600B1787BBBC13A01210C0764A4A2578D4BF90A24704178F06A4E4B110F5 +sk = A32B081D2579D7737A984126B05465963AC3D0FC3D471B94E30B242699AE3EE7A305D187D9371AF3568D7BBABDC30CA69BE166AAA07C67799DCE7345B2024EE41C5A6F35733CD12EFA19256DDB74440829C6B52AAA25B258BAC8D950CCDEA410535BB3A44A46EBC44F5772CDAD96596980C32A14916CF5C4A2FA8538491F7EEA270543ABC467344FF098EDB4762F658B6B26431B9863CFA7546C1489A25BC9061B8CA0165528241B4BC173BF17B4E7873A5081016A1C55E4BB1E7F71B849274D03E05E866656C126485979CE9660AFDF3622E3051F76D02243E660A5A78C663880A7F9765DF45410926A86ACC7962878B4037CF2960B06F072367B476EB24B8C57924A9C699815BBEB0BB10B2A88B0C63F0171C759D59CEA91C5C043A41A8155E462325893685F18C5458A0AC3E5BF2C696C8F07727C090E1D3502D075A706551C54A00A710027C52CBD83FB9DBD7567ACA2B6EB809C00838E56B209E0C5AAD2E6235E2C157D3659D906452F4A8C60B26F838A51F6789E42C00580E4595A5C0A12B796CB44240A4724C298ABFF1332BB0970A3EC475A434EC4DC2A4AA92C42E22035A4499C66827C882B542A8FB22B6B6054984FDCBD6A637583145010D89A4654BF0BC0A0C3B86788459B659A539833629C1B585A13134D766C9E8003282683AAC1486A934EDD3A7511319A7952B5EB7C5947B69AB5C904B2481A7709C95BCA352DF45E8BB87775A9CB566581C3777E7B975C629C89063C8F0E982A24D344EE8A22221A02C6538154217C453AC0ECD4BB1F820BAAB94D920765C4AC15972AA79BA974F3B5055EFA7FE5BCB454F7AE70E1C017322A20C73EBF278054060687C6301E13B52952459C56BC8D8795044302FC9123921143EC2C73278939826682126B65C7D9BAC044AE6CC7CA40F92C8FF28470E41D51895ADB53AE30216B1ABA552FCC14AB277A872029F3DC8D56794D842BA06770808F1C097787973B0A14280C5FBCC45C102C23821A07EEA6C3ABB4B52AE116F4B38E4A50CFB849177766495463197BCA3197B53AB72B172C163003C9AB89721EFF925F56B59373F5ABD1430B0731419A12BA80641628D78D712BBB74579C0A18A4CB2AA6EDD76FD7605FBF8214A00AA44E486810F3AC6E36345431C23F247F251112CB8A6C76444B1A5277B7C68AFD2C49D4A81FC5069B9A004CDF0587A4A193D243BC5F16357E1B1F280706B4C16F9D8B3B6A5815A1597C49076589D5303A5C89AD320CF6042F2F819CDFF04B850870E807B4F2B6BF99AA8F3FD16E95B3BEDF247CDBDAB048586116DB7A4530C360BB240FB2964FD41A5128CEE9FA6AD434B536345A49BC758D849260B78CD9F3B3E8461CBE906E93B209742C0ABEC1C1BBA9BAA05A8FD05637D26548F48512F5477B93D0BD54F6674158B2F6EA0488191EB023A641B175CC689A2F326214793228138D6DA03BFE4466DC962FD2A7C57102CF3F96CF3A6619D2F613CA063A35F4515C0473140B8EC3C53B1D9974021616BCA2459BC31502DAAFC861990C1B97EA1AB5AE018EAD781A67A075CC4924F9EA364BEC33ED167637F0A643C3A810914A49366AF69B3CC25938E77422832B7078C6BE562513EE3648758515E3C04F7E395F02D56D41B5C5889BB6B2F149425A2AC8AA06FF23A82841887DE199B56C91846392A026B50E87453F44588EE6AD4A443F54D25ECAE39AAF286EFB47A760DA01B6C13FA178811C47A0DFB14110FC6482543E8A3A52ABEC3A8D7176AA2868B2D46CF68538C27514222A34371C25FE832184206E5ABB699D61426027A942581D0BAB075A367793C81B7FDC11E2F6772C8040D271BE5D07D00B330A6C874B46D26F51DB8F43F22DFCD72613F8C22D15C28A2B384051142C148B07F7362EEA4771959B635A215B1351F650342D2A071ACB16DD8AB50539096F295E44173BCAC20F3CB271A8041E3008A742057EF2FB2D78F8A3A3C252F6D38D8E85BD57A75D45AB4DC21B8033992CAA623866E8989F98560DE33004D3409F233020899340B2591E1A4A0223A79E20B4B85C632CE7609C0C45A0246251468C1B6C20716315A54520C5718F4C5C7066331FC7E953ED91AA5F3B92E69617B29C256657124242AE8305780CC0CAF00C92896929A1648BE9B47F86F144A3B12D9DD51F347875E6DA935F0BD043ABBFDC7B85066A7836D442872C56FDD41D9A3A01D9AC6A12531079F74B273CA129F36A7AE463F6464436E50FA70CBC2756BD25234893B50A2898345E588B819C0955E9C50072517D58B0A3E4BFC9832B727C7F2FA924AC672D4D104A8F3AB81200A624C61EB6AA7B4553AEB2084360F1C03E443AB99ACB63AC699443A638BA9B8013C7ACA95ACEBC9ED6B12E8BE5A6CCC74EFEA7CEFC7A0F5EE18857250D08F03CD94CB4C455141D7AA2FBFCBE3EB896C2404BFA3580BC63B73265581D87618B206CAA9468C65BB1863B18F560413D1B1D392259F37C00F7D89124C56913483513006FEFF89092F218FDCBB8B118B206B64F2DE52BE0B553665C32831BB4CBA3762991716BE65E6A222B30A0A5CB246207352732BC3C8AD7A2C3243C62424AF222A922787F7FE44DF05299DA1105F9EBB0C5AA18B6C6C73F43390AF9C2454442110AAB4AA629C8F300DD38318C43A25D269885F970DDD8AC1E5918E59A3D53DC8A44873EEA97C31F34108B893B634284D69153779230C28B2A1636B6B839A4D91B7E23F0414B111F2E7C1B3ED58613120FEC37C78308587494233313950D82CE946778E044C3D245A19C29B09A80C3B55416A811AF33032A0068C7A4767F05E9AAC3E8B99B967F88D5281A38B072B8C4E194794C40BCD5366714525E846048E55C008CB48B5EA0C61655B8819B08FBB88337E20D63003F2453462598CA66181ACE033C707C1AE9760CED165596B2B163E54934540C4F7097BDF14D29EA850B95BE6FD42973436144270549A81B5F73192C2C6AC2474686A9A3EE556B6F26A9039866176026E25A60B5864E963850CDC8219D21859B5C5C3714434EA53BB16786DDE8036F317C430B3BDB025E6B62C097340F1E961B90E0C5182183DE05B293A05B58DCC251D8A2911C6E71A635F5179D06D93D33D8CB332C8B835C0E2973261BDAA43E414153118B66C641F834C949E77FCDBCB59DC27089138A2E07A5B40C7666794FD8E6B97685BC4A3C2A65912C35F50A278BBAD765C8C775BACF28181D61530E54AE7FDCAA2681A01BF51C0D7A033D6B005893B98DA86005381F1C6E600B1787BBBC13A01210C0764A4A2578D4BF90A24704178F06A4E4B110F58AACD8940FF6FC27F175342BE74D48075F8AE9320CAE20A41C879C27C1BF815D7F7054814869CF7625E45647BC1547AFF288DBB90699B2AD84893F3B755D9722 +ct = 9E0D9479CC0C6672A85DFCAF8C259CFA1CF68A93825FCAD76CBCE06FA3E40EFC821CA036B349FE50EA23E7E22E1C9CD7F8A930F2DC42F867E33884D0CCAABE685E7A7516CED70CAAE58FF50151AD1932F41AF9BDE629F2E96B3CBB7592B178699179E9CA85DF7FD2BBCA8DE9F30AFBE3F8724D77042DCFB19C31CF239BEDF529482BC947E85334ED7C541B2CCF368D2EFEAE1582A0622AA52C24905EC634D11BA0D1B20A946F2E571DB7F867E8EC9E3DEEB544C77D20CFFF9A0A44CDFDC42CD972A01AA8822E0BC728A66EBC0038A7ED1DD7BEC0E0E66CEC422385E0DFE33657EED638341F08BCD32C6BE72EAC5A378BCD02ADEA563734105C7EA803ED2D6260993182EECA13A4A3C999A209E78E4D64ED1E4D7BBBF91A72F02F760B654895C6398F3DD7D270D28133D66C13E899B8EC69A70F5983B539F975EF2294651305DCA09ED622CF151E337A7027145C9B3AF2849ADA810A96D391DC6F4FBDC1745DD30BD358EA3507A55F2E3C19A7F27D212397148C52698B59EB1477F8C6CA3FA829DF3447FFF20F6AB7F5EC445124F29C5F7B79CBAB1B1D23E8EC69EDE923AA3E734B9C999337014E813BC9E310C6850901993133F11019C95E1BD421896E3D2460E61DA9A6A64C7EBF0376395F509AFDB8460420F26ECD066F33EF121E41DFBE769BE03E25716D7F347D9E9BC0BC65A579F5508BD0562B9AAFB98A9B2E5986057632CB409FF5C10FC3D40CB5582231E5BBB4BE2871B8EAD348C1B9D9E81B876D70D03B9DDDAE0AF4DD5CC6F898817753B35EFB191004229B0754E69C9428AACA4DAAC582E1DA39B5983A5A4DE38998D26197A4171F5D6C28B90428522F50FC212A923E90D1E2005348A5E47E6E6F6D005788D2B455A3E35349AFB822AB5F4F1B9F696E0B186DD2B66A9236179763C639DF4CB6D4FF80D3B9942421D11DA771B184EDE6AC47F74A9250B7AE35B4BE975211A9E12972871F702216995DBE6E39688EAAE21EEA262AA89EAA8A8434120FA4252EAD0BA0FFC4F53EC1AB745A171A0F73A60D84B023A4C4E58F173F0C3455C1B056988897C2DA23D6CAAC0DE7A36334E5AEA093C5D6485CCF06F736CCB18DCDBE853FE6B9441545DFC3535F16D936ADC69B9D2BA08C8CC6DAD333190788EC3541E4C19B38D4319C0038F5BC41D4574141F819FF48385F45AA0DD7F6D5CD5E70E05D3A4366F9878E74BACEE5638B3AF0521A50399043C856E9F3E4ED2951BFD758662C82F8AC8325814349110D696B84ACC146AB30C00484B241FDF4BE8D179F6C8B618F8FB35340AC61FB9E221DC9226A1C59896389B3E24FD844197550016A53C5CF67D7A9F8FBA80B7E61B4E39D36CCD32C7EE8948820810811ADA941BE1EFF722EB83CC69B42C396F3AB0BAD3118C708C51B73D41C9C1DA494C0998C183AC5E592A9E0663753584C0364450847D906F5A261652BE33BC0CD359A732B9D1696E245FF04252635540996A57D8A625D37DE41A80EE1D51770777E709E673E31C83C739E2173381F4BA99D8E7FBD6D9D31 +ss = 2CFCF5FA2B4C0AAA85C6069616E19E6715FEC913592D6B8F57EBA9CB4E3B162A + +count = 88 +seed = CC7152849C98D5FED2813275D32069E44824ECB14EAEF425CE017448CD9A401C91C06D0F7EED6D22B7BBE8BA6C429EC3 +pk = B5D6022EF207E7629736D614527619E33CB92600A1E39A20B25A5B16EB0EC1070E5D566B28449BFB38936F44721ED428CED5768EE647A771B7D76A30C7E5563B515F5AA89FFE994CFFD9277B0695049C355267B3A07C61F3C5A2C0D4AB8DF76129C19F44F762B51BC0374A43E6F6C1155901B2430B2B77AFC9BA4E14D3658607387DBC2D12B99EC0C0B0C2721AF298A6EBC92A7E6B97BC460674931E21F68377C8303B24CAE8D5AB720C79C4399414A514254603B565397857A7078B36E24A262CF9070A92C034C76614D5AB455B60B3B3388500946677195CD587942342A6FC91BEF144EA412ECE186A422B85A213C43FD0C361AA00698458F5C5370C6C553A9C238201754E2B2E2785BB03053E0B414E472087A0276BF2D805CF477378CA34D8F01C21B433F33B49A8B9BCF762451460558FB9C3CD071E654C250DF04B6541BAA278C1669BB49CA3AB4C78CC92D0137A2864BAE0C904E23AA28395EDCB435D9C1CF742562D603BC61C521145CA16F69192B137EE372F04402527BC557B754E187355A388410751267561A6B1F59E04190EBC604FF64A2B08B244B57ABE84F18938C5A9ECDC972191BBA33915C653A84B1A970AAC7343AC98BDB7BB877A3170E8B1E8693FA5089F421281B5763865C584CFDA6AAD7482D00A0520D947FDDB173947865FE178F9800570D4B2B9529A42A514A8691C8531A271C18E5F84380C20CD9A992051D29B5BE76B2235B511514904E3B284E8854556334515162DB1B09894B18A3127982269509BBC5E8758015A5B810569E544BEF9398F7D195A50A958DD78BDA187CEA0B7B2BCA04E2CD90DB634A3D52B734E224C4C60BA3C8240D7B2755AE5892A09A0E7EA1B2424402C45A0AD59563AB97ED906A1A15B8C4412219203CE6826B91DD00AD602089EBC5163B416C0D02009A7A5440350A00A7B49309CE39BA26DF79ECE038F23F4B4300C01287A51F5FC619EBA04AB1B78E6396BB23C1CB86A0F3BB11F7D31A161A480B8F33734CC63EA7219D76BAB759B1AB3405CA61B535B893B1BF2B678849751A6A4F18923EF44470E543924D0C462D8A078782B80241334F547D2AA474D95B8709747162B228993BA15A0C4FBD8BD662A1A2F01CFA859CA723A011949823FBB55947B9C27C2BAD547B0E6D29665071B30F3C8C536651E6437C0D4A314AB38A8F707928C0C2B864A3A67397A936DBFB98FAB2C0935441B83157D05072891A43573882BE97686534C8BC7015AC267B75F0A79C6991CB6C96C735A4BEA90ACC9BB6BA1B12388F0821A074018909F76944D9295B5EFF73E70AC1B0E1644E3A40685305F8A0626B2F05969FBB4CAE07C61F6213159B3471654A88AB58EC3A648F2944625820F6592C67126BC085DCE216FA708089D4947AB911AC14C00E53782A01580FD967594E0B2B2A3272D590AA70C7A3F419ACCD33C1B1294D21242C739A3E8E577316C23EBD4B4C4D0577B2BBB12CCA71841B54C0B76729320BCE26DBFE5BBC017C92491762A6C938D4BB0099AAEA190813A3A78E5685D83975050D719D6B6A80AC313D3018D25B9054B5013F832C1353401E6CBA3FE527B8D2906871B79836CB35284725E733D8FB60E6A8410E5F61428A3CF9C25FD45802D5699F33205A71D6404704483BD2C82E92BA9457926A45BFA0985 +sk = D1F46E67CC5AEA63CA9EC413938661C2F8156CC79E10A64174774545B597E91A8CADB58DEB15B27F343073B071873870BF858B5FA3AC3689698DEB68C570406972210C2B9909571A12753448E00E6A0C165A101469828E8F60A16B55478C8899D9A38C1751BF220A60A999B0D2A429B375137DB8BC9B85AD5FCC073355AE630100F8FC68EBB8534135590CE22D0A0672AB54936C8665AAF476B50293A32135283777C375767B04547501A53B72A14D3C4DE4E001D16B2B2B598A22D784A3711C39DB183AC82CF895B242954B41C713BF464464917D6B608D21B67B3519A6DF161AD237359E262B95C6BE3A8522B9248346785FD0DB03CD083A21092F4D91AF156B12F4C9C77C11CC0B68ADBDB813BEB21289743758F8136661704D0C5CA9302A064040334017D47815B7C35363F5C730298670536C69C122CC91CDFD18783EFC4C39C8C29CB1023F1488A7469F1CFC1D7EBB3D1CEAADBA3B07310000BD89C043290ABED896E655CB1F43A1C7335AEE30044D9652E6D3B8E394218F63072C7050A2984032C45735A3AAA4108AED8B9A19C13B9BAC28CCB123D9987C45B91E89B7A949B5B4AD56ABE4237F21DBBC53AB651BD4B703069F82133C54ACC1AA415DF9961A4785337535869FB758CD04B798907E36197EA428C66AA516F602404E87341E154A0E09C881725CBF00761FD9645B658D97D21F33059E4A898DEB0C826D9057AC302663897D71567117FC4416C860775B026E51A52663711868777D542F1224B277EC005F2BBCFC0C84146591CB36CABA82692B010DE229797CAC57AEB64AF446A896527BED9B3E55539C0F6A0E9ECA5953890B95B0B282C3A4C46A44A8705A54A8806CCC0D3C736A20D34AAB118813651D85F12906958933D69679D0457A4817DC83B525CCC63E94C1BCB1C869CB3A0BC46D47084481C2563754AA8F44682B870ED04996CB8886F43B91AC8767AE12856CE5B85F55C8802830BA1BABF5797D0DA723EEC24616A195AC809371D93F89B19C874C840EE9C39E7370CA561B6E91552CEA47F1D09C9CF633E7CABC9EF85F89D01A29D9CFCA8143BB05C3015B3C6035AFDC45AC7B08B5406566BF864657BB3A82322793906462C03C20969F76C2C8C8EA2622A373C3E40164A77055EBAE05787965B60A861C09658C32D4194DCCD7AB1DF87826590890B1785F0385B965B5AB3B870A0088696A783B5C7A69962B86F789BD43588705315258C117C4313198AF42E2B7FE39894A86189FFC4E8C6BAC5E7A0F03D86D18089A6999972F309A6DEBB365781F64197165D259BDA98C7A920A9E790BDDC587E7C08040D649B8B08FBBF36D1904970354410BD77B87889668566CDF4A94E1C65B04D33C269C5152B049850857308BA1310283A976A31DB34722E97C97DA85D14372E14A8A95BB45C63670BD7712686200D451CAFE599AB0D3A183D2B0DF7B8FBF0995042BA0CE682EBA8B71DC6C0744262C75B7638B51B9C4931D4F7C842328486A799D06027CD5CC75E4B1B6816C2AD66B86ED047EF978184BD344C00AA1200432C5D142246B883B5B85AD5CC8F8FA994F4A790F3B6C201353F77AA9B7E9BB195375060282B7DA42ECD36295FA55F8B5CE94B812BC421BB5D6022EF207E7629736D614527619E33CB92600A1E39A20B25A5B16EB0EC1070E5D566B28449BFB38936F44721ED428CED5768EE647A771B7D76A30C7E5563B515F5AA89FFE994CFFD9277B0695049C355267B3A07C61F3C5A2C0D4AB8DF76129C19F44F762B51BC0374A43E6F6C1155901B2430B2B77AFC9BA4E14D3658607387DBC2D12B99EC0C0B0C2721AF298A6EBC92A7E6B97BC460674931E21F68377C8303B24CAE8D5AB720C79C4399414A514254603B565397857A7078B36E24A262CF9070A92C034C76614D5AB455B60B3B3388500946677195CD587942342A6FC91BEF144EA412ECE186A422B85A213C43FD0C361AA00698458F5C5370C6C553A9C238201754E2B2E2785BB03053E0B414E472087A0276BF2D805CF477378CA34D8F01C21B433F33B49A8B9BCF762451460558FB9C3CD071E654C250DF04B6541BAA278C1669BB49CA3AB4C78CC92D0137A2864BAE0C904E23AA28395EDCB435D9C1CF742562D603BC61C521145CA16F69192B137EE372F04402527BC557B754E187355A388410751267561A6B1F59E04190EBC604FF64A2B08B244B57ABE84F18938C5A9ECDC972191BBA33915C653A84B1A970AAC7343AC98BDB7BB877A3170E8B1E8693FA5089F421281B5763865C584CFDA6AAD7482D00A0520D947FDDB173947865FE178F9800570D4B2B9529A42A514A8691C8531A271C18E5F84380C20CD9A992051D29B5BE76B2235B511514904E3B284E8854556334515162DB1B09894B18A3127982269509BBC5E8758015A5B810569E544BEF9398F7D195A50A958DD78BDA187CEA0B7B2BCA04E2CD90DB634A3D52B734E224C4C60BA3C8240D7B2755AE5892A09A0E7EA1B2424402C45A0AD59563AB97ED906A1A15B8C4412219203CE6826B91DD00AD602089EBC5163B416C0D02009A7A5440350A00A7B49309CE39BA26DF79ECE038F23F4B4300C01287A51F5FC619EBA04AB1B78E6396BB23C1CB86A0F3BB11F7D31A161A480B8F33734CC63EA7219D76BAB759B1AB3405CA61B535B893B1BF2B678849751A6A4F18923EF44470E543924D0C462D8A078782B80241334F547D2AA474D95B8709747162B228993BA15A0C4FBD8BD662A1A2F01CFA859CA723A011949823FBB55947B9C27C2BAD547B0E6D29665071B30F3C8C536651E6437C0D4A314AB38A8F707928C0C2B864A3A67397A936DBFB98FAB2C0935441B83157D05072891A43573882BE97686534C8BC7015AC267B75F0A79C6991CB6C96C735A4BEA90ACC9BB6BA1B12388F0821A074018909F76944D9295B5EFF73E70AC1B0E1644E3A40685305F8A0626B2F05969FBB4CAE07C61F6213159B3471654A88AB58EC3A648F2944625820F6592C67126BC085DCE216FA708089D4947AB911AC14C00E53782A01580FD967594E0B2B2A3272D590AA70C7A3F419ACCD33C1B1294D21242C739A3E8E577316C23EBD4B4C4D0577B2BBB12CCA71841B54C0B76729320BCE26DBFE5BBC017C92491762A6C938D4BB0099AAEA190813A3A78E5685D83975050D719D6B6A80AC313D3018D25B9054B5013F832C1353401E6CBA3FE527B8D2906871B79836CB35284725E733D8FB60E6A8410E5F61428A3CF9C25FD45802D5699F33205A71D6404704483BD2C82E92BA9457926A45BFA0985149E0B6B49FE8ADBA1217C2C57C83F2B8C5F1D92F319E502B184A65869214F75D82C2F1BF2E6AEBDE5660FA73356982E12999D8FDAFBB3CB186341D0386DEAD0 +ct = ED5E2079428744F1871BCB3803773997FD3CBCE4D574D7489A7907C84716AD220EFF0C0CAEAF0F784D0A633F8724D0D70A4E40F115C49BF1C5133A3A99A5F6027BF2BA7BDBEF436D1D8E4A9DDA831DA76E127BFEE0CE3C0483646402F789205D95D406421FEFB2C5A62D60F4C47FFC7C3AEC46BE075BF05FB6336C78B098F47BD1B368F2E5C3DA0E1732F43E67C14C556EC3F7D977B70491A35B5539B8532CA72CAE5B5B8E9936A6FB3A565B535D33EEA5C1B35A5DA0F3BC589B109CD12280DB6557377E9BDDD74B06E583DA873B78F96F323DFEF547D6EAA42D4E450E7CD213DF9B598C9D2134DF772E64CF09D7084ECB4DC6FC079E6B736C2D4B2FDA87B9ED23000E8558C90F5CB9278FFBAC209702CB4F3228944067CAE55CECCCF609F126465754D1040BFF976623811E7A9A1CDCE5D9001074DC30935A06B6543FB5B1F4943961B6330FA0138604B1102DC0F0C643E409EB350E15CCD2EC73280C73DC513E30264EC961366EF741D9CED8F116FC73728AF6CEEC1B61D934124522068D063D5E9479335336C33B7D8EA0EAA02F2E20D0BA7663D863EC198C3D4DB75F0787EE80AFE016BA37F15949C2E7B84B72DC88419DB17F2E992D0E89C451200AA97372331E3A8237BA5AE4B527E33F724F45A8507C22532F064E6843512613D762E5DE7B0FC41670089C15D2F78F8EDDD1DF63D350AC99708459DD6B667E9244D6CD1D3DA09D9B0A194E2E169D5EBFBA9DFC84E62F678A3BF6F0D7BA198B8A1DFC9023AAAA06890FCC8ADE8769C0B049C3143DEC8282287C07C9244CB5CF4592E48CEC9FB6DB7B26C394EA09405194845588F8F29D872502C81D55D11DE84C1507C29F7EAB440D3D5F9D43806E2C3006E3A716F39D9B3DEEF5FB68D3F58121DD5DDD0FB2DF785B6C6A02FF04DC67DAB0928D8CCBB8E8D60F48214F4BB1BC770E940501491AF59F951740EA8C052BFCDD5F22082C46AA94A0E0279AACE1B3A8AA11EA177F8C193E1530B65033F0DA63E1396E5F094EE8D87E87B0738804FEDBA103C38B2422C712B48E1C9515FFBBB7808516C3985250FDF5727E4B3799D242977E9DBB35EAEA63971D2807EA18290CDA801A8654D3C6035FDCE27009368846D18EB5C80615512ACE4C93448552855C4901AC2D3867FBE4A1279CB9F63BAB8348E2128D8435A09DB1ABF5112E8D72BD5D3F77A93544021EC281494267EFD97CFD2B21881DDA6C49CDDD56BBE77E80BE8143C1F38FD47DE797F45A054DDDE6B3117F5D02F78222936D7D3B10135C0942812C049BCD5B257B7F6AC111C92E43C250536B85171EF4337E1F7B55CAE372C943226FC29A06B2AF4D2B69A6A68E91881D6781806510E565CA3776204ADED42213168C22E6D33F167CA62E552F057D8F0D3E0648FE810D5514C5BF4D78410CC41333313716CCD5F0B5540E9106F7D0813ECAD7D180AF071464088F6D233B606C495D78B372C16FE8F94CD574DE08C7369195620704682D7F1465D02D04A87CCBA9BC55BFBF2E4EC387B84AA70E8ECD6EBE7870 +ss = D3551ED0FD716E4887C82A6F24C5008BA80A9B5C3FC9E50F188EB224BE8102C8 + +count = 89 +seed = 96D9A06F88FF2C2036FA8E914B89C765E4A510B468DEE40F914F78858C811857EFE9FD0E17C0048E7389E8D996B7E2B0 +pk = C55170FE0945513748C0ECC9098A02E9D51E44ACC267272633645AD562816D479466B54D2150AFB682B4F32265F1F4BCED21CAF7C7980105B08056CC4192BFE0DA9AA5E00864B0A34712204CF6AE82DBAD360A7C840B4804826C39A59AE029056C1B2542B6A589EB47C14A70ACD1731BB0A4D657656915B91D696B2F92AFD82245945C7B77958A5B6A3B6CBB179AB83A0F32591B757E8B68368D6A5EE63490604AAE70EA7FB4619C91A455429A6B195214BD28BC717385D3CB8235991C05088C7939BF852125DAFC3BC368479165438092B530BB2B869246988B8F85425A2A523ED108C6D2F54358580944D64D801078A4B621F58012F9D8A17A92AB8AD43821E24E2F87BFA844ABD0C6B08650AB76D5397F2CB0060B31AF689FC8612249D46374848F496B360E733FC991809DA804DCBAB14030A4BD18CFE37B41CAD91A66A263437B7DDC2484ED55ACB16AB95A1A8C9345A898E89C37248F9768524C616BABD17A8DC7924F37345DCC32DE04273C5A0AC038A133BA01CE2481FFB57BA153826A7CC4123570293C82082B6A75FA05031CC7FDBB9031E10CA94AA283AA26EB3546F894B646B9A85AFC5DF3B513DB522EFB340287C64492AAAAC5FC25547129B56B9541EB0912222C2E60A11B9304692A749BB174CB47679CC294253B0F768A7872F698C23493FD908C9FF95F9275551B947BFE84780F86C1E0BC105F6CB7C9430369B58BBB07B3B0C87D8541618C76A43D52C98A08166E052B4487177AD222E6A002F7FA3F3601CF1EF0B4C02AB550D76447EAA695561118A46301B544B493C368B5B77AB17C5AF4543FA6A8C682A46AF39CA48046B1529684A53D0E492E1B8596F55334ADE15591DBC4B411537C88A5113458F187A6D77278675B0C85BB017416B6E9543FA1B924B631AC1DDC5556127548FA8CE0C90125139BDF13428E2C7805607A44251A5F289BE4E3A2C3C95C5B5CBF7C87B4A7D87A39A44B672BBE9AF8343DCB062EA3A039E949A7F151C8900484368F1CFA385BD13CF55685BFA4B959F8634ED7C437FC9C044B401683CC7482722C98583DE24EAD414C1833858BE987672C557DB87AEFE4CE2DB8A676D14083462DB35862DC0CAE95F88EC1F59426FA2E24E9CFC54813BE07C98F78A87B9703276B455E15474D7A283D5738D4B639369077E7790DEAD3336E1467C871A571080004A91162FCC31D2912646A9406902248FBBF28DAC4343B081C327743335B9EFA4B7FD13D5177064A5B6E8065B64D8C6580B47E6472C8F5139268145BA7A23A02F59ACF680692B20EC2DCC087A99BE036BF7E9C8C0DF15F168C508AE28E33D951740A9B0F0321E35CC01328B7BA860592B566CB369B21F51B7AE583D26652DA729F07F5B8D59CAEC65AAE42C7C9CBE73C68504F26670BEDC542FBDC67A95C9F2DA1A08E559797170EE63147A4688C8E101E5AAB48A4D1862506CFCD297C7EA61A9ED4A54FD3A28380292FC1570FA2AE43920B0E940675B60534425C69F35BBA714C88B3A6C323090B4C56B7F89963059F8CCB0994373FC1344412F694175C2EABEA110E035BEE6ABF546396D79472EEDA164BF49350F54C2E75754F502DE4A42721B37974A8266C49B57C6837B38A28CA489F02FA05307D7163B35BA6A4C5024B70BA27DB0DE8D64BB8B55C83BFDD24 +sk = 09D0009AA9878C697E2EAC9CEC9675A9570660346547D7AA8D4548E3AA917E238CBBC10C389445D15714B237566CB44132D6983C9610E779570B74482D5BA2742A1BB51C68142C1680B800F1938795367B6D8A56C32A0D77922C78116643530AAC01CFB2692F4BD6BBDE615A3335B397487DB8A1175A043719EA58D0DBA627D7C8511468B34442879CC227E6B39E084DBB68BE71CB988766114A80B1979118ECA08217540F032966688C99FEABA06D0A0A1E701DEAACBCFF9C2F2948A209AC8EE505C85FE0444B5C70D067100B63CBD6D98F9AAB73CB06C97FF31D7AA0CE188707DDC5C07D495B27957B369055650ABD5D9B9F75761770920DD0B574A5841C3BBC9F6F1AB0179C118C7A83B2934E950B3DC732C84264C66FCB0DF78975FCAB5FEABA4E6AF97131696A0CDA1CC9E2C40A266FBE6667C1ABB361F063103311A792B95CC525FF872BF3F394FFB48B30B334CA02BB32A901E3478F811505DA066DE6A5CABA425DF83C27565CA48B16BB2855A797A72DFD57615D5117B24374C2D306473A349521A8107790D268AC6B5813C593CB9E8621F8C68FD2E8082C491C95C5AC74C86DD37B0A4EA0CB66AA576AF50FBDB0A31235BDC9E8107F1859ACD2674FC72C6669A3465556F90269CC30B0A8F53563378EE016A7ABCB5460D5371B01754BD7373C2314E2A42D98636112F3CBE0638E513B38D4850AFD6A1D3D485308181FEBD88B75F532E4541965E0BC592885FD1C1B3108C33F74725850617B526AD4F2C8CECC19B0A0ADE15057C90AB086C26CB014BFF92988903BAFEFA3C4C96CCBCEF178F988A40D339DB324257DE69A119125C52A4147360B1274808299446EE768680170457ACEF18814559996FA96B418275E031199E0D578E86C946381C369AB839B1A75E9D6845C98AECA24253B3B0F00EC7E92CC6F6A40A4D8B04900CA3E78CC7A5C51886E0901A908BF0A08947E3B524F1C606B055451AB6EDA2BBCF832510B3075E2CB0ECD493B71102F4EC69565F96651A3A2C3B738C2D55805798253E055DC8508B98822E6803785130D22E494B50025B0CCBC69667013C4CE4A140C2E9BA928D41D7FB5237DA8C5AC0310EF5007B2B0C6737BC17A747C5A2C1F3C1166BC2B0AD7AAAB1D870E54694C1CA293665286C4EAA35D34BD6EA7AACEA04871C257CF63641264AAA0DB4F65337274356F71D02310A57E44D23EC6B4185BC5CB45A65D3B592AF3138216332060264A6E53702D766D0F4A0F14F70B75B780688591CC414283A59AD2F84D665354D71C2AAA1C278AB6C8BA902283B286F82761906C9B2796595BF5AC01455ED2B43607207A30C949AFB1BA5C50659143C98237279003CA820B4B5963B0882A088CE09C99F4A6368971A7D6885237BCE28580E2EC483FA305FFFC0ACA173A89CC41727A55D4E29A8C410B3FE851B3D58B58C31920759ADA529DA162CCE47618B2F715F3658D71F5455365C67B04748B371A5A96B75F342CC4C031C713C04D2B6CDEC0CC92B7596BF4A2A0C91537A0C8174B3456489D2DB70D3AF2995C4830245120E9411E92ECB2293700973386983A0C6591CD5EAA34D5CC00FD672D20A604E78696D5542646C120E02C8DC5162630E71465ACCBC55170FE0945513748C0ECC9098A02E9D51E44ACC267272633645AD562816D479466B54D2150AFB682B4F32265F1F4BCED21CAF7C7980105B08056CC4192BFE0DA9AA5E00864B0A34712204CF6AE82DBAD360A7C840B4804826C39A59AE029056C1B2542B6A589EB47C14A70ACD1731BB0A4D657656915B91D696B2F92AFD82245945C7B77958A5B6A3B6CBB179AB83A0F32591B757E8B68368D6A5EE63490604AAE70EA7FB4619C91A455429A6B195214BD28BC717385D3CB8235991C05088C7939BF852125DAFC3BC368479165438092B530BB2B869246988B8F85425A2A523ED108C6D2F54358580944D64D801078A4B621F58012F9D8A17A92AB8AD43821E24E2F87BFA844ABD0C6B08650AB76D5397F2CB0060B31AF689FC8612249D46374848F496B360E733FC991809DA804DCBAB14030A4BD18CFE37B41CAD91A66A263437B7DDC2484ED55ACB16AB95A1A8C9345A898E89C37248F9768524C616BABD17A8DC7924F37345DCC32DE04273C5A0AC038A133BA01CE2481FFB57BA153826A7CC4123570293C82082B6A75FA05031CC7FDBB9031E10CA94AA283AA26EB3546F894B646B9A85AFC5DF3B513DB522EFB340287C64492AAAAC5FC25547129B56B9541EB0912222C2E60A11B9304692A749BB174CB47679CC294253B0F768A7872F698C23493FD908C9FF95F9275551B947BFE84780F86C1E0BC105F6CB7C9430369B58BBB07B3B0C87D8541618C76A43D52C98A08166E052B4487177AD222E6A002F7FA3F3601CF1EF0B4C02AB550D76447EAA695561118A46301B544B493C368B5B77AB17C5AF4543FA6A8C682A46AF39CA48046B1529684A53D0E492E1B8596F55334ADE15591DBC4B411537C88A5113458F187A6D77278675B0C85BB017416B6E9543FA1B924B631AC1DDC5556127548FA8CE0C90125139BDF13428E2C7805607A44251A5F289BE4E3A2C3C95C5B5CBF7C87B4A7D87A39A44B672BBE9AF8343DCB062EA3A039E949A7F151C8900484368F1CFA385BD13CF55685BFA4B959F8634ED7C437FC9C044B401683CC7482722C98583DE24EAD414C1833858BE987672C557DB87AEFE4CE2DB8A676D14083462DB35862DC0CAE95F88EC1F59426FA2E24E9CFC54813BE07C98F78A87B9703276B455E15474D7A283D5738D4B639369077E7790DEAD3336E1467C871A571080004A91162FCC31D2912646A9406902248FBBF28DAC4343B081C327743335B9EFA4B7FD13D5177064A5B6E8065B64D8C6580B47E6472C8F5139268145BA7A23A02F59ACF680692B20EC2DCC087A99BE036BF7E9C8C0DF15F168C508AE28E33D951740A9B0F0321E35CC01328B7BA860592B566CB369B21F51B7AE583D26652DA729F07F5B8D59CAEC65AAE42C7C9CBE73C68504F26670BEDC542FBDC67A95C9F2DA1A08E559797170EE63147A4688C8E101E5AAB48A4D1862506CFCD297C7EA61A9ED4A54FD3A28380292FC1570FA2AE43920B0E940675B60534425C69F35BBA714C88B3A6C323090B4C56B7F89963059F8CCB0994373FC1344412F694175C2EABEA110E035BEE6ABF546396D79472EEDA164BF49350F54C2E75754F502DE4A42721B37974A8266C49B57C6837B38A28CA489F02FA05307D7163B35BA6A4C5024B70BA27DB0DE8D64BB8B55C83BFDD2429B1BFF7F12EDA28DFEDFBF0AC16E27008C9FDC62C35E53B28A312BDC91C40BF8B2809FD40008BE70A6B184981101724BC3D5EC5E1956B510B82FD5AD0668A5A +ct = E9E8B57094849BF2A09A5431B0CFC2CE5A1A6C288B1E7B825A28C5991F8B6D5DEAD55E5BB9FEB5F98A8DEA6A33F9CAB55751C5C8B841B69F3769598F1A1016F0FF9CC42A9927D98607DD7FA1B25E1C2EF43909115E09B6FB434225FDB20A1E3A1DDBC4B7925B34B696A50DF2AC800D00CFF4C0C0E31510EC3D8D0B44D2D80EE5CEE9039802DF9E7367BB0E6E2E71FCD3B5F6AA97CCC6866AFA43619F5EF2726D9E33D2E6404156CADF8EFE1A356C2F2235008A43027720270C3FD0BBBC01CC07A0894247275F1E9A54CF22C819674CADED80C2979D720A6F233C6A0BAE986EF0694007816BB504806769B52177C23753E706D94BE0F5BCFB4E2607A723DA0B2018A1C1711940A353E96C3C6F34A773591ABE5F4BAEA44BC45670A6B8346B0C6EBF8CA3A5DCD33E82913440A9C28FC5A6B8E03D600D2C13A210D4F7A43D66DFA8214060F05754F7B76BE16199F19C5FD0B832F2FDA4EB447640BE835A34F5C9C73DEEE68776C7BFF2BAC601E501A1AE72535067377DFD3A0D07462C3DE3728DC5C02585F4E5CD7B1EE7A47052CCE9A90F098180BBA4EFBEDD10866BB2EF1389EFCDE7D48E9E8F3AA3B0419D23A97C4F915423A26E8181817A2F0B0B9C3AEC1DE80D355CB0313A806ABCB25139980488FFB2084E5A93162CF027D0271050D69E563A42B61107B3CB2BC17562D2ACEC2169BAA778B0BBECBA170C8C40A8E65D3CA9F8409FC14BE20D236846D50BF1019189CFD2AA44F199FDBDA6AF4AC5646B1890817F93DBEDA0FA1BF0EA1E00C1467048F36D8E996D5757A36D48C73DFBE9B9B8F42004A98600685A0500DB9BC9912AA10A7D8EDE8E8CB2CDCE5F67E5AAD00B4D0E17AD03873704DC62769CF5629BD3A3F281FDD75B6E682E1B9CEAEEEF7E3218B37AAD6D4C3F1786B7E5BFD657E3DA0D69AD6E21DB3F00480A56528DC09A72AB06C786EAF3839599F2AA4E7B34F072BF50F28E03A90819894B6F886DA655865F96AD4E6CD8EB3E440351E60CB9FE6D018B3712C32E2E904FE932B49D1590869A19315FF6352F1CC9D97E7D3DA89716F5F2931FCCBBD6ED96EDA6CB5E021A6F5048545585DB127C8CFE7C3AB905A35879CBCE540A1348ED02602A1C3AC0C9CDCF6F3366C396219938AB002736AB1DDE1165F44C90EC3D22FDCC3E86B32BE8677B914BFA24F21036B11C8EE5ACF390E10247E85B71EFC50BAA05945C09771D060F83D7FDB02688732D852507CF53BBCE32DE17703278C71C46026D72870732D822F8F8D0D216A397AB4CD5C6AEDA1FD35287AE6720CD4106D64A8141307ABF41FE68096EA51C59B2827ACF7E54C8E9A00ECCA352B276D588F4E00C54D0AED2E098E6BE9F174C3ACCAF83FC7E5D7CD6B6E6216F54BC9E777DE0A239574D85DF930B00E61C3096962298C2B5D644740FAE2A1867288A2ECD6240CF4E8D207CC2B7362FB1CC064763F0A7CB3696987C33BAC822F431F981885BF7C0377041A2C7EA34F0FB0E3F0147BD0362BC5E6D1EA51289BB1E5187DB1DE6656BDA982BA0A91458 +ss = 03139CF9F20FB6BDAA4EE906AEEE834815FA924E05ED7E7E3BFB432AAD944D6F + +count = 90 +seed = D26CE360D399BF7B89DC364AA7AC06BB513EAB8F527383E93E30727EDC3F22C262AA0EC70257B39EDFF0630DCDC1B79A +pk = D3B1CDAFCAC7F6D08082DA095A7658B3A45F7BF717D4B80A3A050A04CB23E01103FFB1731B2C35A9DC23C4341976B188F5226459A02D348BC9D2064D574040147B41612914CFC2954E4190905446E5AB8632EC96145B917DFB4A9DAC62B18CB0120679E739901D9BCA662024335A083911AA53828D6D79C948425422C32EC471C2FA843B54F6731FC401475612A135AAE4B146FA829871C0654C075DCE41190483C3EF60B7336200A4A39CFB6787AC09AC85F4CB3DBB494727A20ACC8A1CC9CC765862B0D402147A08A5E4AA6E679D482786910399BAC7A36EFA477236B1A01BAF452BADB3F184D7D6AC6EF64CDFB89D1CE66A059A4659D8137DFB3C95CBC9E8D86E064CBFDFA50C68130A8D82258407BB7B926F7A802B53209F3AB78784102E88FB91E6311D496251F7B574AEE5797E881BA1DB16AF40281586267D826C0F33A0518C26E6533E19EA0EBF29474A131D882A189AC03B835C16C34C9AE7A1C4D9F5159F85B8542284E0409DFB0876FA6488E6519867B5C53896867772210E95399A1733D2E78532B7651CA9704AC063DF086CAE4AAF65150093F27054F34E2849449C7680EF1CA1A0AC399A01A9B74484A967592CE85086230582518414C247BB7680ABFC2A04A35A20A851B73548A8E4CFC2B84CB5EC24108396C28498A6614790D56BF8D1B9F9E40BF574C497218EEBC06217C9BD361BAA5D0715E666C2D3D299346A79BE0BBE4B7CCD49F948A60438514129C126AA1F3875718922C5124728F09FE5437AE83194DDEB81F0D744FD2B9B59FC223E2792501B4932924FACC16C1E5444DBD6A823016B3AFCB46EF59CEEB49728AC541BBB6BB64B7E196C59910628C8CA22B1138D884842C387B594B544E5D99784B06ACC3B5D80BA81CD34739A20AF11F7735D645D9FF25C07F8AF9B5902524A1953CA2A58D6B796E3695A006AD6C703DD161C12C01B9BC995773C5D2CE59470C765C3F5401CC07885C77BFB3C15D7F766F0EC7CB3F601DBFC210D599093A21C87D82002212B06898A5A878D4EE913EB451DCE14A1BC424838D4797ED14D9EEA2473B304D6624F1725C820751A9D313CBDC79AC9A26548587FB41371C5F48A4DA04D37AB7189685AAA054853F0491A0388AE4B7AF4259969E29EAAA2B2EB9503518C7C53BA0E6BD20EA8355A63F1C481EB5E662A0B792014AE4C0981274D902759AF794338072A839B05D9D42C1EBB1A3DA33B54066D1A63024A3B1D1437B37A83BBE816075CF416275A6F58336905937105E63A1A017F87911CF0B41DAA41A5DAE3856A606E2A9333176628198B49D2517F54A9182E4BA877760517DC94A079538822251204B4C4A2382CC7889BF84923C09072F86BD1C5879ECC3A37678E6D031568C24012578DDE5CA01005B2DF71A4A0B0455A03AFBE7C366BF1B086973038FB5DEBD793A303B4C867B611772733F66574CB0D7C303563C389B2F1B46E98945A94B142B2B0D647521F4B58F12326FD86286A448909191BC600BC7578B0169A45C071C77F280C583788F9C2AA1200A73431AD56D23B20471BB67A627A594BA9922B1FFB75D2D030432A954C71235A9278857C3010A8A8906C070B77060FB831842140770ACB92E856C8A95E163D5181CAAD6A478AC9AE82EE27F7256F4D4CACDDD43F45CFA4DE4DD067CDCA +sk = 96D9C668915384C2847B7991E5F557949C99A3D46A2FC9AE7448A229A89EF7F405C2911777FB1E2F44721BE8CC326A80E524486A16A083527E22D51E4EF624B02625FD6A857BEA2C0590A3A4E39F0E041B7284BCC501201842345ED5CEB097A5A5F730EE53176F8ACBF9E03C6DC4A069718DD64C47E1D17323D29ACC630DB2DA9922804802CC768070245380CEC6672F6A5A9D14E4012BB13CAF8C320A320ED63B0591087A0C5A76EA29B57D5C997FDB372E9A57E3F4827A2441CC485718A421D3C45BD0426A87589362E52953822CF785802B2C6AA441ADAEF93DC6451AC68A9867C9B9703ABEDCAA540146BA6DD8ACF7DC317A82A4C1396267032FCCB53BE9306E20E4713B82842E03B7FA984E5827C441E293352B2E2A51566EACA8D9C4206000655F761729020F7FF9B230D6C4B986BC94551175A8ACC7E2A2C174C500666D3CF021A9B40F1A465447291F920865AD16240309B5C838A2DDC5BEB8AA11BF987AA9D7C082E8C55C63AB01D0664E545E505B4AAE50606136B6B01499A5BA10174852224AC6BD242D5D21758C4342F9A02A3D46A9A845112ADCCBB73488CFE3055CAC398B0245C467B94EB342E1845969D70511BC7100F886308CBF21C13840BC17626AC93DFCC4EB22BA18F62B15B521539901166598F25555C32587637A341017885AF1A6D1841AA1C747D918253E1C873C2CCF292BAD45805D8946B00DD23CBDA03878F66357D175D67A1B743C1E5428CE90661067011874B062E9AC8A0F726B55B76627C53338549C3F2605840A11D5606ACD104BFADCB51253AF718835826628235878D6160F15033844D76AE946AE6C240053C2AD6C3A3D72E721D9565A6C79B56840CC5A878C6A4033BB9C88DC43B130348082E41C269CC0D3B05FFE356B5695BB01C95F8AA9C30E50CF31F11419E13ACFFC7192B75948E06A68458DB80A8F71573B6EDC1513AA5B060CB77B12C62761BC188159A49C95180249B3E35C3100635012637CB9CF17CA9936787AAC954BCFC655AEC8B4215861A7709F2846A1C14889D0384591753E3F19CAD2236DFCB7B225ABC430A7B61E6018AB30146D60A6563B2F980ACF66186FEE70A458750CC62C433E651F447CCEF8A773BB2731A866832AE535F0D82E605371F6B35FD6FC1188A52080C609BDD8748C321CA37190321B286C849D35224BB5107D83E2827EF0C63859133852630B237247AA8C100678E43618289239EF19C99AA6B9156704643285BEC89F0B0C21F3A091E2063E5D3029F52C33AF97529E701298D3961F492E6B731D4E2064D034533F4611FEFB64F1899EF563AD71A52E20B199F0D80C557CC8CEDBA3CD1746D3A6AC2E697637F08A43D681ECE3769C8980C76A26ADCC585EB1194D28AB163ABA5563A5C7985720248662BBC21470022EF4110B33B6B8B744A80AB36D0A9B0A7988A0C98C6A597F8CDC76791C467B0CB53A020928F7A55981B520017BC06B36D10A21433797C15124E0892A81230BD6BB4774D46F73B874602588D3F8966469194041BDEE87AC54059458B19724949E7998AE8018755D491BFFDA76A70A64EFF902A4281734A7484037C739B7BF71B658B779CF6370420D2073FB820BEA1B1DF29C3B12C54ED3B1CDAFCAC7F6D08082DA095A7658B3A45F7BF717D4B80A3A050A04CB23E01103FFB1731B2C35A9DC23C4341976B188F5226459A02D348BC9D2064D574040147B41612914CFC2954E4190905446E5AB8632EC96145B917DFB4A9DAC62B18CB0120679E739901D9BCA662024335A083911AA53828D6D79C948425422C32EC471C2FA843B54F6731FC401475612A135AAE4B146FA829871C0654C075DCE41190483C3EF60B7336200A4A39CFB6787AC09AC85F4CB3DBB494727A20ACC8A1CC9CC765862B0D402147A08A5E4AA6E679D482786910399BAC7A36EFA477236B1A01BAF452BADB3F184D7D6AC6EF64CDFB89D1CE66A059A4659D8137DFB3C95CBC9E8D86E064CBFDFA50C68130A8D82258407BB7B926F7A802B53209F3AB78784102E88FB91E6311D496251F7B574AEE5797E881BA1DB16AF40281586267D826C0F33A0518C26E6533E19EA0EBF29474A131D882A189AC03B835C16C34C9AE7A1C4D9F5159F85B8542284E0409DFB0876FA6488E6519867B5C53896867772210E95399A1733D2E78532B7651CA9704AC063DF086CAE4AAF65150093F27054F34E2849449C7680EF1CA1A0AC399A01A9B74484A967592CE85086230582518414C247BB7680ABFC2A04A35A20A851B73548A8E4CFC2B84CB5EC24108396C28498A6614790D56BF8D1B9F9E40BF574C497218EEBC06217C9BD361BAA5D0715E666C2D3D299346A79BE0BBE4B7CCD49F948A60438514129C126AA1F3875718922C5124728F09FE5437AE83194DDEB81F0D744FD2B9B59FC223E2792501B4932924FACC16C1E5444DBD6A823016B3AFCB46EF59CEEB49728AC541BBB6BB64B7E196C59910628C8CA22B1138D884842C387B594B544E5D99784B06ACC3B5D80BA81CD34739A20AF11F7735D645D9FF25C07F8AF9B5902524A1953CA2A58D6B796E3695A006AD6C703DD161C12C01B9BC995773C5D2CE59470C765C3F5401CC07885C77BFB3C15D7F766F0EC7CB3F601DBFC210D599093A21C87D82002212B06898A5A878D4EE913EB451DCE14A1BC424838D4797ED14D9EEA2473B304D6624F1725C820751A9D313CBDC79AC9A26548587FB41371C5F48A4DA04D37AB7189685AAA054853F0491A0388AE4B7AF4259969E29EAAA2B2EB9503518C7C53BA0E6BD20EA8355A63F1C481EB5E662A0B792014AE4C0981274D902759AF794338072A839B05D9D42C1EBB1A3DA33B54066D1A63024A3B1D1437B37A83BBE816075CF416275A6F58336905937105E63A1A017F87911CF0B41DAA41A5DAE3856A606E2A9333176628198B49D2517F54A9182E4BA877760517DC94A079538822251204B4C4A2382CC7889BF84923C09072F86BD1C5879ECC3A37678E6D031568C24012578DDE5CA01005B2DF71A4A0B0455A03AFBE7C366BF1B086973038FB5DEBD793A303B4C867B611772733F66574CB0D7C303563C389B2F1B46E98945A94B142B2B0D647521F4B58F12326FD86286A448909191BC600BC7578B0169A45C071C77F280C583788F9C2AA1200A73431AD56D23B20471BB67A627A594BA9922B1FFB75D2D030432A954C71235A9278857C3010A8A8906C070B77060FB831842140770ACB92E856C8A95E163D5181CAAD6A478AC9AE82EE27F7256F4D4CACDDD43F45CFA4DE4DD067CDCAB990059E901097D00E0EBAF40C5D5DAB009C66798489D357E760478CE884CCE5C95FA08ED106CE84660E8A4C90BD2B22634E40769AA0090A101C5DDDAD45EDC5 +ct = 922014A568044CA7D9086946CCDA46596385465C8065A9BEF75A70EDCACD8DEC0BB08233AB0E0013CB4DC03F59052091254AA8D8895AE1E73A608ED4D913658FFACFEE15EFBDB2CA0ABC843E2FA32AC1DC6FAAF8ACF19E6D2FF14356DD4DFC6171470C9667309AB421FC8663807FF4C614126C4BBF4ADC193CB58465FEC7A70BD508D75838A349827227CAA2F1A4C02461646557A467C73715E4D8B309DE5FEDBB0D8827EA6503C814587CDCCF916BA51FF1B72A2546AC78C170FECF26B84D8D80F6F51131903C5982FCE030DB8C83A6C1D4304E72DC79D77D7E47C7131229FA8279820B627F3DABE4B64B356DCB6E982BF07B1537F656C3DD57E71434AE394FB9E30C14589378AC83D84C6800837445C4610EF536D8C8CAA31A52274434BE4CC66B6B21A6F28463796CA5CF0CDDEBF6663EF308D3066B689FE515F30D0F5B014E49E4971F7B68BECEE860EA549301753BF8FC95EC7574B51DB83389632E7F9291E20BBF20E898E52AAEBCAA3B9FC67CA7F8D63892F355D365C166961A5A3E07D7549E5910CCC06DDBED484002B7B8A0AD3F977FA92BDA8DE05D711C95486693BD79F4D43CDCA8D5FD162A400D8F33D7535774967943282C52164EF50FC337068A374B01D75757F9F36631C963E1981B83F6CFAB6FA528350AE7FBD39C795BA1967402065949296AE14BC734F12BB5559CCCE061BA8579BA3DED45E8C763EF76DFBA1099CEBC9CAD903C5703515FCF3C5867DC73C8C73E176154D41BD4A6F0C039BB56F6FD7806E0F6EFA0BD0F57BA4E64D759C51BB10523AC8673FB236D7502F68532778BCF6ABA52FF6F43A45457CDDB8975623E5A80D85D2119F1828C44D8D5D2610B5D2AFCEE960E85221531B2D0E9C67389B791820D8658D312B2F1C1BA567C297D3D9307568F84BB7CDA8962BBF35A2B41665732121C938953ED1784304B5907F3429C1038522CD7C29E19B33AE7CD8171C7EF05BBF46AA069F05495E31C2357A13D478971F4657FFE95A1F867832BA3DE2A386A46C511BED2E63541B51695B4CFF7AA0D7E453BF56F16BE0128D1D03CAA79C5260BF27C4DEC61497B47D7E7ED1A1795E5D4DE8EFD141A44DB98FD8588663526EA7382E7C36E5B6983EFDEF927BBD8B78E71B8328DA1DC87F84CADF0772E5E01E920EC0DBD625701368156D91D00D621BE1F439AC76AACF8931CC5840358C6DBABD03148CDE362D7E2DD2B98F6CB50B2BE7E8DF737F5044F96430A121F1A9B93A2E17DF7AAC2F17C2D9032F5DF61F98810167300A1075A81A74D3280C603908A236B6042B6FB9F8FAC23B7E4B967DDD3D3FBD7FA1C01A78E9AA44221E0273EBADCA5515F1F8ED6B07ABDD73E7245E865A2E735BB2D309764EB69D32BDB2DA08EA101FD86E6BA18019422F9A1771AE69DCF9525A2D4F4E7C56A80668995F3BFE8D37CB934F34722EB48C841E54277202156DAC0094901D061D9A5E7A9DB61247028728A41262946311662AD4EBB60750FCFAB13ED586E70E4BD7D45D5F3B6F6E2FE1122900948F1BFA130 +ss = F87CFFE1A96BCDED4FE027DC8006065D67D0190B87D805135BDAFCB5EDB9803C + +count = 91 +seed = C5856298C3CB6AC9787A0F30938537AB2635B96F6D19CC9522063360E7A5C88E644929D2879180E3E5BCAD2422B7CFC3 +pk = 112B1DD09313B9A25B7094700639775F89B8D0314EEF0186ADF7CEABAC36CC9292C270717F27CAEA51B1AFE1CFE6B6A1CB1A7DA53C6715C9C9B2694BD5A581B733AD4841B229FB7A17BC213B969935C672D0993A94EC170BDC8B7C800E66BC6514F84FBC81C7D1C9417B79A82E5B3980ACC792A19C46D13A2E75A3AF791BEB401F7555793D94C0EE1B9E98A5B6C52777E537BFB287268CA9524A4438AD87A0E85279E474C5BE7740B7867D8B04781A2436A8D343F62274E236C736DC3C59D5B326563B9C86798AB14A6C9A0E67B36DB89A82AF690DA7016418BA2D6C435E39095BB81A0E49C01A73A31EC9159844D1A3EB233D16B932919421E6A342473A71DE629477183E8F34B2B7C8ABB7A3B6E516107CB5229D780B93417F9BC94C38BCAA58F34DD88835308C742875CCCF4928122199CD932148F48A94C5C2252295890BB4645761D3C2C0F33AB3E1021AA56B573E9C6FDAC37C83F678B97148CE573A244B0487F3CF771BC7B6A13FE53A6BA58854B87A67A6A17D6A301C85F7C061071B4DDB27B3F404DC402EBACB8254A0568D48B2D299BD831188886A65AEA5CD8D987F6017A2F4392F455C2B4F9B63E6CC1A27EA38F2588B0F8086D7A5C5E4B05B76D2B8918820CB8851704CA6D730861B512FEFB0A76B61401E23B01EA710C5E3B73FA716DFA6408A635423C61372592DBF174D6D811EEF7C4D885BCA5FE669233A141E43810AD10235CB59F824728BD7ACF17765BCD354A493AA60438F07D266D728B640CB07D50275BC2605FA6C964614B2C8143B37B184F3C30668662149BC18C6038706C12F0D31B896B69A7D588D0004497E4808D8C12253987F000168EA758A5B32C195F03F23A07C5A546A6607084CF79E073BC6CC1CB372E385CA827C490A42D900035BF735C6242031B8332BC57765ECCE4792706F1CBA0C7CC390E7BD3595AB876C4E397C58FC325C9607B0EE39692C31730EB4744E967E7FF8139FD1A545622EC870516B2925628BA782CAC845B2429C3CC0EBF7747F414E8D35CD4A91C959D2276404A5DF4790F4363104E6A0D1D60A48B65BBD92B417B51A5338CEBE36C0F218BF27968C05D99947E9B44B4B5B2934C538F85CD7C8B9E3C31637E14C5C0279CDD6386E20CA89A53671FB2F04249565491AC2F900AD380D1A68B67693B185F26A232AA1B43503398002085713CA4B2F94CBCF6E837B020404B7F519A2B520F93B901943C918393F26061346A0193CE9BA8A48B5C4B01B0EFA231EBA0528C5B38CD32CD5D22586494734FA746B411759303A51A12EC58B03FC99A1EDFB1CB01375032054878A6EC9DC4425945AAE387E7FC6CD399C90049854CF51B3DB690EB78A0A2DB04D05102DACAA9834620ABA427B5733BF1D1693643C88BD265AF0280ECC66344B81129C491B3998C6C70CCF03257C2D06115B72AEC35B4C8774CC7936C578B29FB3B0A5C66709363B73F41B08DB919CBE57AD817CBB5DF62B7836AF6FF4AB8CBB07C9FCB7E3D601B2117E6A7242ABB24EA96CA867B597E9E9B45C01ABA9B54D2D323DF8B38D3D37B72C2790E1041037355F274CCEAC2714A92955B31C55D4903A85BCA55B2BC22C536AAB22557D912FE2234423E7BC0894BB5F846A2DBC4A0DBB11C51840059EC11BF6CEFA3AB473E1CB0F0BD17EE0BC3C59 +sk = B1C127D24808FB2B9922332832131C4FD67FE8A1A070AC8D17100BF9F6291EFA0BC8114D98F65C8F4ABAC3AB17B4241DECCC37688B881BCB68503B54379838BBC100B5BAB306327E7965B694644C470A5148666C7FA89872D39AFF60BC533C83F280ABFBC26F073331EF40B694AB25FEEA5B2F55196798B70681CAA21537DFB5746C66129775852E5850F57C2DB2E8A0E90530A57B387B1C429101D04096C3E0BB6E9AF19F83B1B0B74C47BAC678B0F2269798573FBCA5D8E687965B13E495827ADBA63DA8A17564A3E68037B3A4991993401C1C6B149895FFBC03760C13595035A713140EB7A42FF6ADFE6BB371C9AF5A686EF858A8FB7A63FA137492B53305685205B08D44A3AC8F8948F2B7BED9CACE27AB6265722D8F2950E0C9ADE053A4C4CA8E3F80A907A39E33DB78E6065FE9DC050A5A730595AE5EA32E38C512EDB79DCF345F1D9C238A1732C552AB8DB2CCCCD11822972896B323CC43AA03633617F82E89D63D4A1003CF9C5CE3379B1D53A63EAC57ADBC91510316ACDC30FD74A1A2E6C23584AD1CB28444F9231661079B0913E20B3278D8A2E8B18556F336CB750694066B6C82C5D267A903B624CD440D8E187D9E438D178C8394706F016B835E1522AB6904F80CC24358B7DD3BB271039ACC174164021E8A522FAC473054D5B4CB3BC64BB107C6B637CD6360E312A85A3B1E3D2B64436A87E81016ACB763A23CA9B7463023148B0C4888BFB18D9441841F723B9436B77B09C79FC714385A3AE97B5BDE0A2A0C541DCD2B668C696281389EC270BC6D088FC42506CEC85BCB4B611342AF0A61B1B9D75E0DF43BE293CEE6EB0413363716EBBC48EC6C361A48B9D871BD5742FEF2AB286094A92B508CB794F2F69A8EE15C2D748D8FCA8CD2284719815E75B3B0DF76298E48280BF530E09A34D166CD5379777D472F0994BA8E5629EA7691FB973F45869635B61B277C375606B911AA1228271C85B047942A52187BB231412B50F5BE423476720240E62B9D3CFC5B7AF5CE9FB38E03349063741ADE945E994A2D6492A92B1250880318B9B9CE845BA29BD3733228AE960663050888BB98A0FDC21D6FB34CFB5C1AF6D9B98ED6AE454C09B89B6067401FB30A17DD331A845C713715B5BD4A087BBC14CBBC9D2EA83D0F9B0D56D939D01B7D590B3082D2405A20724E2C44B5123BC1407B11DA3DE5889AC52B7B7821C4AF1303D3959EEF3888B8847F3E0695B5B844E8E3C221718A25057E707A50E0159AF4462BB1D103B9057FF7FBC1740BAE1AFA44138AA2B7E3270CF80A6AC745CF701040C97253133EA195648E929E6C6394940B6ECEB18844F1C862DA6597A46F64E0CB5D2803EABA4A08110A011A32452185A6425D9D44B43463893369514957592F519C22D2B06BDC762C519D5CB84E9A68456AC60AEAE85AC6453DE2BCC103E32DD509309FDC08E3B3698A193D83D62DF74719703BB5F8CC5DB7B88B80110D74D6949D00469B840FF7FABDD4C0CEC1A097A6117C28046B06B82C8EE8204296428AB703840ACF7F3333D742726B114D3292B3154B2C4095B6D465657EC0780C488A0C60443717109363C45777271955135E60B46104BC18BAC09A18690B37C8078A22645532112B1DD09313B9A25B7094700639775F89B8D0314EEF0186ADF7CEABAC36CC9292C270717F27CAEA51B1AFE1CFE6B6A1CB1A7DA53C6715C9C9B2694BD5A581B733AD4841B229FB7A17BC213B969935C672D0993A94EC170BDC8B7C800E66BC6514F84FBC81C7D1C9417B79A82E5B3980ACC792A19C46D13A2E75A3AF791BEB401F7555793D94C0EE1B9E98A5B6C52777E537BFB287268CA9524A4438AD87A0E85279E474C5BE7740B7867D8B04781A2436A8D343F62274E236C736DC3C59D5B326563B9C86798AB14A6C9A0E67B36DB89A82AF690DA7016418BA2D6C435E39095BB81A0E49C01A73A31EC9159844D1A3EB233D16B932919421E6A342473A71DE629477183E8F34B2B7C8ABB7A3B6E516107CB5229D780B93417F9BC94C38BCAA58F34DD88835308C742875CCCF4928122199CD932148F48A94C5C2252295890BB4645761D3C2C0F33AB3E1021AA56B573E9C6FDAC37C83F678B97148CE573A244B0487F3CF771BC7B6A13FE53A6BA58854B87A67A6A17D6A301C85F7C061071B4DDB27B3F404DC402EBACB8254A0568D48B2D299BD831188886A65AEA5CD8D987F6017A2F4392F455C2B4F9B63E6CC1A27EA38F2588B0F8086D7A5C5E4B05B76D2B8918820CB8851704CA6D730861B512FEFB0A76B61401E23B01EA710C5E3B73FA716DFA6408A635423C61372592DBF174D6D811EEF7C4D885BCA5FE669233A141E43810AD10235CB59F824728BD7ACF17765BCD354A493AA60438F07D266D728B640CB07D50275BC2605FA6C964614B2C8143B37B184F3C30668662149BC18C6038706C12F0D31B896B69A7D588D0004497E4808D8C12253987F000168EA758A5B32C195F03F23A07C5A546A6607084CF79E073BC6CC1CB372E385CA827C490A42D900035BF735C6242031B8332BC57765ECCE4792706F1CBA0C7CC390E7BD3595AB876C4E397C58FC325C9607B0EE39692C31730EB4744E967E7FF8139FD1A545622EC870516B2925628BA782CAC845B2429C3CC0EBF7747F414E8D35CD4A91C959D2276404A5DF4790F4363104E6A0D1D60A48B65BBD92B417B51A5338CEBE36C0F218BF27968C05D99947E9B44B4B5B2934C538F85CD7C8B9E3C31637E14C5C0279CDD6386E20CA89A53671FB2F04249565491AC2F900AD380D1A68B67693B185F26A232AA1B43503398002085713CA4B2F94CBCF6E837B020404B7F519A2B520F93B901943C918393F26061346A0193CE9BA8A48B5C4B01B0EFA231EBA0528C5B38CD32CD5D22586494734FA746B411759303A51A12EC58B03FC99A1EDFB1CB01375032054878A6EC9DC4425945AAE387E7FC6CD399C90049854CF51B3DB690EB78A0A2DB04D05102DACAA9834620ABA427B5733BF1D1693643C88BD265AF0280ECC66344B81129C491B3998C6C70CCF03257C2D06115B72AEC35B4C8774CC7936C578B29FB3B0A5C66709363B73F41B08DB919CBE57AD817CBB5DF62B7836AF6FF4AB8CBB07C9FCB7E3D601B2117E6A7242ABB24EA96CA867B597E9E9B45C01ABA9B54D2D323DF8B38D3D37B72C2790E1041037355F274CCEAC2714A92955B31C55D4903A85BCA55B2BC22C536AAB22557D912FE2234423E7BC0894BB5F846A2DBC4A0DBB11C51840059EC11BF6CEFA3AB473E1CB0F0BD17EE0BC3C59175EB63C3144108548720CE7EE0F43A9FF3F52A9924EFE9F2F59318BB93C86B5E15274A8E2BC08FE818B117BA28C5DFAE74D54FCDF6F20052F79BE333EDC8DDE +ct = 3E4CE5CED61DA4C323AE10DB3EB49FB68477E49A4D8A7EB19064F75CD640538F0AF831553F7690E3531E305813C18DEC92A0FB67A341F6E551DEEB0B3438A1A22391AD168A5FC16D6483D0A0F2002D5F43153674B07F6A5C5E337E3351A5DBD3C315D460541EE170E2E7CBA41942C1753A401E230D50D7B80884FD269F913EE4F326FACECCDABE1510EB55FAF17155EB4568F19F4E396213C9A7A252E1815AA0FEDF980409F218D5BA5B383BED0D331D50053DABD30C98619DA2223D746ABC4486EBBE371E33313AF8225E435CBA697EB1B3B99F7A209640C4C82A99CAA9C9642ED63878CC886CA77C45360A2234550E68EC486BD584E1BA6BF122AF1B931CA3D7C6BE30C281D6C5F6E6CEE2C9AB2CE047E56F8F80CE3EF606A0B0DCA9CA7B2B5945E065FD6E50535A3DF08C2FC90B2F02A2638BCF88679D669D7C16E32586CA509E960B73032F223A65EE1286BB54F0780194A0961684E5D4D1E09D147068742488267781305863FC1E2F4EA2CD37B1E34F4179C75F9BC433F279791A62A1D3646B57784AA401AF9AD6082A8F2850602B8EE534250C68223B77E23C7D2A7740D51948BDE1ABC0816F2EF176E9C15AC7A4F40775AC5B9641B7F08C3B084D79FE86464CB1848AF41E52DF272DAC4576319923E22D6845867422E0A07C4AAD7A60B8CF2F344CF82F492704D60C5621F798F9911B24BAE1C04BCE123E40F35A5A78DE33F89CA5BC310D4DC5FDC021159CCF412B875A985CEBAD40E723C9AB585267D1AEEE9737B0422C63F9D84660927A29C88E78660CD989BBA8C29CA60F83FEC307D4C9A676B49A4DA9DD9396E8A7A33CC72842378CEA52F9115D44E99D78B9996D2C8DC3C4198C67007E1F2972F434989B8450C8F87AA7BCD03AFA3542E937AB649FFD3E66E44BBA1747BCA1514C3B00F9B00391812D1AFE38524AFBD89D09948FD648D7945EE3DDD0BB0C67E063362B70F7C96EF09D1944CEDD28C371FD5A4F8D7BE55E47E052D72C95C362D8D1D1C83CA29F70B2422C1F909D14C4D404C39F2AA52EF69B936AE27E0F38C4B564E47399C0E58321AFB00BFAF647ACE5B18582968987A20766CADD4DD7B166DF9CD2DF9B3D339E70FE5BECFCB3A486B0A7CD616CFC8B439012C1A6E87DB9C0BE4CB9566051D5FB0712C5C80AAF79974EE299BC7526D2E351A7A8CBE2F35196C0028CB8BC451049876BAB7D2B6EA233A16BF2F052BDC82CDD43DF3D4DB55FC52DB36FA70AE7F98601BD6C89282AC94FE34854C86BAD00A597A5A684233929F1CA77F6200BE14E2D3F93D089089D800C73DBF4416DD831E175522CADA8FC004FE5AF3581F34FF2084D34ADD151AC9EC634BE82D9C2E149FA94ADF14B03827DE33B1B08C15EB890029713AEF895B413A1992078C1CD4ACADDAFB0546BFA8F940BE6393DFA51EAD36703900E35D8E8D05E02920A37F2F5C4BEC938FDB4B5AD058A9CEDA464A8D1A70AD936A5F7CC55B37E3F1651C3D8CDFDD7CFB1CB33B7E5D59F87E1102B3A534713025B6855DBDB7958708897D3 +ss = D2D4A23DEC18FD2C413D0C64D58C1D14E19D2A18AEF1CB038D14C3C2E79F6A69 + +count = 92 +seed = A28EAD0A08E7228AEFF602B16A1E752278B8ED1E91DAC67994F5ADC372E1D82F95CC390CD97AB9212275E0566C833FD8 +pk = DBF001BFA28B07E21ADC142C75111B9785AA2109A795AB792DE4CB7B6298A504200F8850D32CC44E54182761A1C9C9BA591A9FA6873A61025515B068099BB1E63751C5B887D283077F86B733E4344D13310CE12D22322F254A0E92779A87067D19C53C70DBB927E14E1F2892B5273949428EB4C70C49DA8AA7FB87048961DB4892A6F89F18F0BB69347B9575025A964047AC7BD2C7472838383A6072F8338B23AA07D6B7B221E18D4E3C62641916106694315A2FC5BB88C6D664667680DF556C3C046398A88328421F32ECB758BC64CF246815A25922021DCB67C995FC72CC6B46BF5CA9EF3998535AC5CFAB70AA54318F9532DCD138A4C03E2FF5024C52BB486BA7665B27610B822975C412331ED6C98E66721DAA1897936371113A4F17D96EA735A5CDC019809C3907C03FA950C00EBA9DFFC69A902151A39163F2931E1C0271D491562E0A87FDF7B7846C31151017EF08727DFB68F22A8585295659EA358CC1B85C9AB4D107413225B8259804B31850EB347E1FD37F5435617A7A07B15321CC204B1A6B7C30D67E91C088A458BEF5CB704E6B662189A9C0079E224A94E21502C0F1A4DFF6028EF6645CBA38C0C86EAF673E9B2613620BC216914A9781645FC48E33CB9EA06182637439F1D1A19FA50CFD3B5E2CB8310229B74ECBAEAD4B079D535521B8587A2995FA9B8C6694BE6E432343C97C16CA23BF53883E23CC38F10C38E54F5639B9FC0943A4F41CD0ACC8DB40CB12E644CB74B9D4B858F7D6767830B92381A42368476CF2602ADB9ED08B35FF5C4D1EA93C94AA75E218779825401D859902D19822E9820D86C7E57562795B89CDA97EBA773070BBC502884A6F437D7EA7A459C0764CD943E0B6A5B61B8358530459685E2842AE9AB867FA712172207E692A7AFFA872323779087547C3D8B89F368CE078ACECD55AAFD5305371A5BEF24FB255211B2169F4543927C845A3049F7A88513A682303960C2D12BC277656F15738C4368DEB70CFF2A32A1D179F4FDCA57812CEDB21B356E0AA63270788B510E58B4BF613473FE931DC80A9CB8BAFE63AAAC3913936C8A939C413CCA10A1277409250B5DA321EE5C24AD3D093C1C7095FBA34B81380E5DA561BC039E3A8C15FF3982A7938BC16446A3AB2679A50C2E5C1D1A08127DB4CEA30340B5589B2327988C97B78F003D1315DACB301520A11F9F0B4FB33CE7C0203FF11C6A66136C0AAB83928C145F4B968783B131281F2153925DC13AD133FCC5247B595CEF0F03FF0DA0A429C0DE9A54F66C03F1A616C7210B7ED3624FDD27E99F38472867A9283C6B294B0D7014CF9EB62F0D7B051B190F093450453C056081370B45F5EBC4C03808FBB5C6D8B659BD22612C2872DE9034B11C6AA6D356B2BACCEA0F909DA0C775969C12FD5BB0C8A9BED5172A9358E01C29D308636B5D668F5B2C9DEF1380BA23B5C84259D887D3DC4882702B41D99C72C800DD5B19935D7722610741A105C1D227C38C5665CD5A6DAAA991A9868499830C1697FA430BF4F95B03004126FAC283A167281E4B847EBA8487B0032914EDB0B67B1E320C25BAB50499378115CB07A9000E0156C9C93C1D90693B9C22623A3EB15618FA1C470481C4CF292B7462410D057C2E5851E08E31FD88AF2F84B0CF79A88DE834C1F17C7A5FA17D329CAA0 +sk = EEEB8866B17CDA12A45FCC6F9D05AFD103835147647A7301EE071366398473C8103AB3B064E340F4F9866190ACEDE02473FB49635BC38DEBCFF0F34C5175AE0EC025AAF19CCCD46D658C2A6BA62B50D1452B09C21B430EE9A3CE05D36A8E1AAB2BF0185F35664B4999CC8C0DF049C01056AF6AACB025708C184534F1172B28FCC94AAC2FB7012E20443F11F43478E7B1DD8A5C7D9B5A8818C0D2259C7F710F51003777B060F8DB5FE06C3520D35E97F6B5792B0AC3304349387B637686CAC1A6E45149173041FD7C3CFFF5A398BA832DBA04DD7179D0768122A701F4E0BFA48149FF140E2978A723FB985B939458B081E1068EE5102E5F540365E6ACCBB8C28DB84125B21E8D04622412C2F075CB57019EB828616CAA245A8B099A01BD86268CF491823E440E984335AF59924FAC1D43263AF725895C717E827532D35C7DA9AC1420B46AEF13C9F33A427BB5A1BC646F7B54A21760527D303BACB2A21AA39C5577BCD5F416F126741FBA9C2CF9401EC20A14E9A7BB927CC8135BBB0C3180696093289F4B19539C58655B8698A5D1339C9490BE7C04AD3311FD422045A5027B203407CB5755462C21AC51F523389E803F30E12FA9C0AA7B4A1FDD85C66989AF558CBA916C9A037AC7DE1A3F7F1B5BD3208FB6F28661696AD0DB88D10A3B224A5BB5C99CCC96820E153E478AC579C65BEC5A3D4B85AFF1C4AF5BB222E7AAAF9E9149AFD11EA5E86990913D2B543913942D148639D9815D4A8908362A84BFB6AD20B8ACF9596DF4187009E7B773070450010744712F9E7A9B8E9624E3E2B1D6140A9E4789775ABCBD2657AA487740314EA1E446DB5C09746ACCAEE29783B23EBFB255BA5C9706F1254703C676EA09801762E9FA45D858732AE7218B37107B3708EABA05D2C035FD447CEBA46EE446AA324BC184E7B929F7513C16BFDE5C5E55C05E6B5041552C17DD223AF273CBBF65A44B4B6DABD51B341464A9993EFFD671481592C5A655D116B963975006B13503BAAE38332248F58656620098F42F97A813DFC7B4DF880E5E783AF5D833B89079474040AC05A6A7EC5E9EC1BDB282443C736514514F1CB7455958608A62503428464D89C66B209C417445416A54AA66234B1A5BF1C0C3F7064B6D0A7243E170B6ACB01C033C5B1670A3BA6801024C03B24CC1786025FBC56BF04F3B241E4BE701C9764938695BEA4316ADB6ABACFB44F2041D2C29BB867379374B211E990F194B872A7B684A212DC179A4ADD943AABB1E6BEB93F5CB100FE342D0781AA80989406571D1B79D08E31AE15B81740A22DF02270F920EBFAA3C9D74392CD64E71F363DF221134E9BE32B6B855FB76E15B5C91CC6C3F750AEED71071A0803987CA7F35882AC31413A6001A6023C0A183961722B6EBBA16F5577D95BEA2C5AB446AC8E57ACC96281A07599A8D335C2C12388BB0CB9F8633CD2251C8A7563B396072D0CF6E7B8E3AF2192E5731341214C30708E128914C124973E759D4221F1735386B874905220C41FC731A22B9C665CEF0CC5353B799399905F0ACB549F13C6FA56FAE2907D0353FF2054ACCEC40310A2C4B62AAC3F392B014BA88FC90EB868693EAC83516336BAA601F600518FC820BC8B0E76C66DBF001BFA28B07E21ADC142C75111B9785AA2109A795AB792DE4CB7B6298A504200F8850D32CC44E54182761A1C9C9BA591A9FA6873A61025515B068099BB1E63751C5B887D283077F86B733E4344D13310CE12D22322F254A0E92779A87067D19C53C70DBB927E14E1F2892B5273949428EB4C70C49DA8AA7FB87048961DB4892A6F89F18F0BB69347B9575025A964047AC7BD2C7472838383A6072F8338B23AA07D6B7B221E18D4E3C62641916106694315A2FC5BB88C6D664667680DF556C3C046398A88328421F32ECB758BC64CF246815A25922021DCB67C995FC72CC6B46BF5CA9EF3998535AC5CFAB70AA54318F9532DCD138A4C03E2FF5024C52BB486BA7665B27610B822975C412331ED6C98E66721DAA1897936371113A4F17D96EA735A5CDC019809C3907C03FA950C00EBA9DFFC69A902151A39163F2931E1C0271D491562E0A87FDF7B7846C31151017EF08727DFB68F22A8585295659EA358CC1B85C9AB4D107413225B8259804B31850EB347E1FD37F5435617A7A07B15321CC204B1A6B7C30D67E91C088A458BEF5CB704E6B662189A9C0079E224A94E21502C0F1A4DFF6028EF6645CBA38C0C86EAF673E9B2613620BC216914A9781645FC48E33CB9EA06182637439F1D1A19FA50CFD3B5E2CB8310229B74ECBAEAD4B079D535521B8587A2995FA9B8C6694BE6E432343C97C16CA23BF53883E23CC38F10C38E54F5639B9FC0943A4F41CD0ACC8DB40CB12E644CB74B9D4B858F7D6767830B92381A42368476CF2602ADB9ED08B35FF5C4D1EA93C94AA75E218779825401D859902D19822E9820D86C7E57562795B89CDA97EBA773070BBC502884A6F437D7EA7A459C0764CD943E0B6A5B61B8358530459685E2842AE9AB867FA712172207E692A7AFFA872323779087547C3D8B89F368CE078ACECD55AAFD5305371A5BEF24FB255211B2169F4543927C845A3049F7A88513A682303960C2D12BC277656F15738C4368DEB70CFF2A32A1D179F4FDCA57812CEDB21B356E0AA63270788B510E58B4BF613473FE931DC80A9CB8BAFE63AAAC3913936C8A939C413CCA10A1277409250B5DA321EE5C24AD3D093C1C7095FBA34B81380E5DA561BC039E3A8C15FF3982A7938BC16446A3AB2679A50C2E5C1D1A08127DB4CEA30340B5589B2327988C97B78F003D1315DACB301520A11F9F0B4FB33CE7C0203FF11C6A66136C0AAB83928C145F4B968783B131281F2153925DC13AD133FCC5247B595CEF0F03FF0DA0A429C0DE9A54F66C03F1A616C7210B7ED3624FDD27E99F38472867A9283C6B294B0D7014CF9EB62F0D7B051B190F093450453C056081370B45F5EBC4C03808FBB5C6D8B659BD22612C2872DE9034B11C6AA6D356B2BACCEA0F909DA0C775969C12FD5BB0C8A9BED5172A9358E01C29D308636B5D668F5B2C9DEF1380BA23B5C84259D887D3DC4882702B41D99C72C800DD5B19935D7722610741A105C1D227C38C5665CD5A6DAAA991A9868499830C1697FA430BF4F95B03004126FAC283A167281E4B847EBA8487B0032914EDB0B67B1E320C25BAB50499378115CB07A9000E0156C9C93C1D90693B9C22623A3EB15618FA1C470481C4CF292B7462410D057C2E5851E08E31FD88AF2F84B0CF79A88DE834C1F17C7A5FA17D329CAA09BC32A138A2FB5B6072464172ABE0FD97E9EABF357C3FA5391D94A415B53ABD381C38C2CB5CFAFAC81B96A810AB749B61806B6D54C9F8CF4BF1BE0192423288F +ct = 7C87310316CC1AAE495EF575650D79BC38E091B72BF809E003C71ADFF6C4729139CE41CB1F669F1E1281F223781293E3D9AC647D16EA0D08402CC265F1F4C26D08B7D4651D88F2332BDB9F9F3B417AFE26A433BCE1E8A975D86B547E77E8D4189BD9E46F6F2842166D6389A5CD399E735686BDF4779991C1242E3BFEF69552D6282C476AC51EDA2C9D7A4E3100F8BC8FCDFC449EB57DA0F392CD889BCF45C337A84E48E3B83AD72C50C9D2905A4E22E59CC73AD7FE85D6BEA30550BA2BA5929A3847A9B78D886CA1B93E0C4C14DE5056360E7DD398CC271D96A7950F4C439526EAF8505A37C0DD6AB037885E48D8B66E9C3FB3C218D74AA7F31FCE3FCB58C2FBBCA23D78F994A4465907A6328C2E35D83259CE735CDEE26D516BE175C2BBD5E24616111FC7A3D95AE11D035AF9497BA41692A12900926E8FAA3A80A5349269D2786E4A1F9F57EA473C6173C2C88D6E4FF2371EA3FE8261C21C63D7E29AC72A2995762A378A45A9C8D811F2F92229967C3A7A409452F4EB01083FADD41A0948DE85363733B7C0349DD1FD4D231ACAB563CB5A908A19B819E579AC1A599F5B8135C2794B34A3314D1B8559961FA26E9396BAC778A6697363EF60A60158736C92F7C1BA912791AB962B327E6369C6EDACF69FC9AF49379387D5E8C4CADEEE9B3D5EEDC6919BE78A199DF3341F23678C6D657B5C65279484F18E4A9789B675085EDE2D55BD10311617649DED74918A752A44FF9361D7402EAF97128BED4147EF3CA81B159B304588D22802A2E05A0B2AC5031F9162FA524D28EF0381E166BB81FE396124C4247082EA6DD755F48D8B419BD6C52CAD8CA084CED3AEEA060642FFE0FC7E6C1630D056B449FFC1DA8E693F64925FC179938CF5283F6E3584EADC904338857396FE810F4F3175868578BC21608EDD7A8109AC5A8635FF8C4C3C6DA0C3C618CB2B3448E31E8414D16EA50BAF6A4564F686D12692BFE4AEFA5A0E57B84C55589D0B4CEB2F358AC33254453E001846A2C7C299DED877A07A28D0DB5E7A5E6D41C246775F951CF114F3CE64AD839681C17E995CA123CF2A24006400B4969B99E75D066B774FE4E994828FF84F171D9C618FD2D5A01EF845379831051C84A734C40871CF53935FF8AD0954902C017E8C323DD751CCF14BC50638A31629E4FA70EA6E912B6A6422AC19442832E8A051E7019A820BC6AB81CB9715998F34014DF73DB8F62F5957D53D1FD3192D9F76CB8E2587DC9A1738207F956F6BC706C3B3B7DB0C578D220F30EF2925A7E35CE01059BE2B8AC6561EA7AC253D5F50706515947771C052B015F61FF347ECDFAA1C895AF5BC7E8DC7463A301221AF6C95EB65B8FCD77B1CB4577F5053E34766631E75A0A320EC678ECAFEF5084E514EB48AB6490658492BDA71D6ACEC26488D29DFE809F576FD7F5F38ECB4918657E4C8F25FA09932F435F211E41B207A61D60C9BECFD50FA6D498DE3F4647D6AA922D5A82B33CE96399B67FBE369DA888179F95F655122E0028512944875308EDE8CE87E67A6 +ss = 52E36F81DD9A23FB9BB2363C31B715106D38520A31A3304CF754A9432E757224 + +count = 93 +seed = 92877D706DAF88EF3412EB143DB8CD91BC047A9A43B7ACDAA42523560DEE4C172697BE4332042FCAB91135839BF74AB2 +pk = 2DF84A0272C13DA5A495942BA848AC92D302A98A3E55937B8B1B49FE588BE32A540EC90B5CEBBD90D1B80DD24D32EB85FC041A7CA307E522B8C5FA9C85BC258C8ABB9F2678D29569F313A1E660A2454730261A6766945CE42C140E5181C68461EAF12D1F185C358233B9BB4902FC5089F851BAC83CE3F07BD7B185EF08626D7029129703334084375BC5BA27BA023CA6722319A916BAAD529715661E3A413C8137CBBB206E313906DF1CA77CBA73E5499F54FC53047741AF2341D5623278F76131AB47AF10BB4DEA8F493B6C0E4829ECF4C425A46D21755E93E5A80D0A927739848695BE93444A98A45D02D1131E493DA5A0A1117B41D4AB3DB35A7A2E95C6055BA70EF159E7AA0DD5452598F91477087BEF1396ACD48E747B962205AF92EB99FAA809B4BC47EB93BFD3860102D4ADCBFC39BE80024550656C42785A6788C7A851B107823A02A3DAA4CAF25097F1F9AFB29416DBB360C4A824E3CA2A30E19F94B805DE181D0A028E685C378DCC225112899A6B79869109CA4B094909B21042C179C6CDEB22564CFB6F89135022FCA3028CAF7ABAB19A4045DD5A60721C6BB47AC53E40CD932511F2E5473D3B4CEEB44BE1A00E090A886D345B13A58620C49CA0893F23058412054AE5069C1014361CFB0379C2215F330ABC647114A3C597765FD014C64C8C1B1B45B3BD02BE9D5A55B0CACFCE297581FB48FE0256F4C0CFC84AAE1C542F36730E5F10795C72157C653210686801210418B549A7398CA8B7C70ED007CB153D2A55178AE23A5B095EE2D116B9F3A1A9F19FAEC40D75256CDF76AB8E393210D3AFAE375A7BC384799A6EFC5B76F287499C6701368B8DDC219A9F2295E6E01D22C4A50BD08179A08044B702FFD786FAA088F867B63B951A92751CB0F839CD554A83745444C3BB88D3609A9A4BC2E0BC73108A71CC7534217872539BD6E942CD36A09AA0374A3894D279A1F7C38A56E7C0298948C330B8C3A5B6AEC3BBDBB87384677ADA78017564A7FE40C2983A9ED3ACBCE5E29E3A78502952A9540A44975572A1512B1D4284D9BB528E538F43A15216F4B4F2A5208E06C43896A19C416C99C3B677564975948468792EDB6532F9B0567F407FC6D6C302766C6D1373BF78A18896188CF20CCEC39632269F6A193DE5EC5DCA85CAD6BC79023C691D5682643B6F314827E0B24539E2AA91123B3FE42308F041DFB6C876D079D60A3EF5735AB8A36ABAE34F4A12729BE4A00F753C7E4699572375E6C7B037948684206C08A27EC12B26F7349CDACC3559AC29D5CBC35C310870597E391AC4E4C02991096F37492083BC1C43304BC3D5925843622494C735942DAC8904CF195387ECCDCFCC8A999B6D1B744A542359E6B167F91022BE1660BBD218A6A6861AA17C57152552172F38B43D5281956CAA77DAF9B94CF60CBF08CD9D9B4C1EDB6C4A17BAE3B36800891910C280C3E7CBF4AA11F33A7C70E3B419C2B2B9A64709C31878F913FB934D77B4C36E329BA98B44F394631E0A289042061F527D67446D6AB55CE7B43EE1080FBAE67085A2A03B36CC9AD9B5B546156C3C5A79B092A67912A19575F6B5546397C15AE334B451C3D919422F28B70727C75FB631A2AB012BD5971B5B2B75F80E14BEC0494BAEAE3C7AE947BD69827E1FB86388052C3BF3F8B4CD25A568 +sk = B27CA8D40A1CF8AAC1A62553FF541EF56B4B4E352E38C0AE8C2CB2240C2D2525ADC52B1953A1C239E3ADD71B5F7693196875BABF8B31EDC528F3B320E6569997639F1C9B5279C38D5DDB3B691B0228AC4480D45077DB55BAC24285C5820C49BE25632C4AAAA23ED84E10A1256D9CCA9B584D423A9FD37276CBFC5953C9284A4097BF71706069AC413AB857C64EBD179EB75496170778AFD74180D877C9D69E1956450B1289948323F64227960A0B24B442E78C551C5B35E89B34B018B80BD094F7594365195F44C05BACBB2E0A976A86559BD6B23D220B5C900375C6B188FB353C3B064CED669BEE6751D5D22659EB89900A92B7BA84EAB58B7E95CB8495191CA0491EF75A3ABB9469A7939796C2F8C15CA22283235852B0A96DAEC403C5C057B5AC91D09CB16E01BB0D078170E0CE9596B913E953C5AA67BD8A2FF20C0261CA814F334244886DAA0694368293FD858E14E23D13E66AC89A58867574804786C4C48D2FC003336C002A7776217ACFE7084588455A0A85B8AA51C33E99B1CDB75541855577911DB00475DF42168E7A21EFE57402303DFE37AB5BF10200395550A1639DA2AA8E358748EC38946BBD3DFC27DEB08F4F017ABE33A2DF3B9B96CAC0E8C261E487CFFF31A1484CA5E04036797CB4FC87AE6CC72F9EC0835AE2B160B425ACFA8B75236D92870E4D43BFA7EA5C98827F95DB6DD4200068650E3D8812DE827C3F660CF8049933DAA52793AC10F57AD8F2A7445927CA6022D5A485F9424662A175B2A6349B248AAF4853BE709D42228C3CE3B13990794B9698869842B81649CBD9482C2435886441ED9A7927384371D02005A514717ABEC398BD183B321134A4DE85A1FC9B72F7268CCAFBAE289C15DCEC18BC26B81EC43C6B8A3919625165617D60C33F1E6B04CD5492414A15BBCA5CE84284557C9CB481A951FA5DF2E444E2C20969F38284E60FF15B0EE707115880BC6D3834230C7D22C7CD69229D1EEA957F58B2D47B11CA97C926070CF1C1934EF83F5A26241C7C73959C8A0501C2C1C70671987243635FEA56CE6EE292B1D6AA26C4CDDFAA1751520FC3218E7E20C13C6A1DF4835C7D6C0BA45923CEB2AB40FA7FE3732E47AB652309CDF28091D8D86308B73F90D86995220ACDD9C544C95FCD24A77E7C90F2F15E52AAB595E11B1AC0799A3CA95E0644771420AEDC777A9048FA89CE94780C8F2B903548BD46A2C22E453B68736F5CCA6C35EBB027C0C7035678F7F69A9CA02FBB4B23746759660251F6757BE3AA1767D7280AA75B60A7A0CC892F70F67CDA886CFCABB451A36023C688D7AB5E0A3B5BC88514CED3597A594D0E28C7AA25859E57BE9FB12691C047A8A7373FE1695AE742027A8F5630CB2776721815742C66A4BA0C7E7E8B8281144B80288CC7296BFC8625A2CB995B548D48294B2FBCA97D375B91203392CC27FE835F62DB97B14739F6C8B1880A53DDD388E2636F866416817A110258A098D9AF4458A64C68654E97099746B9B9E23ADAB5653970C00719B54E4A2D2092CD7BD62AD9317357E35224184A4E24B4A58014F666B33E1530365070B73AA6DA432D04F2588F34AC1CB3B3F7FB4AB200B459966FAFC689CC40ADAD0C26108859A2943E2DF84A0272C13DA5A495942BA848AC92D302A98A3E55937B8B1B49FE588BE32A540EC90B5CEBBD90D1B80DD24D32EB85FC041A7CA307E522B8C5FA9C85BC258C8ABB9F2678D29569F313A1E660A2454730261A6766945CE42C140E5181C68461EAF12D1F185C358233B9BB4902FC5089F851BAC83CE3F07BD7B185EF08626D7029129703334084375BC5BA27BA023CA6722319A916BAAD529715661E3A413C8137CBBB206E313906DF1CA77CBA73E5499F54FC53047741AF2341D5623278F76131AB47AF10BB4DEA8F493B6C0E4829ECF4C425A46D21755E93E5A80D0A927739848695BE93444A98A45D02D1131E493DA5A0A1117B41D4AB3DB35A7A2E95C6055BA70EF159E7AA0DD5452598F91477087BEF1396ACD48E747B962205AF92EB99FAA809B4BC47EB93BFD3860102D4ADCBFC39BE80024550656C42785A6788C7A851B107823A02A3DAA4CAF25097F1F9AFB29416DBB360C4A824E3CA2A30E19F94B805DE181D0A028E685C378DCC225112899A6B79869109CA4B094909B21042C179C6CDEB22564CFB6F89135022FCA3028CAF7ABAB19A4045DD5A60721C6BB47AC53E40CD932511F2E5473D3B4CEEB44BE1A00E090A886D345B13A58620C49CA0893F23058412054AE5069C1014361CFB0379C2215F330ABC647114A3C597765FD014C64C8C1B1B45B3BD02BE9D5A55B0CACFCE297581FB48FE0256F4C0CFC84AAE1C542F36730E5F10795C72157C653210686801210418B549A7398CA8B7C70ED007CB153D2A55178AE23A5B095EE2D116B9F3A1A9F19FAEC40D75256CDF76AB8E393210D3AFAE375A7BC384799A6EFC5B76F287499C6701368B8DDC219A9F2295E6E01D22C4A50BD08179A08044B702FFD786FAA088F867B63B951A92751CB0F839CD554A83745444C3BB88D3609A9A4BC2E0BC73108A71CC7534217872539BD6E942CD36A09AA0374A3894D279A1F7C38A56E7C0298948C330B8C3A5B6AEC3BBDBB87384677ADA78017564A7FE40C2983A9ED3ACBCE5E29E3A78502952A9540A44975572A1512B1D4284D9BB528E538F43A15216F4B4F2A5208E06C43896A19C416C99C3B677564975948468792EDB6532F9B0567F407FC6D6C302766C6D1373BF78A18896188CF20CCEC39632269F6A193DE5EC5DCA85CAD6BC79023C691D5682643B6F314827E0B24539E2AA91123B3FE42308F041DFB6C876D079D60A3EF5735AB8A36ABAE34F4A12729BE4A00F753C7E4699572375E6C7B037948684206C08A27EC12B26F7349CDACC3559AC29D5CBC35C310870597E391AC4E4C02991096F37492083BC1C43304BC3D5925843622494C735942DAC8904CF195387ECCDCFCC8A999B6D1B744A542359E6B167F91022BE1660BBD218A6A6861AA17C57152552172F38B43D5281956CAA77DAF9B94CF60CBF08CD9D9B4C1EDB6C4A17BAE3B36800891910C280C3E7CBF4AA11F33A7C70E3B419C2B2B9A64709C31878F913FB934D77B4C36E329BA98B44F394631E0A289042061F527D67446D6AB55CE7B43EE1080FBAE67085A2A03B36CC9AD9B5B546156C3C5A79B092A67912A19575F6B5546397C15AE334B451C3D919422F28B70727C75FB631A2AB012BD5971B5B2B75F80E14BEC0494BAEAE3C7AE947BD69827E1FB86388052C3BF3F8B4CD25A5687EF43A72EF04766F1E899D25C9A005009C788B5FAF985123CFB3FB97975DE26DC06C5BEF7B6508409DAF847A64C8D30D0974FD3BA7476DC76C46B458A036D884 +ct = 4C5CE3680E598066FFE1EE7645E55CED8C9A55B6902A491AEB9B6447F58B6184343638F13F4F79D067A0A8A4F10CA355188FDE778B848886E2F38979B5AEF4F14DD0B47E7A95AE839F6A1945D9B32D830189F3994C43DE711F71E8439BCF957B62A8F97CD869EE551D167B4C97E209B972E175947E7C5423EA86B5FF5D4004BBEA6163EE2858FDC9D8A04180D01AEE7E75B8616BD1E37EF33DB050FF02674C3D9C58AF7C1A76D79F4940E29B3DD1365C8259B2DA36E8B8A7D05887BFD3E145E8C78F01CDB63FEDF457A1AF4746828734F23B947F68D217E3FAD14D7CF15B26651915C371D3CD4C58094F15DABD0013E7878EB8ACAAB33EFDD47B2B20688A85A3F92C6A4D90F6045127A17AF0F8643B064A4A30A983F7DDDCE4D8893A3F964578D0529113D9D248E09A41792D4053B8B04942E866AD0DE54F8FE31B64024E647EAB8A10C87526899C6FCE476314ACA7B9B5E2F809721D2660DCDF9FBA5734714592BE7157ED459BFA0500B94242C48E2EFAA774E0F78B0EFEE997658CC82C2DFC8C686C3406A6D997296F2FD3281D3E44750DEBA5B22CBCF7E45BA3663F2909A643838C9E7D5FFDA9AB840C9A0AF6D6FE29BE8A7615D896D8879EC16BCB9999559A645627553BF231FAA4344F6258FC4679C790668D09AB7393CDE99170A770E3BC4491C35F22BC7234C346191E09CAC7CE819B8E43DA70880BD3563622196D860DB3FD4B1E1E814660A024EDC779BDEB38CB686318EE950AAF42AA3B0042716D5365A102C5FEA90A7C0DBE71CEF891F12CA3D20F0A35F7D59E8EC5B35972FDB474D52D780C54B5C79D1C165DB237AC235528A42B21E3D667968418019AFE9F68F44D46DC96EB87A7DA38F2B0B943C9C6C2E87C724C99C65E5CCA40D6C85E32778CE1065F65C95795E0F1ABE400A4C78F22303D8ED54F9BE517CE2EEAE1AE6DBC04E9604DE79952DC74758027C616ACB8F586EE0F7BB7274D3E1E147E27039A44E3C1E0A5A874BB0E70A60F897AAE005701DAE3A9696652869F541EE178EAB5118D3115C923321BD28F9D6358FA012633076754110877C00376C5CCD57E6917DF937AF1C6F449993088D01993E4B470E98CF8F42F7A81120D175CA4CFAF063F76950D2E75046AFE842BDC15FE4CDB69369CC112050B62369D4820C97F407D8355CEE5D8C4B682E7D184F6FA02992BAE0FBBD2ABDAABFF5BA49F4571FED93789E52ACE387AD29A7A6EB8C0FFAB868A4542A42C1B35FD3D42E426714C01F82C8B11D77D768CB5908E60934678140524922EE339D3783C912151EAB2F051C1E61EEA79148F442FB7715855A0C9D6B857412D5CC3526584131180EC763AFF11813EB16446E876F48A25B8FE13EFB071991FF1DEF484AA00A976C4CA8D65B4AF8AB6D59EEB6957932F218DACE7BA7D57D402A9EDA506220A22F03BB70CB60134BC3334B005AAA26A7EA14808F13DCB1EB11BB40DF9A8CAA714A5F0B076F1C64BEF4A0607B174406155E77E531307EB8C5FE2A53D1BE40301EC59AA2CD995FFD5E55708 +ss = D072CB81AFF4AA5712E56F0E9567DD89F2B03488735BA4751A7F0DF1C786402A + +count = 94 +seed = BB4C0082CA4044B1FF60B036C9B0E0495D58667156786C530BC69D949A13BFAFF53798E456423D7A0E162A60039367D7 +pk = FED53D194419C06B92E51498AC2601869A1024EB0370CA3A420C48A765A5B99BAB88A759251CB83259A628603C54A831AC0147F3A97B8329474258B7BD6067476605A2B2B8311252FE54565C865E2DD96EA9E43B23121C27AB02C348310ACC38D9D583B0D8105DC87896C238069C689027910F9BCB5D29AEEBF57C2B9C78F76866768C0699C6BF743C0B43108C128A5277F39B32C351926369FB8754CD0197EB9AB602F391C4BA564BE2C3423005266229A10B21D31A7CC3D40C2E7192CB6628AFA692D3E75AACE66E7BB1169893C8EE45BDA5560E7F79C711D32D52C0C783EB40BF8977C3063CB114B6368A8D1486A86CB108D146A648E080751440F4D8087116701987C328D8547D0573F8C03D321AC07138A60954297CD832DFB989FD99ABA8B213E7501CB3D25B384C023F66776EFA3AD4981037A54400729634A782ADFC24404BBB4F2405A27A8500CD79E8521DAEE48848E485F53A28DE91089D849EBFB54D97D0CFB3CBA46A27438F426EEA1A0122F2180630864AE46CC5F3A828725CAE89331D540B5B3633EEBC0228000D75908F21277104D7816F56854C3289AD1A5C72C1655830089CFB9C90B1306724CB2828BE679B989A3565758B058AE983C1EA9B71F10553795537D454EED50F50A40274592AE165C846D85527E479E3FA8D8865047BF68D200287C0A5B8A6A78C4769BB3A795979B774713A522DBB723F3628F2F4126B639E3B4C5C4B076D321A208A123D82852AA0DB6FF8457E745B6B710B396C8106E635A379E22C59F17DF7B7070EAAB38D5448E4AB67E6B21078D5B9F9979C6D7365CD1423CEF6B4C2B186AC6B792EF9351B6040F423CA22E7A1455A0473273E3B53B92A132D7C44556477907FB41F981A06CAC9BEEB9655FE90C4FE93CC33337D78294F7C128FFEE82B0D4211E550342C599C9932A201F3CB8BB253A0559FD667A3D2CB46A4936F5CF9C4D0D105880A446066AE06841E12F259E4E6220D932633F77F9A6B463E180778D53C37E0BF423717F4D476ECAB6BFBDA7E461AC3CC9806FF4B38FB80C0AC9B0DCEF56E9B27881D1AA0892657B12A913A8AB84037A6C78399F53816D79C6A1FB40F1CE200334A7E74760999F8A0294C3029BB23EE0CB81700B95BA20140CC5DE537ACA62C9808240E74D508A93263EB14B7D202A31DDC2147747192BA1F38932538241AD1DB35CAA40097393038957B64E716D4CB3675AA9EA46257BF55A6D1FBC2C356B020073E16EBCBDDB3692515BE92DBA54CB62C702165C74864C3A7CE67D8AF92EB78496C4E8EB78B55DB7963B016A252A85E655C95936D6006BC07BA6250E458A387BD7BB43A3F5A16CD8733B66565377C1A74D5488C1A0DBFD7A6DFB474EAF29FA80AADC83267D0B98EB7A8AD3AEABA977A0A5E55B8937AB68E385F94DB13FBC6C26BC23B0B8BA331A578B99B493D875F206C278A3B4F63E156FD386FC13104D6DC96AE9BB3055481B846183DE71ECA09273E58C466EA225B1824246C799AB8B045FB844572882299BD6F1B2787E1094BCA102FB20E0A274257062385DAC60F37A15B0496ED23C465A3BA46BCC0BA9B5B78C93B45CAC0151687859B155AD62A8539CC6B872AEED63847CA64797460FF5F477504DF1B1894FEE3E6BBF8218590936E0102DCE8ADF459D590355576E1 +sk = 2735BC066A2488726C89432E56452ACB24A2A5407522988C0732CE072128C8D5147C42988F94A8516C77873858394A2BEF65B87741C5B9691B6DB84E3B1B2B2F851B1305832E4210E5D05710A5BB7195B8BEE0CBA9B5BA21BA57B962A280565AABE1C9015635CF1A7121A8581FA0A78AB26FC82838B6A405C6FA5D46469136CCCC34930664240915BA5C86E67ED9E73F4B123233C92D73BC05408005DCD6CFD62635C3026C990753C55CA8DD385A29B1C79FDB97C0B4CC8F26B28BA573B5194D6BCC065F5B97DF702009C43A65ECCF452447AF91200EF68F18CAC25E5C71E62A39FD7A26C6B64B47E29D1E4084801599ABA838A3808ED83454B506965507CC6D0B34BB139300D1014168A79D5707C74BBC7B980461249FC31734DC384C9DAC4EA6EB4701402084719593B62AAE53C8D55719945975CFD25BFF31C886640FEC37CAB3942676C840A453C6751CAF16A4743495BCDE6528A942A47E7C2D6499B2A872A76E928EF4B0AABBB21604F33231235A7CB47C96D9C976A2AAD533A06A24024AD0925007984D99ABA3AA8168A8AC92F662348686F756BDC1A23F8537545D13AE9F657CAA801788C9368864A05F40AF22E33E10705741F06EF577CADE6CCBF1D01065565A5B13284690BF611093E45684D6C69FC0F548AF852248DB6A6E86A2A907C95CE0053FD942A92B024DD18803474B03F73FC022912257454C008D137C5E8404379DB2719581AF17108A03F58DEA58892912C5FAB701D28CA845068761F6BAB69BBB75584F7D289DD921AB30379248C91106A784738B17CF0044418BB9CE34BCD913BB26D04CA04896109A255A39BEBA1A2B58490862409E473CA623933AC14C90F64CC74AF396C3186917061B5C8C28F3E8B694535FC2C73AF9843031C19166D2C8A3A76A2ABA45ECA36321BA367BD5B176B5C7B8D7B7192C95CF2803E2C3CA5D585C4EA63009C7B850F08759C278F1027C59499526A8B2E494203197A9304022FA0C4E47A3A6FBD8BC59A7C1312A6D19D3063E8078B1A1BFF964AF48151E4CD3CD87F49BBBE01AFA3A5BF46A7F9BC97DE729285AF35A6A9168683658EE37BA6D9499CBAA8CB44C93BEB287EF7CC7B1EB6491154C14FC2027AB49316B70B8237A546090C9687CC70CBFB82208A7F61F63AAC1A42961568407343A050B1048967C5334F3542860249FF9C2FAC8639EF8C125D0B9FD537FCA93C1006A77499658C0286267B910C10B12A6136152BCBC03E782C41B1FE94A000CD974A3A9ADE3A3B8B4BB8ED8B403683AB4EA3B84B84C4825F61F99D72EACD894337523C6B6AF765BCC99393213938D66B18B2B168D6C73C2EACC42AD22255CD3AC6D75200111C0A6076F02F906B1C96213E80310B8752B1B619E72366F9A0BA4283520333EBF8693F93A7FD6C3560058A8D16CB50B585B3D519E4263B050259A9A0A8823E3CADCD0B81C1CA53820323A9539133C68B0A6CAC1FC834B808D9375431F961FE3233C49FC9E88EA1ED0A068A271B502C0A0376A1309F86013B4947BB671C1B048C0905C8CE16D8035C7C05B9CB8755C7D7B6DB2907DACC5A91B61B666837F209075E8AC5B86444B49AC878F9B2E18D42E0F791AB7CB7C973CA8E0437F158889FED53D194419C06B92E51498AC2601869A1024EB0370CA3A420C48A765A5B99BAB88A759251CB83259A628603C54A831AC0147F3A97B8329474258B7BD6067476605A2B2B8311252FE54565C865E2DD96EA9E43B23121C27AB02C348310ACC38D9D583B0D8105DC87896C238069C689027910F9BCB5D29AEEBF57C2B9C78F76866768C0699C6BF743C0B43108C128A5277F39B32C351926369FB8754CD0197EB9AB602F391C4BA564BE2C3423005266229A10B21D31A7CC3D40C2E7192CB6628AFA692D3E75AACE66E7BB1169893C8EE45BDA5560E7F79C711D32D52C0C783EB40BF8977C3063CB114B6368A8D1486A86CB108D146A648E080751440F4D8087116701987C328D8547D0573F8C03D321AC07138A60954297CD832DFB989FD99ABA8B213E7501CB3D25B384C023F66776EFA3AD4981037A54400729634A782ADFC24404BBB4F2405A27A8500CD79E8521DAEE48848E485F53A28DE91089D849EBFB54D97D0CFB3CBA46A27438F426EEA1A0122F2180630864AE46CC5F3A828725CAE89331D540B5B3633EEBC0228000D75908F21277104D7816F56854C3289AD1A5C72C1655830089CFB9C90B1306724CB2828BE679B989A3565758B058AE983C1EA9B71F10553795537D454EED50F50A40274592AE165C846D85527E479E3FA8D8865047BF68D200287C0A5B8A6A78C4769BB3A795979B774713A522DBB723F3628F2F4126B639E3B4C5C4B076D321A208A123D82852AA0DB6FF8457E745B6B710B396C8106E635A379E22C59F17DF7B7070EAAB38D5448E4AB67E6B21078D5B9F9979C6D7365CD1423CEF6B4C2B186AC6B792EF9351B6040F423CA22E7A1455A0473273E3B53B92A132D7C44556477907FB41F981A06CAC9BEEB9655FE90C4FE93CC33337D78294F7C128FFEE82B0D4211E550342C599C9932A201F3CB8BB253A0559FD667A3D2CB46A4936F5CF9C4D0D105880A446066AE06841E12F259E4E6220D932633F77F9A6B463E180778D53C37E0BF423717F4D476ECAB6BFBDA7E461AC3CC9806FF4B38FB80C0AC9B0DCEF56E9B27881D1AA0892657B12A913A8AB84037A6C78399F53816D79C6A1FB40F1CE200334A7E74760999F8A0294C3029BB23EE0CB81700B95BA20140CC5DE537ACA62C9808240E74D508A93263EB14B7D202A31DDC2147747192BA1F38932538241AD1DB35CAA40097393038957B64E716D4CB3675AA9EA46257BF55A6D1FBC2C356B020073E16EBCBDDB3692515BE92DBA54CB62C702165C74864C3A7CE67D8AF92EB78496C4E8EB78B55DB7963B016A252A85E655C95936D6006BC07BA6250E458A387BD7BB43A3F5A16CD8733B66565377C1A74D5488C1A0DBFD7A6DFB474EAF29FA80AADC83267D0B98EB7A8AD3AEABA977A0A5E55B8937AB68E385F94DB13FBC6C26BC23B0B8BA331A578B99B493D875F206C278A3B4F63E156FD386FC13104D6DC96AE9BB3055481B846183DE71ECA09273E58C466EA225B1824246C799AB8B045FB844572882299BD6F1B2787E1094BCA102FB20E0A274257062385DAC60F37A15B0496ED23C465A3BA46BCC0BA9B5B78C93B45CAC0151687859B155AD62A8539CC6B872AEED63847CA64797460FF5F477504DF1B1894FEE3E6BBF8218590936E0102DCE8ADF459D590355576E12C0DB43F39B672B2CD912F907CF76A0F6FDA925EB2D205546431BE0B37B204114F797C007E4061F95C7D56CFC7EE5C49E849DDE3FEA8F25E7876DF2A18515C34 +ct = BAFB19B80A5CE997C3664CB158299C969C9020D74B644EA41906922A18329F70271FEA4912E7A67335279F58CB3E5E4B7BD7FE3C4A18327BE182BEF8D989E13CF8CC43955E9F6BFB3D4A2C8AD71DC01BF30C34718D01D5D4460C3F7F85E881ABC66E483F8406ABA076C08F6BA3C796945D4E286E9ED09E8B64204FED1354A33EAB64A60EEAC0296357E5AE0058FD67FDA21B0A6DB5029732F86E9C9B92F7D3B5380BC601A5FF35A037862BDE3A399D27E6119F0C43CC8CF852C522EEF46B4867753684E30B27F4D98FE039F203164855CFF6315769BE970D0AAACD411D35679B33BD68A852F836374921C99BCE48C782321E68B16DC964463732ED2BC4002757C7587CC3C780DB57BC7F1BF936A6F685E0F82DEF692568B99DDCB49A8376F2774F2E77F7DE0D188258C4E1BBD0652BE82112371D92EB01D8C38C9A84E5237AB8F6A333642B2A86C9DE4993703428104F76F8BCA911135C78101DEA18F0929F6A00B0F07854E814764F15832F18F60B6F25262BD448453E51686775A824FF5C743B811625FCDB7503E0834C79596B066B6EE2C3548CD6062AC11663E5497632280CFB8BB33B392C8747681A84831CB37799C4E42A25E16552354756CA0D41F19FCE9B3C9F8BAF18D05DAD841740B110F2C1B4E101F76158F307E9543E2015AE0924628996E652588E7EDADB51855ADB306CE70B1223EC445C425AD76D26E89514AB335CE2236E6A3AB1A7BA399B806609E5D22857F3ADF23DF5CFA3C4EDF0AC3EB60A00C27D7C02E0AA3851FB6EC063ECEF6E819AD52F92F260BAE7F83BB44BA8FAB3A608251C2B1DF90548F9DD2BEAC4FDDFB54FA10B251E42F3FC4FA9EB320BBC8AC34BBAF8DEE65BEF1C83EE499397F7930D61B4BED065D809A1F5E6E377C9563C660DD8DDEDA94058861B4875504DAC970EF8097EB7A75822D5EB139D10159D6007CCEB08A8EA28BAA27F78BF60E825353C5AF62F2DEC4AC0E7876A004DCDB4F12854EFF4013166053B9108F5439AF99FAD00C61169BACD84876956E53F1C0267B6E2985DAA07E34BF852947C247450A6AB3BC1820C52BB3AC9550BE7AADA0F8AA692806DC57A748F2C355555C5C58BFEF181E7277DA1C25CCE4B995E6B8A90833AABCCE74E7DE925A2A2C888930D052B9541908472C79E7A5B8E9E08E4CD3DCE557B35E34D94A741121AF0A7DF97131567393826F86A7BC0B785965C5BE0DA83FE4357D2A36E57EB1B1DDF651CF7EA1497563F4CFA4BA171DC8343A3FB549931479DD581FF018B5B10B9E1CB529CA248C00EC45B3F36C1DE804254F54C9B68A328319B59555FF57D832B3F9C047F2D343289582099685AAD6BF96FB956334DBFA7E86589D8D643780C431434F64411CFB85E9898288DF9207C7B38798CF8C68DF372C2A6BE4C11CA29D29CAED09345BFE47071AA801758331B37F658DB6E7EC1408A43486B772807646E5186A40E73EB875DB09DABF293AF7083878248306E2318C72B6E0843F852CEF164446A25481ECE7432B974A0C240CA35DF4AFFDC +ss = DA1085CBC7452CF2AC98CA36631C6EBCFFF02E60485F9E807CDB3DB77BC92243 + +count = 95 +seed = 121D90E70AF6204445D0DEB28AC0C108262719E9FD3476ACA74BBFDE89FAF04D8D5F89A624E8A75DB80431F0D10AD28F +pk = A0E473A9D639B1299251B46D07C79C0DF1CEB995A968B5B707B760D8BCB120F6226EF5B742F34548902A7C73338A8CBF8D6B02A83470874B1EC5845DCFD3A4067C420F8485FAE1286A23ADB7373B9217C6DC173748870BFD164A16D62A3A6608F5E2B7FE78B92364A4B821967DB45AE29AA1B11C0CD67CB4299B32D263AAD7A26EEB3A69BA56790FD806ABE3935D82487AEC3205A856B4981E7F53B8F82A30D13C1B725B1418607B6619B0E8A8870BBA6070E33545730182FB5F6F9938AB2CA68C50719FDB472A88384EF210B0C22785367DEDFC840979AB758479506064B7971426D70AF9A95E7D585DC8B67D4FFC2082BC45A4FA9B4FB9541493C3DFB88FCA757ECCB50F1A9CCED9C046F37062E3879E13958BCF063041E858810B057680276D2CA12A307F511217FD626561587617674319382A4A00CE5E3BCFC5ECB5B3816133910650A469AC663F7A4A742DDB87C4E5BE636213880C246370B1CBB8ADAAB6BB7E1185E1F95C945BB001A0210CF56F326B35051B8DBE85245F9BC6D973B39AFB3A3B961501862B4CAABD0D55693C201390F48FB7511990571985764BE7373A7FC4BBD5E82B31F52494B15B6C2C8B5B593182028BD7AC7A40FB446EA756463C396DE29D0FDBA2569B9001E169F7C824C8A42D313A15B682BD52004867837344324E2F91A06A4C9F7CA447D6291635257CB0934E015C1937F732C1BBA2C13591CCF4ADD16960B2303476000D984A8FC8036772C3B7C5721261387AE535129A7921A1711C98103161A95EBE16C0E0A28555DC3598CAC2D701A98CA249801A4BB10379A5C29A1932ACB6F6C3D040639FA98FA7297C6D453E35587488576DB9BB2F9D1C37F8260CBA3BA90E4B779867AD97DB03FF005ECFE3470D2C25D54105CA287A9E0C039C2A2B71A1CBC6260D59A268D60C05D61202EC336CB8285B41A043BF58949DF50DEF5937BEE1AF32D174E8FB463D03449BA747E92A79A1EAC8DED247AA0A50821A16AD4C9F533A0FA24684D452A71DF461AEE15CDDC2185551112682B4867C6CC27C43BF835432CCA184840B85886A5D970E9F515F7F97151410C401E9BAADF41CE2B8642313C295D28587A327C41C24DA18967A6426663642DCF389C50892D6847718365CBBBB80723C1397B90447B197842C96A141BF6CD317BF12BB64C664FD237E886A9F793313AAB15F668C91C71149C4B90B35B147F7C34B8AB6948799897855B22283050B113D64A60AAC739948844A9F99C448D21C414425D77560670C298F493D891128AB1665D8141D2B1C8E67950A68255B7F9376332B1CD7C6630AC05AE7C127FA7ACC35E640E94285E78661B15B21685A36C889A8CC890CE53C36EF23C2F17CBD8C31351BEBA827949F8707A05324ABF05AA71857BCBE690405AB0030E648FCD3BFC0F2AE2C627E04F490BC3BA237059AB93085DE218029F056B0F57ABD342170F5B16DB069073A3C16BB1C0BDA5136952919B22AC477AC2489237BB0869656614E4AC248B003799C761B2BA5F2711B24A01419C88937DC4CE745ACC16C796E0123A4228EC623A2A4E059B80B72BEB1329C9204B6555B0A62C14DF0B19B4A157BCA985090B428DBA8587B53CA2714B2EC2A04D306B3CD5D09045252960A068412F1BD67B83A217049D0685EC3D63D691559A327B2 +sk = A680635121C694AC4672C809BB3B913E8CA2F659C756DB1D7BB2369F41AB4AC9B3F5141216F3C997B00DCDE37352D46463F371FEC14B26AAB239498D44975F787504815552E727329DD78428F5568B912C76B572AD9B3D335A9F5BC0283C76AEF8D81369A0CEB4523BDC4BB0607C29D9998962F76B217774D74A3453A61FF1F40F89A51365212F39A07E913824BF36B6DBF6C8934014DD8716E998A982B124AED8B082C3A2998708BC1C4733773B73E0BE315203E8E264A032797280CA0AB023A9D81FBF0565F491837CF031E219084B640EE8710589E05E1701870BDB7BF0B0BB539A0B3AB0028447110288C1D7D83F89578413A46B0B04406657B4E7E5A6D04BBB91055BECC8AB907CA9647C4B8B144045B6CABCB974A47A35308A23E9C9281C61C556EC148C9A663AD9518CEA36AAEC71B6995110FC01CB66B75E128478280FCD31A3416A12E28C15BA617574730437DA8BDFB86B58D88C789C4F9E23ADCEE53B170C6A0B80033AD52CFE1A155EA1A568F5B2EF77AB74878E0CE42A1F7C3C845713D17105AB2C91B83836E11B9858A66997B22E8A67682588CA78E6B6D736298EE34B100BCE61E0AD921A9F020A7032351DAED655D35B3659A96B32DB9E68D882FC986DA904408A98C469A84CD29CC999B2B071F84C921C585B9B3233C5BEDF82637BB1253A4B29B36B42B54751DC629A215656AA1890C0C56E0CB62A3C02252B771D72375A60374BF8D84552080E0D456579930B3F2A2A3B7913C031112FABACAEF75BB2DA5202D7671359282CB4707B52740D9CA06AB7034B48A292404D26B6CFD08C8B0DA61550044069F4CF27488C028001F2C29292840B60B321DE5CBDEF1CA216838091C3172ED26D141C957DD93BB6A59D9E883640D87A2A85605A9730DD5333843805374B58747C7262D5A65EF442D6843DEB731C943269B4A9BF00F39B4A3847840C1BF4B9907FD7B9A66C5DA724CEC467102F080D4D0BC519D0B2504A05F7207EDCE7398D009348F64267E01B0EC207780791942565AEB061BF03719D706F87953C4757A75A126EAD15C6C9447C02938C3B75A58AB25CE65A5CAA21898FA8050319880223899F5546E0D253DF7950691B86F8E3115438C3B80CC2E7A6178A96A0F38A0CC47394BE36C9B0721580D646A89B9327210D40728F4BC4ADBD8B130EECCCF528A5A09595F32C0F64E602F6898B8A4C82D79A8ED31C4172A7812C295C93841929B782B334490EEAA38C17CB4E77664306BC7B01726EC656E24311C51B0524C72F0745665D43073604C59EC88DF6FC9EE2F2A0476079BCFB735E562F57E2B0E1987A0220C98F0B4CDEBC70F93CA709C5C2FAC7098A7B866662ACCDF09C85974D7C88CE9AFB01F48276EE320D70C7C0E15950FC0775E13173B60555A470302D0A0047260E5CF85EA2F3C326968D3C308C15EB400B13BCAAA65EBF941EF59A069BA0BD3D00841B6124574303BA8C2BC9F90F107865882C18EBA462F6B09EAEE05796E43A8647C59C64B7A8DB9C0941299280AF728B872C303755B682A3EC10C5876F040543BBA028E870C02A4312AEE9CF2BD1302DF80BD0FACBD0765A778A7FA2D3A4C9675965D6799FC7BD4E28A4E2A53948790234F62BA0E473A9D639B1299251B46D07C79C0DF1CEB995A968B5B707B760D8BCB120F6226EF5B742F34548902A7C73338A8CBF8D6B02A83470874B1EC5845DCFD3A4067C420F8485FAE1286A23ADB7373B9217C6DC173748870BFD164A16D62A3A6608F5E2B7FE78B92364A4B821967DB45AE29AA1B11C0CD67CB4299B32D263AAD7A26EEB3A69BA56790FD806ABE3935D82487AEC3205A856B4981E7F53B8F82A30D13C1B725B1418607B6619B0E8A8870BBA6070E33545730182FB5F6F9938AB2CA68C50719FDB472A88384EF210B0C22785367DEDFC840979AB758479506064B7971426D70AF9A95E7D585DC8B67D4FFC2082BC45A4FA9B4FB9541493C3DFB88FCA757ECCB50F1A9CCED9C046F37062E3879E13958BCF063041E858810B057680276D2CA12A307F511217FD626561587617674319382A4A00CE5E3BCFC5ECB5B3816133910650A469AC663F7A4A742DDB87C4E5BE636213880C246370B1CBB8ADAAB6BB7E1185E1F95C945BB001A0210CF56F326B35051B8DBE85245F9BC6D973B39AFB3A3B961501862B4CAABD0D55693C201390F48FB7511990571985764BE7373A7FC4BBD5E82B31F52494B15B6C2C8B5B593182028BD7AC7A40FB446EA756463C396DE29D0FDBA2569B9001E169F7C824C8A42D313A15B682BD52004867837344324E2F91A06A4C9F7CA447D6291635257CB0934E015C1937F732C1BBA2C13591CCF4ADD16960B2303476000D984A8FC8036772C3B7C5721261387AE535129A7921A1711C98103161A95EBE16C0E0A28555DC3598CAC2D701A98CA249801A4BB10379A5C29A1932ACB6F6C3D040639FA98FA7297C6D453E35587488576DB9BB2F9D1C37F8260CBA3BA90E4B779867AD97DB03FF005ECFE3470D2C25D54105CA287A9E0C039C2A2B71A1CBC6260D59A268D60C05D61202EC336CB8285B41A043BF58949DF50DEF5937BEE1AF32D174E8FB463D03449BA747E92A79A1EAC8DED247AA0A50821A16AD4C9F533A0FA24684D452A71DF461AEE15CDDC2185551112682B4867C6CC27C43BF835432CCA184840B85886A5D970E9F515F7F97151410C401E9BAADF41CE2B8642313C295D28587A327C41C24DA18967A6426663642DCF389C50892D6847718365CBBBB80723C1397B90447B197842C96A141BF6CD317BF12BB64C664FD237E886A9F793313AAB15F668C91C71149C4B90B35B147F7C34B8AB6948799897855B22283050B113D64A60AAC739948844A9F99C448D21C414425D77560670C298F493D891128AB1665D8141D2B1C8E67950A68255B7F9376332B1CD7C6630AC05AE7C127FA7ACC35E640E94285E78661B15B21685A36C889A8CC890CE53C36EF23C2F17CBD8C31351BEBA827949F8707A05324ABF05AA71857BCBE690405AB0030E648FCD3BFC0F2AE2C627E04F490BC3BA237059AB93085DE218029F056B0F57ABD342170F5B16DB069073A3C16BB1C0BDA5136952919B22AC477AC2489237BB0869656614E4AC248B003799C761B2BA5F2711B24A01419C88937DC4CE745ACC16C796E0123A4228EC623A2A4E059B80B72BEB1329C9204B6555B0A62C14DF0B19B4A157BCA985090B428DBA8587B53CA2714B2EC2A04D306B3CD5D09045252960A068412F1BD67B83A217049D0685EC3D63D691559A327B2AAE8E61B905723FA092FB95B839F6DE3670C39CE0498C27B87D20C24E7F64E22E32D432B4F9F751BDE0496C580A181FFED762AA35454A02D3F1F47EE0394C89C +ct = 8F9648D01A9027F4E1AB3D988F096F3470D09707E288699141A14A78A88C95E1771E6E12B02BD13C2E99207B33F9AADD87C79715928CF9FD76956FC73C2A21D24AF756AC54F75ACCF2667AB9D8458380743A1609A7DA99A5FB521D1061C263964800096B930CE7D448AD1CA9BF48524892960A762B382A1EF36B4ECE3EBD9515EC7295692546891C10C53C6829AE866943E569F539FF1101B5F0B2AC7D1C94EEBAF6378B13BBC1C8A2B144A62A10D752A1F05DBF1A9CF7F1192FB7919CE51FD6CDCBD6BA26B6B8AD7FCAAAD17F3B96DDB8CB78CD0EB4E96958AD38D2FE9BB71A87547AA7CB0ED2AD6CDE695112E6379A333D135808DE697F7FEBE9C179F627F419689B2050E5DE6C87BAE3FDEA59124D39F06F264E2723683A092FB8382186F1737048026459D6E242C0E7FD386F6AE6C8B09FB6613F26745DA21F43FF145C83DEE40C927918C26E8C855038FA8F994790C799393EB031D3DB7F499138186CFF085F3669B45351CC0579299D1E37578D753E447EC2B161DC50373065D20B44712EB059040F72F98F51858E0A250A97409374EF7BD73D58798697B0FCFA35946933856CA5A0A964B7DCA6617EA2D35D16A8B83F536972BBA727BC3C16EE363B5B63CAE7C13AB11B4287568EE64229671DC45F06FEB3DBA8ECABCFC16FBCFFCFDCB4227EF4E705992CA8978A19D1190842A4099A21CE4F96814FEB88E094A69EA7B7BF0EEE9932A1C235AC2ADE53897D3D8BE0E4F02FA7F0CDA13C4EE78127F1FA8C611F50CA159DBD048E9D888234BE8D80B49324621F7980E490A13CA0C5CB8D4CFA07528E808839FB9A21FC167BAA489F3C96AD67B89FFDB4145F3FC9A827C2DB3588B0B348FB8F5F469315B7B89F5C25EDA806D921DEF1768029F99777ED29AD1031CD40EB1C12A92A8D2A130D2D0C1560598C430CB2CFD73E19E290EA864E80384359188D67A53A15A4F31DF7502BB3123BCE2614B87C82DECFD29C0264286A9641AF0EAE2A38E6CA1F065A9E619E3CF39C1158A4BC46A40EBE72536F4607372471D5D6D6CAE5E2FF6265B7BE9DD3B466C159D54FAFEAE8E3CC62ECFA7BD2D047C0E3E93D163D93C7EAD30CD0CB41B789546CF11DFE9306CCAFECB8519C08573268FE46DB18203F6C4CA916C4E1133D5422EB966F716622DBDCD7DB21834BB10BB36631AA2C50FA46D2909F0EEF33B3C62846267A9D5E7187623337950DA98496A703A5E9F7BEC4C2E1CCA8CEA8FFDA5BABE1BE1E612DF7E9625EFFEF36733097CDE4E88ABCF2B8878D3CD9A47C6F907ECDC63E87E89C6CCC6AF8CAB530DCCAF3597E33AF7DDD3814D9FFA5E90A335E31DD2ABCAAD72807AD5C6D89F6FCB1581AEC0F0BFBE7315CDB428D905795BACE3138178A8B1460C665398FD57295014F82C8630EACBBBB4C52A1D22E58FD028B5097758AD913922F6ECCFCFABD165D9959F29C2DFC6B4A548D6E75544D70BAAD0AD24D74DBE1E51EF9C9EA4AE3345B121AC8F0D041F359BC653987C4215EE7253FD0BC21384D0BA14630F5C049A398 +ss = ACA83F1DC628FA87B20133BED4C2EEE34B98021F295AB585DFDCEFC9E3C032F5 + +count = 96 +seed = B3AC6503206ACCC2A92CBC210D020A2654726911D11CE676AA04FEAA08AF1D20C654E4105883AE470EC3AB299075D420 +pk = 4D960C98359F5719B20DCA6D1E2916F2829E73F79B55B468170B64F2F8B0C788796801C8EC244E1973C7E033B768414C55D43079B2711BDA630E678B184A70DD161C4DABBCB91C07FB634620D1450664A444E82D22A0A4F54AC6C7C02D74120B2CE205FE49A139B9C8194341F4295EF126B37F3B22E35792A8853B60EB3F7ED01314491C4451470870A5EA5B1D23442019BC1DEF547FB8935ECBEBA0833228B8D7BF2A4ACA52436A3F993F6164666EBB3C38317BF5B48CC7182C00D58D4A095D0FD4C60E4229E77803C4F38F22464C7A4259E45AC71E8CCDE6E5738DCC798777317F9847F8357DCE21B24AE462D0465F1D58203F3B8590D88DEB9C6DF4722A1420A9EA0813EC3777A6CB11CA0271292B6C662A870C292291164004299C82442A8DD5404E74CFBCB45175237AE5649F7136CB47B9C6C053203F265BAB420EEE2C95A5960F8A87C3333785E1B89FF841A6AA5AA964F3A853E512ACABB60E29C3A4810DF33830134C0E49BC5E1BA41B07B671E1BA6BFDA82576406E6DA854920A46914C8EA986B1D6A0328D4A450FC0CE698B9D16954AAA0C52B6F2B5FF7B5347E84C3AF403E9B31EC180238CD5AF96F5C6F0D3644AB51717F7255AD6551F44378294778937CC56B610680704BFB37E3CCC07C5276777E37F36623DEC8225388C3A5A2C7026EB902C63260CE27FFE657BCE34A47DB43667B9293E04AB9677B6FDB0B0A429A4435A9F5624628A2C07BBFA8AFED562BE4233019524E67CAE6F955226437433BC59835561C462071AC38058C145787C242D4B6DC055170675190882792EA49726DC8B2CB638763784D3C23E1791C93A55383A8C4B59643626F8948D228B670312893AB3CE5B123401B1B24432545889D4D124D2B846070C1663B87A3475C01ADC4F4DF286FC91C76B018C05B5A26A696DF86C4B1FBB2ED3050CC9B54CA2786839F854B9461655972FE21C3C98007A693A4D0B8AAFA3AB73F1C411DD283CCE59528477B6E089847CE6518F29B523602F80AC573618070BCA649EFB84FC3947D43B229E05682914C153809521EC9B7978A6BD667F59B18F1D986222DC9AB345AD2C7C7CC5799C15297C22C3734DF18A218C5BACB364C9136B8E055053567A1856C21B96A1A2723913C98CC364BBD1FC4EDEF37E1853C523727A6C677CA4C82AC4D49238E1B60C1531D1DC9835C4A96124A0011C09350353AAC4568A84293E8666F6016E56C38371489EDDBB3DF3E53E6767BD01E231EB122F13F59A83A35101844AB389954E8068F6D7128C738AC1774EDC6465EAE8CCBABCBB41271467C407D36928D9E3174C99665E3A9AF0FC1B2733925B254A3ABA050EC3925DABC511427C0B2930BCA63BA7629366C1BA620CC0D7090752157B5D70C098745E37DB7316056C7BB37C024226425107DA8BA0E9C30E2606752F31A017E50A0E10C05332677EC851EAE14F594A55D07392C23A962248CCEE1221FEB2C8F801860892B33EF2247B801E5FF55BA97675A71037FD133133840050B8B7914125E9D30165847319EB1E483005CA0BB8338B75EED618C47408D0260DDFB1527640A148F29E64F65FCAFC59A8715A8126830024767009BAD41A3385C0173BE51A35F3825843B59FE06B5FC03DC21F6D925B9F6D92FFF175C9DD625BFAF502B4E2870961858852 +sk = CF8293B02A9A6F579F51066BD6E51ABD270104634CFD482823102F2B63B18A8BB4F45A5AF4D8202523CC1779B44FD283860BD004307C399CA5D8EACADE156AF824A988F5AC6BB50EAFA6177A95B9752C922BD6A7C4265A6A88B11D0403E47127B1E80787742669E763929483393CAD6EF91F18143E9D2B7CD3E028C6F56B91768113259BCAB926A082A2A6185A1BF18656448A628258E21A3C6CCA23449B4F9483AE9D01BDD4BC674E06566300AD2A215809E547E2626F8D9437BAA727F3F05C31E85E4D34643148981BB6A82C3C75099A33A0E7528D45303D98223E1A4EF6536170F53A0C61004BEB75FA34B8AED5156E4A538269775808283CB0BA5282607D50661D2A626FAC2737C98CF33050353BB83E1C1136F1C26FE48D81973EB974AB1BA4B97C95C0DEE065523430CC06620DEBBA3DB92888497658BC5C64B98BE65AB2A0738F0750022B95A66C583354A63865B5237FE7098D279C53F731F3FCAE8689754194A7B888199B89761FD09FF75677B2C500D7359905E76357163834712659F26D0D8C9B47192404975CFB89969A77615D1A3FB404BAAA54511FF1B3B08C1577EB274F5B3B0B825434E87F60D18FA73141F912701A99A7C11305000789229A144A0899685596AA646F13573EBA0B54DD3205DE2C60C3CA1614066474B89F2377994BD14EE0A77E1D4C0AF77748C1E623CB8947A98636694C4EFAF0CE2BF779C66A317989A335A0071505831471C8D845A5FA4B3E42D195074244F70578124C4C7894AB84584DAEC8C13A6598524C023CA99F4C0499A68ACA3E6827798B10EF9A4639605E2FE8656606438274AC8ED8C87AE0A16BA3B8E5857A7F25831D8B85BC7105828575320C6BABA75489455154B31E50074A313BA9AD10B747F39405544F44949DDE165070C8271F1BA80E57BB5BD1320C8A1F8FB47354079532BBA51282AE3197026E18C46AE6B2AB9940EABA9F1EE421592770C9A9604263A4917C825C084C3534381F22C057592DD97940ADB1A439D5128CF795CDD25640FA9229220A1CE4A6624CC9956105465246334C77FFCB9907159461CB1416637D8DF34AB4B401413C27B6D5A1D23331F88273222653ADF9685A614BEC9840355B1A23A0C4CE60B0B678AFFED200BCB383BEC2580C89127B2870745C15570BA1CEC89F5DCCC47BE517BB020C57959E433C11DF10810D5B37AA8AB3392B3358793246F11ECE238646724BEB859C861463C42B5030D9A1FDBA3E1D391F9CA5A99DF58A7948C66FA2B50864B73A40B52DC7CFF031B3A3B21009268CD5CB00A89B44C156333B802AD03B2F07F70F7C11057CE78705AB6EE43681AFF0874030807412A7743399CAE832F6F3B65DF56AB1B30D6967379E10B4EF53B9EFB5632A23B942F832A7FA22CDE494B0C7393D51AC807A38AF119D526A5A3B91068E107812269EC85410AA739C288C20446B68880343F2E12157094DD424A349D1523E76C0ACB9C29C22B6346386B522B0466BC8A85B97430A1DF80850510C4825EC4F2AAB987C4A07F11693E7BBB4662A4890A3C54EBC0CBBD75CA468428E38276E81C43D81A8D0E3BDBEBAC9AEB89FC9D7870BB88C5C16A137C41FEE75640774C4B536BB1D7BBCE797844D960C98359F5719B20DCA6D1E2916F2829E73F79B55B468170B64F2F8B0C788796801C8EC244E1973C7E033B768414C55D43079B2711BDA630E678B184A70DD161C4DABBCB91C07FB634620D1450664A444E82D22A0A4F54AC6C7C02D74120B2CE205FE49A139B9C8194341F4295EF126B37F3B22E35792A8853B60EB3F7ED01314491C4451470870A5EA5B1D23442019BC1DEF547FB8935ECBEBA0833228B8D7BF2A4ACA52436A3F993F6164666EBB3C38317BF5B48CC7182C00D58D4A095D0FD4C60E4229E77803C4F38F22464C7A4259E45AC71E8CCDE6E5738DCC798777317F9847F8357DCE21B24AE462D0465F1D58203F3B8590D88DEB9C6DF4722A1420A9EA0813EC3777A6CB11CA0271292B6C662A870C292291164004299C82442A8DD5404E74CFBCB45175237AE5649F7136CB47B9C6C053203F265BAB420EEE2C95A5960F8A87C3333785E1B89FF841A6AA5AA964F3A853E512ACABB60E29C3A4810DF33830134C0E49BC5E1BA41B07B671E1BA6BFDA82576406E6DA854920A46914C8EA986B1D6A0328D4A450FC0CE698B9D16954AAA0C52B6F2B5FF7B5347E84C3AF403E9B31EC180238CD5AF96F5C6F0D3644AB51717F7255AD6551F44378294778937CC56B610680704BFB37E3CCC07C5276777E37F36623DEC8225388C3A5A2C7026EB902C63260CE27FFE657BCE34A47DB43667B9293E04AB9677B6FDB0B0A429A4435A9F5624628A2C07BBFA8AFED562BE4233019524E67CAE6F955226437433BC59835561C462071AC38058C145787C242D4B6DC055170675190882792EA49726DC8B2CB638763784D3C23E1791C93A55383A8C4B59643626F8948D228B670312893AB3CE5B123401B1B24432545889D4D124D2B846070C1663B87A3475C01ADC4F4DF286FC91C76B018C05B5A26A696DF86C4B1FBB2ED3050CC9B54CA2786839F854B9461655972FE21C3C98007A693A4D0B8AAFA3AB73F1C411DD283CCE59528477B6E089847CE6518F29B523602F80AC573618070BCA649EFB84FC3947D43B229E05682914C153809521EC9B7978A6BD667F59B18F1D986222DC9AB345AD2C7C7CC5799C15297C22C3734DF18A218C5BACB364C9136B8E055053567A1856C21B96A1A2723913C98CC364BBD1FC4EDEF37E1853C523727A6C677CA4C82AC4D49238E1B60C1531D1DC9835C4A96124A0011C09350353AAC4568A84293E8666F6016E56C38371489EDDBB3DF3E53E6767BD01E231EB122F13F59A83A35101844AB389954E8068F6D7128C738AC1774EDC6465EAE8CCBABCBB41271467C407D36928D9E3174C99665E3A9AF0FC1B2733925B254A3ABA050EC3925DABC511427C0B2930BCA63BA7629366C1BA620CC0D7090752157B5D70C098745E37DB7316056C7BB37C024226425107DA8BA0E9C30E2606752F31A017E50A0E10C05332677EC851EAE14F594A55D07392C23A962248CCEE1221FEB2C8F801860892B33EF2247B801E5FF55BA97675A71037FD133133840050B8B7914125E9D30165847319EB1E483005CA0BB8338B75EED618C47408D0260DDFB1527640A148F29E64F65FCAFC59A8715A8126830024767009BAD41A3385C0173BE51A35F3825843B59FE06B5FC03DC21F6D925B9F6D92FFF175C9DD625BFAF502B4E287096185885264E085F67E48F00A7A7F82963E8C67176BFF839A54FA1008328C0612F98D83D35AEDA108EA4D6C6BC0FB958286850422BC357CA67B83C986048E0D0087FA11EC +ct = BB06BFEECC7B7777B56768C6165C5347166BA71E8DC7E9E0258FF889BC123E6B6A1461F717FFBBC9CF11662E6FFEA09EB65AA287ECB4D7206D103F931B0E3C9EA8D71BE6F87B03EDF777EC1427F839922A7C8EEDC8DB4C8FECCA7665227029D6E23F5ED9163253D64D715042A5F301B41E2C59337F282DF32195EFCA03BDB3BD1D8B65C562ABF51EE8FCB39F51CC69DEA3BE7547341608444CA2EB9A9EFF2A3805224504440CF702C95A1FABAE452BA47A25E4D6401D24C0D8FC61962D4E11842FF6C6F82084D28F921E81E818DBE81B7E6A25596ABEC6809157A90C6F8779F4810BB3890D93E6F30546D982732AF2CBAD9E054AB510B64E6377DACB97104C64D9AE8CB451700F9A7776BEC488786733BAF3FBD6153B8B80C468FEB5EE28338817233A34A35E35F97D518AA8C07C9921E3D1BB96984FE1D543630B4FF34CB6AA6C64D7E3A7EBEA73E4B1379A8C53ACE1F2F2F07DF7017262FF152686BA28D8A3A348125F33BA2E795BDA25D2869F8DECB8E02453169E6EC9AF252D673D09060AC1F8E6E203E5950B11D1EFEC554D7E405F918E3472F25AAB2FFAB059EA043038031D23AF3911743FBEDAEC446C316B2801AF1152393F55820A5A7BB6D0DDBCEDE3F9E02423D7C8FD195F0194D2C5BD5A4BA6A9A5C934C1F7CE98D7476E2CF77837AAC2B738B1D6925797CD8752103DF9DE929119340993E36993956EB1CB7B8CD3CB067FE790A36BCF52CE218E9D5C009651EE835C724ADD8872ABB9E360742609E10EE43656719F140A155644AD25825AF6DD160D0CD944E1481AAA174A265DD18DA10AC0DC9F68337C5780672A36001209D8901E28F449ADA470A7134AF449A57494684E98124AD3901D680BCF62BE505368F8277ADE5BA33C3BF448462964728CBAB403FE5B10581E2BB377E10589A06B4C1AFB54927A87A016F63CFD1EC46A8C1A1764EBE07958FA2DC54C2CB90336C4769C7D118F56848122255B995752CF2B51133A4F96753A47B9B7C14E3A2565A326237926C870C8F67FA709F50EA174C3D0D57BD660438244EBD6C68102F1990FB1F1E06F0428A5210159EEA9C1774DCC4CBAEFF4461BA6966F164121EA26F328E831EAC62702119B42C7F430487145B68AFC16E7BAECD74A7EE349997A5244B6E9D74F17F00283DDD99808103AADF2365E4EB5DB20B40C3325333DD9877E019EFC9F1B95FFE67E88976A796DD735A68405C465225E951ACD794336FF7D7C5420BAA47ADA9C9A8C5700BEE94F0C80E693939D73C5C3A0C029DB9053D8D3C2E3F6EA47378FD225E704185D29C30F0C7AFAF47B3B9DE45539B026C77F788D00AB2A2CB41B5C995C0120C1229E9C138E6480BD9AADBABAE6CFD7ABB5FA97EC99D35B76702E8D84D2DF0333E3C9F4002D0C68E98E81440CB0D551C77AB6DF66348E2D798AA8092618B958317881F01EE209CEC22CC8EF0123A0C346EE47A158518C43FE926BA6F49056EF387F023AB9C57A6C0832E53C178A761ED7C382F76A81B340D98EE6FEFE208108994BA3F31F48 +ss = 3CC0EF85A74184338A10FFBFAD5F6D04860D51E7DACF3EE73033B70969785AF8 + +count = 97 +seed = 59EFF60B1EF6185DB34EE1E3B1DD2F159106CECEAA79BEB74923B4F5623D5BC52DBF5D2594A1F7C6C64D12CF144E9ED4 +pk = B49B9264FAAFE731C0DEE965AC981965A28FF907CEABAC477E2C9B6DC95AAEB0531CBCB65D8B3F6251BE17ECAA89A5B57C1198EA66AF1F4461B91C360E4531C4D49269896107F10ED1F1070E68CDDB2A4E06C387F3126087A71A366A250B450BE1567DC957BBD034B66AB65FD4EAB2D89B8481EC2427A4AF3C1B861C799263F492779053A0128508C86EBD6201C876BBE8AB8053B790314047A1901C9F327207B2130BE5BCE8504BB03817A380975CD81FE0C0416986A7B74A16A21146636ABE4D2B2C5C1223D39265A6845804D49E5F160ABFE3CA21A345B5D044AFA5636C37B976F2894869BF4500C62AE9941B9B3C3E6064FEC351268243FD75BF287CAE8AAA9AAEFC1CFBA1032AD2623A6239A7F834A4826F86132B59AB24EFC9C57CBA929A64BA90271B987BC08A913298911650399429E9BFC40742DF735F7CB935EDA73A41F96CAACBB34324B29E64348C6063AEB0BCEE9066028B3340AA147B09C42752CFD6D491FFA497E17AB6C0726AEFE59C2577764A1A996FD879E58C23F1C0AC9E9372B3F0BE42C829B7B09ACB722E3189A2B3E72124895CCAB565DAE583C6C76C34C2C0075568379639869325F6E92E0B91A2D4100B2F4AA6486B756CD521E1B781A964A21B8B0C72637A2E4299FE15C1AC275FB077CF42F36453E7603C91A648E09CBF128ED188639B7247584B333003A2175BC587925111654F24680C540B32643B035FF38BB4598785524504EBCB26163D513867D74744C8B562BD48989B3A328374A125CA05FA962AC08B0D22277E578206A165A9E3D31A084B4492C664448AA62986B55FE8C8420816A5A9C035644F592969FD0951B6E9AA57303D1F9927FF6B3DE99263E2E11CD8317CFC899A45706746E9850922B9A4F9CDE515623F3C48B86379C969969934CCBEC4BEA3E9796889CBCC56285E9A85F0B3471BF9692F3C72FFD945089B9A262AC1A8844C38C807F7274708AA0587F94A107089A99694FC627291C30FD6B0430ECA692DB54A96019EAF89635CF54F579A63048070B7F32DD2C32A18E2B7E8400344412E9DC5943BF3AF11B4AA6C328499DA7C220670958A22BFFC89B8F0091C8665B6605571D8A1B5C934CE4686C7C047AE416BC6E39B7CCC92CB076DE94001374217E9B8820354351CB377B4F06B7FBB69F64C7B48F781DED2CFEE998718D875EB94866E7C5135358EA4EC92849978438C77CEC1BA1803BF9933C8856657C953125EB76014BACCA8EC9BE6290936130D166B187E1463E55CAE3AD85E96E81BC574220AB0CD374AA1F657ABEA849259B4431F1A00EE59B35486BEB09302BF71B4C2E840963333B4A3BE37F8048D42A0F67C886DE9B47611555495248AD4C587577D45775F52135518793EA14582BF153C74210C36B9251609A4B28559ADE5A93203725A475971B92BEB88A69357BF83F384577CC1DFB62C70FC65401073C67A66AF878FD961BACF46C633E7CAC0E5092458CBBA0C3B69494C4C0C0DA6025CD6516C1AB89B3216BB9BA123040051563610251974A0B11BE7190504522A128CA3107938F5B18E4441B52F7944B0E54CD3946C57E7AE3475BEC06791A9F5A83EACBB12F40AC971CB475610A0E6C546998DAFE5C2ED852D7715B3DBA61B94849DEA30E28720BBCB90C7AF7FEB0AF619A0CF57D173405C82 +sk = A428A1343429CE9C3DADBB6213410E264426D1CB5C69C68E7F377BCBC454AAF867771258FAA622B6367FC5CC46E960682A3984A13230B3D7C25A69CE4AB9AF0234A109878E0CC42A9B858DC559AD3FE82C4060539C08828C51B337B7C0EA768BA646A2F04900A235A4042B88E8934D3B62821A13B67A912F162AA80953CB71C396D91B91521B6665062551E0A6CE453C233460789138CB16AC6E598F670C70D6325804CC494466710D984E3EA551F5EC60C5031E94421919F62C301181831B7FB4FC61DA443FE12784CF84B5ECF240DAECC87D711AAD10808B96233D345BA80B0469797DC03583214355E8E9A356E367A593A6898355AD129A8546A0D03B2279021889C118DB3583DA691A9AD544086540BB2178B2125F00C94AE753038486B6CDF1CF7E5A2202290B4E5AC807EB04BEA95678B52FF76C4757C68D2EB9283B8766F1A39E06C999015B1F1D5C3164338AEB432D54B338C361B9A7258981555FC2563E585A6FF60886C32343E0045746E50FE78A0A9BCBB6281ABE3474BA50E1267B3276A1327A8F128E2B5AB077618C59902C35488553F745D2A0C942B81C0AAB7AFD0C869B9B9C66C1847257CB22B018B81B25C468A9BC35A180B090F4BB90C4EC035C0078B799046833CD90F7BC2678CAB9B75B95A6B457DCA8FCB84937C01479A0B7B6DA9643DA507A2B8B1AE25373825189729BDA8B35FCEA315B3B359705CD5B486582379093E64F431309F0389FF899BEB4C3CA9689B412A210EB654F183362AB8398B1E3696DF7432BE662CBE62666471F2C056504A5C1C91017A6326ACC7306524058FD0937DDEAB972B00734F60D065A1BA8655DBA3093D161B99E698FC778B2FE782FA8EC7C62D422E17B24FD107B87A8338AE7AF6994C70D959CBFC3720B3174B9658F5D43713CD47325EB926320073F384F04E6831435524B686F2CD377C18363F8E554DBE6AF09F93C2FF2A1F4A87159472E7D7A4DB9243A1C6A636AD50735B870F1297B6D6B5303E2552A54AA5991340AA40301CA2D6BD9A765B72FBDE1C3C44A7649EA350E00CDE59628E06ACAD29888C9B73CF0AA65D44B60F086C21C6ABCBD544295317B55EA9AB1117989AB7B7304304E5612119396727943678C31CF2B1779C946B82420A557A8D6426263D33C7F71591C7857E90A7FA05158E315AE19D1046249B3011B22291CAE30501D1423674824B852C34C97258AB972AF6C5195FFA20B6CF05BA0498A529756F173349BEC8C180869293C5967454D01CB3C8EDC7A3A776DBA54C37513727A69CAACFBAAD8EC4A529A1872CA25CB4A99C38B225E379ACE27485D8B91FEF9CEB97C04322B59F533745D23720AE457FA11B3A0B831DE777D07F88ED1771FA1D89DB9ACBC7BAC471BD423ACAC482BFB29DE13881AEAAAE2F340C1E747A73B9071CC551EA59B03646B65BC2E6E04875754A77025985A026ADCD321574AB45CDA47134B560219338FC93B0A398D7F85169B4B32C2EC3A06529F8E3A57FD353327B03F87D5CB60C67074146FB460476C92619D9C23BA7A371FD9425CFC6486992959109CFA1C1A75AB9EBA4235AF63C6F8648AE7855A4EAB5C9D3923386996181980B16B02A53060E5A64A8CF3CED087BBB49B9264FAAFE731C0DEE965AC981965A28FF907CEABAC477E2C9B6DC95AAEB0531CBCB65D8B3F6251BE17ECAA89A5B57C1198EA66AF1F4461B91C360E4531C4D49269896107F10ED1F1070E68CDDB2A4E06C387F3126087A71A366A250B450BE1567DC957BBD034B66AB65FD4EAB2D89B8481EC2427A4AF3C1B861C799263F492779053A0128508C86EBD6201C876BBE8AB8053B790314047A1901C9F327207B2130BE5BCE8504BB03817A380975CD81FE0C0416986A7B74A16A21146636ABE4D2B2C5C1223D39265A6845804D49E5F160ABFE3CA21A345B5D044AFA5636C37B976F2894869BF4500C62AE9941B9B3C3E6064FEC351268243FD75BF287CAE8AAA9AAEFC1CFBA1032AD2623A6239A7F834A4826F86132B59AB24EFC9C57CBA929A64BA90271B987BC08A913298911650399429E9BFC40742DF735F7CB935EDA73A41F96CAACBB34324B29E64348C6063AEB0BCEE9066028B3340AA147B09C42752CFD6D491FFA497E17AB6C0726AEFE59C2577764A1A996FD879E58C23F1C0AC9E9372B3F0BE42C829B7B09ACB722E3189A2B3E72124895CCAB565DAE583C6C76C34C2C0075568379639869325F6E92E0B91A2D4100B2F4AA6486B756CD521E1B781A964A21B8B0C72637A2E4299FE15C1AC275FB077CF42F36453E7603C91A648E09CBF128ED188639B7247584B333003A2175BC587925111654F24680C540B32643B035FF38BB4598785524504EBCB26163D513867D74744C8B562BD48989B3A328374A125CA05FA962AC08B0D22277E578206A165A9E3D31A084B4492C664448AA62986B55FE8C8420816A5A9C035644F592969FD0951B6E9AA57303D1F9927FF6B3DE99263E2E11CD8317CFC899A45706746E9850922B9A4F9CDE515623F3C48B86379C969969934CCBEC4BEA3E9796889CBCC56285E9A85F0B3471BF9692F3C72FFD945089B9A262AC1A8844C38C807F7274708AA0587F94A107089A99694FC627291C30FD6B0430ECA692DB54A96019EAF89635CF54F579A63048070B7F32DD2C32A18E2B7E8400344412E9DC5943BF3AF11B4AA6C328499DA7C220670958A22BFFC89B8F0091C8665B6605571D8A1B5C934CE4686C7C047AE416BC6E39B7CCC92CB076DE94001374217E9B8820354351CB377B4F06B7FBB69F64C7B48F781DED2CFEE998718D875EB94866E7C5135358EA4EC92849978438C77CEC1BA1803BF9933C8856657C953125EB76014BACCA8EC9BE6290936130D166B187E1463E55CAE3AD85E96E81BC574220AB0CD374AA1F657ABEA849259B4431F1A00EE59B35486BEB09302BF71B4C2E840963333B4A3BE37F8048D42A0F67C886DE9B47611555495248AD4C587577D45775F52135518793EA14582BF153C74210C36B9251609A4B28559ADE5A93203725A475971B92BEB88A69357BF83F384577CC1DFB62C70FC65401073C67A66AF878FD961BACF46C633E7CAC0E5092458CBBA0C3B69494C4C0C0DA6025CD6516C1AB89B3216BB9BA123040051563610251974A0B11BE7190504522A128CA3107938F5B18E4441B52F7944B0E54CD3946C57E7AE3475BEC06791A9F5A83EACBB12F40AC971CB475610A0E6C546998DAFE5C2ED852D7715B3DBA61B94849DEA30E28720BBCB90C7AF7FEB0AF619A0CF57D173405C828DAB879DE09B58D0FC7ADE140393FFB5343ABBDDABDC118FAD519B14436A964CE63F8FFDA3565C2424C89B20974B748A65A5ABA75133FCB3156DFB6626A83BAB +ct = 48E85341492FA71D05723CC0673917821EF717D8C55F9BD6450037745A043EBE12E9A233C310791AD66C101D93B88861FA516333C842C610009DC7F63486830E641A34D44AB9F1E5CA2B7F8513C3C89456EBEA4859AEB7117F90ED1AAC3DCF53EAB33C5363CE46A7AE78CDD0473D4B5EF5DAC4450B95C5CF335A5A656720046E4C12A9054857946B4F356B79478E864E32848DB05A51439A8A72567CD04D82E2CC61ECFF93C154190DD3AC16910AEFF13723D93775B1626D55294BB16958BDBF6CFFDE4B1BEF349AF5E0C7A2C902066A0440E7E5408F9D840AA74C34A6A318FBD810FCAE361B3688EB8CA9EE0FB214B386FC3718EE9141EEE6156280A8236A5EE0EA14A017C08C5EB6A90DCD4771EABE95E33B3966B6C259E2C65E4C1C0D0B34CAF2DBA11FCBB30B10BF337D49416B3E20C492F6CFFB6C83DB5A5E09A8E4CFF44AF0675762E43CA34559E14C1FD7E7F9FC5CD48B02C7CB9B0B788FDCB86B17E302F0C4F9C0DF1672C59DAFC240267D59737B2E6E4DB21982C928810B58A2443AD99E64CBA79AC9FE77249622BDB56503364ABBE7B5ABCE8EDF18F1E710C4642CF794CC22DF0837EDB785D0FD3D60551C5AFC94DCD4F52F3973F4C9434060B0C2A61E046AE5600FB4C9B00271DDF543A0EBD1DE5E41B5A6C7EEB573F862820E92AE2D9D9718E21B93366F54FDC58B9E83285350AEF35191463358DB9FE8860739F6A4119A00F5351F66B06F6EF7A08DD9D387FEA300EE7059A98661D808B50E75F5415D7B82738B73E3BFB58B7905F572C7E47483781BFCE45A805E5D647F9197E5D829B0D80F5B5A617E68FB2FBEAF1A8906F6A5C72CB5D90A04F0109871FB3743D3F588056101EE96894218A2E68CCACD3FCBA9FF4791A985352CC60F7B006D95D66F4903CCBB2607C37B8DB8EB88567A4ACDD1552F8D558C1396046856AC2A828F9117113372FBDF1002A70C9EC7FCF1A8F74DE26D48E44787ECF27BA4383448AB4FA6813A9F320FB4165FBFC363488DE37D3A540D4C55610425A8DE574870CCFAACCC5414B4B9BB029D85F8408AA033EA4D7E7C3074F848A188E13FCE09840C11C3DBCECC928A2079D954BDBE08037729AA6135B68D208A9C1CA2BE8323A949CF303C8486D5258952DCD3190879E986A5EBD406B8D09CA922041643E9E647C9C4E61453C0EF9D64F14E56EFD043D257936431D287FBE3E7B0E4CF301C5A7CB0730DE2C1CB0D22CABD61C1D0006B3E3F310123FD000F41093F4A3054974BCB39E9F474055C1001D372F21A880F864147BCF855FC9351651DCCD8288C2525C7959CD9F2FC6D410278856A5B2B10AA0FB6EF76F5F44ACDF0C01380E38E4A8BBE861815DBF2FB0723E60ABA41B235EAFBAE36DE07F2D478EF39B05D20610772E5D89B7C74D4F626586B8A4BA5DE91D5380A84A8092EEAE7515EF70FD9DBBC54CF9FBC41B3876489FDD481CC2D2CDA5B4231C37CEB508EBBC9712B304EF4EA2BF1E4F75D8D789FE73CA2F7FB9F03C4B48C796980FF39DF52CEB477C1B2D6C4AD1C +ss = 1DB6E99F80628E170260354EE6F3854F905D198E9669B4FAAB478F4B39CC2F0E + +count = 98 +seed = DDDCA9DC31BEA737D3F474E7560B37FACB2F53C803E768FFAADE7669FF94B1D4FBD17068CFFD5DFDD24AADADA4EF6B12 +pk = BC962535672A8D77C9EAF9726CC1A8B8D87D61B1461F33B7F7F5A003A8657297CD100324FEA561BA879FFA75287D9A838275734593ABC2B842D9353906334D3F9324C7D00EED794C78310421DB45CAB6900817348D67490BF1485E85A3DFA255694915D286AB5243B62D3A91F8493F0B19626FB89C0B9109C6E1084BD8C848C06B3472A65A2646DD89BE2D922A0D2C5E816652C826854AB36F44809EE56C9F7E26A1DC30823535997A05255756704AA1029B86601E2853C2D34A192A9B2B76B31C69C1A048A76A6A58E48BC8E512B1C767347AE28AE046076C20179D0977D2D54A3F78ADD2EC6BC06071D9447F0461846FB1A5E91A760112424082C2994A98D07AAB29E818FD15134DE437C7FBC59469CE8BA80545A4A5BF337FE142B72E602D8A1B3009CC95975759AD38274E234AEF0552B8AA65CDFCAC975495A84C124F8426A9C87D8DB03CE48B0382642CB9E31CE210B774724912B09B16D88AE007AC4542C092F9BBED9C262D823D9D5719B357821D4C245F384FC923CD334B9DFF579E324A0BCFBCBA61FB7AE9F69B3AB88693E005EE32BD1A6A3CA950A22421125391A060276B07242A795085D0098906969C421CBC469128FB5393B72590FD391DCDFA3CF87B9F7A4C6CC3A1791AE1717478A5280A3B7580BBEDF88F0DD7C1C09AA67D6B284334049398BA983BCBACB8C56237BC3EFB3FBFDCB358A006457832DF7A01EFD937E68B3299580CBE1C9F69E165D22683B3721E4189ADAAA91846B7717D41BAF8D9A1DC76C387F0B55C2552533326597466ECF06ACA624FBF73226E471D835B0EE4A24A8F1C5FBE359C61D974A4D57C2F7C49822286CA27116839B784D6782C13B606B87804BA0969C7C47C7A29CE16CECFF5514028C3D84944EC8CAB4B4ACB5B681723511087E25B8AE84F3741A2DE6CC21E7A370B35C255C34555F29645D4B420494C4D993BA3F092EE240F1D3691753420891ACFC9421C361CA2186B563ED63456096227EAA738A33AB56029976C1125DCA790114AEB83AEBCF271ED59BBC2E8377301B53D697CFABB4C6B40BAE19B6CECD421A1109F9CAC7B71C749E60A2005A30179C393D5033CB4F8795DE4C98D91538FB9A8CB1654B1E6A82918471470461F54CC71FBA50DEB3E1221C55AA616AD5262E352ADB7A89CA04557A2090FB05704B9521809B8CABFA325892AB46765CEE83850586918422212C812373A1C6217BA890B4C5310F7B0D5D8275B884AA9E4914C85023AB53BEA88AD4281A7F501A87534AC1D806B0F8691E9F1BC7171001043015B391CFAC09B5FA88F840C63194632BD5A012B34B50441BA08C879C44654F136CCCBB7114F7B4099016E0193CBBAE63522927DF4B740B3CA5B32B741EA15A47370B98926A1F90618F5235357E8087443C93444803DD22BBDD5340C876D41F3AC1DB59E9EF17DB71369A315600FC6801A54483FB015AD3766284A97CBC241AD73461F4B2A0F6645EF428805762A6E57474D29288404AD98FAB63AE95E25436626BC66EE10C01E55103597288AC521B463886F863833948455319D3455110B68BF7BC495D1A922191A1A230A5F036C3C4AC05EE2609D09891CE368C01F037D818805A566193A433E924B30F4E86DC76AE2B345932A0E7025F8CE6101884469E31AEACAF4D77E3F1201BC75 +sk = FA198BB15B4278509DC232002C75A8BBF1853C474C8248B5062821E4D77FD5880979922016D17377F76A89AB9477A1024C9780FB728F6DF3295666828143C52FE817B9688C70EBA292D2716AB4970840ABC4603F597B5FCDEB0144813602242625A067EA48B426738DAD0AB986369AA5326DD199C72212C59AB20C8F63429683721A2C682C5AA853B86542698732AB86FE39C340DB2D452286FDD599336B9923599B66C144C0C7848C20A6979133FB7B5EFA3726A4F44389CB93D6A9C1B7E300CB852698C236AC00B2855861C88BAD062A25423362C7774C1626834EE59880762508FB518F926A3F475D01AA8E5C8C4140537091D494AF66B0E9426359032A2264AF67E63541C2408B1853F87C68C28C8C13417F94D77F6AC3315F23405C233E14F7762C152609AC34842553DE175A6FE1C08B44BAA9D15CF09A6049B05B69F71DF322171701AE91D050778A6754E374878169181A2E1336677889318CB54218AC055491B918BC2553023167151C98B30E1340403E0C59B3252F4D0C85EBAC1877798C41AA43C5C7B738B7CE116428C049370BA6665BE646B3125AEB947B1F3B2EC5357C7566C13EAB148C453D6B2274A9295A06C822DF9222CB2026F19603B5602D08D46D4C71384E776AF2A441894826E4559F5975C586E47BC0236B4897622AE4396160334CC97ACA101805814AE44786D1E445147A4728275C32554B9BD148AE9605E10C5A6B556704F1C17297A32EB311F1E92EE5F160E8522E06554B93B5C796E44086E75D236CA88ECC533C3B348091891E35639BD6CBDB3A408720B6E3A328C4268454169267A5C5348703C412C58846C192E0A162014600DBB351424FA8D0599775BD2D851DB4B07438F655AAD6402628563DB3A435F75D440636CD64041DE162D178C923490839F190F106BE0020AB63E7B3EB718A4FB59E01057C416C330CC26E485A6D9C72B707DA0B297C0A25247D26D40F044844C2DB883A5BBFC2B06F1BFBCCC6D10B65C9BDBFB806D7A04CD71774DD60BC423C1DFA897A0512365CD54A90BA6AC509298BF6455363583843925281AA405C291F11695CDA995A9AC5F742351560B38F8720D66327B4DCC47626744241679247CBE42695B8D81C37C718CAD53D1B318F9F900757267C43B982F26639901028F8F636C35091F1CA90A1E329D5CB069A918F45A078F33AB4DFD248390627926AADDFF47ECEF1718B2B048304CD40E72FB0872B6207856A61BD764034E82BB426747405E1AE5B93C63CB12C7BF09E47E27117D26ACBC102B043616E60B714316DFC17306A77800EE87E03E4B74759794EE6943DC274AEC1A08197A841E68F258202B1124803064F6E3295DD51AD18949A5A383A81363BB00118A8569A38D138BF8835362C723E999402D3CF728B0E11F647CE2B9390615B9E50487E23CEE6F9CEFC4A1CE5E83D28D642E3C16934B43931158CCEF3832A457A5E833F317918858807AB084F687A394C257ABCD8435CD717D1E6B79E78A37BB71A236729839B89A9905B5D935AFDC2C1E6C71C597898C6A69765BA05E9784B7849C685AB5B6DE3358C6299D8A4B075045D6EE15B639601AA95603A67378157B54889C3021453E373208CD06C0DEB77BC962535672A8D77C9EAF9726CC1A8B8D87D61B1461F33B7F7F5A003A8657297CD100324FEA561BA879FFA75287D9A838275734593ABC2B842D9353906334D3F9324C7D00EED794C78310421DB45CAB6900817348D67490BF1485E85A3DFA255694915D286AB5243B62D3A91F8493F0B19626FB89C0B9109C6E1084BD8C848C06B3472A65A2646DD89BE2D922A0D2C5E816652C826854AB36F44809EE56C9F7E26A1DC30823535997A05255756704AA1029B86601E2853C2D34A192A9B2B76B31C69C1A048A76A6A58E48BC8E512B1C767347AE28AE046076C20179D0977D2D54A3F78ADD2EC6BC06071D9447F0461846FB1A5E91A760112424082C2994A98D07AAB29E818FD15134DE437C7FBC59469CE8BA80545A4A5BF337FE142B72E602D8A1B3009CC95975759AD38274E234AEF0552B8AA65CDFCAC975495A84C124F8426A9C87D8DB03CE48B0382642CB9E31CE210B774724912B09B16D88AE007AC4542C092F9BBED9C262D823D9D5719B357821D4C245F384FC923CD334B9DFF579E324A0BCFBCBA61FB7AE9F69B3AB88693E005EE32BD1A6A3CA950A22421125391A060276B07242A795085D0098906969C421CBC469128FB5393B72590FD391DCDFA3CF87B9F7A4C6CC3A1791AE1717478A5280A3B7580BBEDF88F0DD7C1C09AA67D6B284334049398BA983BCBACB8C56237BC3EFB3FBFDCB358A006457832DF7A01EFD937E68B3299580CBE1C9F69E165D22683B3721E4189ADAAA91846B7717D41BAF8D9A1DC76C387F0B55C2552533326597466ECF06ACA624FBF73226E471D835B0EE4A24A8F1C5FBE359C61D974A4D57C2F7C49822286CA27116839B784D6782C13B606B87804BA0969C7C47C7A29CE16CECFF5514028C3D84944EC8CAB4B4ACB5B681723511087E25B8AE84F3741A2DE6CC21E7A370B35C255C34555F29645D4B420494C4D993BA3F092EE240F1D3691753420891ACFC9421C361CA2186B563ED63456096227EAA738A33AB56029976C1125DCA790114AEB83AEBCF271ED59BBC2E8377301B53D697CFABB4C6B40BAE19B6CECD421A1109F9CAC7B71C749E60A2005A30179C393D5033CB4F8795DE4C98D91538FB9A8CB1654B1E6A82918471470461F54CC71FBA50DEB3E1221C55AA616AD5262E352ADB7A89CA04557A2090FB05704B9521809B8CABFA325892AB46765CEE83850586918422212C812373A1C6217BA890B4C5310F7B0D5D8275B884AA9E4914C85023AB53BEA88AD4281A7F501A87534AC1D806B0F8691E9F1BC7171001043015B391CFAC09B5FA88F840C63194632BD5A012B34B50441BA08C879C44654F136CCCBB7114F7B4099016E0193CBBAE63522927DF4B740B3CA5B32B741EA15A47370B98926A1F90618F5235357E8087443C93444803DD22BBDD5340C876D41F3AC1DB59E9EF17DB71369A315600FC6801A54483FB015AD3766284A97CBC241AD73461F4B2A0F6645EF428805762A6E57474D29288404AD98FAB63AE95E25436626BC66EE10C01E55103597288AC521B463886F863833948455319D3455110B68BF7BC495D1A922191A1A230A5F036C3C4AC05EE2609D09891CE368C01F037D818805A566193A433E924B30F4E86DC76AE2B345932A0E7025F8CE6101884469E31AEACAF4D77E3F1201BC75919A696301240CD6129F66BE58E19D99B0D827D9932785CD9EA3D92F7BA54463FDA268813EFAB5204EFA60F78BF81D320D01AC09AC06244F7AFBD2D80FD356D9 +ct = 11A268DB2BEE6743849F2492BEA30B6C7458C3AA74364BCEFBC00502E30BBC3D38A6B35E56F73C84774660D3DB94F1224715F9ED1DFF8B76E7D714C68D85F5681DAE7E6928102EA340FA3D892D6E0B22C7CE2D4156BF0B68A63DD0390B49856E397E063B14AC2ECD40CFDB807F794B258F2893B4626A7D1A6A2B9CD1F1D3F0D74249E6CA9ECF42E527F11E1AF6D4FA34DF25A1E236422F83965A5535533BBAB735114794A16A3378A7E64C86FD33402C4E1A5244750EBE3AE44086134B25C7317A60B1F0989D12348618C1BFA05A9E2A9B34B500637DFB96471186F63AC4CB7407F2C636440133B30B8D9957CAB6585D71EAE68CB330431AE66B334B3B90A299E890852A785FCF51B772E3C0FA0980D89B51ADE1BCA47F6F53384566F03A0F2BBEE9FE38931F593401C4A14D9070B18CA7A905C698063A3080256619819B593BFB31FB7CC643D073B166F5D41482041871ECE479918F1F1F121F55EE63A2D12A581E839436F3E4CF5C338518F84BEE8FC08BFF8B107ABEBACC3AB9FFBB0D922D9AB1C0EFAC50D5C82F458968413702719800DB5AF2AE8DA624653889B642F09ABB3EC2464ECF548FB8EA1AED42318EFC9AAE51CD7EA08883C1546AE0D87950B9BF49DAA72F3006AFFCAB882681C8F6DCE038EF3C7653C7D91E975EDB5B6283CA48A93CA55F84027CCAE22A666351633A4414DF8FDEC7004157A174A38811351BAE1339D897FDE8BED32D491B88648EB022577F16C5165D1323B7203030B649E89B07571933AF62B5F2764A05DB9842332AD171B6A7968F87AB14809D0A5C11EA8541F733677AAA809979F4F389201F27EB240F378BCFA6D5AB63AF483CCEA73ECA4ABE515810D89C8E472CB7BECD19EBFE54D70CD035FBAB8E87AF97E1396AB607B64A752C869A92214581E0EF343305E1174236D26FE10F36810872B08268C59385D7B03A5D3389F5F840E65C12C50C576D4D99072929F378EDE448A5AAF01CC582D4692C655004C561E4A653120F9A3D27789D63EF5EE62F340D2FBCB72728A64D3FC0C04F19C7675A80A1001889F7C2A8FE7761475A26018573F9B079B7C770A3B0DC8193F1C86B29483F0725D3F52A1C9D7004AF1DCE7794811F98C1BB8320FC3AF0995989F583A4F6112FC00B05D1CB4EBB1D8A40F8F99A8085B28DEB6129AA524DF1AB6613AF704CCA378525719C71680E189C19E8E49157F29E2289697DA776B4EDC11502B75FF7B62BEF945E04A195759DA9522F9CDA1A3F8DECFB227A734A7D16551E57659B7AA9F9C5D27C67F02FA1ECD003446B58FF6912B274B22ADCC05048FD7CAB9E151B933A641E2441D841352CA90C2615058AC1206101A3CE973609EBE82F3FB0443C96107E52E6346B68F248626FBFEB726CDFD3F103A1E2E9733DDDE3E2D6A5D5DC482657FA26EBC2D5723E6506F1624B745380F1A515FB6498A2AA6BB79681BAC39242C6ADAF4D02571EEAE7DF7416F833D74EBC0929D9F7B53A439C185B9C8D50E2BB9B81F3562A56B756929FA9DF3CA7906A28E8CF +ss = EF8DE288A7CE14CCD5172A4A2F91588559E3780A75B1DF329A53B1E400C4C7F5 + +count = 99 +seed = 2A6F7386B815366F572AEB6C79E272CC21B7095FE09575F18072C9D677DA23BC9C8A4BC393B7524604D299BEDD260C8B +pk = 28441CC07C18856568C4FC0EDDC04175F564BDA148788608B71756367551A5709127668EFBD60B389877001B948F2C50CE62C7ED63122DAA7C1889400A4175AB959D09AB124BEA2C9D3659B8B4861E482EDED950DBF57A47C87F79FBC143D20420F4162F711963C47DCF7B8EA7FAA329D6A70F601D3A1B15A7890804917C84477D95F916A3761E3D94A0B0D69D9B7C39692B7F4ACB9091F87583810CCF67BDF86C4BE8F08762F2C3428646A3D33DF4B67EB87A2662353A208403BF59334BD9758A9439F8D8BDD45195F2255282A73456D168A2B249E8D180D5B310BA828685B3A1DABA2FB88783BB5062C13B79C2B0C3A10085664377EADBB477329567D1158882085850B95697248C6271F44988218777D33823AD70791BD40E29825ED124B963E05D06547C740A5AB7A1488E38C464B53B6F016BA1B7648A14AAA111907846C5DF162F61CC62747386915724A3B054E868BC04C934D64B7F2FF461AAE980FA806CCA7A9C4D7255564B420887946F7A72E4D1384D8222C70330B09C08D9A70AA176529F0685D087B8F9EB464A776F93606B05D0729FD2AFA7969EEC2662EBB7C7FC821D6B5393707ACF25C0C2C81702CB195F8CF730E8A46442E91E18FC7577F4AAFD6933450491EE24763BF6786D794D889C3005A323CEF2A8863C7AE00998D2E3CCC1F5A6C8A933D5D615CE82AF312990969C6288B6893C42142AD87AB483362461B87C641F646410EF5B393283230220A34730397188920B6873F16478331CB22A5A2C73273D865985533A1F8E109DBDE719C10C8ED87A831AB65562751EBBB15D3D5B6E01F78DB26A54E47943D6B31F916A552ED01A39F96DFF820765D6AE52265010545162D509F6AC3F9B7C0FD0ECAD4008732D6A9DF9449B2017B389522F11870704127BC6D018E0A420DD441EBF636C31B3B63DA9C00DC15BE0B3188371BBC855254217B99294815D78194FDABCD1970E31E38D37B4B1CC69BF428514F50AC9BCCA9125E6473028571BE535FCA274651752DAC691FF8A28C555036378B260ACB060FABA9573B0B65CBC76B892425294D65658F4A1B3309B424C6865BF1AB307B88022087F97F6882D4360ECD91F3D2513059A784BB256E47670AFD5C1AD5C177142A2955B082FD0B546577CA5286E0F1C85AF8B0BD5650038609E8EC8344E6CCB6DF93A056644CB89294FA19266948E9A561BFA66517A900B67F6BE5EFB853C703CCB4A296A493C24607A6AC4A749361D8F738080A80CA62AAF658B6A972894E6CA402AF3C09D2A6E9C181005E0C4D193361859011173BC8B97755FD1085B52808373B29733A7D0488C5F890364ABB9716920C074645AE023679BC9C2B3AD29B9051A94A124A43688A1027C35B90F9303664AA37AA92284F97DBCC7AD0F12B5B6BA38CE0A07130110518C74EA36CA6D6A44399A3983101458F926E0BB3357BAC5A294446463814806AD1623185F295D27F2C913C9608314174B2BB8BC03A92DB6CC6F044D964A7E3E289EA8F064D9B5C0D0EB43357495D09C0FBC4069903BCDC683763BC4C6ACC2517B7C94E3E0265029BFF55773421BC6143A38F57410BFB50BF21BAFEC948548A87667D95439BB78CCA2C9DA670BEB4C816478683B5487A4CE6401EC27A1605F879E2D9C53BF27E165246401CAD7840A077934B8 +sk = 55873EC8C5BAC259501E025FAED327B9B659B0810E7D43B8BF7A25A8C1A51062CFBC9BBEAB182747196797913398DB1C1CA41C1CC3A883400A29797AB4CBB553076C204167AAD2208355279F504DD9A476985362898B4E423821CC2642C335C3C953C866451CECE03098D5A2AE366DDAE1A06E05547E1C0C0667CC98494BFA778EEBC5CBACCC3038F93B82E57F814799CB7A921FB14042AAC83A1B4897BC6A15C87FC94144828966C49B6CB8F842A3157B60D6B3271C3661529D8A93C7DAF7B4DE1396308C0CBBFC9F984617CBB5B1825C88BDBC4C74C58EF3D54D089613A6A431E3A59ACF4201FBB6828DB0061F1BC514DCBFE72023CF8102E9834D5D6BBA8A354FE04C6008B37F9B07857CDA1238F5A562F288F3217FFD1A1BF8B2A0FCF3AF0310C84BD6CD805C246C4A227C9BCF963093A9755CBA968E7C06CC4F987B516171461B69E013076CB652C2A0B10F1B0FC9D6B583A929FA3905BA4B6B41F19D862C82B5F170277530A278773FA740ECA749C00A61735AA1A27719CFB75EB0768956718239F43239E25A316339DB665EB9784AB581137D020B992782956522B824B3EA4CB540A4B12AD7C512046711B0463F779E1279BCD2B7238580C72DF6120850376DB48978DC717CD1424D0B5E7331B76D0AC0B024C6283C8418E5B1A7A297AA483E5D2A65F2181EDE32C69CC4B9A8C4C0B90BB17EC06336D2100766AED931876CE45435B5662DD8A5B9F545292C870A16925546AE0CECACFB737647504EA1A29D13E0BC2D060BF7480345051E9379CFB0F901B9A426641802E5522FF8B199439026B123CF9B5827FFA147567912C46C88CEF0B41D9526D227A72262C0E3B3157DC4898E07CAEBC8038142B5172A799B8A6DB0F7703730C98E1957FEF13D5D7B2A52945EFF5C4337B6CC5004BACBB419BA73568AA357F61C70383447C6015A5896B9C0C0A2F2C7A76D940278D736D6B685F4FB3CC392CAAC1830B439468B6BC73585B4205751E55103099986308702A477588611A990580D88657024FA6D371550141405A8240109824788675D2546AFAD54628E93281ABCCAE4EAC11D200AA5C40A9E440D9F2A40DEB31C2688A3266C9E16B60461087DA271A1973374C99693C8111F9D458F92AC3208268078B177C818038305AB421B6D8297063061BB36F1318BB2108163A723A4BFC3C2A25F958F28B2B806A15E4310B8852103843C8AC26C7773084F1F82151C52083E69772A049123027916F039FD08713B98039F3B84CC83A8F88B2C19F48A958A443339A5A2158DFD7A08D11983601A1892A8C1152C602EDB1592C3AE555B2EE54C5DC6020C0B95626FC06D85D78120AC135FD369DE6B6AA902BB015A7BC3BA13A7391960C533D2F1A6278494E78B6A3C5B91A2B1AA2A0752E5C0A30E33CC86DCBA2E3232C98B9AAF1BBDF9E825B15A6DC3A741D43A53EB10AD18E93541E224EC5A952D673984990AF0D81577D1BC83B09856794D11707FAAC63A1E49A799224B51464916BC07F0A69F06F26696F5806E92CA4ADA050CDA48A9C90635A9C68ACC753A711115C35488758A68256A32F4964C431D50C0A8C5053D1A41126A952270A309F69931C32194FD201BC3809DB548A000558528441CC07C18856568C4FC0EDDC04175F564BDA148788608B71756367551A5709127668EFBD60B389877001B948F2C50CE62C7ED63122DAA7C1889400A4175AB959D09AB124BEA2C9D3659B8B4861E482EDED950DBF57A47C87F79FBC143D20420F4162F711963C47DCF7B8EA7FAA329D6A70F601D3A1B15A7890804917C84477D95F916A3761E3D94A0B0D69D9B7C39692B7F4ACB9091F87583810CCF67BDF86C4BE8F08762F2C3428646A3D33DF4B67EB87A2662353A208403BF59334BD9758A9439F8D8BDD45195F2255282A73456D168A2B249E8D180D5B310BA828685B3A1DABA2FB88783BB5062C13B79C2B0C3A10085664377EADBB477329567D1158882085850B95697248C6271F44988218777D33823AD70791BD40E29825ED124B963E05D06547C740A5AB7A1488E38C464B53B6F016BA1B7648A14AAA111907846C5DF162F61CC62747386915724A3B054E868BC04C934D64B7F2FF461AAE980FA806CCA7A9C4D7255564B420887946F7A72E4D1384D8222C70330B09C08D9A70AA176529F0685D087B8F9EB464A776F93606B05D0729FD2AFA7969EEC2662EBB7C7FC821D6B5393707ACF25C0C2C81702CB195F8CF730E8A46442E91E18FC7577F4AAFD6933450491EE24763BF6786D794D889C3005A323CEF2A8863C7AE00998D2E3CCC1F5A6C8A933D5D615CE82AF312990969C6288B6893C42142AD87AB483362461B87C641F646410EF5B393283230220A34730397188920B6873F16478331CB22A5A2C73273D865985533A1F8E109DBDE719C10C8ED87A831AB65562751EBBB15D3D5B6E01F78DB26A54E47943D6B31F916A552ED01A39F96DFF820765D6AE52265010545162D509F6AC3F9B7C0FD0ECAD4008732D6A9DF9449B2017B389522F11870704127BC6D018E0A420DD441EBF636C31B3B63DA9C00DC15BE0B3188371BBC855254217B99294815D78194FDABCD1970E31E38D37B4B1CC69BF428514F50AC9BCCA9125E6473028571BE535FCA274651752DAC691FF8A28C555036378B260ACB060FABA9573B0B65CBC76B892425294D65658F4A1B3309B424C6865BF1AB307B88022087F97F6882D4360ECD91F3D2513059A784BB256E47670AFD5C1AD5C177142A2955B082FD0B546577CA5286E0F1C85AF8B0BD5650038609E8EC8344E6CCB6DF93A056644CB89294FA19266948E9A561BFA66517A900B67F6BE5EFB853C703CCB4A296A493C24607A6AC4A749361D8F738080A80CA62AAF658B6A972894E6CA402AF3C09D2A6E9C181005E0C4D193361859011173BC8B97755FD1085B52808373B29733A7D0488C5F890364ABB9716920C074645AE023679BC9C2B3AD29B9051A94A124A43688A1027C35B90F9303664AA37AA92284F97DBCC7AD0F12B5B6BA38CE0A07130110518C74EA36CA6D6A44399A3983101458F926E0BB3357BAC5A294446463814806AD1623185F295D27F2C913C9608314174B2BB8BC03A92DB6CC6F044D964A7E3E289EA8F064D9B5C0D0EB43357495D09C0FBC4069903BCDC683763BC4C6ACC2517B7C94E3E0265029BFF55773421BC6143A38F57410BFB50BF21BAFEC948548A87667D95439BB78CCA2C9DA670BEB4C816478683B5487A4CE6401EC27A1605F879E2D9C53BF27E165246401CAD7840A077934B8CB6D7232426BDBDFDACD373C9190722E7BF342825F7D829185DCC9120588FC76AE77E0F9F21EABD8C0C6EEA7767F4E10FDE5C2D79B8400BF96B19014B457EC21 +ct = 7F60D2E6EE01AE6FBB198364141AF9A1AC4BA1B161CBDB16B86224FA77129864F00B71AA221DD1F300BA3EAFB2694610CA8F27C24CDFCD240961C27CF42D01561CCAF742379B19085C462270636676D6DCC5786E23D3881C83CD5FFD667C017FCA1F404A15A5BD368CD95A8FBDEBCCB9771B95958BDE3F65533190C0A758586094EBB86101582DC69FCCD7C2C1900D30648F360B4C805F143C8FE201D2DE242C66378439CBD304A30C67213F364F8FCBB202FFDCC290E85E8F0F718677FF8CB81D4AB3CF0DA5640C5F61B11A240099201D0BFAABECBBBB27A4623D77860BF52DC53A3AFB65ED2FCD4E9C9B1D1A996A643140CCE0D8B801728ED51BC3A47C9003375D8B19401E1C6841379A45BD2BE02A41222C4FE63E19C978D480E2D4E353AB957A1B81B74BBC7655A3D0261C8B2B06F6642BA4A5F8DD87B98B9AE355F57F8A5F978C6372BF594DF54DD8BF7650803EE13D9094B3EE86A1C3E2C21E4FD1F143D8A95CCE869DD365C29FA004070B0BDB899138FBF1D83EB9F76CBC112016C8CE1118FBDF76C3C907D1D3CAE2BA0BA5E419814DADEF0887CDC5817CA9C7B050574CF84009A6731136B39807687D3C3D6863C5D780BD6303F10A7D311D1C2A1C87039C17C6668501D572FC9D56B249ED0E95E17851AEBB45E288A32A1206C4FA475455309CD3D759CA19C47C0128A95DBD07E67937C0324B4B53BAB7402363FB32606387E2C419C0350943C8CB4760C2AA7D2FF9B1392E528B98493A61D2DC6D85CBF9E5759106D6BD1DAD276FB3AA45AAF75EB80BDB5D83AFFD7880371562100226B4E373B421B9EB3032938205012C6C083DD9E44BDFA842E280F03373F6E7E4DB5A50B4AA0B34789AF9AD051709B1E9ABDD71AD733DCC021DFA3A63609994F0FAFC5C1D88A39D46F81FA70E6164575321C2EBBB71F32893348AF887BAD2B1720CD5A86EA3774C1EBD53B15B9F01A4B5542A5F54053107E38ACE2594170B81DCD98D1CC47FEE808BE78DEBA05491F913ADE44B8914D65865EB0EB0F7E02DCBA1DE0D4B34E70485F83F96A5E41BBC064E3458473F43A70D51593F442EE2BD5B39E2C77C53BE83B9188101E3455C513BF4B8F744286BD529DA2804F804CE48E864A15F391A6793E4609279EAD144CDA084F3087678CA971EB22ED3B4B7FB740BE0407571F58DDE930D895140AD8EA096F06A3E255CD95AD48C4A46B99FF777B16452123A28D73B4A0CC0899C0CDAA1286FBE1C5FE95FA9418B5A473CC6ADBA14AFB06F080A544E49E148E492A8CE4BA9F4B5F781436F8FE30058A46F4D49A44E1FDE1B6F07E2A247CD3973AD76D3F473CAE88A2BAB3BEB78BD1875B240B23A901A9AD3F4421E5E355EAB0D3E1E197B246EB4F0861AEFB55BFD3BB54BF2CD6FFDCDFA0B78BAA674130CA2512B7069E7C33903A0A5EEEE7AF46FAFA52DD3F2E952CF909806B9CD2AA6826E823959A4BF03847BA50A4026FA0A72B78CBF6AA7FCD4908BA3BBCBDDE68708EC0AEC44B1E35C4E9E1EB7F01AFF0D9CE48F99BA01D78CEE +ss = 4793F705AED572ACE61DB13BEDE3900F2538EADDB904988C1F015BAC605A1093 + diff --git a/include/openssl/kyber.h b/include/openssl/kyber.h new file mode 100644 index 0000000000..cafae9d170 --- /dev/null +++ b/include/openssl/kyber.h @@ -0,0 +1,128 @@ +/* Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#ifndef OPENSSL_HEADER_KYBER_H +#define OPENSSL_HEADER_KYBER_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + + +// Kyber768. + + +// KYBER_public_key contains a Kyber768 public key. The contents of this +// object should never leave the address space since the format is unstable. +struct KYBER_public_key { + union { + uint8_t bytes[512 * (3 + 9) + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +// KYBER_private_key contains a Kyber768 private key. The contents of this +// object should never leave the address space since the format is unstable. +struct KYBER_private_key { + union { + uint8_t bytes[512 * (3 + 3 + 9) + 32 + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +// KYBER_PUBLIC_KEY_BYTES is the number of bytes in an encoded Kyber768 public +// key. +#define KYBER_PUBLIC_KEY_BYTES 1184 + +// KYBER_generate_key generates a random public/private key pair, writes the +// encoded public key to |out_encoded_public_key| and sets |out_private_key| to +// the private key. +OPENSSL_EXPORT void KYBER_generate_key( + uint8_t out_encoded_public_key[KYBER_PUBLIC_KEY_BYTES], + struct KYBER_private_key *out_private_key); + +// KYBER_public_from_private sets |*out_public_key| to the public key that +// corresponds to |private_key|. (This is faster than parsing the output of +// |KYBER_generate_key| if, for some reason, you need to encapsulate to a key +// that was just generated.) +OPENSSL_EXPORT void KYBER_public_from_private( + struct KYBER_public_key *out_public_key, + const struct KYBER_private_key *private_key); + +// KYBER_CIPHERTEXT_BYTES is number of bytes in the Kyber768 ciphertext. +#define KYBER_CIPHERTEXT_BYTES 1088 + +// KYBER_encap encrypts a random secret key of length |out_shared_secret_len| to +// |public_key|, writes the ciphertext to |ciphertext|, and writes the random +// key to |out_shared_secret|. The party calling |KYBER_decap| must already know +// the correct value of |out_shared_secret_len|. +OPENSSL_EXPORT void KYBER_encap(uint8_t out_ciphertext[KYBER_CIPHERTEXT_BYTES], + uint8_t *out_shared_secret, + size_t out_shared_secret_len, + const struct KYBER_public_key *public_key); + +// KYBER_decap decrypts a key of length |out_shared_secret_len| from +// |ciphertext| using |private_key| and writes it to |out_shared_secret|. If +// |ciphertext| is invalid, |out_shared_secret| is filled with a key that +// will always be the same for the same |ciphertext| and |private_key|, but +// which appears to be random unless one has access to |private_key|. These +// alternatives occur in constant time. Any subsequent symmetric encryption +// using |out_shared_secret| must use an authenticated encryption scheme in +// order to discover the decapsulation failure. +OPENSSL_EXPORT void KYBER_decap( + uint8_t *out_shared_secret, size_t out_shared_secret_len, + const uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES], + const struct KYBER_private_key *private_key); + + +// Serialisation of keys. + +// KYBER_marshal_public_key serializes |public_key| to |out| in the standard +// format for Kyber public keys. It returns one on success or zero on allocation +// error. +OPENSSL_EXPORT int KYBER_marshal_public_key( + CBB *out, const struct KYBER_public_key *public_key); + +// KYBER_parse_public_key parses a public key, in the format generated by +// |KYBER_marshal_public_key|, from |in| and writes the result to +// |out_public_key|. It returns one on success or zero on parse error or if +// there are trailing bytes in |in|. +OPENSSL_EXPORT int KYBER_parse_public_key( + struct KYBER_public_key *out_public_key, CBS *in); + +// KYBER_marshal_private_key serializes |private_key| to |out| in the standard +// format for Kyber private keys. It returns one on success or zero on +// allocation error. +OPENSSL_EXPORT int KYBER_marshal_private_key( + CBB *out, const struct KYBER_private_key *private_key); + +// KYBER_PRIVATE_KEY_BYTES is the length of the data produced by +// |KYBER_marshal_private_key|. +#define KYBER_PRIVATE_KEY_BYTES 2400 + +// KYBER_parse_private_key parses a private key, in the format generated by +// |KYBER_marshal_private_key|, from |in| and writes the result to +// |out_private_key|. It returns one on success or zero on parse error or if +// there are trailing bytes in |in|. +OPENSSL_EXPORT int KYBER_parse_private_key( + struct KYBER_private_key *out_private_key, CBS *in); + + +#if defined(__cplusplus) +} // extern C +#endif + +#endif // OPENSSL_HEADER_KYBER_H diff --git a/sources.cmake b/sources.cmake index dad834d6ff..5c7e881bf1 100644 --- a/sources.cmake +++ b/sources.cmake @@ -67,6 +67,7 @@ set( crypto/hmac_extra/hmac_tests.txt crypto/hpke/hpke_test_vectors.txt crypto/kyber/keccak_tests.txt + crypto/kyber/kyber_tests.txt crypto/pkcs8/test/empty_password.p12 crypto/pkcs8/test/no_encryption.p12 crypto/pkcs8/test/nss.p12 diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc index a81b91704d..5741c6b2e5 100644 --- a/ssl/ssl_key_share.cc +++ b/ssl/ssl_key_share.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -293,20 +294,86 @@ class X25519Kyber768KeyShare : public SSLKeyShare { uint16_t GroupID() const override { return SSL_CURVE_X25519KYBER768; } bool Generate(CBB *out) override { - // There is no implementation on Kyber in BoringSSL. BoringSSL must be - // patched for this KEM to be workable. It is not enabled by default. - return false; + uint8_t x25519_public_key[32]; + X25519_keypair(x25519_public_key, x25519_private_key_); + + uint8_t kyber_public_key[KYBER_PUBLIC_KEY_BYTES]; + KYBER_generate_key(kyber_public_key, &kyber_private_key_); + + if (!CBB_add_bytes(out, x25519_public_key, sizeof(x25519_public_key)) || + !CBB_add_bytes(out, kyber_public_key, sizeof(kyber_public_key))) { + return false; + } + + return true; } bool Encap(CBB *out_ciphertext, Array *out_secret, uint8_t *out_alert, Span peer_key) override { - return false; + Array secret; + if (!secret.Init(32 + 32)) { + return false; + } + + uint8_t x25519_public_key[32]; + X25519_keypair(x25519_public_key, x25519_private_key_); + KYBER_public_key peer_kyber_pub; + CBS peer_key_cbs; + CBS peer_x25519_cbs; + CBS peer_kyber_cbs; + CBS_init(&peer_key_cbs, peer_key.data(), peer_key.size()); + if (!CBS_get_bytes(&peer_key_cbs, &peer_x25519_cbs, 32) || + !CBS_get_bytes(&peer_key_cbs, &peer_kyber_cbs, + KYBER_PUBLIC_KEY_BYTES) || + CBS_len(&peer_key_cbs) != 0 || + !X25519(secret.data(), x25519_private_key_, + CBS_data(&peer_x25519_cbs)) || + !KYBER_parse_public_key(&peer_kyber_pub, &peer_kyber_cbs)) { + *out_alert = SSL_AD_DECODE_ERROR; + OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); + return false; + } + + uint8_t kyber_ciphertext[KYBER_CIPHERTEXT_BYTES]; + KYBER_encap(kyber_ciphertext, secret.data() + 32, secret.size() - 32, + &peer_kyber_pub); + + if (!CBB_add_bytes(out_ciphertext, x25519_public_key, + sizeof(x25519_public_key)) || + !CBB_add_bytes(out_ciphertext, kyber_ciphertext, + sizeof(kyber_ciphertext))) { + return false; + } + + *out_secret = std::move(secret); + return true; } bool Decap(Array *out_secret, uint8_t *out_alert, Span ciphertext) override { - return false; + *out_alert = SSL_AD_INTERNAL_ERROR; + + Array secret; + if (!secret.Init(32 + 32)) { + return false; + } + + if (ciphertext.size() != 32 + KYBER_CIPHERTEXT_BYTES || + !X25519(secret.data(), x25519_private_key_, ciphertext.data())) { + *out_alert = SSL_AD_DECODE_ERROR; + OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECPOINT); + return false; + } + + KYBER_decap(secret.data() + 32, secret.size() - 32, ciphertext.data() + 32, + &kyber_private_key_); + *out_secret = std::move(secret); + return true; } + + private: + uint8_t x25519_private_key_[32]; + KYBER_private_key kyber_private_key_; }; class P256Kyber768KeyShare : public SSLKeyShare { diff --git a/tool/speed.cc b/tool/speed.cc index b40303b212..794bed7ff2 100644 --- a/tool/speed.cc +++ b/tool/speed.cc @@ -29,15 +29,17 @@ #include #include #include -#include +#include #include +#include #include -#include #include -#include #include +#include +#include #include #include +#include #include #include #include @@ -956,6 +958,55 @@ static bool SpeedHRSS(const std::string &selected) { return true; } +static bool SpeedKyber(const std::string &selected) { + if (!selected.empty() && selected != "Kyber") { + return true; + } + + TimeResults results; + + KYBER_private_key priv; + uint8_t encoded_public_key[KYBER_PUBLIC_KEY_BYTES]; + uint8_t ciphertext[KYBER_CIPHERTEXT_BYTES]; + // This ciphertext is nonsense, but Kyber decap is constant-time so, for the + // purposes of timing, it's fine. + memset(ciphertext, 42, sizeof(ciphertext)); + if (!TimeFunction(&results, + [&priv, &encoded_public_key, &ciphertext]() -> bool { + uint8_t shared_secret[32]; + KYBER_generate_key(encoded_public_key, &priv); + KYBER_decap(shared_secret, sizeof(shared_secret), + ciphertext, &priv); + return true; + })) { + fprintf(stderr, "Failed to time KYBER_generate_key + KYBER_decap.\n"); + return false; + } + + results.Print("Kyber generate + decap"); + + KYBER_public_key pub; + if (!TimeFunction( + &results, [&pub, &ciphertext, &encoded_public_key]() -> bool { + CBS encoded_public_key_cbs; + CBS_init(&encoded_public_key_cbs, encoded_public_key, + sizeof(encoded_public_key)); + if (!KYBER_parse_public_key(&pub, &encoded_public_key_cbs)) { + return false; + } + uint8_t shared_secret[32]; + KYBER_encap(ciphertext, shared_secret, sizeof(shared_secret), &pub); + return true; + })) { + fprintf(stderr, "Failed to time KYBER_encap.\n"); + return false; + } + + results.Print("Kyber parse + encap"); + + return true; +} + static bool SpeedHashToCurve(const std::string &selected) { if (!selected.empty() && selected.find("hashtocurve") == std::string::npos) { return true; @@ -1436,6 +1487,7 @@ bool Speed(const std::vector &args) { !SpeedScrypt(selected) || !SpeedRSAKeyGen(selected) || !SpeedHRSS(selected) || + !SpeedKyber(selected) || !SpeedHashToCurve(selected) || !SpeedTrustToken("TrustToken-Exp1-Batch1", TRUST_TOKEN_experiment_v1(), 1, selected) || diff --git a/util/doc.config b/util/doc.config index dc05a2b703..d6ae925850 100644 --- a/util/doc.config +++ b/util/doc.config @@ -35,6 +35,7 @@ "include/openssl/engine.h", "include/openssl/hkdf.h", "include/openssl/hmac.h", + "include/openssl/kyber.h", "include/openssl/md5.h", "include/openssl/rc4.h", "include/openssl/rsa.h", From bc49415aec142fccd41e2e63a7c696fcf6acbe2f Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 31 Mar 2023 20:10:59 +0000 Subject: [PATCH 165/177] Add comment about regenerating peg files. Change-Id: I0d1b4ebb291b19bf549f863a1aaaa07e770328a9 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58505 Reviewed-by: Bob Beck Commit-Queue: Bob Beck --- util/fipstools/delocate/delocate.peg | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/util/fipstools/delocate/delocate.peg b/util/fipstools/delocate/delocate.peg index 6ec5f7a7e8..9db3e8cfa9 100644 --- a/util/fipstools/delocate/delocate.peg +++ b/util/fipstools/delocate/delocate.peg @@ -16,6 +16,13 @@ # https://github.com/pointlander/peg. delocate.go has a go:generate line for # rebuilding delocate.peg.go from this file. +# To regenerate delocate.peg.go: +# +# go install github.com/pointlander/peg@latest +# ~/go/bin/peg +# +# this will generate delocate.peg.go next to delocate.peg. + package main type Asm Peg {} From d89702704febab30774e8af22450899af297bfb0 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 31 Mar 2023 20:17:50 +0000 Subject: [PATCH 166/177] Update X25519+Kyber ID. This updated value is not in the private use area and can hopefully be more stable over time. Change-Id: Ieda34ec0f356cfd03365973f611a6edc23431e29 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58525 Commit-Queue: Adam Langley Reviewed-by: David Benjamin --- include/openssl/ssl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index b5bec5c224..a3b6a86a9a 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h @@ -2335,7 +2335,7 @@ OPENSSL_EXPORT int SSL_set1_curves_list(SSL *ssl, const char *curves); #define SSL_CURVE_SECP521R1 25 #define SSL_CURVE_X25519 29 #define SSL_CURVE_CECPQ2 16696 -#define SSL_CURVE_X25519KYBER768 0xfe31 +#define SSL_CURVE_X25519KYBER768 0x6399 #define SSL_CURVE_P256KYBER768 0xfe32 // SSL_get_curve_id returns the ID of the curve used by |ssl|'s most recently From 502d24ca80593b67b1fa59a432ef4f8f9c173a34 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 2 Apr 2023 16:06:37 +0900 Subject: [PATCH 167/177] Add various tests for memory BIOs. Our test coverage for BIOs isn't great. Fill in missing memory BIO tests, in preparation for reworking it a bit to be size_t-clean. Change-Id: I77aeab93d6d9275c65e998d517463f4cc10efcf3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58545 Commit-Queue: Bob Beck Auto-Submit: David Benjamin Reviewed-by: Bob Beck --- crypto/bio/bio_test.cc | 211 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/crypto/bio/bio_test.cc b/crypto/bio/bio_test.cc index 342325cad8..28b9c6db19 100644 --- a/crypto/bio/bio_test.cc +++ b/crypto/bio/bio_test.cc @@ -219,6 +219,217 @@ TEST(BIOTest, ReadASN1) { } } +TEST(BIOTest, MemReadOnly) { + // A memory BIO created from |BIO_new_mem_buf| is a read-only buffer. + static const char kData[] = "abcdefghijklmno"; + bssl::UniquePtr bio(BIO_new_mem_buf(kData, strlen(kData))); + ASSERT_TRUE(bio); + + // Writing to read-only buffers should fail. + EXPECT_EQ(BIO_write(bio.get(), kData, strlen(kData)), -1); + + const uint8_t *contents; + size_t len; + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes(kData)); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Read less than the whole buffer. + char buf[6]; + int ret = BIO_read(bio.get(), buf, sizeof(buf)); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("abcdef")); + + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("ghijklmno")); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + ret = BIO_read(bio.get(), buf, sizeof(buf)); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("ghijkl")); + + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("mno")); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Read the remainder of the buffer. + ret = BIO_read(bio.get(), buf, sizeof(buf)); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("mno")); + + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("")); + EXPECT_EQ(BIO_eof(bio.get()), 1); + + // By default, reading from a consumed read-only buffer returns EOF. + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), 0); + EXPECT_FALSE(BIO_should_read(bio.get())); + + // A memory BIO can be configured to return an error instead of EOF. This is + // error is returned as retryable. (This is not especially useful here. It + // makes more sense for a writable BIO.) + EXPECT_EQ(BIO_set_mem_eof_return(bio.get(), -1), 1); + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), -1); + EXPECT_TRUE(BIO_should_read(bio.get())); + + // Read exactly the right number of bytes, to test the boundary condition is + // correct. + bio.reset(BIO_new_mem_buf("abc", 3)); + ASSERT_TRUE(bio); + ret = BIO_read(bio.get(), buf, 3); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("abc")); + EXPECT_EQ(BIO_eof(bio.get()), 1); +} + +TEST(BIOTest, MemWritable) { + // A memory BIO created from |BIO_new| is writable. + bssl::UniquePtr bio(BIO_new(BIO_s_mem())); + ASSERT_TRUE(bio); + + // It is initially empty. + const uint8_t *contents; + size_t len; + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("")); + EXPECT_EQ(BIO_eof(bio.get()), 1); + + // Reading from it should default to returning a retryable error. + char buf[32]; + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), -1); + EXPECT_TRUE(BIO_should_read(bio.get())); + + // This can be configured to return an EOF. + EXPECT_EQ(BIO_set_mem_eof_return(bio.get(), 0), 1); + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), 0); + EXPECT_FALSE(BIO_should_read(bio.get())); + + // Restore the default. A writable memory |BIO| is typically used in this mode + // so additional data can be written when exhausted. + EXPECT_EQ(BIO_set_mem_eof_return(bio.get(), -1), 1); + + // Writes append to the buffer. + ASSERT_EQ(BIO_write(bio.get(), "abcdef", 6), 6); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("abcdef")); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Writes can include embedded NULs. + ASSERT_EQ(BIO_write(bio.get(), "\0ghijk", 6), 6); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("abcdef\0ghijk", 12)); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Do a partial read. + int ret = BIO_read(bio.get(), buf, 4); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("abcd")); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("ef\0ghijk", 8)); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Reads and writes may alternate. + ASSERT_EQ(BIO_write(bio.get(), "lmnopq", 6), 6); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("ef\0ghijklmnopq", 14)); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // Reads may consume embedded NULs. + ret = BIO_read(bio.get(), buf, 4); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("ef\0g", 4)); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("hijklmnopq")); + EXPECT_EQ(BIO_eof(bio.get()), 0); + + // The read buffer exceeds the |BIO|, so we consume everything. + ret = BIO_read(bio.get(), buf, sizeof(buf)); + ASSERT_GT(ret, 0); + EXPECT_EQ(Bytes(buf, ret), Bytes("hijklmnopq")); + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes("")); + EXPECT_EQ(BIO_eof(bio.get()), 1); + + // The |BIO| is now empty. + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), -1); + EXPECT_TRUE(BIO_should_read(bio.get())); + + // Repeat the above, reading exactly the right number of bytes, to test the + // boundary condition is correct. + ASSERT_EQ(BIO_write(bio.get(), "abc", 3), 3); + ret = BIO_read(bio.get(), buf, 3); + EXPECT_EQ(Bytes(buf, ret), Bytes("abc")); + EXPECT_EQ(BIO_read(bio.get(), buf, sizeof(buf)), -1); + EXPECT_TRUE(BIO_should_read(bio.get())); + EXPECT_EQ(BIO_eof(bio.get()), 1); +} + +TEST(BIOTest, MemGets) { + const struct { + std::string bio; + int gets_len; + std::string gets_result; + } kGetsTests[] = { + // BIO_gets should stop at the first newline. If the buffer is too small, + // stop there instead. Note the buffer size + // includes a trailing NUL. + {"123456789\n123456789", 5, "1234"}, + {"123456789\n123456789", 9, "12345678"}, + {"123456789\n123456789", 10, "123456789"}, + {"123456789\n123456789", 11, "123456789\n"}, + {"123456789\n123456789", 12, "123456789\n"}, + {"123456789\n123456789", 256, "123456789\n"}, + + // If we run out of buffer, read the whole buffer. + {"12345", 5, "1234"}, + {"12345", 6, "12345"}, + {"12345", 10, "12345"}, + + // NUL bytes do not terminate gets. + // TODO(davidben): File BIOs don't get this right. It's unclear if it's + // even possible to use fgets correctly here. + {std::string("abc\0def\nghi", 11), 256, std::string("abc\0def\n", 8)}, + + // An output size of one means we cannot read any bytes. Only the trailing + // NUL is included. + {"12345", 1, ""}, + + // Empty line. + {"\nabcdef", 256, "\n"}, + // Empty BIO. + {"", 256, ""}, + }; + for (const auto& t : kGetsTests) { + SCOPED_TRACE(t.bio); + SCOPED_TRACE(t.gets_len); + + bssl::UniquePtr bio(BIO_new_mem_buf(t.bio.data(), t.bio.size())); + ASSERT_TRUE(bio); + + std::vector buf(t.gets_len, 'a'); + int ret = BIO_gets(bio.get(), buf.data(), t.gets_len); + ASSERT_GE(ret, 0); + // |BIO_gets| should write a NUL terminator, not counted in the return + // value. + EXPECT_EQ(Bytes(buf.data(), ret + 1), + Bytes(t.gets_result.data(), t.gets_result.size() + 1)); + + // The remaining data should still be in the BIO. + const uint8_t *contents; + size_t len; + ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); + EXPECT_EQ(Bytes(contents, len), Bytes(t.bio.substr(ret))); + } + + // Negative and zero lengths should not output anything, even a trailing NUL. + bssl::UniquePtr bio(BIO_new_mem_buf("12345", -1)); + ASSERT_TRUE(bio); + char c = 'a'; + EXPECT_EQ(0, BIO_gets(bio.get(), &c, -1)); + EXPECT_EQ(0, BIO_gets(bio.get(), &c, 0)); + EXPECT_EQ(c, 'a'); +} + // Run through the tests twice, swapping |bio1| and |bio2|, for symmetry. class BIOPairTest : public testing::TestWithParam {}; From 6e723e5b37f7387f1c787a57c63e6d993d0c0d92 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Wed, 29 Mar 2023 19:28:46 +0900 Subject: [PATCH 168/177] Convert a few more ints to bools in libssl. There was even a bug where we returned -1 out of a function whose callers use !. Change-Id: Ic815ea9f013bcbca41ef84b9ffa9fb867f716aa6 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58465 Auto-Submit: David Benjamin Commit-Queue: Bob Beck Reviewed-by: Bob Beck --- ssl/internal.h | 30 +++++++++++++++--------------- ssl/ssl_asn1.cc | 2 +- ssl/ssl_session.cc | 40 +++++++++++++++++++--------------------- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/ssl/internal.h b/ssl/internal.h index e71dd0c08b..1b53023670 100644 --- a/ssl/internal.h +++ b/ssl/internal.h @@ -3132,8 +3132,9 @@ bool ssl_compare_public_and_private_key(const EVP_PKEY *pubkey, const EVP_PKEY *privkey); bool ssl_cert_check_private_key(const CERT *cert, const EVP_PKEY *privkey); bool ssl_get_new_session(SSL_HANDSHAKE *hs); -int ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, const SSL_SESSION *session); -int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx); +bool ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, + const SSL_SESSION *session); +bool ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx); // ssl_session_new returns a newly-allocated blank |SSL_SESSION| or nullptr on // error. @@ -3149,23 +3150,22 @@ OPENSSL_EXPORT UniquePtr SSL_SESSION_parse( CBS *cbs, const SSL_X509_METHOD *x509_method, CRYPTO_BUFFER_POOL *pool); // ssl_session_serialize writes |in| to |cbb| as if it were serialising a -// session for Session-ID resumption. It returns one on success and zero on +// session for Session-ID resumption. It returns true on success and false on // error. -OPENSSL_EXPORT int ssl_session_serialize(const SSL_SESSION *in, CBB *cbb); +OPENSSL_EXPORT bool ssl_session_serialize(const SSL_SESSION *in, CBB *cbb); -// ssl_session_is_context_valid returns one if |session|'s session ID context -// matches the one set on |hs| and zero otherwise. -int ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, - const SSL_SESSION *session); +// ssl_session_is_context_valid returns whether |session|'s session ID context +// matches the one set on |hs|. +bool ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, + const SSL_SESSION *session); -// ssl_session_is_time_valid returns one if |session| is still valid and zero if -// it has expired. -int ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session); +// ssl_session_is_time_valid returns true if |session| is still valid and false +// if it has expired. +bool ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session); -// ssl_session_is_resumable returns one if |session| is resumable for |hs| and -// zero otherwise. -int ssl_session_is_resumable(const SSL_HANDSHAKE *hs, - const SSL_SESSION *session); +// ssl_session_is_resumable returns whether |session| is resumable for |hs|. +bool ssl_session_is_resumable(const SSL_HANDSHAKE *hs, + const SSL_SESSION *session); // ssl_session_protocol_version returns the protocol version associated with // |session|. Note that despite the name, this is not the same as diff --git a/ssl/ssl_asn1.cc b/ssl/ssl_asn1.cc index 7c702fd5a6..96cb795456 100644 --- a/ssl/ssl_asn1.cc +++ b/ssl/ssl_asn1.cc @@ -782,7 +782,7 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, return ret; } -int ssl_session_serialize(const SSL_SESSION *in, CBB *cbb) { +bool ssl_session_serialize(const SSL_SESSION *in, CBB *cbb) { return SSL_SESSION_to_bytes_full(in, cbb, 0); } diff --git a/ssl/ssl_session.cc b/ssl/ssl_session.cc index 5b61ebad40..979ac5972f 100644 --- a/ssl/ssl_session.cc +++ b/ssl/ssl_session.cc @@ -400,7 +400,7 @@ bool ssl_get_new_session(SSL_HANDSHAKE *hs) { return true; } -int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx) { +bool ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx) { OPENSSL_timeval now; ssl_ctx_get_current_time(ctx, &now); { @@ -412,7 +412,7 @@ int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx) { ctx->ticket_key_current->next_rotation_tv_sec > now.tv_sec) && (!ctx->ticket_key_prev || ctx->ticket_key_prev->next_rotation_tv_sec > now.tv_sec)) { - return 1; + return true; } } @@ -423,7 +423,7 @@ int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx) { // The current key has not been initialized or it is expired. auto new_key = bssl::MakeUnique(); if (!new_key) { - return 0; + return false; } RAND_bytes(new_key->name, 16); RAND_bytes(new_key->hmac_key, 16); @@ -447,7 +447,7 @@ int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx) { ctx->ticket_key_prev.reset(); } - return 1; + return true; } static int ssl_encrypt_ticket_with_cipher_ctx(SSL_HANDSHAKE *hs, CBB *out, @@ -560,30 +560,28 @@ static int ssl_encrypt_ticket_with_method(SSL_HANDSHAKE *hs, CBB *out, return 1; } -int ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, +bool ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, const SSL_SESSION *session) { // Serialize the SSL_SESSION to be encoded into the ticket. - uint8_t *session_buf = NULL; + uint8_t *session_buf = nullptr; size_t session_len; if (!SSL_SESSION_to_bytes_for_ticket(session, &session_buf, &session_len)) { - return -1; + return false; } + bssl::UniquePtr free_session_buf(session_buf); - int ret = 0; if (hs->ssl->session_ctx->ticket_aead_method) { - ret = ssl_encrypt_ticket_with_method(hs, out, session_buf, session_len); + return ssl_encrypt_ticket_with_method(hs, out, session_buf, session_len); } else { - ret = ssl_encrypt_ticket_with_cipher_ctx(hs, out, session_buf, session_len); + return ssl_encrypt_ticket_with_cipher_ctx(hs, out, session_buf, + session_len); } - - OPENSSL_free(session_buf); - return ret; } -int ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, - const SSL_SESSION *session) { +bool ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, + const SSL_SESSION *session) { if (session == NULL) { - return 0; + return false; } return session->sid_ctx_length == hs->config->cert->sid_ctx_length && @@ -591,9 +589,9 @@ int ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, hs->config->cert->sid_ctx_length) == 0; } -int ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session) { +bool ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session) { if (session == NULL) { - return 0; + return false; } struct OPENSSL_timeval now; @@ -601,14 +599,14 @@ int ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session) { // Reject tickets from the future to avoid underflow. if (now.tv_sec < session->time) { - return 0; + return false; } return session->timeout > now.tv_sec - session->time; } -int ssl_session_is_resumable(const SSL_HANDSHAKE *hs, - const SSL_SESSION *session) { +bool ssl_session_is_resumable(const SSL_HANDSHAKE *hs, + const SSL_SESSION *session) { const SSL *const ssl = hs->ssl; return ssl_session_is_context_valid(hs, session) && // The session must have been created by the same type of end point as From e8b168dffef7c423ade6b5d21953dfed454a80b9 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 1 Apr 2023 17:23:30 +0900 Subject: [PATCH 169/177] Fix size_t truncations in bio_mem.c The outl <= 0, etc., checks are actually redundant with logic in the wrappers, but it seems easier to just add the check and avoid worrying about it. Maybe someday we'll make the internals use size_t and this will be moot. Bug: 516 Change-Id: I0bea5ac325c79b9765d822c816661fe4f2bcd4cc Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58546 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/bio/bio_mem.c | 80 ++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/crypto/bio/bio_mem.c b/crypto/bio/bio_mem.c index b4839895f7..1ee148b074 100644 --- a/crypto/bio/bio_mem.c +++ b/crypto/bio/bio_mem.c @@ -130,13 +130,15 @@ static int mem_free(BIO *bio) { } static int mem_read(BIO *bio, char *out, int outl) { - int ret; - BUF_MEM *b = (BUF_MEM*) bio->ptr; - BIO_clear_retry_flags(bio); - ret = outl; - if (b->length < INT_MAX && ret > (int)b->length) { - ret = b->length; + if (outl <= 0) { + return 0; + } + + BUF_MEM *b = bio->ptr; + int ret = outl; + if ((size_t)ret > b->length) { + ret = (int)b->length; } if (ret > 0) { @@ -157,65 +159,49 @@ static int mem_read(BIO *bio, char *out, int outl) { } static int mem_write(BIO *bio, const char *in, int inl) { - int ret = -1; - int blen; - BUF_MEM *b; - - b = (BUF_MEM *)bio->ptr; + BIO_clear_retry_flags(bio); + if (inl <= 0) { + return 0; // Successfully write zero bytes. + } if (bio->flags & BIO_FLAGS_MEM_RDONLY) { OPENSSL_PUT_ERROR(BIO, BIO_R_WRITE_TO_READ_ONLY_BIO); - goto err; + return -1; } - BIO_clear_retry_flags(bio); - blen = b->length; - if (INT_MAX - blen < inl) { - goto err; + BUF_MEM *b = bio->ptr; + if (!BUF_MEM_append(b, in, inl)) { + return -1; } - if (BUF_MEM_grow_clean(b, blen + inl) != ((size_t) blen) + inl) { - goto err; - } - OPENSSL_memcpy(&b->data[blen], in, inl); - ret = inl; -err: - return ret; + return inl; } static int mem_gets(BIO *bio, char *buf, int size) { - int i, j; - char *p; - BUF_MEM *b = (BUF_MEM *)bio->ptr; - BIO_clear_retry_flags(bio); - j = b->length; - if (size - 1 < j) { - j = size - 1; - } - if (j <= 0) { - if (size > 0) { - *buf = 0; - } + if (size <= 0) { return 0; } - p = b->data; - for (i = 0; i < j; i++) { - if (p[i] == '\n') { - i++; - break; - } + // The buffer size includes space for the trailing NUL, so we can read at most + // one fewer byte. + BUF_MEM *b = bio->ptr; + int ret = size - 1; + if ((size_t)ret > b->length) { + ret = (int)b->length; } - // i is now the max num of bytes to copy, either j or up to and including the - // first newline + // Stop at the first newline. + const char *newline = OPENSSL_memchr(b->data, '\n', ret); + if (newline != NULL) { + ret = (int)(newline - b->data + 1); + } - i = mem_read(bio, buf, i); - if (i > 0) { - buf[i] = '\0'; + ret = mem_read(bio, buf, ret); + if (ret >= 0) { + buf[ret] = '\0'; } - return i; + return ret; } static long mem_ctrl(BIO *bio, int cmd, long num, void *ptr) { From 44a389a7fce31013b5953038d4231f33cbf2ba9d Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 10 Dec 2022 00:46:54 -0500 Subject: [PATCH 170/177] Tidy up some lengths in SSL_SESSION Normally these would be size_t, but we try to reduce per-connection memory in libssl, so use uint8_t, then add asserts, checks, and casts as appropriate. Bug: 516 Change-Id: Ibdd9d88f2b05173daee2db5f6fb77d619302bfdf Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58547 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- ssl/handshake_client.cc | 11 +++++++++-- ssl/internal.h | 4 ++-- ssl/ssl_asn1.cc | 10 +++++++--- ssl/tls13_both.cc | 3 ++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc index e7dca1bebc..3e6301919c 100644 --- a/ssl/handshake_client.cc +++ b/ssl/handshake_client.cc @@ -833,11 +833,18 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } - // Note: session_id could be empty. - hs->new_session->session_id_length = CBS_len(&server_hello.session_id); + + // Save the session ID from the server. This may be empty if the session + // isn't resumable, or if we'll receive a session ticket later. + assert(CBS_len(&server_hello.session_id) <= SSL3_SESSION_ID_SIZE); + static_assert(SSL3_SESSION_ID_SIZE <= UINT8_MAX, + "max session ID is too large"); + hs->new_session->session_id_length = + static_cast(CBS_len(&server_hello.session_id)); OPENSSL_memcpy(hs->new_session->session_id, CBS_data(&server_hello.session_id), CBS_len(&server_hello.session_id)); + hs->new_session->cipher = hs->new_cipher; } diff --git a/ssl/internal.h b/ssl/internal.h index 1b53023670..b4d853aec3 100644 --- a/ssl/internal.h +++ b/ssl/internal.h @@ -3838,11 +3838,11 @@ struct ssl_session_st { // session. In TLS 1.3 and up, it is the resumption PSK for sessions handed to // the caller, but it stores the resumption secret when stored on |SSL| // objects. - int secret_length = 0; + uint8_t secret_length = 0; uint8_t secret[SSL_MAX_MASTER_KEY_LENGTH] = {0}; // session_id - valid? - unsigned session_id_length = 0; + uint8_t session_id_length = 0; uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH] = {0}; // this is used to determine whether the session is being reused in // the appropriate context. It is up to the application to set this, diff --git a/ssl/ssl_asn1.cc b/ssl/ssl_asn1.cc index 96cb795456..3311246c6f 100644 --- a/ssl/ssl_asn1.cc +++ b/ssl/ssl_asn1.cc @@ -486,7 +486,7 @@ static int SSL_SESSION_parse_bounded_octet_string(CBS *cbs, uint8_t *out, return 0; } OPENSSL_memcpy(out, CBS_data(&value), CBS_len(&value)); - *out_len = (uint8_t)CBS_len(&value); + *out_len = static_cast(CBS_len(&value)); return 1; } @@ -578,9 +578,13 @@ UniquePtr SSL_SESSION_parse(CBS *cbs, return nullptr; } OPENSSL_memcpy(ret->session_id, CBS_data(&session_id), CBS_len(&session_id)); - ret->session_id_length = CBS_len(&session_id); + static_assert(SSL3_MAX_SSL_SESSION_ID_LENGTH <= UINT8_MAX, + "max session ID is too large"); + ret->session_id_length = static_cast(CBS_len(&session_id)); OPENSSL_memcpy(ret->secret, CBS_data(&secret), CBS_len(&secret)); - ret->secret_length = CBS_len(&secret); + static_assert(SSL_MAX_MASTER_KEY_LENGTH <= UINT8_MAX, + "max secret is too large"); + ret->secret_length = static_cast(CBS_len(&secret)); CBS child; uint64_t timeout; diff --git a/ssl/tls13_both.cc b/ssl/tls13_both.cc index f67c592a33..5ab5a1c934 100644 --- a/ssl/tls13_both.cc +++ b/ssl/tls13_both.cc @@ -513,7 +513,8 @@ bool tls13_add_certificate(SSL_HANDSHAKE *hs) { if (!ssl->method->init_message(ssl, cbb.get(), body, SSL3_MT_COMPRESSED_CERTIFICATE) || !CBB_add_u16(body, hs->cert_compression_alg_id) || - !CBB_add_u24(body, msg.size()) || + msg.size() > (1u << 24) - 1 || // + !CBB_add_u24(body, static_cast(msg.size())) || !CBB_add_u24_length_prefixed(body, &compressed)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return false; From 9a56503c1571940af2d4b5bce04e0ae143e8f8b6 Mon Sep 17 00:00:00 2001 From: wangjiale3 Date: Fri, 31 Mar 2023 16:45:06 +0800 Subject: [PATCH 171/177] RESOURCE_LEAK in method STACK_OF(TRUST_TOKEN) *voprf_unblind before return 0 Change-Id: I4288988f3742f14b15f80a3023b716392a667631 Signed-off-by: wangjiale3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58485 Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- crypto/trust_token/voprf.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/crypto/trust_token/voprf.c b/crypto/trust_token/voprf.c index adf02a78d4..49a324ef2f 100644 --- a/crypto/trust_token/voprf.c +++ b/crypto/trust_token/voprf.c @@ -563,25 +563,23 @@ static STACK_OF(TRUST_TOKEN) *voprf_unblind( return NULL; } - int ok = 0; - STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); - if (ret == NULL) { - return NULL; - } - if (count > ((size_t)-1) / sizeof(EC_RAW_POINT) || count > ((size_t)-1) / sizeof(EC_SCALAR)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_OVERFLOW); - return 0; + return NULL; } + + int ok = 0; + STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); EC_RAW_POINT *BTs = OPENSSL_malloc(count * sizeof(EC_RAW_POINT)); EC_RAW_POINT *Zs = OPENSSL_malloc(count * sizeof(EC_RAW_POINT)); EC_SCALAR *es = OPENSSL_malloc(count * sizeof(EC_SCALAR)); CBB batch_cbb; CBB_zero(&batch_cbb); - if (!BTs || - !Zs || - !es || + if (ret == NULL || + BTs == NULL || + Zs == NULL || + es == NULL || !CBB_init(&batch_cbb, 0) || !cbb_add_point(&batch_cbb, method->group, &key->pubs)) { goto err; From 0c069cbf33d6a682e97a12c74284901a9bcd66b9 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Mon, 3 Apr 2023 13:58:57 +0900 Subject: [PATCH 172/177] Don't consume the newline in BIO_gets for fds We support BIO_gets on three BIOs. They're all slightly different. File BIOs have the NUL truncation bug. fd BIOs swallow the embedded newline. This CL fixes the second issue and updates the BIO_gets test to cover all three. See also upstream's https://github.com/openssl/openssl/pull/3442 Update-Note: BIO_gets on an fd BIO now returns the newline, to align with memory and file BIOs. BIO_gets is primarily used in the PEM parser, which tries to tolerate both cases, but this reduces the risk of some weird bug that only appears in fd BIOs. Change-Id: Ia8ffb8c67b6981d6ef7144a1522f8605dc01d525 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58552 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/bio/bio_test.cc | 71 ++++++++++++++++++++++++++++++++---------- crypto/bio/fd.c | 11 ++++--- include/openssl/bio.h | 16 +++++----- 3 files changed, 69 insertions(+), 29 deletions(-) diff --git a/crypto/bio/bio_test.cc b/crypto/bio/bio_test.cc index 28b9c6db19..99cdcbf6d2 100644 --- a/crypto/bio/bio_test.cc +++ b/crypto/bio/bio_test.cc @@ -364,7 +364,7 @@ TEST(BIOTest, MemWritable) { EXPECT_EQ(BIO_eof(bio.get()), 1); } -TEST(BIOTest, MemGets) { +TEST(BIOTest, Gets) { const struct { std::string bio; int gets_len; @@ -386,8 +386,6 @@ TEST(BIOTest, MemGets) { {"12345", 10, "12345"}, // NUL bytes do not terminate gets. - // TODO(davidben): File BIOs don't get this right. It's unclear if it's - // even possible to use fgets correctly here. {std::string("abc\0def\nghi", 11), 256, std::string("abc\0def\n", 8)}, // An output size of one means we cannot read any bytes. Only the trailing @@ -403,22 +401,61 @@ TEST(BIOTest, MemGets) { SCOPED_TRACE(t.bio); SCOPED_TRACE(t.gets_len); - bssl::UniquePtr bio(BIO_new_mem_buf(t.bio.data(), t.bio.size())); - ASSERT_TRUE(bio); + auto check_bio_gets = [&](BIO *bio) { + std::vector buf(t.gets_len, 'a'); + int ret = BIO_gets(bio, buf.data(), t.gets_len); + ASSERT_GE(ret, 0); + // |BIO_gets| should write a NUL terminator, not counted in the return + // value. + EXPECT_EQ(Bytes(buf.data(), ret + 1), + Bytes(t.gets_result.data(), t.gets_result.size() + 1)); + + // The remaining data should still be in the BIO. + buf.resize(t.bio.size() + 1); + ret = BIO_read(bio, buf.data(), static_cast(buf.size())); + ASSERT_GE(ret, 0); + EXPECT_EQ(Bytes(buf.data(), ret), + Bytes(t.bio.substr(t.gets_result.size()))); + }; + + { + SCOPED_TRACE("memory"); + bssl::UniquePtr bio(BIO_new_mem_buf(t.bio.data(), t.bio.size())); + ASSERT_TRUE(bio); + check_bio_gets(bio.get()); + } - std::vector buf(t.gets_len, 'a'); - int ret = BIO_gets(bio.get(), buf.data(), t.gets_len); - ASSERT_GE(ret, 0); - // |BIO_gets| should write a NUL terminator, not counted in the return - // value. - EXPECT_EQ(Bytes(buf.data(), ret + 1), - Bytes(t.gets_result.data(), t.gets_result.size() + 1)); + using ScopedFILE = std::unique_ptr; + ScopedFILE file(tmpfile(), fclose); + ASSERT_TRUE(file); + if (!t.bio.empty()) { + ASSERT_EQ(1u, + fwrite(t.bio.data(), t.bio.size(), /*nitems=*/1, file.get())); + ASSERT_EQ(0, fseek(file.get(), 0, SEEK_SET)); + } - // The remaining data should still be in the BIO. - const uint8_t *contents; - size_t len; - ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len)); - EXPECT_EQ(Bytes(contents, len), Bytes(t.bio.substr(ret))); + // TODO(crbug.com/boringssl/585): If the line has an embedded NUL, file + // BIOs do not currently report the answer correctly. + if (t.bio.find('\0') == std::string::npos) { + SCOPED_TRACE("file"); + bssl::UniquePtr bio(BIO_new_fp(file.get(), BIO_NOCLOSE)); + ASSERT_TRUE(bio); + check_bio_gets(bio.get()); + } + + ASSERT_EQ(0, fseek(file.get(), 0, SEEK_SET)); + + { + SCOPED_TRACE("fd"); +#if defined(OPENSSL_WINDOWS) + int fd = _fileno(file.get()); +#else + int fd = fileno(file.get()); +#endif + bssl::UniquePtr bio(BIO_new_fd(fd, BIO_NOCLOSE)); + ASSERT_TRUE(bio); + check_bio_gets(bio.get()); + } } // Negative and zero lengths should not output anything, even a trailing NUL. diff --git a/crypto/bio/fd.c b/crypto/bio/fd.c index 2980b7d107..9a2a65027f 100644 --- a/crypto/bio/fd.c +++ b/crypto/bio/fd.c @@ -241,15 +241,18 @@ static long fd_ctrl(BIO *b, int cmd, long num, void *ptr) { } static int fd_gets(BIO *bp, char *buf, int size) { - char *ptr = buf; - char *end = buf + size - 1; - if (size <= 0) { return 0; } - while (ptr < end && fd_read(bp, ptr, 1) > 0 && ptr[0] != '\n') { + char *ptr = buf; + char *end = buf + size - 1; + while (ptr < end && fd_read(bp, ptr, 1) > 0) { + char c = ptr[0]; ptr++; + if (c == '\n') { + break; + } } ptr[0] = '\0'; diff --git a/include/openssl/bio.h b/include/openssl/bio.h index 01ea69c930..abe7aec95a 100644 --- a/include/openssl/bio.h +++ b/include/openssl/bio.h @@ -107,14 +107,14 @@ OPENSSL_EXPORT int BIO_up_ref(BIO *bio); // bytes read, zero on EOF, or a negative number on error. OPENSSL_EXPORT int BIO_read(BIO *bio, void *data, int len); -// BIO_gets "reads a line" from |bio| and puts at most |size| bytes into |buf|. -// It returns the number of bytes read or a negative number on error. The -// phrase "reads a line" is in quotes in the previous sentence because the -// exact operation depends on the BIO's method. For example, a digest BIO will -// return the digest in response to a |BIO_gets| call. -// -// TODO(fork): audit the set of BIOs that we end up needing. If all actually -// return a line for this call, remove the warning above. +// BIO_gets reads a line from |bio| and writes at most |size| bytes into |buf|. +// It returns the number of bytes read or a negative number on error. This +// function's output always includes a trailing NUL byte, so it will read at +// most |size - 1| bytes. +// +// If the function read a complete line, the output will include the newline +// character, '\n'. If no newline was found before |size - 1| bytes or EOF, it +// outputs the bytes which were available. OPENSSL_EXPORT int BIO_gets(BIO *bio, char *buf, int size); // BIO_write writes |len| bytes from |data| to |bio|. It returns the number of From 8843d98d18b56d086ae42538f1e8a1d7ff516cef Mon Sep 17 00:00:00 2001 From: wangjiale3 Date: Fri, 31 Mar 2023 17:19:15 +0800 Subject: [PATCH 173/177] If the ret is not null, it needs to be released before return Change-Id: Idcf0fdcc88af509958e56052c1925f3f695bc3e3 Signed-off-by: wangjiale3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58487 Commit-Queue: David Benjamin Reviewed-by: David Benjamin --- crypto/trust_token/pmbtoken.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/crypto/trust_token/pmbtoken.c b/crypto/trust_token/pmbtoken.c index 2e25cf52e9..0e3d4bcb5d 100644 --- a/crypto/trust_token/pmbtoken.c +++ b/crypto/trust_token/pmbtoken.c @@ -944,17 +944,14 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( return NULL; } - int ok = 0; - STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); - if (ret == NULL) { - return NULL; - } - if (count > ((size_t)-1) / sizeof(EC_RAW_POINT) || count > ((size_t)-1) / sizeof(EC_SCALAR)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_OVERFLOW); - return 0; + return NULL; } + + int ok = 0; + STACK_OF(TRUST_TOKEN) *ret = sk_TRUST_TOKEN_new_null(); EC_RAW_POINT *Tps = OPENSSL_malloc(count * sizeof(EC_RAW_POINT)); EC_RAW_POINT *Sps = OPENSSL_malloc(count * sizeof(EC_RAW_POINT)); EC_RAW_POINT *Wps = OPENSSL_malloc(count * sizeof(EC_RAW_POINT)); @@ -962,11 +959,12 @@ static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( EC_SCALAR *es = OPENSSL_malloc(count * sizeof(EC_SCALAR)); CBB batch_cbb; CBB_zero(&batch_cbb); - if (!Tps || - !Sps || - !Wps || - !Wsps || - !es || + if (ret == NULL || + Tps == NULL || + Sps == NULL || + Wps == NULL || + Wsps == NULL || + es == NULL || !CBB_init(&batch_cbb, 0) || !point_to_cbb(&batch_cbb, method->group, &key->pubs) || !point_to_cbb(&batch_cbb, method->group, &key->pub0) || From fe7a067f1e23ab6397228b6b3a3232cbfd6267cf Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Mon, 10 Apr 2023 21:09:07 +0000 Subject: [PATCH 174/177] Run `go fmt` in `ssl/test/runner`. Change-Id: I06773ff0c42c68f1f2d4c581f52b71008c4cdb3c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58625 Commit-Queue: David Benjamin Reviewed-by: David Benjamin Auto-Submit: Adam Langley --- ssl/test/runner/mock_quic_transport.go | 18 +++++++++--------- ssl/test/runner/runner.go | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ssl/test/runner/mock_quic_transport.go b/ssl/test/runner/mock_quic_transport.go index 709f7d12af..293927444f 100644 --- a/ssl/test/runner/mock_quic_transport.go +++ b/ssl/test/runner/mock_quic_transport.go @@ -54,16 +54,16 @@ func (e encryptionLevel) String() string { // Messages from TLS that are sent over a mockQUICTransport are a series of // records in the following format: // -// enum { -// initial(0), early_data(1), handshake(2), application(3), (255) -// } EncryptionLevel; +// enum { +// initial(0), early_data(1), handshake(2), application(3), (255) +// } EncryptionLevel; // -// struct { -// ContentType record_type; -// EncryptionLevel level; -// CipherSuite cipher_suite; -// opaque encrypted_record<0..2^32-1>; -// } MockQUICRecord; +// struct { +// ContentType record_type; +// EncryptionLevel level; +// CipherSuite cipher_suite; +// opaque encrypted_record<0..2^32-1>; +// } MockQUICRecord; // // The "encrypted" record is the concatenation of the encryption key and // plaintext. It and the cipher suite exist only to check both sides agree on diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go index d33fbc5616..3d660da209 100644 --- a/ssl/test/runner/runner.go +++ b/ssl/test/runner/runner.go @@ -11917,9 +11917,9 @@ func addCurveTests() { }, }) - // ... and even if there's another curve in the middle because it's the - // first classical and first post-quantum "curves" that get key shares - // included. + // ... and even if there's another curve in the middle because it's the + // first classical and first post-quantum "curves" that get key shares + // included. testCases = append(testCases, testCase{ name: "CECPQ2KeyShareIncludedThird", config: Config{ From bf1b79288f4339e0d87da5f8f9e2b137be4d9766 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Tue, 11 Apr 2023 15:20:44 -0400 Subject: [PATCH 175/177] Remove SSL_CIPHER_get_rfc_name This was replaced with the upstream-compatible SSL_CIPHER_standard_name in https://boringssl-review.googlesource.com/17324. It looks like we've since migrated everything off the old name, so let's just remove it. Update-Note: SSL_CIPHER_get_rfc_name calls can be replaced with SSL_CIPHER_standard_name, which is also more efficient as it avoids an allocation and copy. If anyone's using this function and can't easily migrate, let us know and we can put this back for a little longer. Change-Id: I6bce40a8a146671429641a5dbff6f614006a9a1c Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58665 Reviewed-by: Bob Beck Auto-Submit: David Benjamin Commit-Queue: Bob Beck --- include/openssl/ssl.h | 7 ------- ssl/ssl_cipher.cc | 8 -------- ssl/ssl_test.cc | 4 ---- 3 files changed, 19 deletions(-) diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h index a3b6a86a9a..b4d669a260 100644 --- a/include/openssl/ssl.h +++ b/include/openssl/ssl.h @@ -4528,13 +4528,6 @@ OPENSSL_EXPORT const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, // SSL_CIPHER_get_version returns the string "TLSv1/SSLv3". OPENSSL_EXPORT const char *SSL_CIPHER_get_version(const SSL_CIPHER *cipher); -// SSL_CIPHER_get_rfc_name returns a newly-allocated string containing the -// result of |SSL_CIPHER_standard_name| or NULL on error. The caller is -// responsible for calling |OPENSSL_free| on the result. -// -// Use |SSL_CIPHER_standard_name| instead. -OPENSSL_EXPORT char *SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher); - typedef void COMP_METHOD; typedef struct ssl_comp_st SSL_COMP; diff --git a/ssl/ssl_cipher.cc b/ssl/ssl_cipher.cc index 391944af35..b08eb206d8 100644 --- a/ssl/ssl_cipher.cc +++ b/ssl/ssl_cipher.cc @@ -1531,14 +1531,6 @@ const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) { } } -char *SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher) { - if (cipher == NULL) { - return NULL; - } - - return OPENSSL_strdup(SSL_CIPHER_standard_name(cipher)); -} - int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) { if (cipher == NULL) { return 0; diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index f51c11efc1..a731e41d66 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc @@ -1037,10 +1037,6 @@ TEST(SSLTest, CipherProperties) { ASSERT_TRUE(cipher); EXPECT_STREQ(t.standard_name, SSL_CIPHER_standard_name(cipher)); - bssl::UniquePtr rfc_name(SSL_CIPHER_get_rfc_name(cipher)); - ASSERT_TRUE(rfc_name); - EXPECT_STREQ(t.standard_name, rfc_name.get()); - EXPECT_EQ(t.cipher_nid, SSL_CIPHER_get_cipher_nid(cipher)); EXPECT_EQ(t.digest_nid, SSL_CIPHER_get_digest_nid(cipher)); EXPECT_EQ(t.kx_nid, SSL_CIPHER_get_kx_nid(cipher)); From a438519f9eac3ec34d82da96984eb48d237e4e97 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 25 Mar 2023 01:26:49 -0400 Subject: [PATCH 176/177] Fix miscellaneous size_t truncations Also unexport PEM_proc_type and PEM_dek_info. They're never called externally, just private functions within one file. Also, while I'm here, fix the include guard on asn1/internal.h. Bug: 516 Change-Id: I6961a65f638e7b464a8c349663898a954d7826b4 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58548 Commit-Queue: David Benjamin Reviewed-by: Bob Beck --- crypto/asn1/internal.h | 6 ++-- crypto/asn1/tasn_dec.c | 4 +-- crypto/bio/bio.c | 10 +++--- crypto/bio/fd.c | 3 +- crypto/bio/file.c | 14 +++----- crypto/bio/pair.c | 6 ++-- crypto/cipher_extra/cipher_test.cc | 5 +-- crypto/fipsmodule/ec/oct.c | 3 +- crypto/fipsmodule/ec/p256-nistz_test.cc | 13 ++++--- crypto/pem/pem_lib.c | 32 ++++++++++-------- crypto/x509/a_sign.c | 45 +++++++++++++++---------- crypto/x509/asn1_gen.c | 2 +- crypto/x509/x509spki.c | 2 +- crypto/x509/x_x509a.c | 4 +-- crypto/x509v3/internal.h | 2 +- crypto/x509v3/v3_conf.c | 29 ++++++++++------ crypto/x509v3/v3_info.c | 8 ++--- crypto/x509v3/v3_skey.c | 27 +++++++++------ crypto/x509v3/v3_utl.c | 2 +- include/openssl/pem.h | 3 -- include/openssl/x509.h | 6 ++-- ssl/ssl_test.cc | 11 +++--- ssl/test/test_config.cc | 10 ++++-- 23 files changed, 142 insertions(+), 105 deletions(-) diff --git a/crypto/asn1/internal.h b/crypto/asn1/internal.h index 64e1e6b102..5dca7280ca 100644 --- a/crypto/asn1/internal.h +++ b/crypto/asn1/internal.h @@ -56,8 +56,8 @@ * */ -#ifndef OPENSSL_HEADER_ASN1_ASN1_LOCL_H -#define OPENSSL_HEADER_ASN1_ASN1_LOCL_H +#ifndef OPENSSL_HEADER_ASN1_INTERNAL_H +#define OPENSSL_HEADER_ASN1_INTERNAL_H #include @@ -266,4 +266,4 @@ typedef struct ASN1_EXTERN_FUNCS_st { } // extern C #endif -#endif // OPENSSL_HEADER_ASN1_ASN1_LOCL_H +#endif // OPENSSL_HEADER_ASN1_INTERNAL_H diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 23c526e0f1..622ed458a4 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -85,7 +85,7 @@ static int asn1_template_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, static int asn1_template_noexp_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_TEMPLATE *tt, char opt, CRYPTO_BUFFER *buf, int depth); -static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, +static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, long len, int utype, const ASN1_ITEM *it); static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it, int tag, @@ -749,7 +749,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, const unsigned char **in, // Translate ASN1 content octets into a structure -static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, +static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, long len, int utype, const ASN1_ITEM *it) { ASN1_VALUE **opval = NULL; ASN1_STRING *stmp; diff --git a/crypto/bio/bio.c b/crypto/bio/bio.c index 610c733b2f..ca5cbff36d 100644 --- a/crypto/bio/bio.c +++ b/crypto/bio/bio.c @@ -423,7 +423,7 @@ int BIO_indent(BIO *bio, unsigned indent, unsigned max_indent) { } static int print_bio(const char *str, size_t len, void *bio) { - return BIO_write((BIO *)bio, str, len); + return BIO_write_all((BIO *)bio, str, len); } void ERR_print_errors(BIO *bio) { @@ -462,9 +462,11 @@ static int bio_read_all(BIO *bio, uint8_t **out, size_t *out_len, OPENSSL_free(*out); return 0; } - const size_t todo = len - done; - assert(todo < INT_MAX); - const int n = BIO_read(bio, *out + done, todo); + size_t todo = len - done; + if (todo > INT_MAX) { + todo = INT_MAX; + } + const int n = BIO_read(bio, *out + done, (int)todo); if (n == 0) { *out_len = done; return 1; diff --git a/crypto/bio/fd.c b/crypto/bio/fd.c index 9a2a65027f..7775d7a75a 100644 --- a/crypto/bio/fd.c +++ b/crypto/bio/fd.c @@ -257,7 +257,8 @@ static int fd_gets(BIO *bp, char *buf, int size) { ptr[0] = '\0'; - return ptr - buf; + // The output length is bounded by |size|. + return (int)(ptr - buf); } static const BIO_METHOD methods_fdp = { diff --git a/crypto/bio/file.c b/crypto/bio/file.c index 0f2fffbd6a..8ba9c544c2 100644 --- a/crypto/bio/file.c +++ b/crypto/bio/file.c @@ -157,13 +157,11 @@ static int file_read(BIO *b, char *out, int outl) { } static int file_write(BIO *b, const char *in, int inl) { - int ret = 0; - if (!b->init) { return 0; } - ret = fwrite(in, inl, 1, (FILE *)b->ptr); + int ret = (int)fwrite(in, inl, 1, (FILE *)b->ptr); if (ret > 0) { ret = inl; } @@ -253,20 +251,18 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) { } static int file_gets(BIO *bp, char *buf, int size) { - int ret = 0; - if (size == 0) { return 0; } if (!fgets(buf, size, (FILE *)bp->ptr)) { buf[0] = 0; - goto err; + // TODO(davidben): This doesn't distinguish error and EOF. This should check + // |ferror| as in |file_read|. + return 0; } - ret = strlen(buf); -err: - return ret; + return (int)strlen(buf); } static const BIO_METHOD methods_filep = { diff --git a/crypto/bio/pair.c b/crypto/bio/pair.c index c4d09c14a2..40711cdf95 100644 --- a/crypto/bio/pair.c +++ b/crypto/bio/pair.c @@ -221,7 +221,8 @@ static int bio_read(BIO *bio, char *buf, int size_) { rest -= chunk; } while (rest); - return size; + // |size| is bounded by the buffer size, which fits in |int|. + return (int)size; } static int bio_write(BIO *bio, const char *buf, int num_) { @@ -293,7 +294,8 @@ static int bio_write(BIO *bio, const char *buf, int num_) { buf += chunk; } while (rest); - return num; + // |num| is bounded by the buffer size, which fits in |int|. + return (int)num; } static int bio_make_pair(BIO *bio1, BIO *bio2, size_t writebuf1_len, diff --git a/crypto/cipher_extra/cipher_test.cc b/crypto/cipher_extra/cipher_test.cc index 80146fe03c..4c8c142ccf 100644 --- a/crypto/cipher_extra/cipher_test.cc +++ b/crypto/cipher_extra/cipher_test.cc @@ -208,8 +208,9 @@ static void TestCipherAPI(const EVP_CIPHER *cipher, Operation op, bool padding, // pre-computed key schedule and a streaming operation. ASSERT_TRUE(MaybeCopyCipherContext(copy, &ctx)); if (is_aead) { - ASSERT_TRUE( - EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_IVLEN, iv.size(), 0)); + ASSERT_LE(iv.size(), size_t{INT_MAX}); + ASSERT_TRUE(EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_IVLEN, + static_cast(iv.size()), 0)); } else { ASSERT_EQ(iv.size(), EVP_CIPHER_CTX_iv_length(ctx.get())); } diff --git a/crypto/fipsmodule/ec/oct.c b/crypto/fipsmodule/ec/oct.c index 3f0c0d65e7..eb77643cf7 100644 --- a/crypto/fipsmodule/ec/oct.c +++ b/crypto/fipsmodule/ec/oct.c @@ -320,8 +320,7 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, } if (!BN_mod_sqrt(y, tmp1, &group->field, ctx)) { - unsigned long err = ERR_peek_last_error(); - + uint32_t err = ERR_peek_last_error(); if (ERR_GET_LIB(err) == ERR_LIB_BN && ERR_GET_REASON(err) == BN_R_NOT_A_SQUARE) { ERR_clear_error(); diff --git a/crypto/fipsmodule/ec/p256-nistz_test.cc b/crypto/fipsmodule/ec/p256-nistz_test.cc index 6aa51e8520..a53d94eeb2 100644 --- a/crypto/fipsmodule/ec/p256-nistz_test.cc +++ b/crypto/fipsmodule/ec/p256-nistz_test.cc @@ -43,9 +43,11 @@ TEST(P256_NistzTest, SelectW5) { // Fill a table with some garbage input. alignas(64) P256_POINT table[16]; for (size_t i = 0; i < 16; i++) { - OPENSSL_memset(table[i].X, 3 * i, sizeof(table[i].X)); - OPENSSL_memset(table[i].Y, 3 * i + 1, sizeof(table[i].Y)); - OPENSSL_memset(table[i].Z, 3 * i + 2, sizeof(table[i].Z)); + OPENSSL_memset(table[i].X, static_cast(3 * i), sizeof(table[i].X)); + OPENSSL_memset(table[i].Y, static_cast(3 * i + 1), + sizeof(table[i].Y)); + OPENSSL_memset(table[i].Z, static_cast(3 * i + 2), + sizeof(table[i].Z)); } for (int i = 0; i <= 16; i++) { @@ -73,8 +75,9 @@ TEST(P256_NistzTest, SelectW7) { // Fill a table with some garbage input. alignas(64) P256_POINT_AFFINE table[64]; for (size_t i = 0; i < 64; i++) { - OPENSSL_memset(table[i].X, 2 * i, sizeof(table[i].X)); - OPENSSL_memset(table[i].Y, 2 * i + 1, sizeof(table[i].Y)); + OPENSSL_memset(table[i].X, static_cast(2 * i), sizeof(table[i].X)); + OPENSSL_memset(table[i].Y, static_cast(2 * i + 1), + sizeof(table[i].Y)); } for (int i = 0; i <= 64; i++) { diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c index 28ed438b92..30ba387e49 100644 --- a/crypto/pem/pem_lib.c +++ b/crypto/pem/pem_lib.c @@ -78,7 +78,8 @@ static int load_iv(char **fromp, unsigned char *to, size_t num); static int check_pem(const char *nm, const char *name); -void PEM_proc_type(char *buf, int type) { +// PEM_proc_type appends a Proc-Type header to |buf|, determined by |type|. +static void PEM_proc_type(char buf[PEM_BUFSIZE], int type) { const char *str; if (type == PEM_TYPE_ENCRYPTED) { @@ -96,24 +97,27 @@ void PEM_proc_type(char *buf, int type) { OPENSSL_strlcat(buf, "\n", PEM_BUFSIZE); } -void PEM_dek_info(char *buf, const char *type, int len, char *str) { +// PEM_dek_info appends a DEK-Info header to |buf|, with an algorithm of |type| +// and a single parameter, specified by hex-encoding |len| bytes from |str|. +static void PEM_dek_info(char buf[PEM_BUFSIZE], const char *type, size_t len, + char *str) { static const unsigned char map[17] = "0123456789ABCDEF"; - long i; - int j; OPENSSL_strlcat(buf, "DEK-Info: ", PEM_BUFSIZE); OPENSSL_strlcat(buf, type, PEM_BUFSIZE); OPENSSL_strlcat(buf, ",", PEM_BUFSIZE); - j = strlen(buf); - if (j + (len * 2) + 1 > PEM_BUFSIZE) { + size_t buf_len = strlen(buf); + // We must write an additional |2 * len + 2| bytes after |buf_len|, including + // the trailing newline and NUL. + if (len > (PEM_BUFSIZE - buf_len - 2) / 2) { return; } - for (i = 0; i < len; i++) { - buf[j + i * 2] = map[(str[i] >> 4) & 0x0f]; - buf[j + i * 2 + 1] = map[(str[i]) & 0x0f]; + for (size_t i = 0; i < len; i++) { + buf[buf_len + i * 2] = map[(str[i] >> 4) & 0x0f]; + buf[buf_len + i * 2 + 1] = map[(str[i]) & 0x0f]; } - buf[j + i * 2] = '\n'; - buf[j + i * 2 + 1] = '\0'; + buf[buf_len + len * 2] = '\n'; + buf[buf_len + len * 2 + 1] = '\0'; } void *PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x, @@ -318,7 +322,7 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, } kstr = (unsigned char *)buf; } - assert(iv_len <= (int)sizeof(iv)); + assert(iv_len <= sizeof(iv)); if (!RAND_bytes(iv, iv_len)) { // Generate a salt goto err; } @@ -332,7 +336,7 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp, void *x, OPENSSL_cleanse(buf, PEM_BUFSIZE); } - assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof buf); + assert(strlen(objstr) + 23 + 2 * iv_len + 13 <= sizeof(buf)); buf[0] = '\0'; PEM_proc_type(buf, PEM_TYPE_ENCRYPTED); @@ -781,5 +785,5 @@ int PEM_def_callback(char *buf, int size, int rwflag, void *userdata) { return 0; } OPENSSL_strlcpy(buf, userdata, (size_t)size); - return len; + return (int)len; } diff --git a/crypto/x509/a_sign.c b/crypto/x509/a_sign.c index de89fabd71..8ee4779883 100644 --- a/crypto/x509/a_sign.c +++ b/crypto/x509/a_sign.c @@ -62,6 +62,8 @@ #include #include +#include + #include "internal.h" int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, @@ -83,17 +85,13 @@ int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx) { - EVP_PKEY *pkey; - unsigned char *buf_in = NULL, *buf_out = NULL; - size_t inl = 0, outl = 0; - + int ret = 0; + uint8_t *in = NULL, *out = NULL; if (signature->type != V_ASN1_BIT_STRING) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_TYPE); goto err; } - pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); - // Write out the requested copies of the AlgorithmIdentifier. if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) { goto err; @@ -102,26 +100,37 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, goto err; } - inl = ASN1_item_i2d(asn, &buf_in, it); - outl = EVP_PKEY_size(pkey); - buf_out = OPENSSL_malloc((unsigned int)outl); - if ((buf_in == NULL) || (buf_out == NULL)) { - outl = 0; + int in_len = ASN1_item_i2d(asn, &in, it); + if (in_len < 0) { + goto err; + } + + EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx); + size_t out_len = EVP_PKEY_size(pkey); + if (out_len > INT_MAX) { + OPENSSL_PUT_ERROR(X509, ERR_R_OVERFLOW); goto err; } - if (!EVP_DigestSign(ctx, buf_out, &outl, buf_in, inl)) { - outl = 0; + out = OPENSSL_malloc(out_len); + if (out == NULL) { + goto err; + } + + if (!EVP_DigestSign(ctx, out, &out_len, in, in_len)) { OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB); goto err; } - ASN1_STRING_set0(signature, buf_out, outl); - buf_out = NULL; + + ASN1_STRING_set0(signature, out, (int)out_len); + out = NULL; signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); signature->flags |= ASN1_STRING_FLAG_BITS_LEFT; + ret = 1; + err: EVP_MD_CTX_cleanup(ctx); - OPENSSL_free(buf_in); - OPENSSL_free(buf_out); - return outl; + OPENSSL_free(in); + OPENSSL_free(out); + return ret; } diff --git a/crypto/x509/asn1_gen.c b/crypto/x509/asn1_gen.c index 937069e883..321f63bec0 100644 --- a/crypto/x509/asn1_gen.c +++ b/crypto/x509/asn1_gen.c @@ -509,7 +509,7 @@ static int generate_v3(CBB *cbb, const char *str, const X509V3_CTX *cnf, CBB_flush(cbb); } if (format == ASN1_GEN_FORMAT_HEX) { - long len; + size_t len; uint8_t *data = x509v3_hex_to_bytes(value, &len); if (data == NULL) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_ILLEGAL_HEX); diff --git a/crypto/x509/x509spki.c b/crypto/x509/x509spki.c index 8ff2053ae5..2b9b904eeb 100644 --- a/crypto/x509/x509spki.c +++ b/crypto/x509/x509spki.c @@ -77,7 +77,7 @@ EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x) { // Load a Netscape SPKI from a base64 encoded string -NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len) { +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, ossl_ssize_t len) { unsigned char *spki_der; const unsigned char *p; size_t spki_len; diff --git a/crypto/x509/x_x509a.c b/crypto/x509/x_x509a.c index c473f93dd1..4b34caaa73 100644 --- a/crypto/x509/x_x509a.c +++ b/crypto/x509/x_x509a.c @@ -90,7 +90,7 @@ static X509_CERT_AUX *aux_get(X509 *x) { return x->aux; } -int X509_alias_set1(X509 *x, const unsigned char *name, int len) { +int X509_alias_set1(X509 *x, const unsigned char *name, ossl_ssize_t len) { X509_CERT_AUX *aux; // TODO(davidben): Empty aliases are not meaningful in PKCS#12, and the // getters cannot quite represent them. Also erase the object if |len| is @@ -112,7 +112,7 @@ int X509_alias_set1(X509 *x, const unsigned char *name, int len) { return ASN1_STRING_set(aux->alias, name, len); } -int X509_keyid_set1(X509 *x, const unsigned char *id, int len) { +int X509_keyid_set1(X509 *x, const unsigned char *id, ossl_ssize_t len) { X509_CERT_AUX *aux; // TODO(davidben): Empty key IDs are not meaningful in PKCS#12, and the // getters cannot quite represent them. Also erase the object if |len| is diff --git a/crypto/x509v3/internal.h b/crypto/x509v3/internal.h index e9d601ba38..315d9343dc 100644 --- a/crypto/x509v3/internal.h +++ b/crypto/x509v3/internal.h @@ -90,7 +90,7 @@ OPENSSL_EXPORT char *x509v3_bytes_to_hex(const uint8_t *in, size_t len); // // This function was historically named |string_to_hex| in OpenSSL. Despite the // name, |string_to_hex| converted from hex. -unsigned char *x509v3_hex_to_bytes(const char *str, long *len); +unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len); // x509v3_conf_name_matches returns one if |name| is equal to |cmp| or begins // with |cmp| followed by '.', and zero otherwise. diff --git a/crypto/x509v3/v3_conf.c b/crypto/x509v3/v3_conf.c index ebf33f182c..8f71502f14 100644 --- a/crypto/x509v3/v3_conf.c +++ b/crypto/x509v3/v3_conf.c @@ -57,6 +57,7 @@ // extension creation utilities #include +#include #include #include @@ -81,7 +82,7 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid, int crit, void *ext_struc); static unsigned char *generic_asn1(const char *value, const X509V3_CTX *ctx, - long *ext_len); + size_t *ext_len); X509_EXTENSION *X509V3_EXT_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *name, const char *value) { @@ -290,7 +291,7 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, int crit, int gen_type, const X509V3_CTX *ctx) { unsigned char *ext_der = NULL; - long ext_len = 0; + size_t ext_len = 0; ASN1_OBJECT *obj = NULL; ASN1_OCTET_STRING *oct = NULL; X509_EXTENSION *extension = NULL; @@ -312,12 +313,17 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, goto err; } - if (!(oct = ASN1_OCTET_STRING_new())) { + if (ext_len > INT_MAX) { + OPENSSL_PUT_ERROR(X509V3, ERR_R_OVERFLOW); goto err; } - oct->data = ext_der; - oct->length = ext_len; + oct = ASN1_OCTET_STRING_new(); + if (oct == NULL) { + goto err; + } + + ASN1_STRING_set0(oct, ext_der, (int)ext_len); ext_der = NULL; extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct); @@ -330,15 +336,18 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, } static unsigned char *generic_asn1(const char *value, const X509V3_CTX *ctx, - long *ext_len) { - ASN1_TYPE *typ; - unsigned char *ext_der = NULL; - typ = ASN1_generate_v3(value, ctx); + size_t *ext_len) { + ASN1_TYPE *typ = ASN1_generate_v3(value, ctx); if (typ == NULL) { return NULL; } - *ext_len = i2d_ASN1_TYPE(typ, &ext_der); + unsigned char *ext_der = NULL; + int len = i2d_ASN1_TYPE(typ, &ext_der); ASN1_TYPE_free(typ); + if (len < 0) { + return NULL; + } + *ext_len = len; return ext_der; } diff --git a/crypto/x509v3/v3_info.c b/crypto/x509v3/v3_info.c index 2ac92213f5..5e14b76587 100644 --- a/crypto/x509v3/v3_info.c +++ b/crypto/x509v3/v3_info.c @@ -168,7 +168,6 @@ static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, const STACK_OF(CONF_VALUE) *nval) { AUTHORITY_INFO_ACCESS *ainfo = NULL; ACCESS_DESCRIPTION *acc; - char *objtmp, *ptmp; if (!(ainfo = sk_ACCESS_DESCRIPTION_new_null())) { return NULL; } @@ -178,22 +177,21 @@ static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, !sk_ACCESS_DESCRIPTION_push(ainfo, acc)) { goto err; } - ptmp = strchr(cnf->name, ';'); + char *ptmp = strchr(cnf->name, ';'); if (!ptmp) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SYNTAX); goto err; } - int objlen = ptmp - cnf->name; CONF_VALUE ctmp; ctmp.name = ptmp + 1; ctmp.value = cnf->value; if (!v2i_GENERAL_NAME_ex(acc->location, method, ctx, &ctmp, 0)) { goto err; } - if (!(objtmp = OPENSSL_malloc(objlen + 1))) { + char *objtmp = OPENSSL_strndup(cnf->name, ptmp - cnf->name); + if (objtmp == NULL) { goto err; } - OPENSSL_strlcpy(objtmp, cnf->name, objlen + 1); acc->method = OBJ_txt2obj(objtmp, 0); if (!acc->method) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_BAD_OBJECT); diff --git a/crypto/x509v3/v3_skey.c b/crypto/x509v3/v3_skey.c index cae776f688..caa7fe50a0 100644 --- a/crypto/x509v3/v3_skey.c +++ b/crypto/x509v3/v3_skey.c @@ -54,12 +54,14 @@ * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). */ +#include #include #include #include #include #include +#include #include #include "../x509/internal.h" @@ -74,21 +76,26 @@ char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str) { - ASN1_OCTET_STRING *oct; - long length; - - if (!(oct = ASN1_OCTET_STRING_new())) { + size_t len; + uint8_t *data = x509v3_hex_to_bytes(str, &len); + if (data == NULL) { return NULL; } - - if (!(oct->data = x509v3_hex_to_bytes(str, &length))) { - ASN1_OCTET_STRING_free(oct); - return NULL; + if (len > INT_MAX) { + OPENSSL_PUT_ERROR(X509V3, ERR_R_OVERFLOW); + goto err; } - oct->length = length; - + ASN1_OCTET_STRING *oct = ASN1_OCTET_STRING_new(); + if (oct == NULL) { + goto err; + } + ASN1_STRING_set0(oct, data, (int)len); return oct; + +err: + OPENSSL_free(data); + return NULL; } static char *i2s_ASN1_OCTET_STRING_cb(const X509V3_EXT_METHOD *method, diff --git a/crypto/x509v3/v3_utl.c b/crypto/x509v3/v3_utl.c index 183cf6ab7e..bbc82e2831 100644 --- a/crypto/x509v3/v3_utl.c +++ b/crypto/x509v3/v3_utl.c @@ -494,7 +494,7 @@ char *x509v3_bytes_to_hex(const uint8_t *in, size_t len) { return NULL; } -unsigned char *x509v3_hex_to_bytes(const char *str, long *len) { +unsigned char *x509v3_hex_to_bytes(const char *str, size_t *len) { unsigned char *hexbuf, *q; unsigned char ch, cl, *p; uint8_t high, low; diff --git a/include/openssl/pem.h b/include/openssl/pem.h index 9319ac80b8..21885ba39d 100644 --- a/include/openssl/pem.h +++ b/include/openssl/pem.h @@ -372,9 +372,6 @@ OPENSSL_EXPORT STACK_OF(X509_INFO) *PEM_X509_INFO_read(FILE *fp, // password. OPENSSL_EXPORT int PEM_def_callback(char *buf, int size, int rwflag, void *userdata); -OPENSSL_EXPORT void PEM_proc_type(char *buf, int type); -OPENSSL_EXPORT void PEM_dek_info(char *buf, const char *type, int len, - char *str); DECLARE_PEM_rw(X509, X509) diff --git a/include/openssl/x509.h b/include/openssl/x509.h index 9e9e5b179a..19d647d335 100644 --- a/include/openssl/x509.h +++ b/include/openssl/x509.h @@ -413,13 +413,13 @@ OPENSSL_EXPORT X509 *d2i_X509_AUX(X509 **x509, const unsigned char **inp, // NULL, the alias is cleared instead. Aliases are not part of the certificate // itself and will not be serialized by |i2d_X509|. OPENSSL_EXPORT int X509_alias_set1(X509 *x509, const unsigned char *name, - int len); + ossl_ssize_t len); // X509_keyid_set1 sets |x509|'s key ID to |len| bytes from |id|. If |id| is // NULL, the key ID is cleared instead. Key IDs are not part of the certificate // itself and will not be serialized by |i2d_X509|. OPENSSL_EXPORT int X509_keyid_set1(X509 *x509, const unsigned char *id, - int len); + ossl_ssize_t len); // X509_alias_get0 looks up |x509|'s alias. If found, it sets |*out_len| to the // alias's length and returns a pointer to a buffer containing the contents. If @@ -1792,7 +1792,7 @@ OPENSSL_EXPORT int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey); // If |len| is 0 or negative, the length is calculated with |strlen| and |str| // must be a NUL-terminated C string. OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, - int len); + ossl_ssize_t len); // NETSCAPE_SPKI_b64_encode encodes |spki| as a base64-encoded Netscape signed // public key and challenge (SPKAC) structure. It returns a newly-allocated diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index a731e41d66..85c06a5080 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc @@ -12,6 +12,7 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include #include @@ -3431,8 +3432,10 @@ static bool GetServerTicketTime(long *out, const SSL_SESSION *session) { const uint8_t *iv = ticket + 16; bssl::ScopedEVP_CIPHER_CTX ctx; int len1, len2; - if (!EVP_DecryptInit_ex(ctx.get(), EVP_aes_128_cbc(), nullptr, kZeros, iv) || - !EVP_DecryptUpdate(ctx.get(), plaintext.get(), &len1, ciphertext, len) || + if (len > INT_MAX || + !EVP_DecryptInit_ex(ctx.get(), EVP_aes_128_cbc(), nullptr, kZeros, iv) || + !EVP_DecryptUpdate(ctx.get(), plaintext.get(), &len1, ciphertext, + static_cast(len)) || !EVP_DecryptFinal_ex(ctx.get(), plaintext.get() + len1, &len2)) { return false; } @@ -7751,8 +7754,8 @@ TEST(SSLTest, BIO) { // |BIO_should_write|. int ret; for (int i = 0; i < 1024; i++) { - std::vector buffer(1024); - ret = BIO_write(client_bio.get(), buffer.data(), buffer.size()); + const uint8_t kZeros[1024] = {0}; + ret = BIO_write(client_bio.get(), kZeros, sizeof(kZeros)); if (ret <= 0) { break; } diff --git a/ssl/test/test_config.cc b/ssl/test/test_config.cc index 94828c6f66..109c69ef4f 100644 --- a/ssl/test/test_config.cc +++ b/ssl/test/test_config.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -572,8 +573,13 @@ static int NextProtosAdvertisedCallback(SSL *ssl, const uint8_t **out, return SSL_TLSEXT_ERR_NOACK; } - *out = (const uint8_t *)config->advertise_npn.data(); - *out_len = config->advertise_npn.size(); + if (config->advertise_npn.size() > UINT_MAX) { + fprintf(stderr, "NPN value too large.\n"); + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + *out = reinterpret_cast(config->advertise_npn.data()); + *out_len = static_cast(config->advertise_npn.size()); return SSL_TLSEXT_ERR_OK; } From 7b9b9baa95449d49019f7ce45b94963f8763005f Mon Sep 17 00:00:00 2001 From: wangjiale3 Date: Fri, 31 Mar 2023 19:20:08 +0800 Subject: [PATCH 177/177] leaked_storage in method POLICYQUALINFO *notice_section Change-Id: I43dd18f7d70ee06ca25affad0ab06e5d5ef8263d Signed-off-by: wangjiale3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/58489 Reviewed-by: Bob Beck Commit-Queue: David Benjamin --- crypto/x509v3/v3_cpols.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto/x509v3/v3_cpols.c b/crypto/x509v3/v3_cpols.c index e66e260b00..7464a4265b 100644 --- a/crypto/x509v3/v3_cpols.c +++ b/crypto/x509v3/v3_cpols.c @@ -356,6 +356,7 @@ static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, if (!nos || !sk_CONF_VALUE_num(nos)) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBERS); X509V3_conf_err(cnf); + sk_CONF_VALUE_pop_free(nos, X509V3_conf_free); goto err; } int ret = nref_nos(nref->noticenos, nos);